waybetter 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/README.md +1 -2
  2. package/bin/waybetter.mjs +2 -5
  3. package/cli/buildenv.mjs +1 -1
  4. package/cli/release.mjs +11 -18
  5. package/cli/releasecheck.mjs +15 -0
  6. package/cli/remote.mjs +4 -4
  7. package/cli/store.mjs +80 -28
  8. package/cli/strings.mjs +2 -0
  9. package/dist/runtime/stringPackHook.js +2 -2
  10. package/dist/runtime/stringPackHook.js.map +1 -1
  11. package/dist/runtime/stringPackTranslate.d.ts +3 -1
  12. package/dist/runtime/stringPackTranslate.js +6 -3
  13. package/dist/runtime/stringPackTranslate.js.map +1 -1
  14. package/dist/runtime/stringPacks.d.ts +53 -5
  15. package/dist/runtime/stringPacks.js +161 -25
  16. package/dist/runtime/stringPacks.js.map +1 -1
  17. package/dist/runtime/themeBar.d.ts +28 -0
  18. package/dist/runtime/themeBar.js +82 -0
  19. package/dist/runtime/themeBar.js.map +1 -0
  20. package/dist/runtime/themeComponents.js +16 -3
  21. package/dist/runtime/themeComponents.js.map +1 -1
  22. package/dist/runtime/themeDecor.js +3 -1
  23. package/dist/runtime/themeDecor.js.map +1 -1
  24. package/dist/runtime/themeDerive.d.ts +69 -0
  25. package/dist/runtime/themeDerive.js +117 -0
  26. package/dist/runtime/themeDerive.js.map +1 -0
  27. package/dist/runtime/themeDoctor.d.ts +44 -3
  28. package/dist/runtime/themeDoctor.js +86 -25
  29. package/dist/runtime/themeDoctor.js.map +1 -1
  30. package/dist/runtime/themeGuards.d.ts +60 -0
  31. package/dist/runtime/themeGuards.js +235 -0
  32. package/dist/runtime/themeGuards.js.map +1 -0
  33. package/dist/runtime/themeIcons.d.ts +1 -1
  34. package/dist/runtime/themeIcons.js +13 -5
  35. package/dist/runtime/themeIcons.js.map +1 -1
  36. package/dist/runtime/themeInk.d.ts +37 -0
  37. package/dist/runtime/themeInk.js +111 -0
  38. package/dist/runtime/themeInk.js.map +1 -0
  39. package/dist/runtime/themeInvariants.d.ts +39 -0
  40. package/dist/runtime/themeInvariants.js +273 -0
  41. package/dist/runtime/themeInvariants.js.map +1 -0
  42. package/dist/runtime/themeRuntime.d.ts +15 -1
  43. package/dist/runtime/themeRuntime.js +78 -5
  44. package/dist/runtime/themeRuntime.js.map +1 -1
  45. package/dist/runtime/themeSpec.d.ts +5 -1
  46. package/dist/runtime/themeSpec.js +9 -13
  47. package/dist/runtime/themeSpec.js.map +1 -1
  48. package/dist/shell/InstallDialog.js +14 -8
  49. package/dist/shell/InstallDialog.js.map +1 -1
  50. package/dist/shell/StoreView.d.ts +12 -0
  51. package/dist/shell/StoreView.js +9 -4
  52. package/dist/shell/StoreView.js.map +1 -1
  53. package/dist/shell/frame/AppMenu.d.ts +26 -3
  54. package/dist/shell/frame/AppMenu.js +106 -27
  55. package/dist/shell/frame/AppMenu.js.map +1 -1
  56. package/dist/shell/frame/FindBar.js +1 -1
  57. package/dist/shell/frame/FindBar.js.map +1 -1
  58. package/dist/shell/frame/Shell.d.ts +1 -0
  59. package/dist/shell/frame/Shell.js +10 -2
  60. package/dist/shell/frame/Shell.js.map +1 -1
  61. package/dist/shell/frame/Titlebar.d.ts +2 -1
  62. package/dist/shell/frame/Titlebar.js +5 -3
  63. package/dist/shell/frame/Titlebar.js.map +1 -1
  64. package/dist/shell/frame/WebPanel.js +4 -1
  65. package/dist/shell/frame/WebPanel.js.map +1 -1
  66. package/dist/shell/frame/accountSwitcher.css +10 -10
  67. package/dist/shell/frame/appMenu.css +19 -13
  68. package/dist/shell/frame/boot.js +2 -0
  69. package/dist/shell/frame/boot.js.map +1 -1
  70. package/dist/shell/frame/chromeTheme.d.ts +19 -1
  71. package/dist/shell/frame/chromeTheme.js +51 -14
  72. package/dist/shell/frame/chromeTheme.js.map +1 -1
  73. package/dist/shell/frame/deck.css +30 -30
  74. package/dist/shell/frame/edges.css +159 -0
  75. package/dist/shell/frame/index.d.ts +2 -2
  76. package/dist/shell/frame/index.js +1 -1
  77. package/dist/shell/frame/index.js.map +1 -1
  78. package/dist/shell/frame/mediaModel.d.ts +13 -0
  79. package/dist/shell/frame/mediaModel.js +14 -0
  80. package/dist/shell/frame/mediaModel.js.map +1 -1
  81. package/dist/shell/frame/menuMessages.en.json +43 -1
  82. package/dist/shell/frame/menuModel.d.ts +42 -0
  83. package/dist/shell/frame/menuModel.js +8 -0
  84. package/dist/shell/frame/menuModel.js.map +1 -1
  85. package/dist/shell/frame/nativeMenu.d.ts +5 -0
  86. package/dist/shell/frame/nativeMenu.js +178 -0
  87. package/dist/shell/frame/nativeMenu.js.map +1 -0
  88. package/dist/shell/frame/nativeMenuModel.d.ts +102 -0
  89. package/dist/shell/frame/nativeMenuModel.js +186 -0
  90. package/dist/shell/frame/nativeMenuModel.js.map +1 -0
  91. package/dist/shell/frame/paletteModel.js +3 -1
  92. package/dist/shell/frame/paletteModel.js.map +1 -1
  93. package/dist/shell/frame/paneTheme.css +1 -1
  94. package/dist/shell/frame/reportModel.d.ts +1 -1
  95. package/dist/shell/frame/reportModel.js +1 -1
  96. package/dist/shell/frame/reportModel.js.map +1 -1
  97. package/dist/shell/frame/shell.css +56 -51
  98. package/dist/shell/frame/state.d.ts +2 -0
  99. package/dist/shell/frame/state.js +3 -1
  100. package/dist/shell/frame/state.js.map +1 -1
  101. package/dist/shell/frame/themeStore.js +21 -6
  102. package/dist/shell/frame/themeStore.js.map +1 -1
  103. package/dist/shell/frame/workspaces.css +12 -12
  104. package/dist/shell/installController.d.ts +16 -1
  105. package/dist/shell/installController.js +31 -5
  106. package/dist/shell/installController.js.map +1 -1
  107. package/dist/shell/panel/Appearance.js +12 -3
  108. package/dist/shell/panel/Appearance.js.map +1 -1
  109. package/dist/shell/panel/Settings.d.ts +1 -1
  110. package/dist/shell/panel/Settings.js +4 -3
  111. package/dist/shell/panel/Settings.js.map +1 -1
  112. package/dist/shell/panel/StoreSection.d.ts +2 -1
  113. package/dist/shell/panel/StoreSection.js +31 -1
  114. package/dist/shell/panel/StoreSection.js.map +1 -1
  115. package/dist/shell/panel/StringPacks.d.ts +12 -3
  116. package/dist/shell/panel/StringPacks.js +33 -8
  117. package/dist/shell/panel/StringPacks.js.map +1 -1
  118. package/dist/shell/panel/backup.css +1 -1
  119. package/dist/shell/panel/builder.css +48 -40
  120. package/dist/shell/panel/make.css +8 -7
  121. package/dist/shell/panel/panel.css +401 -401
  122. package/dist/shell/panel/panelMessages.d.ts +41 -1
  123. package/dist/shell/panel/panelMessages.js +13 -1
  124. package/dist/shell/panel/panelMessages.js.map +1 -1
  125. package/dist/shell/panel/plugins.css +5 -5
  126. package/dist/shell/panel/strings.css +1 -1
  127. package/dist/shell/store.css +34 -14
  128. package/dist/shell/storeMessages.d.ts +24 -0
  129. package/dist/shell/storeMessages.js +24 -0
  130. package/dist/shell/storeMessages.js.map +1 -1
  131. package/dist/shell/storeModel.d.ts +31 -7
  132. package/dist/shell/storeModel.js +15 -2
  133. package/dist/shell/storeModel.js.map +1 -1
  134. package/dist/shell/stringPacksModel.js +7 -2
  135. package/dist/shell/stringPacksModel.js.map +1 -1
  136. package/icons.schema.json +9 -0
  137. package/locales/ar.json +109 -2
  138. package/locales/bg.json +109 -2
  139. package/locales/bn.json +109 -2
  140. package/locales/ca.json +109 -2
  141. package/locales/cs.json +109 -2
  142. package/locales/da.json +109 -2
  143. package/locales/de.json +109 -2
  144. package/locales/el.json +109 -2
  145. package/locales/en.json +108 -2
  146. package/locales/es.json +109 -2
  147. package/locales/eu.json +109 -2
  148. package/locales/fa.json +109 -2
  149. package/locales/fi.json +109 -2
  150. package/locales/fil.json +109 -2
  151. package/locales/fr.json +109 -2
  152. package/locales/ga.json +109 -2
  153. package/locales/gl.json +109 -2
  154. package/locales/gu.json +109 -2
  155. package/locales/ha.json +109 -2
  156. package/locales/he.json +109 -2
  157. package/locales/hi.json +109 -2
  158. package/locales/hr.json +109 -2
  159. package/locales/hu.json +110 -2
  160. package/locales/id.json +109 -2
  161. package/locales/ig.json +109 -2
  162. package/locales/it.json +109 -2
  163. package/locales/ja.json +109 -2
  164. package/locales/kn.json +109 -2
  165. package/locales/ko.json +109 -2
  166. package/locales/mr.json +109 -2
  167. package/locales/ms.json +109 -2
  168. package/locales/nb.json +109 -2
  169. package/locales/nl.json +109 -2
  170. package/locales/pl.json +109 -2
  171. package/locales/pt.json +109 -2
  172. package/locales/ro.json +109 -2
  173. package/locales/ru.json +109 -2
  174. package/locales/sk.json +109 -2
  175. package/locales/sr.json +109 -2
  176. package/locales/sv.json +109 -2
  177. package/locales/ta.json +109 -2
  178. package/locales/th.json +109 -2
  179. package/locales/tr.json +109 -2
  180. package/locales/uk.json +109 -2
  181. package/locales/ur.json +109 -2
  182. package/locales/vi.json +109 -2
  183. package/locales/yo.json +109 -2
  184. package/locales/zh-Hans.json +109 -2
  185. package/locales/zh-Hant.json +109 -2
  186. package/package.json +2 -3
  187. package/store-catalog.schema.json +18 -5
  188. package/theme.schema.json +9 -0
  189. package/windows/installer.nsi +22 -2
  190. package/cli/privacy.mjs +0 -768
