@angular/cdk-experimental 13.0.0-next.7 → 13.0.0-rc.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 (329) hide show
  1. package/column-resize/column-resize-directives/column-resize-flex.d.ts +3 -0
  2. package/column-resize/column-resize-directives/column-resize.d.ts +3 -0
  3. package/column-resize/column-resize-directives/default-enabled-column-resize-flex.d.ts +3 -0
  4. package/column-resize/column-resize-directives/default-enabled-column-resize.d.ts +3 -0
  5. package/column-resize/column-resize-module.d.ts +11 -7
  6. package/column-resize/column-resize-notifier.d.ts +5 -7
  7. package/column-resize/column-resize.d.ts +3 -0
  8. package/column-resize/column-resize_public_index.d.ts +4 -0
  9. package/column-resize/column-size-store.d.ts +3 -7
  10. package/column-resize/event-dispatcher.d.ts +3 -0
  11. package/column-resize/index.d.ts +5 -2
  12. package/column-resize/overlay-handle.d.ts +3 -0
  13. package/column-resize/package.json +6 -6
  14. package/column-resize/resizable.d.ts +3 -0
  15. package/column-resize/resize-strategy.d.ts +7 -0
  16. package/combobox/combobox-module.d.ts +8 -7
  17. package/combobox/combobox-panel.d.ts +5 -2
  18. package/combobox/combobox-popup.d.ts +3 -0
  19. package/combobox/combobox.d.ts +8 -5
  20. package/combobox/combobox_public_index.d.ts +4 -0
  21. package/combobox/index.d.ts +5 -1
  22. package/combobox/package.json +6 -6
  23. package/dialog/dialog-container.d.ts +4 -1
  24. package/dialog/dialog-module.d.ts +8 -7
  25. package/dialog/dialog.d.ts +3 -0
  26. package/dialog/dialog_public_index.d.ts +4 -0
  27. package/dialog/index.d.ts +5 -1
  28. package/dialog/package.json +6 -6
  29. package/esm2020/column-resize/column-resize-directives/column-resize-flex.mjs +42 -0
  30. package/esm2020/column-resize/column-resize-directives/column-resize.mjs +42 -0
  31. package/{esm2015/column-resize/column-resize-directives/constants.js → esm2020/column-resize/column-resize-directives/constants.mjs} +0 -0
  32. package/esm2020/column-resize/column-resize-directives/default-enabled-column-resize-flex.mjs +48 -0
  33. package/esm2020/column-resize/column-resize-directives/default-enabled-column-resize.mjs +48 -0
  34. package/esm2020/column-resize/column-resize-module.mjs +46 -0
  35. package/esm2020/column-resize/column-resize-notifier.mjs +52 -0
  36. package/esm2020/column-resize/column-resize.mjs +82 -0
  37. package/esm2020/column-resize/column-resize_public_index.mjs +5 -0
  38. package/esm2020/column-resize/column-size-store.mjs +20 -0
  39. package/esm2020/column-resize/event-dispatcher.mjs +70 -0
  40. package/esm2020/column-resize/index.mjs +9 -0
  41. package/esm2020/column-resize/overlay-handle.mjs +146 -0
  42. package/{esm2015/column-resize/public-api.js → esm2020/column-resize/public-api.mjs} +0 -0
  43. package/esm2020/column-resize/resizable.mjs +195 -0
  44. package/{esm2015/column-resize/resize-ref.js → esm2020/column-resize/resize-ref.mjs} +1 -1
  45. package/esm2020/column-resize/resize-strategy.mjs +230 -0
  46. package/{esm2015/column-resize/selectors.js → esm2020/column-resize/selectors.mjs} +0 -0
  47. package/esm2020/combobox/combobox-module.mjs +28 -0
  48. package/esm2020/combobox/combobox-panel.mjs +48 -0
  49. package/esm2020/combobox/combobox-popup.mjs +83 -0
  50. package/esm2020/combobox/combobox.mjs +261 -0
  51. package/esm2020/combobox/combobox_public_index.mjs +5 -0
  52. package/esm2020/combobox/index.mjs +9 -0
  53. package/{esm2015/combobox/public-api.js → esm2020/combobox/public-api.mjs} +0 -0
  54. package/{esm2015/dialog/dialog-config.js → esm2020/dialog/dialog-config.mjs} +0 -0
  55. package/esm2020/dialog/dialog-container.mjs +310 -0
  56. package/esm2020/dialog/dialog-injectors.mjs +30 -0
  57. package/esm2020/dialog/dialog-module.mjs +57 -0
  58. package/esm2020/dialog/dialog-ref.mjs +116 -0
  59. package/esm2020/dialog/dialog.mjs +252 -0
  60. package/esm2020/dialog/dialog_public_index.mjs +5 -0
  61. package/esm2020/dialog/index.mjs +9 -0
  62. package/{esm2015/dialog/public-api.js → esm2020/dialog/public-api.mjs} +0 -0
  63. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  64. package/esm2020/listbox/index.mjs +9 -0
  65. package/esm2020/listbox/listbox-module.mjs +24 -0
  66. package/esm2020/listbox/listbox.mjs +499 -0
  67. package/esm2020/listbox/listbox_public_index.mjs +5 -0
  68. package/{esm2015/listbox/public-api.js → esm2020/listbox/public-api.mjs} +0 -0
  69. package/esm2020/menu/context-menu.mjs +287 -0
  70. package/esm2020/menu/index.mjs +9 -0
  71. package/esm2020/menu/menu-aim.mjs +199 -0
  72. package/esm2020/menu/menu-bar.mjs +272 -0
  73. package/{esm2015/menu/menu-errors.js → esm2020/menu/menu-errors.mjs} +1 -1
  74. package/esm2020/menu/menu-group.mjs +68 -0
  75. package/{esm2015/menu/menu-interface.js → esm2020/menu/menu-interface.mjs} +0 -0
  76. package/esm2020/menu/menu-item-checkbox.mjs +48 -0
  77. package/esm2020/menu/menu-item-radio.mjs +90 -0
  78. package/esm2020/menu/menu-item-selectable.mjs +57 -0
  79. package/esm2020/menu/menu-item-trigger.mjs +361 -0
  80. package/esm2020/menu/menu-item.mjs +291 -0
  81. package/esm2020/menu/menu-module.mjs +64 -0
  82. package/esm2020/menu/menu-panel.mjs +37 -0
  83. package/{esm2015/menu/menu-stack.js → esm2020/menu/menu-stack.mjs} +0 -0
  84. package/esm2020/menu/menu.mjs +316 -0
  85. package/esm2020/menu/menu_public_index.mjs +5 -0
  86. package/{esm2015/menu/pointer-focus-tracker.js → esm2020/menu/pointer-focus-tracker.mjs} +1 -1
  87. package/{esm2015/menu/public-api.js → esm2020/menu/public-api.mjs} +0 -0
  88. package/{esm2015/popover-edit/constants.js → esm2020/popover-edit/constants.mjs} +0 -0
  89. package/esm2020/popover-edit/edit-event-dispatcher.mjs +215 -0
  90. package/esm2020/popover-edit/edit-ref.mjs +84 -0
  91. package/esm2020/popover-edit/edit-services.mjs +48 -0
  92. package/esm2020/popover-edit/focus-dispatcher.mjs +82 -0
  93. package/esm2020/popover-edit/focus-escape-notifier.mjs +63 -0
  94. package/{esm2015/popover-edit/form-value-container.js → esm2020/popover-edit/form-value-container.mjs} +0 -0
  95. package/esm2020/popover-edit/index.mjs +9 -0
  96. package/esm2020/popover-edit/lens-directives.mjs +210 -0
  97. package/esm2020/popover-edit/polyfill.mjs +37 -0
  98. package/esm2020/popover-edit/popover-edit-module.mjs +62 -0
  99. package/esm2020/popover-edit/popover-edit-position-strategy-factory.mjs +76 -0
  100. package/esm2020/popover-edit/popover-edit_public_index.mjs +5 -0
  101. package/{esm2015/popover-edit/public-api.js → esm2020/popover-edit/public-api.mjs} +0 -0
  102. package/esm2020/popover-edit/table-directives.mjs +400 -0
  103. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  104. package/esm2020/scrolling/auto-size-virtual-scroll.mjs +421 -0
  105. package/esm2020/scrolling/index.mjs +9 -0
  106. package/{esm2015/scrolling/public-api.js → esm2020/scrolling/public-api.mjs} +0 -0
  107. package/esm2020/scrolling/scrolling-module.mjs +23 -0
  108. package/esm2020/scrolling/scrolling_public_index.mjs +5 -0
  109. package/esm2020/selection/index.mjs +9 -0
  110. package/{esm2015/selection/public-api.js → esm2020/selection/public-api.mjs} +0 -0
  111. package/esm2020/selection/row-selection.mjs +49 -0
  112. package/esm2020/selection/select-all.mjs +109 -0
  113. package/esm2020/selection/selection-column.mjs +134 -0
  114. package/esm2020/selection/selection-module.mjs +40 -0
  115. package/{esm2015/selection/selection-set.js → esm2020/selection/selection-set.mjs} +1 -1
  116. package/esm2020/selection/selection-toggle.mjs +101 -0
  117. package/esm2020/selection/selection.mjs +186 -0
  118. package/esm2020/selection/selection_public_index.mjs +5 -0
  119. package/esm2020/table-scroll-container/index.mjs +9 -0
  120. package/{esm2015/table-scroll-container/public-api.js → esm2020/table-scroll-container/public-api.mjs} +0 -0
  121. package/esm2020/table-scroll-container/table-scroll-container-module.mjs +23 -0
  122. package/esm2020/table-scroll-container/table-scroll-container.mjs +131 -0
  123. package/esm2020/table-scroll-container/table-scroll-container_public_index.mjs +5 -0
  124. package/{esm2015/version.js → esm2020/version.mjs} +1 -1
  125. package/fesm2015/{cdk-experimental.js → cdk-experimental.mjs} +2 -2
  126. package/fesm2015/cdk-experimental.mjs.map +1 -0
  127. package/fesm2015/{column-resize.js → column-resize.mjs} +213 -175
  128. package/fesm2015/column-resize.mjs.map +1 -0
  129. package/fesm2015/{combobox.js → combobox.mjs} +134 -102
  130. package/fesm2015/combobox.mjs.map +1 -0
  131. package/fesm2015/dialog.mjs +813 -0
  132. package/fesm2015/dialog.mjs.map +1 -0
  133. package/fesm2015/{listbox.js → listbox.mjs} +128 -91
  134. package/fesm2015/listbox.mjs.map +1 -0
  135. package/fesm2015/{menu.js → menu.mjs} +576 -397
  136. package/fesm2015/menu.mjs.map +1 -0
  137. package/fesm2015/{popover-edit.js → popover-edit.mjs} +257 -230
  138. package/fesm2015/popover-edit.mjs.map +1 -0
  139. package/fesm2015/{scrolling.js → scrolling.mjs} +66 -36
  140. package/fesm2015/scrolling.mjs.map +1 -0
  141. package/fesm2015/selection.mjs +693 -0
  142. package/fesm2015/selection.mjs.map +1 -0
  143. package/fesm2015/{table-scroll-container.js → table-scroll-container.mjs} +43 -30
  144. package/fesm2015/table-scroll-container.mjs.map +1 -0
  145. package/fesm2020/cdk-experimental.mjs +30 -0
  146. package/fesm2020/cdk-experimental.mjs.map +1 -0
  147. package/fesm2020/column-resize.mjs +1016 -0
  148. package/fesm2020/column-resize.mjs.map +1 -0
  149. package/fesm2020/combobox.mjs +430 -0
  150. package/fesm2020/combobox.mjs.map +1 -0
  151. package/{fesm2015/dialog.js → fesm2020/dialog.mjs} +156 -104
  152. package/fesm2020/dialog.mjs.map +1 -0
  153. package/fesm2020/listbox.mjs +541 -0
  154. package/fesm2020/listbox.mjs.map +1 -0
  155. package/fesm2020/menu.mjs +2202 -0
  156. package/fesm2020/menu.mjs.map +1 -0
  157. package/fesm2020/popover-edit.mjs +1289 -0
  158. package/fesm2020/popover-edit.mjs.map +1 -0
  159. package/fesm2020/scrolling.mjs +464 -0
  160. package/fesm2020/scrolling.mjs.map +1 -0
  161. package/{fesm2015/selection.js → fesm2020/selection.mjs} +195 -107
  162. package/fesm2020/selection.mjs.map +1 -0
  163. package/fesm2020/table-scroll-container.mjs +173 -0
  164. package/fesm2020/table-scroll-container.mjs.map +1 -0
  165. package/listbox/index.d.ts +5 -1
  166. package/listbox/listbox-module.d.ts +5 -7
  167. package/listbox/listbox.d.ts +5 -0
  168. package/listbox/listbox_public_index.d.ts +4 -0
  169. package/listbox/package.json +6 -6
  170. package/menu/context-menu.d.ts +5 -0
  171. package/menu/index.d.ts +5 -3
  172. package/menu/menu-aim.d.ts +5 -0
  173. package/menu/menu-bar.d.ts +3 -0
  174. package/menu/menu-group.d.ts +3 -0
  175. package/menu/menu-item-checkbox.d.ts +3 -7
  176. package/menu/menu-item-radio.d.ts +3 -0
  177. package/menu/menu-item-selectable.d.ts +3 -0
  178. package/menu/menu-item-trigger.d.ts +3 -0
  179. package/menu/menu-item.d.ts +3 -0
  180. package/menu/menu-module.d.ts +15 -7
  181. package/menu/menu-panel.d.ts +3 -0
  182. package/menu/menu.d.ts +3 -0
  183. package/menu/menu_public_index.d.ts +4 -0
  184. package/menu/package.json +6 -6
  185. package/package.json +94 -8
  186. package/popover-edit/edit-event-dispatcher.d.ts +3 -0
  187. package/popover-edit/edit-ref.d.ts +3 -0
  188. package/popover-edit/edit-services.d.ts +3 -0
  189. package/popover-edit/focus-dispatcher.d.ts +3 -0
  190. package/popover-edit/focus-escape-notifier.d.ts +3 -0
  191. package/popover-edit/index.d.ts +5 -3
  192. package/popover-edit/lens-directives.d.ts +7 -0
  193. package/popover-edit/package.json +6 -6
  194. package/popover-edit/popover-edit-module.d.ts +7 -7
  195. package/popover-edit/popover-edit-position-strategy-factory.d.ts +5 -0
  196. package/popover-edit/popover-edit_public_index.d.ts +4 -0
  197. package/popover-edit/table-directives.d.ts +11 -0
  198. package/scrolling/auto-size-virtual-scroll.d.ts +3 -0
  199. package/scrolling/index.d.ts +5 -1
  200. package/scrolling/package.json +6 -6
  201. package/scrolling/scrolling-module.d.ts +5 -7
  202. package/scrolling/scrolling_public_index.d.ts +4 -0
  203. package/selection/index.d.ts +5 -1
  204. package/selection/package.json +6 -6
  205. package/selection/row-selection.d.ts +3 -0
  206. package/selection/select-all.d.ts +3 -0
  207. package/selection/selection-column.d.ts +3 -0
  208. package/selection/selection-module.d.ts +11 -7
  209. package/selection/selection-toggle.d.ts +3 -0
  210. package/selection/selection.d.ts +3 -0
  211. package/selection/selection_public_index.d.ts +4 -0
  212. package/table-scroll-container/index.d.ts +5 -1
  213. package/table-scroll-container/package.json +6 -6
  214. package/table-scroll-container/table-scroll-container-module.d.ts +5 -7
  215. package/table-scroll-container/table-scroll-container.d.ts +3 -0
  216. package/table-scroll-container/table-scroll-container_public_index.d.ts +4 -0
  217. package/bundles/cdk-experimental-column-resize.umd.js +0 -1324
  218. package/bundles/cdk-experimental-column-resize.umd.js.map +0 -1
  219. package/bundles/cdk-experimental-combobox.umd.js +0 -443
  220. package/bundles/cdk-experimental-combobox.umd.js.map +0 -1
  221. package/bundles/cdk-experimental-dialog.umd.js +0 -1113
  222. package/bundles/cdk-experimental-dialog.umd.js.map +0 -1
  223. package/bundles/cdk-experimental-listbox.umd.js +0 -935
  224. package/bundles/cdk-experimental-listbox.umd.js.map +0 -1
  225. package/bundles/cdk-experimental-menu.umd.js +0 -2461
  226. package/bundles/cdk-experimental-menu.umd.js.map +0 -1
  227. package/bundles/cdk-experimental-popover-edit.umd.js +0 -1679
  228. package/bundles/cdk-experimental-popover-edit.umd.js.map +0 -1
  229. package/bundles/cdk-experimental-scrolling.umd.js +0 -459
  230. package/bundles/cdk-experimental-scrolling.umd.js.map +0 -1
  231. package/bundles/cdk-experimental-selection.umd.js +0 -961
  232. package/bundles/cdk-experimental-selection.umd.js.map +0 -1
  233. package/bundles/cdk-experimental-table-scroll-container.umd.js +0 -499
  234. package/bundles/cdk-experimental-table-scroll-container.umd.js.map +0 -1
  235. package/bundles/cdk-experimental.umd.js +0 -38
  236. package/bundles/cdk-experimental.umd.js.map +0 -1
  237. package/column-resize/index.metadata.json +0 -1
  238. package/combobox/index.metadata.json +0 -1
  239. package/dialog/index.metadata.json +0 -1
  240. package/esm2015/cdk-experimental.externs.js +0 -0
  241. package/esm2015/column-resize/column-resize-directives/column-resize-flex.js +0 -46
  242. package/esm2015/column-resize/column-resize-directives/column-resize.js +0 -46
  243. package/esm2015/column-resize/column-resize-directives/default-enabled-column-resize-flex.js +0 -46
  244. package/esm2015/column-resize/column-resize-directives/default-enabled-column-resize.js +0 -46
  245. package/esm2015/column-resize/column-resize-module.js +0 -37
  246. package/esm2015/column-resize/column-resize-notifier.js +0 -45
  247. package/esm2015/column-resize/column-resize.externs.js +0 -6
  248. package/esm2015/column-resize/column-resize.js +0 -71
  249. package/esm2015/column-resize/column-size-store.js +0 -17
  250. package/esm2015/column-resize/event-dispatcher.js +0 -70
  251. package/esm2015/column-resize/index.js +0 -6
  252. package/esm2015/column-resize/overlay-handle.js +0 -139
  253. package/esm2015/column-resize/resizable.js +0 -185
  254. package/esm2015/column-resize/resize-strategy.js +0 -227
  255. package/esm2015/combobox/combobox-module.js +0 -23
  256. package/esm2015/combobox/combobox-panel.js +0 -55
  257. package/esm2015/combobox/combobox-popup.js +0 -74
  258. package/esm2015/combobox/combobox.externs.js +0 -6
  259. package/esm2015/combobox/combobox.js +0 -248
  260. package/esm2015/combobox/index.js +0 -5
  261. package/esm2015/dialog/dialog-container.js +0 -289
  262. package/esm2015/dialog/dialog-injectors.js +0 -30
  263. package/esm2015/dialog/dialog-module.js +0 -47
  264. package/esm2015/dialog/dialog-ref.js +0 -115
  265. package/esm2015/dialog/dialog.externs.js +0 -6
  266. package/esm2015/dialog/dialog.js +0 -238
  267. package/esm2015/dialog/index.js +0 -5
  268. package/esm2015/listbox/index.js +0 -5
  269. package/esm2015/listbox/listbox-module.js +0 -19
  270. package/esm2015/listbox/listbox.externs.js +0 -6
  271. package/esm2015/listbox/listbox.js +0 -481
  272. package/esm2015/menu/context-menu.js +0 -280
  273. package/esm2015/menu/index.js +0 -6
  274. package/esm2015/menu/menu-aim.js +0 -195
  275. package/esm2015/menu/menu-bar.js +0 -252
  276. package/esm2015/menu/menu-group.js +0 -63
  277. package/esm2015/menu/menu-item-checkbox.js +0 -41
  278. package/esm2015/menu/menu-item-radio.js +0 -73
  279. package/esm2015/menu/menu-item-selectable.js +0 -51
  280. package/esm2015/menu/menu-item-trigger.js +0 -354
  281. package/esm2015/menu/menu-item.js +0 -253
  282. package/esm2015/menu/menu-module.js +0 -41
  283. package/esm2015/menu/menu-panel.js +0 -37
  284. package/esm2015/menu/menu.externs.js +0 -6
  285. package/esm2015/menu/menu.js +0 -293
  286. package/esm2015/popover-edit/edit-event-dispatcher.js +0 -215
  287. package/esm2015/popover-edit/edit-ref.js +0 -82
  288. package/esm2015/popover-edit/edit-services.js +0 -49
  289. package/esm2015/popover-edit/focus-dispatcher.js +0 -83
  290. package/esm2015/popover-edit/focus-escape-notifier.js +0 -64
  291. package/esm2015/popover-edit/index.js +0 -7
  292. package/esm2015/popover-edit/lens-directives.js +0 -199
  293. package/esm2015/popover-edit/polyfill.js +0 -35
  294. package/esm2015/popover-edit/popover-edit-module.js +0 -38
  295. package/esm2015/popover-edit/popover-edit-position-strategy-factory.js +0 -70
  296. package/esm2015/popover-edit/popover-edit.externs.js +0 -6
  297. package/esm2015/popover-edit/table-directives.js +0 -390
  298. package/esm2015/scrolling/auto-size-virtual-scroll.js +0 -403
  299. package/esm2015/scrolling/index.js +0 -5
  300. package/esm2015/scrolling/scrolling-module.js +0 -18
  301. package/esm2015/scrolling/scrolling.externs.js +0 -6
  302. package/esm2015/selection/index.js +0 -5
  303. package/esm2015/selection/row-selection.js +0 -41
  304. package/esm2015/selection/select-all.js +0 -96
  305. package/esm2015/selection/selection-column.js +0 -93
  306. package/esm2015/selection/selection-module.js +0 -40
  307. package/esm2015/selection/selection-toggle.js +0 -82
  308. package/esm2015/selection/selection.externs.js +0 -6
  309. package/esm2015/selection/selection.js +0 -176
  310. package/esm2015/table-scroll-container/index.js +0 -5
  311. package/esm2015/table-scroll-container/table-scroll-container-module.js +0 -18
  312. package/esm2015/table-scroll-container/table-scroll-container.externs.js +0 -6
  313. package/esm2015/table-scroll-container/table-scroll-container.js +0 -133
  314. package/fesm2015/cdk-experimental.js.map +0 -1
  315. package/fesm2015/column-resize.js.map +0 -1
  316. package/fesm2015/combobox.js.map +0 -1
  317. package/fesm2015/dialog.js.map +0 -1
  318. package/fesm2015/listbox.js.map +0 -1
  319. package/fesm2015/menu.js.map +0 -1
  320. package/fesm2015/popover-edit.js.map +0 -1
  321. package/fesm2015/scrolling.js.map +0 -1
  322. package/fesm2015/selection.js.map +0 -1
  323. package/fesm2015/table-scroll-container.js.map +0 -1
  324. package/listbox/index.metadata.json +0 -1
  325. package/menu/index.metadata.json +0 -1
  326. package/popover-edit/index.metadata.json +0 -1
  327. package/scrolling/index.metadata.json +0 -1
  328. package/selection/index.metadata.json +0 -1
  329. package/table-scroll-container/index.metadata.json +0 -1
