@coralai/sps-cli 0.50.24 → 0.51.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 (82) hide show
  1. package/README.md +18 -1
  2. package/dist/commands/projectInit.d.ts +15 -0
  3. package/dist/commands/projectInit.d.ts.map +1 -1
  4. package/dist/commands/projectInit.js +191 -3
  5. package/dist/commands/projectInit.js.map +1 -1
  6. package/dist/commands/wikiCommand.d.ts +77 -0
  7. package/dist/commands/wikiCommand.d.ts.map +1 -0
  8. package/dist/commands/wikiCommand.js +489 -0
  9. package/dist/commands/wikiCommand.js.map +1 -0
  10. package/dist/console/routes/projects.d.ts.map +1 -1
  11. package/dist/console/routes/projects.js +1 -0
  12. package/dist/console/routes/projects.js.map +1 -1
  13. package/dist/console-assets/assets/{index-BgOHCIG1.css → index-DlwaKe2l.css} +1 -1
  14. package/dist/console-assets/assets/{index-QBai48VV.js → index-Gjim492C.js} +1 -1
  15. package/dist/console-assets/index.html +2 -2
  16. package/dist/core/taskPrompts.d.ts +12 -0
  17. package/dist/core/taskPrompts.d.ts.map +1 -1
  18. package/dist/core/taskPrompts.js +14 -0
  19. package/dist/core/taskPrompts.js.map +1 -1
  20. package/dist/core/wiki/frontmatter.d.ts +55 -0
  21. package/dist/core/wiki/frontmatter.d.ts.map +1 -0
  22. package/dist/core/wiki/frontmatter.js +109 -0
  23. package/dist/core/wiki/frontmatter.js.map +1 -0
  24. package/dist/core/wiki/hot.d.ts +27 -0
  25. package/dist/core/wiki/hot.d.ts.map +1 -0
  26. package/dist/core/wiki/hot.js +124 -0
  27. package/dist/core/wiki/hot.js.map +1 -0
  28. package/dist/core/wiki/index-builder.d.ts +37 -0
  29. package/dist/core/wiki/index-builder.d.ts.map +1 -0
  30. package/dist/core/wiki/index-builder.js +130 -0
  31. package/dist/core/wiki/index-builder.js.map +1 -0
  32. package/dist/core/wiki/linter.d.ts +76 -0
  33. package/dist/core/wiki/linter.d.ts.map +1 -0
  34. package/dist/core/wiki/linter.js +280 -0
  35. package/dist/core/wiki/linter.js.map +1 -0
  36. package/dist/core/wiki/log.d.ts +24 -0
  37. package/dist/core/wiki/log.d.ts.map +1 -0
  38. package/dist/core/wiki/log.js +107 -0
  39. package/dist/core/wiki/log.js.map +1 -0
  40. package/dist/core/wiki/manifest.d.ts +59 -0
  41. package/dist/core/wiki/manifest.d.ts.map +1 -0
  42. package/dist/core/wiki/manifest.js +180 -0
  43. package/dist/core/wiki/manifest.js.map +1 -0
  44. package/dist/core/wiki/page.d.ts +72 -0
  45. package/dist/core/wiki/page.d.ts.map +1 -0
  46. package/dist/core/wiki/page.js +221 -0
  47. package/dist/core/wiki/page.js.map +1 -0
  48. package/dist/core/wiki/reader.d.ts +102 -0
  49. package/dist/core/wiki/reader.d.ts.map +1 -0
  50. package/dist/core/wiki/reader.js +225 -0
  51. package/dist/core/wiki/reader.js.map +1 -0
  52. package/dist/core/wiki/scaffold.d.ts +42 -0
  53. package/dist/core/wiki/scaffold.d.ts.map +1 -0
  54. package/dist/core/wiki/scaffold.js +223 -0
  55. package/dist/core/wiki/scaffold.js.map +1 -0
  56. package/dist/core/wiki/searcher.d.ts +73 -0
  57. package/dist/core/wiki/searcher.d.ts.map +1 -0
  58. package/dist/core/wiki/searcher.js +216 -0
  59. package/dist/core/wiki/searcher.js.map +1 -0
  60. package/dist/core/wiki/sources.d.ts +84 -0
  61. package/dist/core/wiki/sources.d.ts.map +1 -0
  62. package/dist/core/wiki/sources.js +261 -0
  63. package/dist/core/wiki/sources.js.map +1 -0
  64. package/dist/core/wiki/types.d.ts +904 -0
  65. package/dist/core/wiki/types.d.ts.map +1 -0
  66. package/dist/core/wiki/types.js +109 -0
  67. package/dist/core/wiki/types.js.map +1 -0
  68. package/dist/engines/StageEngine.d.ts +17 -1
  69. package/dist/engines/StageEngine.d.ts.map +1 -1
  70. package/dist/engines/StageEngine.js +85 -0
  71. package/dist/engines/StageEngine.js.map +1 -1
  72. package/dist/main.js +78 -1
  73. package/dist/main.js.map +1 -1
  74. package/dist/services/ProjectService.d.ts +2 -0
  75. package/dist/services/ProjectService.d.ts.map +1 -1
  76. package/dist/services/ProjectService.js.map +1 -1
  77. package/dist/shared/wikiPaths.d.ts +38 -0
  78. package/dist/shared/wikiPaths.d.ts.map +1 -0
  79. package/dist/shared/wikiPaths.js +89 -0
  80. package/dist/shared/wikiPaths.js.map +1 -0
  81. package/package.json +1 -1
  82. package/skills/wiki-update/SKILL.md +300 -0
