@arbidocs/blocks 0.5.125 → 0.5.127

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 (200) hide show
  1. package/README.md +19 -0
  2. package/dist/{ClippingMediaViewer-ZFEX5A3U.cjs → ClippingMediaViewer-47BAXNLO.cjs} +10 -11
  3. package/dist/ClippingMediaViewer-47BAXNLO.cjs.map +1 -0
  4. package/dist/{ClippingPdfViewer-3LRTEPHV.cjs → ClippingPdfViewer-D5BYHEAH.cjs} +16 -14
  5. package/dist/ClippingPdfViewer-D5BYHEAH.cjs.map +1 -0
  6. package/dist/ConnectedCallDock-XJOYVVAH.cjs +6 -6
  7. package/dist/ConnectedCallRoom-CUDYAPQK.cjs +6 -6
  8. package/dist/{ConnectedNativeDocxComparison-7QQ55JIO.cjs → ConnectedNativeDocxComparison-JUF2TI2P.cjs} +12 -12
  9. package/dist/{ConnectedNativeDocxComparison-7QQ55JIO.cjs.map → ConnectedNativeDocxComparison-JUF2TI2P.cjs.map} +1 -1
  10. package/dist/{ConnectedPresentation-L32JPRFI.cjs → ConnectedPresentation-SI3L77J4.cjs} +35 -36
  11. package/dist/ConnectedPresentation-SI3L77J4.cjs.map +1 -0
  12. package/dist/{ConnectedProductionSetDialog-4EAY6KAZ.cjs → ConnectedProductionSetDialog-LHB4VQWC.cjs} +3 -3
  13. package/dist/{ConnectedProductionSetDialog-4EAY6KAZ.cjs.map → ConnectedProductionSetDialog-LHB4VQWC.cjs.map} +1 -1
  14. package/dist/{ConnectedSlidesTab-P7GGNUTO.cjs → ConnectedSlidesTab-E76OVY34.cjs} +38 -44
  15. package/dist/ConnectedSlidesTab-E76OVY34.cjs.map +1 -0
  16. package/dist/{ConnectedStreamedWordArtifact-7NJ3N52V.cjs → ConnectedStreamedWordArtifact-Q64DRRQD.cjs} +12 -12
  17. package/dist/{ConnectedStreamedWordArtifact-7NJ3N52V.cjs.map → ConnectedStreamedWordArtifact-Q64DRRQD.cjs.map} +1 -1
  18. package/dist/{DocumentReviewCard-BFPOFQXI.cjs → DocumentReviewCard-M53XFLI2.cjs} +16 -16
  19. package/dist/{DocumentReviewCard-BFPOFQXI.cjs.map → DocumentReviewCard-M53XFLI2.cjs.map} +1 -1
  20. package/dist/{FilesViewerDialog-MHUVEZ7M.cjs → FilesViewerDialog-V6FSRQTP.cjs} +33 -34
  21. package/dist/FilesViewerDialog-V6FSRQTP.cjs.map +1 -0
  22. package/dist/{NativeDocxEditor-SIRYPMBN.cjs → NativeDocxEditor-2PTEK6ND.cjs} +6 -6
  23. package/dist/{NativeDocxEditor-SIRYPMBN.cjs.map → NativeDocxEditor-2PTEK6ND.cjs.map} +1 -1
  24. package/dist/{SpotlightStrip-ED22UYTM.cjs → SpotlightStrip-QQ2WUI32.cjs} +28 -29
  25. package/dist/SpotlightStrip-QQ2WUI32.cjs.map +1 -0
  26. package/dist/{WorkspaceTableView-MIFYXV3G.cjs → WorkspaceTableView-3XYAV4BV.cjs} +8 -8
  27. package/dist/{WorkspaceTableView-MIFYXV3G.cjs.map → WorkspaceTableView-3XYAV4BV.cjs.map} +1 -1
  28. package/dist/agents/index.cjs +215 -215
  29. package/dist/ai-IEIR7SC2.cjs +3 -3
  30. package/dist/auth/index.cjs +1 -1
  31. package/dist/calls/index.cjs +2 -2
  32. package/dist/chat/index.cjs +6 -6
  33. package/dist/{chunk-GAMRVB3I.cjs → chunk-23I5EUZA.cjs} +65 -10
  34. package/dist/chunk-23I5EUZA.cjs.map +1 -0
  35. package/dist/{chunk-ZZZITHGK.cjs → chunk-26SFI2BH.cjs} +16 -3
  36. package/dist/chunk-26SFI2BH.cjs.map +1 -0
  37. package/dist/{chunk-OGK377NL.cjs → chunk-2SU37RZA.cjs} +409 -42
  38. package/dist/chunk-2SU37RZA.cjs.map +1 -0
  39. package/dist/{chunk-CQ2RJYE2.cjs → chunk-3IH55CDE.cjs} +3 -3
  40. package/dist/{chunk-CQ2RJYE2.cjs.map → chunk-3IH55CDE.cjs.map} +1 -1
  41. package/dist/{chunk-AS6QZETU.cjs → chunk-5QERK4PK.cjs} +35 -35
  42. package/dist/{chunk-AS6QZETU.cjs.map → chunk-5QERK4PK.cjs.map} +1 -1
  43. package/dist/{chunk-AISYXX4M.cjs → chunk-7NLO7ASW.cjs} +4 -4
  44. package/dist/{chunk-AISYXX4M.cjs.map → chunk-7NLO7ASW.cjs.map} +1 -1
  45. package/dist/{chunk-QIK7E6VF.cjs → chunk-7PN3YENO.cjs} +4 -4
  46. package/dist/{chunk-QIK7E6VF.cjs.map → chunk-7PN3YENO.cjs.map} +1 -1
  47. package/dist/{chunk-JY7UUZQG.cjs → chunk-7Q46YAX4.cjs} +74 -71
  48. package/dist/chunk-7Q46YAX4.cjs.map +1 -0
  49. package/dist/{chunk-J3FFSEKO.cjs → chunk-ADDQKZ5I.cjs} +4 -4
  50. package/dist/{chunk-J3FFSEKO.cjs.map → chunk-ADDQKZ5I.cjs.map} +1 -1
  51. package/dist/{chunk-L6HTZIBD.cjs → chunk-ALK3PUUB.cjs} +3 -3
  52. package/dist/{chunk-L6HTZIBD.cjs.map → chunk-ALK3PUUB.cjs.map} +1 -1
  53. package/dist/{chunk-3ZZZO4F7.cjs → chunk-BY3QA3S5.cjs} +9 -9
  54. package/dist/{chunk-3ZZZO4F7.cjs.map → chunk-BY3QA3S5.cjs.map} +1 -1
  55. package/dist/{chunk-3UP32FM3.cjs → chunk-CQQQIZU4.cjs} +5 -5
  56. package/dist/{chunk-3UP32FM3.cjs.map → chunk-CQQQIZU4.cjs.map} +1 -1
  57. package/dist/{chunk-YOEP3I4V.cjs → chunk-E3L5DB5F.cjs} +5 -5
  58. package/dist/{chunk-YOEP3I4V.cjs.map → chunk-E3L5DB5F.cjs.map} +1 -1
  59. package/dist/{chunk-UA7HOLAZ.cjs → chunk-ESVRVZ53.cjs} +5 -5
  60. package/dist/{chunk-UA7HOLAZ.cjs.map → chunk-ESVRVZ53.cjs.map} +1 -1
  61. package/dist/{chunk-2K6IMIVL.cjs → chunk-GNZAH6UI.cjs} +3 -3
  62. package/dist/{chunk-2K6IMIVL.cjs.map → chunk-GNZAH6UI.cjs.map} +1 -1
  63. package/dist/{chunk-KA3F6TIH.cjs → chunk-IWHP7FAB.cjs} +12 -5
  64. package/dist/chunk-IWHP7FAB.cjs.map +1 -0
  65. package/dist/{chunk-ORNLCBNE.cjs → chunk-JVEDKKNO.cjs} +43 -4
  66. package/dist/chunk-JVEDKKNO.cjs.map +1 -0
  67. package/dist/{chunk-6JMW3IJ2.cjs → chunk-JVLOIIA7.cjs} +103 -100
  68. package/dist/chunk-JVLOIIA7.cjs.map +1 -0
  69. package/dist/{chunk-UUENH4BJ.cjs → chunk-KXIRVKCJ.cjs} +3 -3
  70. package/dist/{chunk-UUENH4BJ.cjs.map → chunk-KXIRVKCJ.cjs.map} +1 -1
  71. package/dist/{chunk-YVO6Z5BS.cjs → chunk-M6WVIGYP.cjs} +10 -10
  72. package/dist/{chunk-YVO6Z5BS.cjs.map → chunk-M6WVIGYP.cjs.map} +1 -1
  73. package/dist/{chunk-PSB64T43.cjs → chunk-MLA2BJ2Y.cjs} +28 -28
  74. package/dist/{chunk-PSB64T43.cjs.map → chunk-MLA2BJ2Y.cjs.map} +1 -1
  75. package/dist/{chunk-B3R62764.cjs → chunk-MMSHIIKG.cjs} +6 -6
  76. package/dist/{chunk-B3R62764.cjs.map → chunk-MMSHIIKG.cjs.map} +1 -1
  77. package/dist/{chunk-ENOPKX7E.cjs → chunk-MXBXZXXQ.cjs} +3 -3
  78. package/dist/{chunk-ENOPKX7E.cjs.map → chunk-MXBXZXXQ.cjs.map} +1 -1
  79. package/dist/chunk-NTDQQLDD.cjs +18 -0
  80. package/dist/{chunk-IRGRMJPP.cjs.map → chunk-NTDQQLDD.cjs.map} +1 -1
  81. package/dist/{chunk-PVJ5ODDB.cjs → chunk-Q6IKXWPG.cjs} +4 -4
  82. package/dist/{chunk-PVJ5ODDB.cjs.map → chunk-Q6IKXWPG.cjs.map} +1 -1
  83. package/dist/{chunk-4LP5MJGQ.cjs → chunk-QG2U2JGX.cjs} +4 -4
  84. package/dist/{chunk-4LP5MJGQ.cjs.map → chunk-QG2U2JGX.cjs.map} +1 -1
  85. package/dist/{chunk-MVXHTAJ4.cjs → chunk-QWVUBTW3.cjs} +9 -9
  86. package/dist/{chunk-MVXHTAJ4.cjs.map → chunk-QWVUBTW3.cjs.map} +1 -1
  87. package/dist/{chunk-OHWHYVKG.cjs → chunk-T73BHNQX.cjs} +3 -3
  88. package/dist/{chunk-OHWHYVKG.cjs.map → chunk-T73BHNQX.cjs.map} +1 -1
  89. package/dist/{chunk-PWBRE7JA.cjs → chunk-VLQCLQAS.cjs} +23 -10
  90. package/dist/chunk-VLQCLQAS.cjs.map +1 -0
  91. package/dist/{chunk-ADPRIBSH.cjs → chunk-X7ALF4MP.cjs} +7 -7
  92. package/dist/{chunk-ADPRIBSH.cjs.map → chunk-X7ALF4MP.cjs.map} +1 -1
  93. package/dist/{chunk-7RJZIPLE.cjs → chunk-YP5EBGLU.cjs} +33 -33
  94. package/dist/{chunk-7RJZIPLE.cjs.map → chunk-YP5EBGLU.cjs.map} +1 -1
  95. package/dist/{chunk-TSFNLY3K.cjs → chunk-ZCU72Q76.cjs} +192 -166
  96. package/dist/chunk-ZCU72Q76.cjs.map +1 -0
  97. package/dist/{chunk-BLIO3B7Z.cjs → chunk-ZYGAXD3N.cjs} +3 -3
  98. package/dist/{chunk-BLIO3B7Z.cjs.map → chunk-ZYGAXD3N.cjs.map} +1 -1
  99. package/dist/connect/docx.cjs +16 -16
  100. package/dist/connect/index.cjs +1095 -1114
  101. package/dist/connect/index.cjs.map +1 -1
  102. package/dist/connect/viewer.cjs +26 -27
  103. package/dist/connection/ai.d.ts +1 -0
  104. package/dist/connection/docx/ConnectedNativeDocxEditor.js +4 -5
  105. package/dist/connection/docx/ConnectedNativeDocxEditor.js.map +2 -2
  106. package/dist/connection/docx/save-native-version.d.ts +3 -0
  107. package/dist/connection/docx/save-native-version.js +19 -0
  108. package/dist/connection/docx/save-native-version.js.map +7 -0
  109. package/dist/connection/presentation/ClippingPdfViewer.js +8 -5
  110. package/dist/connection/presentation/ClippingPdfViewer.js.map +2 -2
  111. package/dist/connection/presentation/ConnectedSlidesTab.js +8 -13
  112. package/dist/connection/presentation/ConnectedSlidesTab.js.map +2 -2
  113. package/dist/connection/presentation/usePresentationController.js +24 -15
  114. package/dist/connection/presentation/usePresentationController.js.map +2 -2
  115. package/dist/connection/presentation/usePresentationFiles.d.ts +2 -1
  116. package/dist/connection/presentation/usePresentationFiles.js +15 -6
  117. package/dist/connection/presentation/usePresentationFiles.js.map +2 -2
  118. package/dist/connection/remote-control/ConnectedRemoteControlConsent.js +6 -3
  119. package/dist/connection/remote-control/ConnectedRemoteControlConsent.js.map +2 -2
  120. package/dist/connection/remote-control/ConnectedRemoteControlIndicator.js +12 -2
  121. package/dist/connection/remote-control/ConnectedRemoteControlIndicator.js.map +2 -2
  122. package/dist/connection/remote-control/ConnectedRemoteControlSwitch.js +1 -1
  123. package/dist/connection/remote-control/ConnectedRemoteControlSwitch.js.map +1 -1
  124. package/dist/connection/remote-control/browser-diagnostics.d.ts +7 -0
  125. package/dist/connection/remote-control/browser-diagnostics.js +109 -0
  126. package/dist/connection/remote-control/browser-diagnostics.js.map +7 -0
  127. package/dist/connection/remote-control/remoteControl.d.ts +9 -1
  128. package/dist/connection/remote-control/remoteControl.js +130 -10
  129. package/dist/connection/remote-control/remoteControl.js.map +2 -2
  130. package/dist/connection/remote-control/screen-sharing.d.ts +11 -0
  131. package/dist/connection/remote-control/screen-sharing.js +78 -0
  132. package/dist/connection/remote-control/screen-sharing.js.map +7 -0
  133. package/dist/connection/report-problem/screen-capture.d.ts +1 -0
  134. package/dist/connection/report-problem/screen-capture.js +2 -1
  135. package/dist/connection/report-problem/screen-capture.js.map +2 -2
  136. package/dist/connection/search/ConnectedSearchPage.d.ts +0 -11
  137. package/dist/connection/search/ConnectedSearchPage.js +3 -0
  138. package/dist/connection/search/ConnectedSearchPage.js.map +2 -2
  139. package/dist/connection/search/SearchResultRows.js +75 -43
  140. package/dist/connection/search/SearchResultRows.js.map +2 -2
  141. package/dist/connection/viewer/CleanViewControl.d.ts +3 -1
  142. package/dist/connection/viewer/CleanViewControl.js +5 -1
  143. package/dist/connection/viewer/CleanViewControl.js.map +2 -2
  144. package/dist/connection/viewer/ConnectedDocumentViewer.js +1 -1
  145. package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
  146. package/dist/connection/viewer/useCleanView.d.ts +1 -1
  147. package/dist/connection/viewer/useCleanView.js +2 -2
  148. package/dist/connection/viewer/useCleanView.js.map +2 -2
  149. package/dist/connection/viewer/useViewedDocument.d.ts +1 -0
  150. package/dist/document-tools/index.cjs +20 -20
  151. package/dist/docx/NativeDocxEditor.d.ts +2 -1
  152. package/dist/docx/NativeDocxEditor.js +34 -7
  153. package/dist/docx/NativeDocxEditor.js.map +2 -2
  154. package/dist/docx/index.cjs +38 -38
  155. package/dist/docx/useVersionAutosave.d.ts +10 -0
  156. package/dist/docx/useVersionAutosave.js +36 -0
  157. package/dist/docx/useVersionAutosave.js.map +7 -0
  158. package/dist/embed/index.cjs +19 -19
  159. package/dist/facts/index.cjs +64 -64
  160. package/dist/files/index.cjs +223 -223
  161. package/dist/index.cjs +542 -542
  162. package/dist/presentation/ClipCaptureOverlay.js +14 -1
  163. package/dist/presentation/ClipCaptureOverlay.js.map +2 -2
  164. package/dist/presentation/ClipImage.js +7 -4
  165. package/dist/presentation/ClipImage.js.map +2 -2
  166. package/dist/presentation/ClipTray.js +11 -7
  167. package/dist/presentation/ClipTray.js.map +2 -2
  168. package/dist/presentation/SlidesEditor.js +6 -2
  169. package/dist/presentation/SlidesEditor.js.map +2 -2
  170. package/dist/presentation/store.d.ts +2 -0
  171. package/dist/presentation/store.js +15 -0
  172. package/dist/presentation/store.js.map +3 -3
  173. package/dist/settings/index.cjs +146 -146
  174. package/dist/shell/RemoteControlPill.d.ts +2 -1
  175. package/dist/shell/RemoteControlPill.js +10 -3
  176. package/dist/shell/RemoteControlPill.js.map +2 -2
  177. package/dist/shell/index.cjs +21 -21
  178. package/dist/site/index.cjs +6 -6
  179. package/dist/studio/index.cjs +9 -9
  180. package/dist/workflow-canvas/index.cjs +34 -34
  181. package/node_modules/@arbidocs/coedit/package.json +1 -1
  182. package/package.json +5 -5
  183. package/dist/ClippingMediaViewer-ZFEX5A3U.cjs.map +0 -1
  184. package/dist/ClippingPdfViewer-3LRTEPHV.cjs.map +0 -1
  185. package/dist/ConnectedPresentation-L32JPRFI.cjs.map +0 -1
  186. package/dist/ConnectedSlidesTab-P7GGNUTO.cjs.map +0 -1
  187. package/dist/FilesViewerDialog-MHUVEZ7M.cjs.map +0 -1
  188. package/dist/SpotlightStrip-ED22UYTM.cjs.map +0 -1
  189. package/dist/chunk-6JMW3IJ2.cjs.map +0 -1
  190. package/dist/chunk-GAMRVB3I.cjs.map +0 -1
  191. package/dist/chunk-GFUOCGY6.cjs +0 -32
  192. package/dist/chunk-GFUOCGY6.cjs.map +0 -1
  193. package/dist/chunk-IRGRMJPP.cjs +0 -18
  194. package/dist/chunk-JY7UUZQG.cjs.map +0 -1
  195. package/dist/chunk-KA3F6TIH.cjs.map +0 -1
  196. package/dist/chunk-OGK377NL.cjs.map +0 -1
  197. package/dist/chunk-ORNLCBNE.cjs.map +0 -1
  198. package/dist/chunk-PWBRE7JA.cjs.map +0 -1
  199. package/dist/chunk-TSFNLY3K.cjs.map +0 -1
  200. package/dist/chunk-ZZZITHGK.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tips/useTipsPlacement.ts","../src/guided/cursor-visuals.json","../src/guided/GuidedCursor.tsx","../src/components/LoadingIndicator.tsx","../src/components/GridRowNavigator.tsx","../src/components/Toolbar.tsx","../src/components/EntityIdentityBar.tsx","../src/activity/workspace-activity.ts","../src/activity/WorkspaceActivityList.tsx","../src/tags/tagTableModel.ts","../src/tags/TagColumnsEditor.tsx","../src/tags/TagTable.tsx","../src/tags/TagDetail.tsx","../src/tags/tagTableDocx.ts","../src/tags/glossary.ts","../src/tags/page/tagsPageLabels.ts","../src/tags/page/ExtractEntitiesDialog.tsx","../src/lazy-chunks.ts"],"names":["useState","useEffect","useMemo","jsx","useSyncExternalStore","guidedCursor","useRef","useMountedSurface","createPortal","jsxs","Sparkle","cn","useCallback","total","RowNavigatorControls","Search","Input","Textarea","Pencil","document","taskActivityHeadline","DEFAULT_TASK_ACTIVITY_LABELS","assistantCopy","Activity","MessageSquare","FileText","Workflow","useAssistantCopy","Button","body","Fragment","ArrowUp","ArrowDown","X","Plus","Loader2","Checkbox","TagEntity","ArrowUpRight","ChevronDown","count","Lightbulb","MessagesSquare","Popover","PopoverTrigger","MoreHorizontal","PopoverContent","SlidersHorizontal","FileDown","Download","GridView","DetailLoading","DetailBody","DetailSection","DetailLinkList","DetailLinkItem","DetailEmpty","DetailFields","DetailField","paragraph","page","minuteUtc","cell","documentXml","docxPackage","TABLE_DOCUMENT_STYLES","groupDefinitions","compareDefinitions","escapeCell","getEntityLabel","tagKindNouns","tagKindTitle","getDocumentTitle","isImageDocument","Dialog","DialogContent","ModalHeader","DialogTitle","DialogDescription","DocumentPicker","gridChunk","calendarGridChunk","docxEditorChunk","prefetchChunk"],"mappings":";;;;;;;;;;;;;;;;;;;;AAkBO,SAAS,gBAAA,CAAqD;AAAA,EACnE,QAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAY,EAAC;AAAA,EACb,iBAAA,GAAoB;AACtB,CAAA,EAAiD;AAC/C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,CAAC,CAAA;AAChD,EAAAC,eAAA,CAAU,MAAM,QAAA,CAAS,SAAA,CAAU,MAAM,cAAA,CAAe,CAAC,KAAA,KAAU,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAC1F,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,KAAA,IAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAOC,aAAA;AAAA,IACX,MAAM,QAAA,CAAS,MAAA,CAAO,OAAA,EAAS,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA;AAAA;AAAA,IAGnF,CAAC,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,aAAa,YAAY;AAAA,GACzD;AACA,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIF,eAAS,CAAC,CAAA;AACtC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1C,EAAAC,eAAA,CAAU,MAAM,UAAU,CAAC,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAC,CAAA;AAC3D,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,CAAA,IAAK,MAAA,IAAU,qBAAqB,CAAA,EAAG;AAC1D,IAAA,MAAM,KAAA,GAAQ,UAAA;AAAA,MACZ,MAAM,SAAA,CAAU,CAAC,WAAW,KAAA,GAAQ,CAAA,IAAK,KAAK,MAAM,CAAA;AAAA,MACpD,iBAAA,GAAoB;AAAA,KACtB;AACA,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACjC,GAAG,CAAC,IAAA,CAAK,QAAQ,MAAA,EAAQ,iBAAA,EAAmB,MAAM,CAAC,CAAA;AAEnD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAS,MAAA,GAAS,KAAK,MAAA,GAAS,CAAA;AACnD,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,GAAA,EAAK,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA;AAAA,IAClB,KAAA;AAAA,IACA,OAAO,IAAA,CAAK,MAAA;AAAA,IACZ,QAAA,EAAU,MACR,SAAA,CAAU,CAAC,KAAA,KAAW,IAAA,CAAK,MAAA,GAAA,CAAU,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,SAAS,CAAE,CAAA;AAAA,IAClF,IAAA,EAAM,MAAM,SAAA,CAAU,CAAC,KAAA,KAAW,IAAA,CAAK,MAAA,GAAA,CAAU,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,CAAE,CAAA;AAAA,IAC9E,aAAA,EAAe;AAAA,GACjB;AACF;;;AC1DA,IAAA,sBAAA,GAAA;AAAA,EACE,KAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAa,sBAAA;AAAA,EACb,cAAA,EAAkB,uBAAA;AAAA,EAClB,SAAA,EAAa,sBAAA;AAAA,EACb,IAAA,EAAQ,EAAA;AAAA,EACR,WAAA,EAAe,CAAA;AAAA,EACf,IAAA,EAAQ;AAAA,IACN,KAAA,EAAS;AAAA,GACX;AAAA,EACA,MAAA,EAAU;AAAA,IACR,UAAA,EAAc,GAAA;AAAA,IACd,MAAA,EAAU,UAAA;AAAA,IACV,UAAA,EAAc,GAAA;AAAA,IACd,QAAA,EAAY,CAAA;AAAA,IACZ,YAAA,EAAgB,IAAA;AAAA,IAChB,UAAA,EAAc;AAAA,GAChB;AAAA,EACA,MAAA,EAAU;AAAA,IACR,MAAA,EAAU,EAAA;AAAA,IACV,IAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAS,GAAA;AAAA,IACT,UAAA,EAAc,SAAA;AAAA,IACd,QAAA,EAAY;AAAA,GACd;AAAA,EACA,SAAA,EAAa;AAAA,IACX,UAAA,EAAc,GAAA;AAAA,IACd,QAAA,EAAY,EAAA;AAAA,IACZ,SAAA,EAAa,EAAA;AAAA,IACb,MAAA,EAAU;AAAA;AAEd,CAAA;ACWA,IAAM,UAAA,GAA4B;AAAA,EAChC,QAAA,EAAU,OAAA;AAAA,EACV,OAAO,sBAAA,CAAe,IAAA;AAAA,EACtB,QAAQ,sBAAA,CAAe,IAAA;AAAA,EACvB,QAAQ,CAAA,EAAG,sBAAA,CAAe,WAAW,CAAA,SAAA,EAAY,uBAAe,KAAK,CAAA,CAAA;AAAA,EACrE,YAAA,EAAc,KAAA;AAAA,EACd,aAAA,EAAe;AACjB,CAAA;AAEA,IAAM,aAAa,CAAC,IAAA,EAAc,UAAkB,CAAA,gBAAA,EAAmB,IAAI,MAAM,KAAK,CAAA,CAAA,CAAA;AAGtF,SAAS,SAAA,CAAU,EAAE,CAAA,EAAG,CAAA,EAAE,EAA6B;AACrD,EAAA,uBACEE,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,GAAG,UAAA,EAAY,MAAM,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,SAAA,EAAW,uBAAA,EAAwB;AAAA,MAC5E,GAAA,EAAK,CAAC,EAAA,KAAO;AACX,QAAA,MAAM,EAAE,QAAO,GAAI,sBAAA;AACnB,QAAA,EAAA,EAAI,OAAA;AAAA,UACF;AAAA,YACE;AAAA,cACE,SAAS,MAAA,CAAO,YAAA;AAAA,cAChB,SAAA,EAAW,CAAA,2BAAA,EAA8B,MAAA,CAAO,UAAU,CAAA,CAAA;AAAA,aAC5D;AAAA,YACA;AAAA,cACE,SAAS,MAAA,CAAO,UAAA;AAAA,cAChB,SAAA,EAAW,CAAA,2BAAA,EAA8B,MAAA,CAAO,QAAQ,CAAA,CAAA;AAAA;AAC1D,WACF;AAAA,UACA,EAAE,QAAA,EAAU,MAAA,CAAO,UAAA,EAAY,MAAA,EAAQ,OAAO,MAAA;AAAO,SACvD;AAAA,MACF;AAAA;AAAA,GACF;AAEJ;AAGA,SAAS,kBAAkB,IAAA,EAAmB;AAC5C,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,gBAAe,GAAI,sBAAA;AACzD,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,SAAS,MAAA,CAAO,IAAA,CAAA;AACzD,EAAA,IAAA,CAAK,OAAA;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA,MAKE,EAAE,SAAA,EAAW,+BAAA,EAAiC,QAAQ,CAAA,EAAG,MAAA,EAAQ,OAAO,UAAA,EAAW;AAAA,MACnF;AAAA,QACE,SAAA,EAAW,CAAA,2BAAA,EAA8B,MAAA,CAAO,KAAK,CAAA,CAAA,CAAA;AAAA,QACrD,MAAA,EAAQ,QAAA;AAAA,QACR,QAAQ,MAAA,CAAO;AAAA,OACjB;AAAA,MACA,EAAE,SAAA,EAAW,+BAAA,EAAiC,MAAA,EAAQ,CAAA;AAAE,KAC1D;AAAA,IACA,EAAE,QAAA,EAAU,MAAA,CAAO,MAAA,GAAS,OAAO,IAAA;AAAK,GAC1C;AACA,EAAA,IAAA,CAAK,OAAA;AAAA,IACH;AAAA,MACE,EAAE,MAAA,EAAQ,UAAA,CAAW,SAAA,CAAU,QAAA,EAAU,SAAS,CAAA,EAAE;AAAA,MACpD,EAAE,QAAQ,UAAA,CAAW,SAAA,CAAU,WAAW,cAAc,CAAA,EAAG,QAAQ,GAAA,EAAI;AAAA,MACvE,EAAE,MAAA,EAAQ,UAAA,CAAW,SAAA,CAAU,QAAA,EAAU,SAAS,CAAA;AAAE,KACtD;AAAA,IACA,EAAE,QAAA,EAAU,SAAA,CAAU,UAAA,EAAY,MAAA,EAAQ,UAAU,MAAA;AAAO,GAC7D;AACF;AAGO,SAAS,YAAA,CAAa,EAAE,OAAA,EAAQ,EAAsB;AAC3D,EAAA,MAAM,IAAA,GAAOC,0BAAA;AAAA,IACXC,8BAAA,CAAa,SAAA;AAAA,IACbA,8BAAA,CAAa,WAAA;AAAA,IACbA,8BAAA,CAAa;AAAA,GACf;AACA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIL,cAAAA,CAAmB,EAAE,CAAA;AACnD,EAAA,MAAM,OAAA,GAAUM,aAA2B,IAAI,CAAA;AAE/C,EAAAC,mCAAA,CAAkB,QAAQ,CAAA;AAE1B,EAAAN,gBAAU,MAAM;AACd,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,OAAOI,8BAAA,CAAa,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,KAAM;AACrC,MAAA,MAAM,KAAK,EAAE,GAAA;AACb,MAAA,UAAA,CAAW,CAAC,EAAA,KAAO,CAAC,GAAG,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACxC,MAAA,UAAA,CAAW,MAAM,UAAA,CAAW,CAAC,EAAA,KAAO,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,GAAG,GAAG,CAAA;AACvE,MAAA,IAAI,CAACA,8BAAA,CAAa,oBAAA,EAAqB,IAAK,QAAQ,OAAA,EAAS;AAC3D,QAAA,iBAAA,CAAkB,QAAQ,OAAO,CAAA;AAAA,MACnC;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,IAAA;AAElD,EAAA,MAAM,OAAA,GAAUA,+BAAa,oBAAA,EAAqB;AAClD,EAAA,MAAM,SAAA,GAA2B;AAAA,IAC/B,QAAA,EAAU,OAAA;AAAA,IACV,MAAM,IAAA,CAAK,CAAA;AAAA,IACX,KAAK,IAAA,CAAK,CAAA;AAAA,IACV,SAAA,EAAW,uBAAA;AAAA,IACX,aAAA,EAAe,MAAA;AAAA,IACf,QAAQ,UAAA,CAAW,sBAAA,CAAe,SAAA,CAAU,QAAA,EAAU,uBAAe,SAAS,CAAA;AAAA,IAC9E,UAAA,EAAY,UACR,MAAA,GACA,CAAA,KAAA,EAAQA,+BAAa,OAAO,CAAA,uCAAA,EAA0CA,+BAAa,OAAO,CAAA,iCAAA;AAAA,GAChG;AAEA,EAAA,OAAOG,qBAAA;AAAA,oBACLC,eAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAW,IAAA,EAAC,WAAU,kDAAA,EACxB,QAAA,EAAA;AAAA,MAAA,IAAA,CAAK,YACH,OAAA,mBACCN,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,OAAA;AAAA,UACL,aAAA,EAAY,eAAA;AAAA,UACZ,GAAA,EAAK,OAAA;AAAA,UACL,GAAA,EAAI,EAAA;AAAA,UACJ,KAAA,EAAO,EAAE,GAAG,SAAA,EAAW,OAAO,sBAAA,CAAe,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,MAAA;AAAO;AAAA,OAC1E,mBAEAA,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,OAAA;AAAA,UACL,aAAA,EAAY,eAAA;AAAA,UACZ,KAAA,EAAO,EAAE,GAAG,UAAA,EAAY,GAAG,SAAA,EAAW,UAAA,EAAY,uBAAe,SAAA;AAAU;AAAA,OAC7E,CAAA;AAAA,MAEH,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,oCACX,SAAA,EAAA,EAAqB,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAA,EAAnB,CAAA,CAAE,EAAoB,CACvC;AAAA,KAAA,EACH,CAAA;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF;AC5IA,IAAM,cAAA,GAAiB,CAAC,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAC5C,IAAM,YAAA,GACJ,6GAAA;AAEF,SAAS,aAAa,OAAA,EAA0B;AAC9C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIH,cAAAA,CAAS,WAAW,CAAC,CAAA;AAC7C,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,WAAW,CAAA,EAAG;AAClB,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,OAAA,CAAQ,IAAI,GAAG,OAAO,CAAA;AACrD,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACZ,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,OAAA,GAAU,SAAA;AAAA,EACV,IAAA;AAAA,EACA,OAAA,GAAU,CAAA;AAAA,EACV,OAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,EAA0B;AACxB,EAAA,MAAM,IAAA,GAAO,aAAa,OAAO,CAAA;AACjC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,IAAI,YAAY,QAAA,EAAU;AACxB,IAAA,uBACEE,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAa,MAAA;AAAA,QAGb,SAAA,EAAW,CAAC,YAAA,EAAc,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,QAE7D,QAAA,kBAAAM,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,0BACDN,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACZ,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,KAAA,qBACnBA,cAAAA;AAAA,YAACO,mBAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAU,kDAAA;AAAA,cACV,OAAO,KAAA,KAAU,IAAA,GAAO,MAAA,GAAY,EAAE,gBAAgB,KAAA;AAAM,aAAA;AAAA,YAFvD;AAAA,WAIR,CAAA,EACH,CAAA;AAAA,UACC,2BAAWP,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,OAAA,EAAQ;AAAA,SAAA,EACpE;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACEM,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWE,KAAA,CAAG,sDAAA,EAAwD,SAAS,CAAA;AAAA,MAC/E,aAAA,EAAa,MAAA;AAAA,MAEb,QAAA,EAAA;AAAA,wBAAAR,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EAA4E,CAAA;AAAA,QAC1F,2BAAWA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,OAAA,EAAQ;AAAA;AAAA;AAAA,GACpE;AAEJ;ACzDA,IAAM,gBAAA,GAAmB,CAAC,cAAA,EAAgB,aAAA,EAAe,iBAAiB,gBAAgB,CAAA;AAEnF,SAAS,gBAAA,CAAoB;AAAA,EAClC,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAA6B;AAC3B,EAAA,MAAM,CAAC,EAAE,KAAA,EAAO,YAAA,EAAa,EAAG,WAAW,CAAA,GAAIH,cAAAA,CAG5C,EAAE,KAAA,EAAO,CAAA,EAAG,YAAA,EAAc,MAAM,CAAA;AAEnC,EAAA,MAAM,YAAA,GAAeY,kBAAY,MAAM;AACrC,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,WAAA,EAAY,EAAG;AACrC,MAAA,WAAA,CAAY,EAAE,KAAA,EAAO,CAAA,EAAG,YAAA,EAAc,MAAM,CAAA;AAC5C,MAAA;AAAA,IACF;AACA,IAAA,MAAMC,MAAAA,GAAQ,QAAQ,oBAAA,EAAqB;AAC3C,IAAA,MAAM,IAAA,GAAO,UAAA,GAAa,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,GAAI,MAAA;AAC3D,IAAA,MAAM,QAAQ,IAAA,EAAM,QAAA;AAEpB,IAAA,WAAA,CAAY,EAAE,KAAA,EAAAA,MAAAA,EAAO,YAAA,EAAc,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,IAAS,CAAA,GAAI,KAAA,GAAQ,IAAA,EAAM,CAAA;AAAA,EAC7F,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAExB,EAAAZ,gBAAU,MAAM;AACd,IAAA,YAAA,EAAa;AACb,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,WAAA,EAAY,EAAG;AACvC,IAAA,KAAA,MAAW,EAAA,IAAM,gBAAA,EAAkB,OAAA,CAAQ,gBAAA,CAAiB,IAAI,YAAY,CAAA;AAC5E,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAA,CAAQ,aAAY,EAAG;AAC3B,MAAA,KAAA,MAAW,EAAA,IAAM,gBAAA,EAAkB,OAAA,CAAQ,mBAAA,CAAoB,IAAI,YAAY,CAAA;AAAA,IACjF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,YAAY,CAAC,CAAA;AAE1B,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAkB;AAC9B,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,WAAA,EAAY,EAAG;AACvC,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAC,CAAA;AACtD,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,sBAAA,CAAuB,OAAO,CAAA;AACnD,IAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACjB,IAAA,OAAA,CAAQ,kBAAA,CAAmB,SAAS,QAAQ,CAAA;AAC5C,IAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,uBACEE,cAAAA;AAAA,IAACW,sCAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,YAAA;AAAA,MACA,IAAA,EAAM,IAAA;AAAA,MACN,MAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;ACpFO,SAAS,OAAA,CAAQ;AAAA,EACtB,MAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA,GAAoB,cAAA;AAAA,EACpB,SAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,uBACEX,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWQ,KAAAA;AAAA,QACT,oEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,aAAA,EAAa,MAAA;AAAA,MAEb,QAAA,kBAAAR,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,sCACCM,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,wBAAAN,cAAAA,CAACY,kBAAA,EAAA,EAAO,SAAA,EAAU,6FAAA,EAA8F,CAAA;AAAA,wBAChHZ,cAAAA;AAAA,UAACa,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,MAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACxC,WAAA,EAAa,iBAAA;AAAA,YACb,SAAA,EAAU,kIAAA;AAAA,YACV,aAAA,EAAa,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,OAAA,CAAA,GAAY;AAAA;AAAA;AAC7C,OAAA,EACF,CAAA,EAEJ;AAAA;AAAA,GACF;AAEJ;ACpCO,IAAM,wBAAA,GAA2B;AAGxC,IAAM,iBAAA,GAAoB,EAAA;AAyEnB,SAAS,iBAAA,CAAkB;AAAA,EAChC,MAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,uBACEP,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWE,KAAAA,CAAG,4DAAA,EAA8D,SAAS,CAAA;AAAA,MACrF,aAAA,EAAa,MAAA;AAAA,MAEb,QAAA,EAAA;AAAA,wBAAAR,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4BAAA,EACX,QAAA,EAAA,MAAA,CAAO,IAAI,CAAC,KAAA,qBACXA,cAAAA,CAAC,oBAAmC,KAAA,EAAc,OAAA,EAAA,EAA3B,KAAA,CAAM,KAAuC,CACrE,CAAA,EACH,CAAA;AAAA,QACC,0BAAUA,cAAAA,CAAC,SAAI,SAAA,EAAU,kCAAA,EAAoC,mBAAQ,CAAA,GAAS;AAAA;AAAA;AAAA,GACjF;AAEJ;AAEA,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAO,OAAA,EAAQ,EAAqD;AAC9F,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA,GAAY,KAAA;AAAA,IACZ,SAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIH,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,KAAK,CAAA;AAIxC,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW,QAAA,CAAS,KAAK,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,KAAA,EAAO,SAAS,CAAC,CAAA;AAErB,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,EAAK;AACxB,IAAA,IAAI,IAAA,KAAS,KAAA,EAAO,MAAA,CAAO,IAAI,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,QAAA,CAAS,KAAK,CAAA;AACd,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,SAAA,KAAc,MAAA,GAAY,IAAA,GAAO,YAAY,KAAA,CAAM,MAAA;AAMrE,EAAA,MAAM,UAAA,GACJ,6GAAA;AAEF,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,KAAA,EAAO,KAAA;AAAA,IACP,WAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA,EAAc,KAAA;AAAA,IACd,aAAA,EAAe,MAAA,IAAU,CAAA,EAAG,MAAM,CAAA,MAAA,CAAA;AAAA,IAClC,MAAA,EAAQ,MAAA;AAAA,IACR,UAAU,CAAC,CAAA,KAAqC,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,IACvE,SAAA,EAAW,CAAC,CAAA,KAA2B;AACrC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAA,EAAO;AAAA,MACT,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,SAAA,EAAW;AAC1C,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAA,EAAO;AAAA,MACT;AAAA,IACF;AAAA,GACF;AAMA,EAAA,uBACEQ,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAWE,MAAG,4BAAA,EAA8B,SAAA,GAAY,aAAA,GAAgB,cAAc,CAAA,EACzF,QAAA,EAAA;AAAA,oBAAAF,eAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWE,KAAAA;AAAA,UACT,SAAA,GACI,SAAA,GACAA,KAAAA,CAAG,yDAAA,EAA2D,aAAa,MAAM;AAAA,SACvF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAAM;AAAA;AAAA;AAAA,KACT;AAAA,oBAEAF,eAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6EAAA,EACX,QAAA,EAAA;AAAA,MAAA,OAAA;AAAA,MACA,SAAA,mBACCA,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0DAAA,EACZ,QAAA,EAAA;AAAA,QAAA,SAAA,mBACCN,cAAAA;AAAA,UAACc,WAAA;AAAA,UAAA;AAAA,YACE,GAAG,MAAA;AAAA,YACJ,IAAA,EAAM,CAAA;AAAA,YACN,SAAA,EAAWN,KAAAA,CAAG,UAAA,EAAY,kCAAA,EAAoC,cAAc;AAAA;AAAA,SAC9E,mBAEAR,cAAAA,CAACa,QAAAA,EAAA,EAAO,GAAG,MAAA,EAAQ,SAAA,EAAWL,KAAAA,CAAG,UAAA,EAAY,OAAA,EAAS,cAAc,CAAA,EAAG,CAAA;AAAA,QAExE,SAAA,KAAc,IAAA,IAAQ,SAAA,IAAa,iBAAA,oBAClCR,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWQ,KAAAA;AAAA,cACT,uFAAA;AAAA,cACA,SAAA,GAAY,IAAI,kBAAA,GAAqB;AAAA,aACvC;AAAA,YACA,aAAA,EAAa,MAAA,IAAU,CAAA,EAAG,MAAM,CAAA,QAAA,CAAA;AAAA,YAE/B,sBAAY,CAAA,GAAI,CAAA,EAAG,CAAC,SAAS,CAAA,KAAA,CAAA,GAAU,GAAG,SAAS,CAAA,KAAA;AAAA;AAAA;AACtD,OAAA,EAEJ,CAAA;AAAA;AAAA;AAAA;AAAA,wBAKAF,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sEAAA,EAGd,QAAA,EAAA;AAAA,0BAAAN,eAAC,MAAA,EAAA,EAAK,SAAA,EAAWQ,KAAAA,CAAG,eAAA,EAAiB,cAAc,CAAA,EAAG,aAAA,EAAa,MAAA,EAChE,QAAA,EAAA,KAAA,oBAASR,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,uBAAY,CAAA,EACxE,CAAA;AAAA,UACC,2BACCA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,cAChC,YAAA,EAAY,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAAA,cACvC,KAAA,EAAO,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAAA,cAYlC,SAAA,EAAU,gPAAA;AAAA,cACV,aAAA,EAAa,MAAA,IAAU,CAAA,EAAG,MAAM,CAAA,KAAA,CAAA;AAAA,cAEhC,QAAA,kBAAAA,cAAAA,CAACe,kBAAA,EAAA,EAAO,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA;AAC/B,SAAA,EAEJ;AAAA,OAAA;AAAA,MAED,2BACCf,cAAAA,CAAC,SAAI,SAAA,EAAU,2CAAA,EAA6C,oBAAS,CAAA,GACnE;AAAA,KAAA,EACN;AAAA,GAAA,EACF,CAAA;AAEJ;;;AC7MO,SAAS,wBACd,IAAA,EACgC;AAChC,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,QAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,KAAK,mBAAA,GACR;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,gBAAgB,IAAA,CAAK,mBAAA;AAAA,QACrB,GAAI,KAAK,cAAA,GAAiB,EAAE,WAAW,IAAA,CAAK,cAAA,KAAmB;AAAC,OAClE,GACA,IAAA;AAAA,IACN,KAAK,UAAA;AACH,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,EAAiB,OAAO,IAAA;AAElC,MAAA,OAAO,IAAA,CAAK,SAAS,mBAAA,IAAuB,IAAA,CAAK,UAC7C,EAAE,IAAA,EAAM,YAAY,UAAA,EAAY,IAAA,CAAK,iBAAiB,OAAA,EAAS,IAAA,CAAK,SAAQ,GAC5E,EAAE,MAAM,UAAA,EAAY,UAAA,EAAY,KAAK,eAAA,EAAgB;AAAA,IAC3D,KAAK,UAAA;AACH,MAAA,OAAO,KAAK,eAAA,GACR;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,YAAY,IAAA,CAAK,eAAA;AAAA,QACjB,GAAI,KAAK,mBAAA,GAAsB,EAAE,gBAAgB,IAAA,CAAK,mBAAA,KAAwB;AAAC,OACjF,GACA,IAAA;AAAA,IACN;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAEA,IAAM,SAAS,CAAC,IAAA,EAAiC,aAC/C,IAAA,GAAO,CAAA,MAAA,EAAI,IAAI,CAAA,MAAA,CAAA,GAAM,QAAA;AAGhB,SAAS,0BAA0B,IAAA,EAAqC;AAC7E,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,kBAAA,EAAoB,UAAU,CAAA;AACzD,EAAA,MAAMgB,SAAAA,GAAW,MAAA,CAAO,IAAA,CAAK,aAAA,EAAe,YAAY,CAAA;AACxD,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,gBAAA;AACH,MAAA,OAAO,aAAa,MAAM,CAAA,CAAA;AAAA,IAC5B,KAAK,mBAAA;AACH,MAAA,OAAO,YAAYA,SAAQ,CAAA,CAAA;AAAA,IAC7B,KAAK,kBAAA;AACH,MAAA,OAAO,IAAA,CAAK,UACR,CAAA,cAAA,EAAiB,IAAA,CAAK,OAAO,CAAA,IAAA,EAAOA,SAAQ,CAAA,CAAA,GAC5C,CAAA,uBAAA,EAA0BA,SAAQ,CAAA,CAAA;AAAA,IACxC,KAAK,iBAAA;AACH,MAAA,OAAO,UAAUA,SAAQ,CAAA,CAAA;AAAA,IAC3B,KAAK,cAAA,EAAgB;AACnB,MAAA,MAAM,MAAM,CAAA,IAAA,EAAO,MAAA,CAAO,IAAA,CAAK,aAAA,EAAe,YAAY,CAAC,CAAA,CAAA;AAC3D,MAAA,OAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,GAAA;AAAA,IACtE;AAAA,IACA,SAAS;AACP,MAAA,MAAM,QAAA,GAAWC,sCAAA;AAAA,QACf,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAA0B,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,QAC3DC;AAAA,OACF;AACA,MAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,IAAA,EAAO,MAAM,CAAA,CAAA;AAAA,IACjC;AAAA;AAEJ;ACnFO,IAAM,iCAAA,GAAiE;AAAA,EAC5E,KAAA,EAAO,6CAAA;AAAA,EACP,OAAA,EAAS,wBAAA;AAAA,EACT,KAAA,EAAO,8BAAA;AAAA,EACP,QAAA,EAAU,YAAA;AAAA,EACV,WAAA,EAAa,eAAA;AAAA,EACb,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQC,qBAAc,CAAE;AAC1B;AAuBA,IAAM,KAAA,GAAoD;AAAA,EACxD,wBAAQnB,cAAAA,CAACoB,wBAAS,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC,CAAA;AAAA,EACjD,yBAASpB,cAAAA,CAACqB,6BAAc,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC,CAAA;AAAA,EACvD,0BAAUrB,cAAAA,CAACsB,wBAAS,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC,CAAA;AAAA,EACnD,0BAAUtB,cAAAA,CAACuB,wBAAS,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC;AACrD,CAAA;AAEA,IAAM,YAAY,CAAC,GAAA,KAAgB,IAAI,IAAA,CAAK,GAAG,EAAE,cAAA,EAAe;AAGzD,SAAS,qBAAA,CAAsB;AAAA,EACpC,KAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA,GAAa,SAAA;AAAA,EACb,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,EAA+B;AAC7B,EAAA,MAAM,YAAYC,sBAAA,EAAiB;AACnC,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,iCAAA,EAAmC,QAAQ,SAAA,CAAU,IAAA,EAAM,GAAG,MAAA,EAAO;AACpF,EAAA,IAAI,SAAA;AACF,IAAA,uBACExB,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAWQ,KAAAA,CAAG,mCAAA,EAAqC,SAAS,CAAA,EAAG,aAAA,EAAa,MAAA,EAC5E,QAAA,EAAA,CAAA,CAAE,OAAA,EACL,CAAA;AAEJ,EAAA,IAAI,OAAA,IAAW,MAAM,MAAA,KAAW,CAAA;AAC9B,IAAA,uBACEF,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWE,KAAAA,CAAG,2DAAA,EAA6D,SAAS,CAAA;AAAA,QACpF,aAAA,EAAa,MAAA;AAAA,QAEb,QAAA,EAAA;AAAA,0BAAAR,cAAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAS,YAAE,KAAA,EAAM,CAAA;AAAA,UAC3B,OAAA,oBACCA,cAAAA,CAACyB,SAAA,EAAA,EAAO,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAQ,OAAA,EAAS,OAAA,EACxC,QAAA,EAAA,CAAA,CAAE,KAAA,EACL;AAAA;AAAA;AAAA,KAEJ;AAEJ,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA;AACnB,IAAA,uBACEzB,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAWQ,KAAAA,CAAG,mCAAA,EAAqC,SAAS,CAAA,EAAG,aAAA,EAAa,MAAA,EAC5E,QAAA,EAAA,CAAA,CAAE,KAAA,EACL,CAAA;AAGJ,EAAA,uBACEF,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAWE,MAAG,eAAA,EAAiB,SAAS,CAAA,EAAG,aAAA,EAAa,MAAA,EAC3D,QAAA,EAAA;AAAA,oBAAAR,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wBAAA,EAAyB,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,KAAA,CAAA,EAC1D,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,MAAA,MAAM,MAAA,GAAS,wBAAwB,IAAI,CAAA;AAC3C,MAAA,MAAM,KAAA,GAAQ,KAAK,YAAA,GAAgB,MAAA,GAAS,KAAK,YAAY,CAAA,IAAK,OAAQ,CAAA,CAAE,MAAA;AAC5E,MAAA,MAAM0B,KAAAA,mBACJpB,eAAAA,CAAAqB,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA3B,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAyC,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,EAAE,CAAA;AAAA,wBAC5EM,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,UAAA,KAAA,oBAASA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA;AAAA,YAAA,KAAA;AAAA,YAAM;AAAA,WAAA,EAAC,CAAA;AAAA,0BAChDN,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uBAAA,EAAyB,QAAA,EAAA,yBAAA,CAA0B,IAAI,CAAA,EAAE;AAAA,SAAA,EAC3E,CAAA;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,UAAU,IAAA,CAAK,UAAA;AAAA,YACf,SAAA,EAAU,qDAAA;AAAA,YAET,QAAA,EAAA,UAAA,CAAW,KAAK,UAAU;AAAA;AAAA;AAC7B,OAAA,EACF,CAAA;AAEF,MAAA,uBACEA,cAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,MAAA,EAAS,KAAK,WAAW,CAAA,CAAA;AAAA,UAC/C,aAAW,IAAA,CAAK,IAAA;AAAA,UAEf,QAAA,EAAA,MAAA,IAAU,yBACTA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,sHAAA;AAAA,cACV,OAAA,EAAS,MAAM,MAAA,CAAO,MAAA,EAAQ,IAAI,CAAA;AAAA,cAEjC,QAAA,EAAA0B;AAAA;AAAA,8BAGH1B,cAAAA,CAAC,SAAI,SAAA,EAAU,kCAAA,EAAoC,UAAA0B,KAAAA,EAAK;AAAA,SAAA;AAAA,QAbrD,IAAA,CAAK;AAAA,OAeZ;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,IACC,WAAW,UAAA,oBACV1B,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BACb,QAAA,kBAAAA,cAAAA;AAAA,MAACyB,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAQ,OAAA;AAAA,QACR,QAAA,EAAU,aAAA;AAAA,QACV,OAAA,EAAS,UAAA;AAAA,QACT,aAAA,EAAa,GAAG,MAAM,CAAA,UAAA,CAAA;AAAA,QAErB,QAAA,EAAA,aAAA,GAAgB,CAAA,CAAE,WAAA,GAAc,CAAA,CAAE;AAAA;AAAA,KACrC,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;AC1IA,IAAM,QAAA,GAA0B;AAAA,EAC9B,MAAM,EAAC;AAAA,EACP,OAAO,EAAC;AAAA,EACR,SAAS,EAAC;AAAA,EACV,SAAA,EAAW,CAAA;AAAA,EACX,UAAA,EAAY,CAAA;AAAA,EACZ,YAAA,EAAc;AAChB,CAAA;AAGO,IAAM,QAAA,GAAW,CAAC,GAAA,KAAoC,GAAA,CAAI,KAAA,IAAS;AAGnE,IAAM,YAAY,CAAC,GAAA,EAAkB,WAC1C,GAAA,CAAI,YAAA,GAAe,OAAO,EAAE;AAGvB,IAAM,KAAA,GAAQ,CAAC,GAAA,KAA8B;AAClD,EAAA,MAAM,CAAA,GAAI,SAAS,GAAG,CAAA;AACtB,EAAA,OAAO,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,UAAA,GAAa,EAAE,YAAA,KAAiB,CAAA;AACzD;AAMO,SAAS,aAAa,KAAA,EAA0B;AACrD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU,OAAO,QAAQ,CAAC,KAAK,IAAI,EAAC;AACzD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,CAAC,EAAA,KAAqB,OAAO,EAAA,KAAO,QAAQ,CAAA,GAAI,EAAC;AAC9F;AAGO,SAAS,QAAA,CACd,KAAA,EACA,MAAA,EACA,MAAA,EACQ;AACR,EAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAI,OAAO,EAAA;AAClE,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY,OAAO,QAAQ,KAAA,GAAQ,IAAA;AACvD,EAAA,IAAI,MAAA,CAAO,SAAS,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU,OAAO,MAAA,GAAS,KAAK,CAAA,IAAK,KAAA;AACrF,EAAA,IAAI,OAAO,IAAA,KAAS,KAAA;AAClB,IAAA,OAAO,YAAA,CAAa,KAAK,CAAA,CACtB,GAAA,CAAI,CAAC,EAAA,KAAO,MAAA,GAAS,EAAE,CAAA,IAAK,EAAE,CAAA,CAC9B,IAAA,CAAK,IAAI,CAAA;AACd,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,MAAM,GAAA,CAAI,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC5D,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAGO,SAAS,SAAA,CAAU,MAAc,IAAA,EAAkC;AACxE,EAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,EAAA,IAAI,CAAA,KAAM,IAAI,OAAO,IAAA;AACrB,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA,GAAO,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,CAAA;AACT;AAGO,IAAM,WAAA,GAAc,CAAC,OAAA,KAC1B,OAAA,CAAQ,IAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,IAAI,IAAA,EAAM,CAAA,CAAE,MAAM,IAAA,EAAM,CAAA,CAAE,MAAM,OAAA,EAAS,CAAA,CAAE,OAAA,IAAW,IAAA,EAAK,CAAE;AAE3F,IAAM,UAAA,GAAa,CAAC,IAAA,KAAiB,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAiB5E,SAAS,gBAAA,CAAiB,OAAqB,OAAA,EAA0C;AAC9F,EAAA,MAAM,EAAE,SAAQ,GAAI,KAAA;AACpB,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,QAAQ,UAAA,IAAc,MAAA;AAAA,IACtB,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,IAC5B,QAAQ,QAAA,IAAY;AAAA,GACtB;AACA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,EAAA,EAAK,QAAQ,KAAK,CAAA,CAAA;AAAA,IAClB,EAAA;AAAA,IACA,mBAAmB,IAAI,IAAA,CAAK,QAAQ,EAAA,IAAM,IAAA,CAAK,KAAK,CAAA,CAAE,WAAA,EAAY,CAAE,MAAM,CAAA,EAAG,EAAE,EAAE,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAC,CAAA,KAAA,CAAA;AAAA,IAClG,EAAA;AAAA,IACA,KAAK,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,IACtC,CAAA,EAAA,EAAK,MAAM,GAAA,CAAI,MAAM,KAAK,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA;AAAA,GACzC;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,EAAM;AAC5B,IAAA,MAAM,CAAA,GAAI,SAAS,GAAG,CAAA;AACtB,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,CAAA,EAAG,EAAE,SAAS,CAAA,SAAA,EAAY,EAAE,SAAA,KAAc,CAAA,GAAI,KAAK,GAAG,CAAA,CAAA;AAAA,MACtD,CAAA,EAAG,EAAE,UAAU,CAAA,KAAA,EAAQ,EAAE,UAAA,KAAe,CAAA,GAAI,KAAK,GAAG,CAAA,CAAA;AAAA,MACpD,GAAI,CAAA,CAAE,YAAA,GAAe,CAAC,GAAG,CAAA,CAAE,YAAY,CAAA,OAAA,EAAU,CAAA,CAAE,iBAAiB,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAE,IAAI;AAAC,KACzF,CAAE,KAAK,IAAI,CAAA;AACX,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,GAAA,CAAI,IAAA;AAAA,MACJ,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,CAAC,CAAA,EAAG,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,MACpE;AAAA,KACF;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AAC5B;AC5GO,IAAM,iCAAA,GAA4D;AAAA,EACvE,KAAA,EAAO,SAAA;AAAA,EACP,SAAA,EAAW,YAAA;AAAA,EACX,IAAA,EAAM,aAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,kBAAA,EAAoB,0BAAA;AAAA,EACpB,MAAA,EAAQ,eAAA;AAAA,EACR,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU,WAAA;AAAA,EACV,IAAA,EAAM,cAAA;AAAA,EACN,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,aAAA;AAAA,EACP,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,QAAA;AAAA,IACR,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,QAAA;AAAA,IACR,MAAA,EAAQ,QAAA;AAAA,IACR,GAAA,EAAK;AAAA;AAET;AAGA,IAAM,QAA6B,CAAC,MAAA,EAAQ,UAAU,MAAA,EAAQ,UAAA,EAAY,UAAU,QAAQ,CAAA;AAS5F,IAAM,OAAA,GAAU,CAAC,CAAA,MAA6B;AAAA,EAC5C,IAAI,CAAA,CAAE,EAAA;AAAA,EACN,MAAM,CAAA,CAAE,IAAA;AAAA,EACR,MAAM,CAAA,CAAE,IAAA;AAAA,EACR,UAAU,CAAA,CAAE,OAAA,IAAW,EAAC,EAAG,KAAK,IAAI;AACtC,CAAA,CAAA;AAEA,IAAM,OAAA,GAAU,CAAC,CAAA,MAAkC;AAAA,EACjD,GAAI,EAAE,EAAA,GAAK,EAAE,IAAI,CAAA,CAAE,EAAA,KAAO,EAAC;AAAA,EAC3B,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAA,EAAK;AAAA,EAClB,MAAM,CAAA,CAAE,IAAA;AAAA,EACR,SACE,CAAA,CAAE,IAAA,KAAS,KAAA,GACP,CAAA,CAAE,QACC,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,EACnB,MAAA,CAAO,OAAO,CAAA,GACjB,CAAA,CAAE,SAAS,QAAA,GACT,CAAA,CAAE,OAAA,CACC,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,OAAO,CAAA,GACjB;AACV,CAAA,CAAA;AAYO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,EAA0B;AACxB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,iCAAA,EAAmC,GAAG,MAAA,EAAO;AAC5D,EAAA,MAAM,CAAC,QAAQ,SAAS,CAAA,GAAI5B,eAAkB,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAC,CAAA;AACxE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,MAAA,KACxB,UAAU,CAAC,EAAA,KAAO,GAAG,GAAA,CAAI,CAAC,GAAG,CAAA,KAAO,CAAA,KAAM,IAAI,EAAE,GAAG,GAAG,GAAG,MAAA,EAAO,GAAI,CAAE,CAAC,CAAA;AACzE,EAAA,MAAM,OAAO,CAAC,CAAA,EAAW,EAAA,KACvB,SAAA,CAAU,CAAC,EAAA,KAAO;AAChB,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,EAAE,CAAA;AACnB,IAAA,MAAM,CAAC,CAAC,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5B,IAAA,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAAA,IACnB,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,IAAA,EAAK,KAAM,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA,EAAS,MAAA;AAAA,GACtE;AACA,EAAA,MAAM,KAAA,GACJ,+GAAA;AAEF,EAAA,uBACES,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWE,KAAAA,CAAG,+CAAA,EAAiD,SAAS,CAAA;AAAA,MACxE,QAAA,EAAU,OAAO,CAAA,KAAM;AACrB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,QAClC,CAAA,SAAE;AACA,UAAA,SAAA,CAAU,KAAK,CAAA;AAAA,QACjB;AAAA,MACF,CAAA;AAAA,MACA,aAAA,EAAa,MAAA;AAAA,MAEb,QAAA,EAAA;AAAA,wBAAAR,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAyB,YAAE,KAAA,EAAM,CAAA;AAAA,QAC9C,MAAA,CAAO,WAAW,CAAA,oBAAKA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM,CAAA;AAAA,wBAC9EA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,WAAA,EACX,iBAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACdM,eAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAU,mCAAA;AAAA,YACV,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,QAAA,EAAW,CAAC,CAAA,CAAA;AAAA,YAElC,QAAA,EAAA;AAAA,8BAAAN,cAAAA;AAAA,gBAACa,QAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,UAAA;AAAA,kBACV,OAAO,CAAA,CAAE,IAAA;AAAA,kBACT,aAAa,CAAA,CAAE,IAAA;AAAA,kBACf,cAAY,CAAA,CAAE,IAAA;AAAA,kBACd,QAAA,EAAU,CAAC,CAAA,KAAM,KAAA,CAAM,CAAA,EAAG,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,kBAClD,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,MAAA,EAAS,CAAC,CAAA;AAAA;AAAA,eAClC;AAAA,8BACAb,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAWQ,KAAAA,CAAG,KAAA,EAAO,MAAM,CAAA;AAAA,kBAC3B,OAAO,CAAA,CAAE,IAAA;AAAA,kBAET,QAAA,EAAU,CAAC,CAAC,CAAA,CAAE,EAAA;AAAA,kBACd,cAAY,CAAA,CAAE,IAAA;AAAA,kBACd,QAAA,EAAU,CAAC,CAAA,KAAM,KAAA,CAAM,CAAA,EAAG,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAA,EAA4B,CAAA;AAAA,kBACvE,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,MAAA,EAAS,CAAC,CAAA,CAAA;AAAA,kBAE9B,QAAA,EAAA,CAAA,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA,GAAI,QAAQ,CAAC,CAAA,CAAE,IAAA,EAAM,GAAG,KAAK,CAAA,EAAG,IAAI,CAAC,CAAA,qBAC1DR,cAAAA,CAAC,QAAA,EAAA,EAAe,KAAA,EAAO,CAAA,EACpB,QAAA,EAAA,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,EAAA,EADC,CAEb,CACD;AAAA;AAAA,eACH;AAAA,cACC,CAAA,CAAE,IAAA,KAAS,QAAA,oBACVA,cAAAA;AAAA,gBAACa,QAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,qBAAA;AAAA,kBACV,OAAO,CAAA,CAAE,OAAA;AAAA,kBACT,aAAa,CAAA,CAAE,kBAAA;AAAA,kBACf,cAAY,CAAA,CAAE,OAAA;AAAA,kBACd,QAAA,EAAU,CAAC,CAAA,KAAM,KAAA,CAAM,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,kBACrD,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,SAAA,EAAY,CAAC,CAAA;AAAA;AAAA,eACrC;AAAA,8BAEFP,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,gCAAAN,cAAAA;AAAA,kBAACyB,SAAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBACR,IAAA,EAAK,MAAA;AAAA,oBACL,UAAU,CAAA,KAAM,CAAA;AAAA,oBAChB,cAAY,CAAA,CAAE,MAAA;AAAA,oBACd,OAAA,EAAS,MAAM,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA;AAAA,oBAEzB,QAAA,kBAAAzB,cAAAA,CAAC4B,mBAAA,EAAA,EAAQ,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,iBAC9B;AAAA,gCACA5B,cAAAA;AAAA,kBAACyB,SAAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBACR,IAAA,EAAK,MAAA;AAAA,oBACL,QAAA,EAAU,CAAA,KAAM,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,oBAChC,cAAY,CAAA,CAAE,QAAA;AAAA,oBACd,OAAA,EAAS,MAAM,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AAAA,oBAExB,QAAA,kBAAAzB,cAAAA,CAAC6B,qBAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,iBAChC;AAAA,gCACA7B,cAAAA;AAAA,kBAACyB,SAAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBACR,IAAA,EAAK,MAAA;AAAA,oBACL,cAAY,CAAA,CAAE,MAAA;AAAA,oBACd,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,EAAA,KAAO,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,oBAC7D,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,QAAA,EAAW,CAAC,CAAA,CAAA;AAAA,oBAElC,QAAA,kBAAAzB,cAAAA,CAAC8B,aAAA,EAAA,EAAE,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA;AACxB,eAAA,EACF;AAAA;AAAA,WAAA;AAAA,UApEK,CAAA,CAAE,EAAA,IAAM,CAAA,IAAA,EAAO,CAAC,CAAA;AAAA,SAsExB,CAAA,EACH,CAAA;AAAA,wBACAxB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAAA;AAAA,YAACmB,SAAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAQ,SAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,SAAS,MAAM,SAAA,CAAU,CAAC,EAAA,KAAO,CAAC,GAAG,EAAA,EAAI,EAAE,IAAA,EAAM,IAAI,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,EAAA,EAAI,CAAC,CAAA;AAAA,cACjF,aAAA,EAAa,GAAG,MAAM,CAAA,IAAA,CAAA;AAAA,cAEtB,QAAA,EAAA;AAAA,gCAAAzB,cAAAA,CAAC+B,gBAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,gBAAE,GAAA;AAAA,gBAAE,CAAA,CAAE;AAAA;AAAA;AAAA,WACjC;AAAA,0BACAzB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,4BAAAN,cAAAA,CAACyB,SAAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,OAAA,EAAQ,OAAA,EAAQ,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,QAAA,EACtD,QAAA,EAAA,CAAA,CAAE,MAAA,EACL,CAAA;AAAA,4BACAnB,eAAAA;AAAA,cAACmB,SAAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,IAAA;AAAA,gBACL,QAAA,EAAU,CAAC,KAAA,IAAS,MAAA;AAAA,gBACpB,aAAA,EAAa,GAAG,MAAM,CAAA,KAAA,CAAA;AAAA,gBAErB,QAAA,EAAA;AAAA,kBAAA,MAAA,oBAAUzB,cAAAA,CAACgC,mBAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,kBACnD,MAAA,GAAS,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE;AAAA;AAAA;AAAA;AACzB,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;ACnKO,IAAM,wBAAA,GAA2C;AAAA,EACtD,GAAA,EAAK,MAAA;AAAA,EACL,QAAA,EAAU,cAAA;AAAA,EACV,SAAA,EAAW,mBAAA;AAAA,EACX,KAAA,EAAO,eAAA;AAAA,EACP,OAAA,EAAS,iBAAA;AAAA,EACT,QAAA,EAAU,YAAA;AAAA,EACV,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,UAAA;AAAA,EACR,cAAA,EAAgB,iBAAA;AAAA,EAChB,IAAA,EAAM,eAAA;AAAA,EACN,MAAA,EAAQ,SAAA;AAAA,EACR,iBAAA,EAAmB,qBAAA;AAAA,EACnB,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,uBAAA;AAAA,EACR,QAAA,EAAU,gBAAA;AAAA,EACV,SAAA,EAAW,iBAAA;AAAA,EACX,KAAA,EAAO,cAAA;AAAA,EACP,OAAA,EAAS,eAAA;AAAA,EACT,SAAA,EAAW,mDAAA;AAAA,EACX,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,KAAA;AAAA,EACL,WAAA,EAAa,SAAA;AAAA,EACb,WAAA,EAAa;AACf;AA0DA,IAAM,SAAA,GAAY,4CAAA;AAMX,SAAS,YAAA,CAAa;AAAA,EAC3B,GAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,CAAA;AAAA,EACA;AACF,CAAA,EASG;AACD,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,EAAK,MAAM,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAAA,CACb,MAAA,CAAO,SAAS,KAAA,GAAQ,IAAA,GAAO,MAAA,GAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,EAAE,CAAA,EAAG,KAAA;AACxE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AACrC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAInC,eAAS,KAAK,CAAA;AACxC,EAAA,MAAM,SAAA,GAAYM,aAAO,MAAM,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAWA,aAAO,KAAK,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAEnB,EAAA,MAAM,OAAA,GAAUA,aAAgC,IAAI,CAAA;AAKpD,EAAAL,gBAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,IAAA,MAAM,SAAS,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAI,MAAA,IAAU,QAAA,CAAS,OAAA,KAAY,MAAA,CAAO,IAAA,EAAM;AAChD,IAAA,IAAI,MAAA,SAAe,IAAA,GAAO,MAAA;AAC1B,IAAA,QAAA,CAAS,MAAM,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAAkB;AAC7B,IAAA,MAAM,SAAS,QAAA,GAAW,GAAA,CAAI,WAAA,EAAa,MAAA,CAAO,IAAI,IAAI,CAAA;AAC1D,IAAA,IAAI,MAAA,YAAkB,SAAS,MAAA,CAAO,KAAA,CAAM,MAAM,QAAA,CAAS,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,EAC/E,CAAA;AAEA,EAAA,IAAI,OAAO,IAAA,KAAS,KAAA;AAClB,IAAA,uBACEE,cAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA,EAAU,WAAW,GAAA,GAAM,MAAA;AAAA,QAC3B,CAAA;AAAA,QACA;AAAA;AAAA,KACF;AAEJ,EAAA,IAAI,CAAC,QAAA;AACH,IAAA,uBACEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,OAAO,KAAA,EAAO,aAAA,EAAa,MAAA,EACzD,QAAA,EAAA,KAAA,oBAASA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uBAAA,EAAyB,QAAA,EAAA,CAAA,CAAE,QAAO,CAAA,EAC9D,CAAA;AAEJ,EAAA,MAAM,KAAA,GACJ,oKAAA;AACF,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,UAAA;AACH,MAAA,uBACEA,cAAAA;AAAA,QAACiC,WAAA;AAAA,QAAA;AAAA,UACC,SAAS,KAAA,KAAU,IAAA;AAAA,UACnB,eAAA,EAAiB,CAAC,CAAA,KAAM,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,UACtC,cAAY,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,OAAO,IAAI,CAAA,CAAA;AAAA,UACvC,aAAA,EAAa;AAAA;AAAA,OACf;AAAA,IAEJ,KAAK,QAAA;AAAA,IACL,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,UACJ,MAAA,CAAO,IAAA,KAAS,YACX,MAAA,CAAO,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,OAAO,CAAA,EAAG,KAAA,EAAO,GAAE,CAAE,CAAA,GACzD,UAAU,EAAC;AAClB,MAAA,uBACE3B,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWE,KAAAA,CAAG,KAAA,EAAO,MAAM,CAAA;AAAA,UAC3B,KAAA,EAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAAA,UAC3C,UAAU,CAAC,CAAA,KAAM,IAAI,CAAA,CAAE,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,UAC3C,cAAY,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,OAAO,IAAI,CAAA,CAAA;AAAA,UACvC,aAAA,EAAa,MAAA;AAAA,UAEb,QAAA,EAAA;AAAA,4BAAAR,cAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAI,YAAE,MAAA,EAAO,CAAA;AAAA,YAC1B,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZA,cAAAA,CAAC,QAAA,EAAA,EAAqB,KAAA,EAAO,CAAA,CAAE,KAAA,EAC5B,QAAA,EAAA,CAAA,CAAE,KAAA,EAAA,EADQ,CAAA,CAAE,KAEf,CACD,CAAA;AAAA,YACA,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,IAAS,CAAC,QAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA,oBAC3EA,cAAAA,CAAC,QAAA,EAAA,EAAO,OAAe,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,OAEjC;AAAA,IAEJ;AAAA,IACA,SAAS;AACP,MAAA,MAAM,SAAS,MAAM;AACnB,QAAA,IAAI,UAAU,MAAA,EAAQ,GAAA,CAAI,UAAU,KAAA,EAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,MACzD,CAAA;AACA,MAAA,uBACEA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWQ,KAAAA,CAAG,KAAA,EAAO,MAAM,CAAA;AAAA,UAC3B,IAAA,EAAM,OAAO,IAAA,KAAS,QAAA,GAAW,WAAW,MAAA,CAAO,IAAA,KAAS,SAAS,MAAA,GAAS,MAAA;AAAA,UAC9E,KAAA,EAAO,OAAO,IAAA,KAAS,MAAA,GAAS,MAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,UACrD,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,SAAS,MAAO,OAAA,CAAQ,OAAA,GAAU,EAAE,MAAM,MAAA,EAAO;AAAA,UACjD,QAAQ,MAAM;AACZ,YAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,YAAA,MAAA,EAAO;AAAA,UACT,CAAA;AAAA,UACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,YAAA,IAAI,EAAE,GAAA,KAAQ,OAAA,EAAU,CAAA,CAAE,OAA4B,IAAA,EAAK;AAC3D,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,QAAA,CAAS,MAAM,CAAA;AAAA,UACzC,CAAA;AAAA,UACA,cAAY,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,OAAO,IAAI,CAAA,CAAA;AAAA,UACvC,aAAA,EAAa;AAAA;AAAA,OACf;AAAA,IAEJ;AAAA;AAEJ;AAMA,SAAS,WAAA,CAAY;AAAA,EACnB,GAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,CAAA;AAAA,EACA;AACF,CAAA,EAQG;AACD,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,SAAA,CAAU,GAAA,EAAK,MAAM,CAAC,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,IAAW,EAAC;AACjC,EAAA,MAAM,OAAA,GAAA,CAAW,IAAA,IAAQ,EAAC,EAAG,MAAA;AAAA,IAC3B,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,GAAA,CAAI,WAAA,KAAgB,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA;AAAA,GACpF;AACA,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KAAe,IAAA,EAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,EAAE,CAAA,EAAG,KAAA,IAAS,EAAA;AAC1E,EAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAAA,IAAI,CAAC,EAAA,KACrB,SAAA,mBACER,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,SAAA,CAAU,EAAE,CAAA;AAAA,QAC3B,SAAA,EAAU,qHAAA;AAAA,QACV,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,MAAA,EAAS,EAAE,CAAA,CAAA;AAAA,QAEjC,QAAA,kBAAAA,cAAAA,CAACkC,YAAA,EAAA,EAAU,GAAA,EAAK,EAAE,WAAA,EAAa,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,EAAE,CAAA,EAAE,EAAG,WAAA,EAAa,KAAA,EAAO,MAAI,IAAA,EAAC;AAAA,OAAA;AAAA,MAN1E;AAAA,wBASPlC,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,gCAAA;AAAA,QACV,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,MAAA,EAAS,EAAE,CAAA,CAAA;AAAA,QAEjC,QAAA,kBAAAA,cAAAA,CAACkC,YAAA,EAAA,EAAU,GAAA,EAAK,EAAE,WAAA,EAAa,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,EAAE,CAAA,EAAE,EAAG,WAAA,EAAa,KAAA,EAAO,MAAI,IAAA,EAAC;AAAA,OAAA;AAAA,MAJ1E;AAAA;AAKP,GAEJ;AACA,EAAA,IAAI,CAAC,QAAA;AACH,IAAA,uBACElC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAA+B,eAAa,MAAA,EACzD,QAAA,EAAA,KAAA,CAAM,MAAA,GAAS,KAAA,mBAAQA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uBAAA,EAAyB,QAAA,EAAA,CAAA,CAAE,QAAO,CAAA,EAC5E,CAAA;AAEJ,EAAA,MAAM,OAAA,GAAU,IAAI,CAAC,CAAA;AAGrB,EAAA;AAAA;AAAA,oBAEEM,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA;AAAA,MAAA,OAAA,KACE,4BACCA,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,SAAA,CAAU,OAAO,CAAA;AAAA,UAChC,SAAA,EAAU,uIAAA;AAAA,UACV,YAAA,EAAY,CAAA,KAAA,EAAQ,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA;AAAA,UAClC,KAAA,EAAO,CAAA,KAAA,EAAQ,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA;AAAA,UAC7B,aAAA,EAAa,GAAG,MAAM,CAAA,KAAA,CAAA;AAAA,UAEtB,QAAA,EAAA;AAAA,4BAAAN,cAAAA;AAAA,cAACkC,YAAA;AAAA,cAAA;AAAA,gBACC,KAAK,EAAE,WAAA,EAAa,SAAS,IAAA,EAAM,KAAA,CAAM,OAAO,CAAA,EAAE;AAAA,gBAClD,WAAA,EAAa,KAAA;AAAA,gBACb,IAAA,EAAI;AAAA;AAAA,aACN;AAAA,4BACAlC,cAAAA,CAACmC,wBAAA,EAAA,EAAa,SAAA,EAAU,2DAAA,EAA4D;AAAA;AAAA;AAAA,0BAGtFnC,cAAAA;AAAA,QAACkC,YAAA;AAAA,QAAA;AAAA,UACC,KAAK,EAAE,WAAA,EAAa,SAAS,IAAA,EAAM,KAAA,CAAM,OAAO,CAAA,EAAE;AAAA,UAClD,WAAA,EAAa,KAAA;AAAA,UACb,IAAA,EAAI;AAAA;AAAA,OACN,CAAA;AAAA,sBAEJ5B,eAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWE,KAAAA;AAAA,YACT,8JAAA;AAAA,YACA,UAAU,oBAAA,GAAuB;AAAA,WACnC;AAAA,UACA,KAAA,EAAO,UAAU,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,GAAK,MAAA;AAAA,UAEtD,QAAA,EAAA;AAAA,YAAA,CAAC,2BAAWR,cAAAA,CAAC,UAAK,SAAA,EAAU,UAAA,EAAY,YAAE,MAAA,EAAO,CAAA;AAAA,4BAClDA,cAAAA,CAACoC,uBAAA,EAAA,EAAY,SAAA,EAAU,mBAAA,EAAoB,CAAA;AAAA,4BAC3C9B,eAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,yDAAA;AAAA,gBACV,OAAO,OAAA,IAAW,EAAA;AAAA,gBAClB,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,GAAI,IAAI,CAAA;AAAA,gBAClE,cAAY,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,OAAO,IAAI,CAAA,CAAA;AAAA,gBACvC,aAAA,EAAa,MAAA;AAAA,gBAEb,QAAA,EAAA;AAAA,kCAAAN,cAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAI,YAAE,MAAA,EAAO,CAAA;AAAA,kBAC1B,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZA,cAAAA,CAAC,QAAA,EAAA,EAAqB,KAAA,EAAO,CAAA,CAAE,KAAA,EAC5B,QAAA,EAAA,CAAA,CAAE,KAAA,EAAA,EADQ,CAAA,CAAE,KAEf,CACD,CAAA;AAAA,kBACA,WAAW,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,OAAO,CAAA,oBAClDA,cAAAA,CAAC,QAAA,EAAA,EAAO,OAAO,OAAA,EAAU,QAAA,EAAA,KAAA,CAAM,OAAO,CAAA,EAAE;AAAA;AAAA;AAAA;AAE5C;AAAA;AAAA;AACF,KAAA,EACF;AAAA;AAEJ;AAGA,IAAM,SAAA,GAAY,CAACqC,MAAAA,EAAe,GAAA,EAAa,SAC7CA,MAAAA,KAAU,CAAA,GAAI,GAAA,GAAMA,MAAAA,GAAQ,KAAK,OAAA,CAAQ,SAAA,EAAW,MAAA,CAAOA,MAAK,CAAC,CAAA,GAAI,IAAA;AAGhE,SAAS,gBAAA,CAAiB;AAAA,EAC/B,GAAA;AAAA,EACA,CAAA;AAAA,EACA,iBAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG,OAAO,IAAA;AACvB,EAAA,MAAM,KAAA,GAAQ,SAAS,GAAG,CAAA;AAC1B,EAAA,MAAM,MAAA,GAAS;AAAA,IACb;AAAA,MACE,IAAA,EAAM,WAAA;AAAA,MACN,OAAO,KAAA,CAAM,SAAA;AAAA,MACb,OAAO,SAAA,CAAU,KAAA,CAAM,WAAW,CAAA,CAAE,QAAA,EAAU,EAAE,SAAS,CAAA;AAAA,MACzD,IAAA,EAAMf;AAAA,KACR;AAAA,IACA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,OAAO,KAAA,CAAM,UAAA;AAAA,MACb,OAAO,SAAA,CAAU,KAAA,CAAM,YAAY,CAAA,CAAE,IAAA,EAAM,EAAE,KAAK,CAAA;AAAA,MAClD,IAAA,EAAMgB;AAAA,KACR;AAAA,IACA;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,OAAO,KAAA,CAAM,YAAA;AAAA,MACb,OAAO,SAAA,CAAU,KAAA,CAAM,cAAc,CAAA,CAAE,MAAA,EAAQ,EAAE,OAAO,CAAA;AAAA,MACxD,IAAA,EAAMC;AAAA;AACR,IACA,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,QAAQ,CAAC,CAAA;AACnC,EAAA,uBACEvC,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAA8C,aAAA,EAAa,MAAA,EACvE,iBAAO,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,KAAA,EAAO,MAAK,EAAG,KAAA,qBAClCM,eAAAA,CAAC,MAAA,EAAA,EAAgB,WAAU,gCAAA,EACxB,QAAA,EAAA;AAAA,IAAA,KAAA,GAAQ,CAAA,oBACPN,cAAAA,CAAC,MAAA,EAAA,EAAK,eAAW,IAAA,EAAC,SAAA,EAAU,yBACzB,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,IAED,iBAAA,IAAqB,4BACpBM,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,6IAAA;AAAA,QACV,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,QAC9B,KAAA,EAAO,CAAA,KAAA,EAAQ,KAAK,CAAA,cAAA,EAAY,IAAI,IAAI,CAAA,MAAA,CAAA;AAAA,QACxC,OAAA,EAAS,MACP,iBAAA,GACI,iBAAA,CAAkB,GAAA,CAAI,aAAa,IAAI,CAAA,GACvC,SAAA,GAAY,GAAA,CAAI,WAAW,CAAA;AAAA,QAGjC,QAAA,EAAA;AAAA,0BAAAN,cAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,UAC1B;AAAA;AAAA;AAAA,KACH,mBAEAM,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,8DAAA,EACd,QAAA,EAAA;AAAA,sBAAAN,cAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,MAC1B;AAAA,KAAA,EACH;AAAA,GAAA,EAAA,EAzBO,IA2BX,CACD,CAAA,EACH,CAAA;AAEJ;AAeA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,IAAA,EAAM,GAAA;AAAA,EACN,SAAA;AAAA,EACA;AACF,CAAA,EAAwD;AACtD,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,OAAO,4BACLA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAWQ,KAAAA,CAAG,SAAA,EAAW,0DAA0D,CAAA;AAAA,MACnF,OAAO,GAAA,CAAI,IAAA;AAAA,MACX,OAAA,EAAS,MAAM,SAAA,CAAU,GAAA,CAAI,WAAW,CAAA;AAAA,MACxC,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,KAAA,EAAQ,IAAI,WAAW,CAAA,MAAA,CAAA;AAAA,MAE7C,QAAA,kBAAAR,eAACkC,YAAA,EAAA,EAAU,GAAA,EAAK,KAAK,WAAA,EAAa,KAAA,EAAO,MAAI,IAAA,EAAC;AAAA;AAAA,sBAGhDlC,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWQ,KAAAA,CAAG,SAAA,EAAW,aAAa,CAAA;AAAA,MACtC,OAAO,GAAA,CAAI,IAAA;AAAA,MACX,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,KAAA,EAAQ,IAAI,WAAW,CAAA,MAAA,CAAA;AAAA,MAE7C,QAAA,kBAAAR,eAACkC,YAAA,EAAA,EAAU,GAAA,EAAK,KAAK,WAAA,EAAa,KAAA,EAAO,MAAI,IAAA,EAAC;AAAA;AAAA,GAChD;AAEJ;AASA,SAAS,mBAAA,CAAoB;AAAA,EAC3B,IAAA,EAAM,GAAA;AAAA,EACN,CAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAAyD;AACvD,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,uBACElC,cAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,CAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,UAAA,EAAa,IAAI,WAAW,CAAA;AAAA;AAAA,GAC/C;AAEJ;AAaA,SAAS,gBAAA,CAAiB;AAAA,EACxB,IAAA,EAAM,GAAA;AAAA,EACN,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,CAAA;AAAA,EACA;AACF,CAAA,EAAsD;AACpD,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,uBACEA,cAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA,EAAU,aAAA;AAAA,MACV,CAAA;AAAA,MACA,MAAA,EAAQ,GAAG,MAAM,CAAA,MAAA,EAAS,IAAI,WAAW,CAAA,CAAA,EAAI,MAAM,EAAE,CAAA;AAAA;AAAA,GACvD;AAEJ;AAEO,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,EAAkB;AAChB,EAAA,MAAM,CAAA,GAAID,aAAAA,CAAQ,OAAO,EAAE,GAAG,wBAAA,EAA0B,GAAG,MAAA,EAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AAC9E,EAAA,MAAM,OAAA,GAAUA,cAAQ,MAAM,KAAA,EAAO,WAAW,EAAC,EAAG,CAAC,KAAK,CAAC,CAAA;AAC3D,EAAA,MAAM,IAAA,GAAO,KAAA,EAAO,IAAA,IAAQ,EAAC;AAC7B,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIF,eAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,MAAM,YAAY;AACtB,IAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,QAAA,EAAU;AACrB,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,CAAC,CAAA;AAChB,MAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,IACZ,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAA,GAAaE,aAAAA;AAAA,IACjB,MAAM;AAAA,MACJ;AAAA,QACE,KAAA,EAAO,MAAA;AAAA,QACP,YAAY,CAAA,CAAE,GAAA;AAAA,QACd,KAAA,EAAO,MAAA;AAAA,QACP,KAAA,EAAO,GAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,MAAA,EAAQ,MAAA;AAAA,QACR,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,KAAA;AAAA,QACR,UAAA,EAAY,IAAA;AAAA,QACZ,SAAA,EAAW,6BAAA;AAAA,QACX,YAAA,EAAc,kBAAA;AAAA,QACd,kBAAA,EAAoB,EAAE,SAAA,EAAW,MAAA;AAAO,OAC1C;AAAA,MACA;AAAA,QACE,KAAA,EAAO,UAAA;AAAA,QACP,YAAY,CAAA,CAAE,QAAA;AAAA,QACd,KAAA,EAAO,GAAA;AAAA,QACP,QAAA,EAAU,GAAA;AAAA,QACV,IAAA,EAAM,CAAA;AAAA,QACN,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,KAAA;AAAA,QACR,UAAA,EAAY,IAAA;AAAA,QACZ,SAAA,EAAW,6BAAA;AAAA,QACX,WAAA,EAAa,CAAC,EAAE,IAAA,EAAK,KAAM;AACzB,UAAA,IAAI,CAAC,MAAM,OAAO,CAAA;AAClB,UAAA,MAAM,KAAA,GAAQ,SAAS,IAAI,CAAA;AAC3B,UAAA,OAAO,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,YAAA;AAAA,QACpD,CAAA;AAAA,QACA,YAAA,EAAc,mBAAA;AAAA,QACd,kBAAA,EAAoB,EAAE,CAAA,EAAG,SAAA,EAAW,mBAAmB,MAAA;AAAO,OAChE;AAAA,MACA,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAiC;AAAA,QAC/C,OAAO,MAAA,CAAO,EAAA;AAAA,QACd,YAAY,MAAA,CAAO,IAAA;AAAA,QACnB,IAAA,EAAM,CAAA;AAAA,QACN,QAAA,EAAU,GAAA;AAAA,QACV,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,KAAA;AAAA;AAAA,QAER,uBAAuB,CAAC,EAAE,OAAM,KAC9B,KAAA,CAAM,kBAAkB,WAAA,IACxB,OAAA;AAAA,UACE,MAAM,MAAA,CAAO,OAAA;AAAA,YACX;AAAA;AACF,SACF;AAAA,QACF,SAAA,EAAW,+BAAA;AAAA,QACX,WAAA,EAAa,CAAC,EAAE,IAAA,EAAK,KAAM;AACzB,UAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,UAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,EAAM,MAAM,CAAA;AACpC,UAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,EAAI,OAAO,IAAA;AAC1C,UAAA,IAAI,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU,OAAO,OAAO,KAAK,CAAA;AACjD,UAAA,IAAI,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY,OAAO,QAAQ,CAAA,GAAI,CAAA;AACnD,UAAA,OAAO,QAAA;AAAA,YACL,KAAA;AAAA,YACA,MAAA;AAAA,YACA,CAAC,EAAA,KACC,MAAA,EAAQ,KAAK,CAAC,CAAA,KAAM,EAAE,KAAA,KAAU,EAAE,CAAA,EAAG,KAAA,IAAS,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,EAAE,CAAA,EAAG;AAAA,WACrF;AAAA,QACF,CAAA;AAAA,QACA,YAAA,EAAc,gBAAA;AAAA,QACd,kBAAA,EAAoB;AAAA,UAClB,KAAA,EAAO,MAAA;AAAA,UACP,MAAA;AAAA,UACA,IAAA;AAAA,UACA,SAAA;AAAA,UACA,aAAA;AAAA,UACA,CAAA;AAAA,UACA;AAAA;AACF,OACF,CAAE;AAAA,KACJ;AAAA,IACA,CAAC,SAAS,CAAA,EAAG,MAAA,EAAQ,MAAM,SAAA,EAAW,iBAAA,EAAmB,SAAA,EAAW,aAAA,EAAe,MAAM;AAAA,GAC3F;AAEA,EAAA,uBACEO,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAWE,MAAG,WAAA,EAAa,SAAS,CAAA,EAAG,aAAA,EAAa,MAAA,EACvD,QAAA,EAAA;AAAA,oBAAAR,cAAAA,CAAC,SAAI,SAAA,EAAU,mCAAA,EACb,0BAAAM,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2CAAA,EACZ,QAAA,EAAA;AAAA,MAAA,OAAA;AAAA,MAAA,CACC,oBAAoB,eAAA,IAAmB,UAAA,IAAc,QAAA,qBACrDA,gBAACkC,UAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAxC,cAAAA,CAACyC,iBAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAzC,cAAAA;AAAA,UAACyB,SAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,cAAY,CAAA,CAAE,WAAA;AAAA,YACd,aAAA,EAAa,GAAG,MAAM,CAAA,KAAA,CAAA;AAAA,YAEtB,QAAA,kBAAAzB,cAAAA,CAAC0C,0BAAA,EAAA,EAAe,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,SACrC,EACF,CAAA;AAAA,wBACApC,eAAAA;AAAA,UAACqC,iBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,KAAA;AAAA,YACN,SAAA,EAAU,uDAAA;AAAA,YAET,QAAA,EAAA;AAAA,cAAA,gBAAA;AAAA,cACA,mCACCrC,eAAAA;AAAA,gBAACmB,SAAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAQ,OAAA;AAAA,kBACR,IAAA,EAAK,IAAA;AAAA,kBACL,SAAA,EAAU,eAAA;AAAA,kBACV,SAAS,MAAM,iBAAA,CAAkB,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,kBAC1C,aAAA,EAAa,GAAG,MAAM,CAAA,aAAA,CAAA;AAAA,kBAEtB,QAAA,EAAA;AAAA,oCAAAzB,cAAAA,CAAC4C,6BAAA,EAAA,EAAkB,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBAAE,GAAA;AAAA,oBAAE,CAAA,CAAE;AAAA;AAAA;AAAA,eAC9C;AAAA,cAED,4BACCtC,eAAAA;AAAA,gBAACmB,SAAAA;AAAA,gBAAA;AAAA,kBACC,QAAA,EAAU,SAAA,IAAa,IAAA,CAAK,MAAA,KAAW,CAAA;AAAA,kBACvC,OAAA,EAAQ,OAAA;AAAA,kBACR,IAAA,EAAK,IAAA;AAAA,kBACL,SAAA,EAAU,eAAA;AAAA,kBACV,SAAS,MAAM;AACb,oBAAA,YAAA,CAAa,IAAI,CAAA;AACjB,oBAAA,KAAK,OAAA,CAAQ,OAAA,EAAQ,CAClB,IAAA,CAAK,MAAM,QAAA,EAAU,CAAA,CACrB,OAAA,CAAQ,MAAM,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,kBACtC,CAAA;AAAA,kBACA,aAAA,EAAa,GAAG,MAAM,CAAA,OAAA,CAAA;AAAA,kBAErB,QAAA,EAAA;AAAA,oBAAA,SAAA,mBACCzB,cAAAA,CAACgC,mBAAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,CAAA,mBAEzChC,cAAAA,CAAC6C,oBAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBAE9B,SAAA,GAAY,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE;AAAA;AAAA;AAAA,eAC/B;AAAA,cAED,8BACCvC,eAAAA;AAAA,gBAACmB,SAAAA;AAAA,gBAAA;AAAA,kBACC,QAAA,EAAU,KAAK,MAAA,KAAW,CAAA;AAAA,kBAC1B,OAAA,EAAQ,OAAA;AAAA,kBACR,IAAA,EAAK,IAAA;AAAA,kBACL,SAAA,EAAU,eAAA;AAAA,kBACV,OAAA,EAAS,MAAM,KAAK,UAAA,EAAW;AAAA,kBAC/B,aAAA,EAAa,GAAG,MAAM,CAAA,SAAA,CAAA;AAAA,kBAEtB,QAAA,EAAA;AAAA,oCAAAzB,cAAAA,CAAC8C,oBAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBAAE,GAAA;AAAA,oBAAE,CAAA,CAAE;AAAA;AAAA;AAAA;AACrC;AAAA;AAAA;AAEJ,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA,EACF,CAAA;AAAA,IAEC,cAAA,IAAkB,mCACjB9C,cAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,QAAQ,CAAA,CAAE,OAAA;AAAA,QACV,QAAA,EAAU,MAAM,iBAAA,CAAkB,KAAK,CAAA;AAAA,QACvC,MAAA,EAAQ,OAAO,MAAA,KAAW;AACxB,UAAA,MAAM,gBAAgB,MAAM,CAAA;AAC5B,UAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,QACzB,CAAA;AAAA,QACA,MAAA,EAAQ,GAAG,MAAM,CAAA,QAAA;AAAA;AAAA,KACnB;AAAA,IAGD,4BACCM,eAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,kCAAA;AAAA,QACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,KAAK,GAAA,EAAI;AAAA,QACX,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAN,cAAAA;AAAA,YAACa,QAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,IAAA;AAAA,cACP,aAAa,CAAA,CAAE,iBAAA;AAAA,cACf,cAAY,CAAA,CAAE,MAAA;AAAA,cACd,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACvC,aAAA,EAAa,GAAG,MAAM,CAAA,SAAA;AAAA;AAAA,WACxB;AAAA,0BACAP,eAAAA;AAAA,YAACmB,SAAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAQ,SAAA;AAAA,cACR,QAAA,EAAU,CAAC,IAAA,CAAK,IAAA,EAAK,IAAK,MAAA;AAAA,cAC1B,aAAA,EAAa,GAAG,MAAM,CAAA,IAAA,CAAA;AAAA,cAEtB,QAAA,EAAA;AAAA,gCAAAzB,cAAAA,CAAC+B,gBAAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,gBAAE,GAAA;AAAA,gBAAE,CAAA,CAAE;AAAA;AAAA;AAAA;AACjC;AAAA;AAAA,KACF;AAAA,IAGD,SAAA,mBACCzB,eAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,uDAAA,EACX,QAAA,EAAA;AAAA,sBAAAN,cAAAA,CAACgC,mBAAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,MAAE,GAAA;AAAA,MAAE,CAAA,CAAE;AAAA,KAAA,EACjD,CAAA,mBAEA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iDAAA,EACb,QAAA,EAAA;AAAA,sBAAAN,cAAAA;AAAA,QAAC+C,0BAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,IAAA;AAAA,UACP,UAAA;AAAA,UACA,SAAA,EAAW,CAAC,GAAA,KAAQ,GAAA,CAAI,WAAA;AAAA,UACxB,MAAA,EAAO,MAAA;AAAA,UACP,UAAA,EAAY,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM;AAAA,UAC7B,WAAA,EAAa;AAAA,YACX,cAAA,EAAgB,IAAA;AAAA,YAChB,SAAA,EAAW;AAAA,WACb;AAAA,UACA,cAAc,CAAC,GAAA,KAAQ,GAAG,MAAM,CAAA,KAAA,EAAQ,IAAI,WAAW,CAAA,CAAA;AAAA,UACvD,MAAA,EAAQ,GAAG,MAAM,CAAA,MAAA;AAAA;AAAA,OACnB;AAAA,MACC,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,CAAA,oBACrC/C,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gEAAA,EACV,QAAA,EAAA,CAAA,CAAE,SAAA,EACL;AAAA,KAAA,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACpyBO,IAAM,yBAAA,GAA6C;AAAA,EACxD,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,WAAA;AAAA,EACX,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,4BAAA;AAAA,EACT,WAAA,EAAa,mCAAA;AAAA,EACb,OAAA,EAAS,+BAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,iCAAA;AAAA,EACX,cAAA,EAAgB,iBAAA;AAAA,EAChB,aAAA,EAAe,gBAAA;AAAA,EACf,QAAA,EAAU,kBAAA;AAAA,EACV,OAAA,EAAS,WAAA;AAAA,EACT,OAAA,EAAS;AACX;AA4CA,IAAM,SAAA,GAAY,CAAC,GAAA,KAAgB;AACjC,EAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,GAAG,CAAA;AACvB,EAAA,OAAO,OAAO,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,IAC5B,GAAA,GACA,EAAA,CAAG,kBAAA,CAAmB,MAAA,EAAW,EAAE,GAAA,EAAK,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,CAAA;AAC1F,CAAA;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,GAAA;AAAA,EACA,SAAS,EAAC;AAAA,EACV,SAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,cAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,yBAAA,EAA2B,GAAG,MAAA,EAAO;AACpD,EAAA,MAAM,UAAA,GAAa,EAAE,GAAG,wBAAA,EAA0B,GAAG,WAAA,EAAY;AACjE,EAAA,IAAI,SAAA,IAAa,CAAC,GAAA,EAAK,uBAAOA,cAAAA,CAACgD,+BAAA,EAAA,EAAc,KAAA,EAAO,CAAA,CAAE,OAAA,EAAS,CAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,SAAS,GAAG,CAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,IAAQ,EAAC;AAC5B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,IAAS,EAAC;AAC9B,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,EAAC;AAClC,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAe,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAW,MAAA,CAAO,CAAC,CAAC,CAAA;AAE9F,EAAA,uBACE1C,eAAAA,CAAC2C,4BAAA,EAAA,EAAW,SAAA,EAAsB,MAAA,EAC/B,QAAA,EAAA;AAAA,IAAA,iBAAA,mBACCjD,cAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,CAAA,EAAG,UAAA;AAAA,QACH,iBAAA;AAAA,QACA,MAAA,EAAQ,GAAG,MAAM,CAAA,OAAA;AAAA;AAAA,KACnB,mBAEAM,eAAAA,CAAAqB,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA3B,cAAAA;AAAA,QAACkD,+BAAA;AAAA,QAAA;AAAA,UACC,OAAO,CAAA,CAAE,SAAA;AAAA,UACT,OAAO,KAAA,CAAM,SAAA;AAAA,UACb,OAAO,IAAA,CAAK,MAAA;AAAA,UACZ,cAAc,CAAA,CAAE,OAAA;AAAA,UAChB,MAAA,EAAQ,GAAG,MAAM,CAAA,UAAA,CAAA;AAAA,UAEhB,QAAA,EAAA,IAAA,CAAK,yBACJlD,cAAAA,CAACmD,oCACE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,qBACTnD,cAAAA;AAAA,YAACoD,gCAAA;AAAA,YAAA;AAAA,cAEC,sBAAMpD,cAAAA,CAACsB,oBAAAA,EAAA,EAAS,WAAU,QAAA,EAAS,CAAA;AAAA,cACnC,SAAS,cAAA,GAAiB,MAAM,cAAA,CAAe,CAAA,CAAE,UAAU,CAAA,GAAI,MAAA;AAAA,cAC/D,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,KAAA,EAAQ,EAAE,UAAU,CAAA,CAAA;AAAA,cACrC,QAAA,EACE,CAAA,CAAE,eAAA,GAAkB,CAAA,IACpB,CAAC,cAAA,oBACCtB,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA,QAAA,CAAS,CAAA,CAAE,eAAe,CAAA,EAC7B,CAAA;AAAA,cAGJ,OACE,CAAA,CAAE,eAAA,GAAkB,CAAA,IACpB,cAAA,oBACEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EACb,yBAAe,CAAA,EAAG,QAAA,CAAS,CAAA,CAAE,eAAe,CAAC,CAAA,EAChD,CAAA;AAAA,cAIJ,QAAA,kBAAAM,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,gCAAAN,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,YAAE,SAAA,EAAU,CAAA;AAAA,gBAAA,CACxD,CAAA,CAAE,IAAA,IAAQ,WAAA,qBACVM,eAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAWE,KAAAA;AAAA,sBACT,0CAAA;AAAA,sBACA,cAAc,2BAAA,GAA8B;AAAA,qBAC9C;AAAA,oBACA,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,KAAA,EAAQ,EAAE,UAAU,CAAA,KAAA,CAAA;AAAA,oBAEzC,QAAA,EAAA;AAAA,sBAAA,SAAA,oBACCR,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8EACb,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,sCAEFA,cAAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,SAAA,EAAWQ,KAAAA;AAAA,4BACT,0CAAA;AAAA,4BACA,WAAA,IAAe,eAAA;AAAA,4BACf,CAAC,EAAE,IAAA,IAAQ;AAAA,2BACb;AAAA,0BAEC,QAAA,EAAA,CAAA,CAAE,QAAQ,CAAA,CAAE;AAAA;AAAA;AACf;AAAA;AAAA;AACF,eAAA,EAEJ;AAAA,aAAA;AAAA,YA/CK,CAAA,CAAE;AAAA,WAiDV,CAAA,EACH,CAAA,mBAEAR,cAAAA,CAACqD,6BAAA,EAAA,EAAa,YAAE,WAAA,EAAY;AAAA;AAAA,OAEhC;AAAA,sBAEArD,cAAAA;AAAA,QAACkD,+BAAA;AAAA,QAAA;AAAA,UACC,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,OAAO,KAAA,CAAM,UAAA;AAAA,UACb,OAAO,KAAA,CAAM,MAAA;AAAA,UACb,cAAc,CAAA,CAAE,OAAA;AAAA,UAChB,MAAA,EAAQ,GAAG,MAAM,CAAA,MAAA,CAAA;AAAA,UAEhB,QAAA,EAAA,KAAA,CAAM,yBACLlD,cAAAA,CAACmD,oCACE,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACVnD,cAAAA;AAAA,YAACoD,gCAAA;AAAA,YAAA;AAAA,cAEC,sBAAMpD,cAAAA,CAACsC,qBAAAA,EAAA,EAAU,WAAU,QAAA,EAAS,CAAA;AAAA,cACpC,SAAS,UAAA,GAAa,MAAM,UAAA,CAAW,CAAA,CAAE,WAAW,CAAA,GAAI,MAAA;AAAA,cACxD,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,MAAA,EAAS,EAAE,WAAW,CAAA,CAAA;AAAA,cAEvC,0BAAAtC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA+B,YAAE,IAAA,EAAK;AAAA,aAAA;AAAA,YALjD,CAAA,CAAE;AAAA,WAOV,CAAA,EACH,CAAA,mBAEAA,cAAAA,CAACqD,6BAAA,EAAA,EAAa,YAAE,OAAA,EAAQ;AAAA;AAAA,OAE5B;AAAA,sBAEArD,cAAAA;AAAA,QAACkD,+BAAA;AAAA,QAAA;AAAA,UACC,OAAO,CAAA,CAAE,OAAA;AAAA,UACT,OAAO,KAAA,CAAM,YAAA;AAAA,UACb,OAAO,OAAA,CAAQ,MAAA;AAAA,UACf,cAAc,CAAA,CAAE,OAAA;AAAA,UAChB,MAAA,EAAQ,GAAG,MAAM,CAAA,QAAA,CAAA;AAAA,UAEhB,QAAA,EAAA,OAAA,CAAQ,yBACPlD,cAAAA,CAACmD,oCACE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZnD,cAAAA;AAAA,YAACoD,gCAAA;AAAA,YAAA;AAAA,cAEC,sBAAMpD,cAAAA,CAACuC,0BAAAA,EAAA,EAAe,WAAU,QAAA,EAAS,CAAA;AAAA,cACzC,SAAS,YAAA,GAAe,MAAM,YAAA,CAAa,CAAA,CAAE,mBAAmB,CAAA,GAAI,MAAA;AAAA,cACpE,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,QAAA,EAAW,EAAE,mBAAmB,CAAA,CAAA;AAAA,cACjD,QAAA,kBACEvC,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wCAAA,EACb,QAAA,EAAA,CAAA,CAAE,aAAA,CAAc,OAAA,CAAQ,QAAA,EAAU,SAAA,CAAU,CAAA,CAAE,UAAU,CAAC,CAAA,EAC5D,CAAA;AAAA,cAGF,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCACb,QAAA,EAAA,CAAA,CAAE,KAAA,IAAS,EAAE,cAAA,EAChB;AAAA,aAAA;AAAA,YAZK,CAAA,CAAE;AAAA,WAcV,CAAA,EACH,CAAA,mBAEAA,cAAAA,CAACqD,6BAAA,EAAA,EAAa,YAAE,SAAA,EAAU;AAAA;AAAA;AAE9B,KAAA,EACF,CAAA;AAAA,IAED,MAAA,CAAO,MAAA,GAAS,CAAA,oBACfrD,cAAAA,CAACkD,+BAAA,EAAA,EAAc,KAAA,EAAO,CAAA,CAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,OAAA,CAAA,EAC/C,0BAAAlD,cAAAA,CAACsD,8BAAA,EAAA,EACE,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACXtD,cAAAA,CAACuD,6BAAA,EAAA,EAA2B,KAAA,EAAO,KAAA,CAAM,IAAA,EACvC,QAAA,kBAAAvD,cAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,MAAA,EAAQ,KAAA;AAAA,QACR,MAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA,EAAU,aAAA;AAAA,QACV,CAAA,EAAG,UAAA;AAAA,QACH,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,OAAA,EAAU,MAAM,EAAE,CAAA;AAAA;AAAA,KACrC,EAAA,EAVgB,KAAA,CAAM,EAWxB,CACD,GACH,CAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;AClRO,IAAM,8BAAA,GAAiC;AAyBvC,IAAM,6BAAA,GAAoD;AAAA,EAC/D,GAAA,EAAK,MAAA;AAAA,EACL,QAAA,EAAU,UAAA;AAAA,EACV,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,qBAAA;AAAA,EACT,UAAA,EAAY,aAAA;AAAA,EACZ,OAAA,EAAS,mBAAA;AAAA,EACT,IAAA,EAAM,eAAA;AAAA,EACN,QAAA,EAAU,YAAA;AAAA,EACV,SAAA,EAAW,mBAAA;AAAA,EACX,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,eAAA;AAAA,EACP,MAAA,EAAQ,UAAA;AAAA,EACR,OAAA,EAAS,iBAAA;AAAA,EACT,cAAA,EAAgB,iBAAA;AAAA,EAChB,KAAA,EAAO;AACT;AAUA,IAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,GAAA,EAAa,IAAA,KACrC,CAAA,KAAM,CAAA,GAAI,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,MAAA,CAAO,CAAC,CAAC,CAAA;AAEnD,SAAS,kBAAA,CAAmB,KAAkB,CAAA,EAAiC;AAC7E,EAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG,OAAO,EAAC;AACxB,EAAA,MAAM,KAAA,GAAQ,SAAS,GAAG,CAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,IAAQ,EAAC;AAC5B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,IAAS,EAAC;AAC9B,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,EAAC;AAClC,EAAA,MAAM,IAAA,GACJ,KAAA,CAAM,SAAA,GACN,IAAA,CAAK,MAAA,IACJ,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAA,IACzB,KAAA,CAAM,YAAA,GAAe,OAAA,CAAQ,MAAA,CAAA;AAChC,EAAA,OAAO;AAAA,IACLwD,2BAAA;AAAA,MACE;AAAA,QACE;AAAA,UACE,IAAA,EAAM;AAAA,YACJ,KAAA,CAAM,YAAY,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,SAAS,CAAA,GAAI,IAAA;AAAA,YACpE,KAAA,CAAM,aAAa,KAAA,CAAM,KAAA,CAAM,YAAY,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,KAAK,CAAA,GAAI,IAAA;AAAA,YAC9D,KAAA,CAAM,eAAe,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAO,CAAA,GAAI;AAAA,WACxE,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,QAAK,CAAA;AAAA,UACb,KAAA,EAAO;AAAA;AACT,OACF;AAAA,MACA;AAAA,KACF;AAAA,IACA,GAAG,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,CAAA,KACXA,2BAAA;AAAA,QACE,CAAC,EAAE,IAAA,EAAM,CAAA,CAAE,WAAW,IAAA,EAAM,IAAA,IAAQ,GAAI,CAAA,CAAE,OAAO,CAAC,EAAE,MAAM,CAAA,QAAA,EAAM,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,GAAI,EAAG,CAAA;AAAA,QACjF;AAAA;AACF,KACF;AAAA,IACA,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAMA,2BAAA,CAAU,CAAC,EAAE,IAAA,EAAM,CAAA,MAAA,EAAI,CAAA,CAAE,IAAI,CAAA,MAAA,CAAA,EAAK,MAAA,EAAQ,MAAM,CAAA,EAAG,cAAc,CAAC,CAAA;AAAA,IACtF,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAMA,4BAAU,CAAC,EAAE,IAAA,EAAM,CAAA,CAAE,SAAS,CAAA,CAAE,cAAA,EAAgB,CAAA,EAAG,cAAc,CAAC,CAAA;AAAA,IACxF,GAAI,OAAO,CAAA,GACP;AAAA,MACEA,2BAAA;AAAA,QACE,CAAC,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,MAAA,CAAO,IAAI,CAAC,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AAAA,QAC/D;AAAA;AACF,QAEF;AAAC,GACP;AACF;AAEA,SAAS,aAAA,CACP,GAAA,EACA,OAAA,EACA,CAAA,EACU;AACV,EAAA,MAAM,OAAA,GAAU,QACb,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,cAAc,QAAA,CAAS,SAAA,CAAU,KAAK,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,EAAE,EAC5E,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA;AACpB,EAAA,OAAO;AAAA,IACL,GAAI,KAAA,CAAM,GAAG,IAAI,CAACA,2BAAA,CAAU,CAAC,EAAE,IAAA,EAAM,CAAA,CAAE,UAAA,EAAY,MAAM,IAAA,EAAM,GAAG,cAAc,CAAC,IAAI,EAAC;AAAA,IACtF,GAAI,QAAQ,MAAA,GACR,CAACA,4BAAU,CAAC,EAAE,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,YAAY,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG,CAAA,EAAG,cAAc,CAAC,CAAA,GACzF;AAAC,GACP;AACF;AAGO,SAAS,mBAAA,CAAoB,OAAqB,OAAA,EAAsC;AAC7F,EAAA,MAAM,IAAI,EAAE,GAAG,6BAAA,EAA+B,GAAG,QAAQ,MAAA,EAAO;AAChE,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,KAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,CAAE,GAAA,EAAK,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,EAAG,CAAA,CAAE,QAAA,EAAU,EAAE,IAAI,CAAA;AACvE,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,GAAS,8BAAA;AACjC,EAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAIC,uBAAK,SAAS,CAAA;AAE5C,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,EAAG,GAAG,OAAA,CAAQ,IAAI,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,KAAK,KAAA,CAAO,SAAA,GAAY,CAAA,GAAK,KAAK,CAAC,CAAA;AACrE,EAAA,MAAM,EAAA,GAAKC,4BAAU,OAAA,CAAQ,EAAA,IAAA,qBAAU,IAAA,EAAK,EAAE,aAAa,CAAA;AAE3D,EAAA,MAAM,MAAA,GAAS,sDAAsD,KAAA,CAClE,GAAA;AAAA,IAAI,CAAC,GAAG,CAAA,KACPC,sBAAA,CAAK,CAACH,2BAAA,CAAU,CAAC,EAAE,IAAA,EAAM,CAAA,EAAG,MAAM,IAAA,EAAM,GAAG,cAAc,CAAC,GAAG,MAAA,CAAO,CAAC,GAAG,QAAQ;AAAA,GAClF,CACC,IAAA,CAAK,EAAE,CAAC,CAAA,OAAA,CAAA;AACX,EAAA,MAAM9B,KAAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC7B,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAG,CAAA,GAAI,QAAA,GAAW,MAAA;AACrC,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZiC,uBAAK,CAACH,2BAAA,CAAU,CAAC,EAAE,IAAA,EAAM,IAAI,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,GAAG,cAAc,CAAC,GAAG,MAAA,CAAO,CAAC,GAAG,IAAI,CAAA;AAAA,MACnF,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACvB,QAAA,MAAM,IAAA,GAAO,SAAS,SAAA,CAAU,GAAA,EAAK,CAAC,CAAA,EAAG,CAAA,EAAG,QAAQ,MAAM,CAAA;AAC1D,QAAA,OAAOG,uBAAK,IAAA,GAAO,CAACH,4BAAU,CAAC,EAAE,MAAM,CAAA,EAAG,cAAc,CAAC,IAAI,EAAC,EAAG,OAAO,CAAA,GAAI,CAAC,GAAG,IAAI,CAAA;AAAA,MACtF,CAAC,CAAA;AAAA,MACDG,sBAAA,CAAK,kBAAA,CAAmB,GAAA,EAAK,CAAC,CAAA,EAAG,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,EAAG,IAAI,CAAA;AAAA,MACjEA,sBAAA,CAAK,aAAA,CAAc,GAAA,EAAK,OAAA,EAAS,CAAC,CAAA,EAAG,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,EAAG,IAAI;AAAA,KACvE;AACA,IAAA,OAAO,CAAA,qCAAA,EAAwC,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,OAAA,CAAA;AAAA,EAC/D,CAAC,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,kEAAkE,SAAS,CAAA,uLAAA,EAA0L,OAC/Q,GAAA,CAAI,CAAC,MAAM,CAAA,gBAAA,EAAmB,CAAC,KAAK,CAAA,CACpC,IAAA,CAAK,EAAE,CAAC,CAAA,YAAA,EAAe,MAAM,CAAA,EAAGjC,KAAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAA,QAAA,CAAA;AAEhD,EAAA,OAAOkC,6BAAA;AAAA,IACL,CAAA,EAAGJ,2BAAA;AAAA,MACD,CAAC,EAAE,IAAA,EAAM,OAAA,CAAQ,OAAO,CAAA;AAAA,MACxB;AAAA,KACD,CAAA,EAAGA,2BAAA,CAAU,CAAC,EAAE,MAAM,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,CAAA,IAAA,CAAM,CAAA,EAAG,KAAA,EAAO,MAAM,CAAC,CAAC,CAAA,EAAG,IAAI,CAAA,EACnF,IAAA,CAAK,MAAA,GAAS,EAAA,GAAKA,4BAAU,CAAC,EAAE,IAAA,EAAM,CAAA,CAAE,OAAO,KAAA,EAAO,IAAA,EAAM,CAAC,CAC/D,SAAS,MAAM,CAAA;AAAA,GACjB;AACF;AAGO,SAAS,YAAA,CAAa,OAAqB,OAAA,EAA0C;AAC1F,EAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,WAAA,EAAY;AAC1D,EAAA,OAAOK,6BAAA,CAAY;AAAA,IACjB,UAAU,mBAAA,CAAoB,KAAA,EAAO,EAAE,GAAG,OAAA,EAAS,IAAI,CAAA;AAAA,IACvD,MAAA,EAAQC,uCAAA;AAAA,IACR,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf;AAAA,GACD,CAAA;AACH;;;ACtKO,IAAM,uBAAA,GAA0C;AAAA,EACrD,IAAA,EAAM,MAAA;AAAA,EACN,UAAA,EAAY,YAAA;AAAA,EACZ,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,cAAA;AAAA,EACT,KAAA,EAAO;AACT;AAUA,IAAM,IAAA,GAAO,CAAC,IAAA,KAAiB,IAAA,CAAK,QAAQ,eAAA,EAAiB,EAAE,EAAE,IAAA,EAAK;AAM/D,SAAS,eAAA,CACd,OAAA,EACA,OAAA,GAAuC,EAAC,EACvB;AACjB,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAIC,kCAAA,CAAiB,SAAS,OAAO,CAAA;AAC9D,EAAA,OAAO;AAAA,IACL,GAAG,MAAA,CAAO,OAAA;AAAA,MAAQ,CAAC,CAAA,KACjB,CAAA,CAAE,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACxB,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,UAAA,EAAY,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA;AAAA,QACvB,MAAA,EAAQ,EAAE,MAAA,IAAU,EAAA;AAAA,QACpB,QAAQ,CAAA,CAAE;AAAA,OACZ,CAAE;AAAA,KACJ;AAAA,IACA,GAAG,CAAC,GAAG,QAAQ,CAAA,CAAE,KAAKC,oCAAkB,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACpD,IAAA,EAAM,EAAA;AAAA,MACN,UAAA,EAAY,CAAA,CAAE,IAAA,CAAK,IAAA,EAAK;AAAA,MACxB,MAAA,EAAQ,EAAE,MAAA,IAAU,EAAA;AAAA,MACpB,QAAQ,CAAA,CAAE;AAAA,KACZ,CAAE;AAAA,GACJ;AACF;AAEA,IAAMC,WAAAA,GAAa,CAAC,IAAA,KAAiB,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAG5E,SAAS,gBAAA,CACd,SACA,OAAA,EACQ;AACR,EAAA,MAAM,IAAI,EAAE,GAAG,uBAAA,EAAyB,GAAG,QAAQ,MAAA,EAAO;AAC1D,EAAA,MAAM,EAAA,GAAKP,4BAAU,OAAA,CAAQ,EAAA,IAAA,qBAAU,IAAA,EAAK,EAAE,aAAa,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,EAAA,EAAK,QAAQ,KAAK,CAAA,CAAA;AAAA,IAClB,EAAA;AAAA,IACA,CAAA,CAAA,EAAI,EAAE,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,EAAG,EAAE,MAAM,CAAC,CAAA,CAAA,CAAA;AAAA,IAC1C,EAAA;AAAA,IACA,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA,GAAA,EAAM,EAAE,UAAU,CAAA,GAAA,EAAM,EAAE,MAAM,CAAA,EAAA,CAAA;AAAA,IAC3C,qBAAA;AAAA,IACA,GAAG,OAAA,CAAQ,GAAA;AAAA,MACT,CAAC,MACC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,EAAA,EAAKO,WAAAA,CAAW,EAAE,IAAI,CAAC,OAAO,EAAE,CAAA,GAAA,EAAMA,YAAW,CAAA,CAAE,UAAU,CAAC,CAAA,GAAA,EAAMA,WAAAA,CAAW,CAAA,CAAE,MAAM,CAAC,CAAA,EAAA;AAAA;AAC1G,GACF;AACA,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,QAAc,IAAA,CAAK,EAAA,EAAI,EAAE,KAAK,CAAA;AAC3C,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AAC5B;AAGO,SAAS,mBAAA,CACd,SACA,OAAA,EACQ;AACR,EAAA,MAAM,IAAI,EAAE,GAAG,uBAAA,EAAyB,GAAG,QAAQ,MAAA,EAAO;AAC1D,EAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAIR,uBAAK,KAAK,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,KAAA,CAAO,SAAA,GAAY,CAAA,GAAK,EAAE,CAAC,CAAA;AACpE,EAAA,MAAM,EAAA,GAAKC,4BAAU,OAAA,CAAQ,EAAA,IAAA,qBAAU,IAAA,EAAK,EAAE,aAAa,CAAA;AAC3D,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAW,IAAA,GAAO,UAAU,CAACF,2BAAA,CAAU,CAAC,EAAE,MAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,cAAc,CAAC,CAAA;AACzF,EAAA,MAAM,SAAS,CAAA,mDAAA,EAAsD;AAAA,IACnE,CAAA,CAAE,IAAA;AAAA,IACF,CAAA,CAAE,UAAA;AAAA,IACF,CAAA,CAAE;AAAA,IAED,GAAA,CAAI,CAAC,GAAG,CAAA,KAAMG,sBAAA,CAAK,KAAK,CAAA,EAAG,IAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA,CACtD,IAAA,CAAK,EAAE,CAAC,CAAA,OAAA,CAAA;AACX,EAAA,MAAM,OAAO,OAAA,CAAQ,GAAA;AAAA,IACnB,CAAC,CAAA,KACC,CAAA,qCAAA,EAAwCA,sBAAA,CAAK,CAAA,CAAE,OAAO,IAAA,CAAK,CAAA,CAAE,IAAA,EAAM,IAAI,IAAI,EAAC,EAAG,OAAO,CAAC,CAAC,CAAC,CAAA,EAAGA,sBAAA;AAAA,MAC1F,IAAA,CAAK,EAAE,UAAU,CAAA;AAAA,MACjB,OAAO,CAAC;AAAA,KACT,CAAA,EAAGA,sBAAA,CAAK,CAAA,CAAE,SAAS,IAAA,CAAK,CAAA,CAAE,MAAM,CAAA,GAAI,EAAC,EAAG,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,OAAA;AAAA,GACvD;AACA,EAAA,MAAM,KAAA,GAAQ,kEAAkE,SAAS,CAAA,uLAAA,EAA0L,OAChR,GAAA,CAAI,CAAC,MAAM,CAAA,gBAAA,EAAmB,CAAC,KAAK,CAAA,CACpC,IAAA,CAAK,EAAE,CAAC,CAAA,YAAA,EAAe,MAAM,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAA,QAAA,CAAA;AAChD,EAAA,OAAOC,6BAAA;AAAA,IACL,CAAA,EAAGJ,2BAAA,CAAU,CAAC,EAAE,IAAA,EAAM,OAAA,CAAQ,KAAA,EAAO,CAAA,EAAG,OAAO,CAAC,CAAA,EAAGA,2BAAA,CAAU;AAAA,MAC3D,EAAE,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA,EAAG,EAAE,CAAA,IAAA,CAAM,CAAA,EAAG,KAAA,EAAO,IAAA;AAAK,KAC7D,CAAC,CAAA,EAAG,KAAK,GAAG,OAAA,CAAQ,MAAA,GAAS,KAAKA,2BAAA,CAAU,CAAC,EAAE,IAAA,EAAM,CAAA,CAAE,OAAO,KAAA,EAAO,IAAA,EAAM,CAAC,CAAC,SAAS,MAAM,CAAA;AAAA,GAC/F;AACF;AAGO,SAAS,YAAA,CACd,SACA,OAAA,EACY;AACZ,EAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,WAAA,EAAY;AAC1D,EAAA,OAAOK,6BAAA,CAAY;AAAA,IACjB,UAAU,mBAAA,CAAoB,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,IAAI,CAAA;AAAA,IACzD,MAAA,EAAQC,uCAAA;AAAA,IACR,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf;AAAA,GACD,CAAA;AACH;AAGO,SAAS,gBAAA,CAAiB,OAAe,SAAA,EAAkC;AAChF,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,gBAAA,EAAkB,GAAG,EAAE,IAAA,EAAK,IAAK,UAAU,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAClF;AClJA,IAAM,KAAA,GAAQ,CAAC,IAAA,KAAiB,IAAA,CAAK,WAAA,EAAY;AAG1C,SAAS,aAAA,GAAgB;AAC9B,EAAA,OAAO;AAAA;AAAA,IAEL,GAAA,EAAKI,kBAAe,SAAS,CAAA;AAAA,IAC7B,IAAA,EAAMA,iBAAA,CAAe,SAAA,EAAW,QAAQ,CAAA;AAAA,IACxC,QAAA,EAAUA,kBAAe,UAAU,CAAA;AAAA,IACnC,SAAA,EAAWA,iBAAA,CAAe,UAAA,EAAY,QAAQ,CAAA;AAAA,IAC9C,IAAA,EAAMA,kBAAe,MAAM,CAAA;AAAA,IAC3B,KAAA,EAAOA,iBAAA,CAAe,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACtC,MAAA,EAAQA,kBAAe,cAAc,CAAA;AAAA,IACrC,OAAA,EAASA,iBAAA,CAAe,cAAA,EAAgB,QAAQ,CAAA;AAAA,IAChD,MAAA,EAAQA,iBAAA,CAAe,QAAA,EAAU,QAAQ,CAAA;AAAA,IACzC,aAAA,EAAeA,iBAAA,CAAe,cAAA,EAAgB,QAAQ;AAAA,GACxD;AACF;AAGO,SAAS,cAAA,GAAyB;AACvC,EAAA,MAAM,IAAI,aAAA,EAAc;AACxB,EAAA,OAAO,GAAG,CAAA,CAAE,MAAM,QAAQ,KAAA,CAAM,CAAA,CAAE,aAAa,CAAC,CAAA,CAAA;AAClD;AAGO,SAAS,cAAc7B,MAAAA,EAAuB;AACnD,EAAA,MAAM,IAAI,aAAA,EAAc;AACxB,EAAA,OAAO,CAAA,EAAGA,MAAK,CAAA,CAAA,EAAI,KAAA,CAAMA,MAAAA,KAAU,IAAI,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,SAAS,CAAC,CAAA,CAAA;AAClE;AAGO,SAAS,eAAe,IAAA,EAAwC;AACrE,EAAA,MAAM,IAAI,aAAA,EAAc;AACxB,EAAA,MAAM,CAAA,GAAI8B,gBAAa,IAAI,CAAA;AAC3B,EAAA,OAAO;AAAA,IACL,GAAA,EAAKC,gBAAa,IAAI,CAAA;AAAA,IACtB,QAAA,EAAU,cAAA;AAAA,IACV,SAAA,EAAW,CAAA,QAAA,EAAW,KAAA,CAAM,CAAA,CAAE,SAAS,CAAC,CAAA,CAAA;AAAA,IACxC,QAAA,EAAU,CAAA,EAAA,EAAK,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAA;AAAA,IAChC,KAAA,EAAO,CAAA,QAAA,EAAW,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA;AAAA,IAChC,IAAA,EAAM,CAAA,EAAA,EAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA;AAAA,IACxB,OAAA,EAAS,CAAA,QAAA,EAAW,KAAA,CAAM,CAAA,CAAE,OAAO,CAAC,CAAA,CAAA;AAAA,IACpC,MAAA,EAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,CAAA,CAAE,MAAM,CAAC,CAAA,CAAA;AAAA,IAC5B,cAAA,EAAgB,CAAA,SAAA,EAAY,KAAA,CAAM,CAAA,CAAE,MAAM,CAAC,CAAA,CAAA;AAAA,IAC3C,KAAA,EAAO,CAAA,GAAA,EAAM,CAAA,CAAE,MAAM,CAAA,KAAA,CAAA;AAAA,IACrB,SAAA,EAAW;AAAA,GACb;AACF;AAGO,SAAS,eAAA,GAA4C;AAC1D,EAAA,MAAM,IAAI,aAAA,EAAc;AACxB,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAiB,CAAA,GAAA,EAAM,KAAA,CAAM,IAAI,CAAC,CAAA,cAAA,EAAiB,KAAA,CAAM,CAAA,CAAE,GAAG,CAAC,CAAA,KAAA,CAAA;AAChF,EAAA,OAAO;AAAA,IACL,WAAW,CAAA,CAAE,SAAA;AAAA,IACb,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,SAAS,CAAA,CAAE,OAAA;AAAA,IACX,WAAA,EAAa,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC/B,OAAA,EAAS,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AAAA,IACvB,SAAA,EAAW,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA;AAAA,IAC3B,cAAA,EAAgB,CAAA,SAAA,EAAY,KAAA,CAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,GAC7C;AACF;AAMO,SAAS,aAAa,IAAA,EAAmC;AAC9D,EAAA,OAAO,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,QAAA,GAAW,MAAA,GAAY,MAAA;AAC7D;AAGO,SAAS,mBAAmB,IAAA,EAAuB;AACxD,EAAA,MAAM,IAAI,aAAA,EAAc;AACxB,EAAA,MAAM,CAAA,GAAID,gBAAa,IAAI,CAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAA,CAAE,SAAS,CAAA;AAC9B,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,sBAAA,EAAyB,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA,KAAA,EAAQ,KAAA,CAAM,CAAA,CAAE,OAAO,CAAC,CAAA,CAAA,CAAA;AAAA,IACjF,KAAK,YAAA;AACH,MAAA,OAAO,CAAA,eAAA,EAAkB,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,4DAAA,CAAA;AAAA,IAC5C,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,sCAAA,EAAyC,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,QAAA,CAAA;AAAA,IACnE,KAAK,QAAA;AAAA,IACL,KAAK,cAAA;AACH,MAAA,OAAO,CAAA,EAAGC,gBAAa,IAAA,EAAM,EAAE,QAAQ,IAAA,EAAM,CAAC,CAAA,KAAA,EAAQ,IAAI,CAAA,SAAA,CAAA;AAAA,IAC5D,KAAK,QAAA;AACH,MAAA,OAAO,GAAGA,eAAA,CAAa,IAAA,EAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,CAAA,CAAA;AAAA;AAEpD;AC7EO,IAAM,aAAA,GAAgB;AAe7B,IAAM,UAAA,GAAa,CAAC,CAAA,KAA2B,CAAC,CAAA,CAAE,aAAA;AAc3C,SAAS,qBAAA,CAAsB;AAAA,EACpC,IAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA+B;AAC7B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIvE,cAAAA,CAAmB,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpC,EAAA,MAAM,QAAA,GAAWE,cAAQ,MAAM,SAAA,CAAU,OAAO,UAAU,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AACxE,EAAA,MAAM,SAAS,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,GAAS,MAAA;AAC9B,EAAA,MAAM,QAAQ,aAAA,EAAc;AAC5B,EAAA,MAAM,QAAA,GAAW,cAAA,EAAe,CAAE,WAAA,EAAY;AAC9C,EAAA,MAAM,MAAA,GAASA,aAAAA;AAAA,IACb,MAAqB;AAAA,MACnB;AAAA,QACE,EAAA,EAAI,KAAA;AAAA,QACJ,OAAA,EAAS,mBAAA;AAAA,QACT,IAAA,EAAM,QAAA,CACH,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACX,IAAI,CAAA,CAAE,WAAA;AAAA,UACN,KAAA,EAAOsE,mBAAA,CAAiB,CAAA,EAAG,CAAA,CAAE,aAAa,MAAS,CAAA;AAAA,UACnD,UAAU,CAAA,CAAE,SAAA;AAAA,UACZ,OAAOC,kBAAA,CAAgB,CAAC,CAAA,GAAI,IAAA,GAAQ,EAAE,OAAA,IAAW,IAAA;AAAA,UACjD,QAAQA,kBAAA,CAAgB,CAAC,CAAA,GAAI,IAAA,GAAQ,EAAE,MAAA,IAAU;AAAA,SACnD,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,WAAA,GAAc,aAAA,CAAc,CAAA,CAAE,KAAA,CAAM,WAAA,EAAa,CAAC;AAAA;AAC9E,KACF;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KACd,SAAA,CAAU,CAAC,GAAA,KAAS,GAAA,CAAI,SAAS,EAAE,CAAA,GAAI,IAAI,MAAA,CAAO,CAAC,MAAM,CAAA,KAAM,EAAE,IAAI,CAAC,GAAG,GAAA,EAAK,EAAE,CAAE,CAAA;AAEpF,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,SAAA,CAAU,EAAE,CAAA;AACZ,IAAA,MAAA,CAAO,KAAK,CAAA;AACZ,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,MAAM,YAAY;AACtB,IAAA,IAAI,MAAA,CAAO,SAAS,aAAA,EAAe;AACjC,MAAA,SAAA,CAAU,CAAA,eAAA,EAAkB,aAAA,CAAc,aAAa,CAAC,CAAA,WAAA,CAAa,CAAA;AACrE,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,UAAU,MAAM,CAAA;AACtB,MAAA,KAAA,EAAM;AAAA,IACR,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,uBACEtE,cAAAA,CAACuE,SAAA,EAAA,EAAO,IAAA,EAAY,YAAA,EAAc,CAAC,IAAA,KAAU,IAAA,GAAO,YAAA,CAAa,IAAI,CAAA,GAAI,KAAA,IACvE,QAAA,kBAAAjE,eAAAA;AAAA,IAACkE,gBAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAa,OAAA;AAAA,MACb,SAAA,EAAU,sEAAA;AAAA,MACV,aAAA,EAAY,yBAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAAlE,gBAACmE,6BAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAnE,gBAACoE,cAAA,EAAA,EAAY,QAAA,EAAA;AAAA,YAAA,UAAA;AAAA,YAAS;AAAA,WAAA,EAAS,CAAA;AAAA,0BAC/BpE,gBAACqE,oBAAA,EAAA,EAAkB,QAAA,EAAA;AAAA,YAAA,mBAAA;AAAA,YACC,QAAA;AAAA,YAAS,QAAA;AAAA,YAAO,KAAA,CAAM,SAAS,WAAA,EAAY;AAAA,YAAE,2DAAA;AAAA,YAC5B,cAAA,EAAe;AAAA,YAAE;AAAA,WAAA,EACtD;AAAA,SAAA,EACF,CAAA;AAAA,wBACArE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iCAAA,EACf,QAAA,EAAA;AAAA,4BAAAN,cAAAA;AAAA,cAACiC,WAAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,GAAA;AAAA,gBACT,eAAA,EAAiB,CAAC,CAAA,KAAM,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,gBACzC,aAAA,EAAY;AAAA;AAAA,aACd;AAAA,YAAE,MAAA;AAAA,YACG,KAAA,CAAM,UAAU,WAAA,EAAY;AAAA,YAAE,IAAA;AAAA,YAAG,MAAA,CAAO,MAAA;AAAA,YAAO;AAAA,WAAA,EACtD,CAAA;AAAA,UACC,CAAC,uBACAjC,cAAAA;AAAA,YAAC4E,gCAAA;AAAA,YAAA;AAAA,cACC,MAAA;AAAA,cACA,KAAA,EAAM,EAAA;AAAA,cACN,aAAA,EAAe,MAAA;AAAA,cACf,WAAA,EAAa,MAAA;AAAA,cACb,MAAA,EAAQ,EAAE,WAAA,EAAa,CAAA,OAAA,EAAU,MAAM,SAAA,CAAU,WAAA,EAAa,CAAA,MAAA,CAAA;AAAI;AAAA;AACpE,SAAA,EAEJ,CAAA;AAAA,wBACAtE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,0BAAAN,eAACyB,SAAAA,EAAA,EAAO,SAAQ,OAAA,EAAQ,OAAA,EAAS,OAAO,QAAA,EAAA,QAAA,EAExC,CAAA;AAAA,0BACAzB,cAAAA;AAAA,YAACyB,SAAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,KAAK,GAAA,EAAI;AAAA,cACxB,QAAA,EAAU,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,SAAA;AAAA,cACjC,aAAA,EAAY,sBAAA;AAAA,cAEX,QAAA,EAAA,MAAA,CAAO,SAAS,CAAA,GAAI,CAAA,aAAA,EAAgB,cAAc,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA,GAAK;AAAA;AAAA;AACxE,SAAA,EACF;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;;;AC3IO,IAAM,iBAAA,GAAyD;AAAA,EACpE,MAAMoD,4BAAU,IAAA,EAAK;AAAA,EACrB,MAAMC,oCAAkB,IAAA,EAAK;AAAA,EAC7B,MAAMC,kCAAgB,IAAA,EAAK;AAAA,EAC3B,MAAM,OAAO,6BAA6B,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,CAAe,IAAA,EAAM;AACjF;AAEA,eAAsB,gBAAA,GAAkC;AACtD,EAAA,MAAM,OAAA,CAAQ,IAAI,iBAAA,CAAkB,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,EAAM,CAAC,CAAA;AAC3D;AAMA,eAAsB,oBAAA,GAAsC;AAC1D,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,CAAC,MAAM,OAAO,sBAAkB,CAAA,EAAG,GAAG,iBAAiB,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAASC,+BAAA,CAAc,IAAI,CAAC;AAAA,GAC5F;AACF","file":"chunk-YVO6Z5BS.cjs","sourcesContent":["import { useEffect, useMemo, useState } from 'react'\nimport type { TipsRegistry } from './registry'\n\nexport interface UseTipsPlacementOptions<Context extends string, State, Cta> {\n registry: Pick<TipsRegistry<Context, State, Cta>, 'select' | 'subscribe'>\n context: Context\n /** Serializable situation values; equal inline objects do not restart the placement. */\n state: State\n dismissed?: readonly string[]\n /** Seconds between tips. Zero disables rotation. Default 30. */\n autoRotateSeconds?: number\n}\n\n/**\n * The lifecycle of a tips placement: live registry updates, per-user dismissal filtering,\n * priority-first selection, cyclic paging and hover-paused rotation. Content, CTA dispatch,\n * visibility preferences and the card's actual placement belong to the host.\n */\nexport function useTipsPlacement<Context extends string, State, Cta>({\n registry,\n context,\n state,\n dismissed = [],\n autoRotateSeconds = 30,\n}: UseTipsPlacementOptions<Context, State, Cta>) {\n const [editVersion, setEditVersion] = useState(0)\n useEffect(() => registry.subscribe(() => setEditVersion((value) => value + 1)), [registry])\n const stateKey = JSON.stringify(state ?? {})\n const dismissedKey = JSON.stringify(dismissed)\n const tips = useMemo(\n () => registry.select(context, state).filter((tip) => !dismissed.includes(tip.code)),\n // Values, not the identity of inline situation/dismissal objects, select and reset the tips.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [registry, context, stateKey, editVersion, dismissedKey]\n )\n const [cursor, setCursor] = useState(0)\n const [paused, setPaused] = useState(false)\n useEffect(() => setCursor(0), [registry, context, stateKey])\n useEffect(() => {\n if (tips.length <= 1 || paused || autoRotateSeconds <= 0) return\n const timer = setTimeout(\n () => setCursor((value) => (value + 1) % tips.length),\n autoRotateSeconds * 1000\n )\n return () => clearTimeout(timer)\n }, [tips.length, paused, autoRotateSeconds, cursor])\n\n const index = tips.length ? cursor % tips.length : 0\n return {\n tips,\n tip: tips.at(index),\n index,\n count: tips.length,\n previous: () =>\n setCursor((value) => (tips.length ? (value - 1 + tips.length) % tips.length : 0)),\n next: () => setCursor((value) => (tips.length ? (value + 1) % tips.length : 0)),\n onHoverChange: setPaused,\n }\n}\n","{\n \"color\": \"#22d3ee\",\n \"glowColor\": \"rgba(34,211,238,.85)\",\n \"glowColorFlash\": \"rgba(103,232,249,.95)\",\n \"fillColor\": \"rgba(34,211,238,.25)\",\n \"size\": 24,\n \"borderWidth\": 2,\n \"mark\": {\n \"width\": 30\n },\n \"ripple\": {\n \"durationMs\": 600,\n \"easing\": \"ease-out\",\n \"startScale\": 0.5,\n \"endScale\": 3,\n \"startOpacity\": 0.85,\n \"endOpacity\": 0\n },\n \"squish\": {\n \"downMs\": 80,\n \"upMs\": 220,\n \"scale\": 0.6,\n \"downEasing\": \"ease-in\",\n \"upEasing\": \"cubic-bezier(0.34, 1.56, 0.64, 1)\"\n },\n \"glowFlash\": {\n \"durationMs\": 300,\n \"baseBlur\": 12,\n \"flashBlur\": 24,\n \"easing\": \"ease-out\"\n }\n}\n","/**\n * GuidedCursor\n *\n * The visual layer for guided UI runs: a mark that glides between targets and reacts on a click\n * (squish + glow flash on the mark itself, plus an outward cyan ripple). It renders whatever the\n * shared [[guidedCursor]] controller (./cursor.ts) says: a tip's \"Show me\", the tips editor's\n * tester, and remote control over the websocket.\n *\n * The mark is a cyan ring by default; a host gives its own image (`markSrc`), as ARBI-frontend\n * gives its brand mark. The look is defined by ./cursor-visuals.json, the single source of truth\n * shared with ARBI-frontend's demo-video recorder, so in-app walkthroughs and recorded demos read\n * as the same motion.\n *\n * Mount once near the app root (`ConnectedAppRuntime` does); it portals to <body>.\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type Ref,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { guidedCursor } from './cursor'\nimport CURSOR_VISUALS from './cursor-visuals.json'\nimport { useMountedSurface } from './surfaces'\n\nexport interface GuidedCursorProps {\n /** The mark's image (a URL). Default: a cyan ring. */\n markSrc?: string\n}\n\ninterface Ripple {\n id: number\n x: number\n y: number\n}\n\n// The cyan ring of the click ripple (the recorder's too, via cursor-visuals.json) and of the\n// default mark.\nconst RING_STYLE: CSSProperties = {\n position: 'fixed',\n width: CURSOR_VISUALS.size,\n height: CURSOR_VISUALS.size,\n border: `${CURSOR_VISUALS.borderWidth}px solid ${CURSOR_VISUALS.color}`,\n borderRadius: '50%',\n pointerEvents: 'none',\n}\n\nconst glowFilter = (blur: number, color: string) => `drop-shadow(0 0 ${blur}px ${color})`\n\n/** One click ripple that scales up and fades once, then unmounts. */\nfunction RippleDot({ x, y }: { x: number; y: number }) {\n return (\n <div\n style={{ ...RING_STYLE, left: x, top: y, transform: 'translate(-50%, -50%)' }}\n ref={(el) => {\n const { ripple } = CURSOR_VISUALS\n el?.animate(\n [\n {\n opacity: ripple.startOpacity,\n transform: `translate(-50%,-50%) scale(${ripple.startScale})`,\n },\n {\n opacity: ripple.endOpacity,\n transform: `translate(-50%,-50%) scale(${ripple.endScale})`,\n },\n ],\n { duration: ripple.durationMs, easing: ripple.easing }\n )\n }}\n />\n )\n}\n\n/** Squish-and-release the cursor mark, with a glow flash, on click. */\nfunction playClickFeedback(mark: HTMLElement) {\n const { squish, glowFlash, glowColor, glowColorFlash } = CURSOR_VISUALS\n const downFrac = squish.downMs / (squish.downMs + squish.upMs)\n mark.animate(\n [\n // Per-keyframe easing, not a single easing over the whole timeline: the\n // spring/back curve on the release overshoots past 1 — applied globally\n // that overshoot gets clamped and re-entered as eased time crosses the\n // downFrac boundary, producing a visible double-bounce right at the end.\n { transform: 'translate(-50%,-50%) scale(1)', offset: 0, easing: squish.downEasing },\n {\n transform: `translate(-50%,-50%) scale(${squish.scale})`,\n offset: downFrac,\n easing: squish.upEasing,\n },\n { transform: 'translate(-50%,-50%) scale(1)', offset: 1 },\n ],\n { duration: squish.downMs + squish.upMs }\n )\n mark.animate(\n [\n { filter: glowFilter(glowFlash.baseBlur, glowColor) },\n { filter: glowFilter(glowFlash.flashBlur, glowColorFlash), offset: 0.3 },\n { filter: glowFilter(glowFlash.baseBlur, glowColor) },\n ],\n { duration: glowFlash.durationMs, easing: glowFlash.easing }\n )\n}\n\n/** Mount once near the app root. Renders the cursor mark + click ripples. */\nexport function GuidedCursor({ markSrc }: GuidedCursorProps) {\n const snap = useSyncExternalStore(\n guidedCursor.subscribe,\n guidedCursor.getSnapshot,\n guidedCursor.getSnapshot\n )\n const [ripples, setRipples] = useState<Ripple[]>([])\n const markRef = useRef<HTMLElement | null>(null)\n // A remote run only goes where the user can watch it.\n useMountedSurface('cursor')\n\n useEffect(() => {\n let seq = 0\n return guidedCursor.onRipple((x, y) => {\n const id = ++seq\n setRipples((rs) => [...rs, { id, x, y }])\n setTimeout(() => setRipples((rs) => rs.filter((r) => r.id !== id)), 650)\n if (!guidedCursor.prefersReducedMotion() && markRef.current) {\n playClickFeedback(markRef.current)\n }\n })\n }, [])\n\n if (typeof document === 'undefined') return null\n if (!snap.visible && ripples.length === 0) return null\n\n const reduced = guidedCursor.prefersReducedMotion()\n const markStyle: CSSProperties = {\n position: 'fixed',\n left: snap.x,\n top: snap.y,\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n filter: glowFilter(CURSOR_VISUALS.glowFlash.baseBlur, CURSOR_VISUALS.glowColor),\n transition: reduced\n ? 'none'\n : `left ${guidedCursor.glideMs}ms cubic-bezier(0.22, 1, 0.36, 1), top ${guidedCursor.glideMs}ms cubic-bezier(0.22, 1, 0.36, 1)`,\n }\n\n return createPortal(\n <div aria-hidden className=\"pointer-events-none fixed inset-0 z-[2147483647]\">\n {snap.visible &&\n (markSrc ? (\n <img\n ref={markRef as Ref<HTMLImageElement>}\n data-testid=\"guided-cursor\"\n src={markSrc}\n alt=\"\"\n style={{ ...markStyle, width: CURSOR_VISUALS.mark.width, height: 'auto' }}\n />\n ) : (\n <div\n ref={markRef as Ref<HTMLDivElement>}\n data-testid=\"guided-cursor\"\n style={{ ...RING_STYLE, ...markStyle, background: CURSOR_VISUALS.fillColor }}\n />\n ))}\n {ripples.map((r) => (\n <RippleDot key={r.id} x={r.x} y={r.y} />\n ))}\n </div>,\n document.body\n )\n}\n","/**\n * LoadingIndicator Component\n *\n * Centralized loading indicator for consistent loading states across the app\n * A spinner in a 16rem-tall centered box, or the full-screen `splash`\n */\n\nimport { useEffect, useState, type ReactNode } from 'react'\nimport { Sparkle } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface LoadingIndicatorProps {\n /**\n * `spinner` (default): a ring spinner. `splash`: the full-screen loading screen, the host's\n * `logo` pulsing above three bouncing sparkles, over the whole viewport.\n */\n variant?: 'spinner' | 'splash'\n /** The brand mark a `splash` shows (e.g. the site's logo `<img>`). */\n logo?: ReactNode\n /**\n * Render nothing for this long first, so a short load (a lazy chunk on a first visit) never\n * flashes a loading state. In ms; default 0.\n */\n delayMs?: number\n /** Optional message to display below the spinner */\n message?: string\n /** Additional CSS classes */\n className?: string\n /** Test ID for testing */\n testId?: string\n}\n\nconst SPARKLE_DELAYS = ['0s', '0.1s', '0.2s']\nconst SPLASH_CLASS =\n 'fixed top-0 left-0 w-full h-full flex flex-col items-center justify-center bg-background bg-opacity-50 z-50'\n\nfunction useShowAfter(delayMs: number): boolean {\n const [show, setShow] = useState(delayMs <= 0)\n useEffect(() => {\n if (delayMs <= 0) return\n const timer = setTimeout(() => setShow(true), delayMs)\n return () => clearTimeout(timer)\n }, [delayMs])\n return show\n}\n\nexport function LoadingIndicator({\n variant = 'spinner',\n logo,\n delayMs = 0,\n message,\n className,\n testId = 'loading-indicator',\n}: LoadingIndicatorProps) {\n const show = useShowAfter(delayMs)\n if (!show) return null\n\n if (variant === 'splash') {\n return (\n <div\n data-testid={testId}\n // Joined, not `cn`-merged: tailwind-merge reads `bg-opacity-50` as a background colour\n // and would drop `bg-background`.\n className={[SPLASH_CLASS, className].filter(Boolean).join(' ')}\n >\n <div className=\"flex flex-col items-center space-y-4\">\n {logo}\n <div className=\"flex space-x-1\">\n {SPARKLE_DELAYS.map((delay) => (\n <Sparkle\n key={delay}\n className=\"w-4 h-4 text-primary animate-bounce fill-current\"\n style={delay === '0s' ? undefined : { animationDelay: delay }}\n />\n ))}\n </div>\n {message && <p className=\"text-sm text-muted-foreground\">{message}</p>}\n </div>\n </div>\n )\n }\n\n return (\n <div\n className={cn('flex h-64 flex-col items-center justify-center gap-3', className)}\n data-testid={testId}\n >\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-border border-t-primary\" />\n {message && <p className=\"text-sm text-muted-foreground\">{message}</p>}\n </div>\n )\n}\n","/**\n * GridRowNavigator\n *\n * A ‹ n / N › row navigator for an AG Grid table — the table twin of the one\n * the calendar and timeline blocks portal into the Facts toolbar, and the same\n * control on the Files table. It walks the rows in the ORDER THE TABLE SHOWS\n * THEM (after the grid's own sort and quick filters), scrolls each into view\n * and hands it to `onSelect` (Facts opens it in the composer, Files in the\n * viewer), so the row being stepped to is the one highlighted on screen.\n *\n * The position tracks `selectedId` (the fact open in the composer / the doc in\n * the viewer), falling back to \"– / N\" when nothing is open. It re-reads the\n * grid whenever its row model changes (sort, filter, data), so the counter\n * stays honest.\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport type { GridApi } from 'ag-grid-community'\nimport { RowNavigatorControls } from './RowNavigatorControls'\n\nexport interface GridRowNavigatorProps<T> {\n /** The mounted grid's API, or null until the grid is ready. */\n gridApi: GridApi<T> | null\n /** The row currently open — where the counter points. */\n selectedId: string | null\n /** Open the row the user stepped to. */\n onSelect: (item: T) => void\n /** Prefix for every `data-testid` this control emits. */\n testId: string\n /** Noun for the buttons' aria-labels (\"Previous fact\" / \"Next document\"). */\n itemLabel?: string\n}\n\n/** Grid events after which the displayed row order or count may differ. */\nconst ROW_MODEL_EVENTS = ['modelUpdated', 'sortChanged', 'filterChanged', 'rowDataUpdated'] as const\n\nexport function GridRowNavigator<T>({\n gridApi,\n selectedId,\n onSelect,\n testId,\n itemLabel = 'row',\n}: GridRowNavigatorProps<T>) {\n const [{ total, currentIndex }, setPosition] = useState<{\n total: number\n currentIndex: number | null\n }>({ total: 0, currentIndex: null })\n\n const readPosition = useCallback(() => {\n if (!gridApi || gridApi.isDestroyed()) {\n setPosition({ total: 0, currentIndex: null })\n return\n }\n const total = gridApi.getDisplayedRowCount()\n const node = selectedId ? gridApi.getRowNode(selectedId) : undefined\n const index = node?.rowIndex\n // A selected row hidden by the grid's filter has no displayed index.\n setPosition({ total, currentIndex: typeof index === 'number' && index >= 0 ? index : null })\n }, [gridApi, selectedId])\n\n useEffect(() => {\n readPosition()\n if (!gridApi || gridApi.isDestroyed()) return\n for (const ev of ROW_MODEL_EVENTS) gridApi.addEventListener(ev, readPosition)\n return () => {\n if (gridApi.isDestroyed()) return\n for (const ev of ROW_MODEL_EVENTS) gridApi.removeEventListener(ev, readPosition)\n }\n }, [gridApi, readPosition])\n\n const goTo = (index: number) => {\n if (!gridApi || gridApi.isDestroyed()) return\n const clamped = Math.max(0, Math.min(total - 1, index))\n const node = gridApi.getDisplayedRowAtIndex(clamped)\n if (!node?.data) return\n gridApi.ensureIndexVisible(clamped, 'middle')\n onSelect(node.data)\n }\n\n return (\n <RowNavigatorControls\n total={total}\n currentIndex={currentIndex}\n onGo={goTo}\n testId={testId}\n itemLabel={itemLabel}\n />\n )\n}\n","import { Search } from 'lucide-react'\nimport { Input, cn } from '@arbidocs/react/ui'\n\n/** The search bar above a list view. */\nexport function Toolbar({\n search,\n onSearch,\n searchPlaceholder = 'Search…',\n className,\n testId,\n}: {\n search?: string\n onSearch?: (v: string) => void\n searchPlaceholder?: string\n className?: string\n testId?: string\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between',\n className\n )}\n data-testid={testId}\n >\n <div className=\"flex flex-1 flex-wrap items-center gap-2\">\n {onSearch && (\n <div className=\"relative w-full max-w-xs\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => onSearch(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"bg-card text-sm placeholder:text-muted-foreground focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring pl-8\"\n data-testid={testId ? `${testId}-search` : 'toolbar-search'}\n />\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { useEffect, useState, type ReactNode } from 'react'\nimport { Pencil } from 'lucide-react'\nimport { Input, Textarea, cn } from '@arbidocs/react/ui'\n\n/** Longest a name may be. Exported so a form editing the same field agrees. */\nexport const IDENTITY_NAME_MAX_LENGTH = 50\n\n/** Shown once the remaining allowance gets this low, not for the whole time. */\nconst COUNTER_THRESHOLD = 10\n\nexport interface EntityIdentityField {\n /** Row caption. Rendered with a trailing colon. */\n label: string\n value: string\n /** Stands in for an empty value, in italics — never a blank row. */\n placeholder: string\n /** Commits the edit. Not called when the value is unchanged. */\n onSave: (next: string) => void\n /** A description needs line breaks; a name does not. */\n multiline?: boolean\n /** Caps the input and shows a counter as it fills. Names only, by default. */\n maxLength?: number\n /** Classes for the read-mode value, e.g. a larger weight for the name. */\n valueClassName?: string\n /**\n * Content pinned to the RIGHT END of this row — e.g. the owning project\n * beside a name, a member stack beside a status. Rows without one let their\n * value run the full width, which is what a description wants.\n */\n trailing?: ReactNode\n /**\n * Content rendered immediately BEFORE the value — the entity's own mark.\n * Sits outside the edit swap, so starting to edit the name doesn't make the\n * icon jump or disappear.\n */\n leading?: ReactNode\n /**\n * Drops the caption from view for this row, leaving the value flush left.\n * For a field whose value already says what it is — a workspace's name and\n * description read as exactly that — the caption is a word the eye has to\n * step over on the way in. The caption stays in the markup for screen\n * readers, which have no such visual cue to fall back on.\n */\n hideLabel?: boolean\n /** Row test id; the pencil and input derive `-edit` and `-input`. */\n testId?: string\n}\n\nexport interface EntityIdentityBarProps {\n /** The editable text fields, in order. Usually name then description. */\n fields: EntityIdentityField[]\n /** Hides every pencil. A viewer without permission sees values, not controls. */\n canEdit?: boolean\n /** Trailing controls, pinned right — e.g. a member stack, a status. */\n actions?: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * The \"what am I looking at\" bar for an entity's own page.\n *\n * A caption column (`Name:`, `Description:`, `Project:`) and a value column. The\n * captions are the point: a bare bold string at the top of a page reads equally\n * as a workspace, a project, a case file or a folder, and people read it as\n * whichever they expected. Saying which field is which costs one column and\n * removes the ambiguity entirely.\n *\n * Editing happens in place. The pencil is always visible to someone who can use\n * it rather than revealed on hover — a control you have to go hunting for is one\n * most people never find, and hover doesn't exist on touch. Commit is on blur\n * and on Enter (single-line fields only, so a description can hold line\n * breaks); Escape abandons the edit.\n *\n * Deliberately NOT a form: no submit, no dirty state, no field-level errors.\n * When a consumer needs visibility toggles, destructive actions or validation\n * messages, those belong in its settings form — this bar is the identity of the\n * thing, shown where you are working on it.\n *\n * Styled with SEMANTIC tokens only, so every host gets it in its own colours.\n */\nexport function EntityIdentityBar({\n fields,\n canEdit = false,\n actions,\n className,\n testId,\n}: EntityIdentityBarProps) {\n return (\n <div\n className={cn('flex flex-wrap items-start justify-between gap-x-6 gap-y-3', className)}\n data-testid={testId}\n >\n <dl className=\"min-w-0 flex-1 space-y-1.5\">\n {fields.map((field) => (\n <IdentityFieldRow key={field.label} field={field} canEdit={canEdit} />\n ))}\n </dl>\n {actions ? <div className=\"flex shrink-0 items-center gap-2\">{actions}</div> : null}\n </div>\n )\n}\n\nfunction IdentityFieldRow({ field, canEdit }: { field: EntityIdentityField; canEdit: boolean }) {\n const {\n label,\n value,\n placeholder,\n onSave,\n multiline = false,\n maxLength,\n valueClassName,\n leading,\n hideLabel,\n trailing,\n testId,\n } = field\n\n const [isEditing, setIsEditing] = useState(false)\n const [draft, setDraft] = useState(value)\n\n // Track the value while not editing, so an update from elsewhere (another\n // tab, a websocket) doesn't get overwritten by a stale draft on the next edit.\n useEffect(() => {\n if (!isEditing) setDraft(value)\n }, [value, isEditing])\n\n const commit = () => {\n setIsEditing(false)\n const next = draft.trim()\n if (next !== value) onSave(next)\n }\n\n const cancel = () => {\n setDraft(value)\n setIsEditing(false)\n }\n\n const charsLeft = maxLength === undefined ? null : maxLength - draft.length\n\n // Editing must not move anything. The input carries the read view's exact\n // typography and padding, drops the border and shadow entirely, and marks\n // focus with a contrasting FIELD instead — a box appearing around the text\n // (and the row growing to fit it) reads as the page jumping under the cursor.\n const fieldClass =\n 'h-auto rounded border-0 bg-muted px-1.5 py-0.5 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'\n\n const shared = {\n autoFocus: true,\n value: draft,\n placeholder,\n maxLength,\n 'aria-label': label,\n 'data-testid': testId && `${testId}-input`,\n onBlur: commit,\n onChange: (e: { target: { value: string } }) => setDraft(e.target.value),\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n cancel()\n } else if (e.key === 'Enter' && !multiline) {\n e.preventDefault()\n commit()\n }\n },\n }\n\n // Every row shares one minimum height: that of the small controls (h-7) a\n // row may carry at its trailing end. A row that is only text then sits in\n // the same rhythm as one holding a button, so the captions fall on an even\n // beat down the bar instead of bunching up wherever a row has no control.\n return (\n <div className={cn('flex min-h-7 min-w-0 gap-2', multiline ? 'items-start' : 'items-center')}>\n <dt\n className={cn(\n hideLabel\n ? 'sr-only'\n : cn('w-24 shrink-0 text-sm font-medium text-muted-foreground', multiline && 'pt-1')\n )}\n >\n {label}:\n </dt>\n {/* Wraps under sm: the trailing controls drop to their own line instead of overflowing. */}\n <dd className=\"flex min-w-0 flex-1 flex-wrap items-center gap-x-2 gap-y-1.5 sm:flex-nowrap\">\n {leading}\n {isEditing ? (\n <div className=\"relative min-w-0 flex-1 max-sm:basis-[calc(100%-2.5rem)]\">\n {multiline ? (\n <Textarea\n {...shared}\n rows={2}\n className={cn(fieldClass, 'min-h-0 resize-none leading-snug', valueClassName)}\n />\n ) : (\n <Input {...shared} className={cn(fieldClass, 'pr-20', valueClassName)} />\n )}\n {charsLeft !== null && charsLeft <= COUNTER_THRESHOLD && (\n <span\n className={cn(\n 'pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 text-sm lg:block',\n charsLeft < 0 ? 'text-destructive' : 'text-muted-foreground'\n )}\n data-testid={testId && `${testId}-counter`}\n >\n {charsLeft < 0 ? `${-charsLeft} over` : `${charsLeft} left`}\n </span>\n )}\n </div>\n ) : (\n // `identity-field` (not the generic `group`) scopes the pencil's hover\n // to THIS field only — an ancestor card also carries `group`, so a\n // `.group:hover` rule would reveal every field's pencil at once.\n <span className=\"identity-field flex min-w-0 flex-1 items-center gap-1.5 sm:flex-none\">\n {/* Same padding as the input above — the swap must not nudge the\n text sideways or change the row's height. */}\n <span className={cn('px-1.5 py-0.5', valueClassName)} data-testid={testId}>\n {value || <span className=\"italic text-muted-foreground\">{placeholder}</span>}\n </span>\n {canEdit && (\n <button\n type=\"button\"\n onClick={() => setIsEditing(true)}\n aria-label={`Edit ${label.toLowerCase()}`}\n title={`Edit ${label.toLowerCase()}`}\n // Quiet by default — the pencil only surfaces when the row is\n // hovered so it reads as clean text, and stays reachable by\n // keyboard (focus-visible).\n //\n // NB: use the ungated `[.identity-field:hover_&]` selector rather\n // than Tailwind's `group-hover:`. The latter compiles behind\n // `@media (hover: hover)`, so on a touchscreen (whose PRIMARY\n // pointer reports `hover: none`) the rule is disabled even when a\n // real mouse is firing hover events — the pencil then stays at\n // opacity-0 forever. The arbitrary selector has no media gate, so\n // it reveals on any genuine `:hover`.\n className=\"shrink-0 cursor-pointer rounded p-1 text-muted-foreground opacity-60 transition-[color,background-color,opacity] hover:bg-accent hover:text-foreground focus-visible:opacity-100 pointer-coarse:p-[15px] [.identity-field:hover_&]:opacity-100\"\n data-testid={testId && `${testId}-edit`}\n >\n <Pencil className=\"size-3.5\" />\n </button>\n )}\n </span>\n )}\n {trailing ? (\n <div className=\"min-w-0 shrink-0 max-sm:w-full sm:ml-auto\">{trailing}</div>\n ) : null}\n </dd>\n </div>\n )\n}\n","/**\n * The workspace activity feed's entries, as `GET /v1/workspace/{id}/activity` returns them, and what\n * each one says and opens. Everything a person is not pushed (uploads, other people's threads, runs)\n * can still be found here.\n */\n\nimport {\n DEFAULT_TASK_ACTIVITY_LABELS,\n taskActivityHeadline,\n type TaskActivityKind,\n} from '../agents/tasks/TaskActivityTimeline'\n\n/** Where an entry comes from. */\nexport type WorkspaceActivitySource = 'thread' | 'message' | 'document' | 'workflow'\n\n/** One entry of the feed (the shape of the API's `WorkspaceActivityEntry`). */\nexport interface WorkspaceActivityItem {\n external_id: string\n source: WorkspaceActivitySource\n /** A thread event kind, `message_posted`, `document_uploaded` / `_version` / `_signed`, `workflow_run`. */\n kind: string\n actor_ext_id?: string | null\n conversation_ext_id?: string | null\n /** Decrypted when the session has the workspace open, else null. */\n conversation_title?: string | null\n message_ext_id?: string | null\n document_ext_id?: string | null\n document_name?: string | null\n version?: number | null\n workflow_ext_id?: string | null\n workflow_name?: string | null\n /** A workflow run's status. */\n status?: string | null\n detail?: Record<string, unknown> | null\n created_at: string\n}\n\n/** What clicking an entry opens. */\nexport type WorkspaceActivityTarget =\n | { kind: 'thread'; conversationId: string; messageId?: string }\n | { kind: 'document'; documentId: string; version?: number }\n | { kind: 'workflow'; workflowId: string; conversationId?: string }\n\n/** The thread, document version or run an entry opens; null when it names nothing openable. */\nexport function workspaceActivityTarget(\n item: WorkspaceActivityItem\n): WorkspaceActivityTarget | null {\n switch (item.source) {\n case 'thread':\n case 'message':\n return item.conversation_ext_id\n ? {\n kind: 'thread',\n conversationId: item.conversation_ext_id,\n ...(item.message_ext_id ? { messageId: item.message_ext_id } : {}),\n }\n : null\n case 'document':\n if (!item.document_ext_id) return null\n // An upload is the document as it was first saved; a new version or a signature opens that version.\n return item.kind !== 'document_uploaded' && item.version\n ? { kind: 'document', documentId: item.document_ext_id, version: item.version }\n : { kind: 'document', documentId: item.document_ext_id }\n case 'workflow':\n return item.workflow_ext_id\n ? {\n kind: 'workflow',\n workflowId: item.workflow_ext_id,\n ...(item.conversation_ext_id ? { conversationId: item.conversation_ext_id } : {}),\n }\n : null\n default:\n return null\n }\n}\n\nconst quoted = (name: string | null | undefined, fallback: string) =>\n name ? `“${name}”` : fallback\n\n/** What happened, without who did it: \"Uploaded “Lease.pdf”\", \"Marked done in “Smith v Jones”\". */\nexport function workspaceActivityHeadline(item: WorkspaceActivityItem): string {\n const thread = quoted(item.conversation_title, 'a thread')\n const document = quoted(item.document_name, 'a document')\n switch (item.kind) {\n case 'message_posted':\n return `Posted in ${thread}`\n case 'document_uploaded':\n return `Uploaded ${document}`\n case 'document_version':\n return item.version\n ? `Saved version ${item.version} of ${document}`\n : `Saved a new version of ${document}`\n case 'document_signed':\n return `Signed ${document}`\n case 'workflow_run': {\n const run = `Ran ${quoted(item.workflow_name, 'a workflow')}`\n return item.status ? `${run} (${item.status.replace(/_/g, ' ')})` : run\n }\n default: {\n const headline = taskActivityHeadline(\n { kind: item.kind as TaskActivityKind, detail: item.detail },\n DEFAULT_TASK_ACTIVITY_LABELS\n )\n return `${headline} in ${thread}`\n }\n }\n}\n","import { assistantCopy, useAssistantCopy } from '@arbidocs/react/shell'\nimport type { ReactNode } from 'react'\nimport { Activity, FileText, MessageSquare, Workflow } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport {\n workspaceActivityHeadline,\n workspaceActivityTarget,\n type WorkspaceActivityItem,\n type WorkspaceActivitySource,\n type WorkspaceActivityTarget,\n} from './workspace-activity'\n\nexport interface WorkspaceActivityListLabels {\n empty: string\n loading: string\n error: string\n loadMore: string\n loadingMore: string\n retry: string\n /** Who did it when the entry names no one. */\n system: string\n}\n\nexport const DEFAULT_WORKSPACE_ACTIVITY_LABELS: WorkspaceActivityListLabels = {\n empty: 'Nothing has happened in this workspace yet.',\n loading: 'Loading activity…',\n error: 'Could not load the activity.',\n loadMore: 'Show older',\n loadingMore: 'Loading…',\n retry: 'Retry',\n system: assistantCopy().name,\n}\n\nexport interface WorkspaceActivityListProps {\n /** Entries, newest first (every page loaded so far). */\n items: readonly WorkspaceActivityItem[]\n isLoading?: boolean\n isError?: boolean\n /** Another page exists. */\n hasMore?: boolean\n isLoadingMore?: boolean\n onLoadMore?: () => void\n onRetry?: () => void\n /** Open what an entry is about: its thread, document version or run. */\n onOpen?: (target: WorkspaceActivityTarget, item: WorkspaceActivityItem) => void\n /** A person's or agent's display name by id. */\n nameOf?: (id: string) => string | undefined\n /** \"2 hours ago\"; default the local date and time. */\n formatTime?: (iso: string) => string\n labels?: Partial<WorkspaceActivityListLabels>\n className?: string\n testId?: string\n}\n\nconst ICONS: Record<WorkspaceActivitySource, ReactNode> = {\n thread: <Activity className=\"size-4\" aria-hidden />,\n message: <MessageSquare className=\"size-4\" aria-hidden />,\n document: <FileText className=\"size-4\" aria-hidden />,\n workflow: <Workflow className=\"size-4\" aria-hidden />,\n}\n\nconst localTime = (iso: string) => new Date(iso).toLocaleString()\n\n/** A workspace's activity, newest first, one line per entry; a line opens what it is about. */\nexport function WorkspaceActivityList({\n items,\n isLoading,\n isError,\n hasMore,\n isLoadingMore,\n onLoadMore,\n onRetry,\n onOpen,\n nameOf,\n formatTime = localTime,\n labels,\n className,\n testId = 'workspace-activity',\n}: WorkspaceActivityListProps) {\n const assistant = useAssistantCopy()\n const l = { ...DEFAULT_WORKSPACE_ACTIVITY_LABELS, system: assistant.name, ...labels }\n if (isLoading)\n return (\n <p className={cn('p-3 text-sm text-muted-foreground', className)} data-testid={testId}>\n {l.loading}\n </p>\n )\n if (isError && items.length === 0)\n return (\n <div\n className={cn('flex items-center gap-2 p-3 text-sm text-muted-foreground', className)}\n data-testid={testId}\n >\n <span role=\"alert\">{l.error}</span>\n {onRetry && (\n <Button size=\"sm\" variant=\"ghost\" onClick={onRetry}>\n {l.retry}\n </Button>\n )}\n </div>\n )\n if (items.length === 0)\n return (\n <p className={cn('p-3 text-sm text-muted-foreground', className)} data-testid={testId}>\n {l.empty}\n </p>\n )\n\n return (\n <div className={cn('flex flex-col', className)} data-testid={testId}>\n <ul className=\"divide-y divide-border\" data-testid={`${testId}-list`}>\n {items.map((item) => {\n const target = workspaceActivityTarget(item)\n const actor = item.actor_ext_id ? (nameOf?.(item.actor_ext_id) ?? null) : l.system\n const body = (\n <>\n <span className=\"mt-0.5 shrink-0 text-muted-foreground\">{ICONS[item.source]}</span>\n <span className=\"min-w-0 flex-1 text-sm\">\n {actor && <span className=\"font-medium\">{actor} </span>}\n <span className=\"text-muted-foreground\">{workspaceActivityHeadline(item)}</span>\n </span>\n <time\n dateTime={item.created_at}\n className=\"shrink-0 text-xs tabular-nums text-muted-foreground\"\n >\n {formatTime(item.created_at)}\n </time>\n </>\n )\n return (\n <li\n key={item.external_id}\n data-testid={`${testId}-item-${item.external_id}`}\n data-kind={item.kind}\n >\n {target && onOpen ? (\n <button\n type=\"button\"\n className=\"flex w-full items-start gap-3 px-3 py-2 text-left hover:bg-accent focus-visible:bg-accent focus-visible:outline-none\"\n onClick={() => onOpen(target, item)}\n >\n {body}\n </button>\n ) : (\n <div className=\"flex items-start gap-3 px-3 py-2\">{body}</div>\n )}\n </li>\n )\n })}\n </ul>\n {hasMore && onLoadMore && (\n <div className=\"flex justify-center p-2\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={isLoadingMore}\n onClick={onLoadMore}\n data-testid={`${testId}-load-more`}\n >\n {isLoadingMore ? l.loadingMore : l.loadMore}\n </Button>\n </div>\n )}\n </div>\n )\n}\n","/**\n * A table of tags as data: the rows are tags (every issue, every person, a label's children) with\n * their values and links, the columns their kind's fields in the workspace (its issue fields …),\n * and each row's linked documents, facts and threads its evidence. Pure helpers for `TagTable`: a\n * row's value, the gaps, and the snapshot as a Markdown document.\n */\n\nimport type { components } from '@arbidocs/client'\n\n/**\n * A column: one of the kind's fields. A `'tag'` field links to tags (its `options` are the kinds it\n * may point at; its value is a list of tag ids), e.g. a person's Organisation.\n */\nexport type TagTableField = components['schemas']['FieldDefinition']\nexport type TagTableFieldType = TagTableField['type']\n/** A field as written back to the kind (`id` keeps it and its values). */\nexport type TagTableFieldWrite = components['schemas']['FieldDefinitionWrite']\n/** A row: a tag, with its links (`include=links` on the list). */\nexport type TagTableRow = components['schemas']['TagResponse']\nexport type TagTableLinks = components['schemas']['TagLinks']\n\n/** What a table shows: the kind's fields as columns, and its tags as rows. */\nexport interface TagTableData {\n columns: TagTableField[]\n rows: TagTableRow[]\n}\n\nconst NO_LINKS: TagTableLinks = {\n docs: [],\n facts: [],\n threads: [],\n doc_count: 0,\n fact_count: 0,\n thread_count: 0,\n}\n\n/** A row's links (none when the list was read without them). */\nexport const rowLinks = (row: TagTableRow): TagTableLinks => row.links ?? NO_LINKS\n\n/** A row's value for a column (values are keyed by field id). */\nexport const cellValue = (row: TagTableRow, column: TagTableField): unknown =>\n row.field_values?.[column.id]\n\n/** A row with nothing behind it: no linked document, fact or thread. */\nexport const isGap = (row: TagTableRow): boolean => {\n const l = rowLinks(row)\n return l.doc_count + l.fact_count + l.thread_count === 0\n}\n\n/**\n * The tags a link field (`type: 'tag'`) points at: a list of tag ids (a single id is read as one;\n * anything else is none).\n */\nexport function linkedTagIds(value: unknown): string[] {\n if (typeof value === 'string') return value ? [value] : []\n return Array.isArray(value) ? value.filter((id): id is string => typeof id === 'string') : []\n}\n\n/** A value as text (a person or a linked tag by name, a checkbox as yes or no, blank as empty). */\nexport function cellText(\n value: unknown,\n column: Pick<TagTableField, 'type'>,\n nameOf?: (id: string) => string | undefined\n): string {\n if (value === undefined || value === null || value === '') return ''\n if (column.type === 'checkbox') return value ? 'Yes' : 'No'\n if (column.type === 'person' && typeof value === 'string') return nameOf?.(value) ?? value\n if (column.type === 'tag')\n return linkedTagIds(value)\n .map((id) => nameOf?.(id) ?? id)\n .join(', ')\n if (Array.isArray(value)) return value.map(String).join(', ')\n return String(value)\n}\n\n/** A typed input's text back as the value to store (`null` clears it). */\nexport function parseCell(text: string, type: TagTableFieldType): unknown {\n const t = text.trim()\n if (t === '') return null\n if (type === 'number') {\n const n = Number(t)\n return Number.isNaN(n) ? null : n\n }\n return t\n}\n\n/** The kind's fields as definitions to write back, every one kept by id. */\nexport const fieldWrites = (columns: readonly TagTableField[]): TagTableFieldWrite[] =>\n columns.map((c) => ({ id: c.id, name: c.name, type: c.type, options: c.options ?? null }))\n\nconst escapeCell = (text: string) => text.replace(/\\|/g, '\\\\|').replace(/\\n+/g, ' ')\n\nexport interface TagTableMarkdownOptions {\n title: string\n /** The evidence column's heading. */\n evidence?: string\n /** The row column's heading. */\n rowHeading?: string\n nameOf?: (id: string) => string | undefined\n /** When the snapshot was taken (ISO); default now. */\n at?: string\n}\n\n/**\n * The table as a Markdown document: a heading, when it was taken, and one table (a row per tag, a\n * column per field, then the evidence counts). What a host files or has signed.\n */\nexport function tagTableMarkdown(table: TagTableData, options: TagTableMarkdownOptions): string {\n const { columns } = table\n const heads = [\n options.rowHeading ?? 'Item',\n ...columns.map((c) => c.name),\n options.evidence ?? 'Evidence',\n ]\n const lines = [\n `# ${options.title}`,\n '',\n `_Snapshot taken ${new Date(options.at ?? Date.now()).toISOString().slice(0, 16).replace('T', ' ')} UTC_`,\n '',\n `| ${heads.map(escapeCell).join(' | ')} |`,\n `| ${heads.map(() => '---').join(' | ')} |`,\n ]\n for (const row of table.rows) {\n const l = rowLinks(row)\n const evidence = [\n `${l.doc_count} document${l.doc_count === 1 ? '' : 's'}`,\n `${l.fact_count} fact${l.fact_count === 1 ? '' : 's'}`,\n ...(l.thread_count ? [`${l.thread_count} thread${l.thread_count === 1 ? '' : 's'}`] : []),\n ].join(', ')\n const cells = [\n row.name,\n ...columns.map((c) => cellText(cellValue(row, c), c, options.nameOf)),\n evidence,\n ]\n lines.push(`| ${cells.map(escapeCell).join(' | ')} |`)\n }\n return `${lines.join('\\n')}\\n`\n}\n","/**\n * The columns of a table of tags — the fields of their kind in the workspace (its issue fields …) —\n * edited as one list: rename, reorder by position, add, remove, and a choice field's options. A kept\n * column keeps its id, so its values stay (its type is fixed once created). Saved in full through\n * the host (`onSave`); data-free.\n */\n\nimport { useState } from 'react'\nimport { ArrowDown, ArrowUp, Loader2, Plus, X } from 'lucide-react'\nimport { Button, Input, cn } from '@arbidocs/react/ui'\nimport type { TagTableField, TagTableFieldType, TagTableFieldWrite } from './tagTableModel'\n\nexport interface TagColumnsEditorLabels {\n title: string\n addColumn: string\n name: string\n type: string\n options: string\n optionsPlaceholder: string\n remove: string\n moveUp: string\n moveDown: string\n save: string\n saving: string\n cancel: string\n empty: string\n types: Record<TagTableFieldType, string>\n}\n\nexport const DEFAULT_TAG_COLUMNS_EDITOR_LABELS: TagColumnsEditorLabels = {\n title: 'Columns',\n addColumn: 'Add column',\n name: 'Column name',\n type: 'Type',\n options: 'Choices',\n optionsPlaceholder: 'Choices, comma-separated',\n remove: 'Remove column',\n moveUp: 'Move up',\n moveDown: 'Move down',\n save: 'Save columns',\n saving: 'Saving…',\n cancel: 'Cancel',\n empty: 'No columns.',\n types: {\n text: 'Text',\n number: 'Number',\n date: 'Date',\n checkbox: 'Yes / no',\n select: 'Choice',\n person: 'Person',\n document: 'Document',\n relation: 'Relation',\n lookup: 'Lookup',\n rollup: 'Rollup',\n tag: 'Link to tags',\n },\n}\n\n/** The types a tag's field can have. */\nconst TYPES: TagTableFieldType[] = ['text', 'number', 'date', 'checkbox', 'select', 'person']\n\ninterface Draft {\n id?: string\n name: string\n type: TagTableFieldType\n options: string\n}\n\nconst toDraft = (f: TagTableField): Draft => ({\n id: f.id,\n name: f.name,\n type: f.type,\n options: (f.options ?? []).join(', '),\n})\n\nconst toWrite = (d: Draft): TagTableFieldWrite => ({\n ...(d.id ? { id: d.id } : {}),\n name: d.name.trim(),\n type: d.type,\n options:\n d.type === 'tag'\n ? d.options\n .split(',')\n .map((o) => o.trim())\n .filter(Boolean)\n : d.type === 'select'\n ? d.options\n .split(',')\n .map((o) => o.trim())\n .filter(Boolean)\n : null,\n})\n\nexport interface TagColumnsEditorProps {\n columns: TagTableField[]\n /** Save the columns in full; a rejection (e.g. two columns of one name) stays on screen. */\n onSave: (fields: TagTableFieldWrite[]) => void | Promise<unknown>\n onCancel: () => void\n labels?: Partial<TagColumnsEditorLabels>\n className?: string\n testId?: string\n}\n\nexport function TagColumnsEditor({\n columns,\n onSave,\n onCancel,\n labels,\n className,\n testId = 'tag-columns',\n}: TagColumnsEditorProps) {\n const l = { ...DEFAULT_TAG_COLUMNS_EDITOR_LABELS, ...labels }\n const [drafts, setDrafts] = useState<Draft[]>(() => columns.map(toDraft))\n const [saving, setSaving] = useState(false)\n const patch = (i: number, change: Partial<Draft>) =>\n setDrafts((ds) => ds.map((d, j) => (j === i ? { ...d, ...change } : d)))\n const move = (i: number, by: number) =>\n setDrafts((ds) => {\n const next = [...ds]\n const [d] = next.splice(i, 1)\n next.splice(i + by, 0, d)\n return next\n })\n const valid = drafts.every(\n (d) => d.name.trim() && (d.type !== 'select' || toWrite(d).options?.length)\n )\n const input =\n 'h-8 rounded-md border border-input bg-background px-2 text-sm focus:outline-none focus:ring-1 focus:ring-ring'\n\n return (\n <form\n className={cn('space-y-2 rounded-lg border border-border p-3', className)}\n onSubmit={async (e) => {\n e.preventDefault()\n if (!valid) return\n setSaving(true)\n try {\n await onSave(drafts.map(toWrite))\n } finally {\n setSaving(false)\n }\n }}\n data-testid={testId}\n >\n <h3 className=\"text-sm font-semibold\">{l.title}</h3>\n {drafts.length === 0 && <p className=\"text-sm text-muted-foreground\">{l.empty}</p>}\n <ul className=\"space-y-2\">\n {drafts.map((d, i) => (\n <li\n key={d.id ?? `new-${i}`}\n className=\"flex flex-wrap items-center gap-2\"\n data-testid={`${testId}-column-${i}`}\n >\n <Input\n className=\"h-8 w-48\"\n value={d.name}\n placeholder={l.name}\n aria-label={l.name}\n onChange={(e) => patch(i, { name: e.target.value })}\n data-testid={`${testId}-name-${i}`}\n />\n <select\n className={cn(input, 'w-32')}\n value={d.type}\n // A column's type is fixed once it exists: its values were written for it.\n disabled={!!d.id}\n aria-label={l.type}\n onChange={(e) => patch(i, { type: e.target.value as TagTableFieldType })}\n data-testid={`${testId}-type-${i}`}\n >\n {(TYPES.includes(d.type) ? TYPES : [d.type, ...TYPES]).map((t) => (\n <option key={t} value={t}>\n {l.types[t]}\n </option>\n ))}\n </select>\n {d.type === 'select' && (\n <Input\n className=\"h-8 min-w-48 flex-1\"\n value={d.options}\n placeholder={l.optionsPlaceholder}\n aria-label={l.options}\n onChange={(e) => patch(i, { options: e.target.value })}\n data-testid={`${testId}-options-${i}`}\n />\n )}\n <div className=\"ml-auto flex items-center\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={i === 0}\n aria-label={l.moveUp}\n onClick={() => move(i, -1)}\n >\n <ArrowUp className=\"size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={i === drafts.length - 1}\n aria-label={l.moveDown}\n onClick={() => move(i, 1)}\n >\n <ArrowDown className=\"size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={l.remove}\n onClick={() => setDrafts((ds) => ds.filter((_, j) => j !== i))}\n data-testid={`${testId}-remove-${i}`}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n </li>\n ))}\n </ul>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setDrafts((ds) => [...ds, { name: '', type: 'text', options: '' }])}\n data-testid={`${testId}-add`}\n >\n <Plus className=\"size-4\" /> {l.addColumn}\n </Button>\n <div className=\"ml-auto flex items-center gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n {l.cancel}\n </Button>\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={!valid || saving}\n data-testid={`${testId}-save`}\n >\n {saving && <Loader2 className=\"size-4 animate-spin\" />}\n {saving ? l.saving : l.save}\n </Button>\n </div>\n </div>\n </form>\n )\n}\n","/**\n * A table of tags (every issue, every person, a label's children): one row per tag, a column per\n * field of their kind in the workspace, editable in place by type (text, number, date, checkbox,\n * choice, person, a link to other tags), and counts of the documents,\n * facts and threads tagged with each row. A count opens its filtered content page. A row with nothing tagged yet is a normal row with an empty\n * cell. Rows and columns can be added (the columns are the kind's fields, edited as one list), and\n * the table exported as a Word document snapshot (filed in the workspace) or downloaded.\n * The data and every write come from the host (`ConnectedTagTable` binds them to ARBI).\n */\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport {\n ArrowUpRight,\n ChevronDown,\n Download,\n FileDown,\n FileText,\n Lightbulb,\n Loader2,\n MessagesSquare,\n MoreHorizontal,\n Plus,\n SlidersHorizontal,\n} from 'lucide-react'\nimport {\n Button,\n TagEntity,\n Checkbox,\n Input,\n cn,\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from '@arbidocs/react/ui'\nimport type { ColDef, ICellRendererParams } from 'ag-grid-community'\nimport { GridView } from '../files/GridView'\nimport {\n cellText,\n cellValue,\n isGap,\n linkedTagIds,\n parseCell,\n rowLinks,\n type TagTableData,\n type TagTableField,\n type TagTableFieldWrite,\n type TagTableRow,\n} from './tagTableModel'\nimport { TagColumnsEditor, type TagColumnsEditorLabels } from './TagColumnsEditor'\n\nexport interface TagTableLabels {\n row: string\n evidence: string\n /** `{count}` documents linked. */\n documents: string\n /** `{count}` facts linked. */\n facts: string\n /** `{count}` threads linked. */\n threads: string\n /** One document, one fact, one thread. */\n document: string\n fact: string\n thread: string\n /** A thread without a title. */\n untitledThread: string\n /** `{count}` more links than shown. */\n more: string\n addRow: string\n addRowPlaceholder: string\n add: string\n export: string\n exporting: string\n download: string\n empty: string\n loading: string\n noColumns: string\n choose: string\n yes: string\n /** Opens the column editor. */\n moreActions: string\n editColumns: string\n /** The column editor's own labels. */\n columns?: Partial<TagColumnsEditorLabels>\n}\n\nexport const DEFAULT_TAG_TABLE_LABELS: TagTableLabels = {\n row: 'Item',\n evidence: 'Tagged items',\n documents: '{count} documents',\n facts: '{count} facts',\n threads: '{count} threads',\n document: '1 document',\n fact: '1 fact',\n thread: '1 thread',\n untitledThread: 'Untitled thread',\n more: '+{count} more',\n addRow: 'Add row',\n addRowPlaceholder: 'Name of the new row',\n add: 'Add',\n export: 'Save as Word document',\n download: 'Download .docx',\n exporting: 'Exporting…',\n empty: 'No rows yet.',\n loading: 'Loading…',\n noColumns: 'No columns yet: add one to give each row a value.',\n choose: '—',\n yes: 'Yes',\n editColumns: 'Columns',\n moreActions: 'More',\n}\n\nexport type TagContentKind = 'documents' | 'facts' | 'threads'\n\nexport interface TagTableProps {\n /** The kind's fields (the columns) and its tags (the rows, with their links). */\n table: TagTableData | undefined\n isLoading?: boolean\n /**\n * Change one cell (`null` clears it). Absent: read only. A promise that rejects means the value\n * was not saved: the cell shows the stored value again (the host tells the person why).\n */\n onChangeValue?: (tagId: string, fieldId: string, value: unknown) => void | Promise<unknown>\n /** Add a row (a new tag of the kind). Absent: no \"Add row\". */\n onAddRow?: (name: string) => void | Promise<unknown>\n /**\n * Set the columns (the kind's fields) in full: a kept column has its `id`. Absent: the columns\n * are fixed.\n */\n onChangeColumns?: (fields: TagTableFieldWrite[]) => void | Promise<unknown>\n /** Open a linked document. */\n onOpenDocument?: (documentId: string) => void\n /** Open a linked fact. */\n onOpenFact?: (factId: string) => void\n /** Open a linked thread (conversation). */\n onOpenThread?: (conversationId: string) => void\n /** Open a row's tag (everything tagged with it). */\n onOpenRow?: (tagId: string) => void\n /** Open the relevant content page filtered by this tag. */\n onOpenTaggedItems?: (tagId: string, kind: TagContentKind) => void\n /** Export the table as it stands (filed as a document). Absent: no export button. */\n onExport?: () => void | Promise<unknown>\n /** Download the table as it stands as a file. Absent: no download button. */\n onDownload?: () => void | Promise<unknown>\n /** Who a person column offers. */\n people?: ReadonlyArray<{ value: string; label: string }>\n /**\n * The tags a link column (`type: 'tag'`) offers — each with its kind; a column offers those of\n * the kinds in its `options` — and names its values by.\n */\n tags?: ReadonlyArray<{ value: string; label: string; kind: string }>\n /** Open a linked tag (a link column's value). */\n onOpenTag?: (tagId: string) => void\n /** Extra controls in the toolbar. */\n actions?: ReactNode\n /** Secondary controls shown inside More, beside column setup and exports. */\n secondaryActions?: ReactNode\n labels?: Partial<TagTableLabels>\n className?: string\n testId?: string\n}\n\n/**\n * The shared GridView keeps the row name pinned, followed by tagged content and sortable fields.\n * Rows fit their content and use the page scroll, preserving the existing table layout. Long names wrap in their column (cut after\n * three lines, in full in the tooltip) and tagged-item chips wrap, so nothing runs into the next\n * column or off the page. Only a matrix with very many fields scrolls, inside its own box.\n */\nconst ROW_LABEL = 'line-clamp-3 whitespace-normal break-words'\n\n/**\n * One editable field value of a tag, by its type: committed on blur or Enter (a checkbox and a\n * choice at once). A table cell, and a field of a single tag's form (`TagDetail`).\n */\nexport function TagTableCell({\n row,\n column,\n people,\n tags,\n onOpenTag,\n onChange,\n l,\n testId,\n}: {\n row: TagTableRow\n column: TagTableField\n people?: TagTableProps['people']\n tags?: TagTableProps['tags']\n onOpenTag?: TagTableProps['onOpenTag']\n onChange?: TagTableProps['onChangeValue']\n l: TagTableLabels\n testId: string\n}) {\n const value = cellValue(row, column)\n const nameOf = (id: string) =>\n (column.type === 'tag' ? tags : people)?.find((p) => p.value === id)?.label\n const shown = cellText(value, column, nameOf)\n const stored = cellText(value, column)\n const [draft, setDraft] = useState(shown)\n const storedRef = useRef(stored)\n const draftRef = useRef(draft)\n draftRef.current = draft\n // The field being typed in, and the stored text its draft started from.\n const editing = useRef<{ from: string } | null>(null)\n // The draft follows the stored value's text, not object identities: a refetch or a column\n // rebuild hands an equal field or value as a new object, and must not wipe what is being typed.\n // A new stored value (someone else's change) replaces the draft unless the person is typing a\n // change of their own: theirs is kept, and saved over it when they leave the field.\n useEffect(() => {\n storedRef.current = stored\n const typing = editing.current\n if (typing && draftRef.current !== typing.from) return\n if (typing) typing.from = stored\n setDraft(stored)\n }, [stored])\n // A save the host refuses (its promise rejects; the host tells the person why) puts the stored\n // value back, so unsaved text never looks saved.\n const set = (next: unknown) => {\n const saving = onChange?.(row.external_id, column.id, next)\n if (saving instanceof Promise) saving.catch(() => setDraft(storedRef.current))\n }\n\n if (column.type === 'tag')\n return (\n <TagLinkCell\n row={row}\n column={column}\n tags={tags}\n onOpenTag={onOpenTag}\n onChange={onChange ? set : undefined}\n l={l}\n testId={testId}\n />\n )\n if (!onChange)\n return (\n <span className=\"block truncate\" title={shown} data-testid={testId}>\n {shown || <span className=\"text-muted-foreground\">{l.choose}</span>}\n </span>\n )\n const field =\n 'h-8 w-full min-w-0 rounded-md border border-transparent bg-transparent px-1.5 text-sm hover:border-input focus:border-input focus:bg-background focus:outline-none'\n switch (column.type) {\n case 'checkbox':\n return (\n <Checkbox\n checked={value === true}\n onCheckedChange={(v) => set(v === true)}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n />\n )\n case 'select':\n case 'person': {\n const options =\n column.type === 'select'\n ? (column.options ?? []).map((o) => ({ value: o, label: o }))\n : (people ?? [])\n return (\n <select\n className={cn(field, 'pr-6')}\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => set(e.target.value || null)}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n >\n <option value=\"\">{l.choose}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n {typeof value === 'string' && value && !options.some((o) => o.value === value) && (\n <option value={value}>{value}</option>\n )}\n </select>\n )\n }\n default: {\n const commit = () => {\n if (draft !== stored) set(parseCell(draft, column.type))\n }\n return (\n <input\n className={cn(field, 'pr-6')}\n type={column.type === 'number' ? 'number' : column.type === 'date' ? 'date' : 'text'}\n value={column.type === 'date' ? draft.slice(0, 10) : draft}\n onChange={(e) => setDraft(e.target.value)}\n onFocus={() => (editing.current = { from: stored })}\n onBlur={() => {\n editing.current = null\n commit()\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur()\n if (e.key === 'Escape') setDraft(stored)\n }}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n />\n )\n }\n }\n}\n\n/**\n * A link field's value: the linked tags as chips that open them, and (editable) a choice among the\n * tags of the kinds the field allows. One link at a time; the value is stored as a list.\n */\nfunction TagLinkCell({\n row,\n column,\n tags,\n onOpenTag,\n onChange,\n l,\n testId,\n}: {\n row: TagTableRow\n column: TagTableField\n tags?: TagTableProps['tags']\n onOpenTag?: TagTableProps['onOpenTag']\n onChange?: (next: unknown) => void\n l: TagTableLabels\n testId: string\n}) {\n const ids = linkedTagIds(cellValue(row, column))\n const kinds = column.options ?? []\n const options = (tags ?? []).filter(\n (t) => t.value !== row.external_id && (kinds.length === 0 || kinds.includes(t.kind))\n )\n const label = (id: string) => tags?.find((t) => t.value === id)?.label ?? id\n const chips = ids.map((id) =>\n onOpenTag ? (\n <button\n key={id}\n type=\"button\"\n onClick={() => onOpenTag(id)}\n className=\"inline-flex min-w-0 max-w-full items-center focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid={`${testId}-link-${id}`}\n >\n <TagEntity tag={{ external_id: id, name: label(id) }} showTooltip={false} wrap />\n </button>\n ) : (\n <span\n key={id}\n className=\"inline-flex min-w-0 max-w-full\"\n data-testid={`${testId}-link-${id}`}\n >\n <TagEntity tag={{ external_id: id, name: label(id) }} showTooltip={false} wrap />\n </span>\n )\n )\n if (!onChange)\n return (\n <span className=\"flex min-w-0 flex-wrap gap-1\" data-testid={testId}>\n {chips.length ? chips : <span className=\"text-muted-foreground\">{l.choose}</span>}\n </span>\n )\n const current = ids[0]\n // The linked name is text that wraps (a narrow column never cuts it to \"Acm…\"), and opens the\n // tag; the picker behind the chevron changes it.\n return (\n // Wraps: in a narrow column the name breaks between words and the picker moves below it.\n <span className=\"flex min-w-0 flex-wrap items-center gap-x-1 py-1\">\n {current &&\n (onOpenTag ? (\n <button\n type=\"button\"\n onClick={() => onOpenTag(current)}\n className=\"max-w-full rounded px-1 text-left text-sm break-words hover:text-primary hover:underline focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={`Open ${label(current)}`}\n title={`Open ${label(current)}`}\n data-testid={`${testId}-open`}\n >\n <TagEntity\n tag={{ external_id: current, name: label(current) }}\n showTooltip={false}\n wrap\n />\n <ArrowUpRight className=\"ml-0.5 inline size-3.5 align-[-2px] text-muted-foreground\" />\n </button>\n ) : (\n <TagEntity\n tag={{ external_id: current, name: label(current) }}\n showTooltip={false}\n wrap\n />\n ))}\n <span\n className={cn(\n 'relative inline-flex h-6 shrink-0 items-center rounded text-muted-foreground hover:bg-muted hover:text-foreground focus-within:ring-2 focus-within:ring-ring',\n current ? 'w-6 justify-center' : 'min-w-0 flex-1 gap-1 px-1 text-sm'\n )}\n title={current ? `${column.name}: ${label(current)}` : undefined}\n >\n {!current && <span className=\"truncate\">{l.choose}</span>}\n <ChevronDown className=\"size-3.5 shrink-0\" />\n <select\n className=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\n value={current ?? ''}\n onChange={(e) => onChange(e.target.value ? [e.target.value] : null)}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n >\n <option value=\"\">{l.choose}</option>\n {options.map((t) => (\n <option key={t.value} value={t.value}>\n {t.label}\n </option>\n ))}\n {current && !options.some((t) => t.value === current) && (\n <option value={current}>{label(current)}</option>\n )}\n </select>\n </span>\n </span>\n )\n}\n\n/** A count as a phrase: \"1 document\", \"3 facts\", or nothing for none. */\nconst countText = (count: number, one: string, many: string) =>\n count === 1 ? one : count ? many.replace('{count}', String(count)) : null\n\n/** Counts open the existing content pages filtered by this tag. No item previews. */\nexport function TagContentCounts({\n row,\n l,\n onOpenTaggedItems,\n onOpenRow,\n testId,\n}: {\n row: TagTableRow\n l: TagTableLabels\n onOpenTaggedItems?: TagTableProps['onOpenTaggedItems']\n onOpenRow?: TagTableProps['onOpenRow']\n testId: string\n}) {\n if (isGap(row)) return null\n const links = rowLinks(row)\n const groups = [\n {\n kind: 'documents' as const,\n count: links.doc_count,\n label: countText(links.doc_count, l.document, l.documents),\n Icon: FileText,\n },\n {\n kind: 'facts' as const,\n count: links.fact_count,\n label: countText(links.fact_count, l.fact, l.facts),\n Icon: Lightbulb,\n },\n {\n kind: 'threads' as const,\n count: links.thread_count,\n label: countText(links.thread_count, l.thread, l.threads),\n Icon: MessagesSquare,\n },\n ].filter((group) => group.count > 0)\n return (\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1\" data-testid={testId}>\n {groups.map(({ kind, label, Icon }, index) => (\n <span key={kind} className=\"inline-flex items-center gap-2\">\n {index > 0 && (\n <span aria-hidden className=\"text-muted-foreground\">\n {' · '}\n </span>\n )}\n {onOpenTaggedItems || onOpenRow ? (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 text-sm text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid={`${testId}-${kind}`}\n title={`Show ${label} tagged “${row.name}”`}\n onClick={() =>\n onOpenTaggedItems\n ? onOpenTaggedItems(row.external_id, kind)\n : onOpenRow?.(row.external_id)\n }\n >\n <Icon className=\"size-3.5\" />\n {label}\n </button>\n ) : (\n <span className=\"inline-flex items-center gap-1 text-sm text-muted-foreground\">\n <Icon className=\"size-3.5\" />\n {label}\n </span>\n )}\n </span>\n ))}\n </div>\n )\n}\n\n/*\n * The table's cell renderers are module-level components given to AG Grid as they are, with what\n * they need as `cellRendererParams`: one component type across column rebuilds, so a rebuild (the\n * host's callbacks are often new on each render) re-renders the cells in place. A renderer made\n * inside the columns memo was a new type per rebuild, and every cell, the field being typed in\n * included, was remounted (#2240's class of bug).\n */\n\ninterface TagRowNameParams {\n onOpenRow?: TagTableProps['onOpenRow']\n testId: string\n}\n\nfunction TagRowNameRenderer({\n data: row,\n onOpenRow,\n testId,\n}: ICellRendererParams<TagTableRow> & TagRowNameParams) {\n if (!row) return null\n return onOpenRow ? (\n <button\n type=\"button\"\n className={cn(ROW_LABEL, 'text-left font-medium hover:text-primary hover:underline')}\n title={row.name}\n onClick={() => onOpenRow(row.external_id)}\n data-testid={`${testId}-row-${row.external_id}-label`}\n >\n <TagEntity tag={row} showTooltip={false} wrap />\n </button>\n ) : (\n <span\n className={cn(ROW_LABEL, 'font-medium')}\n title={row.name}\n data-testid={`${testId}-row-${row.external_id}-label`}\n >\n <TagEntity tag={row} showTooltip={false} wrap />\n </span>\n )\n}\n\ninterface TagEvidenceParams {\n l: TagTableLabels\n onOpenRow?: TagTableProps['onOpenRow']\n onOpenTaggedItems?: TagTableProps['onOpenTaggedItems']\n testId: string\n}\n\nfunction TagEvidenceRenderer({\n data: row,\n l,\n onOpenRow,\n onOpenTaggedItems,\n testId,\n}: ICellRendererParams<TagTableRow> & TagEvidenceParams) {\n if (!row) return null\n return (\n <TagContentCounts\n row={row}\n l={l}\n onOpenRow={onOpenRow}\n onOpenTaggedItems={onOpenTaggedItems}\n testId={`${testId}-evidence-${row.external_id}`}\n />\n )\n}\n\ninterface TagFieldParams {\n /** The tag field shown (not `column`: AG Grid passes its own column under that name). */\n field: TagTableField\n people?: TagTableProps['people']\n tags?: TagTableProps['tags']\n onOpenTag?: TagTableProps['onOpenTag']\n onChangeValue?: TagTableProps['onChangeValue']\n l: TagTableLabels\n testId: string\n}\n\nfunction TagFieldRenderer({\n data: row,\n field,\n people,\n tags,\n onOpenTag,\n onChangeValue,\n l,\n testId,\n}: ICellRendererParams<TagTableRow> & TagFieldParams) {\n if (!row) return null\n return (\n <TagTableCell\n row={row}\n column={field}\n people={people}\n tags={tags}\n onOpenTag={onOpenTag}\n onChange={onChangeValue}\n l={l}\n testId={`${testId}-cell-${row.external_id}-${field.id}`}\n />\n )\n}\n\nexport function TagTable({\n table,\n isLoading,\n onChangeValue,\n onAddRow,\n onChangeColumns,\n onOpenRow,\n onOpenTaggedItems,\n onExport,\n onDownload,\n people,\n tags,\n onOpenTag,\n actions,\n secondaryActions,\n labels,\n className,\n testId = 'tag-table',\n}: TagTableProps) {\n const l = useMemo(() => ({ ...DEFAULT_TAG_TABLE_LABELS, ...labels }), [labels])\n const columns = useMemo(() => table?.columns ?? [], [table])\n const rows = table?.rows ?? []\n const [editingColumns, setEditingColumns] = useState(false)\n const [name, setName] = useState('')\n const [adding, setAdding] = useState(false)\n const [exporting, setExporting] = useState(false)\n\n const add = async () => {\n const n = name.trim()\n if (!n || !onAddRow) return\n setAdding(true)\n try {\n await onAddRow(n)\n setName('')\n } finally {\n setAdding(false)\n }\n }\n\n const columnDefs = useMemo<ColDef<TagTableRow>[]>(\n () => [\n {\n colId: 'name',\n headerName: l.row,\n field: 'name',\n width: 176,\n minWidth: 160,\n pinned: 'left',\n sortable: true,\n filter: false,\n autoHeight: true,\n cellClass: 'px-3! py-2! leading-normal!',\n cellRenderer: TagRowNameRenderer,\n cellRendererParams: { onOpenRow, testId } satisfies TagRowNameParams,\n },\n {\n colId: 'evidence',\n headerName: l.evidence,\n width: 250,\n minWidth: 224,\n flex: 1,\n sortable: true,\n filter: false,\n autoHeight: true,\n cellClass: 'px-3! py-2! leading-normal!',\n valueGetter: ({ data }) => {\n if (!data) return 0\n const links = rowLinks(data)\n return links.doc_count + links.fact_count + links.thread_count\n },\n cellRenderer: TagEvidenceRenderer,\n cellRendererParams: { l, onOpenRow, onOpenTaggedItems, testId } satisfies TagEvidenceParams,\n },\n ...columns.map((column): ColDef<TagTableRow> => ({\n colId: column.id,\n headerName: column.name,\n flex: 1,\n minWidth: 150,\n sortable: true,\n filter: false,\n // These are native inline editors: let their caret, select and checkbox keys work.\n suppressKeyboardEvent: ({ event }) =>\n event.target instanceof HTMLElement &&\n Boolean(\n event.target.closest(\n 'input, select, textarea, button, [role=\"checkbox\"], [role=\"combobox\"]'\n )\n ),\n cellClass: 'px-1.5! py-1! leading-normal!',\n valueGetter: ({ data }) => {\n if (!data) return null\n const value = cellValue(data, column)\n if (value == null || value === '') return null\n if (column.type === 'number') return Number(value)\n if (column.type === 'checkbox') return value ? 1 : 0\n return cellText(\n value,\n column,\n (id) =>\n people?.find((p) => p.value === id)?.label ?? tags?.find((t) => t.value === id)?.label\n )\n },\n cellRenderer: TagFieldRenderer,\n cellRendererParams: {\n field: column,\n people,\n tags,\n onOpenTag,\n onChangeValue,\n l,\n testId,\n } satisfies TagFieldParams,\n })),\n ],\n [columns, l, people, tags, onOpenRow, onOpenTaggedItems, onOpenTag, onChangeValue, testId]\n )\n\n return (\n <div className={cn('space-y-3', className)} data-testid={testId}>\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"ml-auto flex flex-wrap items-center gap-2\">\n {actions}\n {(secondaryActions || onChangeColumns || onDownload || onExport) && (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={l.moreActions}\n data-testid={`${testId}-more`}\n >\n <MoreHorizontal className=\"size-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"flex w-auto min-w-48 flex-col items-stretch gap-1 p-2\"\n >\n {secondaryActions}\n {onChangeColumns && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"justify-start\"\n onClick={() => setEditingColumns((v) => !v)}\n data-testid={`${testId}-edit-columns`}\n >\n <SlidersHorizontal className=\"size-4\" /> {l.editColumns}\n </Button>\n )}\n {onExport && (\n <Button\n disabled={exporting || rows.length === 0}\n variant=\"ghost\"\n size=\"sm\"\n className=\"justify-start\"\n onClick={() => {\n setExporting(true)\n void Promise.resolve()\n .then(() => onExport())\n .finally(() => setExporting(false))\n }}\n data-testid={`${testId}-export`}\n >\n {exporting ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <FileDown className=\"size-4\" />\n )}\n {exporting ? l.exporting : l.export}\n </Button>\n )}\n {onDownload && (\n <Button\n disabled={rows.length === 0}\n variant=\"ghost\"\n size=\"sm\"\n className=\"justify-start\"\n onClick={() => void onDownload()}\n data-testid={`${testId}-download`}\n >\n <Download className=\"size-4\" /> {l.download}\n </Button>\n )}\n </PopoverContent>\n </Popover>\n )}\n </div>\n </div>\n\n {editingColumns && onChangeColumns && (\n <TagColumnsEditor\n columns={columns}\n labels={l.columns}\n onCancel={() => setEditingColumns(false)}\n onSave={async (fields) => {\n await onChangeColumns(fields)\n setEditingColumns(false)\n }}\n testId={`${testId}-columns`}\n />\n )}\n\n {onAddRow && (\n <form\n className=\"flex max-w-md items-center gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n void add()\n }}\n >\n <Input\n value={name}\n placeholder={l.addRowPlaceholder}\n aria-label={l.addRow}\n onChange={(e) => setName(e.target.value)}\n data-testid={`${testId}-add-name`}\n />\n <Button\n type=\"submit\"\n size=\"sm\"\n variant=\"outline\"\n disabled={!name.trim() || adding}\n data-testid={`${testId}-add`}\n >\n <Plus className=\"size-4\" /> {l.addRow}\n </Button>\n </form>\n )}\n\n {isLoading ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {l.loading}\n </p>\n ) : (\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <GridView\n items={rows}\n columnDefs={columnDefs}\n getItemId={(row) => row.external_id}\n height=\"auto\"\n emptyState={{ title: l.empty }}\n gridOptions={{\n ensureDomOrder: true,\n domLayout: 'autoHeight',\n }}\n getRowTestId={(row) => `${testId}-row-${row.external_id}`}\n testId={`${testId}-table`}\n />\n {columns.length === 0 && rows.length > 0 && (\n <p className=\"border-t border-border px-3 py-2 text-xs text-muted-foreground\">\n {l.noColumns}\n </p>\n )}\n </div>\n )}\n </div>\n )\n}\n","/**\n * One tag in full: its values for its kind's fields (position, role, status, …) editable in place,\n * then everything across the workspace that carries it — the documents (with the value or note the\n * tag has on each, and how many passages back it), the facts and the threads. The data is the tag\n * read with its links (`TagTableRow`) and its kind's fields; every write goes back through the host.\n * Laid out with the shared detail parts (`DetailPanel`), as a database row is.\n */\n\nimport type { ReactNode } from 'react'\nimport { FileText, Lightbulb, MessagesSquare } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport {\n DetailBody,\n DetailEmpty,\n DetailField,\n DetailFields,\n DetailLinkItem,\n DetailLinkList,\n DetailLoading,\n DetailSection,\n} from '../components/DetailPanel'\nimport {\n DEFAULT_TAG_TABLE_LABELS,\n TagTableCell,\n TagContentCounts,\n type TagTableLabels,\n type TagTableProps,\n} from './TagTable'\nimport { rowLinks, type TagTableField, type TagTableRow } from './tagTableModel'\n\nexport interface TagDetailLabels {\n fields: string\n documents: string\n facts: string\n threads: string\n /** `{shown}` of `{count}` listed. */\n showing: string\n noDocuments: string\n noFacts: string\n /** An annotation with no value on a document. */\n noValue: string\n noThreads: string\n untitledThread: string\n /** When a thread was last active: `{date}`. */\n threadUpdated: string\n /** `{count}` passages cited. */\n passages: string\n passage: string\n loading: string\n}\n\nexport const DEFAULT_TAG_DETAIL_LABELS: TagDetailLabels = {\n fields: 'Fields',\n documents: 'Documents',\n facts: 'Facts',\n threads: 'Threads',\n showing: 'Showing {shown} of {count}',\n noDocuments: 'No document carries this tag yet.',\n noFacts: 'No fact carries this tag yet.',\n noValue: 'No note',\n noThreads: 'No thread carries this tag yet.',\n untitledThread: 'Untitled thread',\n threadUpdated: 'Updated {date}',\n passages: '{count} passages',\n passage: '1 passage',\n loading: 'Loading…',\n}\n\nexport interface TagDetailProps extends Pick<\n TagTableProps,\n | 'onChangeValue'\n | 'onOpenTaggedItems'\n | 'onOpenDocument'\n | 'onOpenFact'\n | 'onOpenThread'\n | 'people'\n | 'tags'\n | 'onOpenTag'\n> {\n /** The tag with its values and links (documents, facts, threads). */\n row: TagTableRow | undefined\n /** Its kind's fields in the workspace (none: no Fields section). */\n fields?: TagTableField[]\n /**\n * What the tag's note on a document is, e.g. \"Note\" for an annotation or \"Role\" for a person.\n * Given, each document row names it before the note.\n */\n noteLabel?: string\n /**\n * The note is the point of the row (an annotation's value): shown prominently, and a document\n * without one says so.\n */\n noteIsValue?: boolean\n /**\n * Render a document's cited passages in place of the plain \"N passages\" count (e.g. a popover\n * listing them); `label` is that count's text. Called only for a document with passages.\n */\n renderPassages?: (\n doc: { doc_ext_id: string; citations_count: number },\n label: string\n ) => ReactNode\n isLoading?: boolean\n labels?: Partial<TagDetailLabels>\n /** Labels of the field inputs (the empty choice). */\n fieldLabels?: Partial<TagTableLabels>\n className?: string\n testId?: string\n}\n\n/** A timestamp as a day in the viewer's locale (\"18 Oct 2026\"). */\nconst formatDay = (iso: string) => {\n const at = new Date(iso)\n return Number.isNaN(at.getTime())\n ? iso\n : at.toLocaleDateString(undefined, { day: 'numeric', month: 'short', year: 'numeric' })\n}\n\nexport function TagDetail({\n row,\n fields = [],\n isLoading,\n people,\n tags,\n onOpenTag,\n onChangeValue,\n onOpenDocument,\n onOpenFact,\n onOpenThread,\n onOpenTaggedItems,\n noteLabel,\n noteIsValue = false,\n renderPassages,\n labels,\n fieldLabels,\n className,\n testId = 'tag-detail',\n}: TagDetailProps) {\n const l = { ...DEFAULT_TAG_DETAIL_LABELS, ...labels }\n const cellLabels = { ...DEFAULT_TAG_TABLE_LABELS, ...fieldLabels }\n if (isLoading || !row) return <DetailLoading label={l.loading} />\n const links = rowLinks(row)\n const docs = links.docs ?? []\n const facts = links.facts ?? []\n const threads = links.threads ?? []\n const passages = (n: number) => (n === 1 ? l.passage : l.passages.replace('{count}', String(n)))\n\n return (\n <DetailBody className={className} testId={testId}>\n {onOpenTaggedItems ? (\n <TagContentCounts\n row={row}\n l={cellLabels}\n onOpenTaggedItems={onOpenTaggedItems}\n testId={`${testId}-counts`}\n />\n ) : (\n <>\n <DetailSection\n title={l.documents}\n count={links.doc_count}\n shown={docs.length}\n showingLabel={l.showing}\n testId={`${testId}-documents`}\n >\n {docs.length ? (\n <DetailLinkList>\n {docs.map((d) => (\n <DetailLinkItem\n key={d.doc_ext_id}\n icon={<FileText className=\"size-4\" />}\n onClick={onOpenDocument ? () => onOpenDocument(d.doc_ext_id) : undefined}\n testId={`${testId}-doc-${d.doc_ext_id}`}\n trailing={\n d.citations_count > 0 &&\n !renderPassages && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {passages(d.citations_count)}\n </span>\n )\n }\n after={\n d.citations_count > 0 &&\n renderPassages && (\n <span className=\"shrink-0 px-3 py-2 text-xs\">\n {renderPassages(d, passages(d.citations_count))}\n </span>\n )\n }\n >\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-medium\">{d.file_name}</span>\n {(d.note || noteIsValue) && (\n <span\n className={cn(\n 'mt-0.5 flex min-w-0 items-baseline gap-2',\n noteIsValue ? 'text-base text-foreground' : 'text-muted-foreground'\n )}\n data-testid={`${testId}-doc-${d.doc_ext_id}-note`}\n >\n {noteLabel && (\n <span className=\"shrink-0 text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {noteLabel}\n </span>\n )}\n <span\n className={cn(\n 'line-clamp-3 min-w-0 whitespace-pre-line',\n noteIsValue && 'font-semibold',\n !d.note && 'font-normal italic text-muted-foreground'\n )}\n >\n {d.note || l.noValue}\n </span>\n </span>\n )}\n </span>\n </DetailLinkItem>\n ))}\n </DetailLinkList>\n ) : (\n <DetailEmpty>{l.noDocuments}</DetailEmpty>\n )}\n </DetailSection>\n\n <DetailSection\n title={l.facts}\n count={links.fact_count}\n shown={facts.length}\n showingLabel={l.showing}\n testId={`${testId}-facts`}\n >\n {facts.length ? (\n <DetailLinkList>\n {facts.map((f) => (\n <DetailLinkItem\n key={f.fact_ext_id}\n icon={<Lightbulb className=\"size-4\" />}\n onClick={onOpenFact ? () => onOpenFact(f.fact_ext_id) : undefined}\n testId={`${testId}-fact-${f.fact_ext_id}`}\n >\n <span className=\"line-clamp-3 min-w-0 flex-1\">{f.text}</span>\n </DetailLinkItem>\n ))}\n </DetailLinkList>\n ) : (\n <DetailEmpty>{l.noFacts}</DetailEmpty>\n )}\n </DetailSection>\n\n <DetailSection\n title={l.threads}\n count={links.thread_count}\n shown={threads.length}\n showingLabel={l.showing}\n testId={`${testId}-threads`}\n >\n {threads.length ? (\n <DetailLinkList>\n {threads.map((t) => (\n <DetailLinkItem\n key={t.conversation_ext_id}\n icon={<MessagesSquare className=\"size-4\" />}\n onClick={onOpenThread ? () => onOpenThread(t.conversation_ext_id) : undefined}\n testId={`${testId}-thread-${t.conversation_ext_id}`}\n trailing={\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {l.threadUpdated.replace('{date}', formatDay(t.updated_at))}\n </span>\n }\n >\n <span className=\"min-w-0 flex-1 truncate font-medium\">\n {t.title || l.untitledThread}\n </span>\n </DetailLinkItem>\n ))}\n </DetailLinkList>\n ) : (\n <DetailEmpty>{l.noThreads}</DetailEmpty>\n )}\n </DetailSection>\n </>\n )}\n {fields.length > 0 && (\n <DetailSection title={l.fields} testId={`${testId}-fields`}>\n <DetailFields>\n {fields.map((field) => (\n <DetailField key={field.id} label={field.name}>\n <TagTableCell\n row={row}\n column={field}\n people={people}\n tags={tags}\n onOpenTag={onOpenTag}\n onChange={onChangeValue}\n l={cellLabels}\n testId={`${testId}-field-${field.id}`}\n />\n </DetailField>\n ))}\n </DetailFields>\n </DetailSection>\n )}\n </DetailBody>\n )\n}\n","/**\n * A table of tags as a Word document: a title, when the snapshot was taken, then one table with a\n * row per tag, a column per field of its kind, the evidence behind it (linked document names and fact\n * excerpts) and its gaps. Written straight as WordprocessingML and zipped with `fflate` (already a\n * dependency, and what `docx/export.ts` uses), so the result opens in the native Word editor and\n * in Word without pulling the editor engine into the tags module.\n */\n\nimport {\n cellText,\n cellValue,\n isGap,\n rowLinks,\n type TagTableData,\n type TagTableField,\n type TagTableRow,\n} from './tagTableModel'\nimport {\n cell,\n docxPackage,\n documentXml,\n minuteUtc,\n page,\n paragraph,\n TABLE_DOCUMENT_STYLES,\n} from './ooxml'\n\nexport { DOCX_MIME_TYPE } from './ooxml'\n\n/** More table columns than this (item, fields, evidence, gaps) turn the page to landscape. */\nexport const TAG_TABLE_DOCX_LANDSCAPE_AFTER = 6\n\nexport interface TagTableDocxLabels {\n /** The row column's heading. */\n row: string\n evidence: string\n gaps: string\n /** `{at}` is the snapshot time, `YYYY-MM-DD HH:MM UTC`. */\n takenAt: string\n /** A row with no linked document, fact or thread. */\n noEvidence: string\n /** `{fields}`: the row's empty fields. */\n missing: string\n /** `{count}` more links than listed. */\n more: string\n document: string\n documents: string\n fact: string\n facts: string\n thread: string\n threads: string\n untitledThread: string\n empty: string\n}\n\nexport const DEFAULT_TAG_TABLE_DOCX_LABELS: TagTableDocxLabels = {\n row: 'Item',\n evidence: 'Evidence',\n gaps: 'Gaps',\n takenAt: 'Snapshot taken {at}',\n noEvidence: 'No evidence',\n missing: 'Missing: {fields}',\n more: '+{count} more',\n document: '1 document',\n documents: '{count} documents',\n fact: '1 fact',\n facts: '{count} facts',\n thread: '1 thread',\n threads: '{count} threads',\n untitledThread: 'Untitled thread',\n empty: 'No rows.',\n}\n\nexport interface TagTableDocxOptions {\n title: string\n nameOf?: (id: string) => string | undefined\n /** When the snapshot was taken (ISO); default now. */\n at?: string\n labels?: Partial<TagTableDocxLabels>\n}\n\nconst count = (n: number, one: string, many: string) =>\n n === 1 ? one : many.replace('{count}', String(n))\n\nfunction evidenceParagraphs(row: TagTableRow, l: TagTableDocxLabels): string[] {\n if (isGap(row)) return []\n const links = rowLinks(row)\n const docs = links.docs ?? []\n const facts = links.facts ?? []\n const threads = links.threads ?? []\n const more =\n links.doc_count -\n docs.length +\n (links.fact_count - facts.length) +\n (links.thread_count - threads.length)\n return [\n paragraph(\n [\n {\n text: [\n links.doc_count ? count(links.doc_count, l.document, l.documents) : null,\n links.fact_count ? count(links.fact_count, l.fact, l.facts) : null,\n links.thread_count ? count(links.thread_count, l.thread, l.threads) : null,\n ]\n .filter(Boolean)\n .join(' · '),\n muted: true,\n },\n ],\n 'TagTableCell'\n ),\n ...docs.map((d) =>\n paragraph(\n [{ text: d.file_name, bold: true }, ...(d.note ? [{ text: ` — ${d.note}` }] : [])],\n 'TagTableCell'\n )\n ),\n ...facts.map((f) => paragraph([{ text: `“${f.text}”`, italic: true }], 'TagTableCell')),\n ...threads.map((t) => paragraph([{ text: t.title || l.untitledThread }], 'TagTableCell')),\n ...(more > 0\n ? [\n paragraph(\n [{ text: l.more.replace('{count}', String(more)), muted: true }],\n 'TagTableCell'\n ),\n ]\n : []),\n ]\n}\n\nfunction gapParagraphs(\n row: TagTableRow,\n columns: TagTableField[],\n l: TagTableDocxLabels\n): string[] {\n const missing = columns\n .filter((c) => c.type !== 'checkbox' && cellText(cellValue(row, c), c) === '')\n .map((c) => c.name)\n return [\n ...(isGap(row) ? [paragraph([{ text: l.noEvidence, bold: true }], 'TagTableCell')] : []),\n ...(missing.length\n ? [paragraph([{ text: l.missing.replace('{fields}', missing.join(', ')) }], 'TagTableCell')]\n : []),\n ]\n}\n\n/** `word/document.xml` for the table (exposed for tests and for hosts that assemble their own package). */\nexport function tagTableDocumentXml(table: TagTableData, options: TagTableDocxOptions): string {\n const l = { ...DEFAULT_TAG_TABLE_DOCX_LABELS, ...options.labels }\n const { columns, rows } = table\n const heads = [l.row, ...columns.map((c) => c.name), l.evidence, l.gaps]\n const landscape = heads.length > TAG_TABLE_DOCX_LANDSCAPE_AFTER\n const { textWidth, sectPr } = page(landscape)\n // Relative widths: the item and evidence get room to read, each field and the gaps a share.\n const weights = [2, ...columns.map(() => 1), 3, 1.5]\n const total = weights.reduce((a, b) => a + b, 0)\n const widths = weights.map((w) => Math.floor((textWidth * w) / total))\n const at = minuteUtc(options.at ?? new Date().toISOString())\n\n const header = `<w:tr><w:trPr><w:tblHeader/><w:cantSplit/></w:trPr>${heads\n .map((h, i) =>\n cell([paragraph([{ text: h, bold: true }], 'TagTableCell')], widths[i], 'E7E6E6')\n )\n .join('')}</w:tr>`\n const body = rows.map((row) => {\n const fill = isGap(row) ? 'FFF2CC' : undefined\n const cells = [\n cell([paragraph([{ text: row.name, bold: true }], 'TagTableCell')], widths[0], fill),\n ...columns.map((c, i) => {\n const text = cellText(cellValue(row, c), c, options.nameOf)\n return cell(text ? [paragraph([{ text }], 'TagTableCell')] : [], widths[i + 1], fill)\n }),\n cell(evidenceParagraphs(row, l), widths[columns.length + 1], fill),\n cell(gapParagraphs(row, columns, l), widths[columns.length + 2], fill),\n ]\n return `<w:tr><w:trPr><w:cantSplit/></w:trPr>${cells.join('')}</w:tr>`\n })\n\n const grid = `<w:tbl><w:tblPr><w:tblStyle w:val=\"TagTableGrid\"/><w:tblW w:w=\"${textWidth}\" w:type=\"dxa\"/><w:tblLayout w:type=\"fixed\"/><w:tblLook w:val=\"04A0\" w:firstRow=\"1\" w:lastRow=\"0\" w:firstColumn=\"1\" w:lastColumn=\"0\" w:noHBand=\"0\" w:noVBand=\"1\"/></w:tblPr><w:tblGrid>${widths\n .map((w) => `<w:gridCol w:w=\"${w}\"/>`)\n .join('')}</w:tblGrid>${header}${body.join('')}</w:tbl>`\n\n return documentXml(\n `${paragraph(\n [{ text: options.title }],\n 'Title'\n )}${paragraph([{ text: l.takenAt.replace('{at}', `${at} UTC`), muted: true }])}${grid}${\n rows.length ? '' : paragraph([{ text: l.empty, muted: true }])\n }<w:p/>${sectPr}`\n )\n}\n\n/** The table as `.docx` bytes. */\nexport function tagTableDocx(table: TagTableData, options: TagTableDocxOptions): Uint8Array {\n const at = new Date(options.at ?? Date.now()).toISOString()\n return docxPackage({\n document: tagTableDocumentXml(table, { ...options, at }),\n styles: TABLE_DOCUMENT_STYLES,\n title: options.title,\n at,\n })\n}\n","/**\n * The glossary: every definition fact (optionally one agreement's), alphabetical by term, as a\n * three-column table — Term, Definition, Source — printed as a Word document or as Markdown with\n * the same WordprocessingML the tag tables export with (`ooxml.ts`).\n */\n\nimport {\n cell,\n docxPackage,\n documentXml,\n minuteUtc,\n page,\n paragraph,\n TABLE_DOCUMENT_STYLES,\n} from './ooxml'\nimport { compareDefinitions, groupDefinitions, type DefinitionSource } from './definitions'\n\n/** One glossary row. */\nexport interface GlossaryEntry {\n /** Empty for a definition whose text names no term (listed last, as written). */\n term: string\n definition: string\n source: string\n factId: string\n}\n\nexport interface GlossaryLabels {\n term: string\n definition: string\n source: string\n /** `{at}` is when it was printed, `YYYY-MM-DD HH:MM UTC`. */\n takenAt: string\n empty: string\n}\n\nexport const DEFAULT_GLOSSARY_LABELS: GlossaryLabels = {\n term: 'Term',\n definition: 'Definition',\n source: 'Source',\n takenAt: 'Printed {at}',\n empty: 'No definitions.',\n}\n\nexport interface GlossaryOptions {\n title: string\n /** When it was printed (ISO); default now. */\n at?: string\n labels?: Partial<GlossaryLabels>\n}\n\n/** What follows the term, a leading colon or dash dropped: `means the issued shares.` */\nconst body = (rest: string) => rest.replace(/^\\s*[:—–-]\\s*/, '').trim()\n\n/**\n * The glossary's rows: every definition, alphabetical by term and, within a term, the preferred one\n * first. Definitions whose text names no term follow, as written. `labelId` keeps one label's.\n */\nexport function glossaryEntries(\n sources: readonly DefinitionSource[],\n options: { labelId?: string | null } = {}\n): GlossaryEntry[] {\n const { groups, unparsed } = groupDefinitions(sources, options)\n return [\n ...groups.flatMap((g) =>\n g.definitions.map((d) => ({\n term: d.term,\n definition: body(d.rest),\n source: d.source ?? '',\n factId: d.id,\n }))\n ),\n ...[...unparsed].sort(compareDefinitions).map((d) => ({\n term: '',\n definition: d.text.trim(),\n source: d.source ?? '',\n factId: d.id,\n })),\n ]\n}\n\nconst escapeCell = (text: string) => text.replace(/\\|/g, '\\\\|').replace(/\\n+/g, ' ')\n\n/** The glossary as a Markdown document: a heading, when it was printed, and one table. */\nexport function glossaryMarkdown(\n entries: readonly GlossaryEntry[],\n options: GlossaryOptions\n): string {\n const l = { ...DEFAULT_GLOSSARY_LABELS, ...options.labels }\n const at = minuteUtc(options.at ?? new Date().toISOString())\n const lines = [\n `# ${options.title}`,\n '',\n `_${l.takenAt.replace('{at}', `${at} UTC`)}_`,\n '',\n `| ${l.term} | ${l.definition} | ${l.source} |`,\n '| --- | --- | --- |',\n ...entries.map(\n (e) =>\n `| ${e.term ? `**${escapeCell(e.term)}**` : ''} | ${escapeCell(e.definition)} | ${escapeCell(e.source)} |`\n ),\n ]\n if (!entries.length) lines.push('', l.empty)\n return `${lines.join('\\n')}\\n`\n}\n\n/** `word/document.xml` of the glossary (exposed for tests). */\nexport function glossaryDocumentXml(\n entries: readonly GlossaryEntry[],\n options: GlossaryOptions\n): string {\n const l = { ...DEFAULT_GLOSSARY_LABELS, ...options.labels }\n const { textWidth, sectPr } = page(false)\n const widths = [2, 6, 2].map((w) => Math.floor((textWidth * w) / 10))\n const at = minuteUtc(options.at ?? new Date().toISOString())\n const text = (t: string, bold = false) => [paragraph([{ text: t, bold }], 'TagTableCell')]\n const header = `<w:tr><w:trPr><w:tblHeader/><w:cantSplit/></w:trPr>${[\n l.term,\n l.definition,\n l.source,\n ]\n .map((h, i) => cell(text(h, true), widths[i], 'E7E6E6'))\n .join('')}</w:tr>`\n const rows = entries.map(\n (e) =>\n `<w:tr><w:trPr><w:cantSplit/></w:trPr>${cell(e.term ? text(e.term, true) : [], widths[0])}${cell(\n text(e.definition),\n widths[1]\n )}${cell(e.source ? text(e.source) : [], widths[2])}</w:tr>`\n )\n const table = `<w:tbl><w:tblPr><w:tblStyle w:val=\"TagTableGrid\"/><w:tblW w:w=\"${textWidth}\" w:type=\"dxa\"/><w:tblLayout w:type=\"fixed\"/><w:tblLook w:val=\"04A0\" w:firstRow=\"1\" w:lastRow=\"0\" w:firstColumn=\"1\" w:lastColumn=\"0\" w:noHBand=\"0\" w:noVBand=\"1\"/></w:tblPr><w:tblGrid>${widths\n .map((w) => `<w:gridCol w:w=\"${w}\"/>`)\n .join('')}</w:tblGrid>${header}${rows.join('')}</w:tbl>`\n return documentXml(\n `${paragraph([{ text: options.title }], 'Title')}${paragraph([\n { text: l.takenAt.replace('{at}', `${at} UTC`), muted: true },\n ])}${table}${entries.length ? '' : paragraph([{ text: l.empty, muted: true }])}<w:p/>${sectPr}`\n )\n}\n\n/** The glossary as `.docx` bytes. */\nexport function glossaryDocx(\n entries: readonly GlossaryEntry[],\n options: GlossaryOptions\n): Uint8Array {\n const at = new Date(options.at ?? Date.now()).toISOString()\n return docxPackage({\n document: glossaryDocumentXml(entries, { ...options, at }),\n styles: TABLE_DOCUMENT_STYLES,\n title: options.title,\n at,\n })\n}\n\n/** A file name for the glossary: `Glossary - SPA.docx`. */\nexport function glossaryFileName(title: string, extension: 'docx' | 'md'): string {\n return `${title.replace(/[\\\\/:*?\"<>|]+/g, ' ').trim() || 'Glossary'}.${extension}`\n}\n","/**\n * The nouns of the Tags page, all from the entity registry (`getEntityLabel`) so a deployment that\n * renames an entity (a document to \"File\", a tag to \"Label\") renames it here too. Read at render\n * time, after any `configureEntityRegistry` override.\n */\nimport type { TagKind } from '@arbidocs/sdk/browser'\nimport { getEntityLabel, tagKindNouns, tagKindTitle } from '@arbidocs/react/ui'\nimport type { TagDetailLabels } from '../TagDetail'\nimport type { TagTableLabels } from '../TagTable'\n\nconst lower = (text: string) => text.toLowerCase()\n\n/** Singular and plural, title-case forms of the page's nouns. */\nexport function tagsPageNouns() {\n return {\n // ANY_TAG, not TAG: TAG is the Files page's \"Field\" (a document column).\n tag: getEntityLabel('ANY_TAG'),\n tags: getEntityLabel('ANY_TAG', 'PLURAL'),\n document: getEntityLabel('DOCUMENT'),\n documents: getEntityLabel('DOCUMENT', 'PLURAL'),\n fact: getEntityLabel('FACT'),\n facts: getEntityLabel('FACT', 'PLURAL'),\n thread: getEntityLabel('CONVERSATION'),\n threads: getEntityLabel('CONVERSATION', 'PLURAL'),\n people: getEntityLabel('PERSON', 'PLURAL'),\n organisations: getEntityLabel('ORGANISATION', 'PLURAL'),\n }\n}\n\n/** \"People and organisations\", as the extraction calls what it finds. */\nexport function entitiesPhrase(): string {\n const n = tagsPageNouns()\n return `${n.people} and ${lower(n.organisations)}`\n}\n\n/** \"3 documents\" / \"1 document\". */\nexport function documentCount(count: number): string {\n const n = tagsPageNouns()\n return `${count} ${lower(count === 1 ? n.document : n.documents)}`\n}\n\n/** What a kind's table calls its rows and the items tagged with each. */\nexport function tagTableLabels(kind: TagKind): Partial<TagTableLabels> {\n const n = tagsPageNouns()\n const k = tagKindNouns(kind)\n return {\n row: tagKindTitle(kind),\n evidence: 'Tagged items',\n documents: `{count} ${lower(n.documents)}`,\n document: `1 ${lower(n.document)}`,\n facts: `{count} ${lower(n.facts)}`,\n fact: `1 ${lower(n.fact)}`,\n threads: `{count} ${lower(n.threads)}`,\n thread: `1 ${lower(n.thread)}`,\n untitledThread: `Untitled ${lower(n.thread)}`,\n empty: `No ${k.plural} yet.`,\n noColumns: 'No fields yet.',\n }\n}\n\n/** The headings and empty states of one tag's detail. */\nexport function tagDetailLabels(): Partial<TagDetailLabels> {\n const n = tagsPageNouns()\n const carries = (noun: string) => `No ${lower(noun)} carries this ${lower(n.tag)} yet.`\n return {\n documents: n.documents,\n facts: n.facts,\n threads: n.threads,\n noDocuments: carries(n.document),\n noFacts: carries(n.fact),\n noThreads: carries(n.thread),\n untitledThread: `Untitled ${lower(n.thread)}`,\n }\n}\n\n/**\n * What a tag's note on a document is called: \"Note\" for every kind that carries one (a label's\n * links carry none). A person's or organisation's role is its own Role field, not the link's.\n */\nexport function tagNoteLabel(kind: TagKind): string | undefined {\n return kind === 'label' || kind === 'search' ? undefined : 'Note'\n}\n\n/** What each kind is for, under its heading on the Tags page. */\nexport function tagKindDescription(kind: TagKind): string {\n const n = tagsPageNouns()\n const k = tagKindNouns(kind)\n const docs = lower(n.documents)\n switch (kind) {\n case 'label':\n return `Short names that file ${docs}, ${lower(n.facts)} and ${lower(n.threads)}.`\n case 'annotation':\n return `A note on each ${lower(n.document)} (text, number, choice or date), filled in by hand or by AI.`\n case 'issue':\n return `Points in dispute, each with the same ${lower(k.singular)} fields.`\n case 'person':\n case 'organisation':\n return `${tagKindTitle(kind, { plural: true })} the ${docs} mention.`\n case 'search':\n return `${tagKindTitle(kind, { plural: true })}.`\n }\n}\n","/**\n * \"Extract from documents\": pick documents (or all of them) and have the AI find the people and\n * organisations they name, each linked to its entity tag. The host runs the extraction\n * (`onExtract`, accepted at once); the dialog closes once it is accepted.\n */\nimport type { components } from '@arbidocs/client'\nimport { useMemo, useState } from 'react'\nimport {\n Button,\n Checkbox,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n getDocumentTitle,\n isImageDocument,\n} from '@arbidocs/react/ui'\nimport { DocumentPicker, type PickerGroup } from '../../settings/DocumentPicker'\nimport { ModalHeader } from '../../settings/ModalScaffold'\nimport { documentCount, entitiesPhrase, tagsPageNouns } from './tagsPageLabels'\n\ntype DocResponse = components['schemas']['DocResponse']\n\n/** Most documents one extraction takes (the endpoint's limit). */\nexport const EXTRACT_LIMIT = 500\n\n/** What the dialog reads of a document. */\nexport type ExtractableDocument = Pick<\n DocResponse,\n | 'external_id'\n | 'file_name'\n | 'file_type'\n | 'doc_metadata'\n | 'parent_ext_id'\n | 'n_pages'\n | 'tokens'\n>\n\n/** Extracted child documents (e.g. email attachments) are reached through their parent. */\nconst isTopLevel = (d: ExtractableDocument) => !d.parent_ext_id\n\nexport interface ExtractEntitiesDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** The workspace's documents. */\n documents: readonly ExtractableDocument[]\n /** Run the extraction over these documents; the dialog closes when it resolves. */\n onExtract: (docIds: string[]) => Promise<unknown>\n /** Too many documents chosen (more than {@link EXTRACT_LIMIT}). */\n onTooMany: (message: string) => void\n isPending?: boolean\n}\n\nexport function ExtractEntitiesDialog({\n open,\n onOpenChange,\n documents,\n onExtract,\n onTooMany,\n isPending,\n}: ExtractEntitiesDialogProps) {\n const [picked, setPicked] = useState<string[]>([])\n const [all, setAll] = useState(false)\n const topLevel = useMemo(() => documents.filter(isTopLevel), [documents])\n const allIds = topLevel.map((d) => d.external_id)\n const docIds = all ? allIds : picked\n const nouns = tagsPageNouns()\n const entities = entitiesPhrase().toLowerCase()\n const groups = useMemo(\n (): PickerGroup[] => [\n {\n id: 'all',\n heading: 'In this workspace',\n docs: topLevel\n .map((d) => ({\n id: d.external_id,\n title: getDocumentTitle(d, d.file_name ?? undefined),\n fileName: d.file_name,\n pages: isImageDocument(d) ? null : (d.n_pages ?? null),\n tokens: isImageDocument(d) ? null : (d.tokens ?? null),\n }))\n .sort((a, b) => a.title.toLowerCase().localeCompare(b.title.toLowerCase())),\n },\n ],\n [topLevel]\n )\n\n const toggle = (id: string) =>\n setPicked((ids) => (ids.includes(id) ? ids.filter((x) => x !== id) : [...ids, id]))\n\n const close = () => {\n setPicked([])\n setAll(false)\n onOpenChange(false)\n }\n\n const run = async () => {\n if (docIds.length > EXTRACT_LIMIT) {\n onTooMany(`Choose at most ${documentCount(EXTRACT_LIMIT)} at a time.`)\n return\n }\n try {\n await onExtract(docIds)\n close()\n } catch {\n // The host has said why; the dialog stays open to try again.\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={(next) => (next ? onOpenChange(true) : close())}>\n <DialogContent\n presentation=\"sheet\"\n className=\"w-modal max-w-modal-vw max-h-panel flex flex-col overflow-hidden p-0\"\n data-testid=\"extract-entities-dialog\"\n >\n <ModalHeader>\n <DialogTitle>Extract {entities}</DialogTitle>\n <DialogDescription>\n The AI finds the {entities} each {nouns.document.toLowerCase()} names and links them,\n with the passages that name them. {entitiesPhrase()} already here are matched by name.\n </DialogDescription>\n </ModalHeader>\n <div className=\"flex flex-1 min-h-0 flex-col gap-3 overflow-auto p-4\">\n <label className=\"flex items-center gap-2 text-sm\">\n <Checkbox\n checked={all}\n onCheckedChange={(v) => setAll(v === true)}\n data-testid=\"extract-entities-all\"\n />\n All {nouns.documents.toLowerCase()} ({allIds.length})\n </label>\n {!all && (\n <DocumentPicker\n groups={groups}\n value=\"\"\n onValueChange={toggle}\n selectedIds={picked}\n labels={{ placeholder: `Search ${nouns.documents.toLowerCase()}…` }}\n />\n )}\n </div>\n <div className=\"flex items-center justify-end gap-2 border-t border-border px-4 py-3\">\n <Button variant=\"ghost\" onClick={close}>\n Cancel\n </Button>\n <Button\n onClick={() => void run()}\n disabled={docIds.length === 0 || isPending}\n data-testid=\"extract-entities-run\"\n >\n {docIds.length > 0 ? `Extract from ${documentCount(docIds.length)}` : 'Extract'}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * The kit's heavy components each live in their own chunk, loaded the first time one renders: the\n * data grid (`GridView`), the calendar (`CalendarGrid`), the Word editor (`NativeDocxEditor`) and\n * the PDF viewer (`PdfViewer`, `@arbidocs/react/viewers/pdf`).\n * - `ConnectedAppRuntime` loads them when idle after the first paint (`KIT_CHUNK_LOADERS`), so\n * the first grid, PDF or Word document opens at once.\n * - `prefetchViewerChunks()` loads the document viewer with them, while online, for a document\n * kept offline (a host's `documents.onKeptOffline`).\n * - `preloadKitChunks()` loads them now: in a test that renders one synchronously.\n */\nimport { calendarGridChunk } from './calendar/CalendarGrid'\nimport { docxEditorChunk } from './docx/lazy'\nimport { gridChunk } from './files/GridView'\nimport { prefetchChunk } from './shell/reload-policy'\n\nexport { calendarGridChunk, docxEditorChunk, gridChunk }\n\n/** One loader per heavy chunk. */\nexport const KIT_CHUNK_LOADERS: readonly (() => Promise<unknown>)[] = [\n () => gridChunk.load(),\n () => calendarGridChunk.load(),\n () => docxEditorChunk.load(),\n () => import('@arbidocs/react/viewers/pdf').then((m) => m.pdfViewerChunk.load()),\n]\n\nexport async function preloadKitChunks(): Promise<void> {\n await Promise.all(KIT_CHUNK_LOADERS.map((load) => load()))\n}\n\n/**\n * The document viewer and the kit's heavy chunks, loaded while still online. A failed load is\n * remembered (`prefetchChunk`), so a stale build reloads rather than crash the viewer offline.\n */\nexport async function prefetchViewerChunks(): Promise<void> {\n await Promise.all(\n [() => import('./connect/viewer'), ...KIT_CHUNK_LOADERS].map((load) => prefetchChunk(load))\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/tips/useTipsPlacement.ts","../src/guided/cursor-visuals.json","../src/guided/GuidedCursor.tsx","../src/components/LoadingIndicator.tsx","../src/components/GridRowNavigator.tsx","../src/components/Toolbar.tsx","../src/components/EntityIdentityBar.tsx","../src/activity/workspace-activity.ts","../src/activity/WorkspaceActivityList.tsx","../src/tags/tagTableModel.ts","../src/tags/TagColumnsEditor.tsx","../src/tags/TagTable.tsx","../src/tags/TagDetail.tsx","../src/tags/tagTableDocx.ts","../src/tags/glossary.ts","../src/tags/page/tagsPageLabels.ts","../src/tags/page/ExtractEntitiesDialog.tsx","../src/lazy-chunks.ts"],"names":["useState","useEffect","useMemo","jsx","useSyncExternalStore","guidedCursor","useRef","useMountedSurface","createPortal","jsxs","Sparkle","cn","useCallback","total","RowNavigatorControls","Search","Input","Textarea","Pencil","document","taskActivityHeadline","DEFAULT_TASK_ACTIVITY_LABELS","assistantCopy","Activity","MessageSquare","FileText","Workflow","useAssistantCopy","Button","body","Fragment","ArrowUp","ArrowDown","X","Plus","Loader2","Checkbox","TagEntity","ArrowUpRight","ChevronDown","count","Lightbulb","MessagesSquare","Popover","PopoverTrigger","MoreHorizontal","PopoverContent","SlidersHorizontal","FileDown","Download","GridView","DetailLoading","DetailBody","DetailSection","DetailLinkList","DetailLinkItem","DetailEmpty","DetailFields","DetailField","paragraph","page","minuteUtc","cell","documentXml","docxPackage","TABLE_DOCUMENT_STYLES","groupDefinitions","compareDefinitions","escapeCell","getEntityLabel","tagKindNouns","tagKindTitle","getDocumentTitle","isImageDocument","Dialog","DialogContent","ModalHeader","DialogTitle","DialogDescription","DocumentPicker","gridChunk","calendarGridChunk","docxEditorChunk","prefetchChunk"],"mappings":"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","file":"chunk-M6WVIGYP.cjs","sourcesContent":["import { useEffect, useMemo, useState } from 'react'\nimport type { TipsRegistry } from './registry'\n\nexport interface UseTipsPlacementOptions<Context extends string, State, Cta> {\n registry: Pick<TipsRegistry<Context, State, Cta>, 'select' | 'subscribe'>\n context: Context\n /** Serializable situation values; equal inline objects do not restart the placement. */\n state: State\n dismissed?: readonly string[]\n /** Seconds between tips. Zero disables rotation. Default 30. */\n autoRotateSeconds?: number\n}\n\n/**\n * The lifecycle of a tips placement: live registry updates, per-user dismissal filtering,\n * priority-first selection, cyclic paging and hover-paused rotation. Content, CTA dispatch,\n * visibility preferences and the card's actual placement belong to the host.\n */\nexport function useTipsPlacement<Context extends string, State, Cta>({\n registry,\n context,\n state,\n dismissed = [],\n autoRotateSeconds = 30,\n}: UseTipsPlacementOptions<Context, State, Cta>) {\n const [editVersion, setEditVersion] = useState(0)\n useEffect(() => registry.subscribe(() => setEditVersion((value) => value + 1)), [registry])\n const stateKey = JSON.stringify(state ?? {})\n const dismissedKey = JSON.stringify(dismissed)\n const tips = useMemo(\n () => registry.select(context, state).filter((tip) => !dismissed.includes(tip.code)),\n // Values, not the identity of inline situation/dismissal objects, select and reset the tips.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [registry, context, stateKey, editVersion, dismissedKey]\n )\n const [cursor, setCursor] = useState(0)\n const [paused, setPaused] = useState(false)\n useEffect(() => setCursor(0), [registry, context, stateKey])\n useEffect(() => {\n if (tips.length <= 1 || paused || autoRotateSeconds <= 0) return\n const timer = setTimeout(\n () => setCursor((value) => (value + 1) % tips.length),\n autoRotateSeconds * 1000\n )\n return () => clearTimeout(timer)\n }, [tips.length, paused, autoRotateSeconds, cursor])\n\n const index = tips.length ? cursor % tips.length : 0\n return {\n tips,\n tip: tips.at(index),\n index,\n count: tips.length,\n previous: () =>\n setCursor((value) => (tips.length ? (value - 1 + tips.length) % tips.length : 0)),\n next: () => setCursor((value) => (tips.length ? (value + 1) % tips.length : 0)),\n onHoverChange: setPaused,\n }\n}\n","{\n \"color\": \"#22d3ee\",\n \"glowColor\": \"rgba(34,211,238,.85)\",\n \"glowColorFlash\": \"rgba(103,232,249,.95)\",\n \"fillColor\": \"rgba(34,211,238,.25)\",\n \"size\": 24,\n \"borderWidth\": 2,\n \"mark\": {\n \"width\": 30\n },\n \"ripple\": {\n \"durationMs\": 600,\n \"easing\": \"ease-out\",\n \"startScale\": 0.5,\n \"endScale\": 3,\n \"startOpacity\": 0.85,\n \"endOpacity\": 0\n },\n \"squish\": {\n \"downMs\": 80,\n \"upMs\": 220,\n \"scale\": 0.6,\n \"downEasing\": \"ease-in\",\n \"upEasing\": \"cubic-bezier(0.34, 1.56, 0.64, 1)\"\n },\n \"glowFlash\": {\n \"durationMs\": 300,\n \"baseBlur\": 12,\n \"flashBlur\": 24,\n \"easing\": \"ease-out\"\n }\n}\n","/**\n * GuidedCursor\n *\n * The visual layer for guided UI runs: a mark that glides between targets and reacts on a click\n * (squish + glow flash on the mark itself, plus an outward cyan ripple). It renders whatever the\n * shared [[guidedCursor]] controller (./cursor.ts) says: a tip's \"Show me\", the tips editor's\n * tester, and remote control over the websocket.\n *\n * The mark is a cyan ring by default; a host gives its own image (`markSrc`), as ARBI-frontend\n * gives its brand mark. The look is defined by ./cursor-visuals.json, the single source of truth\n * shared with ARBI-frontend's demo-video recorder, so in-app walkthroughs and recorded demos read\n * as the same motion.\n *\n * Mount once near the app root (`ConnectedAppRuntime` does); it portals to <body>.\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type Ref,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { guidedCursor } from './cursor'\nimport CURSOR_VISUALS from './cursor-visuals.json'\nimport { useMountedSurface } from './surfaces'\n\nexport interface GuidedCursorProps {\n /** The mark's image (a URL). Default: a cyan ring. */\n markSrc?: string\n}\n\ninterface Ripple {\n id: number\n x: number\n y: number\n}\n\n// The cyan ring of the click ripple (the recorder's too, via cursor-visuals.json) and of the\n// default mark.\nconst RING_STYLE: CSSProperties = {\n position: 'fixed',\n width: CURSOR_VISUALS.size,\n height: CURSOR_VISUALS.size,\n border: `${CURSOR_VISUALS.borderWidth}px solid ${CURSOR_VISUALS.color}`,\n borderRadius: '50%',\n pointerEvents: 'none',\n}\n\nconst glowFilter = (blur: number, color: string) => `drop-shadow(0 0 ${blur}px ${color})`\n\n/** One click ripple that scales up and fades once, then unmounts. */\nfunction RippleDot({ x, y }: { x: number; y: number }) {\n return (\n <div\n style={{ ...RING_STYLE, left: x, top: y, transform: 'translate(-50%, -50%)' }}\n ref={(el) => {\n const { ripple } = CURSOR_VISUALS\n el?.animate(\n [\n {\n opacity: ripple.startOpacity,\n transform: `translate(-50%,-50%) scale(${ripple.startScale})`,\n },\n {\n opacity: ripple.endOpacity,\n transform: `translate(-50%,-50%) scale(${ripple.endScale})`,\n },\n ],\n { duration: ripple.durationMs, easing: ripple.easing }\n )\n }}\n />\n )\n}\n\n/** Squish-and-release the cursor mark, with a glow flash, on click. */\nfunction playClickFeedback(mark: HTMLElement) {\n const { squish, glowFlash, glowColor, glowColorFlash } = CURSOR_VISUALS\n const downFrac = squish.downMs / (squish.downMs + squish.upMs)\n mark.animate(\n [\n // Per-keyframe easing, not a single easing over the whole timeline: the\n // spring/back curve on the release overshoots past 1 — applied globally\n // that overshoot gets clamped and re-entered as eased time crosses the\n // downFrac boundary, producing a visible double-bounce right at the end.\n { transform: 'translate(-50%,-50%) scale(1)', offset: 0, easing: squish.downEasing },\n {\n transform: `translate(-50%,-50%) scale(${squish.scale})`,\n offset: downFrac,\n easing: squish.upEasing,\n },\n { transform: 'translate(-50%,-50%) scale(1)', offset: 1 },\n ],\n { duration: squish.downMs + squish.upMs }\n )\n mark.animate(\n [\n { filter: glowFilter(glowFlash.baseBlur, glowColor) },\n { filter: glowFilter(glowFlash.flashBlur, glowColorFlash), offset: 0.3 },\n { filter: glowFilter(glowFlash.baseBlur, glowColor) },\n ],\n { duration: glowFlash.durationMs, easing: glowFlash.easing }\n )\n}\n\n/** Mount once near the app root. Renders the cursor mark + click ripples. */\nexport function GuidedCursor({ markSrc }: GuidedCursorProps) {\n const snap = useSyncExternalStore(\n guidedCursor.subscribe,\n guidedCursor.getSnapshot,\n guidedCursor.getSnapshot\n )\n const [ripples, setRipples] = useState<Ripple[]>([])\n const markRef = useRef<HTMLElement | null>(null)\n // A remote run only goes where the user can watch it.\n useMountedSurface('cursor')\n\n useEffect(() => {\n let seq = 0\n return guidedCursor.onRipple((x, y) => {\n const id = ++seq\n setRipples((rs) => [...rs, { id, x, y }])\n setTimeout(() => setRipples((rs) => rs.filter((r) => r.id !== id)), 650)\n if (!guidedCursor.prefersReducedMotion() && markRef.current) {\n playClickFeedback(markRef.current)\n }\n })\n }, [])\n\n if (typeof document === 'undefined') return null\n if (!snap.visible && ripples.length === 0) return null\n\n const reduced = guidedCursor.prefersReducedMotion()\n const markStyle: CSSProperties = {\n position: 'fixed',\n left: snap.x,\n top: snap.y,\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n filter: glowFilter(CURSOR_VISUALS.glowFlash.baseBlur, CURSOR_VISUALS.glowColor),\n transition: reduced\n ? 'none'\n : `left ${guidedCursor.glideMs}ms cubic-bezier(0.22, 1, 0.36, 1), top ${guidedCursor.glideMs}ms cubic-bezier(0.22, 1, 0.36, 1)`,\n }\n\n return createPortal(\n <div aria-hidden className=\"pointer-events-none fixed inset-0 z-[2147483647]\">\n {snap.visible &&\n (markSrc ? (\n <img\n ref={markRef as Ref<HTMLImageElement>}\n data-testid=\"guided-cursor\"\n src={markSrc}\n alt=\"\"\n style={{ ...markStyle, width: CURSOR_VISUALS.mark.width, height: 'auto' }}\n />\n ) : (\n <div\n ref={markRef as Ref<HTMLDivElement>}\n data-testid=\"guided-cursor\"\n style={{ ...RING_STYLE, ...markStyle, background: CURSOR_VISUALS.fillColor }}\n />\n ))}\n {ripples.map((r) => (\n <RippleDot key={r.id} x={r.x} y={r.y} />\n ))}\n </div>,\n document.body\n )\n}\n","/**\n * LoadingIndicator Component\n *\n * Centralized loading indicator for consistent loading states across the app\n * A spinner in a 16rem-tall centered box, or the full-screen `splash`\n */\n\nimport { useEffect, useState, type ReactNode } from 'react'\nimport { Sparkle } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface LoadingIndicatorProps {\n /**\n * `spinner` (default): a ring spinner. `splash`: the full-screen loading screen, the host's\n * `logo` pulsing above three bouncing sparkles, over the whole viewport.\n */\n variant?: 'spinner' | 'splash'\n /** The brand mark a `splash` shows (e.g. the site's logo `<img>`). */\n logo?: ReactNode\n /**\n * Render nothing for this long first, so a short load (a lazy chunk on a first visit) never\n * flashes a loading state. In ms; default 0.\n */\n delayMs?: number\n /** Optional message to display below the spinner */\n message?: string\n /** Additional CSS classes */\n className?: string\n /** Test ID for testing */\n testId?: string\n}\n\nconst SPARKLE_DELAYS = ['0s', '0.1s', '0.2s']\nconst SPLASH_CLASS =\n 'fixed top-0 left-0 w-full h-full flex flex-col items-center justify-center bg-background bg-opacity-50 z-50'\n\nfunction useShowAfter(delayMs: number): boolean {\n const [show, setShow] = useState(delayMs <= 0)\n useEffect(() => {\n if (delayMs <= 0) return\n const timer = setTimeout(() => setShow(true), delayMs)\n return () => clearTimeout(timer)\n }, [delayMs])\n return show\n}\n\nexport function LoadingIndicator({\n variant = 'spinner',\n logo,\n delayMs = 0,\n message,\n className,\n testId = 'loading-indicator',\n}: LoadingIndicatorProps) {\n const show = useShowAfter(delayMs)\n if (!show) return null\n\n if (variant === 'splash') {\n return (\n <div\n data-testid={testId}\n // Joined, not `cn`-merged: tailwind-merge reads `bg-opacity-50` as a background colour\n // and would drop `bg-background`.\n className={[SPLASH_CLASS, className].filter(Boolean).join(' ')}\n >\n <div className=\"flex flex-col items-center space-y-4\">\n {logo}\n <div className=\"flex space-x-1\">\n {SPARKLE_DELAYS.map((delay) => (\n <Sparkle\n key={delay}\n className=\"w-4 h-4 text-primary animate-bounce fill-current\"\n style={delay === '0s' ? undefined : { animationDelay: delay }}\n />\n ))}\n </div>\n {message && <p className=\"text-sm text-muted-foreground\">{message}</p>}\n </div>\n </div>\n )\n }\n\n return (\n <div\n className={cn('flex h-64 flex-col items-center justify-center gap-3', className)}\n data-testid={testId}\n >\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-border border-t-primary\" />\n {message && <p className=\"text-sm text-muted-foreground\">{message}</p>}\n </div>\n )\n}\n","/**\n * GridRowNavigator\n *\n * A ‹ n / N › row navigator for an AG Grid table — the table twin of the one\n * the calendar and timeline blocks portal into the Facts toolbar, and the same\n * control on the Files table. It walks the rows in the ORDER THE TABLE SHOWS\n * THEM (after the grid's own sort and quick filters), scrolls each into view\n * and hands it to `onSelect` (Facts opens it in the composer, Files in the\n * viewer), so the row being stepped to is the one highlighted on screen.\n *\n * The position tracks `selectedId` (the fact open in the composer / the doc in\n * the viewer), falling back to \"– / N\" when nothing is open. It re-reads the\n * grid whenever its row model changes (sort, filter, data), so the counter\n * stays honest.\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport type { GridApi } from 'ag-grid-community'\nimport { RowNavigatorControls } from './RowNavigatorControls'\n\nexport interface GridRowNavigatorProps<T> {\n /** The mounted grid's API, or null until the grid is ready. */\n gridApi: GridApi<T> | null\n /** The row currently open — where the counter points. */\n selectedId: string | null\n /** Open the row the user stepped to. */\n onSelect: (item: T) => void\n /** Prefix for every `data-testid` this control emits. */\n testId: string\n /** Noun for the buttons' aria-labels (\"Previous fact\" / \"Next document\"). */\n itemLabel?: string\n}\n\n/** Grid events after which the displayed row order or count may differ. */\nconst ROW_MODEL_EVENTS = ['modelUpdated', 'sortChanged', 'filterChanged', 'rowDataUpdated'] as const\n\nexport function GridRowNavigator<T>({\n gridApi,\n selectedId,\n onSelect,\n testId,\n itemLabel = 'row',\n}: GridRowNavigatorProps<T>) {\n const [{ total, currentIndex }, setPosition] = useState<{\n total: number\n currentIndex: number | null\n }>({ total: 0, currentIndex: null })\n\n const readPosition = useCallback(() => {\n if (!gridApi || gridApi.isDestroyed()) {\n setPosition({ total: 0, currentIndex: null })\n return\n }\n const total = gridApi.getDisplayedRowCount()\n const node = selectedId ? gridApi.getRowNode(selectedId) : undefined\n const index = node?.rowIndex\n // A selected row hidden by the grid's filter has no displayed index.\n setPosition({ total, currentIndex: typeof index === 'number' && index >= 0 ? index : null })\n }, [gridApi, selectedId])\n\n useEffect(() => {\n readPosition()\n if (!gridApi || gridApi.isDestroyed()) return\n for (const ev of ROW_MODEL_EVENTS) gridApi.addEventListener(ev, readPosition)\n return () => {\n if (gridApi.isDestroyed()) return\n for (const ev of ROW_MODEL_EVENTS) gridApi.removeEventListener(ev, readPosition)\n }\n }, [gridApi, readPosition])\n\n const goTo = (index: number) => {\n if (!gridApi || gridApi.isDestroyed()) return\n const clamped = Math.max(0, Math.min(total - 1, index))\n const node = gridApi.getDisplayedRowAtIndex(clamped)\n if (!node?.data) return\n gridApi.ensureIndexVisible(clamped, 'middle')\n onSelect(node.data)\n }\n\n return (\n <RowNavigatorControls\n total={total}\n currentIndex={currentIndex}\n onGo={goTo}\n testId={testId}\n itemLabel={itemLabel}\n />\n )\n}\n","import { Search } from 'lucide-react'\nimport { Input, cn } from '@arbidocs/react/ui'\n\n/** The search bar above a list view. */\nexport function Toolbar({\n search,\n onSearch,\n searchPlaceholder = 'Search…',\n className,\n testId,\n}: {\n search?: string\n onSearch?: (v: string) => void\n searchPlaceholder?: string\n className?: string\n testId?: string\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between',\n className\n )}\n data-testid={testId}\n >\n <div className=\"flex flex-1 flex-wrap items-center gap-2\">\n {onSearch && (\n <div className=\"relative w-full max-w-xs\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => onSearch(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"bg-card text-sm placeholder:text-muted-foreground focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring pl-8\"\n data-testid={testId ? `${testId}-search` : 'toolbar-search'}\n />\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { useEffect, useState, type ReactNode } from 'react'\nimport { Pencil } from 'lucide-react'\nimport { Input, Textarea, cn } from '@arbidocs/react/ui'\n\n/** Longest a name may be. Exported so a form editing the same field agrees. */\nexport const IDENTITY_NAME_MAX_LENGTH = 50\n\n/** Shown once the remaining allowance gets this low, not for the whole time. */\nconst COUNTER_THRESHOLD = 10\n\nexport interface EntityIdentityField {\n /** Row caption. Rendered with a trailing colon. */\n label: string\n value: string\n /** Stands in for an empty value, in italics — never a blank row. */\n placeholder: string\n /** Commits the edit. Not called when the value is unchanged. */\n onSave: (next: string) => void\n /** A description needs line breaks; a name does not. */\n multiline?: boolean\n /** Caps the input and shows a counter as it fills. Names only, by default. */\n maxLength?: number\n /** Classes for the read-mode value, e.g. a larger weight for the name. */\n valueClassName?: string\n /**\n * Content pinned to the RIGHT END of this row — e.g. the owning project\n * beside a name, a member stack beside a status. Rows without one let their\n * value run the full width, which is what a description wants.\n */\n trailing?: ReactNode\n /**\n * Content rendered immediately BEFORE the value — the entity's own mark.\n * Sits outside the edit swap, so starting to edit the name doesn't make the\n * icon jump or disappear.\n */\n leading?: ReactNode\n /**\n * Drops the caption from view for this row, leaving the value flush left.\n * For a field whose value already says what it is — a workspace's name and\n * description read as exactly that — the caption is a word the eye has to\n * step over on the way in. The caption stays in the markup for screen\n * readers, which have no such visual cue to fall back on.\n */\n hideLabel?: boolean\n /** Row test id; the pencil and input derive `-edit` and `-input`. */\n testId?: string\n}\n\nexport interface EntityIdentityBarProps {\n /** The editable text fields, in order. Usually name then description. */\n fields: EntityIdentityField[]\n /** Hides every pencil. A viewer without permission sees values, not controls. */\n canEdit?: boolean\n /** Trailing controls, pinned right — e.g. a member stack, a status. */\n actions?: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * The \"what am I looking at\" bar for an entity's own page.\n *\n * A caption column (`Name:`, `Description:`, `Project:`) and a value column. The\n * captions are the point: a bare bold string at the top of a page reads equally\n * as a workspace, a project, a case file or a folder, and people read it as\n * whichever they expected. Saying which field is which costs one column and\n * removes the ambiguity entirely.\n *\n * Editing happens in place. The pencil is always visible to someone who can use\n * it rather than revealed on hover — a control you have to go hunting for is one\n * most people never find, and hover doesn't exist on touch. Commit is on blur\n * and on Enter (single-line fields only, so a description can hold line\n * breaks); Escape abandons the edit.\n *\n * Deliberately NOT a form: no submit, no dirty state, no field-level errors.\n * When a consumer needs visibility toggles, destructive actions or validation\n * messages, those belong in its settings form — this bar is the identity of the\n * thing, shown where you are working on it.\n *\n * Styled with SEMANTIC tokens only, so every host gets it in its own colours.\n */\nexport function EntityIdentityBar({\n fields,\n canEdit = false,\n actions,\n className,\n testId,\n}: EntityIdentityBarProps) {\n return (\n <div\n className={cn('flex flex-wrap items-start justify-between gap-x-6 gap-y-3', className)}\n data-testid={testId}\n >\n <dl className=\"min-w-0 flex-1 space-y-1.5\">\n {fields.map((field) => (\n <IdentityFieldRow key={field.label} field={field} canEdit={canEdit} />\n ))}\n </dl>\n {actions ? <div className=\"flex shrink-0 items-center gap-2\">{actions}</div> : null}\n </div>\n )\n}\n\nfunction IdentityFieldRow({ field, canEdit }: { field: EntityIdentityField; canEdit: boolean }) {\n const {\n label,\n value,\n placeholder,\n onSave,\n multiline = false,\n maxLength,\n valueClassName,\n leading,\n hideLabel,\n trailing,\n testId,\n } = field\n\n const [isEditing, setIsEditing] = useState(false)\n const [draft, setDraft] = useState(value)\n\n // Track the value while not editing, so an update from elsewhere (another\n // tab, a websocket) doesn't get overwritten by a stale draft on the next edit.\n useEffect(() => {\n if (!isEditing) setDraft(value)\n }, [value, isEditing])\n\n const commit = () => {\n setIsEditing(false)\n const next = draft.trim()\n if (next !== value) onSave(next)\n }\n\n const cancel = () => {\n setDraft(value)\n setIsEditing(false)\n }\n\n const charsLeft = maxLength === undefined ? null : maxLength - draft.length\n\n // Editing must not move anything. The input carries the read view's exact\n // typography and padding, drops the border and shadow entirely, and marks\n // focus with a contrasting FIELD instead — a box appearing around the text\n // (and the row growing to fit it) reads as the page jumping under the cursor.\n const fieldClass =\n 'h-auto rounded border-0 bg-muted px-1.5 py-0.5 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'\n\n const shared = {\n autoFocus: true,\n value: draft,\n placeholder,\n maxLength,\n 'aria-label': label,\n 'data-testid': testId && `${testId}-input`,\n onBlur: commit,\n onChange: (e: { target: { value: string } }) => setDraft(e.target.value),\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n cancel()\n } else if (e.key === 'Enter' && !multiline) {\n e.preventDefault()\n commit()\n }\n },\n }\n\n // Every row shares one minimum height: that of the small controls (h-7) a\n // row may carry at its trailing end. A row that is only text then sits in\n // the same rhythm as one holding a button, so the captions fall on an even\n // beat down the bar instead of bunching up wherever a row has no control.\n return (\n <div className={cn('flex min-h-7 min-w-0 gap-2', multiline ? 'items-start' : 'items-center')}>\n <dt\n className={cn(\n hideLabel\n ? 'sr-only'\n : cn('w-24 shrink-0 text-sm font-medium text-muted-foreground', multiline && 'pt-1')\n )}\n >\n {label}:\n </dt>\n {/* Wraps under sm: the trailing controls drop to their own line instead of overflowing. */}\n <dd className=\"flex min-w-0 flex-1 flex-wrap items-center gap-x-2 gap-y-1.5 sm:flex-nowrap\">\n {leading}\n {isEditing ? (\n <div className=\"relative min-w-0 flex-1 max-sm:basis-[calc(100%-2.5rem)]\">\n {multiline ? (\n <Textarea\n {...shared}\n rows={2}\n className={cn(fieldClass, 'min-h-0 resize-none leading-snug', valueClassName)}\n />\n ) : (\n <Input {...shared} className={cn(fieldClass, 'pr-20', valueClassName)} />\n )}\n {charsLeft !== null && charsLeft <= COUNTER_THRESHOLD && (\n <span\n className={cn(\n 'pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 text-sm lg:block',\n charsLeft < 0 ? 'text-destructive' : 'text-muted-foreground'\n )}\n data-testid={testId && `${testId}-counter`}\n >\n {charsLeft < 0 ? `${-charsLeft} over` : `${charsLeft} left`}\n </span>\n )}\n </div>\n ) : (\n // `identity-field` (not the generic `group`) scopes the pencil's hover\n // to THIS field only — an ancestor card also carries `group`, so a\n // `.group:hover` rule would reveal every field's pencil at once.\n <span className=\"identity-field flex min-w-0 flex-1 items-center gap-1.5 sm:flex-none\">\n {/* Same padding as the input above — the swap must not nudge the\n text sideways or change the row's height. */}\n <span className={cn('px-1.5 py-0.5', valueClassName)} data-testid={testId}>\n {value || <span className=\"italic text-muted-foreground\">{placeholder}</span>}\n </span>\n {canEdit && (\n <button\n type=\"button\"\n onClick={() => setIsEditing(true)}\n aria-label={`Edit ${label.toLowerCase()}`}\n title={`Edit ${label.toLowerCase()}`}\n // Quiet by default — the pencil only surfaces when the row is\n // hovered so it reads as clean text, and stays reachable by\n // keyboard (focus-visible).\n //\n // NB: use the ungated `[.identity-field:hover_&]` selector rather\n // than Tailwind's `group-hover:`. The latter compiles behind\n // `@media (hover: hover)`, so on a touchscreen (whose PRIMARY\n // pointer reports `hover: none`) the rule is disabled even when a\n // real mouse is firing hover events — the pencil then stays at\n // opacity-0 forever. The arbitrary selector has no media gate, so\n // it reveals on any genuine `:hover`.\n className=\"shrink-0 cursor-pointer rounded p-1 text-muted-foreground opacity-60 transition-[color,background-color,opacity] hover:bg-accent hover:text-foreground focus-visible:opacity-100 pointer-coarse:p-[15px] [.identity-field:hover_&]:opacity-100\"\n data-testid={testId && `${testId}-edit`}\n >\n <Pencil className=\"size-3.5\" />\n </button>\n )}\n </span>\n )}\n {trailing ? (\n <div className=\"min-w-0 shrink-0 max-sm:w-full sm:ml-auto\">{trailing}</div>\n ) : null}\n </dd>\n </div>\n )\n}\n","/**\n * The workspace activity feed's entries, as `GET /v1/workspace/{id}/activity` returns them, and what\n * each one says and opens. Everything a person is not pushed (uploads, other people's threads, runs)\n * can still be found here.\n */\n\nimport {\n DEFAULT_TASK_ACTIVITY_LABELS,\n taskActivityHeadline,\n type TaskActivityKind,\n} from '../agents/tasks/TaskActivityTimeline'\n\n/** Where an entry comes from. */\nexport type WorkspaceActivitySource = 'thread' | 'message' | 'document' | 'workflow'\n\n/** One entry of the feed (the shape of the API's `WorkspaceActivityEntry`). */\nexport interface WorkspaceActivityItem {\n external_id: string\n source: WorkspaceActivitySource\n /** A thread event kind, `message_posted`, `document_uploaded` / `_version` / `_signed`, `workflow_run`. */\n kind: string\n actor_ext_id?: string | null\n conversation_ext_id?: string | null\n /** Decrypted when the session has the workspace open, else null. */\n conversation_title?: string | null\n message_ext_id?: string | null\n document_ext_id?: string | null\n document_name?: string | null\n version?: number | null\n workflow_ext_id?: string | null\n workflow_name?: string | null\n /** A workflow run's status. */\n status?: string | null\n detail?: Record<string, unknown> | null\n created_at: string\n}\n\n/** What clicking an entry opens. */\nexport type WorkspaceActivityTarget =\n | { kind: 'thread'; conversationId: string; messageId?: string }\n | { kind: 'document'; documentId: string; version?: number }\n | { kind: 'workflow'; workflowId: string; conversationId?: string }\n\n/** The thread, document version or run an entry opens; null when it names nothing openable. */\nexport function workspaceActivityTarget(\n item: WorkspaceActivityItem\n): WorkspaceActivityTarget | null {\n switch (item.source) {\n case 'thread':\n case 'message':\n return item.conversation_ext_id\n ? {\n kind: 'thread',\n conversationId: item.conversation_ext_id,\n ...(item.message_ext_id ? { messageId: item.message_ext_id } : {}),\n }\n : null\n case 'document':\n if (!item.document_ext_id) return null\n // An upload is the document as it was first saved; a new version or a signature opens that version.\n return item.kind !== 'document_uploaded' && item.version\n ? { kind: 'document', documentId: item.document_ext_id, version: item.version }\n : { kind: 'document', documentId: item.document_ext_id }\n case 'workflow':\n return item.workflow_ext_id\n ? {\n kind: 'workflow',\n workflowId: item.workflow_ext_id,\n ...(item.conversation_ext_id ? { conversationId: item.conversation_ext_id } : {}),\n }\n : null\n default:\n return null\n }\n}\n\nconst quoted = (name: string | null | undefined, fallback: string) =>\n name ? `“${name}”` : fallback\n\n/** What happened, without who did it: \"Uploaded “Lease.pdf”\", \"Marked done in “Smith v Jones”\". */\nexport function workspaceActivityHeadline(item: WorkspaceActivityItem): string {\n const thread = quoted(item.conversation_title, 'a thread')\n const document = quoted(item.document_name, 'a document')\n switch (item.kind) {\n case 'message_posted':\n return `Posted in ${thread}`\n case 'document_uploaded':\n return `Uploaded ${document}`\n case 'document_version':\n return item.version\n ? `Saved version ${item.version} of ${document}`\n : `Saved a new version of ${document}`\n case 'document_signed':\n return `Signed ${document}`\n case 'workflow_run': {\n const run = `Ran ${quoted(item.workflow_name, 'a workflow')}`\n return item.status ? `${run} (${item.status.replace(/_/g, ' ')})` : run\n }\n default: {\n const headline = taskActivityHeadline(\n { kind: item.kind as TaskActivityKind, detail: item.detail },\n DEFAULT_TASK_ACTIVITY_LABELS\n )\n return `${headline} in ${thread}`\n }\n }\n}\n","import { assistantCopy, useAssistantCopy } from '@arbidocs/react/shell'\nimport type { ReactNode } from 'react'\nimport { Activity, FileText, MessageSquare, Workflow } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport {\n workspaceActivityHeadline,\n workspaceActivityTarget,\n type WorkspaceActivityItem,\n type WorkspaceActivitySource,\n type WorkspaceActivityTarget,\n} from './workspace-activity'\n\nexport interface WorkspaceActivityListLabels {\n empty: string\n loading: string\n error: string\n loadMore: string\n loadingMore: string\n retry: string\n /** Who did it when the entry names no one. */\n system: string\n}\n\nexport const DEFAULT_WORKSPACE_ACTIVITY_LABELS: WorkspaceActivityListLabels = {\n empty: 'Nothing has happened in this workspace yet.',\n loading: 'Loading activity…',\n error: 'Could not load the activity.',\n loadMore: 'Show older',\n loadingMore: 'Loading…',\n retry: 'Retry',\n system: assistantCopy().name,\n}\n\nexport interface WorkspaceActivityListProps {\n /** Entries, newest first (every page loaded so far). */\n items: readonly WorkspaceActivityItem[]\n isLoading?: boolean\n isError?: boolean\n /** Another page exists. */\n hasMore?: boolean\n isLoadingMore?: boolean\n onLoadMore?: () => void\n onRetry?: () => void\n /** Open what an entry is about: its thread, document version or run. */\n onOpen?: (target: WorkspaceActivityTarget, item: WorkspaceActivityItem) => void\n /** A person's or agent's display name by id. */\n nameOf?: (id: string) => string | undefined\n /** \"2 hours ago\"; default the local date and time. */\n formatTime?: (iso: string) => string\n labels?: Partial<WorkspaceActivityListLabels>\n className?: string\n testId?: string\n}\n\nconst ICONS: Record<WorkspaceActivitySource, ReactNode> = {\n thread: <Activity className=\"size-4\" aria-hidden />,\n message: <MessageSquare className=\"size-4\" aria-hidden />,\n document: <FileText className=\"size-4\" aria-hidden />,\n workflow: <Workflow className=\"size-4\" aria-hidden />,\n}\n\nconst localTime = (iso: string) => new Date(iso).toLocaleString()\n\n/** A workspace's activity, newest first, one line per entry; a line opens what it is about. */\nexport function WorkspaceActivityList({\n items,\n isLoading,\n isError,\n hasMore,\n isLoadingMore,\n onLoadMore,\n onRetry,\n onOpen,\n nameOf,\n formatTime = localTime,\n labels,\n className,\n testId = 'workspace-activity',\n}: WorkspaceActivityListProps) {\n const assistant = useAssistantCopy()\n const l = { ...DEFAULT_WORKSPACE_ACTIVITY_LABELS, system: assistant.name, ...labels }\n if (isLoading)\n return (\n <p className={cn('p-3 text-sm text-muted-foreground', className)} data-testid={testId}>\n {l.loading}\n </p>\n )\n if (isError && items.length === 0)\n return (\n <div\n className={cn('flex items-center gap-2 p-3 text-sm text-muted-foreground', className)}\n data-testid={testId}\n >\n <span role=\"alert\">{l.error}</span>\n {onRetry && (\n <Button size=\"sm\" variant=\"ghost\" onClick={onRetry}>\n {l.retry}\n </Button>\n )}\n </div>\n )\n if (items.length === 0)\n return (\n <p className={cn('p-3 text-sm text-muted-foreground', className)} data-testid={testId}>\n {l.empty}\n </p>\n )\n\n return (\n <div className={cn('flex flex-col', className)} data-testid={testId}>\n <ul className=\"divide-y divide-border\" data-testid={`${testId}-list`}>\n {items.map((item) => {\n const target = workspaceActivityTarget(item)\n const actor = item.actor_ext_id ? (nameOf?.(item.actor_ext_id) ?? null) : l.system\n const body = (\n <>\n <span className=\"mt-0.5 shrink-0 text-muted-foreground\">{ICONS[item.source]}</span>\n <span className=\"min-w-0 flex-1 text-sm\">\n {actor && <span className=\"font-medium\">{actor} </span>}\n <span className=\"text-muted-foreground\">{workspaceActivityHeadline(item)}</span>\n </span>\n <time\n dateTime={item.created_at}\n className=\"shrink-0 text-xs tabular-nums text-muted-foreground\"\n >\n {formatTime(item.created_at)}\n </time>\n </>\n )\n return (\n <li\n key={item.external_id}\n data-testid={`${testId}-item-${item.external_id}`}\n data-kind={item.kind}\n >\n {target && onOpen ? (\n <button\n type=\"button\"\n className=\"flex w-full items-start gap-3 px-3 py-2 text-left hover:bg-accent focus-visible:bg-accent focus-visible:outline-none\"\n onClick={() => onOpen(target, item)}\n >\n {body}\n </button>\n ) : (\n <div className=\"flex items-start gap-3 px-3 py-2\">{body}</div>\n )}\n </li>\n )\n })}\n </ul>\n {hasMore && onLoadMore && (\n <div className=\"flex justify-center p-2\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={isLoadingMore}\n onClick={onLoadMore}\n data-testid={`${testId}-load-more`}\n >\n {isLoadingMore ? l.loadingMore : l.loadMore}\n </Button>\n </div>\n )}\n </div>\n )\n}\n","/**\n * A table of tags as data: the rows are tags (every issue, every person, a label's children) with\n * their values and links, the columns their kind's fields in the workspace (its issue fields …),\n * and each row's linked documents, facts and threads its evidence. Pure helpers for `TagTable`: a\n * row's value, the gaps, and the snapshot as a Markdown document.\n */\n\nimport type { components } from '@arbidocs/client'\n\n/**\n * A column: one of the kind's fields. A `'tag'` field links to tags (its `options` are the kinds it\n * may point at; its value is a list of tag ids), e.g. a person's Organisation.\n */\nexport type TagTableField = components['schemas']['FieldDefinition']\nexport type TagTableFieldType = TagTableField['type']\n/** A field as written back to the kind (`id` keeps it and its values). */\nexport type TagTableFieldWrite = components['schemas']['FieldDefinitionWrite']\n/** A row: a tag, with its links (`include=links` on the list). */\nexport type TagTableRow = components['schemas']['TagResponse']\nexport type TagTableLinks = components['schemas']['TagLinks']\n\n/** What a table shows: the kind's fields as columns, and its tags as rows. */\nexport interface TagTableData {\n columns: TagTableField[]\n rows: TagTableRow[]\n}\n\nconst NO_LINKS: TagTableLinks = {\n docs: [],\n facts: [],\n threads: [],\n doc_count: 0,\n fact_count: 0,\n thread_count: 0,\n}\n\n/** A row's links (none when the list was read without them). */\nexport const rowLinks = (row: TagTableRow): TagTableLinks => row.links ?? NO_LINKS\n\n/** A row's value for a column (values are keyed by field id). */\nexport const cellValue = (row: TagTableRow, column: TagTableField): unknown =>\n row.field_values?.[column.id]\n\n/** A row with nothing behind it: no linked document, fact or thread. */\nexport const isGap = (row: TagTableRow): boolean => {\n const l = rowLinks(row)\n return l.doc_count + l.fact_count + l.thread_count === 0\n}\n\n/**\n * The tags a link field (`type: 'tag'`) points at: a list of tag ids (a single id is read as one;\n * anything else is none).\n */\nexport function linkedTagIds(value: unknown): string[] {\n if (typeof value === 'string') return value ? [value] : []\n return Array.isArray(value) ? value.filter((id): id is string => typeof id === 'string') : []\n}\n\n/** A value as text (a person or a linked tag by name, a checkbox as yes or no, blank as empty). */\nexport function cellText(\n value: unknown,\n column: Pick<TagTableField, 'type'>,\n nameOf?: (id: string) => string | undefined\n): string {\n if (value === undefined || value === null || value === '') return ''\n if (column.type === 'checkbox') return value ? 'Yes' : 'No'\n if (column.type === 'person' && typeof value === 'string') return nameOf?.(value) ?? value\n if (column.type === 'tag')\n return linkedTagIds(value)\n .map((id) => nameOf?.(id) ?? id)\n .join(', ')\n if (Array.isArray(value)) return value.map(String).join(', ')\n return String(value)\n}\n\n/** A typed input's text back as the value to store (`null` clears it). */\nexport function parseCell(text: string, type: TagTableFieldType): unknown {\n const t = text.trim()\n if (t === '') return null\n if (type === 'number') {\n const n = Number(t)\n return Number.isNaN(n) ? null : n\n }\n return t\n}\n\n/** The kind's fields as definitions to write back, every one kept by id. */\nexport const fieldWrites = (columns: readonly TagTableField[]): TagTableFieldWrite[] =>\n columns.map((c) => ({ id: c.id, name: c.name, type: c.type, options: c.options ?? null }))\n\nconst escapeCell = (text: string) => text.replace(/\\|/g, '\\\\|').replace(/\\n+/g, ' ')\n\nexport interface TagTableMarkdownOptions {\n title: string\n /** The evidence column's heading. */\n evidence?: string\n /** The row column's heading. */\n rowHeading?: string\n nameOf?: (id: string) => string | undefined\n /** When the snapshot was taken (ISO); default now. */\n at?: string\n}\n\n/**\n * The table as a Markdown document: a heading, when it was taken, and one table (a row per tag, a\n * column per field, then the evidence counts). What a host files or has signed.\n */\nexport function tagTableMarkdown(table: TagTableData, options: TagTableMarkdownOptions): string {\n const { columns } = table\n const heads = [\n options.rowHeading ?? 'Item',\n ...columns.map((c) => c.name),\n options.evidence ?? 'Evidence',\n ]\n const lines = [\n `# ${options.title}`,\n '',\n `_Snapshot taken ${new Date(options.at ?? Date.now()).toISOString().slice(0, 16).replace('T', ' ')} UTC_`,\n '',\n `| ${heads.map(escapeCell).join(' | ')} |`,\n `| ${heads.map(() => '---').join(' | ')} |`,\n ]\n for (const row of table.rows) {\n const l = rowLinks(row)\n const evidence = [\n `${l.doc_count} document${l.doc_count === 1 ? '' : 's'}`,\n `${l.fact_count} fact${l.fact_count === 1 ? '' : 's'}`,\n ...(l.thread_count ? [`${l.thread_count} thread${l.thread_count === 1 ? '' : 's'}`] : []),\n ].join(', ')\n const cells = [\n row.name,\n ...columns.map((c) => cellText(cellValue(row, c), c, options.nameOf)),\n evidence,\n ]\n lines.push(`| ${cells.map(escapeCell).join(' | ')} |`)\n }\n return `${lines.join('\\n')}\\n`\n}\n","/**\n * The columns of a table of tags — the fields of their kind in the workspace (its issue fields …) —\n * edited as one list: rename, reorder by position, add, remove, and a choice field's options. A kept\n * column keeps its id, so its values stay (its type is fixed once created). Saved in full through\n * the host (`onSave`); data-free.\n */\n\nimport { useState } from 'react'\nimport { ArrowDown, ArrowUp, Loader2, Plus, X } from 'lucide-react'\nimport { Button, Input, cn } from '@arbidocs/react/ui'\nimport type { TagTableField, TagTableFieldType, TagTableFieldWrite } from './tagTableModel'\n\nexport interface TagColumnsEditorLabels {\n title: string\n addColumn: string\n name: string\n type: string\n options: string\n optionsPlaceholder: string\n remove: string\n moveUp: string\n moveDown: string\n save: string\n saving: string\n cancel: string\n empty: string\n types: Record<TagTableFieldType, string>\n}\n\nexport const DEFAULT_TAG_COLUMNS_EDITOR_LABELS: TagColumnsEditorLabels = {\n title: 'Columns',\n addColumn: 'Add column',\n name: 'Column name',\n type: 'Type',\n options: 'Choices',\n optionsPlaceholder: 'Choices, comma-separated',\n remove: 'Remove column',\n moveUp: 'Move up',\n moveDown: 'Move down',\n save: 'Save columns',\n saving: 'Saving…',\n cancel: 'Cancel',\n empty: 'No columns.',\n types: {\n text: 'Text',\n number: 'Number',\n date: 'Date',\n checkbox: 'Yes / no',\n select: 'Choice',\n person: 'Person',\n document: 'Document',\n relation: 'Relation',\n lookup: 'Lookup',\n rollup: 'Rollup',\n tag: 'Link to tags',\n },\n}\n\n/** The types a tag's field can have. */\nconst TYPES: TagTableFieldType[] = ['text', 'number', 'date', 'checkbox', 'select', 'person']\n\ninterface Draft {\n id?: string\n name: string\n type: TagTableFieldType\n options: string\n}\n\nconst toDraft = (f: TagTableField): Draft => ({\n id: f.id,\n name: f.name,\n type: f.type,\n options: (f.options ?? []).join(', '),\n})\n\nconst toWrite = (d: Draft): TagTableFieldWrite => ({\n ...(d.id ? { id: d.id } : {}),\n name: d.name.trim(),\n type: d.type,\n options:\n d.type === 'tag'\n ? d.options\n .split(',')\n .map((o) => o.trim())\n .filter(Boolean)\n : d.type === 'select'\n ? d.options\n .split(',')\n .map((o) => o.trim())\n .filter(Boolean)\n : null,\n})\n\nexport interface TagColumnsEditorProps {\n columns: TagTableField[]\n /** Save the columns in full; a rejection (e.g. two columns of one name) stays on screen. */\n onSave: (fields: TagTableFieldWrite[]) => void | Promise<unknown>\n onCancel: () => void\n labels?: Partial<TagColumnsEditorLabels>\n className?: string\n testId?: string\n}\n\nexport function TagColumnsEditor({\n columns,\n onSave,\n onCancel,\n labels,\n className,\n testId = 'tag-columns',\n}: TagColumnsEditorProps) {\n const l = { ...DEFAULT_TAG_COLUMNS_EDITOR_LABELS, ...labels }\n const [drafts, setDrafts] = useState<Draft[]>(() => columns.map(toDraft))\n const [saving, setSaving] = useState(false)\n const patch = (i: number, change: Partial<Draft>) =>\n setDrafts((ds) => ds.map((d, j) => (j === i ? { ...d, ...change } : d)))\n const move = (i: number, by: number) =>\n setDrafts((ds) => {\n const next = [...ds]\n const [d] = next.splice(i, 1)\n next.splice(i + by, 0, d)\n return next\n })\n const valid = drafts.every(\n (d) => d.name.trim() && (d.type !== 'select' || toWrite(d).options?.length)\n )\n const input =\n 'h-8 rounded-md border border-input bg-background px-2 text-sm focus:outline-none focus:ring-1 focus:ring-ring'\n\n return (\n <form\n className={cn('space-y-2 rounded-lg border border-border p-3', className)}\n onSubmit={async (e) => {\n e.preventDefault()\n if (!valid) return\n setSaving(true)\n try {\n await onSave(drafts.map(toWrite))\n } finally {\n setSaving(false)\n }\n }}\n data-testid={testId}\n >\n <h3 className=\"text-sm font-semibold\">{l.title}</h3>\n {drafts.length === 0 && <p className=\"text-sm text-muted-foreground\">{l.empty}</p>}\n <ul className=\"space-y-2\">\n {drafts.map((d, i) => (\n <li\n key={d.id ?? `new-${i}`}\n className=\"flex flex-wrap items-center gap-2\"\n data-testid={`${testId}-column-${i}`}\n >\n <Input\n className=\"h-8 w-48\"\n value={d.name}\n placeholder={l.name}\n aria-label={l.name}\n onChange={(e) => patch(i, { name: e.target.value })}\n data-testid={`${testId}-name-${i}`}\n />\n <select\n className={cn(input, 'w-32')}\n value={d.type}\n // A column's type is fixed once it exists: its values were written for it.\n disabled={!!d.id}\n aria-label={l.type}\n onChange={(e) => patch(i, { type: e.target.value as TagTableFieldType })}\n data-testid={`${testId}-type-${i}`}\n >\n {(TYPES.includes(d.type) ? TYPES : [d.type, ...TYPES]).map((t) => (\n <option key={t} value={t}>\n {l.types[t]}\n </option>\n ))}\n </select>\n {d.type === 'select' && (\n <Input\n className=\"h-8 min-w-48 flex-1\"\n value={d.options}\n placeholder={l.optionsPlaceholder}\n aria-label={l.options}\n onChange={(e) => patch(i, { options: e.target.value })}\n data-testid={`${testId}-options-${i}`}\n />\n )}\n <div className=\"ml-auto flex items-center\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={i === 0}\n aria-label={l.moveUp}\n onClick={() => move(i, -1)}\n >\n <ArrowUp className=\"size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={i === drafts.length - 1}\n aria-label={l.moveDown}\n onClick={() => move(i, 1)}\n >\n <ArrowDown className=\"size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={l.remove}\n onClick={() => setDrafts((ds) => ds.filter((_, j) => j !== i))}\n data-testid={`${testId}-remove-${i}`}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n </li>\n ))}\n </ul>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setDrafts((ds) => [...ds, { name: '', type: 'text', options: '' }])}\n data-testid={`${testId}-add`}\n >\n <Plus className=\"size-4\" /> {l.addColumn}\n </Button>\n <div className=\"ml-auto flex items-center gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n {l.cancel}\n </Button>\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={!valid || saving}\n data-testid={`${testId}-save`}\n >\n {saving && <Loader2 className=\"size-4 animate-spin\" />}\n {saving ? l.saving : l.save}\n </Button>\n </div>\n </div>\n </form>\n )\n}\n","/**\n * A table of tags (every issue, every person, a label's children): one row per tag, a column per\n * field of their kind in the workspace, editable in place by type (text, number, date, checkbox,\n * choice, person, a link to other tags), and counts of the documents,\n * facts and threads tagged with each row. A count opens its filtered content page. A row with nothing tagged yet is a normal row with an empty\n * cell. Rows and columns can be added (the columns are the kind's fields, edited as one list), and\n * the table exported as a Word document snapshot (filed in the workspace) or downloaded.\n * The data and every write come from the host (`ConnectedTagTable` binds them to ARBI).\n */\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport {\n ArrowUpRight,\n ChevronDown,\n Download,\n FileDown,\n FileText,\n Lightbulb,\n Loader2,\n MessagesSquare,\n MoreHorizontal,\n Plus,\n SlidersHorizontal,\n} from 'lucide-react'\nimport {\n Button,\n TagEntity,\n Checkbox,\n Input,\n cn,\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from '@arbidocs/react/ui'\nimport type { ColDef, ICellRendererParams } from 'ag-grid-community'\nimport { GridView } from '../files/GridView'\nimport {\n cellText,\n cellValue,\n isGap,\n linkedTagIds,\n parseCell,\n rowLinks,\n type TagTableData,\n type TagTableField,\n type TagTableFieldWrite,\n type TagTableRow,\n} from './tagTableModel'\nimport { TagColumnsEditor, type TagColumnsEditorLabels } from './TagColumnsEditor'\n\nexport interface TagTableLabels {\n row: string\n evidence: string\n /** `{count}` documents linked. */\n documents: string\n /** `{count}` facts linked. */\n facts: string\n /** `{count}` threads linked. */\n threads: string\n /** One document, one fact, one thread. */\n document: string\n fact: string\n thread: string\n /** A thread without a title. */\n untitledThread: string\n /** `{count}` more links than shown. */\n more: string\n addRow: string\n addRowPlaceholder: string\n add: string\n export: string\n exporting: string\n download: string\n empty: string\n loading: string\n noColumns: string\n choose: string\n yes: string\n /** Opens the column editor. */\n moreActions: string\n editColumns: string\n /** The column editor's own labels. */\n columns?: Partial<TagColumnsEditorLabels>\n}\n\nexport const DEFAULT_TAG_TABLE_LABELS: TagTableLabels = {\n row: 'Item',\n evidence: 'Tagged items',\n documents: '{count} documents',\n facts: '{count} facts',\n threads: '{count} threads',\n document: '1 document',\n fact: '1 fact',\n thread: '1 thread',\n untitledThread: 'Untitled thread',\n more: '+{count} more',\n addRow: 'Add row',\n addRowPlaceholder: 'Name of the new row',\n add: 'Add',\n export: 'Save as Word document',\n download: 'Download .docx',\n exporting: 'Exporting…',\n empty: 'No rows yet.',\n loading: 'Loading…',\n noColumns: 'No columns yet: add one to give each row a value.',\n choose: '—',\n yes: 'Yes',\n editColumns: 'Columns',\n moreActions: 'More',\n}\n\nexport type TagContentKind = 'documents' | 'facts' | 'threads'\n\nexport interface TagTableProps {\n /** The kind's fields (the columns) and its tags (the rows, with their links). */\n table: TagTableData | undefined\n isLoading?: boolean\n /**\n * Change one cell (`null` clears it). Absent: read only. A promise that rejects means the value\n * was not saved: the cell shows the stored value again (the host tells the person why).\n */\n onChangeValue?: (tagId: string, fieldId: string, value: unknown) => void | Promise<unknown>\n /** Add a row (a new tag of the kind). Absent: no \"Add row\". */\n onAddRow?: (name: string) => void | Promise<unknown>\n /**\n * Set the columns (the kind's fields) in full: a kept column has its `id`. Absent: the columns\n * are fixed.\n */\n onChangeColumns?: (fields: TagTableFieldWrite[]) => void | Promise<unknown>\n /** Open a linked document. */\n onOpenDocument?: (documentId: string) => void\n /** Open a linked fact. */\n onOpenFact?: (factId: string) => void\n /** Open a linked thread (conversation). */\n onOpenThread?: (conversationId: string) => void\n /** Open a row's tag (everything tagged with it). */\n onOpenRow?: (tagId: string) => void\n /** Open the relevant content page filtered by this tag. */\n onOpenTaggedItems?: (tagId: string, kind: TagContentKind) => void\n /** Export the table as it stands (filed as a document). Absent: no export button. */\n onExport?: () => void | Promise<unknown>\n /** Download the table as it stands as a file. Absent: no download button. */\n onDownload?: () => void | Promise<unknown>\n /** Who a person column offers. */\n people?: ReadonlyArray<{ value: string; label: string }>\n /**\n * The tags a link column (`type: 'tag'`) offers — each with its kind; a column offers those of\n * the kinds in its `options` — and names its values by.\n */\n tags?: ReadonlyArray<{ value: string; label: string; kind: string }>\n /** Open a linked tag (a link column's value). */\n onOpenTag?: (tagId: string) => void\n /** Extra controls in the toolbar. */\n actions?: ReactNode\n /** Secondary controls shown inside More, beside column setup and exports. */\n secondaryActions?: ReactNode\n labels?: Partial<TagTableLabels>\n className?: string\n testId?: string\n}\n\n/**\n * The shared GridView keeps the row name pinned, followed by tagged content and sortable fields.\n * Rows fit their content and use the page scroll, preserving the existing table layout. Long names wrap in their column (cut after\n * three lines, in full in the tooltip) and tagged-item chips wrap, so nothing runs into the next\n * column or off the page. Only a matrix with very many fields scrolls, inside its own box.\n */\nconst ROW_LABEL = 'line-clamp-3 whitespace-normal break-words'\n\n/**\n * One editable field value of a tag, by its type: committed on blur or Enter (a checkbox and a\n * choice at once). A table cell, and a field of a single tag's form (`TagDetail`).\n */\nexport function TagTableCell({\n row,\n column,\n people,\n tags,\n onOpenTag,\n onChange,\n l,\n testId,\n}: {\n row: TagTableRow\n column: TagTableField\n people?: TagTableProps['people']\n tags?: TagTableProps['tags']\n onOpenTag?: TagTableProps['onOpenTag']\n onChange?: TagTableProps['onChangeValue']\n l: TagTableLabels\n testId: string\n}) {\n const value = cellValue(row, column)\n const nameOf = (id: string) =>\n (column.type === 'tag' ? tags : people)?.find((p) => p.value === id)?.label\n const shown = cellText(value, column, nameOf)\n const stored = cellText(value, column)\n const [draft, setDraft] = useState(shown)\n const storedRef = useRef(stored)\n const draftRef = useRef(draft)\n draftRef.current = draft\n // The field being typed in, and the stored text its draft started from.\n const editing = useRef<{ from: string } | null>(null)\n // The draft follows the stored value's text, not object identities: a refetch or a column\n // rebuild hands an equal field or value as a new object, and must not wipe what is being typed.\n // A new stored value (someone else's change) replaces the draft unless the person is typing a\n // change of their own: theirs is kept, and saved over it when they leave the field.\n useEffect(() => {\n storedRef.current = stored\n const typing = editing.current\n if (typing && draftRef.current !== typing.from) return\n if (typing) typing.from = stored\n setDraft(stored)\n }, [stored])\n // A save the host refuses (its promise rejects; the host tells the person why) puts the stored\n // value back, so unsaved text never looks saved.\n const set = (next: unknown) => {\n const saving = onChange?.(row.external_id, column.id, next)\n if (saving instanceof Promise) saving.catch(() => setDraft(storedRef.current))\n }\n\n if (column.type === 'tag')\n return (\n <TagLinkCell\n row={row}\n column={column}\n tags={tags}\n onOpenTag={onOpenTag}\n onChange={onChange ? set : undefined}\n l={l}\n testId={testId}\n />\n )\n if (!onChange)\n return (\n <span className=\"block truncate\" title={shown} data-testid={testId}>\n {shown || <span className=\"text-muted-foreground\">{l.choose}</span>}\n </span>\n )\n const field =\n 'h-8 w-full min-w-0 rounded-md border border-transparent bg-transparent px-1.5 text-sm hover:border-input focus:border-input focus:bg-background focus:outline-none'\n switch (column.type) {\n case 'checkbox':\n return (\n <Checkbox\n checked={value === true}\n onCheckedChange={(v) => set(v === true)}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n />\n )\n case 'select':\n case 'person': {\n const options =\n column.type === 'select'\n ? (column.options ?? []).map((o) => ({ value: o, label: o }))\n : (people ?? [])\n return (\n <select\n className={cn(field, 'pr-6')}\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => set(e.target.value || null)}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n >\n <option value=\"\">{l.choose}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n {typeof value === 'string' && value && !options.some((o) => o.value === value) && (\n <option value={value}>{value}</option>\n )}\n </select>\n )\n }\n default: {\n const commit = () => {\n if (draft !== stored) set(parseCell(draft, column.type))\n }\n return (\n <input\n className={cn(field, 'pr-6')}\n type={column.type === 'number' ? 'number' : column.type === 'date' ? 'date' : 'text'}\n value={column.type === 'date' ? draft.slice(0, 10) : draft}\n onChange={(e) => setDraft(e.target.value)}\n onFocus={() => (editing.current = { from: stored })}\n onBlur={() => {\n editing.current = null\n commit()\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur()\n if (e.key === 'Escape') setDraft(stored)\n }}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n />\n )\n }\n }\n}\n\n/**\n * A link field's value: the linked tags as chips that open them, and (editable) a choice among the\n * tags of the kinds the field allows. One link at a time; the value is stored as a list.\n */\nfunction TagLinkCell({\n row,\n column,\n tags,\n onOpenTag,\n onChange,\n l,\n testId,\n}: {\n row: TagTableRow\n column: TagTableField\n tags?: TagTableProps['tags']\n onOpenTag?: TagTableProps['onOpenTag']\n onChange?: (next: unknown) => void\n l: TagTableLabels\n testId: string\n}) {\n const ids = linkedTagIds(cellValue(row, column))\n const kinds = column.options ?? []\n const options = (tags ?? []).filter(\n (t) => t.value !== row.external_id && (kinds.length === 0 || kinds.includes(t.kind))\n )\n const label = (id: string) => tags?.find((t) => t.value === id)?.label ?? id\n const chips = ids.map((id) =>\n onOpenTag ? (\n <button\n key={id}\n type=\"button\"\n onClick={() => onOpenTag(id)}\n className=\"inline-flex min-w-0 max-w-full items-center focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid={`${testId}-link-${id}`}\n >\n <TagEntity tag={{ external_id: id, name: label(id) }} showTooltip={false} wrap />\n </button>\n ) : (\n <span\n key={id}\n className=\"inline-flex min-w-0 max-w-full\"\n data-testid={`${testId}-link-${id}`}\n >\n <TagEntity tag={{ external_id: id, name: label(id) }} showTooltip={false} wrap />\n </span>\n )\n )\n if (!onChange)\n return (\n <span className=\"flex min-w-0 flex-wrap gap-1\" data-testid={testId}>\n {chips.length ? chips : <span className=\"text-muted-foreground\">{l.choose}</span>}\n </span>\n )\n const current = ids[0]\n // The linked name is text that wraps (a narrow column never cuts it to \"Acm…\"), and opens the\n // tag; the picker behind the chevron changes it.\n return (\n // Wraps: in a narrow column the name breaks between words and the picker moves below it.\n <span className=\"flex min-w-0 flex-wrap items-center gap-x-1 py-1\">\n {current &&\n (onOpenTag ? (\n <button\n type=\"button\"\n onClick={() => onOpenTag(current)}\n className=\"max-w-full rounded px-1 text-left text-sm break-words hover:text-primary hover:underline focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={`Open ${label(current)}`}\n title={`Open ${label(current)}`}\n data-testid={`${testId}-open`}\n >\n <TagEntity\n tag={{ external_id: current, name: label(current) }}\n showTooltip={false}\n wrap\n />\n <ArrowUpRight className=\"ml-0.5 inline size-3.5 align-[-2px] text-muted-foreground\" />\n </button>\n ) : (\n <TagEntity\n tag={{ external_id: current, name: label(current) }}\n showTooltip={false}\n wrap\n />\n ))}\n <span\n className={cn(\n 'relative inline-flex h-6 shrink-0 items-center rounded text-muted-foreground hover:bg-muted hover:text-foreground focus-within:ring-2 focus-within:ring-ring',\n current ? 'w-6 justify-center' : 'min-w-0 flex-1 gap-1 px-1 text-sm'\n )}\n title={current ? `${column.name}: ${label(current)}` : undefined}\n >\n {!current && <span className=\"truncate\">{l.choose}</span>}\n <ChevronDown className=\"size-3.5 shrink-0\" />\n <select\n className=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\n value={current ?? ''}\n onChange={(e) => onChange(e.target.value ? [e.target.value] : null)}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n >\n <option value=\"\">{l.choose}</option>\n {options.map((t) => (\n <option key={t.value} value={t.value}>\n {t.label}\n </option>\n ))}\n {current && !options.some((t) => t.value === current) && (\n <option value={current}>{label(current)}</option>\n )}\n </select>\n </span>\n </span>\n )\n}\n\n/** A count as a phrase: \"1 document\", \"3 facts\", or nothing for none. */\nconst countText = (count: number, one: string, many: string) =>\n count === 1 ? one : count ? many.replace('{count}', String(count)) : null\n\n/** Counts open the existing content pages filtered by this tag. No item previews. */\nexport function TagContentCounts({\n row,\n l,\n onOpenTaggedItems,\n onOpenRow,\n testId,\n}: {\n row: TagTableRow\n l: TagTableLabels\n onOpenTaggedItems?: TagTableProps['onOpenTaggedItems']\n onOpenRow?: TagTableProps['onOpenRow']\n testId: string\n}) {\n if (isGap(row)) return null\n const links = rowLinks(row)\n const groups = [\n {\n kind: 'documents' as const,\n count: links.doc_count,\n label: countText(links.doc_count, l.document, l.documents),\n Icon: FileText,\n },\n {\n kind: 'facts' as const,\n count: links.fact_count,\n label: countText(links.fact_count, l.fact, l.facts),\n Icon: Lightbulb,\n },\n {\n kind: 'threads' as const,\n count: links.thread_count,\n label: countText(links.thread_count, l.thread, l.threads),\n Icon: MessagesSquare,\n },\n ].filter((group) => group.count > 0)\n return (\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1\" data-testid={testId}>\n {groups.map(({ kind, label, Icon }, index) => (\n <span key={kind} className=\"inline-flex items-center gap-2\">\n {index > 0 && (\n <span aria-hidden className=\"text-muted-foreground\">\n {' · '}\n </span>\n )}\n {onOpenTaggedItems || onOpenRow ? (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 text-sm text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid={`${testId}-${kind}`}\n title={`Show ${label} tagged “${row.name}”`}\n onClick={() =>\n onOpenTaggedItems\n ? onOpenTaggedItems(row.external_id, kind)\n : onOpenRow?.(row.external_id)\n }\n >\n <Icon className=\"size-3.5\" />\n {label}\n </button>\n ) : (\n <span className=\"inline-flex items-center gap-1 text-sm text-muted-foreground\">\n <Icon className=\"size-3.5\" />\n {label}\n </span>\n )}\n </span>\n ))}\n </div>\n )\n}\n\n/*\n * The table's cell renderers are module-level components given to AG Grid as they are, with what\n * they need as `cellRendererParams`: one component type across column rebuilds, so a rebuild (the\n * host's callbacks are often new on each render) re-renders the cells in place. A renderer made\n * inside the columns memo was a new type per rebuild, and every cell, the field being typed in\n * included, was remounted (#2240's class of bug).\n */\n\ninterface TagRowNameParams {\n onOpenRow?: TagTableProps['onOpenRow']\n testId: string\n}\n\nfunction TagRowNameRenderer({\n data: row,\n onOpenRow,\n testId,\n}: ICellRendererParams<TagTableRow> & TagRowNameParams) {\n if (!row) return null\n return onOpenRow ? (\n <button\n type=\"button\"\n className={cn(ROW_LABEL, 'text-left font-medium hover:text-primary hover:underline')}\n title={row.name}\n onClick={() => onOpenRow(row.external_id)}\n data-testid={`${testId}-row-${row.external_id}-label`}\n >\n <TagEntity tag={row} showTooltip={false} wrap />\n </button>\n ) : (\n <span\n className={cn(ROW_LABEL, 'font-medium')}\n title={row.name}\n data-testid={`${testId}-row-${row.external_id}-label`}\n >\n <TagEntity tag={row} showTooltip={false} wrap />\n </span>\n )\n}\n\ninterface TagEvidenceParams {\n l: TagTableLabels\n onOpenRow?: TagTableProps['onOpenRow']\n onOpenTaggedItems?: TagTableProps['onOpenTaggedItems']\n testId: string\n}\n\nfunction TagEvidenceRenderer({\n data: row,\n l,\n onOpenRow,\n onOpenTaggedItems,\n testId,\n}: ICellRendererParams<TagTableRow> & TagEvidenceParams) {\n if (!row) return null\n return (\n <TagContentCounts\n row={row}\n l={l}\n onOpenRow={onOpenRow}\n onOpenTaggedItems={onOpenTaggedItems}\n testId={`${testId}-evidence-${row.external_id}`}\n />\n )\n}\n\ninterface TagFieldParams {\n /** The tag field shown (not `column`: AG Grid passes its own column under that name). */\n field: TagTableField\n people?: TagTableProps['people']\n tags?: TagTableProps['tags']\n onOpenTag?: TagTableProps['onOpenTag']\n onChangeValue?: TagTableProps['onChangeValue']\n l: TagTableLabels\n testId: string\n}\n\nfunction TagFieldRenderer({\n data: row,\n field,\n people,\n tags,\n onOpenTag,\n onChangeValue,\n l,\n testId,\n}: ICellRendererParams<TagTableRow> & TagFieldParams) {\n if (!row) return null\n return (\n <TagTableCell\n row={row}\n column={field}\n people={people}\n tags={tags}\n onOpenTag={onOpenTag}\n onChange={onChangeValue}\n l={l}\n testId={`${testId}-cell-${row.external_id}-${field.id}`}\n />\n )\n}\n\nexport function TagTable({\n table,\n isLoading,\n onChangeValue,\n onAddRow,\n onChangeColumns,\n onOpenRow,\n onOpenTaggedItems,\n onExport,\n onDownload,\n people,\n tags,\n onOpenTag,\n actions,\n secondaryActions,\n labels,\n className,\n testId = 'tag-table',\n}: TagTableProps) {\n const l = useMemo(() => ({ ...DEFAULT_TAG_TABLE_LABELS, ...labels }), [labels])\n const columns = useMemo(() => table?.columns ?? [], [table])\n const rows = table?.rows ?? []\n const [editingColumns, setEditingColumns] = useState(false)\n const [name, setName] = useState('')\n const [adding, setAdding] = useState(false)\n const [exporting, setExporting] = useState(false)\n\n const add = async () => {\n const n = name.trim()\n if (!n || !onAddRow) return\n setAdding(true)\n try {\n await onAddRow(n)\n setName('')\n } finally {\n setAdding(false)\n }\n }\n\n const columnDefs = useMemo<ColDef<TagTableRow>[]>(\n () => [\n {\n colId: 'name',\n headerName: l.row,\n field: 'name',\n width: 176,\n minWidth: 160,\n pinned: 'left',\n sortable: true,\n filter: false,\n autoHeight: true,\n cellClass: 'px-3! py-2! leading-normal!',\n cellRenderer: TagRowNameRenderer,\n cellRendererParams: { onOpenRow, testId } satisfies TagRowNameParams,\n },\n {\n colId: 'evidence',\n headerName: l.evidence,\n width: 250,\n minWidth: 224,\n flex: 1,\n sortable: true,\n filter: false,\n autoHeight: true,\n cellClass: 'px-3! py-2! leading-normal!',\n valueGetter: ({ data }) => {\n if (!data) return 0\n const links = rowLinks(data)\n return links.doc_count + links.fact_count + links.thread_count\n },\n cellRenderer: TagEvidenceRenderer,\n cellRendererParams: { l, onOpenRow, onOpenTaggedItems, testId } satisfies TagEvidenceParams,\n },\n ...columns.map((column): ColDef<TagTableRow> => ({\n colId: column.id,\n headerName: column.name,\n flex: 1,\n minWidth: 150,\n sortable: true,\n filter: false,\n // These are native inline editors: let their caret, select and checkbox keys work.\n suppressKeyboardEvent: ({ event }) =>\n event.target instanceof HTMLElement &&\n Boolean(\n event.target.closest(\n 'input, select, textarea, button, [role=\"checkbox\"], [role=\"combobox\"]'\n )\n ),\n cellClass: 'px-1.5! py-1! leading-normal!',\n valueGetter: ({ data }) => {\n if (!data) return null\n const value = cellValue(data, column)\n if (value == null || value === '') return null\n if (column.type === 'number') return Number(value)\n if (column.type === 'checkbox') return value ? 1 : 0\n return cellText(\n value,\n column,\n (id) =>\n people?.find((p) => p.value === id)?.label ?? tags?.find((t) => t.value === id)?.label\n )\n },\n cellRenderer: TagFieldRenderer,\n cellRendererParams: {\n field: column,\n people,\n tags,\n onOpenTag,\n onChangeValue,\n l,\n testId,\n } satisfies TagFieldParams,\n })),\n ],\n [columns, l, people, tags, onOpenRow, onOpenTaggedItems, onOpenTag, onChangeValue, testId]\n )\n\n return (\n <div className={cn('space-y-3', className)} data-testid={testId}>\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"ml-auto flex flex-wrap items-center gap-2\">\n {actions}\n {(secondaryActions || onChangeColumns || onDownload || onExport) && (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={l.moreActions}\n data-testid={`${testId}-more`}\n >\n <MoreHorizontal className=\"size-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"flex w-auto min-w-48 flex-col items-stretch gap-1 p-2\"\n >\n {secondaryActions}\n {onChangeColumns && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"justify-start\"\n onClick={() => setEditingColumns((v) => !v)}\n data-testid={`${testId}-edit-columns`}\n >\n <SlidersHorizontal className=\"size-4\" /> {l.editColumns}\n </Button>\n )}\n {onExport && (\n <Button\n disabled={exporting || rows.length === 0}\n variant=\"ghost\"\n size=\"sm\"\n className=\"justify-start\"\n onClick={() => {\n setExporting(true)\n void Promise.resolve()\n .then(() => onExport())\n .finally(() => setExporting(false))\n }}\n data-testid={`${testId}-export`}\n >\n {exporting ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <FileDown className=\"size-4\" />\n )}\n {exporting ? l.exporting : l.export}\n </Button>\n )}\n {onDownload && (\n <Button\n disabled={rows.length === 0}\n variant=\"ghost\"\n size=\"sm\"\n className=\"justify-start\"\n onClick={() => void onDownload()}\n data-testid={`${testId}-download`}\n >\n <Download className=\"size-4\" /> {l.download}\n </Button>\n )}\n </PopoverContent>\n </Popover>\n )}\n </div>\n </div>\n\n {editingColumns && onChangeColumns && (\n <TagColumnsEditor\n columns={columns}\n labels={l.columns}\n onCancel={() => setEditingColumns(false)}\n onSave={async (fields) => {\n await onChangeColumns(fields)\n setEditingColumns(false)\n }}\n testId={`${testId}-columns`}\n />\n )}\n\n {onAddRow && (\n <form\n className=\"flex max-w-md items-center gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n void add()\n }}\n >\n <Input\n value={name}\n placeholder={l.addRowPlaceholder}\n aria-label={l.addRow}\n onChange={(e) => setName(e.target.value)}\n data-testid={`${testId}-add-name`}\n />\n <Button\n type=\"submit\"\n size=\"sm\"\n variant=\"outline\"\n disabled={!name.trim() || adding}\n data-testid={`${testId}-add`}\n >\n <Plus className=\"size-4\" /> {l.addRow}\n </Button>\n </form>\n )}\n\n {isLoading ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {l.loading}\n </p>\n ) : (\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <GridView\n items={rows}\n columnDefs={columnDefs}\n getItemId={(row) => row.external_id}\n height=\"auto\"\n emptyState={{ title: l.empty }}\n gridOptions={{\n ensureDomOrder: true,\n domLayout: 'autoHeight',\n }}\n getRowTestId={(row) => `${testId}-row-${row.external_id}`}\n testId={`${testId}-table`}\n />\n {columns.length === 0 && rows.length > 0 && (\n <p className=\"border-t border-border px-3 py-2 text-xs text-muted-foreground\">\n {l.noColumns}\n </p>\n )}\n </div>\n )}\n </div>\n )\n}\n","/**\n * One tag in full: its values for its kind's fields (position, role, status, …) editable in place,\n * then everything across the workspace that carries it — the documents (with the value or note the\n * tag has on each, and how many passages back it), the facts and the threads. The data is the tag\n * read with its links (`TagTableRow`) and its kind's fields; every write goes back through the host.\n * Laid out with the shared detail parts (`DetailPanel`), as a database row is.\n */\n\nimport type { ReactNode } from 'react'\nimport { FileText, Lightbulb, MessagesSquare } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport {\n DetailBody,\n DetailEmpty,\n DetailField,\n DetailFields,\n DetailLinkItem,\n DetailLinkList,\n DetailLoading,\n DetailSection,\n} from '../components/DetailPanel'\nimport {\n DEFAULT_TAG_TABLE_LABELS,\n TagTableCell,\n TagContentCounts,\n type TagTableLabels,\n type TagTableProps,\n} from './TagTable'\nimport { rowLinks, type TagTableField, type TagTableRow } from './tagTableModel'\n\nexport interface TagDetailLabels {\n fields: string\n documents: string\n facts: string\n threads: string\n /** `{shown}` of `{count}` listed. */\n showing: string\n noDocuments: string\n noFacts: string\n /** An annotation with no value on a document. */\n noValue: string\n noThreads: string\n untitledThread: string\n /** When a thread was last active: `{date}`. */\n threadUpdated: string\n /** `{count}` passages cited. */\n passages: string\n passage: string\n loading: string\n}\n\nexport const DEFAULT_TAG_DETAIL_LABELS: TagDetailLabels = {\n fields: 'Fields',\n documents: 'Documents',\n facts: 'Facts',\n threads: 'Threads',\n showing: 'Showing {shown} of {count}',\n noDocuments: 'No document carries this tag yet.',\n noFacts: 'No fact carries this tag yet.',\n noValue: 'No note',\n noThreads: 'No thread carries this tag yet.',\n untitledThread: 'Untitled thread',\n threadUpdated: 'Updated {date}',\n passages: '{count} passages',\n passage: '1 passage',\n loading: 'Loading…',\n}\n\nexport interface TagDetailProps extends Pick<\n TagTableProps,\n | 'onChangeValue'\n | 'onOpenTaggedItems'\n | 'onOpenDocument'\n | 'onOpenFact'\n | 'onOpenThread'\n | 'people'\n | 'tags'\n | 'onOpenTag'\n> {\n /** The tag with its values and links (documents, facts, threads). */\n row: TagTableRow | undefined\n /** Its kind's fields in the workspace (none: no Fields section). */\n fields?: TagTableField[]\n /**\n * What the tag's note on a document is, e.g. \"Note\" for an annotation or \"Role\" for a person.\n * Given, each document row names it before the note.\n */\n noteLabel?: string\n /**\n * The note is the point of the row (an annotation's value): shown prominently, and a document\n * without one says so.\n */\n noteIsValue?: boolean\n /**\n * Render a document's cited passages in place of the plain \"N passages\" count (e.g. a popover\n * listing them); `label` is that count's text. Called only for a document with passages.\n */\n renderPassages?: (\n doc: { doc_ext_id: string; citations_count: number },\n label: string\n ) => ReactNode\n isLoading?: boolean\n labels?: Partial<TagDetailLabels>\n /** Labels of the field inputs (the empty choice). */\n fieldLabels?: Partial<TagTableLabels>\n className?: string\n testId?: string\n}\n\n/** A timestamp as a day in the viewer's locale (\"18 Oct 2026\"). */\nconst formatDay = (iso: string) => {\n const at = new Date(iso)\n return Number.isNaN(at.getTime())\n ? iso\n : at.toLocaleDateString(undefined, { day: 'numeric', month: 'short', year: 'numeric' })\n}\n\nexport function TagDetail({\n row,\n fields = [],\n isLoading,\n people,\n tags,\n onOpenTag,\n onChangeValue,\n onOpenDocument,\n onOpenFact,\n onOpenThread,\n onOpenTaggedItems,\n noteLabel,\n noteIsValue = false,\n renderPassages,\n labels,\n fieldLabels,\n className,\n testId = 'tag-detail',\n}: TagDetailProps) {\n const l = { ...DEFAULT_TAG_DETAIL_LABELS, ...labels }\n const cellLabels = { ...DEFAULT_TAG_TABLE_LABELS, ...fieldLabels }\n if (isLoading || !row) return <DetailLoading label={l.loading} />\n const links = rowLinks(row)\n const docs = links.docs ?? []\n const facts = links.facts ?? []\n const threads = links.threads ?? []\n const passages = (n: number) => (n === 1 ? l.passage : l.passages.replace('{count}', String(n)))\n\n return (\n <DetailBody className={className} testId={testId}>\n {onOpenTaggedItems ? (\n <TagContentCounts\n row={row}\n l={cellLabels}\n onOpenTaggedItems={onOpenTaggedItems}\n testId={`${testId}-counts`}\n />\n ) : (\n <>\n <DetailSection\n title={l.documents}\n count={links.doc_count}\n shown={docs.length}\n showingLabel={l.showing}\n testId={`${testId}-documents`}\n >\n {docs.length ? (\n <DetailLinkList>\n {docs.map((d) => (\n <DetailLinkItem\n key={d.doc_ext_id}\n icon={<FileText className=\"size-4\" />}\n onClick={onOpenDocument ? () => onOpenDocument(d.doc_ext_id) : undefined}\n testId={`${testId}-doc-${d.doc_ext_id}`}\n trailing={\n d.citations_count > 0 &&\n !renderPassages && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {passages(d.citations_count)}\n </span>\n )\n }\n after={\n d.citations_count > 0 &&\n renderPassages && (\n <span className=\"shrink-0 px-3 py-2 text-xs\">\n {renderPassages(d, passages(d.citations_count))}\n </span>\n )\n }\n >\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-medium\">{d.file_name}</span>\n {(d.note || noteIsValue) && (\n <span\n className={cn(\n 'mt-0.5 flex min-w-0 items-baseline gap-2',\n noteIsValue ? 'text-base text-foreground' : 'text-muted-foreground'\n )}\n data-testid={`${testId}-doc-${d.doc_ext_id}-note`}\n >\n {noteLabel && (\n <span className=\"shrink-0 text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {noteLabel}\n </span>\n )}\n <span\n className={cn(\n 'line-clamp-3 min-w-0 whitespace-pre-line',\n noteIsValue && 'font-semibold',\n !d.note && 'font-normal italic text-muted-foreground'\n )}\n >\n {d.note || l.noValue}\n </span>\n </span>\n )}\n </span>\n </DetailLinkItem>\n ))}\n </DetailLinkList>\n ) : (\n <DetailEmpty>{l.noDocuments}</DetailEmpty>\n )}\n </DetailSection>\n\n <DetailSection\n title={l.facts}\n count={links.fact_count}\n shown={facts.length}\n showingLabel={l.showing}\n testId={`${testId}-facts`}\n >\n {facts.length ? (\n <DetailLinkList>\n {facts.map((f) => (\n <DetailLinkItem\n key={f.fact_ext_id}\n icon={<Lightbulb className=\"size-4\" />}\n onClick={onOpenFact ? () => onOpenFact(f.fact_ext_id) : undefined}\n testId={`${testId}-fact-${f.fact_ext_id}`}\n >\n <span className=\"line-clamp-3 min-w-0 flex-1\">{f.text}</span>\n </DetailLinkItem>\n ))}\n </DetailLinkList>\n ) : (\n <DetailEmpty>{l.noFacts}</DetailEmpty>\n )}\n </DetailSection>\n\n <DetailSection\n title={l.threads}\n count={links.thread_count}\n shown={threads.length}\n showingLabel={l.showing}\n testId={`${testId}-threads`}\n >\n {threads.length ? (\n <DetailLinkList>\n {threads.map((t) => (\n <DetailLinkItem\n key={t.conversation_ext_id}\n icon={<MessagesSquare className=\"size-4\" />}\n onClick={onOpenThread ? () => onOpenThread(t.conversation_ext_id) : undefined}\n testId={`${testId}-thread-${t.conversation_ext_id}`}\n trailing={\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {l.threadUpdated.replace('{date}', formatDay(t.updated_at))}\n </span>\n }\n >\n <span className=\"min-w-0 flex-1 truncate font-medium\">\n {t.title || l.untitledThread}\n </span>\n </DetailLinkItem>\n ))}\n </DetailLinkList>\n ) : (\n <DetailEmpty>{l.noThreads}</DetailEmpty>\n )}\n </DetailSection>\n </>\n )}\n {fields.length > 0 && (\n <DetailSection title={l.fields} testId={`${testId}-fields`}>\n <DetailFields>\n {fields.map((field) => (\n <DetailField key={field.id} label={field.name}>\n <TagTableCell\n row={row}\n column={field}\n people={people}\n tags={tags}\n onOpenTag={onOpenTag}\n onChange={onChangeValue}\n l={cellLabels}\n testId={`${testId}-field-${field.id}`}\n />\n </DetailField>\n ))}\n </DetailFields>\n </DetailSection>\n )}\n </DetailBody>\n )\n}\n","/**\n * A table of tags as a Word document: a title, when the snapshot was taken, then one table with a\n * row per tag, a column per field of its kind, the evidence behind it (linked document names and fact\n * excerpts) and its gaps. Written straight as WordprocessingML and zipped with `fflate` (already a\n * dependency, and what `docx/export.ts` uses), so the result opens in the native Word editor and\n * in Word without pulling the editor engine into the tags module.\n */\n\nimport {\n cellText,\n cellValue,\n isGap,\n rowLinks,\n type TagTableData,\n type TagTableField,\n type TagTableRow,\n} from './tagTableModel'\nimport {\n cell,\n docxPackage,\n documentXml,\n minuteUtc,\n page,\n paragraph,\n TABLE_DOCUMENT_STYLES,\n} from './ooxml'\n\nexport { DOCX_MIME_TYPE } from './ooxml'\n\n/** More table columns than this (item, fields, evidence, gaps) turn the page to landscape. */\nexport const TAG_TABLE_DOCX_LANDSCAPE_AFTER = 6\n\nexport interface TagTableDocxLabels {\n /** The row column's heading. */\n row: string\n evidence: string\n gaps: string\n /** `{at}` is the snapshot time, `YYYY-MM-DD HH:MM UTC`. */\n takenAt: string\n /** A row with no linked document, fact or thread. */\n noEvidence: string\n /** `{fields}`: the row's empty fields. */\n missing: string\n /** `{count}` more links than listed. */\n more: string\n document: string\n documents: string\n fact: string\n facts: string\n thread: string\n threads: string\n untitledThread: string\n empty: string\n}\n\nexport const DEFAULT_TAG_TABLE_DOCX_LABELS: TagTableDocxLabels = {\n row: 'Item',\n evidence: 'Evidence',\n gaps: 'Gaps',\n takenAt: 'Snapshot taken {at}',\n noEvidence: 'No evidence',\n missing: 'Missing: {fields}',\n more: '+{count} more',\n document: '1 document',\n documents: '{count} documents',\n fact: '1 fact',\n facts: '{count} facts',\n thread: '1 thread',\n threads: '{count} threads',\n untitledThread: 'Untitled thread',\n empty: 'No rows.',\n}\n\nexport interface TagTableDocxOptions {\n title: string\n nameOf?: (id: string) => string | undefined\n /** When the snapshot was taken (ISO); default now. */\n at?: string\n labels?: Partial<TagTableDocxLabels>\n}\n\nconst count = (n: number, one: string, many: string) =>\n n === 1 ? one : many.replace('{count}', String(n))\n\nfunction evidenceParagraphs(row: TagTableRow, l: TagTableDocxLabels): string[] {\n if (isGap(row)) return []\n const links = rowLinks(row)\n const docs = links.docs ?? []\n const facts = links.facts ?? []\n const threads = links.threads ?? []\n const more =\n links.doc_count -\n docs.length +\n (links.fact_count - facts.length) +\n (links.thread_count - threads.length)\n return [\n paragraph(\n [\n {\n text: [\n links.doc_count ? count(links.doc_count, l.document, l.documents) : null,\n links.fact_count ? count(links.fact_count, l.fact, l.facts) : null,\n links.thread_count ? count(links.thread_count, l.thread, l.threads) : null,\n ]\n .filter(Boolean)\n .join(' · '),\n muted: true,\n },\n ],\n 'TagTableCell'\n ),\n ...docs.map((d) =>\n paragraph(\n [{ text: d.file_name, bold: true }, ...(d.note ? [{ text: ` — ${d.note}` }] : [])],\n 'TagTableCell'\n )\n ),\n ...facts.map((f) => paragraph([{ text: `“${f.text}”`, italic: true }], 'TagTableCell')),\n ...threads.map((t) => paragraph([{ text: t.title || l.untitledThread }], 'TagTableCell')),\n ...(more > 0\n ? [\n paragraph(\n [{ text: l.more.replace('{count}', String(more)), muted: true }],\n 'TagTableCell'\n ),\n ]\n : []),\n ]\n}\n\nfunction gapParagraphs(\n row: TagTableRow,\n columns: TagTableField[],\n l: TagTableDocxLabels\n): string[] {\n const missing = columns\n .filter((c) => c.type !== 'checkbox' && cellText(cellValue(row, c), c) === '')\n .map((c) => c.name)\n return [\n ...(isGap(row) ? [paragraph([{ text: l.noEvidence, bold: true }], 'TagTableCell')] : []),\n ...(missing.length\n ? [paragraph([{ text: l.missing.replace('{fields}', missing.join(', ')) }], 'TagTableCell')]\n : []),\n ]\n}\n\n/** `word/document.xml` for the table (exposed for tests and for hosts that assemble their own package). */\nexport function tagTableDocumentXml(table: TagTableData, options: TagTableDocxOptions): string {\n const l = { ...DEFAULT_TAG_TABLE_DOCX_LABELS, ...options.labels }\n const { columns, rows } = table\n const heads = [l.row, ...columns.map((c) => c.name), l.evidence, l.gaps]\n const landscape = heads.length > TAG_TABLE_DOCX_LANDSCAPE_AFTER\n const { textWidth, sectPr } = page(landscape)\n // Relative widths: the item and evidence get room to read, each field and the gaps a share.\n const weights = [2, ...columns.map(() => 1), 3, 1.5]\n const total = weights.reduce((a, b) => a + b, 0)\n const widths = weights.map((w) => Math.floor((textWidth * w) / total))\n const at = minuteUtc(options.at ?? new Date().toISOString())\n\n const header = `<w:tr><w:trPr><w:tblHeader/><w:cantSplit/></w:trPr>${heads\n .map((h, i) =>\n cell([paragraph([{ text: h, bold: true }], 'TagTableCell')], widths[i], 'E7E6E6')\n )\n .join('')}</w:tr>`\n const body = rows.map((row) => {\n const fill = isGap(row) ? 'FFF2CC' : undefined\n const cells = [\n cell([paragraph([{ text: row.name, bold: true }], 'TagTableCell')], widths[0], fill),\n ...columns.map((c, i) => {\n const text = cellText(cellValue(row, c), c, options.nameOf)\n return cell(text ? [paragraph([{ text }], 'TagTableCell')] : [], widths[i + 1], fill)\n }),\n cell(evidenceParagraphs(row, l), widths[columns.length + 1], fill),\n cell(gapParagraphs(row, columns, l), widths[columns.length + 2], fill),\n ]\n return `<w:tr><w:trPr><w:cantSplit/></w:trPr>${cells.join('')}</w:tr>`\n })\n\n const grid = `<w:tbl><w:tblPr><w:tblStyle w:val=\"TagTableGrid\"/><w:tblW w:w=\"${textWidth}\" w:type=\"dxa\"/><w:tblLayout w:type=\"fixed\"/><w:tblLook w:val=\"04A0\" w:firstRow=\"1\" w:lastRow=\"0\" w:firstColumn=\"1\" w:lastColumn=\"0\" w:noHBand=\"0\" w:noVBand=\"1\"/></w:tblPr><w:tblGrid>${widths\n .map((w) => `<w:gridCol w:w=\"${w}\"/>`)\n .join('')}</w:tblGrid>${header}${body.join('')}</w:tbl>`\n\n return documentXml(\n `${paragraph(\n [{ text: options.title }],\n 'Title'\n )}${paragraph([{ text: l.takenAt.replace('{at}', `${at} UTC`), muted: true }])}${grid}${\n rows.length ? '' : paragraph([{ text: l.empty, muted: true }])\n }<w:p/>${sectPr}`\n )\n}\n\n/** The table as `.docx` bytes. */\nexport function tagTableDocx(table: TagTableData, options: TagTableDocxOptions): Uint8Array {\n const at = new Date(options.at ?? Date.now()).toISOString()\n return docxPackage({\n document: tagTableDocumentXml(table, { ...options, at }),\n styles: TABLE_DOCUMENT_STYLES,\n title: options.title,\n at,\n })\n}\n","/**\n * The glossary: every definition fact (optionally one agreement's), alphabetical by term, as a\n * three-column table — Term, Definition, Source — printed as a Word document or as Markdown with\n * the same WordprocessingML the tag tables export with (`ooxml.ts`).\n */\n\nimport {\n cell,\n docxPackage,\n documentXml,\n minuteUtc,\n page,\n paragraph,\n TABLE_DOCUMENT_STYLES,\n} from './ooxml'\nimport { compareDefinitions, groupDefinitions, type DefinitionSource } from './definitions'\n\n/** One glossary row. */\nexport interface GlossaryEntry {\n /** Empty for a definition whose text names no term (listed last, as written). */\n term: string\n definition: string\n source: string\n factId: string\n}\n\nexport interface GlossaryLabels {\n term: string\n definition: string\n source: string\n /** `{at}` is when it was printed, `YYYY-MM-DD HH:MM UTC`. */\n takenAt: string\n empty: string\n}\n\nexport const DEFAULT_GLOSSARY_LABELS: GlossaryLabels = {\n term: 'Term',\n definition: 'Definition',\n source: 'Source',\n takenAt: 'Printed {at}',\n empty: 'No definitions.',\n}\n\nexport interface GlossaryOptions {\n title: string\n /** When it was printed (ISO); default now. */\n at?: string\n labels?: Partial<GlossaryLabels>\n}\n\n/** What follows the term, a leading colon or dash dropped: `means the issued shares.` */\nconst body = (rest: string) => rest.replace(/^\\s*[:—–-]\\s*/, '').trim()\n\n/**\n * The glossary's rows: every definition, alphabetical by term and, within a term, the preferred one\n * first. Definitions whose text names no term follow, as written. `labelId` keeps one label's.\n */\nexport function glossaryEntries(\n sources: readonly DefinitionSource[],\n options: { labelId?: string | null } = {}\n): GlossaryEntry[] {\n const { groups, unparsed } = groupDefinitions(sources, options)\n return [\n ...groups.flatMap((g) =>\n g.definitions.map((d) => ({\n term: d.term,\n definition: body(d.rest),\n source: d.source ?? '',\n factId: d.id,\n }))\n ),\n ...[...unparsed].sort(compareDefinitions).map((d) => ({\n term: '',\n definition: d.text.trim(),\n source: d.source ?? '',\n factId: d.id,\n })),\n ]\n}\n\nconst escapeCell = (text: string) => text.replace(/\\|/g, '\\\\|').replace(/\\n+/g, ' ')\n\n/** The glossary as a Markdown document: a heading, when it was printed, and one table. */\nexport function glossaryMarkdown(\n entries: readonly GlossaryEntry[],\n options: GlossaryOptions\n): string {\n const l = { ...DEFAULT_GLOSSARY_LABELS, ...options.labels }\n const at = minuteUtc(options.at ?? new Date().toISOString())\n const lines = [\n `# ${options.title}`,\n '',\n `_${l.takenAt.replace('{at}', `${at} UTC`)}_`,\n '',\n `| ${l.term} | ${l.definition} | ${l.source} |`,\n '| --- | --- | --- |',\n ...entries.map(\n (e) =>\n `| ${e.term ? `**${escapeCell(e.term)}**` : ''} | ${escapeCell(e.definition)} | ${escapeCell(e.source)} |`\n ),\n ]\n if (!entries.length) lines.push('', l.empty)\n return `${lines.join('\\n')}\\n`\n}\n\n/** `word/document.xml` of the glossary (exposed for tests). */\nexport function glossaryDocumentXml(\n entries: readonly GlossaryEntry[],\n options: GlossaryOptions\n): string {\n const l = { ...DEFAULT_GLOSSARY_LABELS, ...options.labels }\n const { textWidth, sectPr } = page(false)\n const widths = [2, 6, 2].map((w) => Math.floor((textWidth * w) / 10))\n const at = minuteUtc(options.at ?? new Date().toISOString())\n const text = (t: string, bold = false) => [paragraph([{ text: t, bold }], 'TagTableCell')]\n const header = `<w:tr><w:trPr><w:tblHeader/><w:cantSplit/></w:trPr>${[\n l.term,\n l.definition,\n l.source,\n ]\n .map((h, i) => cell(text(h, true), widths[i], 'E7E6E6'))\n .join('')}</w:tr>`\n const rows = entries.map(\n (e) =>\n `<w:tr><w:trPr><w:cantSplit/></w:trPr>${cell(e.term ? text(e.term, true) : [], widths[0])}${cell(\n text(e.definition),\n widths[1]\n )}${cell(e.source ? text(e.source) : [], widths[2])}</w:tr>`\n )\n const table = `<w:tbl><w:tblPr><w:tblStyle w:val=\"TagTableGrid\"/><w:tblW w:w=\"${textWidth}\" w:type=\"dxa\"/><w:tblLayout w:type=\"fixed\"/><w:tblLook w:val=\"04A0\" w:firstRow=\"1\" w:lastRow=\"0\" w:firstColumn=\"1\" w:lastColumn=\"0\" w:noHBand=\"0\" w:noVBand=\"1\"/></w:tblPr><w:tblGrid>${widths\n .map((w) => `<w:gridCol w:w=\"${w}\"/>`)\n .join('')}</w:tblGrid>${header}${rows.join('')}</w:tbl>`\n return documentXml(\n `${paragraph([{ text: options.title }], 'Title')}${paragraph([\n { text: l.takenAt.replace('{at}', `${at} UTC`), muted: true },\n ])}${table}${entries.length ? '' : paragraph([{ text: l.empty, muted: true }])}<w:p/>${sectPr}`\n )\n}\n\n/** The glossary as `.docx` bytes. */\nexport function glossaryDocx(\n entries: readonly GlossaryEntry[],\n options: GlossaryOptions\n): Uint8Array {\n const at = new Date(options.at ?? Date.now()).toISOString()\n return docxPackage({\n document: glossaryDocumentXml(entries, { ...options, at }),\n styles: TABLE_DOCUMENT_STYLES,\n title: options.title,\n at,\n })\n}\n\n/** A file name for the glossary: `Glossary - SPA.docx`. */\nexport function glossaryFileName(title: string, extension: 'docx' | 'md'): string {\n return `${title.replace(/[\\\\/:*?\"<>|]+/g, ' ').trim() || 'Glossary'}.${extension}`\n}\n","/**\n * The nouns of the Tags page, all from the entity registry (`getEntityLabel`) so a deployment that\n * renames an entity (a document to \"File\", a tag to \"Label\") renames it here too. Read at render\n * time, after any `configureEntityRegistry` override.\n */\nimport type { TagKind } from '@arbidocs/sdk/browser'\nimport { getEntityLabel, tagKindNouns, tagKindTitle } from '@arbidocs/react/ui'\nimport type { TagDetailLabels } from '../TagDetail'\nimport type { TagTableLabels } from '../TagTable'\n\nconst lower = (text: string) => text.toLowerCase()\n\n/** Singular and plural, title-case forms of the page's nouns. */\nexport function tagsPageNouns() {\n return {\n // ANY_TAG, not TAG: TAG is the Files page's \"Field\" (a document column).\n tag: getEntityLabel('ANY_TAG'),\n tags: getEntityLabel('ANY_TAG', 'PLURAL'),\n document: getEntityLabel('DOCUMENT'),\n documents: getEntityLabel('DOCUMENT', 'PLURAL'),\n fact: getEntityLabel('FACT'),\n facts: getEntityLabel('FACT', 'PLURAL'),\n thread: getEntityLabel('CONVERSATION'),\n threads: getEntityLabel('CONVERSATION', 'PLURAL'),\n people: getEntityLabel('PERSON', 'PLURAL'),\n organisations: getEntityLabel('ORGANISATION', 'PLURAL'),\n }\n}\n\n/** \"People and organisations\", as the extraction calls what it finds. */\nexport function entitiesPhrase(): string {\n const n = tagsPageNouns()\n return `${n.people} and ${lower(n.organisations)}`\n}\n\n/** \"3 documents\" / \"1 document\". */\nexport function documentCount(count: number): string {\n const n = tagsPageNouns()\n return `${count} ${lower(count === 1 ? n.document : n.documents)}`\n}\n\n/** What a kind's table calls its rows and the items tagged with each. */\nexport function tagTableLabels(kind: TagKind): Partial<TagTableLabels> {\n const n = tagsPageNouns()\n const k = tagKindNouns(kind)\n return {\n row: tagKindTitle(kind),\n evidence: 'Tagged items',\n documents: `{count} ${lower(n.documents)}`,\n document: `1 ${lower(n.document)}`,\n facts: `{count} ${lower(n.facts)}`,\n fact: `1 ${lower(n.fact)}`,\n threads: `{count} ${lower(n.threads)}`,\n thread: `1 ${lower(n.thread)}`,\n untitledThread: `Untitled ${lower(n.thread)}`,\n empty: `No ${k.plural} yet.`,\n noColumns: 'No fields yet.',\n }\n}\n\n/** The headings and empty states of one tag's detail. */\nexport function tagDetailLabels(): Partial<TagDetailLabels> {\n const n = tagsPageNouns()\n const carries = (noun: string) => `No ${lower(noun)} carries this ${lower(n.tag)} yet.`\n return {\n documents: n.documents,\n facts: n.facts,\n threads: n.threads,\n noDocuments: carries(n.document),\n noFacts: carries(n.fact),\n noThreads: carries(n.thread),\n untitledThread: `Untitled ${lower(n.thread)}`,\n }\n}\n\n/**\n * What a tag's note on a document is called: \"Note\" for every kind that carries one (a label's\n * links carry none). A person's or organisation's role is its own Role field, not the link's.\n */\nexport function tagNoteLabel(kind: TagKind): string | undefined {\n return kind === 'label' || kind === 'search' ? undefined : 'Note'\n}\n\n/** What each kind is for, under its heading on the Tags page. */\nexport function tagKindDescription(kind: TagKind): string {\n const n = tagsPageNouns()\n const k = tagKindNouns(kind)\n const docs = lower(n.documents)\n switch (kind) {\n case 'label':\n return `Short names that file ${docs}, ${lower(n.facts)} and ${lower(n.threads)}.`\n case 'annotation':\n return `A note on each ${lower(n.document)} (text, number, choice or date), filled in by hand or by AI.`\n case 'issue':\n return `Points in dispute, each with the same ${lower(k.singular)} fields.`\n case 'person':\n case 'organisation':\n return `${tagKindTitle(kind, { plural: true })} the ${docs} mention.`\n case 'search':\n return `${tagKindTitle(kind, { plural: true })}.`\n }\n}\n","/**\n * \"Extract from documents\": pick documents (or all of them) and have the AI find the people and\n * organisations they name, each linked to its entity tag. The host runs the extraction\n * (`onExtract`, accepted at once); the dialog closes once it is accepted.\n */\nimport type { components } from '@arbidocs/client'\nimport { useMemo, useState } from 'react'\nimport {\n Button,\n Checkbox,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n getDocumentTitle,\n isImageDocument,\n} from '@arbidocs/react/ui'\nimport { DocumentPicker, type PickerGroup } from '../../settings/DocumentPicker'\nimport { ModalHeader } from '../../settings/ModalScaffold'\nimport { documentCount, entitiesPhrase, tagsPageNouns } from './tagsPageLabels'\n\ntype DocResponse = components['schemas']['DocResponse']\n\n/** Most documents one extraction takes (the endpoint's limit). */\nexport const EXTRACT_LIMIT = 500\n\n/** What the dialog reads of a document. */\nexport type ExtractableDocument = Pick<\n DocResponse,\n | 'external_id'\n | 'file_name'\n | 'file_type'\n | 'doc_metadata'\n | 'parent_ext_id'\n | 'n_pages'\n | 'tokens'\n>\n\n/** Extracted child documents (e.g. email attachments) are reached through their parent. */\nconst isTopLevel = (d: ExtractableDocument) => !d.parent_ext_id\n\nexport interface ExtractEntitiesDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** The workspace's documents. */\n documents: readonly ExtractableDocument[]\n /** Run the extraction over these documents; the dialog closes when it resolves. */\n onExtract: (docIds: string[]) => Promise<unknown>\n /** Too many documents chosen (more than {@link EXTRACT_LIMIT}). */\n onTooMany: (message: string) => void\n isPending?: boolean\n}\n\nexport function ExtractEntitiesDialog({\n open,\n onOpenChange,\n documents,\n onExtract,\n onTooMany,\n isPending,\n}: ExtractEntitiesDialogProps) {\n const [picked, setPicked] = useState<string[]>([])\n const [all, setAll] = useState(false)\n const topLevel = useMemo(() => documents.filter(isTopLevel), [documents])\n const allIds = topLevel.map((d) => d.external_id)\n const docIds = all ? allIds : picked\n const nouns = tagsPageNouns()\n const entities = entitiesPhrase().toLowerCase()\n const groups = useMemo(\n (): PickerGroup[] => [\n {\n id: 'all',\n heading: 'In this workspace',\n docs: topLevel\n .map((d) => ({\n id: d.external_id,\n title: getDocumentTitle(d, d.file_name ?? undefined),\n fileName: d.file_name,\n pages: isImageDocument(d) ? null : (d.n_pages ?? null),\n tokens: isImageDocument(d) ? null : (d.tokens ?? null),\n }))\n .sort((a, b) => a.title.toLowerCase().localeCompare(b.title.toLowerCase())),\n },\n ],\n [topLevel]\n )\n\n const toggle = (id: string) =>\n setPicked((ids) => (ids.includes(id) ? ids.filter((x) => x !== id) : [...ids, id]))\n\n const close = () => {\n setPicked([])\n setAll(false)\n onOpenChange(false)\n }\n\n const run = async () => {\n if (docIds.length > EXTRACT_LIMIT) {\n onTooMany(`Choose at most ${documentCount(EXTRACT_LIMIT)} at a time.`)\n return\n }\n try {\n await onExtract(docIds)\n close()\n } catch {\n // The host has said why; the dialog stays open to try again.\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={(next) => (next ? onOpenChange(true) : close())}>\n <DialogContent\n presentation=\"sheet\"\n className=\"w-modal max-w-modal-vw max-h-panel flex flex-col overflow-hidden p-0\"\n data-testid=\"extract-entities-dialog\"\n >\n <ModalHeader>\n <DialogTitle>Extract {entities}</DialogTitle>\n <DialogDescription>\n The AI finds the {entities} each {nouns.document.toLowerCase()} names and links them,\n with the passages that name them. {entitiesPhrase()} already here are matched by name.\n </DialogDescription>\n </ModalHeader>\n <div className=\"flex flex-1 min-h-0 flex-col gap-3 overflow-auto p-4\">\n <label className=\"flex items-center gap-2 text-sm\">\n <Checkbox\n checked={all}\n onCheckedChange={(v) => setAll(v === true)}\n data-testid=\"extract-entities-all\"\n />\n All {nouns.documents.toLowerCase()} ({allIds.length})\n </label>\n {!all && (\n <DocumentPicker\n groups={groups}\n value=\"\"\n onValueChange={toggle}\n selectedIds={picked}\n labels={{ placeholder: `Search ${nouns.documents.toLowerCase()}…` }}\n />\n )}\n </div>\n <div className=\"flex items-center justify-end gap-2 border-t border-border px-4 py-3\">\n <Button variant=\"ghost\" onClick={close}>\n Cancel\n </Button>\n <Button\n onClick={() => void run()}\n disabled={docIds.length === 0 || isPending}\n data-testid=\"extract-entities-run\"\n >\n {docIds.length > 0 ? `Extract from ${documentCount(docIds.length)}` : 'Extract'}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * The kit's heavy components each live in their own chunk, loaded the first time one renders: the\n * data grid (`GridView`), the calendar (`CalendarGrid`), the Word editor (`NativeDocxEditor`) and\n * the PDF viewer (`PdfViewer`, `@arbidocs/react/viewers/pdf`).\n * - `ConnectedAppRuntime` loads them when idle after the first paint (`KIT_CHUNK_LOADERS`), so\n * the first grid, PDF or Word document opens at once.\n * - `prefetchViewerChunks()` loads the document viewer with them, while online, for a document\n * kept offline (a host's `documents.onKeptOffline`).\n * - `preloadKitChunks()` loads them now: in a test that renders one synchronously.\n */\nimport { calendarGridChunk } from './calendar/CalendarGrid'\nimport { docxEditorChunk } from './docx/lazy'\nimport { gridChunk } from './files/GridView'\nimport { prefetchChunk } from './shell/reload-policy'\n\nexport { calendarGridChunk, docxEditorChunk, gridChunk }\n\n/** One loader per heavy chunk. */\nexport const KIT_CHUNK_LOADERS: readonly (() => Promise<unknown>)[] = [\n () => gridChunk.load(),\n () => calendarGridChunk.load(),\n () => docxEditorChunk.load(),\n () => import('@arbidocs/react/viewers/pdf').then((m) => m.pdfViewerChunk.load()),\n]\n\nexport async function preloadKitChunks(): Promise<void> {\n await Promise.all(KIT_CHUNK_LOADERS.map((load) => load()))\n}\n\n/**\n * The document viewer and the kit's heavy chunks, loaded while still online. A failed load is\n * remembered (`prefetchChunk`), so a stale build reloads rather than crash the viewer offline.\n */\nexport async function prefetchViewerChunks(): Promise<void> {\n await Promise.all(\n [() => import('./connect/viewer'), ...KIT_CHUNK_LOADERS].map((load) => prefetchChunk(load))\n )\n}\n"]}