oh-my-claude-sisyphus 3.4.3 → 3.5.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.
- package/README.md +45 -0
- package/dist/__tests__/learner/auto-learner.test.d.ts +7 -0
- package/dist/__tests__/learner/auto-learner.test.d.ts.map +1 -0
- package/dist/__tests__/learner/auto-learner.test.js +507 -0
- package/dist/__tests__/learner/auto-learner.test.js.map +1 -0
- package/dist/__tests__/learner/matcher.test.d.ts +2 -0
- package/dist/__tests__/learner/matcher.test.d.ts.map +1 -0
- package/dist/__tests__/learner/matcher.test.js +330 -0
- package/dist/__tests__/learner/matcher.test.js.map +1 -0
- package/dist/analytics/analytics-summary.d.ts.map +1 -1
- package/dist/analytics/analytics-summary.js +12 -11
- package/dist/analytics/analytics-summary.js.map +1 -1
- package/dist/analytics/backfill-dedup.d.ts.map +1 -1
- package/dist/analytics/backfill-dedup.js +8 -11
- package/dist/analytics/backfill-dedup.js.map +1 -1
- package/dist/analytics/backfill-engine.d.ts.map +1 -1
- package/dist/analytics/backfill-engine.js +12 -3
- package/dist/analytics/backfill-engine.js.map +1 -1
- package/dist/analytics/query-engine.d.ts.map +1 -1
- package/dist/analytics/query-engine.js +3 -2
- package/dist/analytics/query-engine.js.map +1 -1
- package/dist/analytics/token-tracker.d.ts.map +1 -1
- package/dist/analytics/token-tracker.js +22 -27
- package/dist/analytics/token-tracker.js.map +1 -1
- package/dist/analytics/transcript-token-extractor.d.ts +17 -1
- package/dist/analytics/transcript-token-extractor.d.ts.map +1 -1
- package/dist/analytics/transcript-token-extractor.js +66 -19
- package/dist/analytics/transcript-token-extractor.js.map +1 -1
- package/dist/analytics/types.d.ts +13 -0
- package/dist/analytics/types.d.ts.map +1 -1
- package/dist/analytics/types.js.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/hooks/learner/auto-invoke.d.ts +82 -0
- package/dist/hooks/learner/auto-invoke.d.ts.map +1 -0
- package/dist/hooks/learner/auto-invoke.js +234 -0
- package/dist/hooks/learner/auto-invoke.js.map +1 -0
- package/dist/hooks/learner/auto-learner.d.ts +55 -0
- package/dist/hooks/learner/auto-learner.d.ts.map +1 -0
- package/dist/hooks/learner/auto-learner.js +361 -0
- package/dist/hooks/learner/auto-learner.js.map +1 -0
- package/dist/hooks/learner/index.d.ts +3 -0
- package/dist/hooks/learner/index.d.ts.map +1 -1
- package/dist/hooks/learner/index.js +4 -0
- package/dist/hooks/learner/index.js.map +1 -1
- package/dist/hooks/learner/matcher.d.ts +40 -0
- package/dist/hooks/learner/matcher.d.ts.map +1 -0
- package/dist/hooks/learner/matcher.js +230 -0
- package/dist/hooks/learner/matcher.js.map +1 -0
- package/package.json +1 -1
- package/skills/local-skills-setup/SKILL.md +465 -0
- package/skills/skill/SKILL.md +406 -0
package/README.md
CHANGED
|
@@ -135,6 +135,51 @@ Maximum parallelism with Haiku where possible, falling back to Sonnet/Opus for c
|
|
|
135
135
|
|
|
136
136
|
---
|
|
137
137
|
|
|
138
|
+
## Analytics & Cost Tracking (v3.5.0)
|
|
139
|
+
|
|
140
|
+
Track your Claude Code usage across all sessions with automatic transcript analysis.
|
|
141
|
+
|
|
142
|
+
### Backfill Historical Data
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
omc backfill # Analyze all transcripts
|
|
146
|
+
omc backfill --from 2026-01-01 # From specific date
|
|
147
|
+
omc backfill --project "*/myproject/*" # Filter by project
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### View Statistics
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
omc stats # All sessions aggregate
|
|
154
|
+
omc stats --session # Current session only
|
|
155
|
+
omc stats --json # JSON output
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Sample Output:**
|
|
159
|
+
```
|
|
160
|
+
📊 All Sessions Stats
|
|
161
|
+
Sessions: 18
|
|
162
|
+
Entries: 3356
|
|
163
|
+
|
|
164
|
+
💰 Token Usage & Cost
|
|
165
|
+
Total Tokens: 4.36M
|
|
166
|
+
Total Cost: $2620.49
|
|
167
|
+
|
|
168
|
+
🤖 Top Agents by Cost (All Sessions)
|
|
169
|
+
(main session) 700.7k tokens $1546.46
|
|
170
|
+
oh-my-claudecode:architect 1.18M tokens $432.68
|
|
171
|
+
oh-my-claudecode:planner 540.9k tokens $274.85
|
|
172
|
+
oh-my-claudecode:executor 306.9k tokens $77.43
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**Features:**
|
|
176
|
+
- Automatic backfill on first `omc stats` run
|
|
177
|
+
- Global storage in `~/.omc/state/` (cross-project)
|
|
178
|
+
- Proper agent attribution (main session vs spawned agents)
|
|
179
|
+
- Deduplication prevents double-counting
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
138
183
|
## Data Analysis & Research (v3.4.0)
|
|
139
184
|
|
|
140
185
|
### Scientist Agent Tiers
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-learner.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/learner/auto-learner.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Learner Module Tests
|
|
3
|
+
*
|
|
4
|
+
* Comprehensive QA tests for the auto-learner module.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
7
|
+
import { initAutoLearner, recordPattern, extractTriggers, calculateSkillWorthiness, getSuggestedSkills, } from '../../hooks/learner/auto-learner.js';
|
|
8
|
+
describe('Auto-Learner Module', () => {
|
|
9
|
+
// Test Case 1: State Initialization
|
|
10
|
+
describe('1. State Initialization', () => {
|
|
11
|
+
it('initAutoLearner creates correct initial state', () => {
|
|
12
|
+
const state = initAutoLearner('test-session-123');
|
|
13
|
+
expect(state).toBeDefined();
|
|
14
|
+
expect(state.sessionId).toBe('test-session-123');
|
|
15
|
+
expect(state.patterns).toBeInstanceOf(Map);
|
|
16
|
+
expect(state.suggestedSkills).toBeInstanceOf(Array);
|
|
17
|
+
});
|
|
18
|
+
it('verifies empty patterns map', () => {
|
|
19
|
+
const state = initAutoLearner('test-session');
|
|
20
|
+
expect(state.patterns.size).toBe(0);
|
|
21
|
+
});
|
|
22
|
+
it('verifies empty suggestedSkills array', () => {
|
|
23
|
+
const state = initAutoLearner('test-session');
|
|
24
|
+
expect(state.suggestedSkills).toHaveLength(0);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
// Test Case 2: Pattern Recording
|
|
28
|
+
describe('2. Pattern Recording', () => {
|
|
29
|
+
let state;
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
state = initAutoLearner('test-session');
|
|
32
|
+
});
|
|
33
|
+
it('recordPattern records a valid problem-solution pair', () => {
|
|
34
|
+
const problem = 'TypeError: Cannot read properties of undefined when accessing user.name';
|
|
35
|
+
const solution = 'Check if user object exists before accessing properties. Use optional chaining: user?.name';
|
|
36
|
+
const pattern = recordPattern(state, problem, solution);
|
|
37
|
+
expect(pattern).not.toBeNull();
|
|
38
|
+
expect(pattern.problem).toBe(problem);
|
|
39
|
+
expect(pattern.solution).toBe(solution);
|
|
40
|
+
expect(pattern.occurrences).toBe(1);
|
|
41
|
+
});
|
|
42
|
+
it('content hashing provides deduplication', () => {
|
|
43
|
+
const problem = 'Error: Module not found';
|
|
44
|
+
const solution = 'Install the missing dependency with npm install package-name';
|
|
45
|
+
// Record same pattern twice
|
|
46
|
+
const pattern1 = recordPattern(state, problem, solution);
|
|
47
|
+
const pattern2 = recordPattern(state, problem, solution);
|
|
48
|
+
// Should be the same pattern
|
|
49
|
+
expect(pattern1.id).toBe(pattern2.id);
|
|
50
|
+
// Should only have one entry in the map
|
|
51
|
+
expect(state.patterns.size).toBe(1);
|
|
52
|
+
});
|
|
53
|
+
it('occurrence counting increments on duplicate patterns', () => {
|
|
54
|
+
const problem = 'Error: ENOENT: no such file or directory';
|
|
55
|
+
const solution = 'The file path is incorrect. Verify the path exists or create the directory first.';
|
|
56
|
+
recordPattern(state, problem, solution);
|
|
57
|
+
const pattern = recordPattern(state, problem, solution);
|
|
58
|
+
expect(pattern.occurrences).toBe(2);
|
|
59
|
+
});
|
|
60
|
+
it('records multiple different patterns separately', () => {
|
|
61
|
+
recordPattern(state, 'Error: Module not found react', 'Install react with: npm install react');
|
|
62
|
+
recordPattern(state, 'TypeError: undefined is not a function', 'Check if the function exists before calling it');
|
|
63
|
+
expect(state.patterns.size).toBe(2);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
// Test Case 3: Trigger Extraction
|
|
67
|
+
describe('3. Trigger Extraction', () => {
|
|
68
|
+
it('extractTriggers extracts error messages', () => {
|
|
69
|
+
const problem = 'Got this error: TypeError: Cannot read properties of undefined';
|
|
70
|
+
const solution = 'Check for null/undefined values';
|
|
71
|
+
const triggers = extractTriggers(problem, solution);
|
|
72
|
+
expect(triggers.some(t => t.toLowerCase().includes('cannot read'))).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
it('extractTriggers extracts file paths', () => {
|
|
75
|
+
const problem = 'Issue in src/components/Button.tsx when rendering';
|
|
76
|
+
const solution = 'Fixed the import path in the component';
|
|
77
|
+
const triggers = extractTriggers(problem, solution);
|
|
78
|
+
expect(triggers.some(t => t.includes('Button.tsx'))).toBe(true);
|
|
79
|
+
});
|
|
80
|
+
it('extractTriggers extracts technical terms', () => {
|
|
81
|
+
const problem = 'The React component does not render properly in TypeScript';
|
|
82
|
+
const solution = 'Add proper type annotations for the props interface';
|
|
83
|
+
const triggers = extractTriggers(problem, solution);
|
|
84
|
+
// Should extract capitalized terms like React or TypeScript
|
|
85
|
+
const hasReact = triggers.some(t => t.toLowerCase() === 'react');
|
|
86
|
+
const hasTypeScript = triggers.some(t => t.toLowerCase() === 'typescript');
|
|
87
|
+
expect(hasReact || hasTypeScript).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
it('extracts high-value keywords when present', () => {
|
|
90
|
+
const problem = 'The application crashed with an error';
|
|
91
|
+
const solution = 'Fixed the bug by adding null checks';
|
|
92
|
+
const triggers = extractTriggers(problem, solution);
|
|
93
|
+
// Should include high-value keywords
|
|
94
|
+
expect(triggers.some(t => ['error', 'crash', 'fix', 'bug'].includes(t.toLowerCase()))).toBe(true);
|
|
95
|
+
});
|
|
96
|
+
it('limits triggers to maximum of 10', () => {
|
|
97
|
+
const problem = `
|
|
98
|
+
Error: Module 'react' not found in /src/components/App.tsx
|
|
99
|
+
Also found TypeError in /src/utils/helper.ts
|
|
100
|
+
SyntaxError: Unexpected token in /src/config/settings.js
|
|
101
|
+
ReferenceError: variable is not defined
|
|
102
|
+
`;
|
|
103
|
+
const solution = `
|
|
104
|
+
Fixed multiple issues in React, TypeScript, JavaScript, Vue, Angular
|
|
105
|
+
Updated Node.js configuration and Python scripts
|
|
106
|
+
Resolved Rust and Go compilation errors
|
|
107
|
+
`;
|
|
108
|
+
const triggers = extractTriggers(problem, solution);
|
|
109
|
+
expect(triggers.length).toBeLessThanOrEqual(10);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
// Test Case 4: Skill Worthiness Scoring
|
|
113
|
+
describe('4. Skill Worthiness Scoring', () => {
|
|
114
|
+
it('calculateSkillWorthiness returns score in valid range', () => {
|
|
115
|
+
const pattern = {
|
|
116
|
+
id: 'test-1',
|
|
117
|
+
problem: 'Error: Cannot connect to database',
|
|
118
|
+
solution: 'Check database connection string and ensure the server is running',
|
|
119
|
+
confidence: 0,
|
|
120
|
+
occurrences: 1,
|
|
121
|
+
firstSeen: Date.now(),
|
|
122
|
+
lastSeen: Date.now(),
|
|
123
|
+
suggestedTriggers: ['error', 'database'],
|
|
124
|
+
suggestedTags: ['debugging'],
|
|
125
|
+
};
|
|
126
|
+
const score = calculateSkillWorthiness(pattern);
|
|
127
|
+
expect(score).toBeGreaterThanOrEqual(0);
|
|
128
|
+
expect(score).toBeLessThanOrEqual(100);
|
|
129
|
+
});
|
|
130
|
+
it('high-value keywords boost the score', () => {
|
|
131
|
+
const basePattern = {
|
|
132
|
+
id: 'test-base',
|
|
133
|
+
problem: 'Issue with the component rendering',
|
|
134
|
+
solution: 'Updated the state management logic in the component to properly handle updates',
|
|
135
|
+
confidence: 0,
|
|
136
|
+
occurrences: 1,
|
|
137
|
+
firstSeen: Date.now(),
|
|
138
|
+
lastSeen: Date.now(),
|
|
139
|
+
suggestedTriggers: ['component'],
|
|
140
|
+
suggestedTags: [],
|
|
141
|
+
};
|
|
142
|
+
const boostedPattern = {
|
|
143
|
+
id: 'test-boosted',
|
|
144
|
+
problem: 'Error: Crash when component renders, bug in state',
|
|
145
|
+
solution: 'Fixed the bug by adding proper error handling. The workaround was to use a try-catch block.',
|
|
146
|
+
confidence: 0,
|
|
147
|
+
occurrences: 1,
|
|
148
|
+
firstSeen: Date.now(),
|
|
149
|
+
lastSeen: Date.now(),
|
|
150
|
+
suggestedTriggers: ['error', 'crash', 'fix', 'bug', 'workaround'],
|
|
151
|
+
suggestedTags: ['debugging'],
|
|
152
|
+
};
|
|
153
|
+
const baseScore = calculateSkillWorthiness(basePattern);
|
|
154
|
+
const boostedScore = calculateSkillWorthiness(boostedPattern);
|
|
155
|
+
expect(boostedScore).toBeGreaterThan(baseScore);
|
|
156
|
+
});
|
|
157
|
+
it('generic patterns receive penalties', () => {
|
|
158
|
+
const specificPattern = {
|
|
159
|
+
id: 'test-specific',
|
|
160
|
+
problem: 'Error: ECONNREFUSED when connecting to localhost:5432 in /src/db/connection.ts',
|
|
161
|
+
solution: 'The PostgreSQL server was not running. Start it with: sudo systemctl start postgresql',
|
|
162
|
+
confidence: 0,
|
|
163
|
+
occurrences: 1,
|
|
164
|
+
firstSeen: Date.now(),
|
|
165
|
+
lastSeen: Date.now(),
|
|
166
|
+
suggestedTriggers: ['error', 'postgresql', 'connection.ts'],
|
|
167
|
+
suggestedTags: ['database'],
|
|
168
|
+
};
|
|
169
|
+
const genericPattern = {
|
|
170
|
+
id: 'test-generic',
|
|
171
|
+
problem: 'Something is not working correctly in the app',
|
|
172
|
+
solution: 'Try again after restarting. Check the docs and google it if problem persists. Look at the error message.',
|
|
173
|
+
confidence: 0,
|
|
174
|
+
occurrences: 1,
|
|
175
|
+
firstSeen: Date.now(),
|
|
176
|
+
lastSeen: Date.now(),
|
|
177
|
+
suggestedTriggers: [],
|
|
178
|
+
suggestedTags: [],
|
|
179
|
+
};
|
|
180
|
+
const specificScore = calculateSkillWorthiness(specificPattern);
|
|
181
|
+
const genericScore = calculateSkillWorthiness(genericPattern);
|
|
182
|
+
expect(specificScore).toBeGreaterThan(genericScore);
|
|
183
|
+
});
|
|
184
|
+
it('multiple occurrences boost the score', () => {
|
|
185
|
+
const singleOccurrence = {
|
|
186
|
+
id: 'test-single',
|
|
187
|
+
problem: 'Error: Port 3000 already in use',
|
|
188
|
+
solution: 'Kill the process using the port: lsof -ti:3000 | xargs kill -9',
|
|
189
|
+
confidence: 0,
|
|
190
|
+
occurrences: 1,
|
|
191
|
+
firstSeen: Date.now(),
|
|
192
|
+
lastSeen: Date.now(),
|
|
193
|
+
suggestedTriggers: ['error', 'port'],
|
|
194
|
+
suggestedTags: [],
|
|
195
|
+
};
|
|
196
|
+
const multipleOccurrences = {
|
|
197
|
+
...singleOccurrence,
|
|
198
|
+
id: 'test-multiple',
|
|
199
|
+
occurrences: 5,
|
|
200
|
+
};
|
|
201
|
+
const singleScore = calculateSkillWorthiness(singleOccurrence);
|
|
202
|
+
const multipleScore = calculateSkillWorthiness(multipleOccurrences);
|
|
203
|
+
expect(multipleScore).toBeGreaterThan(singleScore);
|
|
204
|
+
});
|
|
205
|
+
it('longer solutions score higher than very short ones', () => {
|
|
206
|
+
const shortSolution = {
|
|
207
|
+
id: 'test-short',
|
|
208
|
+
problem: 'Error in the application configuration',
|
|
209
|
+
solution: 'Fixed the config file settings.',
|
|
210
|
+
confidence: 0,
|
|
211
|
+
occurrences: 1,
|
|
212
|
+
firstSeen: Date.now(),
|
|
213
|
+
lastSeen: Date.now(),
|
|
214
|
+
suggestedTriggers: ['error'],
|
|
215
|
+
suggestedTags: [],
|
|
216
|
+
};
|
|
217
|
+
const detailedSolution = {
|
|
218
|
+
id: 'test-detailed',
|
|
219
|
+
problem: 'Error in the application configuration loading',
|
|
220
|
+
solution: `The configuration file was missing the required DATABASE_URL environment variable.
|
|
221
|
+
To fix this, add DATABASE_URL=postgresql://user:pass@localhost:5432/dbname to your .env file.
|
|
222
|
+
Also ensure the .env file is in the project root and not gitignored accidentally.
|
|
223
|
+
You can verify with: node -e "console.log(process.env.DATABASE_URL)"`,
|
|
224
|
+
confidence: 0,
|
|
225
|
+
occurrences: 1,
|
|
226
|
+
firstSeen: Date.now(),
|
|
227
|
+
lastSeen: Date.now(),
|
|
228
|
+
suggestedTriggers: ['error', 'configuration'],
|
|
229
|
+
suggestedTags: [],
|
|
230
|
+
};
|
|
231
|
+
const shortScore = calculateSkillWorthiness(shortSolution);
|
|
232
|
+
const detailedScore = calculateSkillWorthiness(detailedSolution);
|
|
233
|
+
expect(detailedScore).toBeGreaterThan(shortScore);
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
// Test Case 5: Suggestion Threshold
|
|
237
|
+
describe('5. Suggestion Threshold', () => {
|
|
238
|
+
let state;
|
|
239
|
+
beforeEach(() => {
|
|
240
|
+
state = initAutoLearner('test-session');
|
|
241
|
+
});
|
|
242
|
+
it('getSuggestedSkills filters by threshold', () => {
|
|
243
|
+
// Add a high-quality pattern that should be suggested
|
|
244
|
+
const highQualityProblem = 'Error: ENOENT no such file /src/config/database.ts when loading config';
|
|
245
|
+
const highQualitySolution = `
|
|
246
|
+
The database configuration file was missing. Fixed by:
|
|
247
|
+
1. Creating the missing config file
|
|
248
|
+
2. Adding proper TypeScript types for the config
|
|
249
|
+
3. Setting up environment variable fallbacks
|
|
250
|
+
This resolved the ENOENT error and made the app work properly.
|
|
251
|
+
`;
|
|
252
|
+
// Record it multiple times to boost occurrences
|
|
253
|
+
recordPattern(state, highQualityProblem, highQualitySolution);
|
|
254
|
+
recordPattern(state, highQualityProblem, highQualitySolution);
|
|
255
|
+
recordPattern(state, highQualityProblem, highQualitySolution);
|
|
256
|
+
// Add a low-quality pattern that shouldn't be suggested
|
|
257
|
+
const lowQualityProblem = 'Problem with app';
|
|
258
|
+
const lowQualitySolution = 'Try again or restart';
|
|
259
|
+
recordPattern(state, lowQualityProblem, lowQualitySolution);
|
|
260
|
+
const suggestions = getSuggestedSkills(state, 70);
|
|
261
|
+
// Only high-quality patterns should pass the threshold
|
|
262
|
+
expect(suggestions.every(s => s.confidence >= 70)).toBe(true);
|
|
263
|
+
});
|
|
264
|
+
it('verifies default threshold of 70', () => {
|
|
265
|
+
// Create a pattern that should be around the threshold
|
|
266
|
+
const problem = 'Error: Module react not found in /src/App.tsx';
|
|
267
|
+
const solution = 'Install the missing dependency: npm install react. The fix resolved the import error in the component.';
|
|
268
|
+
// Record multiple times to boost score
|
|
269
|
+
for (let i = 0; i < 3; i++) {
|
|
270
|
+
recordPattern(state, problem, solution);
|
|
271
|
+
}
|
|
272
|
+
// Get suggestions with default threshold (70)
|
|
273
|
+
const suggestions = getSuggestedSkills(state);
|
|
274
|
+
// All returned suggestions should meet the default threshold
|
|
275
|
+
suggestions.forEach(s => {
|
|
276
|
+
expect(s.confidence).toBeGreaterThanOrEqual(70);
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
it('higher threshold returns fewer suggestions', () => {
|
|
280
|
+
// Add multiple patterns with varying quality
|
|
281
|
+
const patterns = [
|
|
282
|
+
{
|
|
283
|
+
problem: 'Error: ENOENT crash reading /src/db/config.ts - bug in loader',
|
|
284
|
+
solution: 'Fixed the bug by creating the missing configuration file. Added workaround for path resolution. The solution involved proper error handling.',
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
problem: 'Error: Connection failed to database server',
|
|
288
|
+
solution: 'Verified the database server was running and fixed the connection string configuration.',
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
problem: 'Warning: Component missing key prop',
|
|
292
|
+
solution: 'Added unique key prop to list items in the React component.',
|
|
293
|
+
},
|
|
294
|
+
];
|
|
295
|
+
patterns.forEach(p => {
|
|
296
|
+
recordPattern(state, p.problem, p.solution);
|
|
297
|
+
recordPattern(state, p.problem, p.solution); // Record twice for boost
|
|
298
|
+
});
|
|
299
|
+
const lowThresholdSuggestions = getSuggestedSkills(state, 50);
|
|
300
|
+
const highThresholdSuggestions = getSuggestedSkills(state, 90);
|
|
301
|
+
expect(lowThresholdSuggestions.length).toBeGreaterThanOrEqual(highThresholdSuggestions.length);
|
|
302
|
+
});
|
|
303
|
+
it('returns suggestions sorted by confidence descending', () => {
|
|
304
|
+
// Add patterns with varying quality
|
|
305
|
+
const patterns = [
|
|
306
|
+
{
|
|
307
|
+
problem: 'Error: ENOENT no such file in /src/config.ts - crash',
|
|
308
|
+
solution: 'Fixed by creating missing file and adding proper error handling. The bug was in the loader module.',
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
problem: 'TypeError: Cannot read property of undefined in component',
|
|
312
|
+
solution: 'Added null checks before accessing properties.',
|
|
313
|
+
},
|
|
314
|
+
];
|
|
315
|
+
patterns.forEach(p => {
|
|
316
|
+
for (let i = 0; i < 3; i++) {
|
|
317
|
+
recordPattern(state, p.problem, p.solution);
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
const suggestions = getSuggestedSkills(state, 0); // Low threshold to get all
|
|
321
|
+
// Verify sorted by confidence descending
|
|
322
|
+
for (let i = 1; i < suggestions.length; i++) {
|
|
323
|
+
expect(suggestions[i - 1].confidence).toBeGreaterThanOrEqual(suggestions[i].confidence);
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
// Test Case 6: Edge Cases
|
|
328
|
+
describe('6. Edge Cases', () => {
|
|
329
|
+
let state;
|
|
330
|
+
beforeEach(() => {
|
|
331
|
+
state = initAutoLearner('test-session');
|
|
332
|
+
});
|
|
333
|
+
it('handles empty problem string', () => {
|
|
334
|
+
const result = recordPattern(state, '', 'Some solution text here for testing');
|
|
335
|
+
expect(result).toBeNull();
|
|
336
|
+
});
|
|
337
|
+
it('handles empty solution string', () => {
|
|
338
|
+
const result = recordPattern(state, 'Error: Some problem occurred', '');
|
|
339
|
+
expect(result).toBeNull();
|
|
340
|
+
});
|
|
341
|
+
it('handles both empty problem and solution', () => {
|
|
342
|
+
const result = recordPattern(state, '', '');
|
|
343
|
+
expect(result).toBeNull();
|
|
344
|
+
});
|
|
345
|
+
it('handles very short content (below minimum)', () => {
|
|
346
|
+
const result = recordPattern(state, 'Short', 'Also short');
|
|
347
|
+
expect(result).toBeNull();
|
|
348
|
+
});
|
|
349
|
+
it('handles whitespace-only input', () => {
|
|
350
|
+
const result = recordPattern(state, ' \n\t ', ' \n\t ');
|
|
351
|
+
expect(result).toBeNull();
|
|
352
|
+
});
|
|
353
|
+
it('extracts no triggers from generic text', () => {
|
|
354
|
+
const triggers = extractTriggers('something happened', 'did something to fix it');
|
|
355
|
+
// May still extract some keywords but should be minimal
|
|
356
|
+
expect(triggers.length).toBeLessThanOrEqual(10);
|
|
357
|
+
});
|
|
358
|
+
it('handles null/undefined gracefully in recordPattern', () => {
|
|
359
|
+
// TypeScript would normally prevent this, but test runtime behavior
|
|
360
|
+
const result1 = recordPattern(state, null, 'solution');
|
|
361
|
+
const result2 = recordPattern(state, 'problem', undefined);
|
|
362
|
+
expect(result1).toBeNull();
|
|
363
|
+
expect(result2).toBeNull();
|
|
364
|
+
});
|
|
365
|
+
it('handles special characters in problem/solution', () => {
|
|
366
|
+
const problem = 'Error: Path contains special chars: /path/to/file<>:"|?*.ts';
|
|
367
|
+
const solution = 'Escape or remove special characters: path.replace(/[<>:"|?*]/g, "_")';
|
|
368
|
+
const pattern = recordPattern(state, problem, solution);
|
|
369
|
+
expect(pattern).not.toBeNull();
|
|
370
|
+
expect(pattern.problem).toContain('special chars');
|
|
371
|
+
});
|
|
372
|
+
it('handles Unicode content', () => {
|
|
373
|
+
const problem = 'Error: 文件未找到 - File not found in 日本語パス/コンポーネント.tsx';
|
|
374
|
+
const solution = 'The file path contained CJK characters. Fixed by using proper encoding.';
|
|
375
|
+
const pattern = recordPattern(state, problem, solution);
|
|
376
|
+
expect(pattern).not.toBeNull();
|
|
377
|
+
});
|
|
378
|
+
it('handles extremely long content', () => {
|
|
379
|
+
const longProblem = 'Error: ' + 'A'.repeat(5000);
|
|
380
|
+
const longSolution = 'Fix: ' + 'B'.repeat(5000);
|
|
381
|
+
const pattern = recordPattern(state, longProblem, longSolution);
|
|
382
|
+
expect(pattern).not.toBeNull();
|
|
383
|
+
expect(pattern.id).toBeDefined();
|
|
384
|
+
});
|
|
385
|
+
it('pattern with no extractable triggers gets penalty', () => {
|
|
386
|
+
const pattern = {
|
|
387
|
+
id: 'test-no-triggers',
|
|
388
|
+
problem: 'Something went wrong somewhere.',
|
|
389
|
+
solution: 'Did some things to make it better.',
|
|
390
|
+
confidence: 0,
|
|
391
|
+
occurrences: 1,
|
|
392
|
+
firstSeen: Date.now(),
|
|
393
|
+
lastSeen: Date.now(),
|
|
394
|
+
suggestedTriggers: [], // No triggers
|
|
395
|
+
suggestedTags: [],
|
|
396
|
+
};
|
|
397
|
+
const score = calculateSkillWorthiness(pattern);
|
|
398
|
+
// Should have penalty for missing triggers (base 50 - 25 penalty - 20 short content = ~5)
|
|
399
|
+
expect(score).toBeLessThan(50);
|
|
400
|
+
});
|
|
401
|
+
});
|
|
402
|
+
// Test Case 7: Integration - Full Workflow
|
|
403
|
+
describe('7. Integration - Full Workflow', () => {
|
|
404
|
+
it('complete workflow from init to suggestions', () => {
|
|
405
|
+
// Initialize
|
|
406
|
+
const state = initAutoLearner('integration-test-session');
|
|
407
|
+
expect(state.patterns.size).toBe(0);
|
|
408
|
+
// Record high-quality pattern multiple times
|
|
409
|
+
const problem = 'Error: ECONNREFUSED connecting to localhost:5432 in /src/db/client.ts';
|
|
410
|
+
const solution = `
|
|
411
|
+
The PostgreSQL database server was not running. Fixed by:
|
|
412
|
+
1. Starting the database: sudo systemctl start postgresql
|
|
413
|
+
2. Verifying connection: psql -U postgres -c "SELECT 1"
|
|
414
|
+
3. Updated connection retry logic in the application
|
|
415
|
+
This error commonly occurs after system restart.
|
|
416
|
+
`;
|
|
417
|
+
recordPattern(state, problem, solution);
|
|
418
|
+
expect(state.patterns.size).toBe(1);
|
|
419
|
+
recordPattern(state, problem, solution);
|
|
420
|
+
const pattern = Array.from(state.patterns.values())[0];
|
|
421
|
+
expect(pattern.occurrences).toBe(2);
|
|
422
|
+
// Get suggestions
|
|
423
|
+
const suggestions = getSuggestedSkills(state, 60);
|
|
424
|
+
// Should have at least one suggestion if quality is high enough
|
|
425
|
+
if (suggestions.length > 0) {
|
|
426
|
+
expect(suggestions[0].problem).toBe(problem.trim());
|
|
427
|
+
expect(suggestions[0].suggestedTriggers.length).toBeGreaterThan(0);
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
});
|
|
432
|
+
// Additional Security Tests
|
|
433
|
+
describe('Security Tests', () => {
|
|
434
|
+
let state;
|
|
435
|
+
beforeEach(() => {
|
|
436
|
+
state = initAutoLearner('security-test');
|
|
437
|
+
});
|
|
438
|
+
it('does not expose hash internals in pattern ID', () => {
|
|
439
|
+
const pattern = recordPattern(state, 'Error: sensitive database password issue in /etc/passwd', 'Fixed by updating the credentials in the config file');
|
|
440
|
+
// Pattern ID should be a truncated hash, not exposing content
|
|
441
|
+
expect(pattern.id.length).toBe(16); // SHA-256 truncated to 16 hex chars
|
|
442
|
+
expect(pattern.id).not.toContain('password');
|
|
443
|
+
expect(pattern.id).not.toContain('passwd');
|
|
444
|
+
});
|
|
445
|
+
it('handles injection-like content safely', () => {
|
|
446
|
+
const problem = 'Error: SQL injection detected: \'; DROP TABLE users; --';
|
|
447
|
+
const solution = 'Use parameterized queries: db.query("SELECT * FROM users WHERE id = $1", [userId])';
|
|
448
|
+
const pattern = recordPattern(state, problem, solution);
|
|
449
|
+
expect(pattern).not.toBeNull();
|
|
450
|
+
// Content is stored as-is (not evaluated), which is safe for a data structure
|
|
451
|
+
expect(pattern.problem).toContain('DROP TABLE');
|
|
452
|
+
});
|
|
453
|
+
it('handles path traversal strings safely', () => {
|
|
454
|
+
const problem = 'Error reading file: ../../../etc/shadow';
|
|
455
|
+
const solution = 'Validate and sanitize file paths before reading';
|
|
456
|
+
const pattern = recordPattern(state, problem, solution);
|
|
457
|
+
// Pattern is stored, not executed
|
|
458
|
+
expect(pattern).not.toBeNull();
|
|
459
|
+
expect(pattern.problem).toContain('../../../etc/shadow');
|
|
460
|
+
});
|
|
461
|
+
it('handles prototype pollution attempt in content', () => {
|
|
462
|
+
const problem = 'Error: __proto__.polluted = true causes issues';
|
|
463
|
+
const solution = 'Use Object.create(null) or Map instead of plain objects';
|
|
464
|
+
const pattern = recordPattern(state, problem, solution);
|
|
465
|
+
expect(pattern).not.toBeNull();
|
|
466
|
+
// Verify Map-based storage is safe from prototype pollution
|
|
467
|
+
expect(state.patterns.__proto__).not.toHaveProperty('polluted');
|
|
468
|
+
});
|
|
469
|
+
});
|
|
470
|
+
// Performance Tests
|
|
471
|
+
describe('Performance Tests', () => {
|
|
472
|
+
it('handles 1000 patterns without significant slowdown', () => {
|
|
473
|
+
const state = initAutoLearner('perf-test');
|
|
474
|
+
const start = Date.now();
|
|
475
|
+
for (let i = 0; i < 1000; i++) {
|
|
476
|
+
recordPattern(state, `Error number ${i}: Something failed in /src/file${i}.ts`, `Fixed error ${i} by applying the correct solution with proper error handling and verification`);
|
|
477
|
+
}
|
|
478
|
+
const elapsed = Date.now() - start;
|
|
479
|
+
expect(state.patterns.size).toBe(1000);
|
|
480
|
+
// Should complete within 5 seconds even on slow machines
|
|
481
|
+
expect(elapsed).toBeLessThan(5000);
|
|
482
|
+
});
|
|
483
|
+
it('deduplication with 1000 identical patterns is efficient', () => {
|
|
484
|
+
const state = initAutoLearner('dedup-perf-test');
|
|
485
|
+
const start = Date.now();
|
|
486
|
+
for (let i = 0; i < 1000; i++) {
|
|
487
|
+
recordPattern(state, 'Error: The same error occurs every time in /src/main.ts', 'Apply the same fix: restart the server and check the configuration');
|
|
488
|
+
}
|
|
489
|
+
const elapsed = Date.now() - start;
|
|
490
|
+
// Should still only have 1 pattern
|
|
491
|
+
expect(state.patterns.size).toBe(1);
|
|
492
|
+
// Pattern should have 1000 occurrences
|
|
493
|
+
const pattern = Array.from(state.patterns.values())[0];
|
|
494
|
+
expect(pattern.occurrences).toBe(1000);
|
|
495
|
+
// Should be fast since it's just incrementing
|
|
496
|
+
expect(elapsed).toBeLessThan(3000);
|
|
497
|
+
});
|
|
498
|
+
it('extractTriggers handles very large text efficiently', () => {
|
|
499
|
+
const largeText = 'Error: ' + 'word '.repeat(10000);
|
|
500
|
+
const start = Date.now();
|
|
501
|
+
const triggers = extractTriggers(largeText, 'solution text');
|
|
502
|
+
const elapsed = Date.now() - start;
|
|
503
|
+
expect(elapsed).toBeLessThan(2000);
|
|
504
|
+
expect(triggers.length).toBeLessThanOrEqual(10);
|
|
505
|
+
});
|
|
506
|
+
});
|
|
507
|
+
//# sourceMappingURL=auto-learner.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-learner.test.js","sourceRoot":"","sources":["../../../src/__tests__/learner/auto-learner.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EACL,eAAe,EACf,aAAa,EACb,eAAe,EACf,wBAAwB,EACxB,kBAAkB,GAGnB,MAAM,qCAAqC,CAAC;AAE7C,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,oCAAoC;IACpC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,KAAK,GAAG,eAAe,CAAC,kBAAkB,CAAC,CAAC;YAElD,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,KAAK,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,KAAK,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,iCAAiC;IACjC,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,IAAI,KAAuB,CAAC;QAE5B,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,OAAO,GAAG,yEAAyE,CAAC;YAC1F,MAAM,QAAQ,GAAG,4FAA4F,CAAC;YAE9G,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAExD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,CAAC,OAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,OAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,OAAO,GAAG,yBAAyB,CAAC;YAC1C,MAAM,QAAQ,GAAG,8DAA8D,CAAC;YAEhF,4BAA4B;YAC5B,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACzD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEzD,6BAA6B;YAC7B,MAAM,CAAC,QAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAS,CAAC,EAAE,CAAC,CAAC;YACxC,wCAAwC;YACxC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,OAAO,GAAG,0CAA0C,CAAC;YAC3D,MAAM,QAAQ,GAAG,mFAAmF,CAAC;YAErG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAExD,MAAM,CAAC,OAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,aAAa,CACX,KAAK,EACL,+BAA+B,EAC/B,uCAAuC,CACxC,CAAC;YACF,aAAa,CACX,KAAK,EACL,wCAAwC,EACxC,gDAAgD,CACjD,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,kCAAkC;IAClC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,OAAO,GAAG,gEAAgE,CAAC;YACjF,MAAM,QAAQ,GAAG,iCAAiC,CAAC;YAEnD,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEpD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,OAAO,GAAG,mDAAmD,CAAC;YACpE,MAAM,QAAQ,GAAG,wCAAwC,CAAC;YAE1D,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEpD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,OAAO,GAAG,4DAA4D,CAAC;YAC7E,MAAM,QAAQ,GAAG,qDAAqD,CAAC;YAEvE,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEpD,4DAA4D;YAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC;YACjE,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,CAAC;YAE3E,MAAM,CAAC,QAAQ,IAAI,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,OAAO,GAAG,uCAAuC,CAAC;YACxD,MAAM,QAAQ,GAAG,qCAAqC,CAAC;YAEvD,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEpD,qCAAqC;YACrC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpG,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,OAAO,GAAG;;;;;OAKf,CAAC;YACF,MAAM,QAAQ,GAAG;;;;OAIhB,CAAC;YAEF,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEpD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,wCAAwC;IACxC,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,OAAO,GAAqB;gBAChC,EAAE,EAAE,QAAQ;gBACZ,OAAO,EAAE,mCAAmC;gBAC5C,QAAQ,EAAE,mEAAmE;gBAC7E,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;gBACpB,iBAAiB,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;gBACxC,aAAa,EAAE,CAAC,WAAW,CAAC;aAC7B,CAAC;YAEF,MAAM,KAAK,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAEhD,MAAM,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,WAAW,GAAqB;gBACpC,EAAE,EAAE,WAAW;gBACf,OAAO,EAAE,oCAAoC;gBAC7C,QAAQ,EAAE,gFAAgF;gBAC1F,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;gBACpB,iBAAiB,EAAE,CAAC,WAAW,CAAC;gBAChC,aAAa,EAAE,EAAE;aAClB,CAAC;YAEF,MAAM,cAAc,GAAqB;gBACvC,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,mDAAmD;gBAC5D,QAAQ,EAAE,6FAA6F;gBACvG,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;gBACpB,iBAAiB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC;gBACjE,aAAa,EAAE,CAAC,WAAW,CAAC;aAC7B,CAAC;YAEF,MAAM,SAAS,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;YACxD,MAAM,YAAY,GAAG,wBAAwB,CAAC,cAAc,CAAC,CAAC;YAE9D,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,eAAe,GAAqB;gBACxC,EAAE,EAAE,eAAe;gBACnB,OAAO,EAAE,gFAAgF;gBACzF,QAAQ,EAAE,uFAAuF;gBACjG,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;gBACpB,iBAAiB,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,eAAe,CAAC;gBAC3D,aAAa,EAAE,CAAC,UAAU,CAAC;aAC5B,CAAC;YAEF,MAAM,cAAc,GAAqB;gBACvC,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,+CAA+C;gBACxD,QAAQ,EAAE,0GAA0G;gBACpH,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;gBACpB,iBAAiB,EAAE,EAAE;gBACrB,aAAa,EAAE,EAAE;aAClB,CAAC;YAEF,MAAM,aAAa,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAC;YAChE,MAAM,YAAY,GAAG,wBAAwB,CAAC,cAAc,CAAC,CAAC;YAE9D,MAAM,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,gBAAgB,GAAqB;gBACzC,EAAE,EAAE,aAAa;gBACjB,OAAO,EAAE,iCAAiC;gBAC1C,QAAQ,EAAE,gEAAgE;gBAC1E,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;gBACpB,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;gBACpC,aAAa,EAAE,EAAE;aAClB,CAAC;YAEF,MAAM,mBAAmB,GAAqB;gBAC5C,GAAG,gBAAgB;gBACnB,EAAE,EAAE,eAAe;gBACnB,WAAW,EAAE,CAAC;aACf,CAAC;YAEF,MAAM,WAAW,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;YAC/D,MAAM,aAAa,GAAG,wBAAwB,CAAC,mBAAmB,CAAC,CAAC;YAEpE,MAAM,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,aAAa,GAAqB;gBACtC,EAAE,EAAE,YAAY;gBAChB,OAAO,EAAE,wCAAwC;gBACjD,QAAQ,EAAE,iCAAiC;gBAC3C,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;gBACpB,iBAAiB,EAAE,CAAC,OAAO,CAAC;gBAC5B,aAAa,EAAE,EAAE;aAClB,CAAC;YAEF,MAAM,gBAAgB,GAAqB;gBACzC,EAAE,EAAE,eAAe;gBACnB,OAAO,EAAE,gDAAgD;gBACzD,QAAQ,EAAE;;;wFAGsE;gBAChF,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;gBACpB,iBAAiB,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC;gBAC7C,aAAa,EAAE,EAAE;aAClB,CAAC;YAEF,MAAM,UAAU,GAAG,wBAAwB,CAAC,aAAa,CAAC,CAAC;YAC3D,MAAM,aAAa,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;YAEjE,MAAM,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oCAAoC;IACpC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,IAAI,KAAuB,CAAC;QAE5B,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,sDAAsD;YACtD,MAAM,kBAAkB,GAAG,wEAAwE,CAAC;YACpG,MAAM,mBAAmB,GAAG;;;;;;OAM3B,CAAC;YAEF,gDAAgD;YAChD,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;YAC9D,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;YAC9D,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;YAE9D,wDAAwD;YACxD,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;YAC7C,MAAM,kBAAkB,GAAG,sBAAsB,CAAC;YAElD,aAAa,CAAC,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;YAE5D,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAElD,uDAAuD;YACvD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,uDAAuD;YACvD,MAAM,OAAO,GAAG,+CAA+C,CAAC;YAChE,MAAM,QAAQ,GAAG,wGAAwG,CAAC;YAE1H,uCAAuC;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC1C,CAAC;YAED,8CAA8C;YAC9C,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAE9C,6DAA6D;YAC7D,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACtB,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,6CAA6C;YAC7C,MAAM,QAAQ,GAAG;gBACf;oBACE,OAAO,EAAE,+DAA+D;oBACxE,QAAQ,EAAE,8IAA8I;iBACzJ;gBACD;oBACE,OAAO,EAAE,6CAA6C;oBACtD,QAAQ,EAAE,yFAAyF;iBACpG;gBACD;oBACE,OAAO,EAAE,qCAAqC;oBAC9C,QAAQ,EAAE,6DAA6D;iBACxE;aACF,CAAC;YAEF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACnB,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC5C,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,yBAAyB;YACxE,CAAC,CAAC,CAAC;YAEH,MAAM,uBAAuB,GAAG,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9D,MAAM,wBAAwB,GAAG,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAE/D,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACjG,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,oCAAoC;YACpC,MAAM,QAAQ,GAAG;gBACf;oBACE,OAAO,EAAE,sDAAsD;oBAC/D,QAAQ,EAAE,oGAAoG;iBAC/G;gBACD;oBACE,OAAO,EAAE,2DAA2D;oBACpE,QAAQ,EAAE,gDAAgD;iBAC3D;aACF,CAAC;YAEF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,2BAA2B;YAE7E,yCAAyC;YACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,IAAI,KAAuB,CAAC;QAE5B,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,qCAAqC,CAAC,CAAC;YAC/E,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,8BAA8B,EAAE,EAAE,CAAC,CAAC;YACxE,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,QAAQ,GAAG,eAAe,CAC9B,oBAAoB,EACpB,yBAAyB,CAC1B,CAAC;YAEF,wDAAwD;YACxD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,oEAAoE;YACpE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,IAAW,EAAE,UAAU,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,SAAgB,CAAC,CAAC;YAElE,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,OAAO,GAAG,6DAA6D,CAAC;YAC9E,MAAM,QAAQ,GAAG,sEAAsE,CAAC;YAExF,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAExD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,OAAO,GAAG,oDAAoD,CAAC;YACrE,MAAM,QAAQ,GAAG,yEAAyE,CAAC;YAE3F,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAExD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,WAAW,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEhD,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;YAEhE,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,OAAO,GAAqB;gBAChC,EAAE,EAAE,kBAAkB;gBACtB,OAAO,EAAE,iCAAiC;gBAC1C,QAAQ,EAAE,oCAAoC;gBAC9C,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;gBACpB,iBAAiB,EAAE,EAAE,EAAE,cAAc;gBACrC,aAAa,EAAE,EAAE;aAClB,CAAC;YAEF,MAAM,KAAK,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAEhD,0FAA0F;YAC1F,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,2CAA2C;IAC3C,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC9C,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,aAAa;YACb,MAAM,KAAK,GAAG,eAAe,CAAC,0BAA0B,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEpC,6CAA6C;YAC7C,MAAM,OAAO,GAAG,uEAAuE,CAAC;YACxF,MAAM,QAAQ,GAAG;;;;;;OAMhB,CAAC;YAEF,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEpC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEpC,kBAAkB;YAClB,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAElD,gEAAgE;YAChE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpD,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,4BAA4B;AAC5B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,KAAuB,CAAC;IAE5B,UAAU,CAAC,GAAG,EAAE;QACd,KAAK,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG,aAAa,CAC3B,KAAK,EACL,yDAAyD,EACzD,sDAAsD,CACvD,CAAC;QAEF,8DAA8D;QAC9D,MAAM,CAAC,OAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,oCAAoC;QACzE,MAAM,CAAC,OAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,yDAAyD,CAAC;QAC1E,MAAM,QAAQ,GAAG,oFAAoF,CAAC;QAEtG,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAExD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,8EAA8E;QAC9E,MAAM,CAAC,OAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,yCAAyC,CAAC;QAC1D,MAAM,QAAQ,GAAG,iDAAiD,CAAC;QAEnE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAExD,kCAAkC;QAClC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,OAAO,GAAG,gDAAgD,CAAC;QACjE,MAAM,QAAQ,GAAG,yDAAyD,CAAC;QAE3E,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAExD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,4DAA4D;QAC5D,MAAM,CAAE,KAAK,CAAC,QAAgB,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,oBAAoB;AACpB,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,aAAa,CACX,KAAK,EACL,gBAAgB,CAAC,kCAAkC,CAAC,KAAK,EACzD,eAAe,CAAC,+EAA+E,CAChG,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAEnC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,yDAAyD;QACzD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,KAAK,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,aAAa,CACX,KAAK,EACL,yDAAyD,EACzD,oEAAoE,CACrE,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAEnC,mCAAmC;QACnC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,uCAAuC;QACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,8CAA8C;QAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAE7D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAEnC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/learner/matcher.test.ts"],"names":[],"mappings":""}
|