codex-orchestrator 0.1.20 → 0.1.22
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 +18 -13
- package/dist/src/config/schema.d.ts +7 -0
- package/dist/src/config/schema.d.ts.map +1 -1
- package/dist/src/config/schema.js +34 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/git/worktree.d.ts.map +1 -1
- package/dist/src/git/worktree.js +1 -6
- package/dist/src/git/worktree.js.map +1 -1
- package/dist/src/path-policy.d.ts +27 -0
- package/dist/src/path-policy.d.ts.map +1 -0
- package/dist/src/path-policy.js +83 -0
- package/dist/src/path-policy.js.map +1 -0
- package/dist/src/runner/command-utils.d.ts +3 -2
- package/dist/src/runner/command-utils.d.ts.map +1 -1
- package/dist/src/runner/command-utils.js +71 -4
- package/dist/src/runner/command-utils.js.map +1 -1
- package/dist/src/runner/handoff-evidence.d.ts +105 -0
- package/dist/src/runner/handoff-evidence.d.ts.map +1 -0
- package/dist/src/runner/handoff-evidence.js +224 -0
- package/dist/src/runner/handoff-evidence.js.map +1 -0
- package/dist/src/runner/issue-tree.d.ts +4 -1
- package/dist/src/runner/issue-tree.d.ts.map +1 -1
- package/dist/src/runner/issue-tree.js +75 -0
- package/dist/src/runner/issue-tree.js.map +1 -1
- package/dist/src/runner/local-execution-session.d.ts +45 -0
- package/dist/src/runner/local-execution-session.d.ts.map +1 -1
- package/dist/src/runner/local-execution-session.js +229 -0
- package/dist/src/runner/local-execution-session.js.map +1 -1
- package/dist/src/runner/plan-auto-command.d.ts.map +1 -1
- package/dist/src/runner/plan-auto-command.js +122 -307
- package/dist/src/runner/plan-auto-command.js.map +1 -1
- package/dist/src/runner/prompt.d.ts +4 -0
- package/dist/src/runner/prompt.d.ts.map +1 -1
- package/dist/src/runner/prompt.js +15 -45
- package/dist/src/runner/prompt.js.map +1 -1
- package/dist/src/runner/review-gate-policy.d.ts +24 -0
- package/dist/src/runner/review-gate-policy.d.ts.map +1 -0
- package/dist/src/runner/review-gate-policy.js +105 -0
- package/dist/src/runner/review-gate-policy.js.map +1 -0
- package/dist/src/runner/review-gates.d.ts +4 -8
- package/dist/src/runner/review-gates.d.ts.map +1 -1
- package/dist/src/runner/review-gates.js +27 -101
- package/dist/src/runner/review-gates.js.map +1 -1
- package/dist/src/runner/safety.d.ts.map +1 -1
- package/dist/src/runner/safety.js +5 -20
- package/dist/src/runner/safety.js.map +1 -1
- package/dist/src/runner/scoped-auto-command.d.ts.map +1 -1
- package/dist/src/runner/scoped-auto-command.js +137 -288
- package/dist/src/runner/scoped-auto-command.js.map +1 -1
- package/dist/src/runner/visual-proof-runner.d.ts +2 -7
- package/dist/src/runner/visual-proof-runner.d.ts.map +1 -1
- package/dist/src/runner/visual-proof-runner.js +13 -14
- package/dist/src/runner/visual-proof-runner.js.map +1 -1
- package/dist/src/setup/project-config.d.ts.map +1 -1
- package/dist/src/setup/project-config.js +19 -5
- package/dist/src/setup/project-config.js.map +1 -1
- package/dist/src/setup/setup-command.d.ts.map +1 -1
- package/dist/src/setup/setup-command.js +42 -0
- package/dist/src/setup/setup-command.js.map +1 -1
- package/package.json +1 -1
- package/prompts/workflows/scoped-implementation.md +3 -3
|
@@ -1,30 +1,20 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
return false;
|
|
7
|
-
}
|
|
8
|
-
const issueText = `${input.issue.title}\n${input.issue.body}`;
|
|
9
|
-
const issueLooksVisual = visualProof.issueTextPatterns.some((pattern) => regexMatches(pattern, issueText));
|
|
10
|
-
const changedUiFiles = input.changedFiles.filter((path) => visualProof.changedPathGlobs.some((pattern) => globMatches(pattern, normalizePath(path))));
|
|
11
|
-
return issueLooksVisual || changedUiFiles.length > 0;
|
|
12
|
-
}
|
|
3
|
+
import { acceptsScreenshotArtifactPath, classifyChangedPaths, isRunnerVisualProofCodeArtifactPath, } from '../path-policy.js';
|
|
4
|
+
import { hasPassedTddValidation, hasPassedValidation, isRunnerVisualValidation, isStrongVisualValidation, shouldApplyVisualProofGate, } from './review-gate-policy.js';
|
|
5
|
+
export { shouldApplyVisualProofGate } from './review-gate-policy.js';
|
|
13
6
|
export function evaluateReviewGates(input) {
|
|
14
7
|
const reasons = [];
|
|
8
|
+
const warnings = [];
|
|
15
9
|
reasons.push(...evaluateQualityGate(input));
|
|
16
|
-
const visualProof = input.config.reviewGates.visualProof;
|
|
17
10
|
if (!shouldApplyVisualProofGate(input)) {
|
|
18
|
-
return { ok: reasons.length === 0, reasons };
|
|
11
|
+
return { ok: reasons.length === 0, reasons, warnings };
|
|
19
12
|
}
|
|
20
|
-
const
|
|
21
|
-
|
|
13
|
+
const visualProof = input.config.reviewGates.visualProof;
|
|
14
|
+
const runnerCommand = visualProof.runnerValidationCommand?.trim() ?? '';
|
|
22
15
|
const runnerVisualValidation = input.validation.filter(isRunnerVisualValidation);
|
|
23
|
-
const hasPassedVisualValidation = matchingValidation.some((line) => line.status === 'passed');
|
|
24
16
|
const hasPassedRunnerVisualValidation = runnerVisualValidation.some((line) => line.status === 'passed' && isStrongVisualValidation(line));
|
|
25
|
-
const
|
|
26
|
-
const failedRunnerVisualValidation = runnerVisualValidation.filter((line) => line.status === 'failed');
|
|
27
|
-
const skippedVisualChecks = input.skippedChecks.filter((line) => visualProof.blockOnSkippedPatterns.some((pattern) => regexMatches(pattern, line)));
|
|
17
|
+
const nonPassingRunnerVisualValidation = runnerVisualValidation.filter((line) => line.status !== 'passed');
|
|
28
18
|
const screenshotArtifacts = input.report.artifacts.filter((artifact) => {
|
|
29
19
|
if (artifact.type !== 'screenshot') {
|
|
30
20
|
return false;
|
|
@@ -35,47 +25,39 @@ export function evaluateReviewGates(input) {
|
|
|
35
25
|
if (!artifact.path) {
|
|
36
26
|
return false;
|
|
37
27
|
}
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
28
|
+
const worktreePath = input.worktreePath;
|
|
29
|
+
return acceptsScreenshotArtifactPath({
|
|
30
|
+
artifactPath: artifact.path,
|
|
31
|
+
artifactDir: visualProof.artifactDir,
|
|
32
|
+
changedFiles: input.changedFiles,
|
|
33
|
+
hasPassedRunnerVisualValidation,
|
|
34
|
+
exists: worktreePath ? (path) => existsSync(join(worktreePath, path)) : undefined,
|
|
35
|
+
});
|
|
45
36
|
});
|
|
46
|
-
if (!
|
|
47
|
-
|
|
48
|
-
for (const line of failedVisualValidation) {
|
|
49
|
-
reasons.push(`Visual proof validation is ${line.status}: ${line.command} - ${line.summary}`);
|
|
50
|
-
}
|
|
51
|
-
for (const line of skippedVisualChecks) {
|
|
52
|
-
reasons.push(`Visual proof check was skipped: ${line}`);
|
|
53
|
-
}
|
|
37
|
+
if (!runnerCommand) {
|
|
38
|
+
warnings.push('Visual proof was applicable for this issue, but no runner-owned visual proof command is configured; skipping screenshot proof.');
|
|
54
39
|
}
|
|
55
|
-
for (const line of
|
|
56
|
-
|
|
40
|
+
for (const line of nonPassingRunnerVisualValidation) {
|
|
41
|
+
warnings.push(`Visual proof validation warning: ${line.command} - ${line.summary}`);
|
|
57
42
|
}
|
|
58
43
|
if (screenshotArtifacts.length < visualProof.minScreenshotArtifacts) {
|
|
59
|
-
|
|
44
|
+
warnings.push(`Visual proof warning: expected at least ${visualProof.minScreenshotArtifacts} screenshot artifact under ${visualProof.artifactDir} or a screenshot URL.`);
|
|
60
45
|
}
|
|
61
|
-
return { ok: reasons.length === 0, reasons };
|
|
46
|
+
return { ok: reasons.length === 0, reasons, warnings };
|
|
62
47
|
}
|
|
63
48
|
function evaluateQualityGate(input) {
|
|
64
49
|
const quality = input.config.reviewGates.quality;
|
|
65
50
|
if (!quality.enabled) {
|
|
66
51
|
return [];
|
|
67
52
|
}
|
|
68
|
-
const runtimeFiles = input.changedFiles
|
|
69
|
-
.
|
|
70
|
-
|
|
71
|
-
|
|
53
|
+
const { runtimeFiles, testFiles } = classifyChangedPaths(input.changedFiles, {
|
|
54
|
+
runtimeChangedPathGlobs: quality.runtimeChangedPathGlobs,
|
|
55
|
+
testChangedPathGlobs: quality.testChangedPathGlobs,
|
|
56
|
+
});
|
|
72
57
|
if (runtimeFiles.length === 0) {
|
|
73
58
|
return [];
|
|
74
59
|
}
|
|
75
60
|
const reasons = [];
|
|
76
|
-
const testFiles = input.changedFiles
|
|
77
|
-
.map(normalizePath)
|
|
78
|
-
.filter((path) => quality.testChangedPathGlobs.some((pattern) => globMatches(pattern, path)));
|
|
79
61
|
if (quality.tdd.enabled) {
|
|
80
62
|
const hasTddValidation = hasPassedTddValidation(input.validation, quality.tdd.requiredValidationPatterns);
|
|
81
63
|
const hasRunnerVisualProofEvidence = hasPassedRunnerVisualProofEvidence(input);
|
|
@@ -100,37 +82,6 @@ function evaluateQualityGate(input) {
|
|
|
100
82
|
}
|
|
101
83
|
return reasons;
|
|
102
84
|
}
|
|
103
|
-
function hasPassedValidation(validation, patterns) {
|
|
104
|
-
return validation.some((line) => line.status === 'passed' && patterns.some((pattern) => regexMatches(pattern, validationText(line))));
|
|
105
|
-
}
|
|
106
|
-
function hasPassedTddValidation(validation, patterns) {
|
|
107
|
-
if (hasPassedValidation(validation, patterns)) {
|
|
108
|
-
return true;
|
|
109
|
-
}
|
|
110
|
-
const passedTexts = validation
|
|
111
|
-
.filter((line) => line.status === 'passed')
|
|
112
|
-
.map(validationText);
|
|
113
|
-
const hasRedEvidence = passedTexts.some(hasTddRedEvidence);
|
|
114
|
-
const hasGreenEvidence = passedTexts.some(hasTddGreenEvidence);
|
|
115
|
-
return hasRedEvidence && hasGreenEvidence;
|
|
116
|
-
}
|
|
117
|
-
function hasTddRedEvidence(text) {
|
|
118
|
-
return /\bred\b/iu.test(text) || /\b(?:test|spec|check)\b[\s\S]{0,120}\bfail(?:ed|ing)?\b/iu.test(text);
|
|
119
|
-
}
|
|
120
|
-
function hasTddGreenEvidence(text) {
|
|
121
|
-
return /\bgreen\b/iu.test(text)
|
|
122
|
-
|| /\b(?:test|spec|jest|vitest|playwright|pytest)\b[\s\S]{0,120}\bpass(?:ed|ing)?\b/iu.test(text)
|
|
123
|
-
|| /\b(?:flutter|dart|npm|pnpm|yarn)\s+(?:run\s+)?test\b[\s\S]{0,120}\bpass(?:ed|ing)?\b/iu.test(text);
|
|
124
|
-
}
|
|
125
|
-
function validationText(line) {
|
|
126
|
-
return `${line.command}\n${line.summary}`;
|
|
127
|
-
}
|
|
128
|
-
function isStrongVisualValidation(line) {
|
|
129
|
-
return /(BrowserUse|Playwright|screenshot|viewport)/iu.test(validationText(line));
|
|
130
|
-
}
|
|
131
|
-
function isRunnerVisualValidation(line) {
|
|
132
|
-
return /runner visual proof/iu.test(validationText(line));
|
|
133
|
-
}
|
|
134
85
|
function hasPassedRunnerVisualProofEvidence(input) {
|
|
135
86
|
if (!shouldApplyVisualProofGate(input)) {
|
|
136
87
|
return false;
|
|
@@ -141,33 +92,8 @@ function hasPassedRunnerVisualProofEvidence(input) {
|
|
|
141
92
|
if (!hasPassedRunnerProof) {
|
|
142
93
|
return false;
|
|
143
94
|
}
|
|
144
|
-
const artifactDir = normalizePath(input.config.reviewGates.visualProof.artifactDir);
|
|
145
95
|
return input.changedFiles.some((file) => {
|
|
146
|
-
|
|
147
|
-
return globMatches(`${artifactDir}/**`, path) && /\.(?:cjs|js|mjs|ts|tsx)$/iu.test(path);
|
|
96
|
+
return isRunnerVisualProofCodeArtifactPath(file, input.config.reviewGates.visualProof.artifactDir);
|
|
148
97
|
});
|
|
149
98
|
}
|
|
150
|
-
function regexMatches(pattern, text) {
|
|
151
|
-
return new RegExp(pattern, 'iu').test(text);
|
|
152
|
-
}
|
|
153
|
-
function globMatches(pattern, path) {
|
|
154
|
-
const escaped = normalizePath(pattern)
|
|
155
|
-
.split('/')
|
|
156
|
-
.map((segment) => {
|
|
157
|
-
if (segment === '**') {
|
|
158
|
-
return '.*';
|
|
159
|
-
}
|
|
160
|
-
return segment
|
|
161
|
-
.replace(/[.+?^${}()|[\]\\]/g, '\\$&')
|
|
162
|
-
.replaceAll('*', '[^/]*');
|
|
163
|
-
})
|
|
164
|
-
.join('/');
|
|
165
|
-
return new RegExp(`^${escaped}$`).test(normalizePath(path));
|
|
166
|
-
}
|
|
167
|
-
function normalizePath(path) {
|
|
168
|
-
return path.replaceAll('\\', '/').replace(/^\.\//, '');
|
|
169
|
-
}
|
|
170
|
-
function changedPathCovers(changedPath, artifactPath) {
|
|
171
|
-
return changedPath === artifactPath || artifactPath.startsWith(changedPath.replace(/\/?$/, '/'));
|
|
172
|
-
}
|
|
173
99
|
//# sourceMappingURL=review-gates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-gates.js","sourceRoot":"","sources":["../../../src/runner/review-gates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"review-gates.js","sourceRoot":"","sources":["../../../src/runner/review-gates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../../src/runner/safety.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../../src/runner/safety.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAErE,MAAM,MAAM,mBAAmB,GAC3B,oBAAoB,GACpB,kBAAkB,GAClB,yBAAyB,GACzB,8BAA8B,GAC9B,6BAA6B,CAAC;AAElC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,uBAAuB,GAAG,eAAe,EAAE,CAQxG;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,sBAAsB,GAAG,eAAe,EAAE,CAKhG;AAED,wBAAgB,kCAAkC,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,CAU3G"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
+
import { findDeniedPathMatch } from '../path-policy.js';
|
|
1
2
|
/**
|
|
2
3
|
* Supports exact path literals, `*` within one path segment, and `**` across path segments.
|
|
3
4
|
*/
|
|
4
5
|
export function validateChangedPaths(paths, config) {
|
|
5
6
|
const patterns = [...config.deny.secretFiles, ...config.deny.additionalPathGlobs];
|
|
6
7
|
return paths.flatMap((path) => {
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
const matched = findDeniedPathMatch(path, patterns);
|
|
9
|
+
return matched
|
|
10
|
+
? [{ code: 'secret-file-change', message: `Changed path ${matched.path} matches denied pattern ${matched.pattern}` }]
|
|
11
|
+
: [];
|
|
10
12
|
});
|
|
11
13
|
}
|
|
12
14
|
export function validateCompletionReportSafety(report) {
|
|
@@ -26,21 +28,4 @@ export function validateNoAgentOwnedGitPublication(beforeHead, afterHead) {
|
|
|
26
28
|
}
|
|
27
29
|
return [];
|
|
28
30
|
}
|
|
29
|
-
function globMatches(pattern, path) {
|
|
30
|
-
const escaped = pattern
|
|
31
|
-
.split('/')
|
|
32
|
-
.map((segment) => {
|
|
33
|
-
if (segment === '**') {
|
|
34
|
-
return '.*';
|
|
35
|
-
}
|
|
36
|
-
return segment
|
|
37
|
-
.replace(/[.+?^${}()|[\]\\]/g, '\\$&')
|
|
38
|
-
.replaceAll('*', '[^/]*');
|
|
39
|
-
})
|
|
40
|
-
.join('/');
|
|
41
|
-
return new RegExp(`^${escaped}$`).test(path);
|
|
42
|
-
}
|
|
43
|
-
function normalizePath(path) {
|
|
44
|
-
return path.replaceAll('\\', '/').replace(/^\.\//, '');
|
|
45
|
-
}
|
|
46
31
|
//# sourceMappingURL=safety.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../../src/runner/safety.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../../src/runner/safety.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAexD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAe,EAAE,MAA+B;IACnF,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAClF,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpD,OAAO,OAAO;YACZ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,oBAA6B,EAAE,OAAO,EAAE,gBAAgB,OAAO,CAAC,IAAI,2BAA2B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9H,CAAC,CAAC,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,MAA8B;IAC3E,OAAO,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,WAAW;KAC5B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,UAAkB,EAAE,SAAiB;IACtF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO;YACL;gBACE,IAAI,EAAE,6BAA6B;gBACnC,OAAO,EAAE,+DAA+D;aACzE;SACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoped-auto-command.d.ts","sourceRoot":"","sources":["../../../src/runner/scoped-auto-command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAIzH,OAAO,KAAK,EAAe,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"scoped-auto-command.d.ts","sourceRoot":"","sources":["../../../src/runner/scoped-auto-command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAIzH,OAAO,KAAK,EAAe,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAwB,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAA+B,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAa/F,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,8BAA8B,CAAC;AAWtC,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IAC9C,GAAG,CAAC,EAAE,kBAAkB,CAAC;IACzB,YAAY,CAAC,EAAE;QAAE,GAAG,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;KAAE,CAAC;IACpF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB,CAAC,EAAE,2BAA2B,CAAC;IACjD,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,qBAAqB,CAAC;IAC3D,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAwN9G"}
|