@@ -1,280 +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 { Directive, Input, ViewContainerRef, Output, EventEmitter, Optional, Inject, Injectable, InjectionToken, } from '@angular/core';
9
- import { Directionality } from '@angular/cdk/bidi';
10
- import { Overlay, OverlayConfig, } from '@angular/cdk/overlay';
11
- import { TemplatePortal } from '@angular/cdk/portal';
12
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
13
- import { Subject, merge } from 'rxjs';
14
- import { takeUntil } from 'rxjs/operators';
15
- import { CdkMenuPanel } from './menu-panel';
16
- import { MenuStack } from './menu-stack';
17
- import { throwExistingMenuStackError } from './menu-errors';
18
- import { isClickInsideMenuOverlay } from './menu-item-trigger';
19
- import * as i0 from "@angular/core";
20
- /** Tracks the last open context menu trigger across the entire application. */
21
- export class ContextMenuTracker {
22
- /**
23
- * Close the previous open context menu and set the given one as being open.
24
- * @param trigger the trigger for the currently open Context Menu.
25
- */
26
- update(trigger) {
27
- var _a;
28
- if (ContextMenuTracker._openContextMenuTrigger !== trigger) {
29
- (_a = ContextMenuTracker._openContextMenuTrigger) === null || _a === void 0 ? void 0 : _a.close();
30
- ContextMenuTracker._openContextMenuTrigger = trigger;
31
- }
32
- }
33
- }
34
- ContextMenuTracker.ɵprov = i0.ɵɵdefineInjectable({ factory: function ContextMenuTracker_Factory() { return new ContextMenuTracker(); }, token: ContextMenuTracker, providedIn: "root" });
35
- ContextMenuTracker.decorators = [
36
- { type: Injectable, args: [{ providedIn: 'root' },] }
37
- ];
38
- /** Injection token for the ContextMenu options object. */
39
- export const CDK_CONTEXT_MENU_DEFAULT_OPTIONS = new InjectionToken('cdk-context-menu-default-options');
40
- const ɵ0 = { offsetX: 2, offsetY: 2 };
41
- /**
42
- * A directive which when placed on some element opens a the Menu it is bound to when a user
43
- * right-clicks within that element. It is aware of nested Context Menus and the lowest level
44
- * non-disabled context menu will trigger.
45
- */
46
- export class CdkContextMenuTrigger {
47
- constructor(_viewContainerRef, _overlay, _contextMenuTracker, _options, _directionality) {
48
- this._viewContainerRef = _viewContainerRef;
49
- this._overlay = _overlay;
50
- this._contextMenuTracker = _contextMenuTracker;
51
- this._options = _options;
52
- this._directionality = _directionality;
53
- /** Emits when the attached menu is requested to open. */
54
- this.opened = new EventEmitter();
55
- /** Emits when the attached menu is requested to close. */
56
- this.closed = new EventEmitter();
57
- this._disabled = false;
58
- /** A reference to the overlay which manages the triggered menu. */
59
- this._overlayRef = null;
60
- /** Emits when the element is destroyed. */
61
- this._destroyed = new Subject();
62
- /** The menu stack for this trigger and its associated menus. */
63
- this._menuStack = new MenuStack();
64
- /** Emits when the outside pointer events listener on the overlay should be stopped. */
65
- this._stopOutsideClicksListener = merge(this.closed, this._destroyed);
66
- this._setMenuStackListener();
67
- }
68
- /** Template reference variable to the menu to open on right click. */
69
- get menuPanel() {
70
- return this._menuPanel;
71
- }
72
- set menuPanel(panel) {
73
- if ((typeof ngDevMode === 'undefined' || ngDevMode) && panel._menuStack) {
74
- throwExistingMenuStackError();
75
- }
76
- this._menuPanel = panel;
77
- if (this._menuPanel) {
78
- this._menuPanel._menuStack = this._menuStack;
79
- }
80
- }
81
- /** Whether the context menu should be disabled. */
82
- get disabled() {
83
- return this._disabled;
84
- }
85
- set disabled(value) {
86
- this._disabled = coerceBooleanProperty(value);
87
- }
88
- /**
89
- * Open the attached menu at the specified location.
90
- * @param coordinates where to open the context menu
91
- */
92
- open(coordinates) {
93
- if (this.disabled) {
94
- return;
95
- }
96
- else if (this.isOpen()) {
97
- // since we're moving this menu we need to close any submenus first otherwise they end up
98
- // disconnected from this one.
99
- this._menuStack.closeSubMenuOf(this._menuPanel._menu);
100
- this._overlayRef.getConfig()
101
- .positionStrategy.setOrigin(coordinates);
102
- this._overlayRef.updatePosition();
103
- }
104
- else {
105
- this.opened.next();
106
- if (this._overlayRef) {
107
- this._overlayRef.getConfig()
108
- .positionStrategy.setOrigin(coordinates);
109
- this._overlayRef.updatePosition();
110
- }
111
- else {
112
- this._overlayRef = this._overlay.create(this._getOverlayConfig(coordinates));
113
- }
114
- this._overlayRef.attach(this._getMenuContent());
115
- this._subscribeToOutsideClicks();
116
- }
117
- }
118
- /** Close the opened menu. */
119
- close() {
120
- this._menuStack.closeAll();
121
- }
122
- /**
123
- * Open the context menu and close any previously open menus.
124
- * @param event the mouse event which opens the context menu.
125
- */
126
- _openOnContextMenu(event) {
127
- var _a, _b, _c;
128
- if (!this.disabled) {
129
- // Prevent the native context menu from opening because we're opening a custom one.
130
- event.preventDefault();
131
- // Stop event propagation to ensure that only the closest enabled context menu opens.
132
- // Otherwise, any context menus attached to containing elements would *also* open,
133
- // resulting in multiple stacked context menus being displayed.
134
- event.stopPropagation();
135
- this._contextMenuTracker.update(this);
136
- this.open({ x: event.clientX, y: event.clientY });
137
- // A context menu can be triggered via a mouse right click or a keyboard shortcut.
138
- if (event.button === 2) {
139
- (_a = this._menuPanel._menu) === null || _a === void 0 ? void 0 : _a.focusFirstItem('mouse');
140
- }
141
- else if (event.button === 0) {
142
- (_b = this._menuPanel._menu) === null || _b === void 0 ? void 0 : _b.focusFirstItem('keyboard');
143
- }
144
- else {
145
- (_c = this._menuPanel._menu) === null || _c === void 0 ? void 0 : _c.focusFirstItem('program');
146
- }
147
- }
148
- }
149
- /** Whether the attached menu is open. */
150
- isOpen() {
151
- var _a;
152
- return !!((_a = this._overlayRef) === null || _a === void 0 ? void 0 : _a.hasAttached());
153
- }
154
- /**
155
- * Get the configuration object used to create the overlay.
156
- * @param coordinates the location to place the opened menu
157
- */
158
- _getOverlayConfig(coordinates) {
159
- return new OverlayConfig({
160
- positionStrategy: this._getOverlayPositionStrategy(coordinates),
161
- scrollStrategy: this._overlay.scrollStrategies.block(),
162
- direction: this._directionality,
163
- });
164
- }
165
- /**
166
- * Build the position strategy for the overlay which specifies where to place the menu.
167
- * @param coordinates the location to place the opened menu
168
- */
169
- _getOverlayPositionStrategy(coordinates) {
170
- return this._overlay
171
- .position()
172
- .flexibleConnectedTo(coordinates)
173
- .withDefaultOffsetX(this._options.offsetX)
174
- .withDefaultOffsetY(this._options.offsetY)
175
- .withPositions(this._getOverlayPositions());
176
- }
177
- /**
178
- * Determine and return where to position the opened menu relative to the mouse location.
179
- */
180
- _getOverlayPositions() {
181
- // TODO: this should be configurable through the injected context menu options
182
- return [
183
- { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top' },
184
- { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top' },
185
- { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom' },
186
- { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom' },
187
- ];
188
- }
189
- /**
190
- * Get the portal to be attached to the overlay which contains the menu. Allows for the menu
191
- * content to change dynamically and be reflected in the application.
192
- */
193
- _getMenuContent() {
194
- var _a;
195
- const hasMenuContentChanged = this.menuPanel._templateRef !== ((_a = this._panelContent) === null || _a === void 0 ? void 0 : _a.templateRef);
196
- if (this.menuPanel && (!this._panelContent || hasMenuContentChanged)) {
197
- this._panelContent = new TemplatePortal(this.menuPanel._templateRef, this._viewContainerRef);
198
- }
199
- return this._panelContent;
200
- }
201
- /** Subscribe to the menu stack close events and close this menu when requested. */
202
- _setMenuStackListener() {
203
- this._menuStack.closed.pipe(takeUntil(this._destroyed)).subscribe(item => {
204
- if (item === this._menuPanel._menu && this.isOpen()) {
205
- this.closed.next();
206
- this._overlayRef.detach();
207
- }
208
- });
209
- }
210
- /**
211
- * Subscribe to the overlays outside pointer events stream and handle closing out the stack if a
212
- * click occurs outside the menus.
213
- */
214
- _subscribeToOutsideClicks() {
215
- if (this._overlayRef) {
216
- this._overlayRef
217
- .outsidePointerEvents()
218
- .pipe(takeUntil(this._stopOutsideClicksListener))
219
- .subscribe(event => {
220
- if (!isClickInsideMenuOverlay(event.target)) {
221
- this._menuStack.closeAll();
222
- }
223
- });
224
- }
225
- }
226
- ngOnDestroy() {
227
- this._destroyOverlay();
228
- this._resetPanelMenuStack();
229
- this._destroyed.next();
230
- this._destroyed.complete();
231
- }
232
- /** Destroy and unset the overlay reference it if exists. */
233
- _destroyOverlay() {
234
- if (this._overlayRef) {
235
- this._overlayRef.dispose();
236
- this._overlayRef = null;
237
- }
238
- }
239
- /** Set the menu panels menu stack back to null. */
240
- _resetPanelMenuStack() {
241
- // If a ContextMenuTrigger is placed in a conditionally rendered view, each time the trigger is
242
- // rendered the panel setter for ContextMenuTrigger is called. From the first render onward,
243
- // the attached CdkMenuPanel has the MenuStack set. Since we throw an error if a panel already
244
- // has a stack set, we want to reset the attached stack here to prevent the error from being
245
- // thrown if the trigger re-configures its attached panel (in the case where there is a 1:1
246
- // relationship between the panel and trigger).
247
- if (this._menuPanel) {
248
- this._menuPanel._menuStack = null;
249
- }
250
- }
251
- }
252
- CdkContextMenuTrigger.decorators = [
253
- { type: Directive, args: [{
254
- selector: '[cdkContextMenuTriggerFor]',
255
- exportAs: 'cdkContextMenuTriggerFor',
256
- host: {
257
- '(contextmenu)': '_openOnContextMenu($event)',
258
- },
259
- providers: [
260
- // In cases where the first menu item in the context menu is a trigger the submenu opens on a
261
- // hover event. Offsetting the opened context menu by 2px prevents this from occurring.
262
- { provide: CDK_CONTEXT_MENU_DEFAULT_OPTIONS, useValue: ɵ0 },
263
- ],
264
- },] }
265
- ];
266
- CdkContextMenuTrigger.ctorParameters = () => [
267
- { type: ViewContainerRef },
268
- { type: Overlay },
269
- { type: ContextMenuTracker },
270
- { type: undefined, decorators: [{ type: Inject, args: [CDK_CONTEXT_MENU_DEFAULT_OPTIONS,] }] },
271
- { type: Directionality, decorators: [{ type: Optional }] }
272
- ];
273
- CdkContextMenuTrigger.propDecorators = {
274
- menuPanel: [{ type: Input, args: ['cdkContextMenuTriggerFor',] }],
275
- opened: [{ type: Output, args: ['cdkContextMenuOpened',] }],
276
- closed: [{ type: Output, args: ['cdkContextMenuClosed',] }],
277
- disabled: [{ type: Input, args: ['cdkContextMenuDisabled',] }]
278
- };
279
- export { ɵ0 };
280
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Nkay1leHBlcmltZW50YWwvbWVudS9jb250ZXh0LW1lbnUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixZQUFZLEVBQ1osUUFBUSxFQUVSLE1BQU0sRUFDTixVQUFVLEVBQ1YsY0FBYyxHQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBRUwsT0FBTyxFQUNQLGFBQWEsR0FHZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBQyxjQUFjLEVBQVMsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRCxPQUFPLEVBQUMscUJBQXFCLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRSxPQUFPLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3ZDLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7QUFFN0QsK0VBQStFO0FBRS9FLE1BQU0sT0FBTyxrQkFBa0I7SUFJN0I7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLE9BQThCOztRQUNuQyxJQUFJLGtCQUFrQixDQUFDLHVCQUF1QixLQUFLLE9BQU8sRUFBRTtZQUMxRCxNQUFBLGtCQUFrQixDQUFDLHVCQUF1QiwwQ0FBRSxLQUFLLEVBQUUs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LENBQUM7U0FDbkM7SUFDSCxDQUFDOzs7WUF4UEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSw0QkFBNEI7Z0JBQ3RDLFFBQVEsRUFBRSwwQkFBMEI7Z0JBQ3BDLElBQUksRUFBRTtvQkFDSixlQUFlLEVBQUUsNEJBQTRCO2lCQUM5QztnQkFDRCxTQUFTLEVBQUU7b0JBQ1QsNkZBQTZGO29CQUM3Rix1RkFBdUY7b0JBQ3ZGLEVBQUMsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLFFBQVEsSUFBMEIsRUFBQztpQkFDaEY7YUFDRjs7O1lBN0VDLGdCQUFnQjtZQVloQixPQUFPO1lBdUhpQyxrQkFBa0I7NENBQ3ZELE1BQU0sU0FBQyxnQ0FBZ0M7WUEzSHBDLGNBQWMsdUJBNEhqQixRQUFROzs7d0JBckRWLEtBQUssU0FBQywwQkFBMEI7cUJBa0JoQyxNQUFNLFNBQUMsc0JBQXNCO3FCQUc3QixNQUFNLFNBQUMsc0JBQXNCO3VCQUc3QixLQUFLLFNBQUMsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgSW5wdXQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPcHRpb25hbCxcbiAgT25EZXN0cm95LFxuICBJbmplY3QsXG4gIEluamVjdGFibGUsXG4gIEluamVjdGlvblRva2VuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RGlyZWN0aW9uYWxpdHl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7XG4gIE92ZXJsYXlSZWYsXG4gIE92ZXJsYXksXG4gIE92ZXJsYXlDb25maWcsXG4gIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSxcbiAgQ29ubmVjdGVkUG9zaXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7VGVtcGxhdGVQb3J0YWwsIFBvcnRhbH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQge2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgQm9vbGVhbklucHV0fSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtTdWJqZWN0LCBtZXJnZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3Rha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtDZGtNZW51UGFuZWx9IGZyb20gJy4vbWVudS1wYW5lbCc7XG5pbXBvcnQge01lbnVTdGFja30gZnJvbSAnLi9tZW51LXN0YWNrJztcbmltcG9ydCB7dGhyb3dFeGlzdGluZ01lbnVTdGFja0Vycm9yfSBmcm9tICcuL21lbnUtZXJyb3JzJztcbmltcG9ydCB7aXNDbGlja0luc2lkZU1lbnVPdmVybGF5fSBmcm9tICcuL21lbnUtaXRlbS10cmlnZ2VyJztcblxuLyoqIFRyYWNrcyB0aGUgbGFzdCBvcGVuIGNvbnRleHQgbWVudSB0cmlnZ2VyIGFjcm9zcyB0aGUgZW50aXJlIGFwcGxpY2F0aW9uLiAqL1xuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgQ29udGV4dE1lbnVUcmFja2VyIHtcbiAgLyoqIFRoZSBsYXN0IG9wZW4gY29udGV4dCBtZW51IHRyaWdnZXIuICovXG4gIHByaXZhdGUgc3RhdGljIF9vcGVuQ29udGV4dE1lbnVUcmlnZ2VyPzogQ2RrQ29udGV4dE1lbnVUcmlnZ2VyO1xuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgcHJldmlvdXMgb3BlbiBjb250ZXh0IG1lbnUgYW5kIHNldCB0aGUgZ2l2ZW4gb25lIGFzIGJlaW5nIG9wZW4uXG4gICAqIEBwYXJhbSB0cmlnZ2VyIHRoZSB0cmlnZ2VyIGZvciB0aGUgY3VycmVudGx5IG9wZW4gQ29udGV4dCBNZW51LlxuICAgKi9cbiAgdXBkYXRlKHRyaWdnZXI6IENka0NvbnRleHRNZW51VHJpZ2dlcikge1xuICAgIGlmIChDb250ZXh0TWVudVRyYWNrZXIuX29wZW5Db250ZXh0TWVudVRyaWdnZXIgIT09IHRyaWdnZXIpIHtcbiAgICAgIENvbnRleHRNZW51VHJhY2tlci5fb3BlbkNvbnRleHRNZW51VHJpZ2dlcj8uY2xvc2UoKTtcbiAgICAgIENvbnRleHRNZW51VHJhY2tlci5fb3BlbkNvbnRleHRNZW51VHJpZ2dlciA9IHRyaWdnZXI7XG4gICAgfVxuICB9XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBjb250ZXh0IG1lbnUuICovXG5leHBvcnQgdHlwZSBDb250ZXh0TWVudU9wdGlvbnMgPSB7XG4gIC8qKiBUaGUgb3BlbmVkIG1lbnVzIFggY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSB0aGUgdHJpZ2dlcmluZyBwb3NpdGlvbi4gKi9cbiAgb2Zmc2V0WDogbnVtYmVyO1xuXG4gIC8qKiBUaGUgb3BlbmVkIG1lbnVzIFkgY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSB0aGUgdHJpZ2dlcmluZyBwb3NpdGlvbi4gKi9cbiAgb2Zmc2V0WTogbnVtYmVyO1xufTtcblxuLyoqIEluamVjdGlvbiB0b2tlbiBmb3IgdGhlIENvbnRleHRNZW51IG9wdGlvbnMgb2JqZWN0LiAqL1xuZXhwb3J0IGNvbnN0IENES19DT05URVhUX01FTlVfREVGQVVMVF9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuPENvbnRleHRNZW51T3B0aW9ucz4oXG4gICdjZGstY29udGV4dC1tZW51LWRlZmF1bHQtb3B0aW9ucydcbik7XG5cbi8qKiBUaGUgY29vcmRpbmF0ZXMgb2Ygd2hlcmUgdGhlIGNvbnRleHQgbWVudSBzaG91bGQgb3Blbi4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRNZW51Q29vcmRpbmF0ZXMgPSB7eDogbnVtYmVyOyB5OiBudW1iZXJ9O1xuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHdoaWNoIHdoZW4gcGxhY2VkIG9uIHNvbWUgZWxlbWVudCBvcGVucyBhIHRoZSBNZW51IGl0IGlzIGJvdW5kIHRvIHdoZW4gYSB1c2VyXG4gKiByaWdodC1jbGlja3Mgd2l0aGluIHRoYXQgZWxlbWVudC4gSXQgaXMgYXdhcmUgb2YgbmVzdGVkIENvbnRleHQgTWVudXMgYW5kIHRoZSBsb3dlc3QgbGV2ZWxcbiAqIG5vbi1kaXNhYmxlZCBjb250ZXh0IG1lbnUgd2lsbCB0cmlnZ2VyLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY2RrQ29udGV4dE1lbnVUcmlnZ2VyRm9yXScsXG4gIGV4cG9ydEFzOiAnY2RrQ29udGV4dE1lbnVUcmlnZ2VyRm9yJyxcbiAgaG9zdDoge1xuICAgICcoY29udGV4dG1lbnUpJzogJ19vcGVuT25Db250ZXh0TWVudSgkZXZlbnQpJyxcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIGZpcnN0IG1lbnUgaXRlbSBpbiB0aGUgY29udGV4dCBtZW51IGlzIGEgdHJpZ2dlciB0aGUgc3VibWVudSBvcGVucyBvbiBhXG4gICAgLy8gaG92ZXIgZXZlbnQuIE9mZnNldHRpbmcgdGhlIG9wZW5lZCBjb250ZXh0IG1lbnUgYnkgMnB4IHByZXZlbnRzIHRoaXMgZnJvbSBvY2N1cnJpbmcuXG4gICAge3Byb3ZpZGU6IENES19DT05URVhUX01FTlVfREVGQVVMVF9PUFRJT05TLCB1c2VWYWx1ZToge29mZnNldFg6IDIsIG9mZnNldFk6IDJ9fSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2RrQ29udGV4dE1lbnVUcmlnZ2VyIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqIFRlbXBsYXRlIHJlZmVyZW5jZSB2YXJpYWJsZSB0byB0aGUgbWVudSB0byBvcGVuIG9uIHJpZ2h0IGNsaWNrLiAqL1xuICBASW5wdXQoJ2Nka0NvbnRleHRNZW51VHJpZ2dlckZvcicpXG4gIGdldCBtZW51UGFuZWwoKTogQ2RrTWVudVBhbmVsIHtcbiAgICByZXR1cm4gdGhpcy5fbWVudVBhbmVsO1xuICB9XG4gIHNldCBtZW51UGFuZWwocGFuZWw6IENka01lbnVQYW5lbCkge1xuICAgIGlmICgodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSAmJiBwYW5lbC5fbWVudVN0YWNrKSB7XG4gICAgICB0aHJvd0V4aXN0aW5nTWVudVN0YWNrRXJyb3IoKTtcbiAgICB9XG4gICAgdGhpcy5fbWVudVBhbmVsID0gcGFuZWw7XG5cbiAgICBpZiAodGhpcy5fbWVudVBhbmVsKSB7XG4gICAgICB0aGlzLl9tZW51UGFuZWwuX21lbnVTdGFjayA9IHRoaXMuX21lbnVTdGFjaztcbiAgICB9XG4gIH1cbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgTWVudVBhbmVsIHRoaXMgdHJpZ2dlciB0b2dnbGVzLiAqL1xuICBwcml2YXRlIF9tZW51UGFuZWw6IENka01lbnVQYW5lbDtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgYXR0YWNoZWQgbWVudSBpcyByZXF1ZXN0ZWQgdG8gb3Blbi4gKi9cbiAgQE91dHB1dCgnY2RrQ29udGV4dE1lbnVPcGVuZWQnKSByZWFkb25seSBvcGVuZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgYXR0YWNoZWQgbWVudSBpcyByZXF1ZXN0ZWQgdG8gY2xvc2UuICovXG4gIEBPdXRwdXQoJ2Nka0NvbnRleHRNZW51Q2xvc2VkJykgcmVhZG9ubHkgY2xvc2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGNvbnRleHQgbWVudSBzaG91bGQgYmUgZGlzYWJsZWQuICovXG4gIEBJbnB1dCgnY2RrQ29udGV4dE1lbnVEaXNhYmxlZCcpXG4gIGdldCBkaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqIEEgcmVmZXJlbmNlIHRvIHRoZSBvdmVybGF5IHdoaWNoIG1hbmFnZXMgdGhlIHRyaWdnZXJlZCBtZW51LiAqL1xuICBwcml2YXRlIF9vdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFRoZSBjb250ZW50IG9mIHRoZSBtZW51IHBhbmVsIG9wZW5lZCBieSB0aGlzIHRyaWdnZXIuICovXG4gIHByaXZhdGUgX3BhbmVsQ29udGVudDogVGVtcGxhdGVQb3J0YWw7XG5cbiAgLyoqIEVtaXRzIHdoZW4gdGhlIGVsZW1lbnQgaXMgZGVzdHJveWVkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKiBUaGUgbWVudSBzdGFjayBmb3IgdGhpcyB0cmlnZ2VyIGFuZCBpdHMgYXNzb2NpYXRlZCBtZW51cy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWVudVN0YWNrID0gbmV3IE1lbnVTdGFjaygpO1xuXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSBvdXRzaWRlIHBvaW50ZXIgZXZlbnRzIGxpc3RlbmVyIG9uIHRoZSBvdmVybGF5IHNob3VsZCBiZSBzdG9wcGVkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9zdG9wT3V0c2lkZUNsaWNrc0xpc3RlbmVyID0gbWVyZ2UodGhpcy5jbG9zZWQsIHRoaXMuX2Rlc3Ryb3llZCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX292ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dE1lbnVUcmFja2VyOiBDb250ZXh0TWVudVRyYWNrZXIsXG4gICAgQEluamVjdChDREtfQ09OVEVYVF9NRU5VX0RFRkFVTFRfT1BUSU9OUykgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uczogQ29udGV4dE1lbnVPcHRpb25zLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgX2RpcmVjdGlvbmFsaXR5PzogRGlyZWN0aW9uYWxpdHlcbiAgKSB7XG4gICAgdGhpcy5fc2V0TWVudVN0YWNrTGlzdGVuZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBhdHRhY2hlZCBtZW51IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uXG4gICAqIEBwYXJhbSBjb29yZGluYXRlcyB3aGVyZSB0byBvcGVuIHRoZSBjb250ZXh0IG1lbnVcbiAgICovXG4gIG9wZW4oY29vcmRpbmF0ZXM6IENvbnRleHRNZW51Q29vcmRpbmF0ZXMpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgLy8gc2luY2Ugd2UncmUgbW92aW5nIHRoaXMgbWVudSB3ZSBuZWVkIHRvIGNsb3NlIGFueSBzdWJtZW51cyBmaXJzdCBvdGhlcndpc2UgdGhleSBlbmQgdXBcbiAgICAgIC8vIGRpc2Nvbm5lY3RlZCBmcm9tIHRoaXMgb25lLlxuICAgICAgdGhpcy5fbWVudVN0YWNrLmNsb3NlU3ViTWVudU9mKHRoaXMuX21lbnVQYW5lbC5fbWVudSEpO1xuXG4gICAgICAodGhpcy5fb3ZlcmxheVJlZiEuZ2V0Q29uZmlnKClcbiAgICAgICAgLnBvc2l0aW9uU3RyYXRlZ3kgYXMgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5KS5zZXRPcmlnaW4oY29vcmRpbmF0ZXMpO1xuICAgICAgdGhpcy5fb3ZlcmxheVJlZiEudXBkYXRlUG9zaXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuZWQubmV4dCgpO1xuXG4gICAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikge1xuICAgICAgICAodGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKVxuICAgICAgICAgIC5wb3NpdGlvblN0cmF0ZWd5IGFzIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSkuc2V0T3JpZ2luKGNvb3JkaW5hdGVzKTtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IHRoaXMuX292ZXJsYXkuY3JlYXRlKHRoaXMuX2dldE92ZXJsYXlDb25maWcoY29vcmRpbmF0ZXMpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb3ZlcmxheVJlZi5hdHRhY2godGhpcy5fZ2V0TWVudUNvbnRlbnQoKSk7XG4gICAgICB0aGlzLl9zdWJzY3JpYmVUb091dHNpZGVDbGlja3MoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2xvc2UgdGhlIG9wZW5lZCBtZW51LiAqL1xuICBjbG9zZSgpIHtcbiAgICB0aGlzLl9tZW51U3RhY2suY2xvc2VBbGwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBjb250ZXh0IG1lbnUgYW5kIGNsb3NlIGFueSBwcmV2aW91c2x5IG9wZW4gbWVudXMuXG4gICAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgd2hpY2ggb3BlbnMgdGhlIGNvbnRleHQgbWVudS5cbiAgICovXG4gIF9vcGVuT25Db250ZXh0TWVudShldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgLy8gUHJldmVudCB0aGUgbmF0aXZlIGNvbnRleHQgbWVudSBmcm9tIG9wZW5pbmcgYmVjYXVzZSB3ZSdyZSBvcGVuaW5nIGEgY3VzdG9tIG9uZS5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIC8vIFN0b3AgZXZlbnQgcHJvcGFnYXRpb24gdG8gZW5zdXJlIHRoYXQgb25seSB0aGUgY2xvc2VzdCBlbmFibGVkIGNvbnRleHQgbWVudSBvcGVucy5cbiAgICAgIC8vIE90aGVyd2lzZSwgYW55IGNvbnRleHQgbWVudXMgYXR0YWNoZWQgdG8gY29udGFpbmluZyBlbGVtZW50cyB3b3VsZCAqYWxzbyogb3BlbixcbiAgICAgIC8vIHJlc3VsdGluZyBpbiBtdWx0aXBsZSBzdGFja2VkIGNvbnRleHQgbWVudXMgYmVpbmcgZGlzcGxheWVkLlxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIHRoaXMuX2NvbnRleHRNZW51VHJhY2tlci51cGRhdGUodGhpcyk7XG4gICAgICB0aGlzLm9wZW4oe3g6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFl9KTtcblxuICAgICAgLy8gQSBjb250ZXh0IG1lbnUgY2FuIGJlIHRyaWdnZXJlZCB2aWEgYSBtb3VzZSByaWdodCBjbGljayBvciBhIGtleWJvYXJkIHNob3J0Y3V0LlxuICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMikge1xuICAgICAgICB0aGlzLl9tZW51UGFuZWwuX21lbnU/LmZvY3VzRmlyc3RJdGVtKCdtb3VzZScpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5idXR0b24gPT09IDApIHtcbiAgICAgICAgdGhpcy5fbWVudVBhbmVsLl9tZW51Py5mb2N1c0ZpcnN0SXRlbSgna2V5Ym9hcmQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX21lbnVQYW5lbC5fbWVudT8uZm9jdXNGaXJzdEl0ZW0oJ3Byb2dyYW0nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgYXR0YWNoZWQgbWVudSBpcyBvcGVuLiAqL1xuICBpc09wZW4oKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fb3ZlcmxheVJlZj8uaGFzQXR0YWNoZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBvdmVybGF5LlxuICAgKiBAcGFyYW0gY29vcmRpbmF0ZXMgdGhlIGxvY2F0aW9uIHRvIHBsYWNlIHRoZSBvcGVuZWQgbWVudVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0T3ZlcmxheUNvbmZpZyhjb29yZGluYXRlczogQ29udGV4dE1lbnVDb29yZGluYXRlcykge1xuICAgIHJldHVybiBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLl9nZXRPdmVybGF5UG9zaXRpb25TdHJhdGVneShjb29yZGluYXRlcyksXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5fb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKCksXG4gICAgICBkaXJlY3Rpb246IHRoaXMuX2RpcmVjdGlvbmFsaXR5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBwb3NpdGlvbiBzdHJhdGVneSBmb3IgdGhlIG92ZXJsYXkgd2hpY2ggc3BlY2lmaWVzIHdoZXJlIHRvIHBsYWNlIHRoZSBtZW51LlxuICAgKiBAcGFyYW0gY29vcmRpbmF0ZXMgdGhlIGxvY2F0aW9uIHRvIHBsYWNlIHRoZSBvcGVuZWQgbWVudVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0T3ZlcmxheVBvc2l0aW9uU3RyYXRlZ3koXG4gICAgY29vcmRpbmF0ZXM6IENvbnRleHRNZW51Q29vcmRpbmF0ZXNcbiAgKTogRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5IHtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVxuICAgICAgLnBvc2l0aW9uKClcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKGNvb3JkaW5hdGVzKVxuICAgICAgLndpdGhEZWZhdWx0T2Zmc2V0WCh0aGlzLl9vcHRpb25zLm9mZnNldFgpXG4gICAgICAud2l0aERlZmF1bHRPZmZzZXRZKHRoaXMuX29wdGlvbnMub2Zmc2V0WSlcbiAgICAgIC53aXRoUG9zaXRpb25zKHRoaXMuX2dldE92ZXJsYXlQb3NpdGlvbnMoKSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGFuZCByZXR1cm4gd2hlcmUgdG8gcG9zaXRpb24gdGhlIG9wZW5lZCBtZW51IHJlbGF0aXZlIHRvIHRoZSBtb3VzZSBsb2NhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgX2dldE92ZXJsYXlQb3NpdGlvbnMoKTogQ29ubmVjdGVkUG9zaXRpb25bXSB7XG4gICAgLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgY29uZmlndXJhYmxlIHRocm91Z2ggdGhlIGluamVjdGVkIGNvbnRleHQgbWVudSBvcHRpb25zXG4gICAgcmV0dXJuIFtcbiAgICAgIHtvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ3RvcCd9LFxuICAgICAge29yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAndG9wJ30sXG4gICAgICB7b3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nfSxcbiAgICAgIHtvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2JvdHRvbSd9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBwb3J0YWwgdG8gYmUgYXR0YWNoZWQgdG8gdGhlIG92ZXJsYXkgd2hpY2ggY29udGFpbnMgdGhlIG1lbnUuIEFsbG93cyBmb3IgdGhlIG1lbnVcbiAgICogY29udGVudCB0byBjaGFuZ2UgZHluYW1pY2FsbHkgYW5kIGJlIHJlZmxlY3RlZCBpbiB0aGUgYXBwbGljYXRpb24uXG4gICAqL1xuICBwcml2YXRlIF9nZXRNZW51Q29udGVudCgpOiBQb3J0YWw8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhc01lbnVDb250ZW50Q2hhbmdlZCA9IHRoaXMubWVudVBhbmVsLl90ZW1wbGF0ZVJlZiAhPT0gdGhpcy5fcGFuZWxDb250ZW50Py50ZW1wbGF0ZVJlZjtcbiAgICBpZiAodGhpcy5tZW51UGFuZWwgJiYgKCF0aGlzLl9wYW5lbENvbnRlbnQgfHwgaGFzTWVudUNvbnRlbnRDaGFuZ2VkKSkge1xuICAgICAgdGhpcy5fcGFuZWxDb250ZW50ID0gbmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMubWVudVBhbmVsLl90ZW1wbGF0ZVJlZiwgdGhpcy5fdmlld0NvbnRhaW5lclJlZik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3BhbmVsQ29udGVudDtcbiAgfVxuXG4gIC8qKiBTdWJzY3JpYmUgdG8gdGhlIG1lbnUgc3RhY2sgY2xvc2UgZXZlbnRzIGFuZCBjbG9zZSB0aGlzIG1lbnUgd2hlbiByZXF1ZXN0ZWQuICovXG4gIHByaXZhdGUgX3NldE1lbnVTdGFja0xpc3RlbmVyKCkge1xuICAgIHRoaXMuX21lbnVTdGFjay5jbG9zZWQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0gPT09IHRoaXMuX21lbnVQYW5lbC5fbWVudSAmJiB0aGlzLmlzT3BlbigpKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVJlZiEuZGV0YWNoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIHRoZSBvdmVybGF5cyBvdXRzaWRlIHBvaW50ZXIgZXZlbnRzIHN0cmVhbSBhbmQgaGFuZGxlIGNsb3Npbmcgb3V0IHRoZSBzdGFjayBpZiBhXG4gICAqIGNsaWNrIG9jY3VycyBvdXRzaWRlIHRoZSBtZW51cy5cbiAgICovXG4gIHByaXZhdGUgX3N1YnNjcmliZVRvT3V0c2lkZUNsaWNrcygpIHtcbiAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikge1xuICAgICAgdGhpcy5fb3ZlcmxheVJlZlxuICAgICAgICAub3V0c2lkZVBvaW50ZXJFdmVudHMoKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fc3RvcE91dHNpZGVDbGlja3NMaXN0ZW5lcikpXG4gICAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgIGlmICghaXNDbGlja0luc2lkZU1lbnVPdmVybGF5KGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5fbWVudVN0YWNrLmNsb3NlQWxsKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95T3ZlcmxheSgpO1xuICAgIHRoaXMuX3Jlc2V0UGFuZWxNZW51U3RhY2soKTtcblxuICAgIHRoaXMuX2Rlc3Ryb3llZC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKiogRGVzdHJveSBhbmQgdW5zZXQgdGhlIG92ZXJsYXkgcmVmZXJlbmNlIGl0IGlmIGV4aXN0cy4gKi9cbiAgcHJpdmF0ZSBfZGVzdHJveU92ZXJsYXkoKSB7XG4gICAgaWYgKHRoaXMuX292ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldCB0aGUgbWVudSBwYW5lbHMgbWVudSBzdGFjayBiYWNrIHRvIG51bGwuICovXG4gIHByaXZhdGUgX3Jlc2V0UGFuZWxNZW51U3RhY2soKSB7XG4gICAgLy8gSWYgYSBDb250ZXh0TWVudVRyaWdnZXIgaXMgcGxhY2VkIGluIGEgY29uZGl0aW9uYWxseSByZW5kZXJlZCB2aWV3LCBlYWNoIHRpbWUgdGhlIHRyaWdnZXIgaXNcbiAgICAvLyByZW5kZXJlZCB0aGUgcGFuZWwgc2V0dGVyIGZvciBDb250ZXh0TWVudVRyaWdnZXIgaXMgY2FsbGVkLiBGcm9tIHRoZSBmaXJzdCByZW5kZXIgb253YXJkLFxuICAgIC8vIHRoZSBhdHRhY2hlZCBDZGtNZW51UGFuZWwgaGFzIHRoZSBNZW51U3RhY2sgc2V0LiBTaW5jZSB3ZSB0aHJvdyBhbiBlcnJvciBpZiBhIHBhbmVsIGFscmVhZHlcbiAgICAvLyBoYXMgYSBzdGFjayBzZXQsIHdlIHdhbnQgdG8gcmVzZXQgdGhlIGF0dGFjaGVkIHN0YWNrIGhlcmUgdG8gcHJldmVudCB0aGUgZXJyb3IgZnJvbSBiZWluZ1xuICAgIC8vIHRocm93biBpZiB0aGUgdHJpZ2dlciByZS1jb25maWd1cmVzIGl0cyBhdHRhY2hlZCBwYW5lbCAoaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgYSAxOjFcbiAgICAvLyByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgcGFuZWwgYW5kIHRyaWdnZXIpLlxuICAgIGlmICh0aGlzLl9tZW51UGFuZWwpIHtcbiAgICAgIHRoaXMuX21lbnVQYW5lbC5fbWVudVN0YWNrID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZWQ6IEJvb2xlYW5JbnB1dDtcbn1cbiJdfQ==
@@ -1,6 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- export { CdkMenuItemSelectable as ɵangular_material_src_cdk_experimental_menu_menu_b } from './menu-item-selectable';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2RrLWV4cGVyaW1lbnRhbC9tZW51L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUM7QUFHN0IsT0FBTyxFQUFDLHFCQUFxQixJQUFJLGtEQUFrRCxFQUFDLE1BQU0sd0JBQXdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG5cbmV4cG9ydCB7TWVudSBhcyDJtWFuZ3VsYXJfbWF0ZXJpYWxfc3JjX2Nka19leHBlcmltZW50YWxfbWVudV9tZW51X2F9IGZyb20gJy4vbWVudS1pbnRlcmZhY2UnO1xuZXhwb3J0IHtDZGtNZW51SXRlbVNlbGVjdGFibGUgYXMgybVhbmd1bGFyX21hdGVyaWFsX3NyY19jZGtfZXhwZXJpbWVudGFsX21lbnVfbWVudV9ifSBmcm9tICcuL21lbnUtaXRlbS1zZWxlY3RhYmxlJzsiXX0=
@@ -1,195 +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 { Injectable, NgZone, InjectionToken, Directive } from '@angular/core';
9
- import { fromEvent, Subject } from 'rxjs';
10
- import { takeUntil, filter } from 'rxjs/operators';
11
- import { throwMissingPointerFocusTracker, throwMissingMenuReference } from './menu-errors';
12
- /** Injection token used for an implementation of MenuAim. */
13
- export const MENU_AIM = new InjectionToken('cdk-menu-aim');
14
- /** Capture every nth mouse move event. */
15
- const MOUSE_MOVE_SAMPLE_FREQUENCY = 3;
16
- /** The number of mouse move events to track. */
17
- const NUM_POINTS = 5;
18
- /**
19
- * How long to wait before closing a sibling menu if a user stops short of the submenu they were
20
- * predicted to go into.
21
- */
22
- const CLOSE_DELAY = 300;
23
- /** Calculate the slope between point a and b. */
24
- function getSlope(a, b) {
25
- return (b.y - a.y) / (b.x - a.x);
26
- }
27
- /** Calculate the y intercept for the given point and slope. */
28
- function getYIntercept(point, slope) {
29
- return point.y - slope * point.x;
30
- }
31
- /**
32
- * Whether the given mouse trajectory line defined by the slope and y intercept falls within the
33
- * submenu as defined by `submenuPoints`
34
- * @param submenuPoints the submenu DOMRect points.
35
- * @param m the slope of the trajectory line.
36
- * @param b the y intercept of the trajectory line.
37
- *
38
- * @return true if any point on the line falls within the submenu.
39
- */
40
- function isWithinSubmenu(submenuPoints, m, b) {
41
- const { left, right, top, bottom } = submenuPoints;
42
- // Check for intersection with each edge of the submenu (left, right, top, bottom)
43
- // by fixing one coordinate to that edge's coordinate (either x or y) and checking if the
44
- // other coordinate is within bounds.
45
- return ((m * left + b >= top && m * left + b <= bottom) ||
46
- (m * right + b >= top && m * right + b <= bottom) ||
47
- ((top - b) / m >= left && (top - b) / m <= right) ||
48
- ((bottom - b) / m >= left && (bottom - b) / m <= right));
49
- }
50
- /**
51
- * TargetMenuAim predicts if a user is moving into a submenu. It calculates the
52
- * trajectory of the user's mouse movement in the current menu to determine if the
53
- * mouse is moving towards an open submenu.
54
- *
55
- * The determination is made by calculating the slope of the users last NUM_POINTS moves where each
56
- * pair of points determines if the trajectory line points into the submenu. It uses consensus
57
- * approach by checking if at least NUM_POINTS / 2 pairs determine that the user is moving towards
58
- * to submenu.
59
- */
60
- export class TargetMenuAim {
61
- constructor(_ngZone) {
62
- this._ngZone = _ngZone;
63
- /** The last NUM_POINTS mouse move events. */
64
- this._points = [];
65
- /** Emits when this service is destroyed. */
66
- this._destroyed = new Subject();
67
- }
68
- /** Set the Menu and its PointerFocusTracker. */
69
- initialize(menu, pointerTracker) {
70
- this._menu = menu;
71
- this._pointerTracker = pointerTracker;
72
- this._subscribeToMouseMoves();
73
- }
74
- /**
75
- * Calls the `doToggle` callback when it is deemed that the user is not moving towards
76
- * the submenu.
77
- * @param doToggle the function called when the user is not moving towards the submenu.
78
- */
79
- toggle(doToggle) {
80
- // If the menu is horizontal the sub-menus open below and there is no risk of premature
81
- // closing of any sub-menus therefore we automatically resolve the callback.
82
- if (this._menu.orientation === 'horizontal') {
83
- doToggle();
84
- }
85
- this._checkConfigured();
86
- const siblingItemIsWaiting = !!this._timeoutId;
87
- const hasPoints = this._points.length > 1;
88
- if (hasPoints && !siblingItemIsWaiting) {
89
- if (this._isMovingToSubmenu()) {
90
- this._startTimeout(doToggle);
91
- }
92
- else {
93
- doToggle();
94
- }
95
- }
96
- else if (!siblingItemIsWaiting) {
97
- doToggle();
98
- }
99
- }
100
- /**
101
- * Start the delayed toggle handler if one isn't running already.
102
- *
103
- * The delayed toggle handler executes the `doToggle` callback after some period of time iff the
104
- * users mouse is on an item in the current menu.
105
- */
106
- _startTimeout(doToggle) {
107
- // If the users mouse is moving towards a submenu we don't want to immediately resolve.
108
- // Wait for some period of time before determining if the previous menu should close in
109
- // cases where the user may have moved towards the submenu but stopped on a sibling menu
110
- // item intentionally.
111
- const timeoutId = setTimeout(() => {
112
- // Resolve if the user is currently moused over some element in the root menu
113
- if (this._pointerTracker.activeElement && timeoutId === this._timeoutId) {
114
- doToggle();
115
- }
116
- this._timeoutId = null;
117
- }, CLOSE_DELAY);
118
- this._timeoutId = timeoutId;
119
- }
120
- /** Whether the user is heading towards the open submenu. */
121
- _isMovingToSubmenu() {
122
- const submenuPoints = this._getSubmenuBounds();
123
- if (!submenuPoints) {
124
- return false;
125
- }
126
- let numMoving = 0;
127
- const currPoint = this._points[this._points.length - 1];
128
- // start from the second last point and calculate the slope between each point and the last
129
- // point.
130
- for (let i = this._points.length - 2; i >= 0; i--) {
131
- const previous = this._points[i];
132
- const slope = getSlope(currPoint, previous);
133
- if (isWithinSubmenu(submenuPoints, slope, getYIntercept(currPoint, slope))) {
134
- numMoving++;
135
- }
136
- }
137
- return numMoving >= Math.floor(NUM_POINTS / 2);
138
- }
139
- /** Get the bounding DOMRect for the open submenu. */
140
- _getSubmenuBounds() {
141
- var _a, _b, _c;
142
- return (_c = (_b = (_a = this._pointerTracker) === null || _a === void 0 ? void 0 : _a.previousElement) === null || _b === void 0 ? void 0 : _b.getMenu()) === null || _c === void 0 ? void 0 : _c._elementRef.nativeElement.getBoundingClientRect();
143
- }
144
- /**
145
- * Check if a reference to the PointerFocusTracker and menu element is provided.
146
- * @throws an error if neither reference is provided.
147
- */
148
- _checkConfigured() {
149
- if (typeof ngDevMode === 'undefined' || ngDevMode) {
150
- if (!this._pointerTracker) {
151
- throwMissingPointerFocusTracker();
152
- }
153
- if (!this._menu) {
154
- throwMissingMenuReference();
155
- }
156
- }
157
- }
158
- /** Subscribe to the root menus mouse move events and update the tracked mouse points. */
159
- _subscribeToMouseMoves() {
160
- this._ngZone.runOutsideAngular(() => {
161
- fromEvent(this._menu._elementRef.nativeElement, 'mousemove')
162
- .pipe(filter((_, index) => index % MOUSE_MOVE_SAMPLE_FREQUENCY === 0), takeUntil(this._destroyed))
163
- .subscribe((event) => {
164
- this._points.push({ x: event.clientX, y: event.clientY });
165
- if (this._points.length > NUM_POINTS) {
166
- this._points.shift();
167
- }
168
- });
169
- });
170
- }
171
- ngOnDestroy() {
172
- this._destroyed.next();
173
- this._destroyed.complete();
174
- }
175
- }
176
- TargetMenuAim.decorators = [
177
- { type: Injectable }
178
- ];
179
- TargetMenuAim.ctorParameters = () => [
180
- { type: NgZone }
181
- ];
182
- /**
183
- * CdkTargetMenuAim is a provider for the TargetMenuAim service. It should be added to an
184
- * element with either the `cdkMenu` or `cdkMenuBar` directive and child menu items.
185
- */
186
- export class CdkTargetMenuAim {
187
- }
188
- CdkTargetMenuAim.decorators = [
189
- { type: Directive, args: [{
190
- selector: '[cdkTargetMenuAim]',
191
- exportAs: 'cdkTargetMenuAim',
192
- providers: [{ provide: MENU_AIM, useClass: TargetMenuAim }],
193
- },] }
194
- ];
195
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1haW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2RrLWV4cGVyaW1lbnRhbC9tZW51L21lbnUtYWltLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFhLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkYsT0FBTyxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUdqRCxPQUFPLEVBQUMsK0JBQStCLEVBQUUseUJBQXlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFtQnpGLDZEQUE2RDtBQUM3RCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxjQUFjLENBQVUsY0FBYyxDQUFDLENBQUM7QUFFcEUsMENBQTBDO0FBQzFDLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFDO0FBRXRDLGdEQUFnRDtBQUNoRCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFckI7OztHQUdHO0FBQ0gsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBVXhCLGlEQUFpRDtBQUNqRCxTQUFTLFFBQVEsQ0FBQyxDQUFRLEVBQUUsQ0FBUTtJQUNsQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELFNBQVMsYUFBYSxDQUFDLEtBQVksRUFBRSxLQUFhO0lBQ2hELE9BQU8sS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBS0Q7Ozs7Ozs7O0dB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b0JBQW9CO2dCQUM5QixRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixTQUFTLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBQyxDQUFDO2FBQzFEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7SW5qZWN0YWJsZSwgTmdab25lLCBPbkRlc3Ryb3ksIEluamVjdGlvblRva2VuLCBEaXJlY3RpdmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtmcm9tRXZlbnQsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHt0YWtlVW50aWwsIGZpbHRlcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtQb2ludGVyRm9jdXNUcmFja2VyLCBGb2N1c2FibGVFbGVtZW50fSBmcm9tICcuL3BvaW50ZXItZm9jdXMtdHJhY2tlcic7XG5pbXBvcnQge01lbnV9IGZyb20gJy4vbWVudS1pbnRlcmZhY2UnO1xuaW1wb3J0IHt0aHJvd01pc3NpbmdQb2ludGVyRm9jdXNUcmFja2VyLCB0aHJvd01pc3NpbmdNZW51UmVmZXJlbmNlfSBmcm9tICcuL21lbnUtZXJyb3JzJztcblxuLyoqXG4gKiBNZW51QWltIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyBpZiBhIHNpYmxpbmcgbWVudWl0ZW0ncyBtZW51IHNob3VsZCBiZSBjbG9zZWQgd2hlbiBhXG4gKiBUb2dnbGVyIGl0ZW0gaXMgaG92ZXJlZCBpbnRvLiBJdCBpcyB1cCB0byB0aGUgaG92ZXJlZCBpbiBpdGVtIHRvIGNhbGwgdGhlIE1lbnVBaW0gc2VydmljZSBpblxuICogb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIGl0IG1heSBwZXJmb3JtIGl0cyBjbG9zZSBhY3Rpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVBaW0ge1xuICAvKiogU2V0IHRoZSBNZW51IGFuZCBpdHMgUG9pbnRlckZvY3VzVHJhY2tlci4gKi9cbiAgaW5pdGlhbGl6ZShtZW51OiBNZW51LCBwb2ludGVyVHJhY2tlcjogUG9pbnRlckZvY3VzVHJhY2tlcjxGb2N1c2FibGVFbGVtZW50ICYgVG9nZ2xlcj4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxscyB0aGUgYGRvVG9nZ2xlYCBjYWxsYmFjayB3aGVuIGl0IGlzIGRlZW1lZCB0aGF0IHRoZSB1c2VyIGlzIG5vdCBtb3ZpbmcgdG93YXJkc1xuICAgKiB0aGUgc3VibWVudS5cbiAgICogQHBhcmFtIGRvVG9nZ2xlIHRoZSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgdXNlciBpcyBub3QgbW92aW5nIHRvd2FyZHMgdGhlIHN1Ym1lbnUuXG4gICAqL1xuICB0b2dnbGUoZG9Ub2dnbGU6ICgpID0+IHZvaWQpOiB2b2lkO1xufVxuXG4vKiogSW5qZWN0aW9uIHRva2VuIHVzZWQgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9mIE1lbnVBaW0uICovXG5leHBvcnQgY29uc3QgTUVOVV9BSU0gPSBuZXcgSW5qZWN0aW9uVG9rZW48TWVudUFpbT4oJ2Nkay1tZW51LWFpbScpO1xuXG4vKiogQ2FwdHVyZSBldmVyeSBudGggbW91c2UgbW92ZSBldmVudC4gKi9cbmNvbnN0IE1PVVNFX01PVkVfU0FNUExFX0ZSRVFVRU5DWSA9IDM7XG5cbi8qKiBUaGUgbnVtYmVyIG9mIG1vdXNlIG1vdmUgZXZlbnRzIHRvIHRyYWNrLiAqL1xuY29uc3QgTlVNX1BPSU5UUyA9IDU7XG5cbi8qKlxuICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgY2xvc2luZyBhIHNpYmxpbmcgbWVudSBpZiBhIHVzZXIgc3RvcHMgc2hvcnQgb2YgdGhlIHN1Ym1lbnUgdGhleSB3ZXJlXG4gKiBwcmVkaWN0ZWQgdG8gZ28gaW50by5cbiAqL1xuY29uc3QgQ0xPU0VfREVMQVkgPSAzMDA7XG5cbi8qKlxuICogQW4gZWxlbWVudCB3aGljaCB3aGVuIGhvdmVyZWQgb3ZlciBtYXkgcGVyZm9ybSBjbG9zaW5nIGFjdGlvbnMgb24gdGhlIG9wZW4gc3VibWVudSBhbmRcbiAqIHBvdGVudGlhbGx5IG9wZW4gaXRzIG93biBtZW51LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvZ2dsZXIge1xuICBnZXRNZW51KCk6IE1lbnUgfCB1bmRlZmluZWQ7XG59XG5cbi8qKiBDYWxjdWxhdGUgdGhlIHNsb3BlIGJldHdlZW4gcG9pbnQgYSBhbmQgYi4gKi9cbmZ1bmN0aW9uIGdldFNsb3BlKGE6IFBvaW50LCBiOiBQb2ludCkge1xuICByZXR1cm4gKGIueSAtIGEueSkgLyAoYi54IC0gYS54KTtcbn1cblxuLyoqIENhbGN1bGF0ZSB0aGUgeSBpbnRlcmNlcHQgZm9yIHRoZSBnaXZlbiBwb2ludCBhbmQgc2xvcGUuICovXG5mdW5jdGlvbiBnZXRZSW50ZXJjZXB0KHBvaW50OiBQb2ludCwgc2xvcGU6IG51bWJlcikge1xuICByZXR1cm4gcG9pbnQueSAtIHNsb3BlICogcG9pbnQueDtcbn1cblxuLyoqIFJlcHJlc2VudHMgYSBjb29yZGluYXRlIG9mIG1vdXNlIHRyYXZlbC4gKi9cbnR5cGUgUG9pbnQgPSB7eDogbnVtYmVyOyB5OiBudW1iZXJ9O1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGdpdmVuIG1vdXNlIHRyYWplY3RvcnkgbGluZSBkZWZpbmVkIGJ5IHRoZSBzbG9wZSBhbmQgeSBpbnRlcmNlcHQgZmFsbHMgd2l0aGluIHRoZVxuICogc3VibWVudSBhcyBkZWZpbmVkIGJ5IGBzdWJtZW51UG9pbnRzYFxuICogQHBhcmFtIHN1Ym1lbnVQb2ludHMgdGhlIHN1Ym1lbnUgRE9NUmVjdCBwb2ludHMuXG4gKiBAcGFyYW0gbSB0aGUgc2xvcGUgb2YgdGhlIHRyYWplY3RvcnkgbGluZS5cbiAqIEBwYXJhbSBiIHRoZSB5IGludGVyY2VwdCBvZiB0aGUgdHJhamVjdG9yeSBsaW5lLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgcG9pbnQgb24gdGhlIGxpbmUgZmFsbHMgd2l0aGluIHRoZSBzdWJtZW51LlxuICovXG5mdW5jdGlvbiBpc1dpdGhpblN1Ym1lbnUoc3VibWVudVBvaW50czogRE9NUmVjdCwgbTogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgY29uc3Qge2xlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbX0gPSBzdWJtZW51UG9pbnRzO1xuXG4gIC8vIENoZWNrIGZvciBpbnRlcnNlY3Rpb24gd2l0aCBlYWNoIGVkZ2Ugb2YgdGhlIHN1Ym1lbnUgKGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSlcbiAgLy8gYnkgZml4aW5nIG9uZSBjb29yZGluYXRlIHRvIHRoYXQgZWRnZSdzIGNvb3JkaW5hdGUgKGVpdGhlciB4IG9yIHkpIGFuZCBjaGVja2luZyBpZiB0aGVcbiAgLy8gb3RoZXIgY29vcmRpbmF0ZSBpcyB3aXRoaW4gYm91bmRzLlxuICByZXR1cm4gKFxuICAgIChtICogbGVmdCArIGIgPj0gdG9wICYmIG0gKiBsZWZ0ICsgYiA8PSBib3R0b20pIHx8XG4gICAgKG0gKiByaWdodCArIGIgPj0gdG9wICYmIG0gKiByaWdodCArIGIgPD0gYm90dG9tKSB8fFxuICAgICgodG9wIC0gYikgLyBtID49IGxlZnQgJiYgKHRvcCAtIGIpIC8gbSA8PSByaWdodCkgfHxcbiAgICAoKGJvdHRvbSAtIGIpIC8gbSA+PSBsZWZ0ICYmIChib3R0b20gLSBiKSAvIG0gPD0gcmlnaHQpXG4gICk7XG59XG4vKipcbiAqIFRhcmdldE1lbnVBaW0gcHJlZGljdHMgaWYgYSB1c2VyIGlzIG1vdmluZyBpbnRvIGEgc3VibWVudS4gSXQgY2FsY3VsYXRlcyB0aGVcbiAqIHRyYWplY3Rvcnkgb2YgdGhlIHVzZXIncyBtb3VzZSBtb3ZlbWVudCBpbiB0aGUgY3VycmVudCBtZW51IHRvIGRldGVybWluZSBpZiB0aGVcbiAqIG1vdXNlIGlzIG1vdmluZyB0b3dhcmRzIGFuIG9wZW4gc3VibWVudS5cbiAqXG4gKiBUaGUgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlIGJ5IGNhbGN1bGF0aW5nIHRoZSBzbG9wZSBvZiB0aGUgdXNlcnMgbGFzdCBOVU1fUE9JTlRTIG1vdmVzIHdoZXJlIGVhY2hcbiAqIHBhaXIgb2YgcG9pbnRzIGRldGVybWluZXMgaWYgdGhlIHRyYWplY3RvcnkgbGluZSBwb2ludHMgaW50byB0aGUgc3VibWVudS4gSXQgdXNlcyBjb25zZW5zdXNcbiAqIGFwcHJvYWNoIGJ5IGNoZWNraW5nIGlmIGF0IGxlYXN0IE5VTV9QT0lOVFMgLyAyIHBhaXJzIGRldGVybWluZSB0aGF0IHRoZSB1c2VyIGlzIG1vdmluZyB0b3dhcmRzXG4gKiB0byBzdWJtZW51LlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGFyZ2V0TWVudUFpbSBpbXBsZW1lbnRzIE1lbnVBaW0sIE9uRGVzdHJveSB7XG4gIC8qKiBUaGUgbGFzdCBOVU1fUE9JTlRTIG1vdXNlIG1vdmUgZXZlbnRzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9wb2ludHM6IFBvaW50W10gPSBbXTtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSByb290IG1lbnUgaW4gd2hpY2ggd2UgYXJlIHRyYWNraW5nIG1vdXNlIG1vdmVzLiAqL1xuICBwcml2YXRlIF9tZW51OiBNZW51O1xuXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIHJvb3QgbWVudSdzIG1vdXNlIG1hbmFnZXIuICovXG4gIHByaXZhdGUgX3BvaW50ZXJUcmFja2VyOiBQb2ludGVyRm9jdXNUcmFja2VyPFRvZ2dsZXIgJiBGb2N1c2FibGVFbGVtZW50PjtcblxuICAvKiogVGhlIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCB0aW1lb3V0IGNhbGwgd2FpdGluZyB0byByZXNvbHZlLiAqL1xuICBwcml2YXRlIF90aW1lb3V0SWQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqIEVtaXRzIHdoZW4gdGhpcyBzZXJ2aWNlIGlzIGRlc3Ryb3llZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveWVkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9uZ1pvbmU6IE5nWm9uZSkge31cblxuICAvKiogU2V0IHRoZSBNZW51IGFuZCBpdHMgUG9pbnRlckZvY3VzVHJhY2tlci4gKi9cbiAgaW5pdGlhbGl6ZShtZW51OiBNZW51LCBwb2ludGVyVHJhY2tlcjogUG9pbnRlckZvY3VzVHJhY2tlcjxGb2N1c2FibGVFbGVtZW50ICYgVG9nZ2xlcj4pIHtcbiAgICB0aGlzLl9tZW51ID0gbWVudTtcbiAgICB0aGlzLl9wb2ludGVyVHJhY2tlciA9IHBvaW50ZXJUcmFja2VyO1xuICAgIHRoaXMuX3N1YnNjcmliZVRvTW91c2VNb3ZlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSBgZG9Ub2dnbGVgIGNhbGxiYWNrIHdoZW4gaXQgaXMgZGVlbWVkIHRoYXQgdGhlIHVzZXIgaXMgbm90IG1vdmluZyB0b3dhcmRzXG4gICAqIHRoZSBzdWJtZW51LlxuICAgKiBAcGFyYW0gZG9Ub2dnbGUgdGhlIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGlzIG5vdCBtb3ZpbmcgdG93YXJkcyB0aGUgc3VibWVudS5cbiAgICovXG4gIHRvZ2dsZShkb1RvZ2dsZTogKCkgPT4gdm9pZCkge1xuICAgIC8vIElmIHRoZSBtZW51IGlzIGhvcml6b250YWwgdGhlIHN1Yi1tZW51cyBvcGVuIGJlbG93IGFuZCB0aGVyZSBpcyBubyByaXNrIG9mIHByZW1hdHVyZVxuICAgIC8vIGNsb3Npbmcgb2YgYW55IHN1Yi1tZW51cyB0aGVyZWZvcmUgd2UgYXV0b21hdGljYWxseSByZXNvbHZlIHRoZSBjYWxsYmFjay5cbiAgICBpZiAodGhpcy5fbWVudS5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICBkb1RvZ2dsZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX2NoZWNrQ29uZmlndXJlZCgpO1xuXG4gICAgY29uc3Qgc2libGluZ0l0ZW1Jc1dhaXRpbmcgPSAhIXRoaXMuX3RpbWVvdXRJZDtcbiAgICBjb25zdCBoYXNQb2ludHMgPSB0aGlzLl9wb2ludHMubGVuZ3RoID4gMTtcblxuICAgIGlmIChoYXNQb2ludHMgJiYgIXNpYmxpbmdJdGVtSXNXYWl0aW5nKSB7XG4gICAgICBpZiAodGhpcy5faXNNb3ZpbmdUb1N1Ym1lbnUoKSkge1xuICAgICAgICB0aGlzLl9zdGFydFRpbWVvdXQoZG9Ub2dnbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Ub2dnbGUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFzaWJsaW5nSXRlbUlzV2FpdGluZykge1xuICAgICAgZG9Ub2dnbGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdGhlIGRlbGF5ZWQgdG9nZ2xlIGhhbmRsZXIgaWYgb25lIGlzbid0IHJ1bm5pbmcgYWxyZWFkeS5cbiAgICpcbiAgICogVGhlIGRlbGF5ZWQgdG9nZ2xlIGhhbmRsZXIgZXhlY3V0ZXMgdGhlIGBkb1RvZ2dsZWAgY2FsbGJhY2sgYWZ0ZXIgc29tZSBwZXJpb2Qgb2YgdGltZSBpZmYgdGhlXG4gICAqIHVzZXJzIG1vdXNlIGlzIG9uIGFuIGl0ZW0gaW4gdGhlIGN1cnJlbnQgbWVudS5cbiAgICovXG4gIHByaXZhdGUgX3N0YXJ0VGltZW91dChkb1RvZ2dsZTogKCkgPT4gdm9pZCkge1xuICAgIC8vIElmIHRoZSB1c2VycyBtb3VzZSBpcyBtb3ZpbmcgdG93YXJkcyBhIHN1Ym1lbnUgd2UgZG9uJ3Qgd2FudCB0byBpbW1lZGlhdGVseSByZXNvbHZlLlxuICAgIC8vIFdhaXQgZm9yIHNvbWUgcGVyaW9kIG9mIHRpbWUgYmVmb3JlIGRldGVybWluaW5nIGlmIHRoZSBwcmV2aW91cyBtZW51IHNob3VsZCBjbG9zZSBpblxuICAgIC8vIGNhc2VzIHdoZXJlIHRoZSB1c2VyIG1heSBoYXZlIG1vdmVkIHRvd2FyZHMgdGhlIHN1Ym1lbnUgYnV0IHN0b3BwZWQgb24gYSBzaWJsaW5nIG1lbnVcbiAgICAvLyBpdGVtIGludGVudGlvbmFsbHkuXG4gICAgY29uc3QgdGltZW91dElkID0gKHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gUmVzb2x2ZSBpZiB0aGUgdXNlciBpcyBjdXJyZW50bHkgbW91c2VkIG92ZXIgc29tZSBlbGVtZW50IGluIHRoZSByb290IG1lbnVcbiAgICAgIGlmICh0aGlzLl9wb2ludGVyVHJhY2tlciEuYWN0aXZlRWxlbWVudCAmJiB0aW1lb3V0SWQgPT09IHRoaXMuX3RpbWVvdXRJZCkge1xuICAgICAgICBkb1RvZ2dsZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fdGltZW91dElkID0gbnVsbDtcbiAgICB9LCBDTE9TRV9ERUxBWSkgYXMgYW55KSBhcyBudW1iZXI7XG5cbiAgICB0aGlzLl90aW1lb3V0SWQgPSB0aW1lb3V0SWQ7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgdXNlciBpcyBoZWFkaW5nIHRvd2FyZHMgdGhlIG9wZW4gc3VibWVudS4gKi9cbiAgcHJpdmF0ZSBfaXNNb3ZpbmdUb1N1Ym1lbnUoKSB7XG4gICAgY29uc3Qgc3VibWVudVBvaW50cyA9IHRoaXMuX2dldFN1Ym1lbnVCb3VuZHMoKTtcbiAgICBpZiAoIXN1Ym1lbnVQb2ludHMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgbnVtTW92aW5nID0gMDtcbiAgICBjb25zdCBjdXJyUG9pbnQgPSB0aGlzLl9wb2ludHNbdGhpcy5fcG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgIC8vIHN0YXJ0IGZyb20gdGhlIHNlY29uZCBsYXN0IHBvaW50IGFuZCBjYWxjdWxhdGUgdGhlIHNsb3BlIGJldHdlZW4gZWFjaCBwb2ludCBhbmQgdGhlIGxhc3RcbiAgICAvLyBwb2ludC5cbiAgICBmb3IgKGxldCBpID0gdGhpcy5fcG9pbnRzLmxlbmd0aCAtIDI7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuX3BvaW50c1tpXTtcbiAgICAgIGNvbnN0IHNsb3BlID0gZ2V0U2xvcGUoY3VyclBvaW50LCBwcmV2aW91cyk7XG4gICAgICBpZiAoaXNXaXRoaW5TdWJtZW51KHN1Ym1lbnVQb2ludHMsIHNsb3BlLCBnZXRZSW50ZXJjZXB0KGN1cnJQb2ludCwgc2xvcGUpKSkge1xuICAgICAgICBudW1Nb3ZpbmcrKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bU1vdmluZyA+PSBNYXRoLmZsb29yKE5VTV9QT0lOVFMgLyAyKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGJvdW5kaW5nIERPTVJlY3QgZm9yIHRoZSBvcGVuIHN1Ym1lbnUuICovXG4gIHByaXZhdGUgX2dldFN1Ym1lbnVCb3VuZHMoKTogRE9NUmVjdCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BvaW50ZXJUcmFja2VyPy5wcmV2aW91c0VsZW1lbnRcbiAgICAgID8uZ2V0TWVudSgpXG4gICAgICA/Ll9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSByZWZlcmVuY2UgdG8gdGhlIFBvaW50ZXJGb2N1c1RyYWNrZXIgYW5kIG1lbnUgZWxlbWVudCBpcyBwcm92aWRlZC5cbiAgICogQHRocm93cyBhbiBlcnJvciBpZiBuZWl0aGVyIHJlZmVyZW5jZSBpcyBwcm92aWRlZC5cbiAgICovXG4gIHByaXZhdGUgX2NoZWNrQ29uZmlndXJlZCgpIHtcbiAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSB7XG4gICAgICBpZiAoIXRoaXMuX3BvaW50ZXJUcmFja2VyKSB7XG4gICAgICAgIHRocm93TWlzc2luZ1BvaW50ZXJGb2N1c1RyYWNrZXIoKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5fbWVudSkge1xuICAgICAgICB0aHJvd01pc3NpbmdNZW51UmVmZXJlbmNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFN1YnNjcmliZSB0byB0aGUgcm9vdCBtZW51cyBtb3VzZSBtb3ZlIGV2ZW50cyBhbmQgdXBkYXRlIHRoZSB0cmFja2VkIG1vdXNlIHBvaW50cy4gKi9cbiAgcHJpdmF0ZSBfc3Vic2NyaWJlVG9Nb3VzZU1vdmVzKCkge1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5fbWVudS5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnbW91c2Vtb3ZlJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChfOiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyKSA9PiBpbmRleCAlIE1PVVNFX01PVkVfU0FNUExFX0ZSRVFVRU5DWSA9PT0gMCksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3BvaW50cy5wdXNoKHt4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZfSk7XG4gICAgICAgICAgaWYgKHRoaXMuX3BvaW50cy5sZW5ndGggPiBOVU1fUE9JTlRTKSB7XG4gICAgICAgICAgICB0aGlzLl9wb2ludHMuc2hpZnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKTtcbiAgfVxufVxuXG4vKipcbiAqIENka1RhcmdldE1lbnVBaW0gaXMgYSBwcm92aWRlciBmb3IgdGhlIFRhcmdldE1lbnVBaW0gc2VydmljZS4gSXQgc2hvdWxkIGJlIGFkZGVkIHRvIGFuXG4gKiBlbGVtZW50IHdpdGggZWl0aGVyIHRoZSBgY2RrTWVudWAgb3IgYGNka01lbnVCYXJgIGRpcmVjdGl2ZSBhbmQgY2hpbGQgbWVudSBpdGVtcy5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2Nka1RhcmdldE1lbnVBaW1dJyxcbiAgZXhwb3J0QXM6ICdjZGtUYXJnZXRNZW51QWltJyxcbiAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IE1FTlVfQUlNLCB1c2VDbGFzczogVGFyZ2V0TWVudUFpbX1dLFxufSlcbmV4cG9ydCBjbGFzcyBDZGtUYXJnZXRNZW51QWltIHt9XG4iXX0=