@@ -0,0 +1,261 @@
1
+ /**
2
+ * @module core/wiki/sources
3
+ * @description Wiki 源材料发现:扫 WIKI.md sources 模式 → 文件列表 + diff
4
+ *
5
+ * @layer core
6
+ *
7
+ * 不依赖 micromatch / fast-glob —— SPS 模式很简单(**+扩展名过滤),手写够用且
8
+ * 避免再多 50 KB 依赖。
9
+ *
10
+ * 支持的模式:
11
+ * - "src/**\/*.ts" 递归 + 扩展名过滤
12
+ * - "src/**" 递归全部
13
+ * - "docs/*.md" 平铺扩展名过滤
14
+ * - "README.md" 字面量
15
+ *
16
+ * 不支持(也不需要):
17
+ * - { } alternation, [chars] character class, ! negation
18
+ * - 多扩展名("*.{ts,tsx}")—— 用两条 pattern 代替
19
+ *
20
+ * **路径都相对 repoDir**——manifest 里也用相对路径,跨机器一致。
21
+ */
22
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
23
+ import { relative, resolve, sep } from 'node:path';
24
+ import { parse as parseYaml } from 'yaml';
25
+ import { wikiMetaFile } from '../../shared/wikiPaths.js';
26
+ import { diffSources, hashFile } from './manifest.js';
27
+ const EMPTY_SOURCES = { code: [], doc: [], raw: [], data: [] };
28
+ /**
29
+ * 从 WIKI.md 顶部 frontmatter 抽 sources 配置。
30
+ *
31
+ * 容错:
32
+ * - WIKI.md 不存在 → 返默认(空配置)
33
+ * - frontmatter 缺失 / sources 字段缺失 → 返默认
34
+ * - 类型不对(非数组 / 非字符串)→ 跳过该 bucket
35
+ */
36
+ export function readSourcesConfig(repoDir) {
37
+ const path = wikiMetaFile(repoDir);
38
+ if (!existsSync(path))
39
+ return EMPTY_SOURCES;
40
+ const content = readFileSync(path, 'utf-8');
41
+ const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
42
+ if (!fmMatch)
43
+ return EMPTY_SOURCES;
44
+ let parsed;
45
+ try {
46
+ parsed = parseYaml(fmMatch[1]);
47
+ }
48
+ catch {
49
+ return EMPTY_SOURCES;
50
+ }
51
+ if (!parsed || typeof parsed !== 'object')
52
+ return EMPTY_SOURCES;
53
+ const obj = parsed;
54
+ const sources = obj.sources;
55
+ if (!sources || typeof sources !== 'object')
56
+ return EMPTY_SOURCES;
57
+ const buckets = sources;
58
+ return {
59
+ code: pickStringArray(buckets.code),
60
+ doc: pickStringArray(buckets.doc),
61
+ raw: pickStringArray(buckets.raw),
62
+ data: pickStringArray(buckets.data),
63
+ };
64
+ }
65
+ function pickStringArray(v) {
66
+ if (!Array.isArray(v))
67
+ return [];
68
+ return v.filter((x) => typeof x === 'string');
69
+ }
70
+ /**
71
+ * Parse a simple glob pattern into base + recursion + extension filter.
72
+ *
73
+ * Examples:
74
+ * "src/**\/*.ts" → base=src, recursive=true, ext=.ts
75
+ * "src/**" → base=src, recursive=true, ext=''
76
+ * "docs/*.md" → base=docs, recursive=false, ext=.md
77
+ * "README.md" → base=., recursive=false, ext=.md (treated as flat single)
78
+ *
79
+ * Unsupported patterns (e.g. with `{}`) are passed through but won't match anything.
80
+ */
81
+ export function parsePattern(pattern) {
82
+ const norm = pattern.replace(/\\/g, '/').trim();
83
+ const recursive = norm.includes('**');
84
+ // Strip trailing pattern segments
85
+ let base = norm;
86
+ let ext = '';
87
+ // Pull off the file pattern (last segment)
88
+ const lastSlash = norm.lastIndexOf('/');
89
+ const lastSeg = lastSlash >= 0 ? norm.slice(lastSlash + 1) : norm;
90
+ const beforeLast = lastSlash >= 0 ? norm.slice(0, lastSlash) : '';
91
+ if (lastSeg === '*' || lastSeg === '**') {
92
+ ext = '';
93
+ base = beforeLast.replace(/\/\*\*$/, '');
94
+ }
95
+ else if (/^\*\.[a-z0-9]+$/i.test(lastSeg)) {
96
+ ext = lastSeg.slice(1);
97
+ base = beforeLast.replace(/\/\*\*$/, '');
98
+ }
99
+ else if (recursive) {
100
+ // pattern like "src/**/file.md" or "src/**/foo/bar.md" — we don't fully
101
+ // support; treat as recursive over base, no ext filter, callers can post-filter.
102
+ ext = '';
103
+ base = norm.replace(/\/\*\*.*$/, '');
104
+ }
105
+ else {
106
+ // Literal path
107
+ ext = '';
108
+ base = norm;
109
+ }
110
+ if (base === '' || base === '.')
111
+ base = '.';
112
+ return { base, recursive, extension: ext, raw: pattern };
113
+ }
114
+ /**
115
+ * Walk filesystem from `repoDir/<base>` and collect files that match the pattern.
116
+ *
117
+ * - Skips dotfiles starting with `.` UNLESS the base itself starts with `.`
118
+ * (e.g. wiki/.raw/** — user wants those).
119
+ * - Always skips node_modules / .git anywhere in the tree.
120
+ *
121
+ * Returns paths relative to repoDir, posix-normalized.
122
+ */
123
+ export function expandPattern(repoDir, pattern) {
124
+ const parsed = parsePattern(pattern);
125
+ const baseAbs = resolve(repoDir, parsed.base);
126
+ // Literal file (e.g. README.md): just check existence
127
+ if (!parsed.recursive && parsed.extension === '' && parsed.base !== '.') {
128
+ if (existsSync(baseAbs)) {
129
+ try {
130
+ const st = statSync(baseAbs);
131
+ if (st.isFile()) {
132
+ return [toRelPosix(repoDir, baseAbs)];
133
+ }
134
+ if (st.isDirectory()) {
135
+ return walkDir(repoDir, baseAbs, false, '', baseStartsWithDot(parsed.base));
136
+ }
137
+ }
138
+ catch {
139
+ return [];
140
+ }
141
+ }
142
+ return [];
143
+ }
144
+ if (!existsSync(baseAbs))
145
+ return [];
146
+ let st;
147
+ try {
148
+ st = statSync(baseAbs);
149
+ }
150
+ catch {
151
+ return [];
152
+ }
153
+ if (!st.isDirectory())
154
+ return [];
155
+ return walkDir(repoDir, baseAbs, parsed.recursive, parsed.extension, baseStartsWithDot(parsed.base));
156
+ }
157
+ function baseStartsWithDot(base) {
158
+ // Any segment of base starts with `.` (e.g. ".raw" or "wiki/.raw")
159
+ return base.split('/').some((s) => s.startsWith('.'));
160
+ }
161
+ const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build', 'coverage']);
162
+ function walkDir(repoDir, dir, recursive, extension, allowDotFiles) {
163
+ const out = [];
164
+ let entries;
165
+ try {
166
+ entries = readdirSync(dir);
167
+ }
168
+ catch {
169
+ return out;
170
+ }
171
+ for (const name of entries) {
172
+ if (SKIP_DIRS.has(name))
173
+ continue;
174
+ if (!allowDotFiles && name.startsWith('.'))
175
+ continue;
176
+ const abs = resolve(dir, name);
177
+ let st;
178
+ try {
179
+ st = statSync(abs);
180
+ }
181
+ catch {
182
+ continue;
183
+ }
184
+ if (st.isDirectory()) {
185
+ if (recursive) {
186
+ out.push(...walkDir(repoDir, abs, recursive, extension, allowDotFiles));
187
+ }
188
+ }
189
+ else if (st.isFile()) {
190
+ if (extension && !name.endsWith(extension))
191
+ continue;
192
+ out.push(toRelPosix(repoDir, abs));
193
+ }
194
+ }
195
+ return out;
196
+ }
197
+ function toRelPosix(repoDir, abs) {
198
+ const rel = relative(repoDir, abs);
199
+ return sep === '\\' ? rel.replace(/\\/g, '/') : rel;
200
+ }
201
+ /**
202
+ * Discover all sources from WIKI.md config + hash them.
203
+ *
204
+ * Buckets are merged; if the same path is matched by multiple buckets, the first
205
+ * winning bucket (in code → doc → data → raw order) is used.
206
+ *
207
+ * Caller is responsible for I/O fault tolerance — this throws on individual hash
208
+ * failures only via `tryHashFile` semantics (skip).
209
+ */
210
+ export function discoverSources(repoDir) {
211
+ const config = readSourcesConfig(repoDir);
212
+ const seen = new Map();
213
+ const emptyPatterns = [];
214
+ const buckets = [
215
+ ['code', config.code],
216
+ ['doc', config.doc],
217
+ ['data', config.data],
218
+ ['raw', config.raw],
219
+ ];
220
+ for (const [category, patterns] of buckets) {
221
+ for (const pattern of patterns) {
222
+ const matched = expandPattern(repoDir, pattern);
223
+ if (matched.length === 0) {
224
+ emptyPatterns.push(pattern);
225
+ continue;
226
+ }
227
+ for (const p of matched) {
228
+ if (!seen.has(p))
229
+ seen.set(p, category);
230
+ }
231
+ }
232
+ }
233
+ const sources = [];
234
+ for (const [path, category] of seen) {
235
+ let hash;
236
+ try {
237
+ hash = hashFile(resolve(repoDir, path));
238
+ }
239
+ catch {
240
+ continue; // unreadable file = drop silently
241
+ }
242
+ sources.push({ path, category, hash });
243
+ }
244
+ // Stable sort for deterministic output
245
+ sources.sort((a, b) => a.path.localeCompare(b.path));
246
+ return { sources, emptyPatterns };
247
+ }
248
+ // ─── Diff helper (manifest aware) ─────────────────────────────────
249
+ /**
250
+ * Compute diff between current discovered sources and saved manifest.
251
+ *
252
+ * Wraps diffSources() with a typed input so callers don't have to remember
253
+ * the DiffInputSource shape.
254
+ */
255
+ export function diffAgainstManifest(sources, manifest) {
256
+ const inputs = sources
257
+ .filter((s) => typeof s.hash === 'string')
258
+ .map((s) => ({ path: s.path, hash: s.hash }));
259
+ return diffSources(inputs, manifest);
260
+ }
261
+ //# sourceMappingURL=sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.js","sourceRoot":"","sources":["../../../src/core/wiki/sources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAwB,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AA2B5E,MAAM,aAAa,GAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,aAAa,CAAC;IAE5C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC7D,IAAI,CAAC,OAAO;QAAE,OAAO,aAAa,CAAC;IAEnC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC;IAChE,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC;IAElE,MAAM,OAAO,GAAG,OAAkC,CAAC;IACnD,OAAO;QACL,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC;QACnC,GAAG,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC;QACjC,GAAG,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC;QACjC,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,CAAU;IACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAeD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEtC,kCAAkC;IAClC,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,GAAG,GAAG,EAAE,CAAC;IAEb,2CAA2C;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,MAAM,UAAU,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAElE,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACxC,GAAG,GAAG,EAAE,CAAC;QACT,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;SAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,wEAAwE;QACxE,iFAAiF;QACjF,GAAG,GAAG,EAAE,CAAC;QACT,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,eAAe;QACf,GAAG,GAAG,EAAE,CAAC;QACT,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG;QAAE,IAAI,GAAG,GAAG,CAAC;IAC5C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,OAAe;IAC5D,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAE9C,sDAAsD;IACtD,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,EAAE,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QACxE,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC7B,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;oBAChB,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBACxC,CAAC;gBACD,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;oBACrB,OAAO,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,IAAI,EAA+B,CAAC;IACpC,IAAI,CAAC;QACH,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE;QAAE,OAAO,EAAE,CAAC;IAEjC,OAAO,OAAO,CACZ,OAAO,EACP,OAAO,EACP,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,SAAS,EAChB,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,mEAAmE;IACnE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AAEjF,SAAS,OAAO,CACd,OAAe,EACf,GAAW,EACX,SAAkB,EAClB,SAAiB,EACjB,aAAsB;IAEtB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAClC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAErD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC/B,IAAI,EAA+B,CAAC;QACpC,IAAI,CAAC;YACH,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,IAAI,SAAS,EAAE,CAAC;gBACd,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;YACvB,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,SAAS;YACrD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,GAAW;IAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACtD,CAAC;AAWD;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC/C,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,MAAM,OAAO,GAAwD;QACnE,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;QACnB,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;KACpB,CAAC;IAEF,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC;QAC3C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC5B,SAAS;YACX,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;oBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;QACpC,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,kCAAkC;QAC9C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,uCAAuC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAErD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;AACpC,CAAC;AAED,qEAAqE;AAErE;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAoC,EACpC,QAAkB;IAElB,MAAM,MAAM,GAAsB,OAAO;SACtC,MAAM,CAAC,CAAC,CAAC,EAA4C,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;SACnF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAChD,OAAO,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC"}