@@ -1 +1 @@
1
- {"version":3,"file":"AppMenu.js","sourceRoot":"","sources":["../../../../../../shell/src/frame/AppMenu.tsx"],"names":[],"mappings":";AAAA,kGAAkG;AAClG,iGAAiG;AACjG,iGAAiG;AACjG,+FAA+F;AAC/F,0HAA0H;AAC1H,sFAAsF;AACtF,EAAE;AACF,gGAAgG;AAChG,oGAAoG;AACpG,8FAA8F;AAC9F,iGAAiG;AACjG,2FAA2F;AAE3F,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAA4C,MAAM,OAAO,CAAC;AAC3H,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAqB,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,IAAI,EAAiB,MAAM,YAAa,CAAC;AAClD,OAAO,EACL,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,GAE3L,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAoB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAkB,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAsB,CAAC;AACzD,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,eAAe,CAAC;AAKvB,kFAAkF;AAClF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,UAA0B,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAEvI,MAAM,GAAG,GAAG,EAAE,KAAK,OAAO,CAAC;AAC3B,4FAA4F;AAC5F,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;AAEnD,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACtH,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC;AAMzG,gGAAgG;AAChG,IAAI,MAAM,GAAwB,IAAI,CAAC;AACvC,SAAS,QAAQ,CAAC,EAAuB;IACvC,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO;IAC1B,MAAM,GAAG,EAAE,CAAC;IACZ,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,wFAAwF;AACxF,SAAS,OAAO,CAAC,IAAiB;IAChC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAc,4BAA4B,CAAC,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC;IACtC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACvH,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,KAA4B,EAAE;IACpE,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,WAAW,EAAE,CAAC;IACd,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC;IACtB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAClF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACtD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA4D,IAAI,CAAC,CAAC;IACtG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAe,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAM,CAAe,IAAI,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAgE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAClG,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,IAAI,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAE9B,6FAA6F;IAC7F,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC9E,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,OAAO,GAAG,EAAE;YACV,KAAK,MAAM,KAAK,IAAI,MAAM;gBAAE,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACpE,KAAK,MAAM,OAAO,IAAI,GAAG;gBAAE,OAAO,EAAE,EAAE,CAAC;QACzC,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,kGAAkG;IAClG,MAAM,IAAI,GAAG,GAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE/D,SAAS,IAAI,CAAC,UAA0B,EAAE;QACxC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAC,OAAO,CAAC,QAAQ,aAAa,QAAQ,CAAC,QAAQ,EAAE,WAAW,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC1I,MAAM,IAAI,GAAG,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChF,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAC;QAC/D,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACxC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9K,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAmC,CAAC;QAC5D,MAAM,CAAC,OAAO,GAAG,MAAM,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3F,kGAAkG;QAClG,6DAA6D;QAC7D,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;YAAE,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAChE,SAAS,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClD,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5H,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,kCAAkC;QAClC,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5B,IAAI,UAAU,CAAC,WAAW,CAAC;YAAE,KAAK,UAAU,EAAE,CAAC;QAC/C,IAAI,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM;YAAE,KAAK,cAAc,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC1F,KAAK,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC1D,cAAc,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClH,CAAC;IAED,2HAA2H;IAC3H,SAAS,KAAK,CAAC,MAAoC,MAAM,EAAE,GAAG,GAAG,EAAE;QACjE,IAAI,CAAC,eAAe,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,aAAa,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACpF,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC7B,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,WAAW;YAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC5E,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,qEAAqE;IACrE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO;QACnC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,QAAkC,CAAC;QACvC,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;aAC1E,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,QAAQ;YAAE,OAAO,EAAE,CAAC;;YAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;aACtE,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnB,OAAO,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,CAAC,KAAY,EAAE,EAAE;YACjC,MAAM,OAAO,GAAI,KAAiD,CAAC,MAAM,IAAI,EAAE,CAAC;YAChF,oFAAoF;YACpF,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;gBAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;;gBAAM,IAAI,CAAC,OAAO,CAAC,CAAC;QACpI,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAClD,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACpE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,4CAA4C;QAC5C,UAAU,CAAC,CAAC,CAAC,CAAC;QACd,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpB,qGAAqG;QACrG,wFAAwF;QACxF,IAAI,OAAkD,CAAC;QACvD,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,CAAC,8BAA8B,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC1D,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;gBAAE,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;gBAAM,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvI,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;QAC9B,kGAAkG;QAClG,MAAM,KAAK,GAAG,CAAC,KAAoB,EAAE,EAAE;YACrC,IAAI,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC;gBAAE,OAAO;YAC3D,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAAC,KAAK,CAAC,cAAc,EAAE,CAAC;gBAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAChF,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBACzD,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,SAAS,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;gBAC5G,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjN,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAEtB,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAc,gBAAgB,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC;IAE/G,2GAA2G;IAC3G,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YACxB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAChC,MAAM,GAAG,GAAG,MAAM,EAAE,aAAa,CAAc,eAAe,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC;YAChG,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM;gBAAE,SAAS;YAC7B,MAAM,IAAI,GAAG,CAAC,CAAC;YACf,MAAM,GAAG,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;YAC3C,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;YAC1D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC9D,0CAA0C;YAC1C,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,mBAAmB,EAAE,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,qBAAqB,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;YAC5H,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACxC,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QACxC,CAAC;QACD,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC;QAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3C,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO;QACzB,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAc,eAAe,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC;YAC3G,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1F,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAU,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE;QAC3D,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACrD,SAAS,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,KAAK;YAAE,SAAS,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACrE,CAAC,CAAC;IACF,kEAAkE;IAClE,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,EAAE;QACjC,SAAS,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAChD,SAAS,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,KAAK,UAAU,QAAQ,CAAC,GAAgB,EAAE,KAAa;QACrD,IAAI,GAAG,CAAC,QAAQ;YAAE,OAAO;QACzB,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC;gBAAC,SAAS,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBAAC,IAAI,EAAE,CAAC;YAAC,CAAC;;gBAAM,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACnI,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,QAAQ;YAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC;YAAC,MAAM,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;QAAC,CAAC;QAC1B,OAAO,OAAO,EAAE,CAAC;YAAC,IAAI,GAAG,CAAC,QAAQ;gBAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;;gBAAM,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAAC,CAAC;IACjH,CAAC;IAED,8FAA8F;IAC9F,OAAO;IAEP,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,KAAa,EAAE,IAA0B,EAAE,OAA6B,EAAE,EAAe,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACnK,iEAAiE;IACjE,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC;IACtC,MAAM,YAAY,GAAG,MAAM,EAAE,MAA+B,CAAC;IAC7D,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/E,MAAM,YAAY,GAAG,CAAC,IAAwB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC;IACvH,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnG,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAE1C,0FAA0F;IAC1F,SAAS,cAAc,CAAC,MAAc;QACpC,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACnC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;YACvD,IAAI,OAAO;gBAAE,OAAO,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;iBACnD,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,EAAE;gBAAE,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC;QACF,IAAI,EAAE,CAAC;IACT,CAAC;IAED,SAAS,OAAO,CAAC,EAAmB;QAClC,QAAQ,EAAE,EAAE,CAAC;YACX,KAAK,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC7H,KAAK,aAAa,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,0BAA0B,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACpK,KAAK,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,yBAAyB,CAAC,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAC3K,KAAK,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE;gBACnE,GAAG,EAAE,GAAG,EAAE;oBACR,6FAA6F;oBAC7F,MAAM,MAAM,GAAG,YAAY,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;oBACvF,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC9E,CAAC;aACF,CAAC,CAAC;YACH,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,4BAA4B,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAClJ,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YAC9I,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,CAAC;gBAC/D,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACzJ,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;YACjD,KAAK,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAClI,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3H,KAAK,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC3H,KAAK,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YACpK,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7M,KAAK,WAAW,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7J,KAAK,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;YACtI,KAAK,WAAW,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACpF,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,+GAA+G;gBAC/G,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;gBACpD,OAAO,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE;oBACnC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,KAAK,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;oBAC3F,GAAG,EAAE,KAAK,IAAI,EAAE;wBACd,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;4BAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;4BAAC,OAAO;wBAAC,CAAC;wBACzE,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;4BAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;4BAAC,OAAO;wBAAC,CAAC;wBACvE,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO;4BAAE,OAAO;wBACnC,cAAc,CAAC,IAAI,CAAC,CAAC;wBACrB,SAAS,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;wBACjC,4EAA4E;wBAC5E,IAAI,CAAC;4BAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;wBAAC,CAAC;wBAAC,MAAM,CAAC;4BAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;wBAAC,CAAC;oBAC3H,CAAC;iBACF,CAAC,CAAC;YACL,CAAC;YACD,6FAA6F;YAC7F,KAAK,WAAW,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM;gBAClC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9E,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACnE,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9F,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrI,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC3I,CAAC;IACH,CAAC;IAED,SAAS,WAAW,CAAC,EAAU;QAC7B,QAAQ,EAAE,EAAE,CAAC;YACX,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;gBACjC,IAAI,CAAC,SAAS;oBAAE,OAAO,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,iCAAiC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,mCAAmC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;gBAC9L,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBACpB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;wBAAE,OAAO,GAAG,CAAC;oBACpC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACtC,6FAA6F;oBAC7F,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnI,CAAC,CAAC,CAAC;YACL,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC7B,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU;oBAAE,OAAO,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAc,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE;oBACxH,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;oBACjG,qFAAqF;oBACrF,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;iBACrF,CAAC,CAAC,CAAC;gBACJ,OAAO,UAAU,CAAC,CAAC,IAAI,EAAE;wBACvB,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;wBACvH,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;qBAC3G,CAAC,CAAC,CAAC;YACN,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;gBACzB,IAAI,CAAC,KAAK;oBAAE,OAAO,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC;gBAC9F,MAAM,KAAK,GAAG,KAAK,EAAE,EAAU,EAAE,IAAa,EAAE,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClH,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACpC,IAAI,MAAM,EAAE,OAAO,IAAI,UAAU,EAAE,CAAC;oBAClC,yEAAyE;oBACzE,OAAO;wBACL,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;wBAC9J,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC/J,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBACnK,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBACxK,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;qBAChK,CAAC;gBACJ,CAAC;gBACD,IAAI,MAAM,EAAE,CAAC;oBACX,6FAA6F;oBAC7F,OAAO;wBACL,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE;wBACjI,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;wBACrG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;wBACpI,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;qBACrK,CAAC;gBACJ,CAAC;gBACD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE;oBAClF,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,IAAI,EAAE,QAAQ,EAAE,IAAI;oBAC1D,GAAG,EAAE,KAAK,IAAI,EAAE;wBACd,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;4BAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;4BAAC,OAAO;wBAAC,CAAC;wBACnD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;wBAC9C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;4BAAC,SAAS,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;4BAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;wBAAC,CAAC;;4BAAM,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;oBACjJ,CAAC;iBACF,CAAC,CAAC,CAAC;gBACJ,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO;oBAAE,OAAO,IAAI,CAAC;gBAChE,6FAA6F;gBAC7F,MAAM,IAAI,GAAc,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5K,OAAO,UAAU,CAAC,CAAC,IAAI,EAAE;wBACvB,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;wBACtF,GAAG,IAAI;wBACP,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE;4BAC1E,QAAQ,EAAE,IAAI;4BACd,GAAG,EAAE,GAAG,EAAE;gCACR,SAAS,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gCACjD,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gCACnD,IAAI,UAAU,CAAC,KAAK,GAAG,CAAC;oCAAE,KAAK,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;4BACjH,CAAC;yBACF,CAAC;qBACH,CAAC,CAAC,CAAC;YACN,CAAC;YACD,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAc,IAAI,CAAC,MAAM;oBACjC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACpN,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBACjF,OAAO,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3G,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,OAAO;gBACvB,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE;gBACrG,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzF,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;aAC5H,CAAC;YACF,KAAK,WAAW,CAAC,CAAC,OAAO;gBACvB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxM,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE,CAAC;aACtG,CAAC;YACF,OAAO,CAAC,CAAC,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC;IAC3C,MAAM,GAAG,GAAY;QACnB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;QACtG,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC;KACvQ,CAAC;IACF,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClK,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,IAAe,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAsB,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;IAE3I,8FAA8F;IAC9F,uBAAuB;IAEvB,SAAS,KAAK,CAAC,KAAyC;QACtD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAc,cAAc,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;QACtB,+GAA+G;QAC/G,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAAC,IAAI,EAAE,CAAC;YAAC,IAAI,KAAK,GAAG,CAAC;gBAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;;gBAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC/F,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YAAC,IAAI,EAAE,CAAC;YAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACvD,gGAAgG;QAChG,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,YAAY,CAAC,EAAE,CAAC;YAC9E,IAAI,EAAE,CAAC;YACP,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAc,aAAa,CAAC,CAAC,CAAC;YACjF,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;YAC1H,OAAO;QACT,CAAC;QACD,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YAChF,IAAI,EAAE,CAAC;YACP,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAC9B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;YACnE,OAAO;QACT,CAAC;QACD,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,IAAI,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAAC,IAAI,EAAE,CAAC;gBAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAAC,CAAC;YAClI,OAAO;QACT,CAAC;QACD,IAAI,GAAG,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBAAC,IAAI,EAAE,CAAC;gBAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC/E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,GAAG,CAAC;QACrE,+GAA+G;QAC/G,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,IAAI,MAAM,KAAK,MAAM;gBAAE,IAAI,EAAE,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM;YAAE,OAAO;QAC/E,mEAAmE;QACnE,IAAI,EAAE,CAAC;QACP,KAAK,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;QAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5G,IAAI,KAAK,IAAI,CAAC;YAAE,KAAK,CAAC,KAAK,CAAE,CAAC,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,kHAAkH;IAClH,SAAS,OAAO,CAAC,GAAuB,EAAE,KAAa,EAAE,EAAe;QACtE,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE;YAAE,OAAO;QACpC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC;QACvB,IAAI,QAAQ,CAAC,aAAa,KAAK,EAAE;YAAE,EAAE,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC;YACjB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE;gBAAE,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAClG,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YAC/B,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACjH,CAAC;IACH,CAAC;IAED,8FAA8F;IAE9F,SAAS,SAAS,CAAC,GAAY,EAAE,KAAa,EAAE,KAAa;QAC3D,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,aAAwB,IAAI,EAAC,WAAW,IAA/B,MAAM,KAAK,EAAE,CAAoB,CAAC;QAChF,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxB,OAAO,eAAkB,SAAS,EAAE,cAAc,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,aAC/I,GAAG,CAAC,KAAK,IAAI,2BAAS,GAAG,CAAC,KAAK,GAAU,EAAE,GAAG,CAAC,IAAI,IAAI,yBAAO,GAAG,CAAC,IAAI,GAAQ,KADhE,GAAG,CAAC,EAAE,CAEjB,CAAC;QACT,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,KAAa,EAAE,IAAc,EAAE,SAAqB,EAAE,GAAY,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,CACjH,iBAAQ,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAC,UAAU,EAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,eAAa,QAAQ,EAAE,EAAE,eAAY,EAAE,gBAAa,QAAQ,CAAC,MAAM,CAAC,gBAC9H,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,mBAAiB,GAAG,EAChF,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG;oBAAE,KAAK,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,YAC9H,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,GAAG,GACZ,CAAC;YACZ,OAAO,eAAgB,SAAS,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,IAAI,EAAC,OAAO,gBAAa,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,aAC9J,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,GAAE,EACnB,eAAM,SAAS,EAAC,eAAe,YAAE,QAAQ,CAAC,MAAM,CAAC,GAAQ,EACzD,gBAAM,SAAS,EAAC,kBAAkB,aAC/B,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,MAAM,IAAI,QAAQ,CAAC,EAC7E,iBAAQ,SAAS,EAAC,mBAAmB,eAAW,QAAQ,YAAE,OAAO,CAAC,MAAM,CAAC,GAAU,EAClF,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,MAAM,IAAI,QAAQ,CAAC,IACpE,EACN,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,MAAM,KAAK,CAAC,EAAE,mBAAmB,CAAC,KARlF,MAAM,CAShB,CAAC;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,OAAO,kBAAqB,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,eAAa,GAAG,CAAC,EAAE,gBAAc,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EACxI,IAAI,EAAE,GAAG,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,kBAAgB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,mBACjI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,mBAAiB,QAAQ,EACxE,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,aACzG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,cAAc,YAAE,GAAG,CAAC,OAAO,IAAI,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,GAAE,GAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,cAAc,GAAE,EAEhK,eAAM,SAAS,EAAC,eAAe,YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAK,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,YAAG,GAAG,CAAC,KAAK,GAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAQ,EACnH,GAAG,CAAC,MAAM,IAAI,gBAAM,SAAS,EAAC,SAAS,iBAAa,MAAM,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,aAChG,YAAG,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,mBAAmB,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,EAAA,YAAG,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAA,YAAG,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAClL,EACN,GAAG,CAAC,IAAI,IAAI,eAAM,SAAS,EAAC,aAAa,YAAE,GAAG,CAAC,IAAI,GAAQ,EAC3D,GAAG,CAAC,QAAQ,IAAI,eAAM,SAAS,EAAC,cAAc,YAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAQ,EACvF,GAAG,CAAC,OAAO,IAAI,KAAC,IAAI,IAAC,IAAI,EAAC,cAAc,EAAC,SAAS,EAAC,gBAAgB,GAAE,KAZpD,GAAG,CAAC,EAAE,CAajB,CAAC;IACZ,CAAC;IAED,SAAS,WAAW;QAClB,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,MAAM,GAA8C,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrG,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7G,sEAAsE;QACtE,IAAI,KAAK;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACxJ,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,cAAgE,IAAI,EAAC,MAAM,gBAAa,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,gBAAc,KAAK,EAC1K,SAAS,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,6BAA6B,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,gCAAgC,EACvI,KAAK,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,gBAAgB,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,YAC3I,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,IAHD,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAItG,CAAC,CAAC;IACV,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChC,OAAO,8BACJ,OAAO,IAAI,iBAAQ,GAAG,EAAE,MAAM,EAAE,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,eAAe,mBAAe,MAAM,mBAAgB,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK,QAAQ,gBAAc,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,KAAK,aAAa,GAAG,EAClM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,YAC7G,eAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,aAAC,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,MAAM,EAAC,CAAC,EAAC,KAAK,GAAE,EAAA,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,KAAK,GAAE,EAAA,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,OAAO,EAAC,CAAC,EAAC,KAAK,GAAE,IAAM,GACnJ,EACR,IAAI,IAAI,YAAY,CAAC,cAAK,SAAS,EAAC,kBAAkB,EAAC,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,YAC9I,cAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAC,eAAe,EAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,YACtL,WAAW,EAAE,GACV,GACF,EAAE,QAAQ,CAAC,IAAI,CAAC,EACrB,SAAS,IAAI,KAAC,YAAY,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,IAChE,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,EAAE,CAAC;IACP,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAoD,IAAI,CAAC,CAAC;IAC9E,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IACvE,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChC,OAAO,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,kBAAkB,mBAAe,MAAM,mBAAgB,QAAQ,gBAAc,GAAG,OAAO,KAAK,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,OAAO,MAAM,KAAK,EAAE,EACxK,aAAa,EAAE,KAAK,CAAC,EAAE,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAC3H,aAAa,EAAE,KAAK,CAAC,EAAE;YACrB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;YAC5B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;gBAAE,OAAO;YAC5D,4FAA4F;YAC5F,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;gBAAC,SAAS,EAAE,CAAC;YAAC,CAAC;QAC9G,CAAC,EACD,OAAO,EAAE,KAAK,CAAC,EAAE;YACf,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;YACvC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,OAAO;gBAAE,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5F,CAAC,EACD,aAAa,EAAE,KAAK,CAAC,EAAE;YACrB,KAAK,CAAC,cAAc,EAAE,CAAC;YAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;YAC3C,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;QACnF,CAAC,YACD,cAAK,GAAG,EAAE,IAAI,EAAE,GAAG,EAAC,EAAE,EAAC,SAAS,EAAE,KAAK,GAAG,GACnC,CAAC;AACZ,CAAC","sourcesContent":["// The app menu: the titlebar's \"Settings and more\" button, at the far end of the titlebar cluster\n// (before the caption buttons on Windows and Linux; macOS has none there). It opens on click, on\n// Alt+F and F10 (Shell.tsx; a focused tab forwards the keys), from the command palette, from the\n// last row of the account menu, and from the app's logo at the start of the titlebar (the same\n// menu, hung under the logo on its side of the window). Its rows are the app's (`ShellSite.menu`, menuModel.ts): built-in\n// ones by name, each shown only when the app serves what it needs, and the app's own.\n//\n// Like every shell menu it is an overlay: while open the shell is raised above the tab webviews\n// (`setOverlay`), panes stay visible and nothing is dimmed. Keyboard: arrows, Home/End, type-ahead,\n// the arrow pointing along the reading direction opens a submenu and the other one closes it,\n// Enter or Space chooses, Esc closes one level. Submenus fly out beside the menu and stay inside\n// the window (in a narrow one they lie over it). Words: menuMessages.en.json (`menuText`).\n\nimport { useEffect, useLayoutEffect, useReducer, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { parseUpdateStatus, type UpdateStatus } from '../updateModel.ts';\nimport { invoke, listen } from './bridge.ts';\nimport { describe, diag } from './diag.ts';\nimport { decks } from './deckStore.ts';\nimport { refreshDev } from './devHost.ts';\nimport { useDev, usePaneTick, useT } from './hooks.ts';\nimport { formatNumber } from './i18n.ts';\nimport { Icon, type IconName } from './icons.tsx';\nimport {\n DEFAULT_MENU, ZOOM_MAX, ZOOM_MIN, findSpec, joinGroups, languageChoice, languageRows, menuText, moveStop, planMenu, shortcutText, specRows, submenuKeys, submenuLeft, typeahead, updateRow,\n type BuiltinMenuItem, type MenuEnv, type MenuItemRow, type MenuModeStatus, type MenuRow,\n} from './menuModel.ts';\nimport { ReportDialog } from './ReportDialog.tsx';\nimport { safe, setSafeMode } from './safeStore.ts';\nimport { hasFeature, site } from './site.ts';\nimport { isWeb, setOverlay, shell, type TabParams } from './state.ts';\nimport { openWorkspaceSave } from './TitlebarExtras.tsx';\nimport { os, startDrag, systemMenu } from './windowBinding.ts';\nimport { loadWorkspaces, restoreWorkspace, workspaceList, workspaces } from './workspaces.ts';\nimport { readZoom, stepZoom, zoomOf, zoomTarget } from './zoomStore.ts';\nimport './appMenu.css';\n\n/** How the menu is asked to open: under the logo instead of its button, at a submenu, with the first row focused (keyboard), or closing if it is open. */\nexport type AppMenuRequest = { anchor?: 'button' | 'logo'; submenu?: string; keyboard?: boolean; toggle?: boolean };\n\n/** Opens the app menu (Alt+F / F10, the palette, the account menu's last row). */\nexport const openAppMenu = (request: AppMenuRequest = {}) => window.dispatchEvent(new CustomEvent('bt-app-menu', { detail: request }));\n\nconst mac = os === 'macos';\n/** The keys that open the menu, as the button's tooltip and the account menu write them. */\nexport const APP_MENU_KEYS = mac ? 'F10' : 'Alt+F';\n\nconst getError = (error: unknown) => (error instanceof Error ? error.message : String(error)).replace(/^Error: /, '');\nconst percent = (factor: number) => formatNumber(factor, { style: 'percent', maximumFractionDigits: 0 });\n\ntype Focus = { level: number; id?: string; edge?: 'first' | 'last' | 'menu' };\n/** Where the menu hangs: under its button (from the window's end edge) or under the logo (from its start edge). */\ntype Anchor = { at: 'button' | 'logo'; top: number; left?: number; right?: number };\n\n/** Which trigger the open menu hangs from (null: closed), for the triggers' `aria-expanded`. */\nlet openAt: Anchor['at'] | null = null;\nfunction noteOpen(at: Anchor['at'] | null) {\n if (openAt === at) return;\n openAt = at;\n window.dispatchEvent(new CustomEvent('bt-app-menu-state'));\n}\n\n/** The rows of one level a key can stop on: enabled items; the zoom row counts once. */\nfunction stopsOf(menu: HTMLElement): HTMLElement[] {\n const all = Array.from(menu.querySelectorAll<HTMLElement>('[data-item]:not(:disabled)'));\n const active = document.activeElement;\n const zoom = all.filter(el => 'zoom' in el.dataset);\n const keep = zoom.find(el => el === active) ?? zoom.find(el => el.getAttribute('aria-disabled') !== 'true') ?? zoom[0];\n return all.filter(el => !('zoom' in el.dataset) || el === keep);\n}\n\nexport function AppMenu({ trigger = true }: { trigger?: boolean } = {}) {\n const t = useT();\n usePaneTick();\n const dev = useDev();\n const config = site();\n const menu = config.menu ?? {};\n const [open, setOpen] = useState(false);\n const [path, setPath] = useState<string[]>([]);\n const [anchor, setAnchor] = useState<Anchor>({ at: 'button', top: 50, right: 8 });\n const [mode, setMode] = useState<string | null>(null);\n const [modeStatus, setModeStatus] = useState<MenuModeStatus | null>(null);\n const [asking, setAsking] = useState<{ to: string; changes: number; reapply?: boolean } | null>(null);\n const [version, setVersion] = useState('');\n const [update, setUpdate] = useState<UpdateStatus>({ state: 'idle' });\n const [askedUpdate, setAskedUpdate] = useState(false);\n const [reporting, setReporting] = useState(false);\n const [error, setError] = useState('');\n const [, tick] = useReducer((n: number) => n + 1, 0);\n const button = useRef<HTMLButtonElement>(null);\n const layers = useRef<HTMLDivElement>(null);\n const focusNext = useRef<Focus | null>(null);\n const before = useRef<HTMLElement | null>(null);\n const hover = useRef<{ el: Element | null; timer?: ReturnType<typeof setTimeout> }>({ el: null });\n const typed = useRef({ text: '', at: 0 });\n const live = useRef({ open, path });\n live.current = { open, path };\n\n // Whatever a row shows may change while the menu is open (a language or theme picked in it).\n useEffect(() => {\n const events = ['bt-zoom', 'bt-workspaces', 'bt-decks', 'bt-site', 'bt-safe'];\n for (const event of events) window.addEventListener(event, tick);\n const off = [config.themes?.subscribe(tick), menu.languages?.subscribe(tick)];\n return () => {\n for (const event of events) window.removeEventListener(event, tick);\n for (const dispose of off) dispose?.();\n };\n }, []);\n\n /** Where a request without an anchor opens: the button when this app shows one, else the logo. */\n const home = (): Anchor['at'] => (trigger ? 'button' : 'logo');\n\n function show(request: AppMenuRequest = {}) {\n const at = request.anchor ?? home();\n diag(`menu open: anchor=${at} keyboard=${!!request.keyboard} hasFocus=${document.hasFocus()} active=${describe(document.activeElement)}`);\n const logo = at === 'logo' ? document.querySelector('.bt-titlebar-logo') : null;\n const rect = (logo ?? button.current)?.getBoundingClientRect();\n if (rect) {\n const top = Math.round(rect.bottom + 6);\n setAnchor(logo ? { at: 'logo', top, left: Math.max(8, Math.round(rect.left - 3)) } : { at: 'button', top, right: Math.max(8, Math.round(window.innerWidth - rect.right)) });\n }\n const active = document.activeElement as HTMLElement | null;\n before.current = active && active !== document.body && document.hasFocus() ? active : null;\n // Keys pressed in a tab open the menu: the shell takes the keyboard. A click on the shell already\n // gave it the keyboard, so nothing native is asked for then.\n if (!document.hasFocus()) invoke('shell_focus').catch(() => {});\n setAsking(null); setError('');\n setPath(request.submenu ? [request.submenu] : []);\n focusNext.current = request.submenu ? { level: 1, edge: 'first' } : { level: 0, edge: request.keyboard ? 'first' : 'menu' };\n setOpen(true);\n // What the rows show, read fresh.\n void readZoom(zoomTarget());\n if (hasFeature('developer')) void refreshDev();\n if (hasFeature('workspaces') && !workspaces.loaded) void loadWorkspaces().catch(() => {});\n void config.themes?.loadThemes();\n menu.modes?.current().then(setMode, () => {});\n menu.modes?.status?.().then(setModeStatus, () => {});\n if (!version) menu.version?.().then(setVersion, () => {});\n setAskedUpdate(false);\n if (hasFeature('updates')) invoke('update_status').then(value => setUpdate(parseUpdateStatus(value)), () => {});\n }\n\n /** `escape`: back to what had focus before. `action` and `away`: nothing focused, so typing returns to the active pane. */\n function close(how: 'escape' | 'action' | 'away' = 'away', why = '') {\n diag(`menu close: ${how}${why ? ` (${why})` : ''} hasFocus=${document.hasFocus()}`);\n clearTimeout(hover.current.timer);\n hover.current = { el: null };\n focusNext.current = null;\n setOpen(false); setPath([]); setAsking(null); setError('');\n if (how === 'escape' && before.current?.isConnected) before.current.focus();\n before.current = null;\n }\n\n // The updater's steps (checking, downloading, ready) as they happen.\n useEffect(() => {\n if (!hasFeature('updates')) return;\n let disposed = false;\n let unlisten: (() => void) | undefined;\n listen('update-status', event => setUpdate(parseUpdateStatus(event.payload)))\n .then(dispose => { if (disposed) dispose(); else unlisten = dispose; })\n .catch(() => {});\n return () => { disposed = true; unlisten?.(); };\n }, []);\n\n useEffect(() => {\n const onRequest = (event: Event) => {\n const request = (event as CustomEvent<AppMenuRequest | undefined>).detail ?? {};\n // Asked again from the other trigger, the open menu moves there instead of closing.\n if (live.current.open && request.toggle && (request.anchor ?? home()) === (openAt ?? home())) close('escape'); else show(request);\n };\n window.addEventListener('bt-app-menu', onRequest);\n return () => window.removeEventListener('bt-app-menu', onRequest);\n }, [version]);\n\n useEffect(() => {\n if (!open) return;\n // Native tab webviews would cover the menu.\n setOverlay(1);\n noteOpen(anchor.at);\n // The window lost the keyboard: the menu closes, unless the focus is back a moment later (taking the\n // keyboard from a tab for Alt+F / F10 can pass through a blur on its way to the shell).\n let leaving: ReturnType<typeof setTimeout> | undefined;\n const away = () => {\n diag(`menu: window blur hasFocus=${document.hasFocus()}`);\n clearTimeout(leaving);\n leaving = setTimeout(() => { if (!document.hasFocus()) close('away', 'blur'); else diag('menu: blur passed, focus is back'); }, 160);\n };\n const resized = () => close();\n // Keys while nothing in the menu has focus (a click on its padding): Esc closes, arrows enter it.\n const onKey = (event: KeyboardEvent) => {\n if (layers.current?.contains(event.target as Node)) return;\n if (event.key === 'Escape') { event.preventDefault(); close('escape'); return; }\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n focusNext.current = { level: live.current.path.length, edge: event.key === 'ArrowDown' ? 'first' : 'last' };\n tick();\n }\n };\n window.addEventListener('blur', away);\n window.addEventListener('resize', resized);\n window.addEventListener('keydown', onKey);\n return () => { clearTimeout(leaving); setOverlay(-1); noteOpen(null); window.removeEventListener('blur', away); window.removeEventListener('resize', resized); window.removeEventListener('keydown', onKey); };\n }, [open, anchor.at]);\n\n const layer = (level: number) => layers.current?.querySelector<HTMLElement>(`[data-level=\"${level}\"]`) ?? null;\n\n // After every render: submenus sit beside their row, inside the window; then the focus that was asked for.\n useLayoutEffect(() => {\n if (!open) return;\n for (let level = 1; level <= path.length; level += 1) {\n const el = layer(level);\n const parent = layer(level - 1);\n const row = parent?.querySelector<HTMLElement>(`[data-item=\"${CSS.escape(path[level - 1]!)}\"]`);\n if (!el || !parent) continue;\n const edge = 8;\n const box = parent.getBoundingClientRect();\n el.style.maxHeight = `${window.innerHeight - edge * 2}px`;\n const { width, height } = el.getBoundingClientRect();\n const left = submenuLeft(box, width, window.innerWidth, edge);\n // It slides in from the side it hangs on.\n el.style.setProperty('--bt-app-sub-from', left < box.left ? '6px' : '-6px');\n const top = Math.max(edge, Math.min((row?.getBoundingClientRect().top ?? box.top) - 6, window.innerHeight - height - edge));\n el.style.left = `${Math.round(left)}px`;\n el.style.top = `${Math.round(top)}px`;\n }\n const want = focusNext.current;\n const el = want ? layer(want.level) : null;\n if (!want || !el) return;\n focusNext.current = null;\n const stops = stopsOf(el);\n const target = want.id ? el.querySelector<HTMLElement>(`[data-item=\"${CSS.escape(want.id)}\"]:not(:disabled)`)\n : want.edge === 'menu' ? el : want.edge === 'last' ? stops[stops.length - 1] : stops[0];\n (target ?? el).focus();\n });\n\n const openSub = (level: number, id: string, focus = false) => {\n setPath(current => [...current.slice(0, level), id]);\n setAsking(null); setError('');\n if (focus) focusNext.current = { level: level + 1, edge: 'first' };\n };\n /** Closes the submenu at `level`; its row gets the focus back. */\n const closeSub = (level: number) => {\n focusNext.current = { level: level - 1, id: path[level - 1] };\n setPath(current => current.slice(0, level - 1));\n setAsking(null); setError('');\n };\n\n async function activate(row: MenuItemRow, level: number) {\n if (row.disabled) return;\n if (row.submenu) {\n if (path[level] === row.id) { focusNext.current = { level: level + 1, edge: 'first' }; tick(); } else openSub(level, row.id, true);\n return;\n }\n setError('');\n if (!row.keepOpen) close('action');\n try { await row.run?.(); }\n catch (failure) { if (row.keepOpen) setError(getError(failure)); else console.error('[shell] menu', failure); }\n }\n\n // -------------------------------------------------------------------------------------------\n // Rows\n\n const item = (id: string, label: string, icon: IconName | undefined, rest: Partial<MenuItemRow> = {}): MenuItemRow => ({ kind: 'item', id, label, icon, ...rest });\n /** \"Plugins…\": a row that opens a section of the app's panel. */\n const section = (name: string) => menuText('section', { section: name });\n const active = shell.api?.activePanel;\n const activeParams = active?.params as TabParams | undefined;\n const canSplit = !!active && (isWeb(active) || active.group.panels.length > 1);\n const languageName = (code: string | undefined) => menu.languages?.list.find(language => language.code === code)?.name;\n const themeState = config.themes?.current();\n const themeId = config.themes && themeState ? config.themes.adapter.preset(themeState.choice) : '';\n const modeList = menu.modes?.list() ?? [];\n\n /** Settings → Language: the panel's Settings, scrolled to that group once it is there. */\n function openSettingsAt(anchor: string) {\n shell.openPanelSection('settings');\n let tries = 0;\n const find = () => {\n const heading = document.getElementById(`${anchor}-h`);\n if (heading) heading.scrollIntoView({ block: 'start' });\n else if ((tries += 1) < 40) setTimeout(find, 50);\n };\n find();\n }\n\n function builtin(id: BuiltinMenuItem): MenuRow {\n switch (id) {\n case 'new-tab': return item(id, t('wb.shell.tab.new'), 'plus', { shortcut: 'Ctrl+T', run: () => shell.shortcut('new-tab') });\n case 'split-right': return item(id, t('wb.shell.menu.splitRight'), 'split', { shortcut: 'Ctrl+\\\\', disabled: !canSplit, run: () => shell.shortcut('split-right') });\n case 'split-down': return item(id, t('wb.shell.menu.splitDown'), 'splitDown', { shortcut: 'Ctrl+Shift+\\\\', disabled: !canSplit, run: () => shell.shortcut('split-down') });\n case 'new-column': return item(id, menuText('newColumn'), 'columns', {\n run: () => {\n // The deck in front, else the first one; with none yet, the deck tab itself (it starts one).\n const target = activeParams?.kind === 'deck' ? activeParams.deckId : decks.list[0]?.id;\n shell.run(target ? { type: 'deck-add', deckId: target } : { type: 'deck' });\n },\n });\n case 'language': return item(id, t('wb.settings.language.title'), 'globe', { submenu: true, hint: languageName(menu.languages?.state().locale) });\n case 'theme': return item(id, menuText('theme'), 'palette', { submenu: true, hint: themeId ? config.themes!.themeName(themeId) : undefined });\n case 'mode': {\n const label = modeList.find(entry => entry.id === mode)?.label;\n return item(id, t('wb.modes.section'), 'layers', { submenu: true, hint: label && modeStatus?.custom ? t('wb.modes.custom', { mode: label }) : label });\n }\n case 'zoom': return { kind: 'zoom', id: 'zoom' };\n case 'plugins': return item(id, section(t('wb.panel.section.plugins')), 'plug', { run: () => shell.openPanelSection('plugins') });\n case 'store': return item(id, section(t('wb.panel.section.store')), 'bag', { run: () => shell.openPanelSection('store') });\n case 'strings': return item(id, section(menuText('strings')), 'globe', { run: () => shell.openPanelSection('languages') });\n case 'workspaces': return item(id, t('wb.ws.title'), 'layout', { submenu: true, hint: workspaces.store.items.find(entry => entry.id === workspaces.active)?.name });\n case 'find': return item(id, menuText('find'), 'search', { shortcut: 'Ctrl+F', disabled: !(shell.api?.panels ?? []).some(panel => isWeb(panel) && panel.api.isVisible), run: () => shell.shortcut('find') });\n case 'shortcuts': return item(id, menuText('shortcuts'), 'keyboard', { run: () => (menu.shortcuts ? menu.shortcuts() : shell.shortcut('command-palette')) });\n case 'palette': return item(id, menuText('palette'), 'command', { shortcut: 'Ctrl+K', run: () => shell.shortcut('command-palette') });\n case 'developer': return item(id, menuText('developer'), 'code', { submenu: true });\n case 'updates': {\n // A real check: the row asks the updater now and says what came of it (the titlebar chip stays the loud part).\n const row = updateRow(update, askedUpdate, version);\n return item(id, row.label, 'reload', {\n hint: row.hint, title: row.title, keepOpen: row.action === 'check' || row.action === 'wait',\n run: async () => {\n if (row.action === 'open') { shell.openPanelSection('updates'); return; }\n if (row.action === 'restart') { await invoke('apply_update'); return; }\n if (row.action !== 'check') return;\n setAskedUpdate(true);\n setUpdate({ state: 'checking' });\n // One request, no retry: whatever the updater answers is what the row says.\n try { setUpdate(parseUpdateStatus(await invoke('update_check'))); } catch { setUpdate({ state: 'error', message: '' }); }\n },\n });\n }\n // Off: a submenu that says what it does before anything reloads. On: one row that leaves it.\n case 'safe-mode': return safe.active\n ? item(id, menuText('safeLeave'), 'shield', { run: () => setSafeMode(false) })\n : item(id, menuText('safeRestart'), 'shield', { submenu: true });\n case 'report': return item(id, menuText('report'), 'flag', { run: () => setReporting(true) });\n case 'about': return item(id, menuText('about', { product: config.product }), 'info', { run: () => shell.openPanelSection('home') });\n case 'settings': return item(id, section(t('wb.panel.section.settings')), 'settings', { run: () => shell.openPanelSection('settings') });\n }\n }\n\n function submenuRows(id: string): MenuRow[] {\n switch (id) {\n case 'language': {\n const languages = menu.languages;\n if (!languages) return [];\n const rows = languageRows(languages.list, languages.state(), { site: t('wb.settings.language.followSite'), system: t('wb.settings.language.followSystem'), more: menuText('moreLanguages') });\n return rows.map(row => {\n if (row.kind !== 'item') return row;\n const choice = languageChoice(row.id);\n // Switching is live and the menu stays: what was picked can be read (or undone) on the spot.\n return choice ? { ...row, keepOpen: true, run: () => languages.set(choice) } : { ...row, run: () => openSettingsAt('language') };\n });\n }\n case 'theme': {\n const themes = config.themes;\n if (!themes || !themeState) return [];\n const list: MenuRow[] = themes.allThemes(themeState.choice).map(theme => item(`theme:${theme.id}`, theme.name, undefined, {\n check: 'radio', checked: theme.id === themeId, keepOpen: true, swatch: themes.adapter.dots(theme),\n // As Appearance does: a theme starts without the customizations made on another one.\n run: () => themes.setChoice(themes.adapter.choiceForId(themeState.choice, theme.id)),\n }));\n return joinGroups([list, [\n item('theme:builder', section(t('wb.panel.section.builder')), 'edit', { run: () => shell.openPanelSection('builder') }),\n item('theme:more', menuText('moreAppearance'), 'palette', { run: () => shell.openPanelSection('themes') }),\n ]]);\n }\n case 'mode': {\n const modes = menu.modes;\n if (!modes) return [];\n const name = (modeId: string) => modeList.find(entry => entry.id === modeId)?.label ?? modeId;\n const apply = async (to: string, keep: boolean) => { await modes.apply(to, keep); setMode(to); close('action'); };\n const at = path.indexOf('mode') + 1;\n if (asking?.reapply && modeStatus) {\n // What applying the mode again turns on and off, said before it happens.\n return [\n { kind: 'note', id: 'mode:reapply-hint', title: t('wb.modes.reapply', { mode: name(asking.to) }), text: t('wb.modes.reapplyHint', { mode: name(asking.to) }) },\n ...(modeStatus.on.length ? [{ kind: 'note' as const, id: 'mode:reapply-on', title: '', text: t('wb.modes.turnsOn', { list: modeStatus.on.join(', ') }) }] : []),\n ...(modeStatus.off.length ? [{ kind: 'note' as const, id: 'mode:reapply-off', title: '', text: t('wb.modes.turnsOff', { list: modeStatus.off.join(', ') }) }] : []),\n item('mode:reapply-yes', t('wb.modes.reapply', { mode: name(asking.to) }), 'reload', { keepOpen: true, run: async () => { await modes.reapply?.(); close('action'); } }),\n item('mode:cancel', t('wb.common.cancel'), 'close', { keepOpen: true, run: () => { focusNext.current = { level: at, id: 'mode:reapply' }; setAsking(null); } }),\n ];\n }\n if (asking) {\n // The question Settings asks: what was changed by hand stays, or the mode is taken as it is.\n return [\n { kind: 'note', id: 'mode:question', title: t('wb.modes.keepQuestion'), text: t('wb.modes.keepHint', { count: asking.changes }) },\n item('mode:keep', t('wb.modes.keep'), 'check', { keepOpen: true, run: () => apply(asking.to, true) }),\n item('mode:reset', t('wb.modes.reset', { mode: name(asking.to) }), 'reload', { keepOpen: true, run: () => apply(asking.to, false) }),\n item('mode:cancel', t('wb.common.cancel'), 'close', { keepOpen: true, run: () => { focusNext.current = { level: at, id: `mode:${asking.to}` }; setAsking(null); } }),\n ];\n }\n const list = modeList.map(entry => item(`mode:${entry.id}`, entry.label, undefined, {\n check: 'radio', checked: entry.id === mode, keepOpen: true,\n run: async () => {\n if (entry.id === mode) { close('action'); return; }\n const changes = await modes.changes(entry.id);\n if (changes > 0) { focusNext.current = { level: at, edge: 'first' }; setAsking({ to: entry.id, changes }); } else await apply(entry.id, false);\n },\n }));\n if (!mode || !modeStatus?.custom || !modes.reapply) return list;\n // The mode is a starting point: the features moved on, and nothing applies it again unasked.\n const grew: MenuRow[] = modeStatus.added > 0 ? [{ kind: 'note', id: 'mode:grew', title: '', text: t('wb.modes.grew', { mode: name(mode), count: modeStatus.added }) }] : [];\n return joinGroups([list, [\n { kind: 'note', id: 'mode:custom', title: t('wb.modes.custom', { mode: name(mode) }) },\n ...grew,\n item('mode:reapply', t('wb.modes.reapply', { mode: name(mode) }), 'reload', {\n keepOpen: true,\n run: () => {\n focusNext.current = { level: at, edge: 'first' };\n setAsking({ to: mode, changes: 0, reapply: true });\n if (modeStatus.added > 0) void modes.seen?.().then(() => setModeStatus({ ...modeStatus, added: 0 }), () => {});\n },\n }),\n ]]);\n }\n case 'workspaces': {\n const list = workspaceList();\n const rows: MenuRow[] = list.length\n ? list.map(entry => item(`ws:${entry.id}`, entry.name, undefined, { check: 'radio', checked: entry.id === workspaces.active, hint: t('wb.ws.tabs', { count: entry.tabs }), run: () => restoreWorkspace(entry.id) }))\n : [{ kind: 'note', id: 'ws:none', title: '', text: menuText('noWorkspaces') }];\n return joinGroups([rows, [item('ws:save', menuText('saveLayout'), 'plus', { run: openWorkspaceSave })]]);\n }\n case 'safe-mode': return [\n { kind: 'note', id: 'safe:question', title: menuText('safeQuestion'), text: menuText('safeExplain') },\n item('safe:confirm', menuText('safeConfirm'), 'shield', { run: () => setSafeMode(true) }),\n item('safe:cancel', t('wb.common.cancel'), 'close', { keepOpen: true, run: () => closeSub(path.indexOf('safe-mode') + 1) }),\n ];\n case 'developer': return [\n item('dev:mode', t('wb.dev.mode'), undefined, { check: 'checkbox', checked: dev.enabled, keepOpen: true, run: async () => { await invoke('dev_set', { enabled: !dev.enabled }); await refreshDev(); } }),\n item('dev:folder', menuText('pluginsFolder'), 'folder', { run: () => invoke('plugins_open_folder') }),\n ];\n default: return specRows(findSpec(groups, id)?.submenu?.() ?? []);\n }\n }\n\n const groups = menu.groups ?? DEFAULT_MENU;\n const env: MenuEnv = {\n decks: !!config.deck, languages: !!menu.languages, themes: !!config.themes, modes: modeList.length > 0,\n zoom: hasFeature('zoom'), find: hasFeature('find'), safeMode: hasFeature('safeMode'), store: hasFeature('store'), strings: config.features?.strings === true, workspaces: hasFeature('workspaces'), developer: hasFeature('developer'), updates: hasFeature('updates'),\n };\n const rootRows = () => joinGroups(planMenu(groups, env).map(group => group.flatMap(entry => (typeof entry === 'string' ? [builtin(entry)] : specRows([entry])))));\n const labelOf = (id: string, rows: MenuRow[]) => rows.find((row): row is MenuItemRow => row.kind === 'item' && row.id === id)?.label ?? '';\n\n // -------------------------------------------------------------------------------------------\n // Keyboard and pointer\n\n function onKey(event: ReactKeyboardEvent<HTMLDivElement>) {\n const target = event.target as HTMLElement;\n const menuEl = target.closest<HTMLElement>('[data-level]');\n if (!menuEl) return;\n const level = Number(menuEl.dataset.level);\n const { key } = event;\n // The keyboard leads now: the row under a resting pointer takes the focus back only when the pointer moves on.\n clearTimeout(hover.current.timer);\n hover.current = { el: null };\n const keys = submenuKeys(getComputedStyle(menuEl).direction === 'rtl');\n const done = () => { event.preventDefault(); event.stopPropagation(); };\n if (key === 'Escape') { done(); if (level > 0) closeSub(level); else close('escape'); return; }\n if (key === 'Tab') { done(); close('escape'); return; }\n // The zoom row is one stop: left and right move through − + and reset (laid out left to right).\n if ('zoom' in target.dataset && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n done();\n const controls = Array.from(menuEl.querySelectorAll<HTMLElement>('[data-zoom]'));\n controls[Math.max(0, Math.min(controls.length - 1, controls.indexOf(target) + (key === 'ArrowRight' ? 1 : -1)))]?.focus();\n return;\n }\n if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Home' || key === 'End') {\n done();\n const stops = stopsOf(menuEl);\n stops[moveStop(stops.indexOf(target), key, stops.length)]?.focus();\n return;\n }\n if (key === keys.open) {\n if (target.getAttribute('aria-haspopup') === 'menu' && target.dataset.item) { done(); openSub(level, target.dataset.item, true); }\n return;\n }\n if (key === keys.close) { if (level > 0) { done(); closeSub(level); } return; }\n const now = Date.now();\n const typing = !!typed.current.text && now - typed.current.at <= 700;\n // Enter, and Space outside a typed word: the row's own click chooses it; on the menu itself nothing is chosen.\n if (key === 'Enter' || (key === ' ' && !typing)) {\n if (target === menuEl) done();\n typed.current.text = '';\n return;\n }\n if (key.length !== 1 || event.ctrlKey || event.metaKey || event.altKey) return;\n // Type-ahead: the next row whose label starts with what was typed.\n done();\n typed.current = { text: typing ? typed.current.text + key : key, at: now };\n const stops = stopsOf(menuEl);\n const found = typeahead(stops.map(el => el.dataset.label ?? ''), stops.indexOf(target), typed.current.text);\n if (found >= 0) stops[found]!.focus();\n }\n\n /** The pointer moves the focus, like the arrows do: one highlight. A row with a submenu opens it after a beat. */\n function onHover(row: MenuItemRow | null, level: number, el: HTMLElement) {\n if (hover.current.el === el) return;\n clearTimeout(hover.current.timer);\n hover.current = { el };\n if (document.activeElement !== el) el.focus({ preventScroll: true });\n if (row?.submenu) {\n if (path[level] !== row.id) hover.current.timer = setTimeout(() => openSub(level, row.id), 170);\n } else if (path.length > level) {\n hover.current.timer = setTimeout(() => { setPath(current => current.slice(0, level)); setAsking(null); }, 280);\n }\n }\n\n // -------------------------------------------------------------------------------------------\n\n function renderRow(row: MenuRow, level: number, index: number) {\n if (row.kind === 'separator') return <hr key={`sep${index}`} role=\"separator\"/>;\n if (row.kind === 'note') {\n return <div key={row.id} className={`bt-app-note${row.tone === 'error' ? ' is-error' : ''}`} role={row.tone === 'error' ? 'alert' : 'presentation'}>\n {row.title && <strong>{row.title}</strong>}{row.text && <span>{row.text}</span>}\n </div>;\n }\n if (row.kind === 'zoom') {\n const tab = zoomTarget();\n const factor = zoomOf(tab);\n const control = (id: string, label: string, icon: IconName, direction: 1 | -1 | 0, off: boolean, className = '') =>\n <button type=\"button\" role=\"menuitem\" tabIndex={-1} className={className} data-item={`zoom:${id}`} data-zoom=\"\" data-label={menuText('zoom')}\n aria-label={label} title={tab ? label : menuText('zoomNone')} aria-disabled={off}\n onPointerMove={event => onHover(null, level, event.currentTarget)} onClick={() => { if (!off) void stepZoom(direction, tab); }}>\n <Icon name={icon}/>\n </button>;\n return <div key=\"zoom\" className={`bt-app-zoom${tab ? '' : ' is-off'}`} role=\"group\" aria-label={menuText('zoom')} title={tab ? undefined : menuText('zoomNone')}>\n <Icon name=\"zoom\"/>\n <span className=\"bt-menu-label\">{menuText('zoom')}</span>\n <span className=\"bt-app-zoom-step\">\n {control('out', menuText('zoomOut'), 'minus', -1, !tab || factor <= ZOOM_MIN)}\n <output className=\"bt-app-zoom-value\" aria-live=\"polite\">{percent(factor)}</output>\n {control('in', menuText('zoomIn'), 'plus', 1, !tab || factor >= ZOOM_MAX)}\n </span>\n {control('reset', menuText('zoomReset'), 'reload', 0, !tab || factor === 1, 'bt-app-zoom-reset')}\n </div>;\n }\n const expanded = row.submenu ? path[level] === row.id : undefined;\n return <button key={row.id} type=\"button\" tabIndex={-1} disabled={row.disabled} data-item={row.id} data-label={row.label} title={row.title}\n role={row.check === 'radio' ? 'menuitemradio' : row.check ? 'menuitemcheckbox' : 'menuitem'} aria-checked={row.check ? !!row.checked : undefined}\n aria-haspopup={row.submenu ? 'menu' : undefined} aria-expanded={expanded}\n onPointerMove={event => onHover(row, level, event.currentTarget)} onClick={() => void activate(row, level)}>\n {row.check ? <span className=\"bt-app-check\">{row.checked && <Icon name=\"check\"/>}</span> : row.icon ? <Icon name={row.icon}/> : <span className=\"bt-app-check\"/>}\n {/* A language's own name keeps its own direction (<bdi>) but starts where every other label does. */}\n <span className=\"bt-menu-label\">{row.lang ? <bdi lang={row.lang} dir={row.dir}>{row.label}</bdi> : row.label}</span>\n {row.swatch && <span className=\"wb-dots\" aria-hidden=\"true\" style={{ background: row.swatch.page }}>\n <i style={{ background: row.swatch.bg, boxShadow: `inset 0 0 0 1px ${row.swatch.border}` }}/><i style={{ background: row.swatch.text }}/><i style={{ background: row.swatch.accent }}/>\n </span>}\n {row.hint && <span className=\"bt-app-hint\">{row.hint}</span>}\n {row.shortcut && <span className=\"bt-menu-keys\">{shortcutText(row.shortcut, mac)}</span>}\n {row.submenu && <Icon name=\"chevronRight\" className=\"bt-app-chevron\"/>}\n </button>;\n }\n\n function renderMenus() {\n const root = rootRows();\n const levels: Array<{ rows: MenuRow[]; label: string }> = [{ rows: root, label: menuText('label') }];\n path.forEach((id, index) => levels.push({ rows: submenuRows(id), label: labelOf(id, levels[index]!.rows) }));\n // An error belongs to the level it happened on: the deepest one open.\n if (error) levels[levels.length - 1]!.rows = [...levels[levels.length - 1]!.rows, { kind: 'note', id: 'error', title: '', text: error, tone: 'error' }];\n return levels.map(({ rows, label }, level) => <div key={level === 0 ? 'root' : `${level}:${path[level - 1]}`} role=\"menu\" aria-label={label} tabIndex={-1} data-level={level}\n className={level === 0 ? `bt-menu bt-app-menu bt-pop${anchor.at === 'logo' ? '' : ' bt-pop--right'}` : 'bt-menu bt-app-menu bt-app-sub'}\n style={level === 0 ? { top: anchor.top, left: anchor.left, right: anchor.right, maxHeight: `calc(100vh - ${anchor.top + 8}px)` } : undefined}>\n {rows.map((row, index) => renderRow(row, level, index))}\n </div>);\n }\n\n const label = menuText('label');\n return <>\n {trigger && <button ref={button} type=\"button\" className=\"bt-app-button\" aria-haspopup=\"menu\" aria-expanded={open && anchor.at === 'button'} aria-label={label} title={`${label} (${APP_MENU_KEYS})`}\n onClick={event => (open && anchor.at === 'button' ? close('escape') : show({ keyboard: event.detail === 0 }))}>\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"5.75\" r=\"1.6\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\"/><circle cx=\"12\" cy=\"18.25\" r=\"1.6\"/></svg>\n </button>}\n {open && createPortal(<div className=\"bt-menu-backdrop\" onMouseDown={() => close()} onContextMenu={event => { event.preventDefault(); close(); }}>\n <div ref={layers} className=\"bt-app-layers\" onMouseDown={event => event.stopPropagation()} onContextMenu={event => { event.preventDefault(); event.stopPropagation(); }} onKeyDown={onKey}>\n {renderMenus()}\n </div>\n </div>, document.body)}\n {reporting && <ReportDialog onClose={() => setReporting(false)}/>}\n </>;\n}\n\n/**\n * The app's logo at the start of the titlebar: a second trigger of the same menu, hung under the\n * logo. A click opens it; a press that turns into a drag moves the window, as the titlebar around\n * it does; a right-click shows the window's system menu, where a titlebar icon has always had it.\n */\nexport function AppMenuLogo() {\n useT();\n const [expanded, setExpanded] = useState(openAt === 'logo');\n const press = useRef<{ x: number; y: number; dragged: boolean } | null>(null);\n useEffect(() => {\n const update = () => setExpanded(openAt === 'logo');\n window.addEventListener('bt-app-menu-state', update);\n return () => window.removeEventListener('bt-app-menu-state', update);\n }, []);\n const { product, logo } = site();\n const label = menuText('label');\n return <button type=\"button\" className=\"bt-titlebar-logo\" aria-haspopup=\"menu\" aria-expanded={expanded} aria-label={`${product}: ${label}`} title={`${product} · ${label}`}\n onPointerDown={event => { if (event.button === 0) press.current = { x: event.clientX, y: event.clientY, dragged: false }; }}\n onPointerMove={event => {\n const start = press.current;\n if (!start || start.dragged || !(event.buttons & 1)) return;\n // The press became a drag: the window moves, and no menu opens when the button is released.\n if (Math.hypot(event.clientX - start.x, event.clientY - start.y) > 5) { start.dragged = true; startDrag(); }\n }}\n onClick={event => {\n const dragged = press.current?.dragged;\n press.current = null;\n if (!dragged) openAppMenu({ anchor: 'logo', toggle: true, keyboard: event.detail === 0 });\n }}\n onContextMenu={event => {\n event.preventDefault(); event.stopPropagation();\n const scale = window.devicePixelRatio || 1;\n systemMenu(Math.round(event.screenX * scale), Math.round(event.screenY * scale));\n }}>\n <img src={logo} alt=\"\" draggable={false}/>\n </button>;\n}\n"]}
1
+ {"version":3,"file":"AppMenu.js","sourceRoot":"","sources":["../../../../../../shell/src/frame/AppMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["// The app menu (\"Settings and more\"). Its trigger is the app's choice (`ShellMenu.trigger`): by\n// default each pane's wayBetter button at the end of its toolbar (`PaneMenuButton`; the menu hangs\n// under the button that was clicked, so in split view each pane opens it under itself), else a\n// button at the end of the titlebar or the titlebar's logo. It also opens on Alt+F and F10\n// (Shell.tsx; a focused tab forwards the keys), from the command palette and from the last row of\n// the account menu: under the focused pane's button (the first one on screen when no pane is\n// focused). Its rows are the app's (`ShellSite.menu`, menuModel.ts): built-in ones by name, each\n// shown only when the app serves what it needs, and the app's own.\n//\n// Like every shell menu it is an overlay: while open the shell is raised above the tab webviews\n// (`setOverlay`), panes stay visible and nothing is dimmed. Keyboard: arrows, Home/End, type-ahead,\n// the arrow pointing along the reading direction opens a submenu and the other one closes it,\n// Enter or Space chooses, Esc closes one level. Submenus fly out beside the menu and stay inside\n// the window (in a narrow one they lie over it). Words: menuMessages.en.json (`menuText`).\n\nimport { useEffect, useLayoutEffect, useReducer, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { parseUpdateStatus, type UpdateStatus } from '../updateModel.ts';\nimport { invoke, listen } from './bridge.ts';\nimport { describe, diag } from './diag.ts';\nimport { decks } from './deckStore.ts';\nimport { refreshDev } from './devHost.ts';\nimport { useDev, usePaneTick, useT } from './hooks.ts';\nimport { formatNumber } from './i18n.ts';\nimport { Icon, type IconName } from './icons.tsx';\nimport {\n DEFAULT_MENU, ZOOM_MAX, ZOOM_MIN, findSpec, joinGroups, languageChoice, languageRows, menuText, moveStop, planMenu, resolveTrigger, shortcutText, specRows, submenuKeys, submenuLeft, typeahead, updateRow,\n type AppMenuTrigger, type BuiltinMenuItem, type MenuEnv, type MenuItemRow, type MenuModeStatus, type MenuRow,\n} from './menuModel.ts';\nimport { ReportDialog } from './ReportDialog.tsx';\nimport { safe, setSafeMode } from './safeStore.ts';\nimport { hasFeature, site } from './site.ts';\nimport { isWeb, setOverlay, shell, type TabParams } from './state.ts';\nimport { openWorkspaceSave } from './TitlebarExtras.tsx';\nimport { os, startDrag, systemMenu } from './windowBinding.ts';\nimport { loadWorkspaces, restoreWorkspace, workspaceList, workspaces } from './workspaces.ts';\nimport { readZoom, stepZoom, zoomOf, zoomTarget } from './zoomStore.ts';\nimport './appMenu.css';\n\n/**\n * How the menu is asked to open: at a trigger other than the app's own (`anchor`), under one pane's\n * button (`pane`, a dockview panel id), at a submenu, with the first row focused (keyboard), or\n * closing if it is open at that place.\n */\nexport type AppMenuRequest = { anchor?: AppMenuTrigger; pane?: string; submenu?: string; keyboard?: boolean; toggle?: boolean };\n\n/** Opens the app menu (Alt+F / F10, the palette, the account menu's last row). */\nexport const openAppMenu = (request: AppMenuRequest = {}) => window.dispatchEvent(new CustomEvent('bt-app-menu', { detail: request }));\n\n/** Opens the \"Report a problem\" summary (the native menu bar's Help item). */\nexport const openReport = () => window.dispatchEvent(new CustomEvent('bt-report'));\n\nconst mac = os === 'macos';\n/** The keys that open the menu, as the button's tooltip and the account menu write them. */\nexport const APP_MENU_KEYS = mac ? 'F10' : 'Alt+F';\n\nconst getError = (error: unknown) => (error instanceof Error ? error.message : String(error)).replace(/^Error: /, '');\nconst percent = (factor: number) => formatNumber(factor, { style: 'percent', maximumFractionDigits: 0 });\n\ntype Focus = { level: number; id?: string; edge?: 'first' | 'last' | 'menu' };\n/**\n * Where the menu hangs: under a button (its end edge lined up with the button's: from the window's\n * right edge, or from the left in a right-to-left pane) or under the logo (from its start edge).\n */\ntype Anchor = { at: AppMenuTrigger; pane?: string; top: number; left?: number; right?: number };\n\n/** One trigger, as a key: `pane:<id>` for a pane's button. */\nconst triggerKey = (at: AppMenuTrigger, pane?: string) => (at === 'pane' ? `pane:${pane ?? ''}` : at);\n\n/** Which trigger the open menu hangs from (null: closed), for the triggers' `aria-expanded`. */\nlet openAt: string | null = null;\nfunction noteOpen(key: string | null) {\n if (openAt === key) return;\n openAt = key;\n window.dispatchEvent(new CustomEvent('bt-app-menu-state'));\n}\n\n/** `aria-expanded` of one trigger. */\nfunction useExpanded(key: string) {\n const [expanded, setExpanded] = useState(openAt === key);\n useEffect(() => {\n const update = () => setExpanded(openAt === key);\n update();\n window.addEventListener('bt-app-menu-state', update);\n return () => window.removeEventListener('bt-app-menu-state', update);\n }, [key]);\n return expanded;\n}\n\n/** Pane `id`'s menu button on screen; else the focused pane's; else the first one on screen. */\nfunction paneButton(id?: string): HTMLElement | null {\n const shown = Array.from(document.querySelectorAll<HTMLElement>('.bt-pane-menu[data-pane]')).filter(el => el.getClientRects().length > 0);\n const find = (want: string | undefined) => (want ? shown.find(el => el.dataset.pane === want) : undefined);\n return find(id) ?? find(shell.api?.activePanel?.id) ?? shown[0] ?? null;\n}\n\n/** The rows of one level a key can stop on: enabled items; the zoom row counts once. */\nfunction stopsOf(menu: HTMLElement): HTMLElement[] {\n const all = Array.from(menu.querySelectorAll<HTMLElement>('[data-item]:not(:disabled)'));\n const active = document.activeElement;\n const zoom = all.filter(el => 'zoom' in el.dataset);\n const keep = zoom.find(el => el === active) ?? zoom.find(el => el.getAttribute('aria-disabled') !== 'true') ?? zoom[0];\n return all.filter(el => !('zoom' in el.dataset) || el === keep);\n}\n\n/**\n * The menu (mounted once, in the titlebar). `trigger`: where clicks and keys open it; default the\n * app's `ShellMenu.trigger`, else `pane`. `true` / `false` are the older spellings of `button` / `logo`.\n */\nexport function AppMenu({ trigger }: { trigger?: AppMenuTrigger | boolean } = {}) {\n const t = useT();\n usePaneTick();\n const dev = useDev();\n const config = site();\n const menu = config.menu ?? {};\n const [open, setOpen] = useState(false);\n const [path, setPath] = useState<string[]>([]);\n const [anchor, setAnchor] = useState<Anchor>({ at: 'button', top: 50, right: 8 });\n const [mode, setMode] = useState<string | null>(null);\n const [modeStatus, setModeStatus] = useState<MenuModeStatus | null>(null);\n const [asking, setAsking] = useState<{ to: string; changes: number; reapply?: boolean } | null>(null);\n const [version, setVersion] = useState('');\n const [update, setUpdate] = useState<UpdateStatus>({ state: 'idle' });\n const [askedUpdate, setAskedUpdate] = useState(false);\n const [reporting, setReporting] = useState(false);\n const [error, setError] = useState('');\n const [, tick] = useReducer((n: number) => n + 1, 0);\n const button = useRef<HTMLButtonElement>(null);\n const layers = useRef<HTMLDivElement>(null);\n const focusNext = useRef<Focus | null>(null);\n const before = useRef<HTMLElement | null>(null);\n const hover = useRef<{ el: Element | null; timer?: ReturnType<typeof setTimeout> }>({ el: null });\n const typed = useRef({ text: '', at: 0 });\n const live = useRef({ open, path });\n live.current = { open, path };\n\n // Whatever a row shows may change while the menu is open (a language or theme picked in it).\n useEffect(() => {\n const events = ['bt-zoom', 'bt-workspaces', 'bt-decks', 'bt-site', 'bt-safe'];\n for (const event of events) window.addEventListener(event, tick);\n const off = [config.themes?.subscribe(tick), menu.languages?.subscribe(tick)];\n return () => {\n for (const event of events) window.removeEventListener(event, tick);\n for (const dispose of off) dispose?.();\n };\n }, []);\n\n /** Where a request without an anchor opens: the app's trigger. */\n const home = (): AppMenuTrigger => menuTrigger(trigger);\n\n /** The element a request hangs the menu under (null: none on screen). */\n function triggerOf(at: AppMenuTrigger, pane?: string): HTMLElement | null {\n if (at === 'pane') return paneButton(pane);\n if (at === 'logo') return document.querySelector<HTMLElement>('button.bt-titlebar-logo');\n return button.current;\n }\n\n function show(request: AppMenuRequest = {}) {\n const at = request.anchor ?? home();\n const el = triggerOf(at, request.pane);\n const pane = at === 'pane' ? el?.dataset.pane : undefined;\n diag(`menu open: anchor=${at} keyboard=${!!request.keyboard} hasFocus=${document.hasFocus()} active=${describe(document.activeElement)}`);\n const rect = el?.getBoundingClientRect();\n if (rect) {\n const top = Math.round(rect.bottom + 6);\n const rtl = getComputedStyle(el!).direction === 'rtl';\n if (at === 'logo') setAnchor({ at, top, left: Math.max(8, Math.round(rect.left - 3)) });\n // The menu's end edge lines up with its button's, so it opens over the pane the button is in.\n else if (rtl) setAnchor({ at, pane, top, left: Math.max(8, Math.round(rect.left)) });\n else setAnchor({ at, pane, top, right: Math.max(8, Math.round(window.innerWidth - rect.right)) });\n } else {\n // No trigger on screen (only the app's own tab, a deck): under the titlebar, at its end.\n setAnchor({ at, pane, top: 50, right: 8 });\n }\n const active = document.activeElement as HTMLElement | null;\n before.current = active && active !== document.body && document.hasFocus() ? active : null;\n // Keys pressed in a tab open the menu: the shell takes the keyboard. A click on the shell already\n // gave it the keyboard, so nothing native is asked for then.\n if (!document.hasFocus()) invoke('shell_focus').catch(() => {});\n setAsking(null); setError('');\n setPath(request.submenu ? [request.submenu] : []);\n focusNext.current = request.submenu ? { level: 1, edge: 'first' } : { level: 0, edge: request.keyboard ? 'first' : 'menu' };\n setOpen(true);\n // What the rows show, read fresh.\n void readZoom(zoomTarget());\n if (hasFeature('developer')) void refreshDev();\n if (hasFeature('workspaces') && !workspaces.loaded) void loadWorkspaces().catch(() => {});\n void config.themes?.loadThemes();\n menu.modes?.current().then(setMode, () => {});\n menu.modes?.status?.().then(setModeStatus, () => {});\n if (!version) menu.version?.().then(setVersion, () => {});\n setAskedUpdate(false);\n if (hasFeature('updates')) invoke('update_status').then(value => setUpdate(parseUpdateStatus(value)), () => {});\n }\n\n /** `escape`: back to what had focus before. `action` and `away`: nothing focused, so typing returns to the active pane. */\n function close(how: 'escape' | 'action' | 'away' = 'away', why = '') {\n diag(`menu close: ${how}${why ? ` (${why})` : ''} hasFocus=${document.hasFocus()}`);\n clearTimeout(hover.current.timer);\n hover.current = { el: null };\n focusNext.current = null;\n setOpen(false); setPath([]); setAsking(null); setError('');\n if (how === 'escape' && before.current?.isConnected) before.current.focus();\n before.current = null;\n }\n\n // The updater's steps (checking, downloading, ready) as they happen.\n useEffect(() => {\n if (!hasFeature('updates')) return;\n let disposed = false;\n let unlisten: (() => void) | undefined;\n listen('update-status', event => setUpdate(parseUpdateStatus(event.payload)))\n .then(dispose => { if (disposed) dispose(); else unlisten = dispose; })\n .catch(() => {});\n return () => { disposed = true; unlisten?.(); };\n }, []);\n\n useEffect(() => {\n const onRequest = (event: Event) => {\n const request = (event as CustomEvent<AppMenuRequest | undefined>).detail ?? {};\n // Asked again from another trigger, the open menu moves there instead of closing.\n const at = request.anchor ?? home();\n const key = triggerKey(at, at === 'pane' ? request.pane ?? paneButton()?.dataset.pane : undefined);\n if (live.current.open && request.toggle && key === openAt) close('escape'); else show(request);\n };\n window.addEventListener('bt-app-menu', onRequest);\n return () => window.removeEventListener('bt-app-menu', onRequest);\n }, [version]);\n\n useEffect(() => {\n const show = () => setReporting(true);\n window.addEventListener('bt-report', show);\n return () => window.removeEventListener('bt-report', show);\n }, []);\n\n useEffect(() => {\n if (!open) return;\n // Native tab webviews would cover the menu.\n setOverlay(1);\n // The window lost the keyboard: the menu closes, unless the focus is back a moment later (taking the\n // keyboard from a tab for Alt+F / F10 can pass through a blur on its way to the shell).\n let leaving: ReturnType<typeof setTimeout> | undefined;\n const away = () => {\n diag(`menu: window blur hasFocus=${document.hasFocus()}`);\n clearTimeout(leaving);\n leaving = setTimeout(() => { if (!document.hasFocus()) close('away', 'blur'); else diag('menu: blur passed, focus is back'); }, 160);\n };\n const resized = () => close();\n // Keys while nothing in the menu has focus (a click on its padding): Esc closes, arrows enter it.\n const onKey = (event: KeyboardEvent) => {\n if (layers.current?.contains(event.target as Node)) return;\n if (event.key === 'Escape') { event.preventDefault(); close('escape'); return; }\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n focusNext.current = { level: live.current.path.length, edge: event.key === 'ArrowDown' ? 'first' : 'last' };\n tick();\n }\n };\n window.addEventListener('blur', away);\n window.addEventListener('resize', resized);\n window.addEventListener('keydown', onKey);\n return () => { clearTimeout(leaving); setOverlay(-1); window.removeEventListener('blur', away); window.removeEventListener('resize', resized); window.removeEventListener('keydown', onKey); };\n }, [open, anchor.at]);\n\n // The trigger the menu hangs from shows it is open.\n useEffect(() => {\n noteOpen(open ? triggerKey(anchor.at, anchor.pane) : null);\n return () => noteOpen(null);\n }, [open, anchor.at, anchor.pane]);\n\n const layer =(level: number) => layers.current?.querySelector<HTMLElement>(`[data-level=\"${level}\"]`) ?? null;\n\n // After every render: submenus sit beside their row, inside the window; then the focus that was asked for.\n useLayoutEffect(() => {\n if (!open) return;\n // The menu stays inside the window: a button near the start edge (a narrow pane in split view)\n // would push it out, so it slides back in.\n const root = layer(0);\n if (root) {\n const edge = 8;\n root.style.left = anchor.left === undefined ? '' : `${anchor.left}px`;\n root.style.right = anchor.right === undefined ? '' : `${anchor.right}px`;\n const box = root.getBoundingClientRect();\n if (box.left < edge || box.right > window.innerWidth - edge) {\n root.style.left = `${Math.round(Math.max(edge, Math.min(box.left, window.innerWidth - edge - box.width)))}px`;\n root.style.right = 'auto';\n }\n }\n for (let level = 1; level <= path.length; level += 1) {\n const el = layer(level);\n const parent = layer(level - 1);\n const row = parent?.querySelector<HTMLElement>(`[data-item=\"${CSS.escape(path[level - 1]!)}\"]`);\n if (!el || !parent) continue;\n const edge = 8;\n const box = parent.getBoundingClientRect();\n el.style.maxHeight = `${window.innerHeight - edge * 2}px`;\n const { width, height } = el.getBoundingClientRect();\n const left = submenuLeft(box, width, window.innerWidth, edge);\n // It slides in from the side it hangs on.\n el.style.setProperty('--bt-app-sub-from', left < box.left ? '6px' : '-6px');\n const top = Math.max(edge, Math.min((row?.getBoundingClientRect().top ?? box.top) - 6, window.innerHeight - height - edge));\n el.style.left = `${Math.round(left)}px`;\n el.style.top = `${Math.round(top)}px`;\n }\n const want = focusNext.current;\n const el = want ? layer(want.level) : null;\n if (!want || !el) return;\n focusNext.current = null;\n const stops = stopsOf(el);\n const target = want.id ? el.querySelector<HTMLElement>(`[data-item=\"${CSS.escape(want.id)}\"]:not(:disabled)`)\n : want.edge === 'menu' ? el : want.edge === 'last' ? stops[stops.length - 1] : stops[0];\n (target ?? el).focus();\n });\n\n const openSub = (level: number, id: string, focus = false) => {\n setPath(current => [...current.slice(0, level), id]);\n setAsking(null); setError('');\n if (focus) focusNext.current = { level: level + 1, edge: 'first' };\n };\n /** Closes the submenu at `level`; its row gets the focus back. */\n const closeSub = (level: number) => {\n focusNext.current = { level: level - 1, id: path[level - 1] };\n setPath(current => current.slice(0, level - 1));\n setAsking(null); setError('');\n };\n\n async function activate(row: MenuItemRow, level: number) {\n if (row.disabled) return;\n if (row.submenu) {\n if (path[level] === row.id) { focusNext.current = { level: level + 1, edge: 'first' }; tick(); } else openSub(level, row.id, true);\n return;\n }\n setError('');\n if (!row.keepOpen) close('action');\n try { await row.run?.(); }\n catch (failure) { if (row.keepOpen) setError(getError(failure)); else console.error('[shell] menu', failure); }\n }\n\n // -------------------------------------------------------------------------------------------\n // Rows\n\n const item = (id: string, label: string, icon: IconName | undefined, rest: Partial<MenuItemRow> = {}): MenuItemRow => ({ kind: 'item', id, label, icon, ...rest });\n /** \"Plugins…\": a row that opens a section of the app's panel. */\n const section = (name: string) => menuText('section', { section: name });\n const active = shell.api?.activePanel;\n const activeParams = active?.params as TabParams | undefined;\n const canSplit = !!active && (isWeb(active) || active.group.panels.length > 1);\n const languageName = (code: string | undefined) => menu.languages?.list.find(language => language.code === code)?.name;\n const themeState = config.themes?.current();\n const themeId = config.themes && themeState ? config.themes.adapter.preset(themeState.choice) : '';\n const modeList = menu.modes?.list() ?? [];\n\n /** Settings → Language: the panel's Settings, scrolled to that group once it is there. */\n function openSettingsAt(anchor: string) {\n shell.openPanelSection('settings');\n let tries = 0;\n const find = () => {\n const heading = document.getElementById(`${anchor}-h`);\n if (heading) heading.scrollIntoView({ block: 'start' });\n else if ((tries += 1) < 40) setTimeout(find, 50);\n };\n find();\n }\n\n function builtin(id: BuiltinMenuItem): MenuRow {\n switch (id) {\n case 'new-tab': return item(id, t('wb.shell.tab.new'), 'plus', { shortcut: 'Ctrl+T', run: () => shell.shortcut('new-tab') });\n case 'split-right': return item(id, t('wb.shell.menu.splitRight'), 'split', { shortcut: 'Ctrl+\\\\', disabled: !canSplit, run: () => shell.shortcut('split-right') });\n case 'split-down': return item(id, t('wb.shell.menu.splitDown'), 'splitDown', { shortcut: 'Ctrl+Shift+\\\\', disabled: !canSplit, run: () => shell.shortcut('split-down') });\n case 'new-column': return item(id, menuText('newColumn'), 'columns', {\n run: () => {\n // The deck in front, else the first one; with none yet, the deck tab itself (it starts one).\n const target = activeParams?.kind === 'deck' ? activeParams.deckId : decks.list[0]?.id;\n shell.run(target ? { type: 'deck-add', deckId: target } : { type: 'deck' });\n },\n });\n case 'language': return item(id, t('wb.settings.language.title'), 'globe', { submenu: true, hint: languageName(menu.languages?.state().locale) });\n case 'theme': return item(id, menuText('theme'), 'palette', { submenu: true, hint: themeId ? config.themes!.themeName(themeId) : undefined });\n case 'mode': {\n const label = modeList.find(entry => entry.id === mode)?.label;\n return item(id, t('wb.modes.section'), 'layers', { submenu: true, hint: label && modeStatus?.custom ? t('wb.modes.custom', { mode: label }) : label });\n }\n case 'zoom': return { kind: 'zoom', id: 'zoom' };\n case 'plugins': return item(id, section(t('wb.panel.section.plugins')), 'plug', { run: () => shell.openPanelSection('plugins') });\n case 'store': return item(id, section(t('wb.panel.section.store')), 'bag', { run: () => shell.openPanelSection('store') });\n case 'strings': return item(id, section(menuText('strings')), 'globe', { run: () => shell.openPanelSection('languages') });\n case 'workspaces': return item(id, t('wb.ws.title'), 'layout', { submenu: true, hint: workspaces.store.items.find(entry => entry.id === workspaces.active)?.name });\n case 'find': return item(id, menuText('find'), 'search', { shortcut: 'Ctrl+F', disabled: !(shell.api?.panels ?? []).some(panel => isWeb(panel) && panel.api.isVisible), run: () => shell.shortcut('find') });\n case 'shortcuts': return item(id, menuText('shortcuts'), 'keyboard', { run: () => (menu.shortcuts ? menu.shortcuts() : shell.shortcut('command-palette')) });\n case 'palette': return item(id, menuText('palette'), 'command', { shortcut: 'Ctrl+K', run: () => shell.shortcut('command-palette') });\n case 'developer': return item(id, menuText('developer'), 'code', { submenu: true });\n case 'updates': {\n // A real check: the row asks the updater now and says what came of it (the titlebar chip stays the loud part).\n const row = updateRow(update, askedUpdate, version);\n return item(id, row.label, 'reload', {\n hint: row.hint, title: row.title, keepOpen: row.action === 'check' || row.action === 'wait',\n run: async () => {\n if (row.action === 'open') { shell.openPanelSection('updates'); return; }\n if (row.action === 'restart') { await invoke('apply_update'); return; }\n if (row.action !== 'check') return;\n setAskedUpdate(true);\n setUpdate({ state: 'checking' });\n // One request, no retry: whatever the updater answers is what the row says.\n try { setUpdate(parseUpdateStatus(await invoke('update_check'))); } catch { setUpdate({ state: 'error', message: '' }); }\n },\n });\n }\n // Off: a submenu that says what it does before anything reloads. On: one row that leaves it.\n case 'safe-mode': return safe.active\n ? item(id, menuText('safeLeave'), 'shield', { run: () => setSafeMode(false) })\n : item(id, menuText('safeRestart'), 'shield', { submenu: true });\n case 'report': return item(id, menuText('report'), 'flag', { run: () => setReporting(true) });\n case 'about': return item(id, menuText('about', { product: config.product }), 'info', { run: () => shell.openPanelSection('home') });\n case 'settings': return item(id, section(t('wb.panel.section.settings')), 'settings', { run: () => shell.openPanelSection('settings') });\n }\n }\n\n function submenuRows(id: string): MenuRow[] {\n switch (id) {\n case 'language': {\n const languages = menu.languages;\n if (!languages) return [];\n const rows = languageRows(languages.list, languages.state(), { site: t('wb.settings.language.followSite'), system: t('wb.settings.language.followSystem'), more: menuText('moreLanguages') });\n return rows.map(row => {\n if (row.kind !== 'item') return row;\n const choice = languageChoice(row.id);\n // Switching is live and the menu stays: what was picked can be read (or undone) on the spot.\n return choice ? { ...row, keepOpen: true, run: () => languages.set(choice) } : { ...row, run: () => openSettingsAt('language') };\n });\n }\n case 'theme': {\n const themes = config.themes;\n if (!themes || !themeState) return [];\n const list: MenuRow[] = themes.allThemes(themeState.choice).map(theme => item(`theme:${theme.id}`, theme.name, undefined, {\n check: 'radio', checked: theme.id === themeId, keepOpen: true, swatch: themes.adapter.dots(theme),\n // As Appearance does: a theme starts without the customizations made on another one.\n run: () => themes.setChoice(themes.adapter.choiceForId(themeState.choice, theme.id)),\n }));\n return joinGroups([list, [\n item('theme:builder', section(t('wb.panel.section.builder')), 'edit', { run: () => shell.openPanelSection('builder') }),\n item('theme:more', menuText('moreAppearance'), 'palette', { run: () => shell.openPanelSection('themes') }),\n ]]);\n }\n case 'mode': {\n const modes = menu.modes;\n if (!modes) return [];\n const name = (modeId: string) => modeList.find(entry => entry.id === modeId)?.label ?? modeId;\n const apply = async (to: string, keep: boolean) => { await modes.apply(to, keep); setMode(to); close('action'); };\n const at = path.indexOf('mode') + 1;\n if (asking?.reapply && modeStatus) {\n // What applying the mode again turns on and off, said before it happens.\n return [\n { kind: 'note', id: 'mode:reapply-hint', title: t('wb.modes.reapply', { mode: name(asking.to) }), text: t('wb.modes.reapplyHint', { mode: name(asking.to) }) },\n ...(modeStatus.on.length ? [{ kind: 'note' as const, id: 'mode:reapply-on', title: '', text: t('wb.modes.turnsOn', { list: modeStatus.on.join(', ') }) }] : []),\n ...(modeStatus.off.length ? [{ kind: 'note' as const, id: 'mode:reapply-off', title: '', text: t('wb.modes.turnsOff', { list: modeStatus.off.join(', ') }) }] : []),\n item('mode:reapply-yes', t('wb.modes.reapply', { mode: name(asking.to) }), 'reload', { keepOpen: true, run: async () => { await modes.reapply?.(); close('action'); } }),\n item('mode:cancel', t('wb.common.cancel'), 'close', { keepOpen: true, run: () => { focusNext.current = { level: at, id: 'mode:reapply' }; setAsking(null); } }),\n ];\n }\n if (asking) {\n // The question Settings asks: what was changed by hand stays, or the mode is taken as it is.\n return [\n { kind: 'note', id: 'mode:question', title: t('wb.modes.keepQuestion'), text: t('wb.modes.keepHint', { count: asking.changes }) },\n item('mode:keep', t('wb.modes.keep'), 'check', { keepOpen: true, run: () => apply(asking.to, true) }),\n item('mode:reset', t('wb.modes.reset', { mode: name(asking.to) }), 'reload', { keepOpen: true, run: () => apply(asking.to, false) }),\n item('mode:cancel', t('wb.common.cancel'), 'close', { keepOpen: true, run: () => { focusNext.current = { level: at, id: `mode:${asking.to}` }; setAsking(null); } }),\n ];\n }\n const list = modeList.map(entry => item(`mode:${entry.id}`, entry.label, undefined, {\n check: 'radio', checked: entry.id === mode, keepOpen: true,\n run: async () => {\n if (entry.id === mode) { close('action'); return; }\n const changes = await modes.changes(entry.id);\n if (changes > 0) { focusNext.current = { level: at, edge: 'first' }; setAsking({ to: entry.id, changes }); } else await apply(entry.id, false);\n },\n }));\n if (!mode || !modeStatus?.custom || !modes.reapply) return list;\n // The mode is a starting point: the features moved on, and nothing applies it again unasked.\n const grew: MenuRow[] = modeStatus.added > 0 ? [{ kind: 'note', id: 'mode:grew', title: '', text: t('wb.modes.grew', { mode: name(mode), count: modeStatus.added }) }] : [];\n return joinGroups([list, [\n { kind: 'note', id: 'mode:custom', title: t('wb.modes.custom', { mode: name(mode) }) },\n ...grew,\n item('mode:reapply', t('wb.modes.reapply', { mode: name(mode) }), 'reload', {\n keepOpen: true,\n run: () => {\n focusNext.current = { level: at, edge: 'first' };\n setAsking({ to: mode, changes: 0, reapply: true });\n if (modeStatus.added > 0) void modes.seen?.().then(() => setModeStatus({ ...modeStatus, added: 0 }), () => {});\n },\n }),\n ]]);\n }\n case 'workspaces': {\n const list = workspaceList();\n const rows: MenuRow[] = list.length\n ? list.map(entry => item(`ws:${entry.id}`, entry.name, undefined, { check: 'radio', checked: entry.id === workspaces.active, hint: t('wb.ws.tabs', { count: entry.tabs }), run: () => restoreWorkspace(entry.id) }))\n : [{ kind: 'note', id: 'ws:none', title: '', text: menuText('noWorkspaces') }];\n return joinGroups([rows, [item('ws:save', menuText('saveLayout'), 'plus', { run: openWorkspaceSave })]]);\n }\n case 'safe-mode': return [\n { kind: 'note', id: 'safe:question', title: menuText('safeQuestion'), text: menuText('safeExplain') },\n item('safe:confirm', menuText('safeConfirm'), 'shield', { run: () => setSafeMode(true) }),\n item('safe:cancel', t('wb.common.cancel'), 'close', { keepOpen: true, run: () => closeSub(path.indexOf('safe-mode') + 1) }),\n ];\n case 'developer': return [\n item('dev:mode', t('wb.dev.mode'), undefined, { check: 'checkbox', checked: dev.enabled, keepOpen: true, run: async () => { await invoke('dev_set', { enabled: !dev.enabled }); await refreshDev(); } }),\n item('dev:folder', menuText('pluginsFolder'), 'folder', { run: () => invoke('plugins_open_folder') }),\n ];\n default: return specRows(findSpec(groups, id)?.submenu?.() ?? []);\n }\n }\n\n const groups = menu.groups ?? DEFAULT_MENU;\n const env: MenuEnv = {\n decks: !!config.deck, languages: !!menu.languages, themes: !!config.themes, modes: modeList.length > 0,\n zoom: hasFeature('zoom'), find: hasFeature('find'), safeMode: hasFeature('safeMode'), store: hasFeature('store'), strings: config.features?.strings === true, workspaces: hasFeature('workspaces'), developer: hasFeature('developer'), updates: hasFeature('updates'),\n };\n const rootRows = () => joinGroups(planMenu(groups, env).map(group => group.flatMap(entry => (typeof entry === 'string' ? [builtin(entry)] : specRows([entry])))));\n const labelOf = (id: string, rows: MenuRow[]) => rows.find((row): row is MenuItemRow => row.kind === 'item' && row.id === id)?.label ?? '';\n\n // -------------------------------------------------------------------------------------------\n // Keyboard and pointer\n\n function onKey(event: ReactKeyboardEvent<HTMLDivElement>) {\n const target = event.target as HTMLElement;\n const menuEl = target.closest<HTMLElement>('[data-level]');\n if (!menuEl) return;\n const level = Number(menuEl.dataset.level);\n const { key } = event;\n // The keyboard leads now: the row under a resting pointer takes the focus back only when the pointer moves on.\n clearTimeout(hover.current.timer);\n hover.current = { el: null };\n const keys = submenuKeys(getComputedStyle(menuEl).direction === 'rtl');\n const done = () => { event.preventDefault(); event.stopPropagation(); };\n if (key === 'Escape') { done(); if (level > 0) closeSub(level); else close('escape'); return; }\n if (key === 'Tab') { done(); close('escape'); return; }\n // The zoom row is one stop: left and right move through − + and reset (laid out left to right).\n if ('zoom' in target.dataset && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n done();\n const controls = Array.from(menuEl.querySelectorAll<HTMLElement>('[data-zoom]'));\n controls[Math.max(0, Math.min(controls.length - 1, controls.indexOf(target) + (key === 'ArrowRight' ? 1 : -1)))]?.focus();\n return;\n }\n if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Home' || key === 'End') {\n done();\n const stops = stopsOf(menuEl);\n stops[moveStop(stops.indexOf(target), key, stops.length)]?.focus();\n return;\n }\n if (key === keys.open) {\n if (target.getAttribute('aria-haspopup') === 'menu' && target.dataset.item) { done(); openSub(level, target.dataset.item, true); }\n return;\n }\n if (key === keys.close) { if (level > 0) { done(); closeSub(level); } return; }\n const now = Date.now();\n const typing = !!typed.current.text && now - typed.current.at <= 700;\n // Enter, and Space outside a typed word: the row's own click chooses it; on the menu itself nothing is chosen.\n if (key === 'Enter' || (key === ' ' && !typing)) {\n if (target === menuEl) done();\n typed.current.text = '';\n return;\n }\n if (key.length !== 1 || event.ctrlKey || event.metaKey || event.altKey) return;\n // Type-ahead: the next row whose label starts with what was typed.\n done();\n typed.current = { text: typing ? typed.current.text + key : key, at: now };\n const stops = stopsOf(menuEl);\n const found = typeahead(stops.map(el => el.dataset.label ?? ''), stops.indexOf(target), typed.current.text);\n if (found >= 0) stops[found]!.focus();\n }\n\n /** The pointer moves the focus, like the arrows do: one highlight. A row with a submenu opens it after a beat. */\n function onHover(row: MenuItemRow | null, level: number, el: HTMLElement) {\n if (hover.current.el === el) return;\n clearTimeout(hover.current.timer);\n hover.current = { el };\n if (document.activeElement !== el) el.focus({ preventScroll: true });\n if (row?.submenu) {\n if (path[level] !== row.id) hover.current.timer = setTimeout(() => openSub(level, row.id), 170);\n } else if (path.length > level) {\n hover.current.timer = setTimeout(() => { setPath(current => current.slice(0, level)); setAsking(null); }, 280);\n }\n }\n\n // -------------------------------------------------------------------------------------------\n\n function renderRow(row: MenuRow, level: number, index: number) {\n if (row.kind === 'separator') return <hr key={`sep${index}`} role=\"separator\"/>;\n if (row.kind === 'note') {\n return <div key={row.id} className={`bt-app-note${row.tone === 'error' ? ' is-error' : ''}`} role={row.tone === 'error' ? 'alert' : 'presentation'}>\n {row.title && <strong>{row.title}</strong>}{row.text && <span>{row.text}</span>}\n </div>;\n }\n if (row.kind === 'zoom') {\n const tab = zoomTarget();\n const factor = zoomOf(tab);\n const control = (id: string, label: string, icon: IconName, direction: 1 | -1 | 0, off: boolean, className = '') =>\n <button type=\"button\" role=\"menuitem\" tabIndex={-1} className={className} data-item={`zoom:${id}`} data-zoom=\"\" data-label={menuText('zoom')}\n aria-label={label} title={tab ? label : menuText('zoomNone')} aria-disabled={off}\n onPointerMove={event => onHover(null, level, event.currentTarget)} onClick={() => { if (!off) void stepZoom(direction, tab); }}>\n <Icon name={icon}/>\n </button>;\n return <div key=\"zoom\" className={`bt-app-zoom${tab ? '' : ' is-off'}`} role=\"group\" aria-label={menuText('zoom')} title={tab ? undefined : menuText('zoomNone')}>\n <Icon name=\"zoom\"/>\n <span className=\"bt-menu-label\">{menuText('zoom')}</span>\n <span className=\"bt-app-zoom-step\">\n {control('out', menuText('zoomOut'), 'minus', -1, !tab || factor <= ZOOM_MIN)}\n <output className=\"bt-app-zoom-value\" aria-live=\"polite\">{percent(factor)}</output>\n {control('in', menuText('zoomIn'), 'plus', 1, !tab || factor >= ZOOM_MAX)}\n </span>\n {control('reset', menuText('zoomReset'), 'reload', 0, !tab || factor === 1, 'bt-app-zoom-reset')}\n </div>;\n }\n const expanded = row.submenu ? path[level] === row.id : undefined;\n return <button key={row.id} type=\"button\" tabIndex={-1} disabled={row.disabled} data-item={row.id} data-label={row.label} title={row.title}\n role={row.check === 'radio' ? 'menuitemradio' : row.check ? 'menuitemcheckbox' : 'menuitem'} aria-checked={row.check ? !!row.checked : undefined}\n aria-haspopup={row.submenu ? 'menu' : undefined} aria-expanded={expanded}\n onPointerMove={event => onHover(row, level, event.currentTarget)} onClick={() => void activate(row, level)}>\n {row.check ? <span className=\"bt-app-check\">{row.checked && <Icon name=\"check\"/>}</span> : row.icon ? <Icon name={row.icon}/> : <span className=\"bt-app-check\"/>}\n {/* A language's own name keeps its own direction (<bdi>) but starts where every other label does. */}\n <span className=\"bt-menu-label\">{row.lang ? <bdi lang={row.lang} dir={row.dir}>{row.label}</bdi> : row.label}</span>\n {row.swatch && <span className=\"wb-dots\" aria-hidden=\"true\" style={{ background: row.swatch.page }}>\n <i style={{ background: row.swatch.bg, boxShadow: `inset 0 0 0 1px ${row.swatch.border}` }}/><i style={{ background: row.swatch.text }}/><i style={{ background: row.swatch.accent }}/>\n </span>}\n {row.hint && <span className=\"bt-app-hint\">{row.hint}</span>}\n {row.shortcut && <span className=\"bt-menu-keys\">{shortcutText(row.shortcut, mac)}</span>}\n {row.submenu && <Icon name=\"chevronRight\" className=\"bt-app-chevron\"/>}\n </button>;\n }\n\n function renderMenus() {\n const root = rootRows();\n const levels: Array<{ rows: MenuRow[]; label: string }> = [{ rows: root, label: menuText('label') }];\n path.forEach((id, index) => levels.push({ rows: submenuRows(id), label: labelOf(id, levels[index]!.rows) }));\n // An error belongs to the level it happened on: the deepest one open.\n if (error) levels[levels.length - 1]!.rows = [...levels[levels.length - 1]!.rows, { kind: 'note', id: 'error', title: '', text: error, tone: 'error' }];\n return levels.map(({ rows, label }, level) => <div key={level === 0 ? 'root' : `${level}:${path[level - 1]}`} role=\"menu\" aria-label={label} tabIndex={-1} data-level={level}\n className={level === 0 ? `bt-menu bt-app-menu bt-pop${anchor.at === 'logo' ? '' : ' bt-pop--right'}` : 'bt-menu bt-app-menu bt-app-sub'}\n style={level === 0 ? { top: anchor.top, left: anchor.left, right: anchor.right, maxHeight: `calc(100vh - ${anchor.top + 8}px)` } : undefined}>\n {rows.map((row, index) => renderRow(row, level, index))}\n </div>);\n }\n\n const label = menuText('label');\n return <>\n {home() === 'button' && <button ref={button} type=\"button\" className=\"bt-app-button\" aria-haspopup=\"menu\" aria-expanded={open && anchor.at === 'button'} aria-label={label} title={`${label} (${APP_MENU_KEYS})`}\n onClick={event => (open && anchor.at === 'button' ? close('escape') : show({ keyboard: event.detail === 0 }))}>\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"5.75\" r=\"1.6\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\"/><circle cx=\"12\" cy=\"18.25\" r=\"1.6\"/></svg>\n </button>}\n {open && createPortal(<div className=\"bt-menu-backdrop\" onMouseDown={() => close()} onContextMenu={event => { event.preventDefault(); close(); }}>\n <div ref={layers} className=\"bt-app-layers\" onMouseDown={event => event.stopPropagation()} onContextMenu={event => { event.preventDefault(); event.stopPropagation(); }} onKeyDown={onKey}>\n {renderMenus()}\n </div>\n </div>, document.body)}\n {reporting && <ReportDialog onClose={() => setReporting(false)}/>}\n </>;\n}\n\n/**\n * The app's logo at the start of the titlebar: a second trigger of the same menu, hung under the\n * logo. A click opens it; a press that turns into a drag moves the window, as the titlebar around\n * it does; a right-click shows the window's system menu, where a titlebar icon has always had it.\n */\nexport function AppMenuLogo() {\n useT();\n const expanded = useExpanded('logo');\n const press = useRef<{ x: number; y: number; dragged: boolean } | null>(null);\n const { product, logo } = site();\n const label = menuText('label');\n return <button type=\"button\" className=\"bt-titlebar-logo\" aria-haspopup=\"menu\" aria-expanded={expanded} aria-label={`${product}: ${label}`} title={`${product} · ${label}`}\n onPointerDown={event => { if (event.button === 0) press.current = { x: event.clientX, y: event.clientY, dragged: false }; }}\n onPointerMove={event => {\n const start = press.current;\n if (!start || start.dragged || !(event.buttons & 1)) return;\n // The press became a drag: the window moves, and no menu opens when the button is released.\n if (Math.hypot(event.clientX - start.x, event.clientY - start.y) > 5) { start.dragged = true; startDrag(); }\n }}\n onClick={event => {\n const dragged = press.current?.dragged;\n press.current = null;\n if (!dragged) openAppMenu({ anchor: 'logo', toggle: true, keyboard: event.detail === 0 });\n }}\n onContextMenu={event => {\n event.preventDefault(); event.stopPropagation();\n const scale = window.devicePixelRatio || 1;\n systemMenu(Math.round(event.screenX * scale), Math.round(event.screenY * scale));\n }}>\n <img src={logo} alt=\"\" draggable={false}/>\n </button>;\n}\n\n/** The app's menu trigger: `trigger` as `AppMenu` takes it, else `ShellMenu.trigger`, else `pane`. */\nexport const menuTrigger = (trigger?: AppMenuTrigger | boolean): AppMenuTrigger => resolveTrigger(trigger, site().menu?.trigger);\n\n/**\n * One pane's menu button, at the end of its toolbar (the app's mark inside): opens the app menu\n * under itself, or closes it when it is open there. Shown when the app's trigger is `pane`.\n */\nexport function PaneMenuButton({ pane, children }: { pane: string; children: ReactNode }) {\n useT();\n const expanded = useExpanded(triggerKey('pane', pane));\n const label = menuText('label');\n const { product } = site();\n return <button type=\"button\" className=\"bt-brand-button bt-pane-menu\" data-pane={pane} aria-haspopup=\"menu\" aria-expanded={expanded}\n aria-label={`${product}: ${label}`} title={`${product} · ${label} (${APP_MENU_KEYS})`}\n onClick={event => openAppMenu({ anchor: 'pane', pane, toggle: true, keyboard: event.detail === 0 })}>\n {children}\n </button>;\n}\n"]}
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  // pane's toolbar while it is open (so the page under it does not move and, in split view, the bar
4
4
  // is plainly the searched pane's). Native code does the searching (`tab_find`, shell-only): the
5
5
  // engine's own find where the build can drive it (WebView2: highlights and a match count, which
6
- // arrive as `tab-find` events), else the engine's `window.find` evaluated by native code (next and
6
+ // arrive as `tab-find` events), else a Custom Highlight script evaluated by native code (next and
7
7
  // previous work, no count). Only what the page has rendered can be found, as in a browser: a
8
8
  // virtualized list (X's timeline) holds the posts near the viewport, not the whole feed.
9
9
  //
@@ -1 +1 @@
1
- {"version":3,"file":"FindBar.js","sourceRoot":"","sources":["../../../../../../shell/src/frame/FindBar.tsx"],"names":[],"mappings":"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","sourcesContent":["// Find in page: the shell's find bar for one pane. It takes the address field's place in that\n// pane's toolbar while it is open (so the page under it does not move and, in split view, the bar\n// is plainly the searched pane's). Native code does the searching (`tab_find`, shell-only): the\n// engine's own find where the build can drive it (WebView2: highlights and a match count, which\n// arrive as `tab-find` events), else the engine's `window.find` evaluated by native code (next and\n// previous work, no count). Only what the page has rendered can be found, as in a browser: a\n// virtualized list (X's timeline) holds the posts near the viewport, not the whole feed.\n//\n// The query lives in this component's state while the bar is open and nowhere else: it is not\n// saved, logged or put in a URL, and closing the bar clears the engine's highlights.\n// Keys: Enter / F3 next, Shift+Enter / Shift+F3 previous, Esc closes and gives the page the focus.\n\nimport { useEffect, useRef, useState } from 'react';\nimport { invoke, listen } from './bridge.ts';\nimport { describe, diag } from './diag.ts';\nimport { useT } from './hooks.ts';\nimport { formatNumber } from './i18n.ts';\nimport { Icon } from './icons.tsx';\nimport { findLabel, menuText } from './menuModel.ts';\nimport { tabAction } from './state.ts';\nimport './findBar.css';\n\n/** Opens (or focuses) the find bar of web tab `id`. */\nexport const openFind = (id: string) => window.dispatchEvent(new CustomEvent('bt-find', { detail: id }));\n/** The next (`1`) or previous (`-1`) match in tab `id`, when its find bar is open (F3 anywhere in the shell). */\nexport const stepFind = (id: string, direction: 1 | -1) => window.dispatchEvent(new CustomEvent('bt-find-step', { detail: { id, direction } }));\n\nconst find = (id: string, action: 'start' | 'next' | 'previous' | 'stop', query?: string) =>\n invoke('tab_find', { id, action, ...(query ? { query } : {}) }).catch(() => {});\n\nexport function FindBar({ tabId, url, onClose }: { tabId: string; url: string; onClose(): void }) {\n useT();\n const [query, setQuery] = useState('');\n // What the engine reported for the query on screen (null: nothing yet, or an engine that does not count).\n const [counts, setCounts] = useState<{ count: number; index: number } | null>(null);\n const input = useRef<HTMLInputElement>(null);\n const live = useRef(query);\n live.current = query;\n\n const close = () => {\n onClose();\n // The page gets the keyboard back.\n void tabAction(tabId, 'focus');\n };\n const step = (direction: 1 | -1) => { if (live.current) void find(tabId, direction > 0 ? 'next' : 'previous', live.current); };\n\n // The shell takes the keyboard (Ctrl+F was pressed in the page); closing clears the highlights.\n useEffect(() => {\n const focusField = () => { if (input.current && document.activeElement !== input.current) input.current.focus(); };\n invoke('shell_focus').then(focusField, () => {});\n focusField();\n diag(`find bar open: hasFocus=${document.hasFocus()} active=${describe(document.activeElement)}`);\n // The page may keep the keyboard (the keys that opened the bar were pressed in it): if the shell\n // still does not have it a moment later, ask once more, so typing never lands in the page.\n const retry = setTimeout(() => {\n diag(`find bar +250ms: hasFocus=${document.hasFocus()} active=${describe(document.activeElement)}`);\n if (!document.hasFocus()) invoke('shell_focus').then(() => { focusField(); diag(`find bar refocused: hasFocus=${document.hasFocus()}`); }, () => {});\n else focusField();\n }, 250);\n const again = (event: Event) => { if ((event as CustomEvent<string>).detail === tabId) { input.current?.focus(); input.current?.select(); } };\n const onStep = (event: Event) => { const detail = (event as CustomEvent<{ id: string; direction: 1 | -1 }>).detail; if (detail.id === tabId) step(detail.direction); };\n window.addEventListener('bt-find', again);\n window.addEventListener('bt-find-step', onStep);\n let disposed = false;\n let unlisten: (() => void) | undefined;\n listen<{ id: string; count: number; index: number }>('tab-find', ({ payload }) => {\n if (payload.id === tabId && live.current) setCounts({ count: payload.count, index: payload.index });\n }).then(dispose => { if (disposed) dispose(); else unlisten = dispose; }).catch(() => {});\n return () => {\n disposed = true;\n clearTimeout(retry);\n unlisten?.();\n window.removeEventListener('bt-find', again);\n window.removeEventListener('bt-find-step', onStep);\n void find(tabId, 'stop');\n };\n }, [tabId]);\n\n // A new query (or a new page under the same query) starts a new search, a beat after the last key.\n useEffect(() => {\n setCounts(null);\n if (!query) { void find(tabId, 'stop'); return; }\n const timer = setTimeout(() => void find(tabId, 'start', query), 140);\n return () => clearTimeout(timer);\n }, [query, url, tabId]);\n\n const status = query && counts ? findLabel(counts, value => formatNumber(value)) : '';\n return <div className={`bt-omni bt-omni--edit bt-find${query && counts?.count === 0 ? ' is-none' : ''}`} role=\"search\" title={menuText('findHint')}>\n <Icon name=\"search\" className=\"bt-omni-lead\"/>\n <input ref={input} type=\"text\" spellCheck={false} autoComplete=\"off\" maxLength={256} value={query} placeholder={menuText('findField')} aria-label={menuText('findField')}\n onChange={event => setQuery(event.target.value.replace(/[\\u0000-\\u001f\\u007f]/g, ''))}\n onKeyDown={event => {\n if (event.key === 'Enter' || event.key === 'F3') { event.preventDefault(); event.stopPropagation(); step(event.shiftKey ? -1 : 1); }\n if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); close(); }\n }}/>\n <span className=\"bt-find-count\" role=\"status\" aria-live=\"polite\">{status}</span>\n <button type=\"button\" className=\"bt-omni-action\" disabled={!query} title={`${menuText('findPrevious')} (Shift+Enter)`} aria-label={menuText('findPrevious')}\n onMouseDown={event => event.preventDefault()} onClick={() => step(-1)}><Icon name=\"chevron\" className=\"bt-find-up\"/></button>\n <button type=\"button\" className=\"bt-omni-action\" disabled={!query} title={`${menuText('findNext')} (Enter)`} aria-label={menuText('findNext')}\n onMouseDown={event => event.preventDefault()} onClick={() => step(1)}><Icon name=\"chevron\"/></button>\n <button type=\"button\" className=\"bt-omni-action\" title={`${menuText('findClose')} (Esc)`} aria-label={menuText('findClose')} onClick={close}><Icon name=\"close\"/></button>\n </div>;\n}\n"]}
1
+ {"version":3,"file":"FindBar.js","sourceRoot":"","sources":["../../../../../../shell/src/frame/FindBar.tsx"],"names":[],"mappings":"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","sourcesContent":["// Find in page: the shell's find bar for one pane. It takes the address field's place in that\n// pane's toolbar while it is open (so the page under it does not move and, in split view, the bar\n// is plainly the searched pane's). Native code does the searching (`tab_find`, shell-only): the\n// engine's own find where the build can drive it (WebView2: highlights and a match count, which\n// arrive as `tab-find` events), else a Custom Highlight script evaluated by native code (next and\n// previous work, no count). Only what the page has rendered can be found, as in a browser: a\n// virtualized list (X's timeline) holds the posts near the viewport, not the whole feed.\n//\n// The query lives in this component's state while the bar is open and nowhere else: it is not\n// saved, logged or put in a URL, and closing the bar clears the engine's highlights.\n// Keys: Enter / F3 next, Shift+Enter / Shift+F3 previous, Esc closes and gives the page the focus.\n\nimport { useEffect, useRef, useState } from 'react';\nimport { invoke, listen } from './bridge.ts';\nimport { describe, diag } from './diag.ts';\nimport { useT } from './hooks.ts';\nimport { formatNumber } from './i18n.ts';\nimport { Icon } from './icons.tsx';\nimport { findLabel, menuText } from './menuModel.ts';\nimport { tabAction } from './state.ts';\nimport './findBar.css';\n\n/** Opens (or focuses) the find bar of web tab `id`. */\nexport const openFind = (id: string) => window.dispatchEvent(new CustomEvent('bt-find', { detail: id }));\n/** The next (`1`) or previous (`-1`) match in tab `id`, when its find bar is open (F3 anywhere in the shell). */\nexport const stepFind = (id: string, direction: 1 | -1) => window.dispatchEvent(new CustomEvent('bt-find-step', { detail: { id, direction } }));\n\nconst find = (id: string, action: 'start' | 'next' | 'previous' | 'stop', query?: string) =>\n invoke('tab_find', { id, action, ...(query ? { query } : {}) }).catch(() => {});\n\nexport function FindBar({ tabId, url, onClose }: { tabId: string; url: string; onClose(): void }) {\n useT();\n const [query, setQuery] = useState('');\n // What the engine reported for the query on screen (null: nothing yet, or an engine that does not count).\n const [counts, setCounts] = useState<{ count: number; index: number } | null>(null);\n const input = useRef<HTMLInputElement>(null);\n const live = useRef(query);\n live.current = query;\n\n const close = () => {\n onClose();\n // The page gets the keyboard back.\n void tabAction(tabId, 'focus');\n };\n const step = (direction: 1 | -1) => { if (live.current) void find(tabId, direction > 0 ? 'next' : 'previous', live.current); };\n\n // The shell takes the keyboard (Ctrl+F was pressed in the page); closing clears the highlights.\n useEffect(() => {\n const focusField = () => { if (input.current && document.activeElement !== input.current) input.current.focus(); };\n invoke('shell_focus').then(focusField, () => {});\n focusField();\n diag(`find bar open: hasFocus=${document.hasFocus()} active=${describe(document.activeElement)}`);\n // The page may keep the keyboard (the keys that opened the bar were pressed in it): if the shell\n // still does not have it a moment later, ask once more, so typing never lands in the page.\n const retry = setTimeout(() => {\n diag(`find bar +250ms: hasFocus=${document.hasFocus()} active=${describe(document.activeElement)}`);\n if (!document.hasFocus()) invoke('shell_focus').then(() => { focusField(); diag(`find bar refocused: hasFocus=${document.hasFocus()}`); }, () => {});\n else focusField();\n }, 250);\n const again = (event: Event) => { if ((event as CustomEvent<string>).detail === tabId) { input.current?.focus(); input.current?.select(); } };\n const onStep = (event: Event) => { const detail = (event as CustomEvent<{ id: string; direction: 1 | -1 }>).detail; if (detail.id === tabId) step(detail.direction); };\n window.addEventListener('bt-find', again);\n window.addEventListener('bt-find-step', onStep);\n let disposed = false;\n let unlisten: (() => void) | undefined;\n listen<{ id: string; count: number; index: number }>('tab-find', ({ payload }) => {\n if (payload.id === tabId && live.current) setCounts({ count: payload.count, index: payload.index });\n }).then(dispose => { if (disposed) dispose(); else unlisten = dispose; }).catch(() => {});\n return () => {\n disposed = true;\n clearTimeout(retry);\n unlisten?.();\n window.removeEventListener('bt-find', again);\n window.removeEventListener('bt-find-step', onStep);\n void find(tabId, 'stop');\n };\n }, [tabId]);\n\n // A new query (or a new page under the same query) starts a new search, a beat after the last key.\n useEffect(() => {\n setCounts(null);\n if (!query) { void find(tabId, 'stop'); return; }\n const timer = setTimeout(() => void find(tabId, 'start', query), 140);\n return () => clearTimeout(timer);\n }, [query, url, tabId]);\n\n const status = query && counts ? findLabel(counts, value => formatNumber(value)) : '';\n return <div className={`bt-omni bt-omni--edit bt-find${query && counts?.count === 0 ? ' is-none' : ''}`} role=\"search\" title={menuText('findHint')}>\n <Icon name=\"search\" className=\"bt-omni-lead\"/>\n <input ref={input} type=\"text\" spellCheck={false} autoComplete=\"off\" maxLength={256} value={query} placeholder={menuText('findField')} aria-label={menuText('findField')}\n onChange={event => setQuery(event.target.value.replace(/[\\u0000-\\u001f\\u007f]/g, ''))}\n onKeyDown={event => {\n if (event.key === 'Enter' || event.key === 'F3') { event.preventDefault(); event.stopPropagation(); step(event.shiftKey ? -1 : 1); }\n if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); close(); }\n }}/>\n <span className=\"bt-find-count\" role=\"status\" aria-live=\"polite\">{status}</span>\n <button type=\"button\" className=\"bt-omni-action\" disabled={!query} title={`${menuText('findPrevious')} (Shift+Enter)`} aria-label={menuText('findPrevious')}\n onMouseDown={event => event.preventDefault()} onClick={() => step(-1)}><Icon name=\"chevron\" className=\"bt-find-up\"/></button>\n <button type=\"button\" className=\"bt-omni-action\" disabled={!query} title={`${menuText('findNext')} (Enter)`} aria-label={menuText('findNext')}\n onMouseDown={event => event.preventDefault()} onClick={() => step(1)}><Icon name=\"chevron\"/></button>\n <button type=\"button\" className=\"bt-omni-action\" title={`${menuText('findClose')} (Esc)`} aria-label={menuText('findClose')} onClick={close}><Icon name=\"close\"/></button>\n </div>;\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { type IDockviewPanel } from 'dockview';
2
2
  import 'dockview/dist/styles/dockview.css';
3
3
  import './shell.css';
4
+ import './edges.css';
4
5
  /** How long the startup cover waits, once the window is shown, for the visible site tabs to say they painted. */
5
6
  export declare const STARTUP_CONTENT_WAIT = 8000;
6
7
  export declare function setDevBuild(value: boolean): void;
@@ -23,11 +23,13 @@ import { useProfiles, useT } from "./hooks.js";
23
23
  import { t } from "./i18n.js";
24
24
  import { Icon } from "./icons.js";
25
25
  import { MediaPanel } from "./MediaPanel.js";
26
+ import { isMediaShortcut } from "./mediaModel.js";
26
27
  import { NewTabPage } from "./NewTabPage.js";
27
28
  import { PaneThemeHost, openPaneTheme } from "./PaneTheme.js";
28
29
  import { focusedCommands, installPluginCommands, notePanelActive, refreshPluginNames, runPluginCommand } from "./pluginCommandStore.js";
29
30
  import { initDiag } from "./diag.js";
30
31
  import { installSafeMode } from "./safeStore.js";
32
+ import { startNativeMenu } from "./nativeMenu.js";
31
33
  import { hasFeature, site } from "./site.js";
32
34
  import { flushLayer, flushSync, isWeb, loadLayout, newTabId, paneInfos, panelId, patchParams, resync, saveLayoutSoon, scheduleSync, setOverlay, setProfiles, shell, tabAction, } from "./state.js";
33
35
  import { installSyncHost } from "./syncHost.js";
@@ -38,6 +40,8 @@ import { frameless, isTauri, onMaximizedChange, os } from "./windowBinding.js";
38
40
  import { loadWorkspaces, restoreWorkspace, workspaceList, workspaces } from "./workspaces.js";
39
41
  import { stepZoom, zoomTarget } from "./zoomStore.js";
40
42
  import './shell.css';
43
+ // After shell.css: a bevelled theme's edges (html[data-wb-edges]).
44
+ import './edges.css';
41
45
  /** How long the startup cover waits, once the window is shown, for the visible site tabs to say they painted. */
42
46
  export const STARTUP_CONTENT_WAIT = 8000;
43
47
  /** A development build (createShell's `dev`): the shell keeps the devtools shortcut. */
@@ -475,8 +479,6 @@ function shortcutFor(event) {
475
479
  return event.shiftKey ? 'open-panel' : 'close-tab';
476
480
  if (key === 'l')
477
481
  return 'focus-address';
478
- if (key === 'g' && event.shiftKey)
479
- return 'media-panel';
480
482
  if (key === 'k' && !event.shiftKey)
481
483
  return 'command-palette';
482
484
  if (key === 'f' && !event.shiftKey && hasFeature('find'))
@@ -496,6 +498,8 @@ function shortcutFor(event) {
496
498
  return 'zoom-reset';
497
499
  }
498
500
  }
501
+ if (isMediaShortcut(event, os))
502
+ return 'media-panel';
499
503
  if (event.key === 'F3' && !mod && !event.altKey)
500
504
  return event.shiftKey ? 'find-previous' : 'find-next';
501
505
  // The app menu, like a browser's: F10, and Alt+F where Alt is not a typing key (not on macOS).
@@ -707,6 +711,8 @@ export default function Shell() {
707
711
  }, []);
708
712
  // Safe mode for this run (the host's flag): the titlebar says so and the chrome drops its theme.
709
713
  useEffect(() => (hasFeature('safeMode') ? installSafeMode() : undefined), []);
714
+ // The native menu bar (macOS only; nativeMenu.ts): described from the state the in-app menu reads.
715
+ useEffect(() => startNativeMenu(), []);
710
716
  // The site's own settings and events (e.g. X's Twitter/X wording).
711
717
  useEffect(() => site().start?.(), []);
712
718
  // Focus and layering diagnostics, when the app was started with them (`--diag`).
@@ -964,6 +970,8 @@ export default function Shell() {
964
970
  // A restored deck tab counts: deck sessions come back to their deck, not a new Home tab.
965
971
  if (!api.panels.some(panel => isWeb(panel) || panel.params?.kind === 'deck'))
966
972
  addWeb(shell.homeUrl);
973
+ shell.layoutReady = true;
974
+ saveLayoutSoon();
967
975
  api.onDidLayoutChange(() => { markTitlebarGroups(); scheduleSync(); saveLayoutSoon(); });
968
976
  api.onDidAddGroup(() => requestAnimationFrame(markTitlebarGroups));
969
977
  api.onDidRemoveGroup(() => requestAnimationFrame(markTitlebarGroups));