soloforge 1.0.0 → 1.1.1
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.
- package/README.md +4 -1
- package/dist/adapters/claude_code/claude_md.d.ts +1 -2
- package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
- package/dist/adapters/claude_code/claude_md.js +2 -76
- package/dist/adapters/claude_code/claude_md.js.map +1 -1
- package/dist/adapters/claude_code/server.d.ts +16 -0
- package/dist/adapters/claude_code/server.d.ts.map +1 -1
- package/dist/adapters/claude_code/server.js +17 -1
- package/dist/adapters/claude_code/server.js.map +1 -1
- package/dist/adapters/claude_code/tools.d.ts +32 -1
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +65 -30
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/codex/codex_config.d.ts +3 -0
- package/dist/adapters/codex/codex_config.d.ts.map +1 -0
- package/dist/adapters/codex/codex_config.js +51 -0
- package/dist/adapters/codex/codex_config.js.map +1 -0
- package/dist/adapters/codex/codex_rules.d.ts +2 -0
- package/dist/adapters/codex/codex_rules.d.ts.map +1 -0
- package/dist/adapters/codex/codex_rules.js +5 -0
- package/dist/adapters/codex/codex_rules.js.map +1 -0
- package/dist/adapters/shared/workflow_template.d.ts +3 -0
- package/dist/adapters/shared/workflow_template.d.ts.map +1 -0
- package/dist/adapters/shared/workflow_template.js +78 -0
- package/dist/adapters/shared/workflow_template.js.map +1 -0
- package/dist/adapters/trae/trae_rules.d.ts +1 -2
- package/dist/adapters/trae/trae_rules.d.ts.map +1 -1
- package/dist/adapters/trae/trae_rules.js +2 -75
- package/dist/adapters/trae/trae_rules.js.map +1 -1
- package/dist/bin/soloforge.js +171 -22
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/change_coordinator.d.ts +20 -5
- package/dist/engine/change_coordinator.d.ts.map +1 -1
- package/dist/engine/change_coordinator.js +36 -22
- package/dist/engine/change_coordinator.js.map +1 -1
- package/dist/engine/classifier.d.ts +7 -0
- package/dist/engine/classifier.d.ts.map +1 -1
- package/dist/engine/classifier.js +75 -3
- package/dist/engine/classifier.js.map +1 -1
- package/dist/engine/code_reviewer.d.ts +37 -1
- package/dist/engine/code_reviewer.d.ts.map +1 -1
- package/dist/engine/code_reviewer.js +126 -24
- package/dist/engine/code_reviewer.js.map +1 -1
- package/dist/engine/confidence_scorer.d.ts +21 -0
- package/dist/engine/confidence_scorer.d.ts.map +1 -1
- package/dist/engine/confidence_scorer.js +19 -6
- package/dist/engine/confidence_scorer.js.map +1 -1
- package/dist/engine/contract_guard.d.ts +23 -0
- package/dist/engine/contract_guard.d.ts.map +1 -1
- package/dist/engine/contract_guard.js +152 -43
- package/dist/engine/contract_guard.js.map +1 -1
- package/dist/engine/convention_detector.d.ts +20 -0
- package/dist/engine/convention_detector.d.ts.map +1 -1
- package/dist/engine/convention_detector.js +19 -1
- package/dist/engine/convention_detector.js.map +1 -1
- package/dist/engine/debt_reporter.d.ts +5 -0
- package/dist/engine/debt_reporter.d.ts.map +1 -1
- package/dist/engine/debt_reporter.js +30 -6
- package/dist/engine/debt_reporter.js.map +1 -1
- package/dist/engine/debt_tracker.d.ts +52 -0
- package/dist/engine/debt_tracker.d.ts.map +1 -1
- package/dist/engine/debt_tracker.js +66 -1
- package/dist/engine/debt_tracker.js.map +1 -1
- package/dist/engine/debugger.d.ts +9 -0
- package/dist/engine/debugger.d.ts.map +1 -1
- package/dist/engine/debugger.js +112 -20
- package/dist/engine/debugger.js.map +1 -1
- package/dist/engine/delivery.d.ts +27 -0
- package/dist/engine/delivery.d.ts.map +1 -1
- package/dist/engine/delivery.js +67 -13
- package/dist/engine/delivery.js.map +1 -1
- package/dist/engine/dependency_scanner.d.ts +5 -8
- package/dist/engine/dependency_scanner.d.ts.map +1 -1
- package/dist/engine/dependency_scanner.js +46 -29
- package/dist/engine/dependency_scanner.js.map +1 -1
- package/dist/engine/evolver.d.ts +54 -0
- package/dist/engine/evolver.d.ts.map +1 -1
- package/dist/engine/evolver.js +159 -6
- package/dist/engine/evolver.js.map +1 -1
- package/dist/engine/exploration.d.ts +114 -0
- package/dist/engine/exploration.d.ts.map +1 -0
- package/dist/engine/exploration.js +414 -0
- package/dist/engine/exploration.js.map +1 -0
- package/dist/engine/failure_classifier.d.ts +28 -0
- package/dist/engine/failure_classifier.d.ts.map +1 -1
- package/dist/engine/failure_classifier.js +51 -5
- package/dist/engine/failure_classifier.js.map +1 -1
- package/dist/engine/git_deps.d.ts +29 -0
- package/dist/engine/git_deps.d.ts.map +1 -1
- package/dist/engine/git_deps.js +1 -0
- package/dist/engine/git_deps.js.map +1 -1
- package/dist/engine/impact_analyzer.d.ts +17 -0
- package/dist/engine/impact_analyzer.d.ts.map +1 -1
- package/dist/engine/impact_analyzer.js +76 -4
- package/dist/engine/impact_analyzer.js.map +1 -1
- package/dist/engine/intent_expander.d.ts +58 -0
- package/dist/engine/intent_expander.d.ts.map +1 -1
- package/dist/engine/intent_expander.js +173 -1
- package/dist/engine/intent_expander.js.map +1 -1
- package/dist/engine/migration_guard.d.ts +6 -0
- package/dist/engine/migration_guard.d.ts.map +1 -1
- package/dist/engine/migration_guard.js +26 -7
- package/dist/engine/migration_guard.js.map +1 -1
- package/dist/engine/observability.d.ts +31 -7
- package/dist/engine/observability.d.ts.map +1 -1
- package/dist/engine/observability.js +88 -28
- package/dist/engine/observability.js.map +1 -1
- package/dist/engine/onboarding.d.ts +41 -1
- package/dist/engine/onboarding.d.ts.map +1 -1
- package/dist/engine/onboarding.js +83 -8
- package/dist/engine/onboarding.js.map +1 -1
- package/dist/engine/scaffolder.d.ts +10 -0
- package/dist/engine/scaffolder.d.ts.map +1 -1
- package/dist/engine/scaffolder.js +55 -10
- package/dist/engine/scaffolder.js.map +1 -1
- package/dist/engine/scope_controller.d.ts +13 -0
- package/dist/engine/scope_controller.d.ts.map +1 -1
- package/dist/engine/scope_controller.js +76 -12
- package/dist/engine/scope_controller.js.map +1 -1
- package/dist/engine/task_context.d.ts +124 -0
- package/dist/engine/task_context.d.ts.map +1 -1
- package/dist/engine/task_context.js +155 -7
- package/dist/engine/task_context.js.map +1 -1
- package/dist/engine/task_planner.d.ts +17 -0
- package/dist/engine/task_planner.d.ts.map +1 -1
- package/dist/engine/task_planner.js +51 -4
- package/dist/engine/task_planner.js.map +1 -1
- package/dist/engine/team_awareness.d.ts +17 -0
- package/dist/engine/team_awareness.d.ts.map +1 -1
- package/dist/engine/team_awareness.js +29 -11
- package/dist/engine/team_awareness.js.map +1 -1
- package/dist/engine/test_generator.d.ts +5 -4
- package/dist/engine/test_generator.d.ts.map +1 -1
- package/dist/engine/test_generator.js +22 -5
- package/dist/engine/test_generator.js.map +1 -1
- package/dist/engine/test_quality.d.ts +11 -4
- package/dist/engine/test_quality.d.ts.map +1 -1
- package/dist/engine/test_quality.js +171 -14
- package/dist/engine/test_quality.js.map +1 -1
- package/dist/engine/verifier.d.ts +41 -0
- package/dist/engine/verifier.d.ts.map +1 -1
- package/dist/engine/verifier.js +110 -1
- package/dist/engine/verifier.js.map +1 -1
- package/dist/git/operations.d.ts +1 -0
- package/dist/git/operations.d.ts.map +1 -1
- package/dist/git/operations.js +3 -0
- package/dist/git/operations.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/knowledge/index_manager.d.ts +7 -1
- package/dist/knowledge/index_manager.d.ts.map +1 -1
- package/dist/knowledge/index_manager.js +112 -37
- package/dist/knowledge/index_manager.js.map +1 -1
- package/dist/knowledge/loader.d.ts +31 -0
- package/dist/knowledge/loader.d.ts.map +1 -1
- package/dist/knowledge/loader.js +102 -8
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/types.d.ts +608 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/knowledge/acceptance_templates//346/212/200/346/234/257/351/200/211/345/236/213/351/252/214/346/224/266/346/270/205/345/215/225.md +19 -0
- package/templates/knowledge/acceptance_templates//351/200/232/347/224/250/350/264/250/351/207/217/351/252/214/346/224/266/346/270/205/345/215/225.md +4 -0
- package/templates/knowledge/procedures//345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213.md +4 -1
- package/templates/knowledge/procedures//350/207/252/344/270/273/351/200/211/345/236/213/346/265/201/347/250/213.md +34 -0
- package/templates/knowledge/review_rules//344/272/244/344/273/230/345/256/214/345/244/207/346/200/247/345/256/241/346/237/245/350/247/204/345/210/231.md +66 -0
- package/templates/scaffolds/react/Form.tsx.hbs +9 -1
- package/templates/scaffolds/react/List.tsx.hbs +10 -1
- package/templates/scaffolds/react/Page.tsx.hbs +4 -1
- package/templates/scaffolds/react/service.ts.hbs +29 -0
- package/templates/scaffolds/react/types.ts.hbs +7 -1
- package/templates/scaffolds/react/use{{ModuleName}}.ts.hbs +34 -2
- package/templates/scaffolds/spring-boot/Controller.java.hbs +27 -0
- package/templates/scaffolds/spring-boot/DTO.java.hbs +7 -1
- package/templates/scaffolds/spring-boot/Entity.java.hbs +11 -1
- package/templates/scaffolds/spring-boot/ErrorCode.java.hbs +13 -1
- package/templates/scaffolds/spring-boot/Mapper.java.hbs +4 -1
- package/templates/scaffolds/spring-boot/PageResponse.java.hbs +24 -1
- package/templates/scaffolds/spring-boot/Service.java.hbs +32 -0
- package/templates/scaffolds/spring-boot/ServiceImpl.java.hbs +23 -5
- package/templates/scaffolds/spring-boot/ServiceTest.java.hbs +7 -1
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 获取完整的团队态势信息,包括活动流、成员工作负载、过期分支和知识更新。
|
|
3
|
+
* @param input - 团队态势感知输入参数
|
|
4
|
+
* @returns 团队状态结果,包含活动流、成员工作量、过期分支、知识更新和中文摘要
|
|
5
|
+
*/
|
|
1
6
|
export async function getTeamStatus(input) {
|
|
2
7
|
const { projectPath, gitOps, knowledgeIndex } = input;
|
|
3
8
|
const since = input.since ?? defaultSince();
|
|
@@ -8,7 +13,7 @@ export async function getTeamStatus(input) {
|
|
|
8
13
|
stale_branches: [],
|
|
9
14
|
summary: "",
|
|
10
15
|
};
|
|
11
|
-
// 1.
|
|
16
|
+
// 1. 获取活动流(近 50 条提交记录)
|
|
12
17
|
try {
|
|
13
18
|
const log = await gitOps.getLog(projectPath, { since, maxCount: 50 });
|
|
14
19
|
result.activity_feed = log.map((entry) => ({
|
|
@@ -16,13 +21,13 @@ export async function getTeamStatus(input) {
|
|
|
16
21
|
date: entry.date,
|
|
17
22
|
message: entry.message,
|
|
18
23
|
short_hash: entry.shortHash,
|
|
19
|
-
files_changed: 0, //
|
|
24
|
+
files_changed: 0, // 单从日志无法获取变更文件数
|
|
20
25
|
}));
|
|
21
26
|
}
|
|
22
27
|
catch (e) {
|
|
23
28
|
console.debug("[soloforge]", e);
|
|
24
29
|
}
|
|
25
|
-
// 2.
|
|
30
|
+
// 2. 按成员统计工作负载(提交数、活跃文件、最后活跃时间)
|
|
26
31
|
try {
|
|
27
32
|
const shortlog = await gitOps.getShortlog(projectPath, since);
|
|
28
33
|
for (const { author, count } of shortlog) {
|
|
@@ -44,21 +49,22 @@ export async function getTeamStatus(input) {
|
|
|
44
49
|
catch (e) {
|
|
45
50
|
console.debug("[soloforge]", e);
|
|
46
51
|
}
|
|
47
|
-
// 3.
|
|
48
|
-
// TODO: getLog
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
+
// 3. 检测过期分支(超过 30 天无新提交的分支)
|
|
53
|
+
// TODO: getLog 没有 branch/ref 参数,无法按分支查询日志
|
|
54
|
+
// path 过滤会将 branch.name 当作文件路径处理,结果不准确
|
|
55
|
+
// 正确修复需在 GitOperations.getLog 中添加 `ref` 选项
|
|
56
|
+
// 或直接使用 `git log <branch> -1 --format=%aI` 命令
|
|
52
57
|
try {
|
|
53
58
|
const branches = await gitOps.listBranches(projectPath);
|
|
54
59
|
for (const branch of branches) {
|
|
55
60
|
if (branch.isCurrent)
|
|
56
|
-
continue;
|
|
61
|
+
continue; // 跳过当前分支
|
|
57
62
|
try {
|
|
58
63
|
const branchLog = await gitOps.getLog(projectPath, { maxCount: 1, path: branch.name });
|
|
59
64
|
if (branchLog.length > 0) {
|
|
60
65
|
const lastDate = new Date(branchLog[0].date);
|
|
61
66
|
const daysSince = (Date.now() - lastDate.getTime()) / (1000 * 60 * 60 * 24);
|
|
67
|
+
// 分支超过 30 天无新提交视为过期
|
|
62
68
|
if (daysSince > 30) {
|
|
63
69
|
result.stale_branches.push({
|
|
64
70
|
name: branch.name,
|
|
@@ -75,11 +81,12 @@ export async function getTeamStatus(input) {
|
|
|
75
81
|
catch (e) {
|
|
76
82
|
console.debug("[soloforge]", e);
|
|
77
83
|
}
|
|
78
|
-
// 4.
|
|
84
|
+
// 4. 获取近期知识条目更新(需提供知识索引)
|
|
79
85
|
if (knowledgeIndex) {
|
|
80
86
|
try {
|
|
81
87
|
const allEntries = knowledgeIndex.getAllEntries();
|
|
82
88
|
const sinceDate = new Date(since);
|
|
89
|
+
// 合并全局和项目级知识条目,筛选在时间范围内且有 active 状态的条目
|
|
83
90
|
const combined = [...allEntries.global, ...allEntries.project];
|
|
84
91
|
result.recent_knowledge = combined
|
|
85
92
|
.filter((e) => e.status === "active" && new Date(e.updated_at) >= sinceDate)
|
|
@@ -89,7 +96,7 @@ export async function getTeamStatus(input) {
|
|
|
89
96
|
console.debug("[soloforge]", e);
|
|
90
97
|
}
|
|
91
98
|
}
|
|
92
|
-
// 5.
|
|
99
|
+
// 5. 生成中文摘要
|
|
93
100
|
const parts = [];
|
|
94
101
|
if (result.member_workloads.length > 0) {
|
|
95
102
|
parts.push(`${result.member_workloads.length} 名活跃成员`);
|
|
@@ -103,19 +110,30 @@ export async function getTeamStatus(input) {
|
|
|
103
110
|
result.summary = parts.length > 0 ? parts.join(",") : "暂无团队活动";
|
|
104
111
|
return result;
|
|
105
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* 计算默认的起始日期:当前时间往前推 7 天。
|
|
115
|
+
* @returns YYYY-MM-DD 格式的日期字符串
|
|
116
|
+
*/
|
|
106
117
|
function defaultSince() {
|
|
107
118
|
const d = new Date();
|
|
108
119
|
d.setDate(d.getDate() - 7);
|
|
109
120
|
return d.toISOString().split("T")[0];
|
|
110
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* 从提交消息中提取文件路径。使用正则匹配常见编程语言的文件扩展名。
|
|
124
|
+
* @param messages - 提交消息列表
|
|
125
|
+
* @returns 提取到的去重文件路径列表(最多 10 个)
|
|
126
|
+
*/
|
|
111
127
|
function extractFilesFromMessages(messages) {
|
|
112
128
|
const files = new Set();
|
|
113
129
|
for (const msg of messages) {
|
|
130
|
+
// 匹配常见源码文件扩展名
|
|
114
131
|
const matches = msg.matchAll(/[\w/.-]+\.(java|ts|tsx|js|jsx|py|go|rs)/g);
|
|
115
132
|
for (const m of matches) {
|
|
116
133
|
files.add(m[0]);
|
|
117
134
|
}
|
|
118
135
|
}
|
|
136
|
+
// 限制返回数量,避免列表过长
|
|
119
137
|
return [...files].slice(0, 10);
|
|
120
138
|
}
|
|
121
139
|
//# sourceMappingURL=team_awareness.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team_awareness.js","sourceRoot":"","sources":["../../src/engine/team_awareness.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"team_awareness.js","sourceRoot":"","sources":["../../src/engine/team_awareness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { TestGenGuide, ProjectConfig } from "../types.js";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* 为变更文件生成测试引导 — 根据文件类型匹配测试策略,叠加知识驱动场景。
|
|
4
|
+
* @param changedFiles - 变更文件路径列表
|
|
5
|
+
* @param knowledgePatterns - 从知识库提取的关键词模式列表
|
|
6
|
+
* @param _config - 项目配置(预留,当前未使用)
|
|
7
|
+
* @returns 测试引导数组,每项包含测试类型、测试文件建议路径、场景列表和 Mock 要点
|
|
7
8
|
*/
|
|
8
9
|
export declare function generateTestGuide(changedFiles: string[], knowledgePatterns: string[], _config: ProjectConfig): TestGenGuide[];
|
|
9
10
|
//# sourceMappingURL=test_generator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test_generator.d.ts","sourceRoot":"","sources":["../../src/engine/test_generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAgB,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"test_generator.d.ts","sourceRoot":"","sources":["../../src/engine/test_generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAgB,aAAa,EAAE,MAAM,aAAa,CAAC;AAoM7E;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EAAE,EACtB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,OAAO,EAAE,aAAa,GACrB,YAAY,EAAE,CA+BhB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
+
/** 文件类型 → 测试策略映射表: 根据文件名模式匹配测试类型、夹具方式和 Mock 策略 */
|
|
2
3
|
const FILE_TEST_MAP = [
|
|
3
4
|
{
|
|
4
5
|
pattern: /Controller\.java$/,
|
|
@@ -34,6 +35,7 @@ const FILE_TEST_MAP = [
|
|
|
34
35
|
// ────────────────────────────────────────────
|
|
35
36
|
// Default scenarios per test type
|
|
36
37
|
// ────────────────────────────────────────────
|
|
38
|
+
/** 各测试类型的默认场景集 — 单元/集成/E2E 测试的 Given-When-Then 标准场景 */
|
|
37
39
|
const DEFAULT_SCENARIOS = {
|
|
38
40
|
unit: [
|
|
39
41
|
{
|
|
@@ -98,6 +100,7 @@ const DEFAULT_SCENARIOS = {
|
|
|
98
100
|
},
|
|
99
101
|
],
|
|
100
102
|
};
|
|
103
|
+
/** 知识关键词 → 额外测试场景映射表: 当文件路径或知识模式包含关键词时自动追加场景 */
|
|
101
104
|
const KNOWLEDGE_SCENARIOS = [
|
|
102
105
|
{
|
|
103
106
|
keywords: ["并发", "concurrent", "thread", "lock", "mutex", "race"],
|
|
@@ -161,10 +164,11 @@ const KNOWLEDGE_SCENARIOS = [
|
|
|
161
164
|
},
|
|
162
165
|
];
|
|
163
166
|
/**
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
167
|
+
* 为变更文件生成测试引导 — 根据文件类型匹配测试策略,叠加知识驱动场景。
|
|
168
|
+
* @param changedFiles - 变更文件路径列表
|
|
169
|
+
* @param knowledgePatterns - 从知识库提取的关键词模式列表
|
|
170
|
+
* @param _config - 项目配置(预留,当前未使用)
|
|
171
|
+
* @returns 测试引导数组,每项包含测试类型、测试文件建议路径、场景列表和 Mock 要点
|
|
168
172
|
*/
|
|
169
173
|
export function generateTestGuide(changedFiles, knowledgePatterns, _config) {
|
|
170
174
|
const guides = [];
|
|
@@ -195,6 +199,7 @@ export function generateTestGuide(changedFiles, knowledgePatterns, _config) {
|
|
|
195
199
|
// ────────────────────────────────────────────
|
|
196
200
|
// Internal helpers
|
|
197
201
|
// ────────────────────────────────────────────
|
|
202
|
+
/** 根据文件路径匹配测试策略 — 遍历 FILE_TEST_MAP 返回首个命中的映射规则 */
|
|
198
203
|
function matchFileTestMapping(filePath) {
|
|
199
204
|
for (const mapping of FILE_TEST_MAP) {
|
|
200
205
|
if (mapping.pattern.test(filePath)) {
|
|
@@ -203,6 +208,12 @@ function matchFileTestMapping(filePath) {
|
|
|
203
208
|
}
|
|
204
209
|
return null;
|
|
205
210
|
}
|
|
211
|
+
/**
|
|
212
|
+
* 推荐测试文件路径 — Java 文件遵循 src/main → src/test 和 *Test.java 命名约定,TS/JS 文件追加 .test 后缀。
|
|
213
|
+
* @param sourceFile - 源文件路径
|
|
214
|
+
* @param testType - 测试类型(用于未来扩展不同约定)
|
|
215
|
+
* @returns 推荐的测试文件路径
|
|
216
|
+
*/
|
|
206
217
|
function suggestTestFilePath(sourceFile, testType) {
|
|
207
218
|
const ext = path.extname(sourceFile);
|
|
208
219
|
const base = sourceFile.slice(0, -ext.length);
|
|
@@ -219,10 +230,16 @@ function suggestTestFilePath(sourceFile, testType) {
|
|
|
219
230
|
const testExt = `.test${ext}`;
|
|
220
231
|
return `${base}${testExt}`;
|
|
221
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* 匹配知识驱动的额外测试场景 — 将文件路径和知识模式拼接后搜索关键词命中。
|
|
235
|
+
* @param file - 源文件路径(用于关键词匹配)
|
|
236
|
+
* @param knowledgePatterns - 知识库关键词列表
|
|
237
|
+
* @returns 命中的额外测试场景数组(自动去重)
|
|
238
|
+
*/
|
|
222
239
|
function matchKnowledgeScenarios(file, knowledgePatterns) {
|
|
223
240
|
const matched = [];
|
|
224
241
|
const seenNames = new Set();
|
|
225
|
-
//
|
|
242
|
+
// 将文件路径与所有知识关键词拼接为搜索文本,统一转小写进行匹配
|
|
226
243
|
const searchText = (file + " " + knowledgePatterns.join(" ")).toLowerCase();
|
|
227
244
|
for (const entry of KNOWLEDGE_SCENARIOS) {
|
|
228
245
|
if (seenNames.has(entry.scenario.name)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test_generator.js","sourceRoot":"","sources":["../../src/engine/test_generator.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"test_generator.js","sourceRoot":"","sources":["../../src/engine/test_generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import type { TestQualityReport } from "../types.js";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* 测试质量分析器 — 对测试文件进行纯规则维度的质量评估,包含断言密度、边界覆盖、
|
|
4
|
+
* 命名规范性、断言重复和场景覆盖五个检查维度。零 AI 依赖。
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
6
|
+
* 机制 4: 变异测试防造假 — 通过逻辑算符反转和边界值偏移模拟代码变异,
|
|
7
|
+
* 检测现有测试是否能捕捉到变更。若变异后测试依然全绿,判定测试无效。
|
|
8
|
+
*
|
|
9
|
+
* 分析测试文件质量,返回结构化报告,包含各项检查的评分和改进建议。
|
|
10
|
+
* @param testContent - 测试文件内容
|
|
11
|
+
* @param filename - 测试文件名(用于结果标识)
|
|
12
|
+
* @param sourceContent - 可选的被测源码内容(用于变异测试)
|
|
13
|
+
* @returns 测试质量报告,包含总分(0-100)、各项检查结果和改进建议列表
|
|
7
14
|
*/
|
|
8
|
-
export declare function analyzeTestQuality(testContent: string, filename: string): TestQualityReport;
|
|
15
|
+
export declare function analyzeTestQuality(testContent: string, filename: string, sourceContent?: string): TestQualityReport;
|
|
9
16
|
//# sourceMappingURL=test_quality.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test_quality.d.ts","sourceRoot":"","sources":["../../src/engine/test_quality.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEvE
|
|
1
|
+
{"version":3,"file":"test_quality.d.ts","sourceRoot":"","sources":["../../src/engine/test_quality.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEvE;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,iBAAiB,CAqEnB"}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 测试质量分析器 — 对测试文件进行纯规则维度的质量评估,包含断言密度、边界覆盖、
|
|
3
|
+
* 命名规范性、断言重复和场景覆盖五个检查维度。零 AI 依赖。
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
5
|
+
* 机制 4: 变异测试防造假 — 通过逻辑算符反转和边界值偏移模拟代码变异,
|
|
6
|
+
* 检测现有测试是否能捕捉到变更。若变异后测试依然全绿,判定测试无效。
|
|
7
|
+
*
|
|
8
|
+
* 分析测试文件质量,返回结构化报告,包含各项检查的评分和改进建议。
|
|
9
|
+
* @param testContent - 测试文件内容
|
|
10
|
+
* @param filename - 测试文件名(用于结果标识)
|
|
11
|
+
* @param sourceContent - 可选的被测源码内容(用于变异测试)
|
|
12
|
+
* @returns 测试质量报告,包含总分(0-100)、各项检查结果和改进建议列表
|
|
6
13
|
*/
|
|
7
|
-
export function analyzeTestQuality(testContent, filename) {
|
|
14
|
+
export function analyzeTestQuality(testContent, filename, sourceContent) {
|
|
8
15
|
const checks = [];
|
|
9
16
|
const suggestions = [];
|
|
10
17
|
// ── 1. assertion_density ──
|
|
@@ -34,11 +41,29 @@ export function analyzeTestQuality(testContent, filename) {
|
|
|
34
41
|
// ── 5. scenario_coverage ──
|
|
35
42
|
const scenarioCheck = checkScenarioCoverage();
|
|
36
43
|
checks.push(scenarioCheck);
|
|
44
|
+
// ── 6. mutation_audit (机制 4: 变异测试防造假) ──
|
|
45
|
+
if (sourceContent) {
|
|
46
|
+
const mutationCheck = checkMutationResistance(testContent, sourceContent);
|
|
47
|
+
checks.push(mutationCheck);
|
|
48
|
+
if (!mutationCheck.passed) {
|
|
49
|
+
suggestions.push("测试可能存在'自己证明自己'问题:变异后断言仍能通过。建议增加反向用例和精确断言");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// 无源码时跳过变异测试,不扣分
|
|
54
|
+
checks.push({
|
|
55
|
+
dimension: "scenario_coverage",
|
|
56
|
+
passed: true,
|
|
57
|
+
detail: "变异测试跳过(未提供被测源码)",
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
// 评分计算: 满分 100,每项未通过的检查扣 16.7 分(6 项),最低 0 分
|
|
37
61
|
// ── Score calculation ──
|
|
38
62
|
let score = 100;
|
|
63
|
+
const deduction = Math.floor(100 / checks.length);
|
|
39
64
|
for (const check of checks) {
|
|
40
65
|
if (!check.passed) {
|
|
41
|
-
score -=
|
|
66
|
+
score -= deduction;
|
|
42
67
|
}
|
|
43
68
|
}
|
|
44
69
|
score = Math.max(0, score);
|
|
@@ -52,8 +77,9 @@ export function analyzeTestQuality(testContent, filename) {
|
|
|
52
77
|
// ────────────────────────────────────────────
|
|
53
78
|
// Check implementations
|
|
54
79
|
// ────────────────────────────────────────────
|
|
80
|
+
/** 断言密度检查 — 统计测试函数数与断言数的比率,阈值 >= 1.0(每个测试至少一个断言) */
|
|
55
81
|
function checkAssertionDensity(content) {
|
|
56
|
-
//
|
|
82
|
+
// 匹配 it/test/@Test 函数调用,统计测试函数总数
|
|
57
83
|
const testFnMatches = content.match(/\b(it|test|@Test)\s*\(/g) ?? [];
|
|
58
84
|
const testCount = testFnMatches.length;
|
|
59
85
|
if (testCount === 0) {
|
|
@@ -63,9 +89,9 @@ function checkAssertionDensity(content) {
|
|
|
63
89
|
detail: "未检测到测试函数",
|
|
64
90
|
};
|
|
65
91
|
}
|
|
66
|
-
//
|
|
92
|
+
// 匹配 expect/assert/assertEquals/assertEquals/assertThat/assertStrictEquals 调用
|
|
67
93
|
const assertMatches = content.match(/\b(expect|assert|assertEquals|assertThat|assertStrictEquals)\s*\(/g) ?? [];
|
|
68
|
-
//
|
|
94
|
+
// 过滤非断言的 expect 匹配器 (expect.any(), expect.arrayContaining() 等)
|
|
69
95
|
const matcherSuffixes = ["any(", "arrayContaining(", "objectContaining(", "stringContaining(", "stringMatching(", "extend(", "anything(", "closeTo(", "assertions("];
|
|
70
96
|
const assertCount = assertMatches.filter((m) => {
|
|
71
97
|
// For expect( calls, check what follows the opening paren
|
|
@@ -92,19 +118,20 @@ function checkAssertionDensity(content) {
|
|
|
92
118
|
detail: `断言密度不足: ${density.toFixed(1)} (${assertCount} 断言 / ${testCount} 测试, 阈值 >= 1.0)`,
|
|
93
119
|
};
|
|
94
120
|
}
|
|
121
|
+
/** 边界覆盖检查 — 在 expect() 和 it()/test() 代码块内搜索边界值关键字(null/undefined/空值/极值等) */
|
|
95
122
|
function checkBoundaryCoverage(content) {
|
|
96
|
-
//
|
|
97
|
-
//
|
|
123
|
+
// 仅在 expect() 上下文和 it()/test() 代码块内搜索,避免误匹配 URL/端口/import 中的值
|
|
124
|
+
// 提取所有 expect(...) 代码块内容(按括号深度匹配到闭合)
|
|
98
125
|
const expectContexts = [];
|
|
99
126
|
const expectRegex = /\bexpect\s*\(/g;
|
|
100
127
|
let expectMatch;
|
|
101
128
|
while ((expectMatch = expectRegex.exec(content)) !== null) {
|
|
102
|
-
//
|
|
129
|
+
// 跳过非断言匹配器 (expect.any(), expect.arrayContaining() 等)
|
|
103
130
|
const afterOpen = content.slice(expectMatch.index + expectMatch[0].length).trimStart();
|
|
104
131
|
if (/^(any|arrayContaining|objectContaining|stringContaining|stringMatching|extend|anything|closeTo|assertions)\s*\(/.test(afterOpen)) {
|
|
105
132
|
continue;
|
|
106
133
|
}
|
|
107
|
-
//
|
|
134
|
+
// 提取 expect 块内容(按括号深度匹配到对应的闭合括号)
|
|
108
135
|
let depth = 1;
|
|
109
136
|
let pos = expectMatch.index + expectMatch[0].length;
|
|
110
137
|
while (pos < content.length && depth > 0) {
|
|
@@ -143,6 +170,7 @@ function checkBoundaryCoverage(content) {
|
|
|
143
170
|
.split("\n")
|
|
144
171
|
.filter((line) => !line.trim().startsWith("//") && !line.trim().startsWith("*") && !line.trimStart().startsWith("import "));
|
|
145
172
|
const filteredText = filteredLines.join("\n");
|
|
173
|
+
// 边界值关键字列表: null、undefined、空字符串、数字边界、中文描述
|
|
146
174
|
const boundaryKeywords = [
|
|
147
175
|
"null", "undefined", '""', "''", "0",
|
|
148
176
|
"MAX_VALUE", "MIN_VALUE", "MAX_SAFE_INTEGER", "MIN_SAFE_INTEGER",
|
|
@@ -167,6 +195,10 @@ function checkBoundaryCoverage(content) {
|
|
|
167
195
|
detail: "未检测到边界值测试",
|
|
168
196
|
};
|
|
169
197
|
}
|
|
198
|
+
/**
|
|
199
|
+
* 命名规范性检查 — 提取 it()/test() 中的测试名称,检查描述性关键词占比是否 >= 50%。
|
|
200
|
+
* 支持英文关键词(should/when/returns/handles/throws)和中文关键词(应该/当/返回/处理/抛出)。
|
|
201
|
+
*/
|
|
170
202
|
function checkNaming(content) {
|
|
171
203
|
// Extract test names from it("...", test("...", patterns
|
|
172
204
|
const namePattern = /\b(?:it|test)\s*\(\s*["'`]([^"'`]+)["'`]/g;
|
|
@@ -176,13 +208,14 @@ function checkNaming(content) {
|
|
|
176
208
|
names.push(match[1]);
|
|
177
209
|
}
|
|
178
210
|
if (names.length === 0) {
|
|
179
|
-
//
|
|
211
|
+
// 无法提取测试名称(如仅使用 describe)— 中性通过(无法评估)
|
|
180
212
|
return {
|
|
181
213
|
dimension: "naming",
|
|
182
214
|
passed: true,
|
|
183
215
|
detail: "未提取到测试名称 (可能使用 describe-only 模式)",
|
|
184
216
|
};
|
|
185
217
|
}
|
|
218
|
+
// 描述性关键词: 英文 BDD 命名约定和中文命名约定
|
|
186
219
|
const descriptiveKeywords = [
|
|
187
220
|
"should", "when", "returns", "can", "handles", "throws",
|
|
188
221
|
"shouldn't", "must", "will",
|
|
@@ -212,6 +245,7 @@ function checkNaming(content) {
|
|
|
212
245
|
detail: `测试命名不够描述性: ${(ratio * 100).toFixed(0)}% (${descriptiveCount}/${names.length})`,
|
|
213
246
|
};
|
|
214
247
|
}
|
|
248
|
+
/** 断言重复检查 — 提取所有 expect() 语句,计算重复比率,阈值 > 30% 则不通过 */
|
|
215
249
|
function checkDuplication(content) {
|
|
216
250
|
// Extract expect(...) statements (first 120 chars per line to normalize)
|
|
217
251
|
const expectPattern = /\bexpect\s*\([^)]*\)/g;
|
|
@@ -228,7 +262,7 @@ function checkDuplication(content) {
|
|
|
228
262
|
detail: "无断言语句,跳过重复检查",
|
|
229
263
|
};
|
|
230
264
|
}
|
|
231
|
-
//
|
|
265
|
+
// 排序后统计唯一断言数,重复率 = 1 - (唯一数/总数)
|
|
232
266
|
const sorted = [...expectCalls].sort();
|
|
233
267
|
const unique = new Set(sorted);
|
|
234
268
|
const duplicateRatio = 1 - unique.size / sorted.length;
|
|
@@ -246,6 +280,7 @@ function checkDuplication(content) {
|
|
|
246
280
|
detail: `断言重复率: ${(duplicateRatio * 100).toFixed(0)}%`,
|
|
247
281
|
};
|
|
248
282
|
}
|
|
283
|
+
/** 场景覆盖检查 — 占位检查,实际场景覆盖需结合知识模板验收项进行交叉评估 */
|
|
249
284
|
function checkScenarioCoverage() {
|
|
250
285
|
return {
|
|
251
286
|
dimension: "scenario_coverage",
|
|
@@ -253,4 +288,126 @@ function checkScenarioCoverage() {
|
|
|
253
288
|
detail: "需结合知识模板验收项进行交叉检查",
|
|
254
289
|
};
|
|
255
290
|
}
|
|
291
|
+
/** 预定义变异操作集 */
|
|
292
|
+
const MUTATION_OPERATORS = [
|
|
293
|
+
{
|
|
294
|
+
description: "逻辑算符反转 (=== → !==, !== → ===, > → <=, < → >=)",
|
|
295
|
+
mutate: (line) => {
|
|
296
|
+
if (/===/.test(line) && !/!==/.test(line))
|
|
297
|
+
return line.replace(/===/g, "!==");
|
|
298
|
+
if (/!==/.test(line))
|
|
299
|
+
return line.replace(/!==/g, "===");
|
|
300
|
+
if (/>=/.test(line))
|
|
301
|
+
return line.replace(/>=/g, "<");
|
|
302
|
+
if (/<=/.test(line))
|
|
303
|
+
return line.replace(/<=/g, ">");
|
|
304
|
+
if (/>/.test(line) && !/>=/.test(line))
|
|
305
|
+
return line.replace(/>/g, "<=");
|
|
306
|
+
if (/</.test(line) && !/<=/.test(line))
|
|
307
|
+
return line.replace(/</g, ">=");
|
|
308
|
+
return line;
|
|
309
|
+
},
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
description: "边界值偏移 (+1/-1 常量数字)",
|
|
313
|
+
mutate: (line) => {
|
|
314
|
+
return line.replace(/\b(\d+)\b/g, (_, num) => {
|
|
315
|
+
const n = parseInt(num, 10);
|
|
316
|
+
if (n === 0)
|
|
317
|
+
return "1";
|
|
318
|
+
if (n === 1)
|
|
319
|
+
return "0";
|
|
320
|
+
return (n + 1).toString();
|
|
321
|
+
});
|
|
322
|
+
},
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
description: "布尔值反转 (true → false, false → true)",
|
|
326
|
+
mutate: (line) => {
|
|
327
|
+
if (/\btrue\b/.test(line))
|
|
328
|
+
return line.replace(/\btrue\b/g, "false");
|
|
329
|
+
if (/\bfalse\b/.test(line))
|
|
330
|
+
return line.replace(/\bfalse\b/g, "true");
|
|
331
|
+
return line;
|
|
332
|
+
},
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
description: "返回值篡改 (return → return null)",
|
|
336
|
+
mutate: (line) => {
|
|
337
|
+
if (/return\s+/.test(line) && !/return\s+null/.test(line)) {
|
|
338
|
+
return line.replace(/return\s+/, "return null; // ");
|
|
339
|
+
}
|
|
340
|
+
return line;
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
];
|
|
344
|
+
/**
|
|
345
|
+
* 变异测试防造假 — 通过对源码模拟变异,检查测试的断言是否精确到能检测变异。
|
|
346
|
+
* 策略: 从源码中提取含关键逻辑的行,执行变异,检查测试中是否有断言针对这些逻辑的精确值。
|
|
347
|
+
* 若测试只含模糊断言(如 toBeTruthy),判定为可能存在"自己证明自己"问题。
|
|
348
|
+
*/
|
|
349
|
+
function checkMutationResistance(testContent, sourceContent) {
|
|
350
|
+
// 提取源码中的关键逻辑行(含比较运算、返回值、布尔值)
|
|
351
|
+
const keyLines = sourceContent.split("\n").filter((line) => {
|
|
352
|
+
const trimmed = line.trim();
|
|
353
|
+
return trimmed.length > 0
|
|
354
|
+
&& !trimmed.startsWith("//")
|
|
355
|
+
&& !trimmed.startsWith("import ")
|
|
356
|
+
&& !trimmed.startsWith("export ")
|
|
357
|
+
&& (/===|!==|>=|<=|>|<|return|true|false/.test(trimmed));
|
|
358
|
+
});
|
|
359
|
+
if (keyLines.length === 0) {
|
|
360
|
+
return {
|
|
361
|
+
dimension: "scenario_coverage",
|
|
362
|
+
passed: true,
|
|
363
|
+
detail: "无可变异的关键逻辑行,跳过变异测试",
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
// 检查测试中的断言精确度
|
|
367
|
+
const preciseAssertions = testContent.match(/\bexpect\s*\([^)]*\)\s*\.\s*(toBe|toEqual|toStrictEqual|toBeLessThan|toBeGreaterThan|toThrow|toThrowError)/g) ?? [];
|
|
368
|
+
const looseAssertions = testContent.match(/\bexpect\s*\([^)]*\)\s*\.\s*(toBeTruthy|toBeFalsy|toBeDefined|toBeUndefined|toBeDefined)/g) ?? [];
|
|
369
|
+
// 变异可检测性评估: 精确断言/总断言 比率
|
|
370
|
+
const totalAssertions = preciseAssertions.length + looseAssertions.length;
|
|
371
|
+
if (totalAssertions === 0) {
|
|
372
|
+
return {
|
|
373
|
+
dimension: "scenario_coverage",
|
|
374
|
+
passed: false,
|
|
375
|
+
detail: "无断言,无法检测源码变异(变异测试防造假失败)",
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
const precisionRatio = preciseAssertions.length / totalAssertions;
|
|
379
|
+
// 抽样执行变异操作,检查是否有对应检测能力
|
|
380
|
+
let mutationsApplied = 0;
|
|
381
|
+
let mutationsUndetected = 0;
|
|
382
|
+
for (const keyLine of keyLines.slice(0, 5)) {
|
|
383
|
+
for (const mut of MUTATION_OPERATORS) {
|
|
384
|
+
const mutated = mut.mutate(keyLine);
|
|
385
|
+
if (mutated !== keyLine) {
|
|
386
|
+
mutationsApplied++;
|
|
387
|
+
// 简化检测: 如果测试中存在针对被变异值的精确断言,认为可检测
|
|
388
|
+
const mutatedValues = mutated.match(/(!==|===|<=|>=|>|<|\b\d+\b|true|false)/g) ?? [];
|
|
389
|
+
const hasDetection = mutatedValues.some((v) => testContent.includes(v));
|
|
390
|
+
if (!hasDetection) {
|
|
391
|
+
mutationsUndetected++;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// 综合评估: 精确断言率 > 50% 且 不可检测变异 < 50%
|
|
397
|
+
const passThreshold = 0.5;
|
|
398
|
+
const precisionOk = precisionRatio >= passThreshold;
|
|
399
|
+
const detectionOk = mutationsApplied === 0 || (mutationsUndetected / mutationsApplied) < passThreshold;
|
|
400
|
+
if (precisionOk && detectionOk) {
|
|
401
|
+
return {
|
|
402
|
+
dimension: "scenario_coverage",
|
|
403
|
+
passed: true,
|
|
404
|
+
detail: `变异测试通过 — 精确断言率 ${(precisionRatio * 100).toFixed(0)}%,${mutationsApplied} 次变异中 ${mutationsApplied - mutationsUndetected} 次可检测`,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
return {
|
|
408
|
+
dimension: "scenario_coverage",
|
|
409
|
+
passed: false,
|
|
410
|
+
detail: `变异测试未通过 — 精确断言率 ${(precisionRatio * 100).toFixed(0)}%(阈值 50%),${mutationsApplied} 次变异中 ${mutationsUndetected} 次不可检测。测试可能存在"自己证明自己"问题`,
|
|
411
|
+
};
|
|
412
|
+
}
|
|
256
413
|
//# sourceMappingURL=test_quality.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test_quality.js","sourceRoot":"","sources":["../../src/engine/test_quality.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"test_quality.js","sourceRoot":"","sources":["../../src/engine/test_quality.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,QAAgB,EAChB,aAAsB;IAEtB,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,6BAA6B;IAC7B,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACjE,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACnC,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC;QAClC,WAAW,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACxD,CAAC;IAED,6BAA6B;IAC7B,MAAM,aAAa,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACzD,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3B,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QAC1B,WAAW,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAC5D,CAAC;IAED,kBAAkB;IAClB,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACxB,WAAW,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAC1E,CAAC;IAED,uBAAuB;IACvB,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9B,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC3C,CAAC;IAED,6BAA6B;IAC7B,MAAM,aAAa,GAAG,qBAAqB,EAAE,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAE3B,0CAA0C;IAC1C,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,aAAa,GAAG,uBAAuB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC1E,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3B,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YAC1B,WAAW,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,iBAAiB;QACjB,MAAM,CAAC,IAAI,CAAC;YACV,SAAS,EAAE,mBAAmB;YAC9B,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,iBAAiB;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,4CAA4C;IAC5C,0BAA0B;IAC1B,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAClB,KAAK,IAAI,SAAS,CAAC;QACrB,CAAC;IACH,CAAC;IACD,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAE3B,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK;QACL,MAAM;QACN,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,+CAA+C;AAC/C,wBAAwB;AACxB,+CAA+C;AAE/C,oDAAoD;AACpD,SAAS,qBAAqB,CAAC,OAAe;IAC5C,iCAAiC;IACjC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,IAAI,EAAE,CAAC;IACrE,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC;IAEvC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO;YACL,SAAS,EAAE,mBAAmB;YAC9B,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,UAAU;SACnB,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,IAAI,EAAE,CAAC;IAChH,+DAA+D;IAC/D,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACrK,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7C,0DAA0D;QAC1D,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC7C,IAAI,WAAW,EAAE,CAAC;YAChB,oEAAoE;YACpE,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;YAC5D,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC,MAAM,CAAC;IAEV,MAAM,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;IAExC,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;QACnB,OAAO;YACL,SAAS,EAAE,mBAAmB;YAC9B,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,SAAS,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,WAAW,SAAS,SAAS,MAAM;SAC5E,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,mBAAmB;QAC9B,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,WAAW,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,WAAW,SAAS,SAAS,iBAAiB;KACzF,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,SAAS,qBAAqB,CAAC,OAAe;IAC5C,8DAA8D;IAC9D,qCAAqC;IACrC,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,gBAAgB,CAAC;IACrC,IAAI,WAAmC,CAAC;IACxC,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1D,sDAAsD;QACtD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QACvF,IAAI,iHAAiH,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACtI,SAAS;QACX,CAAC;QACD,iCAAiC;QACjC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,GAAG,GAAG,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACpD,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACzC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG;gBAAE,KAAK,EAAE,CAAC;iBAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG;gBAAE,KAAK,EAAE,CAAC;YACvC,GAAG,EAAE,CAAC;QACR,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,2EAA2E;IAC3E,MAAM,cAAc,GAAG,6DAA6D,CAAC;IACrF,IAAI,SAAiC,CAAC;IACtC,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3D,kDAAkD;QAClD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,GAAG,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAChD,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG;gBAAE,KAAK,EAAE,CAAC;iBAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;gBAAC,KAAK,EAAE,CAAC;gBAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,MAAM;gBAAC,CAAC;YAAC,CAAC;YAC9E,GAAG,EAAE,CAAC;QACR,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEjD,2CAA2C;IAC3C,MAAM,aAAa,GAAG,cAAc;SACjC,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9H,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9C,0CAA0C;IAC1C,MAAM,gBAAgB,GAAG;QACvB,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG;QACpC,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB;QAChE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI;KAC7B,CAAC;IAEF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO;YACL,SAAS,EAAE,mBAAmB;YAC9B,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,aAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACxC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,mBAAmB;QAC9B,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,WAAW;KACpB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,OAAe;IAClC,yDAAyD;IACzD,MAAM,WAAW,GAAG,2CAA2C,CAAC;IAChE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,sCAAsC;QACxC,OAAO;YACL,SAAS,EAAE,QAAQ;YACnB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,kCAAkC;SAC3C,CAAC;IACJ,CAAC;IAED,6BAA6B;IAC7B,MAAM,mBAAmB,GAAG;QAC1B,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ;QACvD,WAAW,EAAE,MAAM,EAAE,MAAM;QAC3B,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;KACxC,CAAC;IAEF,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;YAC1C,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC9C,gBAAgB,EAAE,CAAC;gBACnB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC;IAE9C,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;QACjB,OAAO;YACL,SAAS,EAAE,QAAQ;YACnB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,YAAY,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,gBAAgB,IAAI,KAAK,CAAC,MAAM,GAAG;SACtF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,cAAc,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,gBAAgB,IAAI,KAAK,CAAC,MAAM,GAAG;KACxF,CAAC;AACJ,CAAC;AAED,qDAAqD;AACrD,SAAS,gBAAgB,CAAC,OAAe;IACvC,yEAAyE;IACzE,MAAM,aAAa,GAAG,uBAAuB,CAAC;IAC9C,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACtD,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,oCAAoC;QACpC,OAAO;YACL,SAAS,EAAE,aAAa;YACxB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,cAAc;SACvB,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,MAAM,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;IAEvD,IAAI,cAAc,GAAG,GAAG,EAAE,CAAC;QACzB,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;QACnD,OAAO;YACL,SAAS,EAAE,aAAa;YACxB,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,WAAW,cAAc,IAAI,MAAM,CAAC,MAAM,SAAS,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;SACjG,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,aAAa;QACxB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,UAAU,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;KACvD,CAAC;AACJ,CAAC;AAED,2CAA2C;AAC3C,SAAS,qBAAqB;IAC5B,OAAO;QACL,SAAS,EAAE,mBAAmB;QAC9B,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,kBAAkB;KAC3B,CAAC;AACJ,CAAC;AAYD,eAAe;AACf,MAAM,kBAAkB,GAAe;IACrC;QACE,WAAW,EAAE,+CAA+C;QAC5D,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACf,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9E,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACrD,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACrD,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACxE,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACxE,OAAO,IAAI,CAAC;QACd,CAAC;KACF;IACD;QACE,WAAW,EAAE,oBAAoB;QACjC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACf,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;gBAC3C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC;oBAAE,OAAO,GAAG,CAAC;gBACxB,IAAI,CAAC,KAAK,CAAC;oBAAE,OAAO,GAAG,CAAC;gBACxB,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,WAAW,EAAE,oCAAoC;QACjD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACf,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACrE,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YACtE,OAAO,IAAI,CAAC;QACd,CAAC;KACF;IACD;QACE,WAAW,EAAE,8BAA8B;QAC3C,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACf,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;YACvD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF;CACF,CAAC;AAEF;;;;GAIG;AACH,SAAS,uBAAuB,CAC9B,WAAmB,EACnB,aAAqB;IAErB,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC;eACpB,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;eACzB,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;eAC9B,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;eAC9B,CAAC,qCAAqC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,SAAS,EAAE,mBAAmB;YAC9B,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,mBAAmB;SAC5B,CAAC;IACJ,CAAC;IAED,cAAc;IACd,MAAM,iBAAiB,GAAG,WAAW,CAAC,KAAK,CAAC,6GAA6G,CAAC,IAAI,EAAE,CAAC;IACjK,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,CAAC,2FAA2F,CAAC,IAAI,EAAE,CAAC;IAE7I,wBAAwB;IACxB,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;IAC1E,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,SAAS,EAAE,mBAAmB;YAC9B,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,yBAAyB;SAClC,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,GAAG,eAAe,CAAC;IAElE,uBAAuB;IACvB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAE5B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxB,gBAAgB,EAAE,CAAC;gBACnB,iCAAiC;gBACjC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,IAAI,EAAE,CAAC;gBACrF,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxE,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,mBAAmB,EAAE,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,MAAM,aAAa,GAAG,GAAG,CAAC;IAC1B,MAAM,WAAW,GAAG,cAAc,IAAI,aAAa,CAAC;IACpD,MAAM,WAAW,GAAG,gBAAgB,KAAK,CAAC,IAAI,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,GAAG,aAAa,CAAC;IAEvG,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC/B,OAAO;YACL,SAAS,EAAE,mBAAmB;YAC9B,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,kBAAkB,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,gBAAgB,SAAS,gBAAgB,GAAG,mBAAmB,OAAO;SACvI,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,mBAAmB;QAC9B,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,mBAAmB,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,gBAAgB,SAAS,mBAAmB,yBAAyB;KAC/I,CAAC;AACJ,CAAC"}
|