@angular/material 19.0.0-next.1 → 19.0.0-next.2

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 (595) hide show
  1. package/_index.scss +3 -4
  2. package/button/_button-base.scss +2 -2
  3. package/button/index.d.ts +2 -10
  4. package/checkbox/index.d.ts +0 -7
  5. package/chips/index.d.ts +1 -10
  6. package/core/_core.scss +1 -7
  7. package/core/focus-indicators/_private.scss +20 -81
  8. package/core/index.d.ts +8 -10
  9. package/core/style/_elevation.scss +1 -1
  10. package/core/theming/_palettes.scss +132 -45
  11. package/core/tokens/_m3-system.scss +93 -20
  12. package/core/tokens/m3/mat/_sidenav.scss +0 -1
  13. package/fesm2022/button.mjs +16 -27
  14. package/fesm2022/button.mjs.map +1 -1
  15. package/fesm2022/checkbox.mjs +2 -5
  16. package/fesm2022/checkbox.mjs.map +1 -1
  17. package/fesm2022/chips.mjs +8 -19
  18. package/fesm2022/chips.mjs.map +1 -1
  19. package/fesm2022/core.mjs +62 -38
  20. package/fesm2022/core.mjs.map +1 -1
  21. package/fesm2022/form-field.mjs +2 -2
  22. package/fesm2022/form-field.mjs.map +1 -1
  23. package/fesm2022/list.mjs +14 -14
  24. package/fesm2022/list.mjs.map +1 -1
  25. package/fesm2022/menu.mjs +2 -2
  26. package/fesm2022/menu.mjs.map +1 -1
  27. package/fesm2022/radio.mjs +2 -2
  28. package/fesm2022/radio.mjs.map +1 -1
  29. package/fesm2022/sidenav.mjs +4 -4
  30. package/fesm2022/sidenav.mjs.map +1 -1
  31. package/fesm2022/slide-toggle.mjs +2 -2
  32. package/fesm2022/slide-toggle.mjs.map +1 -1
  33. package/fesm2022/slider.mjs +4 -4
  34. package/fesm2022/slider.mjs.map +1 -1
  35. package/fesm2022/table.mjs +2 -2
  36. package/fesm2022/table.mjs.map +1 -1
  37. package/fesm2022/tabs.mjs +6 -6
  38. package/fesm2022/tabs.mjs.map +1 -1
  39. package/fesm2022/tooltip.mjs +16 -4
  40. package/fesm2022/tooltip.mjs.map +1 -1
  41. package/package.json +2 -146
  42. package/prebuilt-themes/azure-blue.css +1 -1
  43. package/prebuilt-themes/cyan-orange.css +1 -1
  44. package/prebuilt-themes/deeppurple-amber.css +1 -1
  45. package/prebuilt-themes/indigo-pink.css +1 -1
  46. package/prebuilt-themes/magenta-violet.css +1 -1
  47. package/prebuilt-themes/pink-bluegrey.css +1 -1
  48. package/prebuilt-themes/purple-green.css +1 -1
  49. package/prebuilt-themes/rose-red.css +1 -1
  50. package/schematics/ng-add/index.js +1 -1
  51. package/schematics/ng-add/index.mjs +1 -1
  52. package/schematics/ng-generate/m3-theme/index_bundled.js +2 -2
  53. package/schematics/ng-update/index_bundled.js +27 -27
  54. package/tabs/_tabs-common.scss +1 -1
  55. package/core/focus-indicators/_focus-indicators-theme.scss +0 -11
  56. package/core/focus-indicators/_focus-indicators.scss +0 -6
  57. package/esm2022/autocomplete/animations.mjs +0 -24
  58. package/esm2022/autocomplete/autocomplete-origin.mjs +0 -31
  59. package/esm2022/autocomplete/autocomplete-trigger.mjs +0 -902
  60. package/esm2022/autocomplete/autocomplete.mjs +0 -238
  61. package/esm2022/autocomplete/autocomplete_public_index.mjs +0 -5
  62. package/esm2022/autocomplete/index.mjs +0 -9
  63. package/esm2022/autocomplete/module.mjs +0 -61
  64. package/esm2022/autocomplete/public-api.mjs +0 -14
  65. package/esm2022/autocomplete/testing/autocomplete-harness-filters.mjs +0 -9
  66. package/esm2022/autocomplete/testing/autocomplete-harness.mjs +0 -105
  67. package/esm2022/autocomplete/testing/index.mjs +0 -9
  68. package/esm2022/autocomplete/testing/public-api.mjs +0 -10
  69. package/esm2022/badge/badge-module.mjs +0 -27
  70. package/esm2022/badge/badge.mjs +0 -288
  71. package/esm2022/badge/badge_public_index.mjs +0 -5
  72. package/esm2022/badge/index.mjs +0 -9
  73. package/esm2022/badge/public-api.mjs +0 -10
  74. package/esm2022/badge/testing/badge-harness-filters.mjs +0 -9
  75. package/esm2022/badge/testing/badge-harness.mjs +0 -71
  76. package/esm2022/badge/testing/index.mjs +0 -9
  77. package/esm2022/badge/testing/public-api.mjs +0 -10
  78. package/esm2022/bottom-sheet/bottom-sheet-animations.mjs +0 -26
  79. package/esm2022/bottom-sheet/bottom-sheet-config.mjs +0 -48
  80. package/esm2022/bottom-sheet/bottom-sheet-container.mjs +0 -85
  81. package/esm2022/bottom-sheet/bottom-sheet-module.mjs +0 -28
  82. package/esm2022/bottom-sheet/bottom-sheet-ref.mjs +0 -104
  83. package/esm2022/bottom-sheet/bottom-sheet.mjs +0 -115
  84. package/esm2022/bottom-sheet/bottom-sheet_public_index.mjs +0 -5
  85. package/esm2022/bottom-sheet/index.mjs +0 -9
  86. package/esm2022/bottom-sheet/public-api.mjs +0 -14
  87. package/esm2022/bottom-sheet/testing/bottom-sheet-harness-filters.mjs +0 -9
  88. package/esm2022/bottom-sheet/testing/bottom-sheet-harness.mjs +0 -35
  89. package/esm2022/bottom-sheet/testing/index.mjs +0 -9
  90. package/esm2022/bottom-sheet/testing/public-api.mjs +0 -10
  91. package/esm2022/button/button-base.mjs +0 -230
  92. package/esm2022/button/button.mjs +0 -67
  93. package/esm2022/button/button_public_index.mjs +0 -5
  94. package/esm2022/button/fab.mjs +0 -166
  95. package/esm2022/button/icon-button.mjs +0 -56
  96. package/esm2022/button/index.mjs +0 -9
  97. package/esm2022/button/module.mjs +0 -65
  98. package/esm2022/button/public-api.mjs +0 -13
  99. package/esm2022/button/testing/button-harness-filters.mjs +0 -9
  100. package/esm2022/button/testing/button-harness.mjs +0 -80
  101. package/esm2022/button/testing/index.mjs +0 -9
  102. package/esm2022/button/testing/public-api.mjs +0 -10
  103. package/esm2022/button-toggle/button-toggle-module.mjs +0 -24
  104. package/esm2022/button-toggle/button-toggle.mjs +0 -651
  105. package/esm2022/button-toggle/button-toggle_public_index.mjs +0 -5
  106. package/esm2022/button-toggle/index.mjs +0 -9
  107. package/esm2022/button-toggle/public-api.mjs +0 -10
  108. package/esm2022/button-toggle/testing/button-toggle-group-harness-filters.mjs +0 -9
  109. package/esm2022/button-toggle/testing/button-toggle-group-harness.mjs +0 -47
  110. package/esm2022/button-toggle/testing/button-toggle-harness-filters.mjs +0 -9
  111. package/esm2022/button-toggle/testing/button-toggle-harness.mjs +0 -105
  112. package/esm2022/button-toggle/testing/index.mjs +0 -9
  113. package/esm2022/button-toggle/testing/public-api.mjs +0 -12
  114. package/esm2022/card/card.mjs +0 -273
  115. package/esm2022/card/card_public_index.mjs +0 -5
  116. package/esm2022/card/index.mjs +0 -9
  117. package/esm2022/card/module.mjs +0 -67
  118. package/esm2022/card/public-api.mjs +0 -10
  119. package/esm2022/card/testing/card-harness-filters.mjs +0 -9
  120. package/esm2022/card/testing/card-harness.mjs +0 -50
  121. package/esm2022/card/testing/index.mjs +0 -9
  122. package/esm2022/card/testing/public-api.mjs +0 -10
  123. package/esm2022/checkbox/checkbox-config.mjs +0 -22
  124. package/esm2022/checkbox/checkbox-required-validator.mjs +0 -41
  125. package/esm2022/checkbox/checkbox.mjs +0 -443
  126. package/esm2022/checkbox/checkbox_public_index.mjs +0 -5
  127. package/esm2022/checkbox/index.mjs +0 -9
  128. package/esm2022/checkbox/module.mjs +0 -41
  129. package/esm2022/checkbox/public-api.mjs +0 -12
  130. package/esm2022/checkbox/testing/checkbox-harness-filters.mjs +0 -9
  131. package/esm2022/checkbox/testing/checkbox-harness.mjs +0 -138
  132. package/esm2022/checkbox/testing/index.mjs +0 -9
  133. package/esm2022/checkbox/testing/public-api.mjs +0 -9
  134. package/esm2022/chips/chip-action.mjs +0 -113
  135. package/esm2022/chips/chip-edit-input.mjs +0 -61
  136. package/esm2022/chips/chip-grid.mjs +0 -420
  137. package/esm2022/chips/chip-icons.mjs +0 -107
  138. package/esm2022/chips/chip-input.mjs +0 -192
  139. package/esm2022/chips/chip-listbox.mjs +0 -369
  140. package/esm2022/chips/chip-option.mjs +0 -190
  141. package/esm2022/chips/chip-row.mjs +0 -173
  142. package/esm2022/chips/chip-set.mjs +0 -283
  143. package/esm2022/chips/chip-text-control.mjs +0 -9
  144. package/esm2022/chips/chip.mjs +0 -322
  145. package/esm2022/chips/chips_public_index.mjs +0 -5
  146. package/esm2022/chips/index.mjs +0 -9
  147. package/esm2022/chips/module.mjs +0 -85
  148. package/esm2022/chips/public-api.mjs +0 -20
  149. package/esm2022/chips/testing/chip-avatar-harness.mjs +0 -22
  150. package/esm2022/chips/testing/chip-edit-input-harness.mjs +0 -33
  151. package/esm2022/chips/testing/chip-grid-harness.mjs +0 -45
  152. package/esm2022/chips/testing/chip-harness-filters.mjs +0 -9
  153. package/esm2022/chips/testing/chip-harness.mjs +0 -62
  154. package/esm2022/chips/testing/chip-input-harness.mjs +0 -85
  155. package/esm2022/chips/testing/chip-listbox-harness.mjs +0 -61
  156. package/esm2022/chips/testing/chip-option-harness.mjs +0 -45
  157. package/esm2022/chips/testing/chip-remove-harness.mjs +0 -26
  158. package/esm2022/chips/testing/chip-row-harness.mjs +0 -40
  159. package/esm2022/chips/testing/chip-set-harness.mjs +0 -26
  160. package/esm2022/chips/testing/index.mjs +0 -9
  161. package/esm2022/chips/testing/public-api.mjs +0 -19
  162. package/esm2022/chips/tokens.mjs +0 -39
  163. package/esm2022/core/animation/animation.mjs +0 -21
  164. package/esm2022/core/common-behaviors/color.mjs +0 -33
  165. package/esm2022/core/common-behaviors/common-module.mjs +0 -127
  166. package/esm2022/core/common-behaviors/constructor.mjs +0 -9
  167. package/esm2022/core/common-behaviors/disable-ripple.mjs +0 -24
  168. package/esm2022/core/common-behaviors/disabled.mjs +0 -23
  169. package/esm2022/core/common-behaviors/error-state.mjs +0 -66
  170. package/esm2022/core/common-behaviors/index.mjs +0 -15
  171. package/esm2022/core/common-behaviors/initialized.mjs +0 -62
  172. package/esm2022/core/common-behaviors/tabindex.mjs +0 -25
  173. package/esm2022/core/core_public_index.mjs +0 -5
  174. package/esm2022/core/datetime/date-adapter.mjs +0 -109
  175. package/esm2022/core/datetime/date-formats.mjs +0 -10
  176. package/esm2022/core/datetime/index.mjs +0 -46
  177. package/esm2022/core/datetime/native-date-adapter.mjs +0 -221
  178. package/esm2022/core/datetime/native-date-formats.mjs +0 -19
  179. package/esm2022/core/error/error-options.mjs +0 -33
  180. package/esm2022/core/index.mjs +0 -9
  181. package/esm2022/core/internal-form-field/internal-form-field.mjs +0 -29
  182. package/esm2022/core/line/line.mjs +0 -64
  183. package/esm2022/core/option/index.mjs +0 -30
  184. package/esm2022/core/option/optgroup.mjs +0 -71
  185. package/esm2022/core/option/option-parent.mjs +0 -13
  186. package/esm2022/core/option/option.mjs +0 -283
  187. package/esm2022/core/private/index.mjs +0 -9
  188. package/esm2022/core/private/ripple-loader.mjs +0 -160
  189. package/esm2022/core/public-api.mjs +0 -19
  190. package/esm2022/core/ripple/index.mjs +0 -27
  191. package/esm2022/core/ripple/ripple-event-manager.mjs +0 -69
  192. package/esm2022/core/ripple/ripple-ref.mjs +0 -39
  193. package/esm2022/core/ripple/ripple-renderer.mjs +0 -354
  194. package/esm2022/core/ripple/ripple.mjs +0 -156
  195. package/esm2022/core/selection/index.mjs +0 -10
  196. package/esm2022/core/selection/pseudo-checkbox/pseudo-checkbox-module.mjs +0 -24
  197. package/esm2022/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +0 -62
  198. package/esm2022/core/testing/index.mjs +0 -9
  199. package/esm2022/core/testing/optgroup-harness-filters.mjs +0 -9
  200. package/esm2022/core/testing/optgroup-harness.mjs +0 -43
  201. package/esm2022/core/testing/option-harness-filters.mjs +0 -9
  202. package/esm2022/core/testing/option-harness.mjs +0 -53
  203. package/esm2022/core/testing/public-api.mjs +0 -12
  204. package/esm2022/core/version.mjs +0 -11
  205. package/esm2022/datepicker/aria-accessible-name.mjs +0 -159
  206. package/esm2022/datepicker/calendar-body.mjs +0 -509
  207. package/esm2022/datepicker/calendar.mjs +0 -426
  208. package/esm2022/datepicker/date-range-input-parts.mjs +0 -372
  209. package/esm2022/datepicker/date-range-input.mjs +0 -369
  210. package/esm2022/datepicker/date-range-picker.mjs +0 -51
  211. package/esm2022/datepicker/date-range-selection-strategy.mjs +0 -97
  212. package/esm2022/datepicker/date-selection-model.mjs +0 -188
  213. package/esm2022/datepicker/datepicker-actions.mjs +0 -91
  214. package/esm2022/datepicker/datepicker-animations.mjs +0 -35
  215. package/esm2022/datepicker/datepicker-base.mjs +0 -609
  216. package/esm2022/datepicker/datepicker-errors.mjs +0 -14
  217. package/esm2022/datepicker/datepicker-input-base.mjs +0 -311
  218. package/esm2022/datepicker/datepicker-input.mjs +0 -200
  219. package/esm2022/datepicker/datepicker-intl.mjs +0 -69
  220. package/esm2022/datepicker/datepicker-module.mjs +0 -138
  221. package/esm2022/datepicker/datepicker-toggle.mjs +0 -113
  222. package/esm2022/datepicker/datepicker.mjs +0 -38
  223. package/esm2022/datepicker/datepicker_public_index.mjs +0 -5
  224. package/esm2022/datepicker/index.mjs +0 -9
  225. package/esm2022/datepicker/month-view.mjs +0 -460
  226. package/esm2022/datepicker/multi-year-view.mjs +0 -330
  227. package/esm2022/datepicker/public-api.mjs +0 -27
  228. package/esm2022/datepicker/testing/calendar-cell-harness.mjs +0 -138
  229. package/esm2022/datepicker/testing/calendar-harness.mjs +0 -83
  230. package/esm2022/datepicker/testing/date-range-input-harness.mjs +0 -98
  231. package/esm2022/datepicker/testing/datepicker-harness-filters.mjs +0 -9
  232. package/esm2022/datepicker/testing/datepicker-input-harness-base.mjs +0 -81
  233. package/esm2022/datepicker/testing/datepicker-input-harness.mjs +0 -58
  234. package/esm2022/datepicker/testing/datepicker-toggle-harness.mjs +0 -41
  235. package/esm2022/datepicker/testing/datepicker-trigger-harness-base.mjs +0 -65
  236. package/esm2022/datepicker/testing/index.mjs +0 -9
  237. package/esm2022/datepicker/testing/public-api.mjs +0 -14
  238. package/esm2022/datepicker/year-view.mjs +0 -324
  239. package/esm2022/dialog/dialog-animations.mjs +0 -38
  240. package/esm2022/dialog/dialog-config.mjs +0 -59
  241. package/esm2022/dialog/dialog-container.mjs +0 -253
  242. package/esm2022/dialog/dialog-content-directives.mjs +0 -212
  243. package/esm2022/dialog/dialog-ref.mjs +0 -177
  244. package/esm2022/dialog/dialog.mjs +0 -212
  245. package/esm2022/dialog/dialog_public_index.mjs +0 -5
  246. package/esm2022/dialog/index.mjs +0 -9
  247. package/esm2022/dialog/module.mjs +0 -45
  248. package/esm2022/dialog/public-api.mjs +0 -15
  249. package/esm2022/dialog/testing/dialog-harness-filters.mjs +0 -9
  250. package/esm2022/dialog/testing/dialog-harness.mjs +0 -84
  251. package/esm2022/dialog/testing/dialog-opener.mjs +0 -58
  252. package/esm2022/dialog/testing/index.mjs +0 -10
  253. package/esm2022/dialog/testing/public-api.mjs +0 -10
  254. package/esm2022/divider/divider-module.mjs +0 -24
  255. package/esm2022/divider/divider.mjs +0 -48
  256. package/esm2022/divider/divider_public_index.mjs +0 -5
  257. package/esm2022/divider/index.mjs +0 -9
  258. package/esm2022/divider/public-api.mjs +0 -10
  259. package/esm2022/divider/testing/divider-harness-filters.mjs +0 -9
  260. package/esm2022/divider/testing/divider-harness.mjs +0 -22
  261. package/esm2022/divider/testing/index.mjs +0 -9
  262. package/esm2022/divider/testing/public-api.mjs +0 -10
  263. package/esm2022/expansion/accordion-base.mjs +0 -14
  264. package/esm2022/expansion/accordion.mjs +0 -96
  265. package/esm2022/expansion/expansion-animations.mjs +0 -51
  266. package/esm2022/expansion/expansion-module.mjs +0 -65
  267. package/esm2022/expansion/expansion-panel-base.mjs +0 -14
  268. package/esm2022/expansion/expansion-panel-content.mjs +0 -35
  269. package/esm2022/expansion/expansion-panel-header.mjs +0 -218
  270. package/esm2022/expansion/expansion-panel.mjs +0 -211
  271. package/esm2022/expansion/expansion_public_index.mjs +0 -5
  272. package/esm2022/expansion/index.mjs +0 -9
  273. package/esm2022/expansion/public-api.mjs +0 -16
  274. package/esm2022/expansion/testing/accordion-harness.mjs +0 -31
  275. package/esm2022/expansion/testing/expansion-harness-filters.mjs +0 -9
  276. package/esm2022/expansion/testing/expansion-harness.mjs +0 -128
  277. package/esm2022/expansion/testing/index.mjs +0 -9
  278. package/esm2022/expansion/testing/public-api.mjs +0 -11
  279. package/esm2022/form-field/directives/error.mjs +0 -48
  280. package/esm2022/form-field/directives/floating-label.mjs +0 -135
  281. package/esm2022/form-field/directives/hint.mjs +0 -40
  282. package/esm2022/form-field/directives/label.mjs +0 -22
  283. package/esm2022/form-field/directives/line-ripple.mjs +0 -60
  284. package/esm2022/form-field/directives/notched-outline.mjs +0 -66
  285. package/esm2022/form-field/directives/prefix.mjs +0 -38
  286. package/esm2022/form-field/directives/suffix.mjs +0 -38
  287. package/esm2022/form-field/form-field-animations.mjs +0 -24
  288. package/esm2022/form-field/form-field-control.mjs +0 -11
  289. package/esm2022/form-field/form-field-errors.mjs +0 -20
  290. package/esm2022/form-field/form-field.mjs +0 -620
  291. package/esm2022/form-field/form-field_public_index.mjs +0 -5
  292. package/esm2022/form-field/index.mjs +0 -9
  293. package/esm2022/form-field/module.mjs +0 -51
  294. package/esm2022/form-field/public-api.mjs +0 -18
  295. package/esm2022/form-field/testing/control/form-field-control-harness.mjs +0 -15
  296. package/esm2022/form-field/testing/control/index.mjs +0 -9
  297. package/esm2022/form-field/testing/error-harness.mjs +0 -29
  298. package/esm2022/form-field/testing/form-field-harness-filters.mjs +0 -9
  299. package/esm2022/form-field/testing/form-field-harness.mjs +0 -179
  300. package/esm2022/form-field/testing/index.mjs +0 -9
  301. package/esm2022/form-field/testing/public-api.mjs +0 -15
  302. package/esm2022/grid-list/grid-list-base.mjs +0 -14
  303. package/esm2022/grid-list/grid-list-module.mjs +0 -59
  304. package/esm2022/grid-list/grid-list.mjs +0 -146
  305. package/esm2022/grid-list/grid-list_public_index.mjs +0 -5
  306. package/esm2022/grid-list/grid-tile.mjs +0 -128
  307. package/esm2022/grid-list/index.mjs +0 -9
  308. package/esm2022/grid-list/public-api.mjs +0 -14
  309. package/esm2022/grid-list/testing/grid-list-harness-filters.mjs +0 -9
  310. package/esm2022/grid-list/testing/grid-list-harness.mjs +0 -76
  311. package/esm2022/grid-list/testing/grid-tile-harness.mjs +0 -71
  312. package/esm2022/grid-list/testing/index.mjs +0 -9
  313. package/esm2022/grid-list/testing/public-api.mjs +0 -11
  314. package/esm2022/grid-list/tile-coordinator.mjs +0 -145
  315. package/esm2022/grid-list/tile-styler.mjs +0 -231
  316. package/esm2022/icon/fake-svgs.mjs +0 -62
  317. package/esm2022/icon/icon-module.mjs +0 -24
  318. package/esm2022/icon/icon-registry.mjs +0 -592
  319. package/esm2022/icon/icon.mjs +0 -379
  320. package/esm2022/icon/icon_public_index.mjs +0 -5
  321. package/esm2022/icon/index.mjs +0 -9
  322. package/esm2022/icon/public-api.mjs +0 -11
  323. package/esm2022/icon/testing/fake-icon-registry.mjs +0 -92
  324. package/esm2022/icon/testing/icon-harness-filters.mjs +0 -14
  325. package/esm2022/icon/testing/icon-harness.mjs +0 -60
  326. package/esm2022/icon/testing/index.mjs +0 -9
  327. package/esm2022/icon/testing/public-api.mjs +0 -11
  328. package/esm2022/icon/testing/testing_public_index.mjs +0 -5
  329. package/esm2022/icon/trusted-types.mjs +0 -43
  330. package/esm2022/index.mjs +0 -14
  331. package/esm2022/input/index.mjs +0 -9
  332. package/esm2022/input/input-errors.mjs +0 -12
  333. package/esm2022/input/input-value-accessor.mjs +0 -16
  334. package/esm2022/input/input.mjs +0 -524
  335. package/esm2022/input/input_public_index.mjs +0 -5
  336. package/esm2022/input/module.mjs +0 -26
  337. package/esm2022/input/public-api.mjs +0 -14
  338. package/esm2022/input/testing/index.mjs +0 -9
  339. package/esm2022/input/testing/input-harness-filters.mjs +0 -9
  340. package/esm2022/input/testing/input-harness.mjs +0 -119
  341. package/esm2022/input/testing/native-option-harness.mjs +0 -42
  342. package/esm2022/input/testing/native-select-harness-filters.mjs +0 -9
  343. package/esm2022/input/testing/native-select-harness.mjs +0 -79
  344. package/esm2022/input/testing/public-api.mjs +0 -13
  345. package/esm2022/list/action-list.mjs +0 -31
  346. package/esm2022/list/index.mjs +0 -9
  347. package/esm2022/list/list-base.mjs +0 -284
  348. package/esm2022/list/list-item-sections.mjs +0 -144
  349. package/esm2022/list/list-module.mjs +0 -97
  350. package/esm2022/list/list-option-types.mjs +0 -16
  351. package/esm2022/list/list-option.mjs +0 -295
  352. package/esm2022/list/list.mjs +0 -103
  353. package/esm2022/list/list_public_index.mjs +0 -5
  354. package/esm2022/list/nav-list.mjs +0 -37
  355. package/esm2022/list/public-api.mjs +0 -18
  356. package/esm2022/list/selection-list.mjs +0 -391
  357. package/esm2022/list/subheader.mjs +0 -28
  358. package/esm2022/list/testing/action-list-harness.mjs +0 -59
  359. package/esm2022/list/testing/index.mjs +0 -9
  360. package/esm2022/list/testing/list-harness-base.mjs +0 -95
  361. package/esm2022/list/testing/list-harness-filters.mjs +0 -9
  362. package/esm2022/list/testing/list-harness.mjs +0 -41
  363. package/esm2022/list/testing/list-item-harness-base.mjs +0 -162
  364. package/esm2022/list/testing/nav-list-harness.mjs +0 -69
  365. package/esm2022/list/testing/public-api.mjs +0 -14
  366. package/esm2022/list/testing/selection-list-harness.mjs +0 -122
  367. package/esm2022/list/tokens.mjs +0 -11
  368. package/esm2022/menu/index.mjs +0 -9
  369. package/esm2022/menu/menu-animations.mjs +0 -61
  370. package/esm2022/menu/menu-content.mjs +0 -87
  371. package/esm2022/menu/menu-errors.mjs +0 -35
  372. package/esm2022/menu/menu-item.mjs +0 -148
  373. package/esm2022/menu/menu-panel.mjs +0 -14
  374. package/esm2022/menu/menu-positions.mjs +0 -9
  375. package/esm2022/menu/menu-trigger.mjs +0 -542
  376. package/esm2022/menu/menu.mjs +0 -405
  377. package/esm2022/menu/menu_public_index.mjs +0 -5
  378. package/esm2022/menu/module.mjs +0 -63
  379. package/esm2022/menu/public-api.mjs +0 -16
  380. package/esm2022/menu/testing/index.mjs +0 -9
  381. package/esm2022/menu/testing/menu-harness-filters.mjs +0 -9
  382. package/esm2022/menu/testing/menu-harness.mjs +0 -166
  383. package/esm2022/menu/testing/public-api.mjs +0 -10
  384. package/esm2022/paginator/index.mjs +0 -9
  385. package/esm2022/paginator/module.mjs +0 -28
  386. package/esm2022/paginator/paginator-intl.mjs +0 -62
  387. package/esm2022/paginator/paginator.mjs +0 -266
  388. package/esm2022/paginator/paginator_public_index.mjs +0 -5
  389. package/esm2022/paginator/public-api.mjs +0 -11
  390. package/esm2022/paginator/testing/index.mjs +0 -9
  391. package/esm2022/paginator/testing/paginator-harness-filters.mjs +0 -9
  392. package/esm2022/paginator/testing/paginator-harness.mjs +0 -98
  393. package/esm2022/paginator/testing/public-api.mjs +0 -10
  394. package/esm2022/progress-bar/index.mjs +0 -9
  395. package/esm2022/progress-bar/module.mjs +0 -24
  396. package/esm2022/progress-bar/progress-bar.mjs +0 -181
  397. package/esm2022/progress-bar/progress-bar_public_index.mjs +0 -5
  398. package/esm2022/progress-bar/public-api.mjs +0 -10
  399. package/esm2022/progress-bar/testing/index.mjs +0 -9
  400. package/esm2022/progress-bar/testing/progress-bar-harness-filters.mjs +0 -9
  401. package/esm2022/progress-bar/testing/progress-bar-harness.mjs +0 -33
  402. package/esm2022/progress-bar/testing/public-api.mjs +0 -10
  403. package/esm2022/progress-bar/testing/testing_public_index.mjs +0 -5
  404. package/esm2022/progress-spinner/index.mjs +0 -9
  405. package/esm2022/progress-spinner/module.mjs +0 -25
  406. package/esm2022/progress-spinner/progress-spinner.mjs +0 -166
  407. package/esm2022/progress-spinner/progress-spinner_public_index.mjs +0 -5
  408. package/esm2022/progress-spinner/public-api.mjs +0 -10
  409. package/esm2022/progress-spinner/testing/index.mjs +0 -9
  410. package/esm2022/progress-spinner/testing/progress-spinner-harness-filters.mjs +0 -9
  411. package/esm2022/progress-spinner/testing/progress-spinner-harness.mjs +0 -35
  412. package/esm2022/progress-spinner/testing/public-api.mjs +0 -10
  413. package/esm2022/progress-spinner/testing/testing_public_index.mjs +0 -5
  414. package/esm2022/radio/index.mjs +0 -9
  415. package/esm2022/radio/module.mjs +0 -25
  416. package/esm2022/radio/public-api.mjs +0 -10
  417. package/esm2022/radio/radio.mjs +0 -680
  418. package/esm2022/radio/radio_public_index.mjs +0 -5
  419. package/esm2022/radio/testing/index.mjs +0 -9
  420. package/esm2022/radio/testing/public-api.mjs +0 -10
  421. package/esm2022/radio/testing/radio-harness-filters.mjs +0 -9
  422. package/esm2022/radio/testing/radio-harness.mjs +0 -228
  423. package/esm2022/select/index.mjs +0 -9
  424. package/esm2022/select/module.mjs +0 -59
  425. package/esm2022/select/public-api.mjs +0 -15
  426. package/esm2022/select/select-animations.mjs +0 -38
  427. package/esm2022/select/select-errors.mjs +0 -35
  428. package/esm2022/select/select.mjs +0 -1160
  429. package/esm2022/select/select_public_index.mjs +0 -5
  430. package/esm2022/select/testing/index.mjs +0 -9
  431. package/esm2022/select/testing/public-api.mjs +0 -10
  432. package/esm2022/select/testing/select-harness-filters.mjs +0 -9
  433. package/esm2022/select/testing/select-harness.mjs +0 -129
  434. package/esm2022/sidenav/drawer-animations.mjs +0 -33
  435. package/esm2022/sidenav/drawer.mjs +0 -863
  436. package/esm2022/sidenav/index.mjs +0 -9
  437. package/esm2022/sidenav/public-api.mjs +0 -12
  438. package/esm2022/sidenav/sidenav-module.mjs +0 -60
  439. package/esm2022/sidenav/sidenav.mjs +0 -148
  440. package/esm2022/sidenav/sidenav_public_index.mjs +0 -5
  441. package/esm2022/sidenav/testing/drawer-container-harness.mjs +0 -36
  442. package/esm2022/sidenav/testing/drawer-content-harness.mjs +0 -23
  443. package/esm2022/sidenav/testing/drawer-harness-filters.mjs +0 -9
  444. package/esm2022/sidenav/testing/drawer-harness.mjs +0 -49
  445. package/esm2022/sidenav/testing/index.mjs +0 -9
  446. package/esm2022/sidenav/testing/public-api.mjs +0 -15
  447. package/esm2022/sidenav/testing/sidenav-container-harness.mjs +0 -36
  448. package/esm2022/sidenav/testing/sidenav-content-harness.mjs +0 -23
  449. package/esm2022/sidenav/testing/sidenav-harness.mjs +0 -28
  450. package/esm2022/slide-toggle/index.mjs +0 -9
  451. package/esm2022/slide-toggle/module.mjs +0 -41
  452. package/esm2022/slide-toggle/public-api.mjs +0 -12
  453. package/esm2022/slide-toggle/slide-toggle-config.mjs +0 -14
  454. package/esm2022/slide-toggle/slide-toggle-required-validator.mjs +0 -44
  455. package/esm2022/slide-toggle/slide-toggle.mjs +0 -273
  456. package/esm2022/slide-toggle/slide-toggle_public_index.mjs +0 -5
  457. package/esm2022/slide-toggle/testing/index.mjs +0 -9
  458. package/esm2022/slide-toggle/testing/public-api.mjs +0 -10
  459. package/esm2022/slide-toggle/testing/slide-toggle-harness-filters.mjs +0 -9
  460. package/esm2022/slide-toggle/testing/slide-toggle-harness.mjs +0 -110
  461. package/esm2022/slider/index.mjs +0 -9
  462. package/esm2022/slider/module.mjs +0 -39
  463. package/esm2022/slider/public-api.mjs +0 -13
  464. package/esm2022/slider/slider-input.mjs +0 -701
  465. package/esm2022/slider/slider-interface.mjs +0 -56
  466. package/esm2022/slider/slider-thumb.mjs +0 -231
  467. package/esm2022/slider/slider.mjs +0 -746
  468. package/esm2022/slider/slider_public_index.mjs +0 -5
  469. package/esm2022/slider/testing/index.mjs +0 -9
  470. package/esm2022/slider/testing/public-api.mjs +0 -11
  471. package/esm2022/slider/testing/slider-harness-filters.mjs +0 -7
  472. package/esm2022/slider/testing/slider-harness.mjs +0 -67
  473. package/esm2022/slider/testing/slider-thumb-harness.mjs +0 -95
  474. package/esm2022/snack-bar/index.mjs +0 -9
  475. package/esm2022/snack-bar/module.mjs +0 -47
  476. package/esm2022/snack-bar/public-api.mjs +0 -16
  477. package/esm2022/snack-bar/simple-snack-bar.mjs +0 -40
  478. package/esm2022/snack-bar/snack-bar-animations.mjs +0 -30
  479. package/esm2022/snack-bar/snack-bar-config.mjs +0 -33
  480. package/esm2022/snack-bar/snack-bar-container.mjs +0 -277
  481. package/esm2022/snack-bar/snack-bar-content.mjs +0 -55
  482. package/esm2022/snack-bar/snack-bar-ref.mjs +0 -89
  483. package/esm2022/snack-bar/snack-bar.mjs +0 -267
  484. package/esm2022/snack-bar/snack-bar_public_index.mjs +0 -5
  485. package/esm2022/snack-bar/testing/index.mjs +0 -9
  486. package/esm2022/snack-bar/testing/public-api.mjs +0 -10
  487. package/esm2022/snack-bar/testing/snack-bar-harness-filters.mjs +0 -9
  488. package/esm2022/snack-bar/testing/snack-bar-harness.mjs +0 -101
  489. package/esm2022/sort/index.mjs +0 -9
  490. package/esm2022/sort/public-api.mjs +0 -14
  491. package/esm2022/sort/sort-animations.mjs +0 -69
  492. package/esm2022/sort/sort-direction.mjs +0 -9
  493. package/esm2022/sort/sort-errors.mjs +0 -24
  494. package/esm2022/sort/sort-header-intl.mjs +0 -41
  495. package/esm2022/sort/sort-header.mjs +0 -317
  496. package/esm2022/sort/sort-module.mjs +0 -27
  497. package/esm2022/sort/sort.mjs +0 -155
  498. package/esm2022/sort/sort_public_index.mjs +0 -5
  499. package/esm2022/sort/testing/index.mjs +0 -9
  500. package/esm2022/sort/testing/public-api.mjs +0 -11
  501. package/esm2022/sort/testing/sort-harness-filters.mjs +0 -2
  502. package/esm2022/sort/testing/sort-harness.mjs +0 -36
  503. package/esm2022/sort/testing/sort-header-harness.mjs +0 -56
  504. package/esm2022/stepper/index.mjs +0 -9
  505. package/esm2022/stepper/public-api.mjs +0 -17
  506. package/esm2022/stepper/step-content.mjs +0 -27
  507. package/esm2022/stepper/step-header.mjs +0 -105
  508. package/esm2022/stepper/step-label.mjs +0 -22
  509. package/esm2022/stepper/stepper-animations.mjs +0 -47
  510. package/esm2022/stepper/stepper-button.mjs +0 -43
  511. package/esm2022/stepper/stepper-icon.mjs +0 -30
  512. package/esm2022/stepper/stepper-intl.mjs +0 -43
  513. package/esm2022/stepper/stepper-module.mjs +0 -88
  514. package/esm2022/stepper/stepper.mjs +0 -205
  515. package/esm2022/stepper/stepper_public_index.mjs +0 -5
  516. package/esm2022/stepper/testing/index.mjs +0 -9
  517. package/esm2022/stepper/testing/public-api.mjs +0 -12
  518. package/esm2022/stepper/testing/step-harness-filters.mjs +0 -7
  519. package/esm2022/stepper/testing/step-harness.mjs +0 -90
  520. package/esm2022/stepper/testing/stepper-button-harnesses.mjs +0 -48
  521. package/esm2022/stepper/testing/stepper-harness.mjs +0 -51
  522. package/esm2022/table/cell.mjs +0 -147
  523. package/esm2022/table/index.mjs +0 -9
  524. package/esm2022/table/module.mjs +0 -93
  525. package/esm2022/table/public-api.mjs +0 -14
  526. package/esm2022/table/row.mjs +0 -163
  527. package/esm2022/table/table-data-source.mjs +0 -317
  528. package/esm2022/table/table.mjs +0 -122
  529. package/esm2022/table/table_public_index.mjs +0 -5
  530. package/esm2022/table/testing/cell-harness.mjs +0 -77
  531. package/esm2022/table/testing/index.mjs +0 -9
  532. package/esm2022/table/testing/public-api.mjs +0 -12
  533. package/esm2022/table/testing/row-harness.mjs +0 -84
  534. package/esm2022/table/testing/table-harness-filters.mjs +0 -2
  535. package/esm2022/table/testing/table-harness.mjs +0 -86
  536. package/esm2022/table/text-column.mjs +0 -60
  537. package/esm2022/tabs/index.mjs +0 -9
  538. package/esm2022/tabs/ink-bar.mjs +0 -149
  539. package/esm2022/tabs/module.mjs +0 -60
  540. package/esm2022/tabs/paginated-tab-header.mjs +0 -539
  541. package/esm2022/tabs/public-api.mjs +0 -21
  542. package/esm2022/tabs/tab-body.mjs +0 -199
  543. package/esm2022/tabs/tab-config.mjs +0 -11
  544. package/esm2022/tabs/tab-content.mjs +0 -32
  545. package/esm2022/tabs/tab-group.mjs +0 -469
  546. package/esm2022/tabs/tab-header.mjs +0 -86
  547. package/esm2022/tabs/tab-label-wrapper.mjs +0 -49
  548. package/esm2022/tabs/tab-label.mjs +0 -44
  549. package/esm2022/tabs/tab-nav-bar/tab-nav-bar.mjs +0 -388
  550. package/esm2022/tabs/tab.mjs +0 -128
  551. package/esm2022/tabs/tabs-animations.mjs +0 -45
  552. package/esm2022/tabs/tabs_public_index.mjs +0 -5
  553. package/esm2022/tabs/testing/index.mjs +0 -9
  554. package/esm2022/tabs/testing/public-api.mjs +0 -13
  555. package/esm2022/tabs/testing/tab-group-harness.mjs +0 -56
  556. package/esm2022/tabs/testing/tab-harness-filters.mjs +0 -2
  557. package/esm2022/tabs/testing/tab-harness.mjs +0 -66
  558. package/esm2022/tabs/testing/tab-link-harness.mjs +0 -40
  559. package/esm2022/tabs/testing/tab-nav-bar-harness.mjs +0 -66
  560. package/esm2022/tabs/testing/tab-nav-panel-harness.mjs +0 -27
  561. package/esm2022/toolbar/index.mjs +0 -9
  562. package/esm2022/toolbar/public-api.mjs +0 -10
  563. package/esm2022/toolbar/testing/index.mjs +0 -9
  564. package/esm2022/toolbar/testing/public-api.mjs +0 -10
  565. package/esm2022/toolbar/testing/toolbar-harness-filters.mjs +0 -9
  566. package/esm2022/toolbar/testing/toolbar-harness.mjs +0 -44
  567. package/esm2022/toolbar/toolbar-module.mjs +0 -24
  568. package/esm2022/toolbar/toolbar.mjs +0 -84
  569. package/esm2022/toolbar/toolbar_public_index.mjs +0 -5
  570. package/esm2022/tooltip/index.mjs +0 -9
  571. package/esm2022/tooltip/module.mjs +0 -29
  572. package/esm2022/tooltip/public-api.mjs +0 -11
  573. package/esm2022/tooltip/testing/index.mjs +0 -9
  574. package/esm2022/tooltip/testing/public-api.mjs +0 -10
  575. package/esm2022/tooltip/testing/tooltip-harness-filters.mjs +0 -9
  576. package/esm2022/tooltip/testing/tooltip-harness.mjs +0 -66
  577. package/esm2022/tooltip/tooltip-animations.mjs +0 -24
  578. package/esm2022/tooltip/tooltip.mjs +0 -920
  579. package/esm2022/tooltip/tooltip_public_index.mjs +0 -5
  580. package/esm2022/tree/data-source/flat-data-source.mjs +0 -156
  581. package/esm2022/tree/data-source/nested-data-source.mjs +0 -38
  582. package/esm2022/tree/index.mjs +0 -9
  583. package/esm2022/tree/node.mjs +0 -220
  584. package/esm2022/tree/outlet.mjs +0 -46
  585. package/esm2022/tree/padding.mjs +0 -46
  586. package/esm2022/tree/public-api.mjs +0 -16
  587. package/esm2022/tree/testing/index.mjs +0 -9
  588. package/esm2022/tree/testing/node-harness.mjs +0 -73
  589. package/esm2022/tree/testing/public-api.mjs +0 -11
  590. package/esm2022/tree/testing/tree-harness-filters.mjs +0 -9
  591. package/esm2022/tree/testing/tree-harness.mjs +0 -123
  592. package/esm2022/tree/toggle.mjs +0 -27
  593. package/esm2022/tree/tree-module.mjs +0 -50
  594. package/esm2022/tree/tree.mjs +0 -34
  595. package/esm2022/tree/tree_public_index.mjs +0 -5
