@vibe-validate/cli 0.9.2 → 0.9.3
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 +461 -0
- package/dist/bin.js +1 -1
- package/dist/bin.js.map +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
# @vibe-validate/cli
|
|
2
|
+
|
|
3
|
+
> Command-line interface for vibe-validate validation framework
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@vibe-validate/cli)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
|
|
8
|
+
The `@vibe-validate/cli` package provides a command-line interface for running validations with git tree hash-based caching, designed specifically for AI-assisted development workflows.
|
|
9
|
+
|
|
10
|
+
## Features
|
|
11
|
+
|
|
12
|
+
- **🚀 Git tree hash-based caching** - 312x faster validation on unchanged code
|
|
13
|
+
- **🤖 Agent-friendly output** - Minimal token waste, structured error reporting
|
|
14
|
+
- **⚡ Parallel phase execution** - Run validation steps concurrently
|
|
15
|
+
- **🔄 Pre-commit workflow** - Automatic branch sync checking + validation
|
|
16
|
+
- **📊 State management** - Track validation history and cache status
|
|
17
|
+
- **🎯 TypeScript-first** - Full type safety with runtime validation
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install -D @vibe-validate/cli
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Or use directly via `npx`:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npx @vibe-validate/cli validate
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Quick Start
|
|
32
|
+
|
|
33
|
+
1. **Create configuration file** (`vibe-validate.config.mjs`):
|
|
34
|
+
|
|
35
|
+
```javascript
|
|
36
|
+
import { defineConfig, preset } from '@vibe-validate/config';
|
|
37
|
+
|
|
38
|
+
export default defineConfig({
|
|
39
|
+
preset: preset('typescript-nodejs'),
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
2. **Run validation**:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npx vibe-validate validate
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
3. **Check validation state**:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npx vibe-validate state
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Available Commands
|
|
56
|
+
|
|
57
|
+
### `validate`
|
|
58
|
+
|
|
59
|
+
Run validation workflow with caching.
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npx vibe-validate validate [options]
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Options:**
|
|
66
|
+
- `--force` - Bypass cache and force re-validation
|
|
67
|
+
- `--no-cache` - Disable caching for this run
|
|
68
|
+
- `--format <format>` - Output format: `human`, `yaml`, `json`, or `auto`
|
|
69
|
+
- `--config <path>` - Path to config file (default: `vibe-validate.config.mjs`)
|
|
70
|
+
|
|
71
|
+
**Examples:**
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Normal validation (uses cache)
|
|
75
|
+
npx vibe-validate validate
|
|
76
|
+
|
|
77
|
+
# Force re-validation (bypass cache)
|
|
78
|
+
npx vibe-validate validate --force
|
|
79
|
+
|
|
80
|
+
# JSON output (for CI/CD)
|
|
81
|
+
npx vibe-validate validate --format json
|
|
82
|
+
|
|
83
|
+
# Custom config file
|
|
84
|
+
npx vibe-validate validate --config ./custom-config.mjs
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Exit Codes:**
|
|
88
|
+
- `0` - Validation passed
|
|
89
|
+
- `1` - Validation failed
|
|
90
|
+
- `2` - Configuration or runtime error
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
### `state`
|
|
95
|
+
|
|
96
|
+
Display validation state and cache status.
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
npx vibe-validate state [options]
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Options:**
|
|
103
|
+
- `--format <format>` - Output format: `human`, `yaml`, or `json`
|
|
104
|
+
|
|
105
|
+
**Examples:**
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# Human-readable state
|
|
109
|
+
npx vibe-validate state
|
|
110
|
+
|
|
111
|
+
# YAML output (for agents)
|
|
112
|
+
npx vibe-validate state --format yaml
|
|
113
|
+
|
|
114
|
+
# JSON output (for scripts)
|
|
115
|
+
npx vibe-validate state --format json
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Output includes:**
|
|
119
|
+
- Last validation result (passed/failed)
|
|
120
|
+
- Git tree hash
|
|
121
|
+
- Timestamp
|
|
122
|
+
- Failed step details (if any)
|
|
123
|
+
- Suggested next steps
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### `config`
|
|
128
|
+
|
|
129
|
+
Display resolved configuration.
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
npx vibe-validate config [options]
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Options:**
|
|
136
|
+
- `--format <format>` - Output format: `human`, `yaml`, or `json`
|
|
137
|
+
- `--config <path>` - Path to config file
|
|
138
|
+
|
|
139
|
+
**Examples:**
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# Show configuration
|
|
143
|
+
npx vibe-validate config
|
|
144
|
+
|
|
145
|
+
# JSON output
|
|
146
|
+
npx vibe-validate config --format json
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Use cases:**
|
|
150
|
+
- Verify configuration is loaded correctly
|
|
151
|
+
- Debug preset behavior
|
|
152
|
+
- Inspect default values
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
### `pre-commit`
|
|
157
|
+
|
|
158
|
+
Run pre-commit workflow (branch sync + validation).
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
npx vibe-validate pre-commit
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**Workflow:**
|
|
165
|
+
1. Check if branch is behind `origin/main`
|
|
166
|
+
2. If behind → Exit with instructions to merge
|
|
167
|
+
3. If up-to-date → Run validation (with caching)
|
|
168
|
+
4. If validation passes → Allow commit
|
|
169
|
+
5. If validation fails → Block commit with error details
|
|
170
|
+
|
|
171
|
+
**Recommended setup** (`.husky/pre-commit`):
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
#!/bin/sh
|
|
175
|
+
npx vibe-validate pre-commit
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
### `sync-check`
|
|
181
|
+
|
|
182
|
+
Check if current branch is behind remote.
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
npx vibe-validate sync-check [options]
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**Options:**
|
|
189
|
+
- `--remote-branch <branch>` - Remote branch to check (default: `origin/main`)
|
|
190
|
+
|
|
191
|
+
**Exit Codes:**
|
|
192
|
+
- `0` - Up to date or no remote
|
|
193
|
+
- `1` - Behind remote (needs merge)
|
|
194
|
+
- `2` - Error condition
|
|
195
|
+
|
|
196
|
+
**Examples:**
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# Check against origin/main
|
|
200
|
+
npx vibe-validate sync-check
|
|
201
|
+
|
|
202
|
+
# Check against origin/develop
|
|
203
|
+
npx vibe-validate sync-check --remote-branch origin/develop
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
### `cleanup`
|
|
209
|
+
|
|
210
|
+
Clean up merged branches after PR merge.
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
npx vibe-validate cleanup
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
**Workflow:**
|
|
217
|
+
1. Switch to `main` branch
|
|
218
|
+
2. Pull latest changes from `origin/main`
|
|
219
|
+
3. Identify merged branches
|
|
220
|
+
4. Delete merged branches (with confirmation)
|
|
221
|
+
5. Report summary
|
|
222
|
+
|
|
223
|
+
**Safety features:**
|
|
224
|
+
- Only deletes confirmed-merged branches
|
|
225
|
+
- Never deletes `main`, `master`, or `develop`
|
|
226
|
+
- Provides confirmation before deletion
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
### `doctor`
|
|
231
|
+
|
|
232
|
+
Check repository health and best practices.
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
npx vibe-validate doctor
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**Checks:**
|
|
239
|
+
- Pre-commit hook installed
|
|
240
|
+
- Validation state file exists
|
|
241
|
+
- Config file is valid
|
|
242
|
+
- Git repository exists
|
|
243
|
+
- On feature branch (not main)
|
|
244
|
+
|
|
245
|
+
**Output:**
|
|
246
|
+
- ✅ Passing checks
|
|
247
|
+
- ⚠️ Warnings with recommendations
|
|
248
|
+
- ❌ Failing checks with fix instructions
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## Configuration
|
|
253
|
+
|
|
254
|
+
Create `vibe-validate.config.mjs` in your project root:
|
|
255
|
+
|
|
256
|
+
```javascript
|
|
257
|
+
import { defineConfig } from '@vibe-validate/config';
|
|
258
|
+
|
|
259
|
+
export default defineConfig({
|
|
260
|
+
validation: {
|
|
261
|
+
phases: [
|
|
262
|
+
{
|
|
263
|
+
name: 'Pre-Qualification',
|
|
264
|
+
parallel: true,
|
|
265
|
+
steps: [
|
|
266
|
+
{ name: 'TypeScript', command: 'pnpm typecheck' },
|
|
267
|
+
{ name: 'ESLint', command: 'pnpm lint' },
|
|
268
|
+
],
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
name: 'Testing',
|
|
272
|
+
steps: [
|
|
273
|
+
{ name: 'Unit Tests', command: 'pnpm test' },
|
|
274
|
+
],
|
|
275
|
+
},
|
|
276
|
+
],
|
|
277
|
+
caching: {
|
|
278
|
+
strategy: 'git-tree-hash',
|
|
279
|
+
enabled: true,
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
git: {
|
|
283
|
+
mainBranch: 'main',
|
|
284
|
+
warnIfBehind: true,
|
|
285
|
+
},
|
|
286
|
+
output: {
|
|
287
|
+
format: 'auto',
|
|
288
|
+
showProgress: true,
|
|
289
|
+
},
|
|
290
|
+
});
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**Or use presets:**
|
|
294
|
+
|
|
295
|
+
```javascript
|
|
296
|
+
import { defineConfig, preset } from '@vibe-validate/config';
|
|
297
|
+
|
|
298
|
+
export default defineConfig({
|
|
299
|
+
preset: preset('typescript-nodejs'),
|
|
300
|
+
});
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
**Available presets:**
|
|
304
|
+
- `typescript-library` - TypeScript library (no runtime)
|
|
305
|
+
- `typescript-nodejs` - Node.js application with TypeScript
|
|
306
|
+
- `typescript-react` - React application with TypeScript
|
|
307
|
+
|
|
308
|
+
## Caching
|
|
309
|
+
|
|
310
|
+
vibe-validate uses **git tree hash-based caching** for deterministic, content-based validation:
|
|
311
|
+
|
|
312
|
+
**How it works:**
|
|
313
|
+
1. Calculate git tree hash of current working tree (includes all changes)
|
|
314
|
+
2. Check if hash matches cached state
|
|
315
|
+
3. If match → Skip validation (instant, < 1s)
|
|
316
|
+
4. If different → Run full validation (~60-90s)
|
|
317
|
+
|
|
318
|
+
**Performance:**
|
|
319
|
+
- **First run**: ~60-90s (depends on your validation steps)
|
|
320
|
+
- **Cached run**: < 1s (312x faster!)
|
|
321
|
+
- **After code change**: ~60-90s (full re-validation)
|
|
322
|
+
|
|
323
|
+
**Cache invalidation:**
|
|
324
|
+
- Automatic when any file changes (via git tree hash)
|
|
325
|
+
- Manual with `--force` flag
|
|
326
|
+
- Disabled with `--no-cache` flag
|
|
327
|
+
|
|
328
|
+
## Agent-Friendly Output
|
|
329
|
+
|
|
330
|
+
vibe-validate is optimized for AI agents like Claude Code:
|
|
331
|
+
|
|
332
|
+
**Benefits:**
|
|
333
|
+
- **Minimal token waste**: 4-5 lines on failure vs 200+ with traditional tools
|
|
334
|
+
- **Structured errors**: Complete details in `.vibe-validate-state.yaml`
|
|
335
|
+
- **Clear next steps**: Actionable commands in state file
|
|
336
|
+
- **Zero noise**: No server logs, no verbose progress bars
|
|
337
|
+
|
|
338
|
+
**Example failure output:**
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
❌ Validation failed: Phase Pre-Qualification step TypeScript failed
|
|
342
|
+
|
|
343
|
+
Run 'npx vibe-validate state' for details
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**Then check state:**
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
npx vibe-validate state
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
**Output:**
|
|
353
|
+
|
|
354
|
+
```yaml
|
|
355
|
+
passed: false
|
|
356
|
+
timestamp: 2025-10-16T20:00:00.000Z
|
|
357
|
+
treeHash: abc123...
|
|
358
|
+
failedStep: TypeScript
|
|
359
|
+
failedStepOutput: |
|
|
360
|
+
src/index.ts:10:5 - error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
|
|
361
|
+
rerunCommand: pnpm typecheck
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
## Integration with Pre-Commit Hooks
|
|
365
|
+
|
|
366
|
+
**Recommended setup using [husky](https://typicode.github.io/husky/):**
|
|
367
|
+
|
|
368
|
+
1. Install husky:
|
|
369
|
+
|
|
370
|
+
```bash
|
|
371
|
+
npm install -D husky
|
|
372
|
+
npx husky init
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
2. Create `.husky/pre-commit`:
|
|
376
|
+
|
|
377
|
+
```bash
|
|
378
|
+
#!/bin/sh
|
|
379
|
+
npx vibe-validate pre-commit
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
3. Test the hook:
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
git add .
|
|
386
|
+
git commit -m "test commit"
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
**What happens:**
|
|
390
|
+
- ✅ Branch sync check runs first
|
|
391
|
+
- ✅ Validation runs with caching
|
|
392
|
+
- ✅ Commit allowed if validation passes
|
|
393
|
+
- ❌ Commit blocked if validation fails
|
|
394
|
+
|
|
395
|
+
## Troubleshooting
|
|
396
|
+
|
|
397
|
+
### "Validation cache randomly invalidates"
|
|
398
|
+
|
|
399
|
+
**Cause**: Git tree hash non-determinism (should be fixed in v0.9.3+)
|
|
400
|
+
|
|
401
|
+
**Solution**: Upgrade to `@vibe-validate/cli@^0.9.3`
|
|
402
|
+
|
|
403
|
+
### "Command injection error"
|
|
404
|
+
|
|
405
|
+
**Cause**: Security vulnerability in git branch operations (fixed in v0.9.3+)
|
|
406
|
+
|
|
407
|
+
**Solution**: Upgrade to `@vibe-validate/cli@^0.9.3`
|
|
408
|
+
|
|
409
|
+
### "Module not found" errors
|
|
410
|
+
|
|
411
|
+
**Cause**: Packages not built after installation
|
|
412
|
+
|
|
413
|
+
**Solution**:
|
|
414
|
+
|
|
415
|
+
```bash
|
|
416
|
+
pnpm install
|
|
417
|
+
pnpm -r build
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
### "Permission denied" on pre-commit hook
|
|
421
|
+
|
|
422
|
+
**Cause**: Hook script not executable
|
|
423
|
+
|
|
424
|
+
**Solution**:
|
|
425
|
+
|
|
426
|
+
```bash
|
|
427
|
+
chmod +x .husky/pre-commit
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
## CLI Aliases
|
|
431
|
+
|
|
432
|
+
The CLI provides two aliases:
|
|
433
|
+
|
|
434
|
+
- `vibe-validate` - Full command name
|
|
435
|
+
- `vv` - Short alias for convenience
|
|
436
|
+
|
|
437
|
+
**Examples:**
|
|
438
|
+
|
|
439
|
+
```bash
|
|
440
|
+
vv validate
|
|
441
|
+
vv state
|
|
442
|
+
vv config
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
## Environment Variables
|
|
446
|
+
|
|
447
|
+
- `NODE_ENV` - Set to `test` to disable progress indicators
|
|
448
|
+
- `CI` - Auto-detected, disables colors and interactive features
|
|
449
|
+
- `LLM_OUTPUT` - Set to `1` for minimal output (agent-friendly)
|
|
450
|
+
|
|
451
|
+
## Links
|
|
452
|
+
|
|
453
|
+
- [Full Documentation](https://github.com/jeffrdutton/vibe-validate#readme)
|
|
454
|
+
- [Configuration Guide](https://github.com/jeffrdutton/vibe-validate/blob/main/docs/configuration.md)
|
|
455
|
+
- [Presets Reference](https://github.com/jeffrdutton/vibe-validate/blob/main/docs/presets.md)
|
|
456
|
+
- [API Reference](https://github.com/jeffrdutton/vibe-validate/blob/main/docs/api/)
|
|
457
|
+
- [Examples](https://github.com/jeffrdutton/vibe-validate/tree/main/examples)
|
|
458
|
+
|
|
459
|
+
## License
|
|
460
|
+
|
|
461
|
+
MIT © [Jeff Dutton](https://github.com/jeffrdutton)
|
package/dist/bin.js
CHANGED
|
@@ -25,7 +25,7 @@ try {
|
|
|
25
25
|
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
26
26
|
version = packageJson.version;
|
|
27
27
|
}
|
|
28
|
-
catch (
|
|
28
|
+
catch (_error) {
|
|
29
29
|
// If package.json can't be read (shouldn't happen in production), use fallback
|
|
30
30
|
console.warn('Warning: Could not read package.json version, using fallback');
|
|
31
31
|
}
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,4CAA4C;AAC5C,mEAAmE;AACnE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAE3D,IAAI,OAAO,GAAG,OAAO,CAAC,CAAC,mBAAmB;AAC1C,IAAI,CAAC;IACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;AAChC,CAAC;AAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,4CAA4C;AAC5C,mEAAmE;AACnE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAE3D,IAAI,OAAO,GAAG,OAAO,CAAC,CAAC,mBAAmB;AAC1C,IAAI,CAAC;IACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;AAChC,CAAC;AAAC,OAAO,MAAM,EAAE,CAAC;IAChB,+EAA+E;IAC/E,OAAO,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,eAAe,CAAC,OAAO,CAAC,CAAC,CAAO,yBAAyB;AACzD,WAAW,CAAC,OAAO,CAAC,CAAC,CAAY,qBAAqB;AACtD,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAO,2BAA2B;AAC5D,YAAY,CAAC,OAAO,CAAC,CAAC,CAAW,sBAAsB;AACvD,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAO,2BAA2B;AAC5D,cAAc,CAAC,OAAO,CAAC,CAAC,CAAS,wBAAwB;AACzD,aAAa,CAAC,OAAO,CAAC,CAAC,CAAU,uBAAuB;AAExD,+BAA+B;AAC/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|