@cerbur/clutch-dsh-worktree 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +136 -0
  2. package/cordis.patch.yml +5 -0
  3. package/lib/client/WorktreeModeAction.d.ts +11 -0
  4. package/lib/client/WorktreeModeAction.d.ts.map +1 -0
  5. package/lib/client/WorktreeModeAction.js +14 -0
  6. package/lib/client/WorktreeModeAction.js.map +1 -0
  7. package/lib/client/WorktreeSurface.d.ts +33 -0
  8. package/lib/client/WorktreeSurface.d.ts.map +1 -0
  9. package/lib/client/WorktreeSurface.js +834 -0
  10. package/lib/client/WorktreeSurface.js.map +1 -0
  11. package/lib/client/entry.d.ts +18 -0
  12. package/lib/client/entry.d.ts.map +1 -0
  13. package/lib/client/entry.js +100 -0
  14. package/lib/client/entry.js.map +1 -0
  15. package/lib/client/index.d.ts +7 -0
  16. package/lib/client/index.d.ts.map +1 -0
  17. package/lib/client/index.js +6 -0
  18. package/lib/client/index.js.map +1 -0
  19. package/lib/client/navigation.d.ts +7 -0
  20. package/lib/client/navigation.d.ts.map +1 -0
  21. package/lib/client/navigation.js +5 -0
  22. package/lib/client/navigation.js.map +1 -0
  23. package/lib/client/overlay-bounds.d.ts +11 -0
  24. package/lib/client/overlay-bounds.d.ts.map +1 -0
  25. package/lib/client/overlay-bounds.js +9 -0
  26. package/lib/client/overlay-bounds.js.map +1 -0
  27. package/lib/client/sidebar-overlay-geometry.d.ts +10 -0
  28. package/lib/client/sidebar-overlay-geometry.d.ts.map +1 -0
  29. package/lib/client/sidebar-overlay-geometry.js +96 -0
  30. package/lib/client/sidebar-overlay-geometry.js.map +1 -0
  31. package/lib/client/view-mode-store.d.ts +5 -0
  32. package/lib/client/view-mode-store.d.ts.map +1 -0
  33. package/lib/client/view-mode-store.js +15 -0
  34. package/lib/client/view-mode-store.js.map +1 -0
  35. package/lib/client/view-mode.d.ts +52 -0
  36. package/lib/client/view-mode.d.ts.map +1 -0
  37. package/lib/client/view-mode.js +76 -0
  38. package/lib/client/view-mode.js.map +1 -0
  39. package/lib/client/virtual-workspace-membership.d.ts +27 -0
  40. package/lib/client/virtual-workspace-membership.d.ts.map +1 -0
  41. package/lib/client/virtual-workspace-membership.js +95 -0
  42. package/lib/client/virtual-workspace-membership.js.map +1 -0
  43. package/lib/client/worktree-connection.d.ts +42 -0
  44. package/lib/client/worktree-connection.d.ts.map +1 -0
  45. package/lib/client/worktree-connection.js +139 -0
  46. package/lib/client/worktree-connection.js.map +1 -0
  47. package/lib/client/worktree-view.d.ts +63 -0
  48. package/lib/client/worktree-view.d.ts.map +1 -0
  49. package/lib/client/worktree-view.js +116 -0
  50. package/lib/client/worktree-view.js.map +1 -0
  51. package/lib/client.js +1952 -0
  52. package/lib/client.js.map +1 -0
  53. package/lib/contract/index.contract.d.ts +2 -0
  54. package/lib/contract/index.contract.d.ts.map +1 -0
  55. package/lib/contract/index.contract.js +51 -0
  56. package/lib/contract/index.contract.js.map +1 -0
  57. package/lib/contract/index.d.ts +181 -0
  58. package/lib/contract/index.d.ts.map +1 -0
  59. package/lib/contract/index.js +45 -0
  60. package/lib/contract/index.js.map +1 -0
  61. package/lib/host/dsh-read-adapter.d.ts +58 -0
  62. package/lib/host/dsh-read-adapter.d.ts.map +1 -0
  63. package/lib/host/dsh-read-adapter.js +59 -0
  64. package/lib/host/dsh-read-adapter.js.map +1 -0
  65. package/lib/host/index.d.ts +16 -0
  66. package/lib/host/index.d.ts.map +1 -0
  67. package/lib/host/index.js +14 -0
  68. package/lib/host/index.js.map +1 -0
  69. package/lib/host/remote.d.ts +16 -0
  70. package/lib/host/remote.d.ts.map +1 -0
  71. package/lib/host/remote.js +61 -0
  72. package/lib/host/remote.js.map +1 -0
  73. package/lib/host/service.d.ts +58 -0
  74. package/lib/host/service.d.ts.map +1 -0
  75. package/lib/host/service.js +121 -0
  76. package/lib/host/service.js.map +1 -0
  77. package/lib/index.d.ts +23 -0
  78. package/lib/index.d.ts.map +1 -0
  79. package/lib/index.js +22 -0
  80. package/lib/index.js.map +1 -0
  81. package/lib/manage/index.d.ts +9 -0
  82. package/lib/manage/index.d.ts.map +1 -0
  83. package/lib/manage/index.js +8 -0
  84. package/lib/manage/index.js.map +1 -0
  85. package/lib/manage/manager.d.ts +86 -0
  86. package/lib/manage/manager.d.ts.map +1 -0
  87. package/lib/manage/manager.js +584 -0
  88. package/lib/manage/manager.js.map +1 -0
  89. package/lib/manage/types.d.ts +41 -0
  90. package/lib/manage/types.d.ts.map +1 -0
  91. package/lib/manage/types.js +2 -0
  92. package/lib/manage/types.js.map +1 -0
  93. package/lib/provider/git.d.ts +42 -0
  94. package/lib/provider/git.d.ts.map +1 -0
  95. package/lib/provider/git.js +222 -0
  96. package/lib/provider/git.js.map +1 -0
  97. package/lib/provider/index.d.ts +13 -0
  98. package/lib/provider/index.d.ts.map +1 -0
  99. package/lib/provider/index.js +12 -0
  100. package/lib/provider/index.js.map +1 -0
  101. package/lib/provider/sidecar.d.ts +85 -0
  102. package/lib/provider/sidecar.d.ts.map +1 -0
  103. package/lib/provider/sidecar.js +410 -0
  104. package/lib/provider/sidecar.js.map +1 -0
  105. package/lib/provider/types.d.ts +126 -0
  106. package/lib/provider/types.d.ts.map +1 -0
  107. package/lib/provider/types.js +46 -0
  108. package/lib/provider/types.js.map +1 -0
  109. package/lib/typert.host.d.ts +3 -0
  110. package/lib/typert.host.js +290 -0
  111. package/lib/typert.remote-client.d.ts +32 -0
  112. package/lib/typert.remote-client.d.ts.map +1 -0
  113. package/lib/typert.remote-client.js +284 -0
  114. package/package.json +118 -0