@@ -1,460 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import { DOWN_ARROW, END, ENTER, HOME, LEFT_ARROW, PAGE_DOWN, PAGE_UP, RIGHT_ARROW, UP_ARROW, SPACE, ESCAPE, hasModifierKey, } from '@angular/cdk/keycodes';
9
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Inject, Input, Optional, Output, ViewEncapsulation, ViewChild, } from '@angular/core';
10
- import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
11
- import { Directionality } from '@angular/cdk/bidi';
12
- import { MatCalendarBody, MatCalendarCell, } from './calendar-body';
13
- import { createMissingDateImplError } from './datepicker-errors';
14
- import { Subscription } from 'rxjs';
15
- import { startWith } from 'rxjs/operators';
16
- import { DateRange } from './date-selection-model';
17
- import { MAT_DATE_RANGE_SELECTION_STRATEGY, } from './date-range-selection-strategy';
18
- import * as i0 from "@angular/core";
19
- import * as i1 from "@angular/material/core";
20
- import * as i2 from "@angular/cdk/bidi";
21
- const DAYS_PER_WEEK = 7;
22
- let uniqueIdCounter = 0;
23
- /**
24
- * An internal component used to display a single month in the datepicker.
25
- * @docs-private
26
- */
27
- export class MatMonthView {
28
- /**
29
- * The date to display in this month view (everything other than the month and year is ignored).
30
- */
31
- get activeDate() {
32
- return this._activeDate;
33
- }
34
- set activeDate(value) {
35
- const oldActiveDate = this._activeDate;
36
- const validDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value)) ||
37
- this._dateAdapter.today();
38
- this._activeDate = this._dateAdapter.clampDate(validDate, this.minDate, this.maxDate);
39
- if (!this._hasSameMonthAndYear(oldActiveDate, this._activeDate)) {
40
- this._init();
41
- }
42
- }
43
- /** The currently selected date. */
44
- get selected() {
45
- return this._selected;
46
- }
47
- set selected(value) {
48
- if (value instanceof DateRange) {
49
- this._selected = value;
50
- }
51
- else {
52
- this._selected = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
53
- }
54
- this._setRanges(this._selected);
55
- }
56
- /** The minimum selectable date. */
57
- get minDate() {
58
- return this._minDate;
59
- }
60
- set minDate(value) {
61
- this._minDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
62
- }
63
- /** The maximum selectable date. */
64
- get maxDate() {
65
- return this._maxDate;
66
- }
67
- set maxDate(value) {
68
- this._maxDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
69
- }
70
- constructor(_changeDetectorRef, _dateFormats, _dateAdapter, _dir, _rangeStrategy) {
71
- this._changeDetectorRef = _changeDetectorRef;
72
- this._dateFormats = _dateFormats;
73
- this._dateAdapter = _dateAdapter;
74
- this._dir = _dir;
75
- this._rangeStrategy = _rangeStrategy;
76
- this._rerenderSubscription = Subscription.EMPTY;
77
- /** Origin of active drag, or null when dragging is not active. */
78
- this.activeDrag = null;
79
- /** Emits when a new date is selected. */
80
- this.selectedChange = new EventEmitter();
81
- /** Emits when any date is selected. */
82
- this._userSelection = new EventEmitter();
83
- /** Emits when the user initiates a date range drag via mouse or touch. */
84
- this.dragStarted = new EventEmitter();
85
- /**
86
- * Emits when the user completes or cancels a date range drag.
87
- * Emits null when the drag was canceled or the newly selected date range if completed.
88
- */
89
- this.dragEnded = new EventEmitter();
90
- /** Emits when any date is activated. */
91
- this.activeDateChange = new EventEmitter();
92
- if (typeof ngDevMode === 'undefined' || ngDevMode) {
93
- if (!this._dateAdapter) {
94
- throw createMissingDateImplError('DateAdapter');
95
- }
96
- if (!this._dateFormats) {
97
- throw createMissingDateImplError('MAT_DATE_FORMATS');
98
- }
99
- }
100
- this._activeDate = this._dateAdapter.today();
101
- }
102
- ngAfterContentInit() {
103
- this._rerenderSubscription = this._dateAdapter.localeChanges
104
- .pipe(startWith(null))
105
- .subscribe(() => this._init());
106
- }
107
- ngOnChanges(changes) {
108
- const comparisonChange = changes['comparisonStart'] || changes['comparisonEnd'];
109
- if (comparisonChange && !comparisonChange.firstChange) {
110
- this._setRanges(this.selected);
111
- }
112
- if (changes['activeDrag'] && !this.activeDrag) {
113
- this._clearPreview();
114
- }
115
- }
116
- ngOnDestroy() {
117
- this._rerenderSubscription.unsubscribe();
118
- }
119
- /** Handles when a new date is selected. */
120
- _dateSelected(event) {
121
- const date = event.value;
122
- const selectedDate = this._getDateFromDayOfMonth(date);
123
- let rangeStartDate;
124
- let rangeEndDate;
125
- if (this._selected instanceof DateRange) {
126
- rangeStartDate = this._getDateInCurrentMonth(this._selected.start);
127
- rangeEndDate = this._getDateInCurrentMonth(this._selected.end);
128
- }
129
- else {
130
- rangeStartDate = rangeEndDate = this._getDateInCurrentMonth(this._selected);
131
- }
132
- if (rangeStartDate !== date || rangeEndDate !== date) {
133
- this.selectedChange.emit(selectedDate);
134
- }
135
- this._userSelection.emit({ value: selectedDate, event: event.event });
136
- this._clearPreview();
137
- this._changeDetectorRef.markForCheck();
138
- }
139
- /**
140
- * Takes the index of a calendar body cell wrapped in an event as argument. For the date that
141
- * corresponds to the given cell, set `activeDate` to that date and fire `activeDateChange` with
142
- * that date.
143
- *
144
- * This function is used to match each component's model of the active date with the calendar
145
- * body cell that was focused. It updates its value of `activeDate` synchronously and updates the
146
- * parent's value asynchronously via the `activeDateChange` event. The child component receives an
147
- * updated value asynchronously via the `activeCell` Input.
148
- */
149
- _updateActiveDate(event) {
150
- const month = event.value;
151
- const oldActiveDate = this._activeDate;
152
- this.activeDate = this._getDateFromDayOfMonth(month);
153
- if (this._dateAdapter.compareDate(oldActiveDate, this.activeDate)) {
154
- this.activeDateChange.emit(this._activeDate);
155
- }
156
- }
157
- /** Handles keydown events on the calendar body when calendar is in month view. */
158
- _handleCalendarBodyKeydown(event) {
159
- // TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent
160
- // disabled ones from being selected. This may not be ideal, we should look into whether
161
- // navigation should skip over disabled dates, and if so, how to implement that efficiently.
162
- const oldActiveDate = this._activeDate;
163
- const isRtl = this._isRtl();
164
- switch (event.keyCode) {
165
- case LEFT_ARROW:
166
- this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, isRtl ? 1 : -1);
167
- break;
168
- case RIGHT_ARROW:
169
- this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, isRtl ? -1 : 1);
170
- break;
171
- case UP_ARROW:
172
- this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, -7);
173
- break;
174
- case DOWN_ARROW:
175
- this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, 7);
176
- break;
177
- case HOME:
178
- this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, 1 - this._dateAdapter.getDate(this._activeDate));
179
- break;
180
- case END:
181
- this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, this._dateAdapter.getNumDaysInMonth(this._activeDate) -
182
- this._dateAdapter.getDate(this._activeDate));
183
- break;
184
- case PAGE_UP:
185
- this.activeDate = event.altKey
186
- ? this._dateAdapter.addCalendarYears(this._activeDate, -1)
187
- : this._dateAdapter.addCalendarMonths(this._activeDate, -1);
188
- break;
189
- case PAGE_DOWN:
190
- this.activeDate = event.altKey
191
- ? this._dateAdapter.addCalendarYears(this._activeDate, 1)
192
- : this._dateAdapter.addCalendarMonths(this._activeDate, 1);
193
- break;
194
- case ENTER:
195
- case SPACE:
196
- this._selectionKeyPressed = true;
197
- if (this._canSelect(this._activeDate)) {
198
- // Prevent unexpected default actions such as form submission.
199
- // Note that we only prevent the default action here while the selection happens in
200
- // `keyup` below. We can't do the selection here, because it can cause the calendar to
201
- // reopen if focus is restored immediately. We also can't call `preventDefault` on `keyup`
202
- // because it's too late (see #23305).
203
- event.preventDefault();
204
- }
205
- return;
206
- case ESCAPE:
207
- // Abort the current range selection if the user presses escape mid-selection.
208
- if (this._previewEnd != null && !hasModifierKey(event)) {
209
- this._clearPreview();
210
- // If a drag is in progress, cancel the drag without changing the
211
- // current selection.
212
- if (this.activeDrag) {
213
- this.dragEnded.emit({ value: null, event });
214
- }
215
- else {
216
- this.selectedChange.emit(null);
217
- this._userSelection.emit({ value: null, event });
218
- }
219
- event.preventDefault();
220
- event.stopPropagation(); // Prevents the overlay from closing.
221
- }
222
- return;
223
- default:
224
- // Don't prevent default or focus active cell on keys that we don't explicitly handle.
225
- return;
226
- }
227
- if (this._dateAdapter.compareDate(oldActiveDate, this.activeDate)) {
228
- this.activeDateChange.emit(this.activeDate);
229
- this._focusActiveCellAfterViewChecked();
230
- }
231
- // Prevent unexpected default actions such as form submission.
232
- event.preventDefault();
233
- }
234
- /** Handles keyup events on the calendar body when calendar is in month view. */
235
- _handleCalendarBodyKeyup(event) {
236
- if (event.keyCode === SPACE || event.keyCode === ENTER) {
237
- if (this._selectionKeyPressed && this._canSelect(this._activeDate)) {
238
- this._dateSelected({ value: this._dateAdapter.getDate(this._activeDate), event });
239
- }
240
- this._selectionKeyPressed = false;
241
- }
242
- }
243
- /** Initializes this month view. */
244
- _init() {
245
- this._setRanges(this.selected);
246
- this._todayDate = this._getCellCompareValue(this._dateAdapter.today());
247
- this._monthLabel = this._dateFormats.display.monthLabel
248
- ? this._dateAdapter.format(this.activeDate, this._dateFormats.display.monthLabel)
249
- : this._dateAdapter
250
- .getMonthNames('short')[this._dateAdapter.getMonth(this.activeDate)].toLocaleUpperCase();
251
- let firstOfMonth = this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), this._dateAdapter.getMonth(this.activeDate), 1);
252
- this._firstWeekOffset =
253
- (DAYS_PER_WEEK +
254
- this._dateAdapter.getDayOfWeek(firstOfMonth) -
255
- this._dateAdapter.getFirstDayOfWeek()) %
256
- DAYS_PER_WEEK;
257
- this._initWeekdays();
258
- this._createWeekCells();
259
- this._changeDetectorRef.markForCheck();
260
- }
261
- /** Focuses the active cell after the microtask queue is empty. */
262
- _focusActiveCell(movePreview) {
263
- this._matCalendarBody._focusActiveCell(movePreview);
264
- }
265
- /** Focuses the active cell after change detection has run and the microtask queue is empty. */
266
- _focusActiveCellAfterViewChecked() {
267
- this._matCalendarBody._scheduleFocusActiveCellAfterViewChecked();
268
- }
269
- /** Called when the user has activated a new cell and the preview needs to be updated. */
270
- _previewChanged({ event, value: cell }) {
271
- if (this._rangeStrategy) {
272
- // We can assume that this will be a range, because preview
273
- // events aren't fired for single date selections.
274
- const value = cell ? cell.rawValue : null;
275
- const previewRange = this._rangeStrategy.createPreview(value, this.selected, event);
276
- this._previewStart = this._getCellCompareValue(previewRange.start);
277
- this._previewEnd = this._getCellCompareValue(previewRange.end);
278
- if (this.activeDrag && value) {
279
- const dragRange = this._rangeStrategy.createDrag?.(this.activeDrag.value, this.selected, value, event);
280
- if (dragRange) {
281
- this._previewStart = this._getCellCompareValue(dragRange.start);
282
- this._previewEnd = this._getCellCompareValue(dragRange.end);
283
- }
284
- }
285
- // Note that here we need to use `detectChanges`, rather than `markForCheck`, because
286
- // the way `_focusActiveCell` is set up at the moment makes it fire at the wrong time
287
- // when navigating one month back using the keyboard which will cause this handler
288
- // to throw a "changed after checked" error when updating the preview state.
289
- this._changeDetectorRef.detectChanges();
290
- }
291
- }
292
- /**
293
- * Called when the user has ended a drag. If the drag/drop was successful,
294
- * computes and emits the new range selection.
295
- */
296
- _dragEnded(event) {
297
- if (!this.activeDrag)
298
- return;
299
- if (event.value) {
300
- // Propagate drag effect
301
- const dragDropResult = this._rangeStrategy?.createDrag?.(this.activeDrag.value, this.selected, event.value, event.event);
302
- this.dragEnded.emit({ value: dragDropResult ?? null, event: event.event });
303
- }
304
- else {
305
- this.dragEnded.emit({ value: null, event: event.event });
306
- }
307
- }
308
- /**
309
- * Takes a day of the month and returns a new date in the same month and year as the currently
310
- * active date. The returned date will have the same day of the month as the argument date.
311
- */
312
- _getDateFromDayOfMonth(dayOfMonth) {
313
- return this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), this._dateAdapter.getMonth(this.activeDate), dayOfMonth);
314
- }
315
- /** Initializes the weekdays. */
316
- _initWeekdays() {
317
- const firstDayOfWeek = this._dateAdapter.getFirstDayOfWeek();
318
- const narrowWeekdays = this._dateAdapter.getDayOfWeekNames('narrow');
319
- const longWeekdays = this._dateAdapter.getDayOfWeekNames('long');
320
- // Rotate the labels for days of the week based on the configured first day of the week.
321
- let weekdays = longWeekdays.map((long, i) => {
322
- return { long, narrow: narrowWeekdays[i], id: uniqueIdCounter++ };
323
- });
324
- this._weekdays = weekdays.slice(firstDayOfWeek).concat(weekdays.slice(0, firstDayOfWeek));
325
- }
326
- /** Creates MatCalendarCells for the dates in this month. */
327
- _createWeekCells() {
328
- const daysInMonth = this._dateAdapter.getNumDaysInMonth(this.activeDate);
329
- const dateNames = this._dateAdapter.getDateNames();
330
- this._weeks = [[]];
331
- for (let i = 0, cell = this._firstWeekOffset; i < daysInMonth; i++, cell++) {
332
- if (cell == DAYS_PER_WEEK) {
333
- this._weeks.push([]);
334
- cell = 0;
335
- }
336
- const date = this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), this._dateAdapter.getMonth(this.activeDate), i + 1);
337
- const enabled = this._shouldEnableDate(date);
338
- const ariaLabel = this._dateAdapter.format(date, this._dateFormats.display.dateA11yLabel);
339
- const cellClasses = this.dateClass ? this.dateClass(date, 'month') : undefined;
340
- this._weeks[this._weeks.length - 1].push(new MatCalendarCell(i + 1, dateNames[i], ariaLabel, enabled, cellClasses, this._getCellCompareValue(date), date));
341
- }
342
- }
343
- /** Date filter for the month */
344
- _shouldEnableDate(date) {
345
- return (!!date &&
346
- (!this.minDate || this._dateAdapter.compareDate(date, this.minDate) >= 0) &&
347
- (!this.maxDate || this._dateAdapter.compareDate(date, this.maxDate) <= 0) &&
348
- (!this.dateFilter || this.dateFilter(date)));
349
- }
350
- /**
351
- * Gets the date in this month that the given Date falls on.
352
- * Returns null if the given Date is in another month.
353
- */
354
- _getDateInCurrentMonth(date) {
355
- return date && this._hasSameMonthAndYear(date, this.activeDate)
356
- ? this._dateAdapter.getDate(date)
357
- : null;
358
- }
359
- /** Checks whether the 2 dates are non-null and fall within the same month of the same year. */
360
- _hasSameMonthAndYear(d1, d2) {
361
- return !!(d1 &&
362
- d2 &&
363
- this._dateAdapter.getMonth(d1) == this._dateAdapter.getMonth(d2) &&
364
- this._dateAdapter.getYear(d1) == this._dateAdapter.getYear(d2));
365
- }
366
- /** Gets the value that will be used to one cell to another. */
367
- _getCellCompareValue(date) {
368
- if (date) {
369
- // We use the time since the Unix epoch to compare dates in this view, rather than the
370
- // cell values, because we need to support ranges that span across multiple months/years.
371
- const year = this._dateAdapter.getYear(date);
372
- const month = this._dateAdapter.getMonth(date);
373
- const day = this._dateAdapter.getDate(date);
374
- return new Date(year, month, day).getTime();
375
- }
376
- return null;
377
- }
378
- /** Determines whether the user has the RTL layout direction. */
379
- _isRtl() {
380
- return this._dir && this._dir.value === 'rtl';
381
- }
382
- /** Sets the current range based on a model value. */
383
- _setRanges(selectedValue) {
384
- if (selectedValue instanceof DateRange) {
385
- this._rangeStart = this._getCellCompareValue(selectedValue.start);
386
- this._rangeEnd = this._getCellCompareValue(selectedValue.end);
387
- this._isRange = true;
388
- }
389
- else {
390
- this._rangeStart = this._rangeEnd = this._getCellCompareValue(selectedValue);
391
- this._isRange = false;
392
- }
393
- this._comparisonRangeStart = this._getCellCompareValue(this.comparisonStart);
394
- this._comparisonRangeEnd = this._getCellCompareValue(this.comparisonEnd);
395
- }
396
- /** Gets whether a date can be selected in the month view. */
397
- _canSelect(date) {
398
- return !this.dateFilter || this.dateFilter(date);
399
- }
400
- /** Clears out preview state. */
401
- _clearPreview() {
402
- this._previewStart = this._previewEnd = null;
403
- }
404
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: MatMonthView, deps: [{ token: i0.ChangeDetectorRef }, { token: MAT_DATE_FORMATS, optional: true }, { token: i1.DateAdapter, optional: true }, { token: i2.Directionality, optional: true }, { token: MAT_DATE_RANGE_SELECTION_STRATEGY, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
405
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0-next.2", type: MatMonthView, isStandalone: true, selector: "mat-month-view", inputs: { activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate", dateFilter: "dateFilter", dateClass: "dateClass", comparisonStart: "comparisonStart", comparisonEnd: "comparisonEnd", startDateAccessibleName: "startDateAccessibleName", endDateAccessibleName: "endDateAccessibleName", activeDrag: "activeDrag" }, outputs: { selectedChange: "selectedChange", _userSelection: "_userSelection", dragStarted: "dragStarted", dragEnded: "dragEnded", activeDateChange: "activeDateChange" }, viewQueries: [{ propertyName: "_matCalendarBody", first: true, predicate: MatCalendarBody, descendants: true }], exportAs: ["matMonthView"], usesOnChanges: true, ngImport: i0, template: "<table class=\"mat-calendar-table\" role=\"grid\">\n <thead class=\"mat-calendar-table-header\">\n <tr>\n @for (day of _weekdays; track day.id) {\n <th scope=\"col\">\n <span class=\"cdk-visually-hidden\">{{day.long}}</span>\n <span aria-hidden=\"true\">{{day.narrow}}</span>\n </th>\n }\n </tr>\n <tr aria-hidden=\"true\"><th class=\"mat-calendar-table-header-divider\" colspan=\"7\"></th></tr>\n </thead>\n <tbody mat-calendar-body\n [label]=\"_monthLabel\"\n [rows]=\"_weeks\"\n [todayValue]=\"_todayDate!\"\n [startValue]=\"_rangeStart!\"\n [endValue]=\"_rangeEnd!\"\n [comparisonStart]=\"_comparisonRangeStart\"\n [comparisonEnd]=\"_comparisonRangeEnd\"\n [previewStart]=\"_previewStart\"\n [previewEnd]=\"_previewEnd\"\n [isRange]=\"_isRange\"\n [labelMinRequiredCells]=\"3\"\n [activeCell]=\"_dateAdapter.getDate(activeDate) - 1\"\n [startDateAccessibleName]=\"startDateAccessibleName\"\n [endDateAccessibleName]=\"endDateAccessibleName\"\n (selectedValueChange)=\"_dateSelected($event)\"\n (activeDateChange)=\"_updateActiveDate($event)\"\n (previewChange)=\"_previewChanged($event)\"\n (dragStarted)=\"dragStarted.emit($event)\"\n (dragEnded)=\"_dragEnded($event)\"\n (keyup)=\"_handleCalendarBodyKeyup($event)\"\n (keydown)=\"_handleCalendarBodyKeydown($event)\">\n </tbody>\n</table>\n", dependencies: [{ kind: "component", type: MatCalendarBody, selector: "[mat-calendar-body]", inputs: ["label", "rows", "todayValue", "startValue", "endValue", "labelMinRequiredCells", "numCols", "activeCell", "isRange", "cellAspectRatio", "comparisonStart", "comparisonEnd", "previewStart", "previewEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedValueChange", "previewChange", "activeDateChange", "dragStarted", "dragEnded"], exportAs: ["matCalendarBody"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
406
- }
407
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: MatMonthView, decorators: [{
408
- type: Component,
409
- args: [{ selector: 'mat-month-view', exportAs: 'matMonthView', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatCalendarBody], template: "<table class=\"mat-calendar-table\" role=\"grid\">\n <thead class=\"mat-calendar-table-header\">\n <tr>\n @for (day of _weekdays; track day.id) {\n <th scope=\"col\">\n <span class=\"cdk-visually-hidden\">{{day.long}}</span>\n <span aria-hidden=\"true\">{{day.narrow}}</span>\n </th>\n }\n </tr>\n <tr aria-hidden=\"true\"><th class=\"mat-calendar-table-header-divider\" colspan=\"7\"></th></tr>\n </thead>\n <tbody mat-calendar-body\n [label]=\"_monthLabel\"\n [rows]=\"_weeks\"\n [todayValue]=\"_todayDate!\"\n [startValue]=\"_rangeStart!\"\n [endValue]=\"_rangeEnd!\"\n [comparisonStart]=\"_comparisonRangeStart\"\n [comparisonEnd]=\"_comparisonRangeEnd\"\n [previewStart]=\"_previewStart\"\n [previewEnd]=\"_previewEnd\"\n [isRange]=\"_isRange\"\n [labelMinRequiredCells]=\"3\"\n [activeCell]=\"_dateAdapter.getDate(activeDate) - 1\"\n [startDateAccessibleName]=\"startDateAccessibleName\"\n [endDateAccessibleName]=\"endDateAccessibleName\"\n (selectedValueChange)=\"_dateSelected($event)\"\n (activeDateChange)=\"_updateActiveDate($event)\"\n (previewChange)=\"_previewChanged($event)\"\n (dragStarted)=\"dragStarted.emit($event)\"\n (dragEnded)=\"_dragEnded($event)\"\n (keyup)=\"_handleCalendarBodyKeyup($event)\"\n (keydown)=\"_handleCalendarBodyKeydown($event)\">\n </tbody>\n</table>\n" }]
410
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
411
- type: Optional
412
- }, {
413
- type: Inject,
414
- args: [MAT_DATE_FORMATS]
415
- }] }, { type: i1.DateAdapter, decorators: [{
416
- type: Optional
417
- }] }, { type: i2.Directionality, decorators: [{
418
- type: Optional
419
- }] }, { type: undefined, decorators: [{
420
- type: Inject,
421
- args: [MAT_DATE_RANGE_SELECTION_STRATEGY]
422
- }, {
423
- type: Optional
424
- }] }], propDecorators: { activeDate: [{
425
- type: Input
426
- }], selected: [{
427
- type: Input
428
- }], minDate: [{
429
- type: Input
430
- }], maxDate: [{
431
- type: Input
432
- }], dateFilter: [{
433
- type: Input
434
- }], dateClass: [{
435
- type: Input
436
- }], comparisonStart: [{
437
- type: Input
438
- }], comparisonEnd: [{
439
- type: Input
440
- }], startDateAccessibleName: [{
441
- type: Input
442
- }], endDateAccessibleName: [{
443
- type: Input
444
- }], activeDrag: [{
445
- type: Input
446
- }], selectedChange: [{
447
- type: Output
448
- }], _userSelection: [{
449
- type: Output
450
- }], dragStarted: [{
451
- type: Output
452
- }], dragEnded: [{
453
- type: Output
454
- }], activeDateChange: [{
455
- type: Output
456
- }], _matCalendarBody: [{
457
- type: ViewChild,
458
- args: [MatCalendarBody]
459
- }] } });
460
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udGgtdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tYXRlcmlhbC9kYXRlcGlja2VyL21vbnRoLXZpZXcudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwvZGF0ZXBpY2tlci9tb250aC12aWV3Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUNMLFVBQVUsRUFDVixHQUFHLEVBQ0gsS0FBSyxFQUNMLElBQUksRUFDSixVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sRUFDUCxXQUFXLEVBQ1gsUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBQ04sY0FBYyxHQUNmLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLFNBQVMsR0FJVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFpQixNQUFNLHdCQUF3QixDQUFDO0FBQ3JGLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGVBQWUsR0FHaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUVMLGlDQUFpQyxHQUNsQyxNQUFNLGlDQUFpQyxDQUFDOzs7O0FBRXpDLE1BQU0sYUFB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QyxTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtcbiAgRE9XTl9BUlJPVyxcbiAgRU5ELFxuICBFTlRFUixcbiAgSE9NRSxcbiAgTEVGVF9BUlJPVyxcbiAgUEFHRV9ET1dOLFxuICBQQUdFX1VQLFxuICBSSUdIVF9BUlJPVyxcbiAgVVBfQVJST1csXG4gIFNQQUNFLFxuICBFU0NBUEUsXG4gIGhhc01vZGlmaWVyS2V5LFxufSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIFZpZXdDaGlsZCxcbiAgT25EZXN0cm95LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPbkNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtEYXRlQWRhcHRlciwgTUFUX0RBVEVfRk9STUFUUywgTWF0RGF0ZUZvcm1hdHN9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHtEaXJlY3Rpb25hbGl0eX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xuaW1wb3J0IHtcbiAgTWF0Q2FsZW5kYXJCb2R5LFxuICBNYXRDYWxlbmRhckNlbGwsXG4gIE1hdENhbGVuZGFyVXNlckV2ZW50LFxuICBNYXRDYWxlbmRhckNlbGxDbGFzc0Z1bmN0aW9uLFxufSBmcm9tICcuL2NhbGVuZGFyLWJvZHknO1xuaW1wb3J0IHtjcmVhdGVNaXNzaW5nRGF0ZUltcGxFcnJvcn0gZnJvbSAnLi9kYXRlcGlja2VyLWVycm9ycyc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3N0YXJ0V2l0aH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtEYXRlUmFuZ2V9IGZyb20gJy4vZGF0ZS1zZWxlY3Rpb24tbW9kZWwnO1xuaW1wb3J0IHtcbiAgTWF0RGF0ZVJhbmdlU2VsZWN0aW9uU3RyYXRlZ3ksXG4gIE1BVF9EQVRFX1JBTkdFX1NFTEVDVElPTl9TVFJBVEVHWSxcbn0gZnJvbSAnLi9kYXRlLXJhbmdlLXNlbGVjdGlvbi1zdHJhdGVneSc7XG5cbmNvbnN0IERBWVNfUEVSX1dFRUsgPSA3O1xuXG5sZXQgdW5pcXVlSWRDb3VudGVyID0gMDtcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCBjb21wb25lbnQgdXNlZCB0byBkaXNwbGF5IGEgc2luZ2xlIG1vbnRoIGluIHRoZSBkYXRlcGlja2VyLlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtbW9udGgtdmlldycsXG4gIHRlbXBsYXRlVXJsOiAnbW9udGgtdmlldy5odG1sJyxcbiAgZXhwb3J0QXM6ICdtYXRNb250aFZpZXcnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW01hdENhbGVuZGFyQm9keV0sXG59KVxuZXhwb3J0IGNsYXNzIE1hdE1vbnRoVmlldzxEPiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfcmVyZW5kZXJTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgLyoqIEZsYWcgdXNlZCB0byBmaWx0ZXIgb3V0IHNwYWNlL2VudGVyIGtleXVwIGV2ZW50cyB0aGF0IG9yaWdpbmF0ZWQgb3V0c2lkZSBvZiB0aGUgdmlldy4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0aW9uS2V5UHJlc3NlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGRhdGUgdG8gZGlzcGxheSBpbiB0aGlzIG1vbnRoIHZpZXcgKGV2ZXJ5dGhpbmcgb3RoZXIgdGhhbiB0aGUgbW9udGggYW5kIHllYXIgaXMgaWdub3JlZCkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgYWN0aXZlRGF0ZSgpOiBEIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGF0ZTtcbiAgfVxuICBzZXQgYWN0aXZlRGF0ZSh2YWx1ZTogRCkge1xuICAgIGNvbnN0IG9sZEFjdGl2ZURhdGUgPSB0aGlzLl9hY3RpdmVEYXRlO1xuICAgIGNvbnN0IHZhbGlkRGF0ZSA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKSB8fFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKTtcbiAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY2xhbXBEYXRlKHZhbGlkRGF0ZSwgdGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUpO1xuICAgIGlmICghdGhpcy5faGFzU2FtZU1vbnRoQW5kWWVhcihvbGRBY3RpdmVEYXRlLCB0aGlzLl9hY3RpdmVEYXRlKSkge1xuICAgICAgdGhpcy5faW5pdCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9hY3RpdmVEYXRlOiBEO1xuXG4gIC8qKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGUuICovXG4gIEBJbnB1dCgpXG4gIGdldCBzZWxlY3RlZCgpOiBEYXRlUmFuZ2U8RD4gfCBEIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xuICB9XG4gIHNldCBzZWxlY3RlZCh2YWx1ZTogRGF0ZVJhbmdlPEQ+IHwgRCB8IG51bGwpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlUmFuZ2UpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0UmFuZ2VzKHRoaXMuX3NlbGVjdGVkKTtcbiAgfVxuICBwcml2YXRlIF9zZWxlY3RlZDogRGF0ZVJhbmdlPEQ+IHwgRCB8IG51bGw7XG5cbiAgLyoqIFRoZSBtaW5pbXVtIHNlbGVjdGFibGUgZGF0ZS4gKi9cbiAgQElucHV0KClcbiAgZ2V0IG1pbkRhdGUoKTogRCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9taW5EYXRlO1xuICB9XG4gIHNldCBtaW5EYXRlKHZhbHVlOiBEIHwgbnVsbCkge1xuICAgIHRoaXMuX21pbkRhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgfVxuICBwcml2YXRlIF9taW5EYXRlOiBEIHwgbnVsbDtcblxuICAvKiogVGhlIG1heGltdW0gc2VsZWN0YWJsZSBkYXRlLiAqL1xuICBASW5wdXQoKVxuICBnZXQgbWF4RGF0ZSgpOiBEIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21heERhdGU7XG4gIH1cbiAgc2V0IG1heERhdGUodmFsdWU6IEQgfCBudWxsKSB7XG4gICAgdGhpcy5fbWF4RGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICB9XG4gIHByaXZhdGUgX21heERhdGU6IEQgfCBudWxsO1xuXG4gIC8qKiBGdW5jdGlvbiB1c2VkIHRvIGZpbHRlciB3aGljaCBkYXRlcyBhcmUgc2VsZWN0YWJsZS4gKi9cbiAgQElucHV0KCkgZGF0ZUZpbHRlcjogKGRhdGU6IEQpID0+IGJvb2xlYW47XG5cbiAgLyoqIEZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIGN1c3RvbSBDU1MgY2xhc3NlcyB0byBkYXRlcy4gKi9cbiAgQElucHV0KCkgZGF0ZUNsYXNzOiBNYXRDYWxlbmRhckNlbGxDbGFzc0Z1bmN0aW9uPEQ+O1xuXG4gIC8qKiBTdGFydCBvZiB0aGUgY29tcGFyaXNvbiByYW5nZS4gKi9cbiAgQElucHV0KCkgY29tcGFyaXNvblN0YXJ0OiBEIHwgbnVsbDtcblxuICAvKiogRW5kIG9mIHRoZSBjb21wYXJpc29uIHJhbmdlLiAqL1xuICBASW5wdXQoKSBjb21wYXJpc29uRW5kOiBEIHwgbnVsbDtcblxuICAvKiogQVJJQSBBY2Nlc3NpYmxlIG5hbWUgb2YgdGhlIGA8aW5wdXQgbWF0U3RhcnREYXRlLz5gICovXG4gIEBJbnB1dCgpIHN0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKiBBUklBIEFjY2Vzc2libGUgbmFtZSBvZiB0aGUgYDxpbnB1dCBtYXRFbmREYXRlLz5gICovXG4gIEBJbnB1dCgpIGVuZERhdGVBY2Nlc3NpYmxlTmFtZTogc3RyaW5nIHwgbnVsbDtcblxuICAvKiogT3JpZ2luIG9mIGFjdGl2ZSBkcmFnLCBvciBudWxsIHdoZW4gZHJhZ2dpbmcgaXMgbm90IGFjdGl2ZS4gKi9cbiAgQElucHV0KCkgYWN0aXZlRHJhZzogTWF0Q2FsZW5kYXJVc2VyRXZlbnQ8RD4gfCBudWxsID0gbnVsbDtcblxuICAvKiogRW1pdHMgd2hlbiBhIG5ldyBkYXRlIGlzIHNlbGVjdGVkLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VsZWN0ZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEIHwgbnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyPEQgfCBudWxsPigpO1xuXG4gIC8qKiBFbWl0cyB3aGVuIGFueSBkYXRlIGlzIHNlbGVjdGVkLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgX3VzZXJTZWxlY3Rpb246IEV2ZW50RW1pdHRlcjxNYXRDYWxlbmRhclVzZXJFdmVudDxEIHwgbnVsbD4+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPE1hdENhbGVuZGFyVXNlckV2ZW50PEQgfCBudWxsPj4oKTtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgdXNlciBpbml0aWF0ZXMgYSBkYXRlIHJhbmdlIGRyYWcgdmlhIG1vdXNlIG9yIHRvdWNoLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZHJhZ1N0YXJ0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1hdENhbGVuZGFyVXNlckV2ZW50PEQ+PigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSB1c2VyIGNvbXBsZXRlcyBvciBjYW5jZWxzIGEgZGF0ZSByYW5nZSBkcmFnLlxuICAgKiBFbWl0cyBudWxsIHdoZW4gdGhlIGRyYWcgd2FzIGNhbmNlbGVkIG9yIHRoZSBuZXdseSBzZWxlY3RlZCBkYXRlIHJhbmdlIGlmIGNvbXBsZXRlZC5cbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBkcmFnRW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1hdENhbGVuZGFyVXNlckV2ZW50PERhdGVSYW5nZTxEPiB8IG51bGw+PigpO1xuXG4gIC8qKiBFbWl0cyB3aGVuIGFueSBkYXRlIGlzIGFjdGl2YXRlZC4gKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGFjdGl2ZURhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEPiA9IG5ldyBFdmVudEVtaXR0ZXI8RD4oKTtcblxuICAvKiogVGhlIGJvZHkgb2YgY2FsZW5kYXIgdGFibGUgKi9cbiAgQFZpZXdDaGlsZChNYXRDYWxlbmRhckJvZHkpIF9tYXRDYWxlbmRhckJvZHk6IE1hdENhbGVuZGFyQm9keTtcblxuICAvKiogVGhlIGxhYmVsIGZvciB0aGlzIG1vbnRoIChlLmcuIFwiSmFudWFyeSAyMDE3XCIpLiAqL1xuICBfbW9udGhMYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB0aGUgZGF0ZXMgb2YgdGhlIG1vbnRoLiAqL1xuICBfd2Vla3M6IE1hdENhbGVuZGFyQ2VsbFtdW107XG5cbiAgLyoqIFRoZSBudW1iZXIgb2YgYmxhbmsgY2VsbHMgaW4gdGhlIGZpcnN0IHJvdyBiZWZvcmUgdGhlIDFzdCBvZiB0aGUgbW9udGguICovXG4gIF9maXJzdFdlZWtPZmZzZXQ6IG51bWJlcjtcblxuICAvKiogU3RhcnQgdmFsdWUgb2YgdGhlIGN1cnJlbnRseS1zaG93biBkYXRlIHJhbmdlLiAqL1xuICBfcmFuZ2VTdGFydDogbnVtYmVyIHwgbnVsbDtcblxuICAvKiogRW5kIHZhbHVlIG9mIHRoZSBjdXJyZW50bHktc2hvd24gZGF0ZSByYW5nZS4gKi9cbiAgX3JhbmdlRW5kOiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKiBTdGFydCB2YWx1ZSBvZiB0aGUgY3VycmVudGx5LXNob3duIGNvbXBhcmlzb24gZGF0ZSByYW5nZS4gKi9cbiAgX2NvbXBhcmlzb25SYW5nZVN0YXJ0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKiBFbmQgdmFsdWUgb2YgdGhlIGN1cnJlbnRseS1zaG93biBjb21wYXJpc29uIGRhdGUgcmFuZ2UuICovXG4gIF9jb21wYXJpc29uUmFuZ2VFbmQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqIFN0YXJ0IG9mIHRoZSBwcmV2aWV3IHJhbmdlLiAqL1xuICBfcHJldmlld1N0YXJ0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKiBFbmQgb2YgdGhlIHByZXZpZXcgcmFuZ2UuICovXG4gIF9wcmV2aWV3RW5kOiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBzZWxlY3RpbmcgYSByYW5nZSBvZiBkYXRlcy4gKi9cbiAgX2lzUmFuZ2U6IGJvb2xlYW47XG5cbiAgLyoqIFRoZSBkYXRlIG9mIHRoZSBtb250aCB0aGF0IHRvZGF5IGZhbGxzIG9uLiBOdWxsIGlmIHRvZGF5IGlzIGluIGFub3RoZXIgbW9udGguICovXG4gIF90b2RheURhdGU6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqIFRoZSBuYW1lcyBvZiB0aGUgd2Vla2RheXMuICovXG4gIF93ZWVrZGF5czoge2xvbmc6IHN0cmluZzsgbmFycm93OiBzdHJpbmc7IGlkOiBudW1iZXJ9W107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9EQVRFX0ZPUk1BVFMpIHByaXZhdGUgX2RhdGVGb3JtYXRzOiBNYXREYXRlRm9ybWF0cyxcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgX2RhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEPixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9kaXI/OiBEaXJlY3Rpb25hbGl0eSxcbiAgICBASW5qZWN0KE1BVF9EQVRFX1JBTkdFX1NFTEVDVElPTl9TVFJBVEVHWSlcbiAgICBAT3B0aW9uYWwoKVxuICAgIHByaXZhdGUgX3JhbmdlU3RyYXRlZ3k/OiBNYXREYXRlUmFuZ2VTZWxlY3Rpb25TdHJhdGVneTxEPixcbiAgKSB7XG4gICAgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkge1xuICAgICAgaWYgKCF0aGlzLl9kYXRlQWRhcHRlcikge1xuICAgICAgICB0aHJvdyBjcmVhdGVNaXNzaW5nRGF0ZUltcGxFcnJvcignRGF0ZUFkYXB0ZXInKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5fZGF0ZUZvcm1hdHMpIHtcbiAgICAgICAgdGhyb3cgY3JlYXRlTWlzc2luZ0RhdGVJbXBsRXJyb3IoJ01BVF9EQVRFX0ZPUk1BVFMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLl9yZXJlbmRlclN1YnNjcmlwdGlvbiA9IHRoaXMuX2RhdGVBZGFwdGVyLmxvY2FsZUNoYW5nZXNcbiAgICAgIC5waXBlKHN0YXJ0V2l0aChudWxsKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5faW5pdCgpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBjb25zdCBjb21wYXJpc29uQ2hhbmdlID0gY2hhbmdlc1snY29tcGFyaXNvblN0YXJ0J10gfHwgY2hhbmdlc1snY29tcGFyaXNvbkVuZCddO1xuXG4gICAgaWYgKGNvbXBhcmlzb25DaGFuZ2UgJiYgIWNvbXBhcmlzb25DaGFuZ2UuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuX3NldFJhbmdlcyh0aGlzLnNlbGVjdGVkKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snYWN0aXZlRHJhZyddICYmICF0aGlzLmFjdGl2ZURyYWcpIHtcbiAgICAgIHRoaXMuX2NsZWFyUHJldmlldygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3JlcmVuZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKiogSGFuZGxlcyB3aGVuIGEgbmV3IGRhdGUgaXMgc2VsZWN0ZWQuICovXG4gIF9kYXRlU2VsZWN0ZWQoZXZlbnQ6IE1hdENhbGVuZGFyVXNlckV2ZW50PG51bWJlcj4pIHtcbiAgICBjb25zdCBkYXRlID0gZXZlbnQudmFsdWU7XG4gICAgY29uc3Qgc2VsZWN0ZWREYXRlID0gdGhpcy5fZ2V0RGF0ZUZyb21EYXlPZk1vbnRoKGRhdGUpO1xuICAgIGxldCByYW5nZVN0YXJ0RGF0ZTogbnVtYmVyIHwgbnVsbDtcbiAgICBsZXQgcmFuZ2VFbmREYXRlOiBudW1iZXIgfCBudWxsO1xuXG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkIGluc3RhbmNlb2YgRGF0ZVJhbmdlKSB7XG4gICAgICByYW5nZVN0YXJ0RGF0ZSA9IHRoaXMuX2dldERhdGVJbkN1cnJlbnRNb250aCh0aGlzLl9zZWxlY3RlZC5zdGFydCk7XG4gICAgICByYW5nZUVuZERhdGUgPSB0aGlzLl9nZXREYXRlSW5DdXJyZW50TW9udGgodGhpcy5fc2VsZWN0ZWQuZW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2VTdGFydERhdGUgPSByYW5nZUVuZERhdGUgPSB0aGlzLl9nZXREYXRlSW5DdXJyZW50TW9udGgodGhpcy5fc2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIGlmIChyYW5nZVN0YXJ0RGF0ZSAhPT0gZGF0ZSB8fCByYW5nZUVuZERhdGUgIT09IGRhdGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdChzZWxlY3RlZERhdGUpO1xuICAgIH1cblxuICAgIHRoaXMuX3VzZXJTZWxlY3Rpb24uZW1pdCh7dmFsdWU6IHNlbGVjdGVkRGF0ZSwgZXZlbnQ6IGV2ZW50LmV2ZW50fSk7XG4gICAgdGhpcy5fY2xlYXJQcmV2aWV3KCk7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGluZGV4IG9mIGEgY2FsZW5kYXIgYm9keSBjZWxsIHdyYXBwZWQgaW4gYW4gZXZlbnQgYXMgYXJndW1lbnQuIEZvciB0aGUgZGF0ZSB0aGF0XG4gICAqIGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBjZWxsLCBzZXQgYGFjdGl2ZURhdGVgIHRvIHRoYXQgZGF0ZSBhbmQgZmlyZSBgYWN0aXZlRGF0ZUNoYW5nZWAgd2l0aFxuICAgKiB0aGF0IGRhdGUuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBtYXRjaCBlYWNoIGNvbXBvbmVudCdzIG1vZGVsIG9mIHRoZSBhY3RpdmUgZGF0ZSB3aXRoIHRoZSBjYWxlbmRhclxuICAgKiBib2R5IGNlbGwgdGhhdCB3YXMgZm9jdXNlZC4gSXQgdXBkYXRlcyBpdHMgdmFsdWUgb2YgYGFjdGl2ZURhdGVgIHN5bmNocm9ub3VzbHkgYW5kIHVwZGF0ZXMgdGhlXG4gICAqIHBhcmVudCdzIHZhbHVlIGFzeW5jaHJvbm91c2x5IHZpYSB0aGUgYGFjdGl2ZURhdGVDaGFuZ2VgIGV2ZW50LiBUaGUgY2hpbGQgY29tcG9uZW50IHJlY2VpdmVzIGFuXG4gICAqIHVwZGF0ZWQgdmFsdWUgYXN5bmNocm9ub3VzbHkgdmlhIHRoZSBgYWN0aXZlQ2VsbGAgSW5wdXQuXG4gICAqL1xuICBfdXBkYXRlQWN0aXZlRGF0ZShldmVudDogTWF0Q2FsZW5kYXJVc2VyRXZlbnQ8bnVtYmVyPikge1xuICAgIGNvbnN0IG1vbnRoID0gZXZlbnQudmFsdWU7XG4gICAgY29uc3Qgb2xkQWN0aXZlRGF0ZSA9IHRoaXMuX2FjdGl2ZURhdGU7XG4gICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5fZ2V0RGF0ZUZyb21EYXlPZk1vbnRoKG1vbnRoKTtcblxuICAgIGlmICh0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShvbGRBY3RpdmVEYXRlLCB0aGlzLmFjdGl2ZURhdGUpKSB7XG4gICAgICB0aGlzLmFjdGl2ZURhdGVDaGFuZ2UuZW1pdCh0aGlzLl9hY3RpdmVEYXRlKTtcbiAgICB9XG4gIH1cblxuICAvKiogSGFuZGxlcyBrZXlkb3duIGV2ZW50cyBvbiB0aGUgY2FsZW5kYXIgYm9keSB3aGVuIGNhbGVuZGFyIGlzIGluIG1vbnRoIHZpZXcuICovXG4gIF9oYW5kbGVDYWxlbmRhckJvZHlLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgLy8gVE9ETyhtbWFsZXJiYSk6IFdlIGN1cnJlbnRseSBhbGxvdyBrZXlib2FyZCBuYXZpZ2F0aW9uIHRvIGRpc2FibGVkIGRhdGVzLCBidXQganVzdCBwcmV2ZW50XG4gICAgLy8gZGlzYWJsZWQgb25lcyBmcm9tIGJlaW5nIHNlbGVjdGVkLiBUaGlzIG1heSBub3QgYmUgaWRlYWwsIHdlIHNob3VsZCBsb29rIGludG8gd2hldGhlclxuICAgIC8vIG5hdmlnYXRpb24gc2hvdWxkIHNraXAgb3ZlciBkaXNhYmxlZCBkYXRlcywgYW5kIGlmIHNvLCBob3cgdG8gaW1wbGVtZW50IHRoYXQgZWZmaWNpZW50bHkuXG5cbiAgICBjb25zdCBvbGRBY3RpdmVEYXRlID0gdGhpcy5fYWN0aXZlRGF0ZTtcbiAgICBjb25zdCBpc1J0bCA9IHRoaXMuX2lzUnRsKCk7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgIGNhc2UgTEVGVF9BUlJPVzpcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKHRoaXMuX2FjdGl2ZURhdGUsIGlzUnRsID8gMSA6IC0xKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJJR0hUX0FSUk9XOlxuICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXModGhpcy5fYWN0aXZlRGF0ZSwgaXNSdGwgPyAtMSA6IDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVVBfQVJST1c6XG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyh0aGlzLl9hY3RpdmVEYXRlLCAtNyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBET1dOX0FSUk9XOlxuICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXModGhpcy5fYWN0aXZlRGF0ZSwgNyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBIT01FOlxuICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoXG4gICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSxcbiAgICAgICAgICAxIC0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVORDpcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKFxuICAgICAgICAgIHRoaXMuX2FjdGl2ZURhdGUsXG4gICAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgodGhpcy5fYWN0aXZlRGF0ZSkgLVxuICAgICAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBBR0VfVVA6XG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IGV2ZW50LmFsdEtleVxuICAgICAgICAgID8gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLCAtMSlcbiAgICAgICAgICA6IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsIC0xKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBBR0VfRE9XTjpcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gZXZlbnQuYWx0S2V5XG4gICAgICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuX2FjdGl2ZURhdGUsIDEpXG4gICAgICAgICAgOiB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLCAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVOVEVSOlxuICAgICAgY2FzZSBTUEFDRTpcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uS2V5UHJlc3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NhblNlbGVjdCh0aGlzLl9hY3RpdmVEYXRlKSkge1xuICAgICAgICAgIC8vIFByZXZlbnQgdW5leHBlY3RlZCBkZWZhdWx0IGFjdGlvbnMgc3VjaCBhcyBmb3JtIHN1Ym1pc3Npb24uXG4gICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIG9ubHkgcHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24gaGVyZSB3aGlsZSB0aGUgc2VsZWN0aW9uIGhhcHBlbnMgaW5cbiAgICAgICAgICAvLyBga2V5dXBgIGJlbG93LiBXZSBjYW4ndCBkbyB0aGUgc2VsZWN0aW9uIGhlcmUsIGJlY2F1c2UgaXQgY2FuIGNhdXNlIHRoZSBjYWxlbmRhciB0b1xuICAgICAgICAgIC8vIHJlb3BlbiBpZiBmb2N1cyBpcyByZXN0b3JlZCBpbW1lZGlhdGVseS4gV2UgYWxzbyBjYW4ndCBjYWxsIGBwcmV2ZW50RGVmYXVsdGAgb24gYGtleXVwYFxuICAgICAgICAgIC8vIGJlY2F1c2UgaXQncyB0b28gbGF0ZSAoc2VlICMyMzMwNSkuXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIEVTQ0FQRTpcbiAgICAgICAgLy8gQWJvcnQgdGhlIGN1cnJlbnQgcmFuZ2Ugc2VsZWN0aW9uIGlmIHRoZSB1c2VyIHByZXNzZXMgZXNjYXBlIG1pZC1zZWxlY3Rpb24uXG4gICAgICAgIGlmICh0aGlzLl9wcmV2aWV3RW5kICE9IG51bGwgJiYgIWhhc01vZGlmaWVyS2V5KGV2ZW50KSkge1xuICAgICAgICAgIHRoaXMuX2NsZWFyUHJldmlldygpO1xuICAgICAgICAgIC8vIElmIGEgZHJhZyBpcyBpbiBwcm9ncmVzcywgY2FuY2VsIHRoZSBkcmFnIHdpdGhvdXQgY2hhbmdpbmcgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBzZWxlY3Rpb24uXG4gICAgICAgICAgaWYgKHRoaXMuYWN0aXZlRHJhZykge1xuICAgICAgICAgICAgdGhpcy5kcmFnRW5kZWQuZW1pdCh7dmFsdWU6IG51bGwsIGV2ZW50fSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdChudWxsKTtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJTZWxlY3Rpb24uZW1pdCh7dmFsdWU6IG51bGwsIGV2ZW50fSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIFByZXZlbnRzIHRoZSBvdmVybGF5IGZyb20gY2xvc2luZy5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBEb24ndCBwcmV2ZW50IGRlZmF1bHQgb3IgZm9jdXMgYWN0aXZlIGNlbGwgb24ga2V5cyB0aGF0IHdlIGRvbid0IGV4cGxpY2l0bHkgaGFuZGxlLlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKG9sZEFjdGl2ZURhdGUsIHRoaXMuYWN0aXZlRGF0ZSkpIHtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuYWN0aXZlRGF0ZSk7XG5cbiAgICAgIHRoaXMuX2ZvY3VzQWN0aXZlQ2VsbEFmdGVyVmlld0NoZWNrZWQoKTtcbiAgICB9XG5cbiAgICAvLyBQcmV2ZW50IHVuZXhwZWN0ZWQgZGVmYXVsdCBhY3Rpb25zIHN1Y2ggYXMgZm9ybSBzdWJtaXNzaW9uLlxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvKiogSGFuZGxlcyBrZXl1cCBldmVudHMgb24gdGhlIGNhbGVuZGFyIGJvZHkgd2hlbiBjYWxlbmRhciBpcyBpbiBtb250aCB2aWV3LiAqL1xuICBfaGFuZGxlQ2FsZW5kYXJCb2R5S2V5dXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gU1BBQ0UgfHwgZXZlbnQua2V5Q29kZSA9PT0gRU5URVIpIHtcbiAgICAgIGlmICh0aGlzLl9zZWxlY3Rpb25LZXlQcmVzc2VkICYmIHRoaXMuX2NhblNlbGVjdCh0aGlzLl9hY3RpdmVEYXRlKSkge1xuICAgICAgICB0aGlzLl9kYXRlU2VsZWN0ZWQoe3ZhbHVlOiB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpLCBldmVudH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZWxlY3Rpb25LZXlQcmVzc2VkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIEluaXRpYWxpemVzIHRoaXMgbW9udGggdmlldy4gKi9cbiAgX2luaXQoKSB7XG4gICAgdGhpcy5fc2V0UmFuZ2VzKHRoaXMuc2VsZWN0ZWQpO1xuICAgIHRoaXMuX3RvZGF5RGF0ZSA9IHRoaXMuX2dldENlbGxDb21wYXJlVmFsdWUodGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKSk7XG4gICAgdGhpcy5fbW9udGhMYWJlbCA9IHRoaXMuX2RhdGVGb3JtYXRzLmRpc3BsYXkubW9udGhMYWJlbFxuICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5mb3JtYXQodGhpcy5hY3RpdmVEYXRlLCB0aGlzLl9kYXRlRm9ybWF0cy5kaXNwbGF5Lm1vbnRoTGFiZWwpXG4gICAgICA6IHRoaXMuX2RhdGVBZGFwdGVyXG4gICAgICAgICAgLmdldE1vbnRoTmFtZXMoJ3Nob3J0JylcbiAgICAgICAgICBbdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5hY3RpdmVEYXRlKV0udG9Mb2NhbGVVcHBlckNhc2UoKTtcblxuICAgIGxldCBmaXJzdE9mTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLmFjdGl2ZURhdGUpLFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5hY3RpdmVEYXRlKSxcbiAgICAgIDEsXG4gICAgKTtcbiAgICB0aGlzLl9maXJzdFdlZWtPZmZzZXQgPVxuICAgICAgKERBWVNfUEVSX1dFRUsgK1xuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXlPZldlZWsoZmlyc3RPZk1vbnRoKSAtXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldEZpcnN0RGF5T2ZXZWVrKCkpICVcbiAgICAgIERBWVNfUEVSX1dFRUs7XG5cbiAgICB0aGlzLl9pbml0V2Vla2RheXMoKTtcbiAgICB0aGlzLl9jcmVhdGVXZWVrQ2VsbHMoKTtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBGb2N1c2VzIHRoZSBhY3RpdmUgY2VsbCBhZnRlciB0aGUgbWljcm90YXNrIHF1ZXVlIGlzIGVtcHR5LiAqL1xuICBfZm9jdXNBY3RpdmVDZWxsKG1vdmVQcmV2aWV3PzogYm9vbGVhbikge1xuICAgIHRoaXMuX21hdENhbGVuZGFyQm9keS5fZm9jdXNBY3RpdmVDZWxsKG1vdmVQcmV2aWV3KTtcbiAgfVxuXG4gIC8qKiBGb2N1c2VzIHRoZSBhY3RpdmUgY2VsbCBhZnRlciBjaGFuZ2UgZGV0ZWN0aW9uIGhhcyBydW4gYW5kIHRoZSBtaWNyb3Rhc2sgcXVldWUgaXMgZW1wdHkuICovXG4gIF9mb2N1c0FjdGl2ZUNlbGxBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIHRoaXMuX21hdENhbGVuZGFyQm9keS5fc2NoZWR1bGVGb2N1c0FjdGl2ZUNlbGxBZnRlclZpZXdDaGVja2VkKCk7XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgaGFzIGFjdGl2YXRlZCBhIG5ldyBjZWxsIGFuZCB0aGUgcHJldmlldyBuZWVkcyB0byBiZSB1cGRhdGVkLiAqL1xuICBfcHJldmlld0NoYW5nZWQoe2V2ZW50LCB2YWx1ZTogY2VsbH06IE1hdENhbGVuZGFyVXNlckV2ZW50PE1hdENhbGVuZGFyQ2VsbDxEPiB8IG51bGw+KSB7XG4gICAgaWYgKHRoaXMuX3JhbmdlU3RyYXRlZ3kpIHtcbiAgICAgIC8vIFdlIGNhbiBhc3N1bWUgdGhhdCB0aGlzIHdpbGwgYmUgYSByYW5nZSwgYmVjYXVzZSBwcmV2aWV3XG4gICAgICAvLyBldmVudHMgYXJlbid0IGZpcmVkIGZvciBzaW5nbGUgZGF0ZSBzZWxlY3Rpb25zLlxuICAgICAgY29uc3QgdmFsdWUgPSBjZWxsID8gY2VsbC5yYXdWYWx1ZSEgOiBudWxsO1xuICAgICAgY29uc3QgcHJldmlld1JhbmdlID0gdGhpcy5fcmFuZ2VTdHJhdGVneS5jcmVhdGVQcmV2aWV3KFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdGhpcy5zZWxlY3RlZCBhcyBEYXRlUmFuZ2U8RD4sXG4gICAgICAgIGV2ZW50LFxuICAgICAgKTtcbiAgICAgIHRoaXMuX3ByZXZpZXdTdGFydCA9IHRoaXMuX2dldENlbGxDb21wYXJlVmFsdWUocHJldmlld1JhbmdlLnN0YXJ0KTtcbiAgICAgIHRoaXMuX3ByZXZpZXdFbmQgPSB0aGlzLl9nZXRDZWxsQ29tcGFyZVZhbHVlKHByZXZpZXdSYW5nZS5lbmQpO1xuXG4gICAgICBpZiAodGhpcy5hY3RpdmVEcmFnICYmIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRyYWdSYW5nZSA9IHRoaXMuX3JhbmdlU3RyYXRlZ3kuY3JlYXRlRHJhZz8uKFxuICAgICAgICAgIHRoaXMuYWN0aXZlRHJhZy52YWx1ZSxcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkIGFzIERhdGVSYW5nZTxEPixcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZHJhZ1JhbmdlKSB7XG4gICAgICAgICAgdGhpcy5fcHJldmlld1N0YXJ0ID0gdGhpcy5fZ2V0Q2VsbENvbXBhcmVWYWx1ZShkcmFnUmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgIHRoaXMuX3ByZXZpZXdFbmQgPSB0aGlzLl9nZXRDZWxsQ29tcGFyZVZhbHVlKGRyYWdSYW5nZS5lbmQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdGUgdGhhdCBoZXJlIHdlIG5lZWQgdG8gdXNlIGBkZXRlY3RDaGFuZ2VzYCwgcmF0aGVyIHRoYW4gYG1hcmtGb3JDaGVja2AsIGJlY2F1c2VcbiAgICAgIC8vIHRoZSB3YXkgYF9mb2N1c0FjdGl2ZUNlbGxgIGlzIHNldCB1cCBhdCB0aGUgbW9tZW50IG1ha2VzIGl0IGZpcmUgYXQgdGhlIHdyb25nIHRpbWVcbiAgICAgIC8vIHdoZW4gbmF2aWdhdGluZyBvbmUgbW9udGggYmFjayB1c2luZyB0aGUga2V5Ym9hcmQgd2hpY2ggd2lsbCBjYXVzZSB0aGlzIGhhbmRsZXJcbiAgICAgIC8vIHRvIHRocm93IGEgXCJjaGFuZ2VkIGFmdGVyIGNoZWNrZWRcIiBlcnJvciB3aGVuIHVwZGF0aW5nIHRoZSBwcmV2aWV3IHN0YXRlLlxuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBoYXMgZW5kZWQgYSBkcmFnLiBJZiB0aGUgZHJhZy9kcm9wIHdhcyBzdWNjZXNzZnVsLFxuICAgKiBjb21wdXRlcyBhbmQgZW1pdHMgdGhlIG5ldyByYW5nZSBzZWxlY3Rpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgX2RyYWdFbmRlZChldmVudDogTWF0Q2FsZW5kYXJVc2VyRXZlbnQ8RCB8IG51bGw+KSB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZURyYWcpIHJldHVybjtcblxuICAgIGlmIChldmVudC52YWx1ZSkge1xuICAgICAgLy8gUHJvcGFnYXRlIGRyYWcgZWZmZWN0XG4gICAgICBjb25zdCBkcmFnRHJvcFJlc3VsdCA9IHRoaXMuX3JhbmdlU3RyYXRlZ3k/LmNyZWF0ZURyYWc/LihcbiAgICAgICAgdGhpcy5hY3RpdmVEcmFnLnZhbHVlLFxuICAgICAgICB0aGlzLnNlbGVjdGVkIGFzIERhdGVSYW5nZTxEPixcbiAgICAgICAgZXZlbnQudmFsdWUsXG4gICAgICAgIGV2ZW50LmV2ZW50LFxuICAgICAgKTtcblxuICAgICAgdGhpcy5kcmFnRW5kZWQuZW1pdCh7dmFsdWU6IGRyYWdEcm9wUmVzdWx0ID8/IG51bGwsIGV2ZW50OiBldmVudC5ldmVudH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyYWdFbmRlZC5lbWl0KHt2YWx1ZTogbnVsbCwgZXZlbnQ6IGV2ZW50LmV2ZW50fSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgZGF5IG9mIHRoZSBtb250aCBhbmQgcmV0dXJucyBhIG5ldyBkYXRlIGluIHRoZSBzYW1lIG1vbnRoIGFuZCB5ZWFyIGFzIHRoZSBjdXJyZW50bHlcbiAgICogIGFjdGl2ZSBkYXRlLiBUaGUgcmV0dXJuZWQgZGF0ZSB3aWxsIGhhdmUgdGhlIHNhbWUgZGF5IG9mIHRoZSBtb250aCBhcyB0aGUgYXJndW1lbnQgZGF0ZS5cbiAgICovXG4gIHByaXZhdGUgX2dldERhdGVGcm9tRGF5T2ZNb250aChkYXlPZk1vbnRoOiBudW1iZXIpOiBEIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5hY3RpdmVEYXRlKSxcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuYWN0aXZlRGF0ZSksXG4gICAgICBkYXlPZk1vbnRoLFxuICAgICk7XG4gIH1cblxuICAvKiogSW5pdGlhbGl6ZXMgdGhlIHdlZWtkYXlzLiAqL1xuICBwcml2YXRlIF9pbml0V2Vla2RheXMoKSB7XG4gICAgY29uc3QgZmlyc3REYXlPZldlZWsgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRGaXJzdERheU9mV2VlaygpO1xuICAgIGNvbnN0IG5hcnJvd1dlZWtkYXlzID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrTmFtZXMoJ25hcnJvdycpO1xuICAgIGNvbnN0IGxvbmdXZWVrZGF5cyA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERheU9mV2Vla05hbWVzKCdsb25nJyk7XG5cbiAgICAvLyBSb3RhdGUgdGhlIGxhYmVscyBmb3IgZGF5cyBvZiB0aGUgd2VlayBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgbGV0IHdlZWtkYXlzID0gbG9uZ1dlZWtkYXlzLm1hcCgobG9uZywgaSkgPT4ge1xuICAgICAgcmV0dXJuIHtsb25nLCBuYXJyb3c6IG5hcnJvd1dlZWtkYXlzW2ldLCBpZDogdW5pcXVlSWRDb3VudGVyKyt9O1xuICAgIH0pO1xuICAgIHRoaXMuX3dlZWtkYXlzID0gd2Vla2RheXMuc2xpY2UoZmlyc3REYXlPZldlZWspLmNvbmNhdCh3ZWVrZGF5cy5zbGljZSgwLCBmaXJzdERheU9mV2VlaykpO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgTWF0Q2FsZW5kYXJDZWxscyBmb3IgdGhlIGRhdGVzIGluIHRoaXMgbW9udGguICovXG4gIHByaXZhdGUgX2NyZWF0ZVdlZWtDZWxscygpIHtcbiAgICBjb25zdCBkYXlzSW5Nb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKHRoaXMuYWN0aXZlRGF0ZSk7XG4gICAgY29uc3QgZGF0ZU5hbWVzID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZU5hbWVzKCk7XG4gICAgdGhpcy5fd2Vla3MgPSBbW11dO1xuICAgIGZvciAobGV0IGkgPSAwLCBjZWxsID0gdGhpcy5fZmlyc3RXZWVrT2Zmc2V0OyBpIDwgZGF5c0luTW9udGg7IGkrKywgY2VsbCsrKSB7XG4gICAgICBpZiAoY2VsbCA9PSBEQVlTX1BFUl9XRUVLKSB7XG4gICAgICAgIHRoaXMuX3dlZWtzLnB1c2goW10pO1xuICAgICAgICBjZWxsID0gMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuYWN0aXZlRGF0ZSksXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuYWN0aXZlRGF0ZSksXG4gICAgICAgIGkgKyAxLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGVuYWJsZWQgPSB0aGlzLl9zaG91bGRFbmFibGVEYXRlKGRhdGUpO1xuICAgICAgY29uc3QgYXJpYUxhYmVsID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZm9ybWF0KGRhdGUsIHRoaXMuX2RhdGVGb3JtYXRzLmRpc3BsYXkuZGF0ZUExMXlMYWJlbCk7XG4gICAgICBjb25zdCBjZWxsQ2xhc3NlcyA9IHRoaXMuZGF0ZUNsYXNzID8gdGhpcy5kYXRlQ2xhc3MoZGF0ZSwgJ21vbnRoJykgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMuX3dlZWtzW3RoaXMuX3dlZWtzLmxlbmd0aCAtIDFdLnB1c2goXG4gICAgICAgIG5ldyBNYXRDYWxlbmRhckNlbGw8RD4oXG4gICAgICAgICAgaSArIDEsXG4gICAgICAgICAgZGF0ZU5hbWVzW2ldLFxuICAgICAgICAgIGFyaWFMYWJlbCxcbiAgICAgICAgICBlbmFibGVkLFxuICAgICAgICAgIGNlbGxDbGFzc2VzLFxuICAgICAgICAgIHRoaXMuX2dldENlbGxDb21wYXJlVmFsdWUoZGF0ZSkhLFxuICAgICAgICAgIGRhdGUsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEYXRlIGZpbHRlciBmb3IgdGhlIG1vbnRoICovXG4gIHByaXZhdGUgX3Nob3VsZEVuYWJsZURhdGUoZGF0ZTogRCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhIWRhdGUgJiZcbiAgICAgICghdGhpcy5taW5EYXRlIHx8IHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKGRhdGUsIHRoaXMubWluRGF0ZSkgPj0gMCkgJiZcbiAgICAgICghdGhpcy5tYXhEYXRlIHx8IHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKGRhdGUsIHRoaXMubWF4RGF0ZSkgPD0gMCkgJiZcbiAgICAgICghdGhpcy5kYXRlRmlsdGVyIHx8IHRoaXMuZGF0ZUZpbHRlcihkYXRlKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGRhdGUgaW4gdGhpcyBtb250aCB0aGF0IHRoZSBnaXZlbiBEYXRlIGZhbGxzIG9uLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGdpdmVuIERhdGUgaXMgaW4gYW5vdGhlciBtb250aC5cbiAgICovXG4gIHByaXZhdGUgX2dldERhdGVJbkN1cnJlbnRNb250aChkYXRlOiBEIHwgbnVsbCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiBkYXRlICYmIHRoaXMuX2hhc1NhbWVNb250aEFuZFllYXIoZGF0ZSwgdGhpcy5hY3RpdmVEYXRlKVxuICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKGRhdGUpXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIDIgZGF0ZXMgYXJlIG5vbi1udWxsIGFuZCBmYWxsIHdpdGhpbiB0aGUgc2FtZSBtb250aCBvZiB0aGUgc2FtZSB5ZWFyLiAqL1xuICBwcml2YXRlIF9oYXNTYW1lTW9udGhBbmRZZWFyKGQxOiBEIHwgbnVsbCwgZDI6IEQgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgZDEgJiZcbiAgICAgIGQyICYmXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChkMSkgPT0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZDIpICYmXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGQxKSA9PSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGQyKVxuICAgICk7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gb25lIGNlbGwgdG8gYW5vdGhlci4gKi9cbiAgcHJpdmF0ZSBfZ2V0Q2VsbENvbXBhcmVWYWx1ZShkYXRlOiBEIHwgbnVsbCk6IG51bWJlciB8IG51bGwge1xuICAgIGlmIChkYXRlKSB7XG4gICAgICAvLyBXZSB1c2UgdGhlIHRpbWUgc2luY2UgdGhlIFVuaXggZXBvY2ggdG8gY29tcGFyZSBkYXRlcyBpbiB0aGlzIHZpZXcsIHJhdGhlciB0aGFuIHRoZVxuICAgICAgLy8gY2VsbCB2YWx1ZXMsIGJlY2F1c2Ugd2UgbmVlZCB0byBzdXBwb3J0IHJhbmdlcyB0aGF0IHNwYW4gYWNyb3NzIG11bHRpcGxlIG1vbnRocy95ZWFycy5cbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpO1xuICAgICAgY29uc3QgbW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKTtcbiAgICAgIGNvbnN0IGRheSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUoZGF0ZSk7XG4gICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSkuZ2V0VGltZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIERldGVybWluZXMgd2hldGhlciB0aGUgdXNlciBoYXMgdGhlIFJUTCBsYXlvdXQgZGlyZWN0aW9uLiAqL1xuICBwcml2YXRlIF9pc1J0bCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyICYmIHRoaXMuX2Rpci52YWx1ZSA9PT0gJ3J0bCc7XG4gIH1cblxuICAvKiogU2V0cyB0aGUgY3VycmVudCByYW5nZSBiYXNlZCBvbiBhIG1vZGVsIHZhbHVlLiAqL1xuICBwcml2YXRlIF9zZXRSYW5nZXMoc2VsZWN0ZWRWYWx1ZTogRGF0ZVJhbmdlPEQ+IHwgRCB8IG51bGwpIHtcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIERhdGVSYW5nZSkge1xuICAgICAgdGhpcy5fcmFuZ2VTdGFydCA9IHRoaXMuX2dldENlbGxDb21wYXJlVmFsdWUoc2VsZWN0ZWRWYWx1ZS5zdGFydCk7XG4gICAgICB0aGlzLl9yYW5nZUVuZCA9IHRoaXMuX2dldENlbGxDb21wYXJlVmFsdWUoc2VsZWN0ZWRWYWx1ZS5lbmQpO1xuICAgICAgdGhpcy5faXNSYW5nZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JhbmdlU3RhcnQgPSB0aGlzLl9yYW5nZUVuZCA9IHRoaXMuX2dldENlbGxDb21wYXJlVmFsdWUoc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICB0aGlzLl9pc1JhbmdlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5fY29tcGFyaXNvblJhbmdlU3RhcnQgPSB0aGlzLl9nZXRDZWxsQ29tcGFyZVZhbHVlKHRoaXMuY29tcGFyaXNvblN0YXJ0KTtcbiAgICB0aGlzLl9jb21wYXJpc29uUmFuZ2VFbmQgPSB0aGlzLl9nZXRDZWxsQ29tcGFyZVZhbHVlKHRoaXMuY29tcGFyaXNvbkVuZCk7XG4gIH1cblxuICAvKiogR2V0cyB3aGV0aGVyIGEgZGF0ZSBjYW4gYmUgc2VsZWN0ZWQgaW4gdGhlIG1vbnRoIHZpZXcuICovXG4gIHByaXZhdGUgX2NhblNlbGVjdChkYXRlOiBEKSB7XG4gICAgcmV0dXJuICF0aGlzLmRhdGVGaWx0ZXIgfHwgdGhpcy5kYXRlRmlsdGVyKGRhdGUpO1xuICB9XG5cbiAgLyoqIENsZWFycyBvdXQgcHJldmlldyBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSBfY2xlYXJQcmV2aWV3KCkge1xuICAgIHRoaXMuX3ByZXZpZXdTdGFydCA9IHRoaXMuX3ByZXZpZXdFbmQgPSBudWxsO1xuICB9XG59XG4iLCI8dGFibGUgY2xhc3M9XCJtYXQtY2FsZW5kYXItdGFibGVcIiByb2xlPVwiZ3JpZFwiPlxuICA8dGhlYWQgY2xhc3M9XCJtYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyXCI+XG4gICAgPHRyPlxuICAgICAgQGZvciAoZGF5IG9mIF93ZWVrZGF5czsgdHJhY2sgZGF5LmlkKSB7XG4gICAgICAgIDx0aCBzY29wZT1cImNvbFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2RrLXZpc3VhbGx5LWhpZGRlblwiPnt7ZGF5Lmxvbmd9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj57e2RheS5uYXJyb3d9fTwvc3Bhbj5cbiAgICAgICAgPC90aD5cbiAgICAgIH1cbiAgICA8L3RyPlxuICAgIDx0ciBhcmlhLWhpZGRlbj1cInRydWVcIj48dGggY2xhc3M9XCJtYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXJcIiBjb2xzcGFuPVwiN1wiPjwvdGg+PC90cj5cbiAgPC90aGVhZD5cbiAgPHRib2R5IG1hdC1jYWxlbmRhci1ib2R5XG4gICAgICAgICBbbGFiZWxdPVwiX21vbnRoTGFiZWxcIlxuICAgICAgICAgW3Jvd3NdPVwiX3dlZWtzXCJcbiAgICAgICAgIFt0b2RheVZhbHVlXT1cIl90b2RheURhdGUhXCJcbiAgICAgICAgIFtzdGFydFZhbHVlXT1cIl9yYW5nZVN0YXJ0IVwiXG4gICAgICAgICBbZW5kVmFsdWVdPVwiX3JhbmdlRW5kIVwiXG4gICAgICAgICBbY29tcGFyaXNvblN0YXJ0XT1cIl9jb21wYXJpc29uUmFuZ2VTdGFydFwiXG4gICAgICAgICBbY29tcGFyaXNvbkVuZF09XCJfY29tcGFyaXNvblJhbmdlRW5kXCJcbiAgICAgICAgIFtwcmV2aWV3U3RhcnRdPVwiX3ByZXZpZXdTdGFydFwiXG4gICAgICAgICBbcHJldmlld0VuZF09XCJfcHJldmlld0VuZFwiXG4gICAgICAgICBbaXNSYW5nZV09XCJfaXNSYW5nZVwiXG4gICAgICAgICBbbGFiZWxNaW5SZXF1aXJlZENlbGxzXT1cIjNcIlxuICAgICAgICAgW2FjdGl2ZUNlbGxdPVwiX2RhdGVBZGFwdGVyLmdldERhdGUoYWN0aXZlRGF0ZSkgLSAxXCJcbiAgICAgICAgIFtzdGFydERhdGVBY2Nlc3NpYmxlTmFtZV09XCJzdGFydERhdGVBY2Nlc3NpYmxlTmFtZVwiXG4gICAgICAgICBbZW5kRGF0ZUFjY2Vzc2libGVOYW1lXT1cImVuZERhdGVBY2Nlc3NpYmxlTmFtZVwiXG4gICAgICAgICAoc2VsZWN0ZWRWYWx1ZUNoYW5nZSk9XCJfZGF0ZVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgKGFjdGl2ZURhdGVDaGFuZ2UpPVwiX3VwZGF0ZUFjdGl2ZURhdGUoJGV2ZW50KVwiXG4gICAgICAgICAocHJldmlld0NoYW5nZSk9XCJfcHJldmlld0NoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAoZHJhZ1N0YXJ0ZWQpPVwiZHJhZ1N0YXJ0ZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgIChkcmFnRW5kZWQpPVwiX2RyYWdFbmRlZCgkZXZlbnQpXCJcbiAgICAgICAgIChrZXl1cCk9XCJfaGFuZGxlQ2FsZW5kYXJCb2R5S2V5dXAoJGV2ZW50KVwiXG4gICAgICAgICAoa2V5ZG93bik9XCJfaGFuZGxlQ2FsZW5kYXJCb2R5S2V5ZG93bigkZXZlbnQpXCI+XG4gIDwvdGJvZHk+XG48L3RhYmxlPlxuIl19