package/README.md ADDED
@@ -0,0 +1,136 @@
1
+ # @cerbur/clutch-dsh-worktree
2
+
3
+ `@cerbur/clutch-dsh-worktree` 为 DSH Web UI 增加按 Git Worktree 组织 Session 的视角,同时继续由 DSH 管理原始 Project/Workspace 和 Session 数据。
4
+
5
+ English marketplace description:
6
+
7
+ > Adds a Worktree view to DSH Web UI that groups Sessions by Git worktree while keeping DSH as the source of truth.
8
+
9
+ ## 功能
10
+
11
+ 从 DSH Sidebar footer 打开 Worktree mode 后,可以:
12
+
13
+ - 按 Workspace → Worktree → Session 查看会话;
14
+ - 搜索 Workspace,并从已有 local branch 创建新的 Git Worktree 和 branch;
15
+ - 在 Main 或指定 Worktree 下创建 Session,并直接打开新 Session;
16
+ - 查看 active、detached 和 repair 状态;
17
+ - 继续使用 DSH 原生的 Workspace rename/delete/reorder 和 Session 菜单、排序能力。
18
+
19
+ Worktree Session 仍属于原始 DSH Project/Workspace,因此切回原生 Project/Session 视角时仍可由 DSH 展示。插件不复制 Session 内容,也不修改消息、prompt、transcript 或历史记录。
20
+
21
+ ## 兼容性与前置条件
22
+
23
+ - DSH CLI 和目标 Web profile 使用 `dsh-v0.1.0-rc.8`;
24
+ - 已有可启动的 DSH profile,例如 `web` 或 `demo`;
25
+ - plugin 安装在实际启动 Web UI 的同一个 profile;
26
+ - 要使用 Worktree 功能,目标 Workspace 必须位于 Git repository 中。
27
+
28
+ package manifest 已声明可安装的 `dsh.bundle`,并随 package 提供 `cordis.patch.yml`;Web UI 使用另行声明的 `dsh.client` browser entry。
29
+
30
+ ## 安装
31
+
32
+ ### 从本地 checkout 安装
33
+
34
+ 先在 `clutch-dsh` 根目录构建 package:
35
+
36
+ ```bash
37
+ cd /path/to/clutch-dsh
38
+ pnpm install
39
+ pnpm --filter @cerbur/clutch-dsh-worktree build
40
+ ```
41
+
42
+ 再在本地 `deepseek-harness` 根目录构建 DSH,并把 package 安装到目标 profile:
43
+
44
+ ```bash
45
+ cd /path/to/deepseek-harness
46
+ pnpm install
47
+ pnpm run build
48
+ pnpm dsh plugin --profile web add /path/to/clutch-dsh/packages/clutch-dsh-worktree
49
+ pnpm dsh web --dump-config
50
+ pnpm dsh web
51
+ ```
52
+
53
+ 建议使用绝对路径。`--dump-config` 输出中应能看到 `@cerbur/clutch-dsh-worktree` 的 bundle layer。
54
+
55
+ 如果 profile 之前安装过旧的 unscoped package,先移除旧条目:
56
+
57
+ ```bash
58
+ pnpm dsh plugin --profile web remove clutch-dsh-worktree
59
+ ```
60
+
61
+ ### 从 package registry 安装
62
+
63
+ package 发布到 registry 后,可以在 `deepseek-harness` 根目录执行:
64
+
65
+ ```bash
66
+ pnpm dsh plugin --profile web add @cerbur/clutch-dsh-worktree
67
+ pnpm dsh web
68
+ ```
69
+
70
+ 从已链接的本地 checkout 更新时,只需重新构建 package 并重启 DSH:
71
+
72
+ ```bash
73
+ cd /path/to/clutch-dsh
74
+ pnpm --filter @cerbur/clutch-dsh-worktree build
75
+ cd /path/to/deepseek-harness
76
+ pnpm dsh web
77
+ ```
78
+
79
+ 修改 `package.json`、`cordis.patch.yml` 或 profile bundle 成员后,需要重新执行 `dsh plugin add`。
80
+
81
+ ### 卸载
82
+
83
+ ```bash
84
+ cd /path/to/deepseek-harness
85
+ pnpm dsh plugin --profile web remove @cerbur/clutch-dsh-worktree
86
+ ```
87
+
88
+ ## 使用说明
89
+
90
+ 1. 启动 DSH Web UI,在 Sidebar footer 打开 Worktree mode。
91
+ 2. 使用 Workspace 的 `+` 选择基线 local branch,填写新的 Worktree name;默认 branch 名为 `dsh/<8位随机串>`。
92
+ 3. 使用 Main 旁边的 `+` 创建普通 DSH Session。
93
+ 4. 使用 Worktree 旁边的 `+` 创建 cwd 指向该 Worktree 的 Session;插件完成关系绑定后打开它。
94
+ 5. 观察 Worktree 的 ready、repair 或 detached 状态。当前 Worktree surface 不提供 Remove Worktree 入口。
95
+
96
+ Workspace 删除只删除 DSH 的 Workspace registration;其目录、Session、Git Worktree 和 plugin sidecar 会保留。
97
+
98
+ ## 当前限制
99
+
100
+ DSH rc.8 的原生 `session.create` 不能同时接收 `workspaceId` 和独立 `cwd`。Worktree Session 因此先以 `cwd` 创建,再由插件保存关系,并在当前浏览器内投影 Workspace membership;这不会修改 DSH 源码或 Session metadata。需要 DSH 原生持久 attach 时,仍需 DSH 提供同时支持 Workspace 与独立 cwd 的 API。
101
+
102
+ 如果 Connection、Gateway 或 Worktree 操作失败,界面会保留可重试的错误,不把失败伪装为空列表。删除 Worktree 不会删除 Session;detached 关系会保留,直到显式解绑。
103
+
104
+ ## 开发与验证
105
+
106
+ 在 workspace 根目录执行:
107
+
108
+ ```bash
109
+ pnpm install
110
+ pnpm run check:workspace
111
+ pnpm run check:patches
112
+ pnpm --filter @cerbur/clutch-dsh-worktree typecheck
113
+ pnpm --filter @cerbur/clutch-dsh-worktree build
114
+ pnpm --filter @cerbur/clutch-dsh-worktree test
115
+ ```
116
+
117
+ 完整 workspace 校验:
118
+
119
+ ```bash
120
+ pnpm run check
121
+ ```
122
+
123
+ 维护者请先阅读 [AGENTS.md](AGENTS.md) 了解数据边界、模块权责、生命周期和验证约束;浏览器 Consumer 的实现说明位于 [`src/client/README.md`](src/client/README.md)。
124
+
125
+ ## 插件市场条目建议
126
+
127
+ 向 `awesome-dsh-plugin` 提交时,建议使用 `git` 分类,并保持描述与实际代码一致:
128
+
129
+ ```yaml
130
+ category: git
131
+ description:
132
+ en: Adds a Worktree view to DSH Web UI that groups Sessions by Git worktree while keeping DSH as the source of truth.
133
+ zh: 为 DSH Web UI 增加按 Git Worktree 组织 Session 的视角,同时继续由 DSH 管理原始 Project 和 Session 数据。
134
+ ```
135
+
136
+ 市场投稿还需要在外部仓库中确认 `dsh-plugin` topic、仓库年龄和提交数;这些不是 package README 可以代替设置的内容。
@@ -0,0 +1,5 @@
1
+ - insert:
2
+ - id: clutch-dsh-worktree-host
3
+ name: '@cerbur/clutch-dsh-worktree'
4
+ config:
5
+ dshHome: !!js dshHomePath()
@@ -0,0 +1,11 @@
1
+ import type { PropsRuntime, PropsStore } from '@deepseek-ai/dsh-client-ui-slots';
2
+ import type { createWorktreeViewStore } from './view-mode-store.js';
3
+ /** Apply-time facts and callbacks owned by the Consumer entry. */
4
+ export interface WorktreeModeActionInjected {
5
+ readonly available: boolean;
6
+ }
7
+ /** Props derived from the footer slot, shared store, and injected availability face. */
8
+ export type WorktreeModeActionProps = PropsRuntime<'sidebar.footer.action'> & PropsStore<ReturnType<typeof createWorktreeViewStore>> & WorktreeModeActionInjected;
9
+ /** Footer action that enters/exits the peer Worktree navigation mode. */
10
+ export declare function WorktreeModeAction({ wide, useStore, actions, available, }: WorktreeModeActionProps): import("react").JSX.Element | null;
11
+ //# sourceMappingURL=WorktreeModeAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorktreeModeAction.d.ts","sourceRoot":"","sources":["../../src/client/WorktreeModeAction.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAGjF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAGpE,kEAAkE;AAClE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,wFAAwF;AACxF,MAAM,MAAM,uBAAuB,GAAG,YAAY,CAAC,uBAAuB,CAAC,GACzE,UAAU,CAAC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,GACtD,0BAA0B,CAAC;AAE7B,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE,uBAAuB,sCAsBzB"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { IconBranchOutline16 } from '@deepseek-ai/dsh-client-ui-primitives';
3
+ import styles from './worktree.css';
4
+ /** Footer action that enters/exits the peer Worktree navigation mode. */
5
+ export function WorktreeModeAction({ wide, useStore, actions, available, }) {
6
+ if (!available)
7
+ return null;
8
+ const mode = useStore((state) => state.viewMode);
9
+ const active = mode === 'worktree';
10
+ return (_jsxs("button", { type: "button", className: styles.action, "data-worktree-mode-action": true, "data-active": active || undefined, "data-collapsed": !wide || undefined, "aria-label": active ? 'Exit Worktree mode' : 'Open Worktree mode', "aria-pressed": active, title: active ? 'Exit Worktree mode' : 'Worktree mode', onClick: () => {
11
+ actions.setViewMode(active ? 'workspace-session' : 'worktree');
12
+ }, children: [_jsx(IconBranchOutline16, { size: wide ? 16 : 18 }), wide && _jsx("span", { className: styles.actionLabel, children: "Worktree" })] }));
13
+ }
14
+ //# sourceMappingURL=WorktreeModeAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorktreeModeAction.js","sourceRoot":"","sources":["../../src/client/WorktreeModeAction.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAE5E,OAAO,MAAM,MAAM,gBAAgB,CAAC;AAYpC,yEAAyE;AACzE,MAAM,UAAU,kBAAkB,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,SAAS,GACe;IACxB,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,KAAK,UAAU,CAAC;IACnC,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,MAAM,CAAC,MAAM,oDAEX,MAAM,IAAI,SAAS,oBAChB,CAAC,IAAI,IAAI,SAAS,gBACtB,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,oBAAoB,kBAClD,MAAM,EACpB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,eAAe,EACtD,OAAO,EAAE,GAAG,EAAE;YACZ,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACjE,CAAC,aAED,KAAC,mBAAmB,IAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAI,EAC5C,IAAI,IAAI,eAAM,SAAS,EAAE,MAAM,CAAC,WAAW,yBAAiB,IACtD,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { PropsRuntime, PropsStore } from '@deepseek-ai/dsh-client-ui-slots';
2
+ import type { WorktreeManager } from '../contract/index.js';
3
+ import type { createWorktreeViewStore } from './view-mode-store.js';
4
+ import { type CreateSessionForWorktreeInput } from './worktree-view.js';
5
+ /** Apply-time facts and DSH navigation callbacks used by the surface. */
6
+ export interface WorktreeSurfaceInjected {
7
+ readonly available: boolean;
8
+ readonly manager?: WorktreeManager;
9
+ readonly createWorkspace?: () => Promise<void>;
10
+ readonly createSessionForWorktree?: (input: CreateSessionForWorktreeInput) => Promise<string>;
11
+ readonly createMainSession?: (workspaceId: string) => void;
12
+ readonly renameWorkspace?: (workspaceId: string, title: string) => Promise<void>;
13
+ readonly deleteWorkspace?: (workspaceId: string) => Promise<void>;
14
+ readonly insertWorkspaceBefore?: (workspaceId: string, beforeWorkspaceId?: string) => Promise<void>;
15
+ readonly insertSessionBefore?: (workspaceId: string, sessionId: string, beforeSessionId?: string) => Promise<void>;
16
+ readonly renameSession?: (sessionId: string, title: string) => Promise<void>;
17
+ readonly forkSession?: (sessionId: string) => void;
18
+ readonly archiveSession?: (sessionId: string) => Promise<void>;
19
+ readonly ensureSessionWorkspace?: (workspaceId: string, sessionId: string) => void;
20
+ readonly syncSessionWorkspaces?: (bindings: readonly {
21
+ workspaceId: string;
22
+ sessionId: string;
23
+ }[]) => void;
24
+ readonly openSession: (sessionId: string) => void;
25
+ }
26
+ /** Props derived from the frame overlay slot, shared state, and injected face. */
27
+ export type WorktreeSurfaceProps = PropsRuntime<'shell.overlay'> & PropsStore<ReturnType<typeof createWorktreeViewStore>> & WorktreeSurfaceInjected;
28
+ /**
29
+ * Peer Worktree navigation surface. It keeps the original DSH Workspace mode
30
+ * intact and renders a browser-local Workspace → Worktree → Session projection.
31
+ */
32
+ export declare function WorktreeSurface({ useStore, actions, useSessions, useWorkspaces, available, manager, createWorkspace, createSessionForWorktree: createSessionCallback, createMainSession, renameWorkspace, deleteWorkspace, insertWorkspaceBefore, insertSessionBefore, renameSession, forkSession, archiveSession, ensureSessionWorkspace, syncSessionWorkspaces, openSession, }: WorktreeSurfaceProps): import("react").JSX.Element | null;
33
+ //# sourceMappingURL=WorktreeSurface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorktreeSurface.d.ts","sourceRoot":"","sources":["../../src/client/WorktreeSurface.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAqBjF,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EASL,KAAK,6BAA6B,EAGnC,MAAM,oBAAoB,CAAC;AAmB5B,yEAAyE;AACzE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAClC,KAAK,EAAE,6BAA6B,KACjC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAC/B,WAAW,EAAE,MAAM,EACnB,iBAAiB,CAAC,EAAE,MAAM,KACvB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAC7B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,MAAM,KACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnF,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAC/B,QAAQ,EAAE,SAAS;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,KAC5D,IAAI,CAAC;IACV,QAAQ,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD;AAED,kFAAkF;AAClF,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC,eAAe,CAAC,GAC9D,UAAU,CAAC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,GACtD,uBAAuB,CAAC;AA2jB1B;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,OAAO,EACP,WAAW,EACX,aAAa,EACb,SAAS,EACT,OAAO,EACP,eAAe,EACf,wBAAwB,EAAE,qBAAqB,EAC/C,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,WAAW,GACZ,EAAE,oBAAoB,sCA+jCtB"}