tempo-agent 1.3.2 → 1.4.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/dist/cli/index.js +24 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/executor/aiClient.d.ts.map +1 -1
- package/dist/executor/aiClient.js +23 -1
- package/dist/executor/aiClient.js.map +1 -1
- package/dist/ideation/compile.d.ts +1 -1
- package/dist/ideation/compile.d.ts.map +1 -1
- package/dist/ideation/compile.js +57 -72
- package/dist/ideation/compile.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -36,6 +36,25 @@ function cmdInit() {
|
|
|
36
36
|
lintCommand: 'npm run lint',
|
|
37
37
|
}, null, 2), 'utf-8');
|
|
38
38
|
}
|
|
39
|
+
const secretsPath = path_1.default.join(tempoDir, '.env');
|
|
40
|
+
if (!fs_1.default.existsSync(secretsPath)) {
|
|
41
|
+
fs_1.default.writeFileSync(secretsPath, `# Tempo secrets — do not commit this file
|
|
42
|
+
# Add your API key below:
|
|
43
|
+
GEMINI_API_KEY=
|
|
44
|
+
`, 'utf-8');
|
|
45
|
+
}
|
|
46
|
+
// Ensure .tempo/.env is in the project's .gitignore
|
|
47
|
+
const gitignorePath = path_1.default.join(cwd, '.gitignore');
|
|
48
|
+
const gitignoreEntry = '.tempo/.env';
|
|
49
|
+
if (fs_1.default.existsSync(gitignorePath)) {
|
|
50
|
+
const existing = fs_1.default.readFileSync(gitignorePath, 'utf-8');
|
|
51
|
+
if (!existing.includes(gitignoreEntry)) {
|
|
52
|
+
fs_1.default.appendFileSync(gitignorePath, `\n${gitignoreEntry}\n`, 'utf-8');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
fs_1.default.writeFileSync(gitignorePath, `${gitignoreEntry}\n`, 'utf-8');
|
|
57
|
+
}
|
|
39
58
|
const globalContextPath = path_1.default.join(tempoDir, 'global-context.md');
|
|
40
59
|
if (!fs_1.default.existsSync(globalContextPath)) {
|
|
41
60
|
fs_1.default.writeFileSync(globalContextPath, `# Global Context
|
|
@@ -94,15 +113,16 @@ design principles, code style rules, and safety constraints.
|
|
|
94
113
|
`, 'utf-8');
|
|
95
114
|
}
|
|
96
115
|
console.log(chalk_1.default.green('✓ Initialized .tempo/ directory'));
|
|
116
|
+
console.log(chalk_1.default.blue(' .tempo/.env — API keys (gitignored)'));
|
|
97
117
|
console.log(chalk_1.default.blue(' .tempo/config.json — validation commands'));
|
|
98
118
|
console.log(chalk_1.default.blue(' .tempo/global-context.md — project rules injected into every prompt'));
|
|
99
119
|
console.log(chalk_1.default.blue(' .tempo/ideation/ — place your .md ideation files here'));
|
|
100
120
|
console.log(chalk_1.default.blue(' .tempo/scores/ — compiled score JSONs'));
|
|
101
121
|
console.log(chalk_1.default.blue(' .tempo/sessions/ — execution history per run'));
|
|
102
122
|
console.log('');
|
|
103
|
-
console.log(chalk_1.default.yellow('
|
|
123
|
+
console.log(chalk_1.default.yellow('Next: add your GEMINI_API_KEY to .tempo/.env'));
|
|
104
124
|
}
|
|
105
|
-
function cmdCompile(args) {
|
|
125
|
+
async function cmdCompile(args) {
|
|
106
126
|
const fileName = args[0];
|
|
107
127
|
if (!fileName) {
|
|
108
128
|
console.error(chalk_1.default.red('Usage: tempo compile <file>'));
|
|
@@ -112,7 +132,7 @@ function cmdCompile(args) {
|
|
|
112
132
|
? fileName
|
|
113
133
|
: path_1.default.join(cwd, '.tempo', 'ideation', fileName);
|
|
114
134
|
try {
|
|
115
|
-
const outPath = (0, compile_1.compileIdeation)(filePath, cwd);
|
|
135
|
+
const outPath = await (0, compile_1.compileIdeation)(filePath, cwd);
|
|
116
136
|
console.log(chalk_1.default.green(`✓ Score compiled → ${outPath}`));
|
|
117
137
|
}
|
|
118
138
|
catch (err) {
|
|
@@ -158,7 +178,7 @@ async function main() {
|
|
|
158
178
|
cmdInit();
|
|
159
179
|
break;
|
|
160
180
|
case 'compile':
|
|
161
|
-
cmdCompile(args);
|
|
181
|
+
await cmdCompile(args);
|
|
162
182
|
break;
|
|
163
183
|
case 'tune':
|
|
164
184
|
await (0, tune_1.tuneIdeation)(cwd);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;AAEA,4CAAoB;AACpB,gDAAwB;AACxB,kDAA0B;AAC1B,2CAA4C;AAC5C,2DAAwD;AACxD,iDAAsD;AACtD,2CAAgD;AAEhD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAE1B,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,sGAAsG,CAAC,CAAC;IACpH,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,OAAO;IACd,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAExD,YAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,YAAE,CAAC,aAAa,CACd,UAAU,EACV,IAAI,CAAC,SAAS,CACZ;YACE,WAAW,EAAE,UAAU;YACvB,YAAY,EAAE,eAAe;YAC7B,WAAW,EAAE,cAAc;SAC5B,EACD,IAAI,EACJ,CAAC,CACF,EACD,OAAO,CACR,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IACnE,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtC,YAAE,CAAC,aAAa,CACd,iBAAiB,EACjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDL,EACK,OAAO,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC,CAAC;IAClG,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiClient.d.ts","sourceRoot":"","sources":["../../src/executor/aiClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"aiClient.d.ts","sourceRoot":"","sources":["../../src/executor/aiClient.ts"],"names":[],"mappings":"AAyBA,wBAAsB,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqCtF"}
|
|
@@ -5,12 +5,34 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.callAI = callAI;
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
8
10
|
const GEMINI_MODEL = 'gemini-2.5-flash';
|
|
9
11
|
const GEMINI_API_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent`;
|
|
12
|
+
function loadTempoEnv() {
|
|
13
|
+
const envPath = path_1.default.join(process.cwd(), '.tempo', '.env');
|
|
14
|
+
if (!fs_1.default.existsSync(envPath))
|
|
15
|
+
return;
|
|
16
|
+
const lines = fs_1.default.readFileSync(envPath, 'utf-8').split('\n');
|
|
17
|
+
for (const line of lines) {
|
|
18
|
+
const trimmed = line.trim();
|
|
19
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
20
|
+
continue;
|
|
21
|
+
const eq = trimmed.indexOf('=');
|
|
22
|
+
if (eq === -1)
|
|
23
|
+
continue;
|
|
24
|
+
const key = trimmed.slice(0, eq).trim();
|
|
25
|
+
const value = trimmed.slice(eq + 1).trim();
|
|
26
|
+
if (key && !(key in process.env)) {
|
|
27
|
+
process.env[key] = value;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
10
31
|
async function callAI(systemPrompt, userPrompt) {
|
|
32
|
+
loadTempoEnv();
|
|
11
33
|
const apiKey = process.env.GEMINI_API_KEY;
|
|
12
34
|
if (!apiKey) {
|
|
13
|
-
throw new Error('GEMINI_API_KEY
|
|
35
|
+
throw new Error('GEMINI_API_KEY is not set. Add it to .tempo/.env (GEMINI_API_KEY=your-key) or set it as an environment variable.');
|
|
14
36
|
}
|
|
15
37
|
let response;
|
|
16
38
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiClient.js","sourceRoot":"","sources":["../../src/executor/aiClient.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"aiClient.js","sourceRoot":"","sources":["../../src/executor/aiClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function compileIdeation(filePath: string, cwd: string): string
|
|
1
|
+
export declare function compileIdeation(filePath: string, cwd: string): Promise<string>;
|
|
2
2
|
//# sourceMappingURL=compile.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/ideation/compile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/ideation/compile.ts"],"names":[],"mappings":"AAiCA,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4CpF"}
|
package/dist/ideation/compile.js
CHANGED
|
@@ -6,84 +6,69 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.compileIdeation = compileIdeation;
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
let currentSection = null;
|
|
24
|
-
const buffer = [];
|
|
25
|
-
function flush() {
|
|
26
|
-
if (!currentSection)
|
|
27
|
-
return;
|
|
28
|
-
const text = buffer.join('\n').trim();
|
|
29
|
-
if (currentSection === 'ideas') {
|
|
30
|
-
sections.ideas = text
|
|
31
|
-
.split('\n')
|
|
32
|
-
.map((l) => l.replace(/^[-*]\s*/, '').trim())
|
|
33
|
-
.filter(Boolean);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
sections[currentSection] = text;
|
|
37
|
-
}
|
|
38
|
-
buffer.length = 0;
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const aiClient_1 = require("../executor/aiClient");
|
|
11
|
+
const schema_1 = require("../spec/schema");
|
|
12
|
+
const SYSTEM_PROMPT = `You are a senior software architect and project planner. Analyze a markdown ideation document and produce a structured execution score as a valid JSON object.
|
|
13
|
+
|
|
14
|
+
The JSON must strictly follow this schema:
|
|
15
|
+
{
|
|
16
|
+
"goal": "<one concise sentence describing the overall feature objective>",
|
|
17
|
+
"constraints": ["<project constraints, rules, and technical boundaries the implementation must respect>"],
|
|
18
|
+
"steps": [
|
|
19
|
+
{
|
|
20
|
+
"id": 1,
|
|
21
|
+
"description": "<clear, actionable step description>",
|
|
22
|
+
"files_allowed": ["<file paths relative to project root that this step creates or modifies>"]
|
|
39
23
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
flush();
|
|
44
|
-
const heading = headingMatch[1].toLowerCase().trim();
|
|
45
|
-
currentSection = sectionMap[heading] ?? null;
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
buffer.push(line);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
flush();
|
|
52
|
-
return sections;
|
|
53
|
-
}
|
|
54
|
-
function buildSpec(parsed, name) {
|
|
55
|
-
const planLines = parsed.finalPlan.split('\n').filter(Boolean);
|
|
56
|
-
const steps = planLines
|
|
57
|
-
.map((line, i) => ({
|
|
58
|
-
id: i + 1,
|
|
59
|
-
description: line.replace(/^\d+[.)]\s*/, '').trim(),
|
|
60
|
-
files_allowed: [],
|
|
61
|
-
}))
|
|
62
|
-
.filter((s) => s.description.length > 0);
|
|
63
|
-
return {
|
|
64
|
-
goal: parsed.goal || name,
|
|
65
|
-
constraints: parsed.context
|
|
66
|
-
.split('\n')
|
|
67
|
-
.map((l) => l.replace(/^[-*]\s*/, '').trim())
|
|
68
|
-
.filter(Boolean),
|
|
69
|
-
steps: steps.length > 0
|
|
70
|
-
? steps
|
|
71
|
-
: [{ id: 1, description: parsed.finalPlan || 'Implement the plan', files_allowed: [] }],
|
|
72
|
-
tests: [],
|
|
73
|
-
definition_of_done: parsed.ideas,
|
|
74
|
-
};
|
|
24
|
+
],
|
|
25
|
+
"tests": ["<specific, verifiable test case descriptions>"],
|
|
26
|
+
"definition_of_done": ["<measurable acceptance criteria that must be true when the feature is complete>"]
|
|
75
27
|
}
|
|
76
|
-
|
|
28
|
+
|
|
29
|
+
Guidelines:
|
|
30
|
+
- Break the work into sequential, granular steps — each step should be a single focused unit of work
|
|
31
|
+
- Populate files_allowed with specific file paths (not directories) for each step
|
|
32
|
+
- tests must be concrete and verifiable (e.g. "GET /api/users returns 200 with a list of users")
|
|
33
|
+
- definition_of_done must be measurable outcomes (e.g. "All API endpoints return correct HTTP status codes")
|
|
34
|
+
- constraints should capture all technical rules, style requirements, and boundaries mentioned in the ideation
|
|
35
|
+
- Step IDs must be sequential integers starting from 1
|
|
36
|
+
|
|
37
|
+
Respond ONLY with the raw JSON object. No explanations, no markdown code fences, no extra text.`;
|
|
38
|
+
async function compileIdeation(filePath, cwd) {
|
|
77
39
|
if (!fs_1.default.existsSync(filePath)) {
|
|
78
40
|
throw new Error(`File not found: ${filePath}`);
|
|
79
41
|
}
|
|
80
|
-
const content = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
42
|
+
const content = fs_1.default.readFileSync(filePath, 'utf-8').trim();
|
|
81
43
|
const name = path_1.default.basename(filePath, path_1.default.extname(filePath));
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
44
|
+
console.log(chalk_1.default.bold(`\nCompiling: ${path_1.default.basename(filePath)}`));
|
|
45
|
+
let aiResponse;
|
|
46
|
+
try {
|
|
47
|
+
aiResponse = await (0, aiClient_1.callAI)(SYSTEM_PROMPT, `Here is the ideation document:\n\n${content}`);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
throw new Error(`AI call failed: ${err.message}`);
|
|
51
|
+
}
|
|
52
|
+
// Strip markdown code fences if present (```json ... ```)
|
|
53
|
+
const jsonText = aiResponse
|
|
54
|
+
.replace(/^```(?:json)?\s*/i, '')
|
|
55
|
+
.replace(/\s*```\s*$/, '')
|
|
56
|
+
.trim();
|
|
57
|
+
let raw;
|
|
58
|
+
try {
|
|
59
|
+
raw = JSON.parse(jsonText);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
throw new Error(`AI returned invalid JSON. Response:\n${jsonText.slice(0, 500)}`);
|
|
63
|
+
}
|
|
64
|
+
const parsed = schema_1.SpecSchema.safeParse(raw);
|
|
65
|
+
if (!parsed.success) {
|
|
66
|
+
throw new Error(`AI response does not match score schema:\n${JSON.stringify(parsed.error.format(), null, 2)}`);
|
|
67
|
+
}
|
|
68
|
+
const spec = parsed.data;
|
|
69
|
+
const scoresDir = path_1.default.join(cwd, '.tempo', 'scores');
|
|
70
|
+
fs_1.default.mkdirSync(scoresDir, { recursive: true });
|
|
71
|
+
const outPath = path_1.default.join(scoresDir, `${name}.json`);
|
|
87
72
|
fs_1.default.writeFileSync(outPath, JSON.stringify(spec, null, 2), 'utf-8');
|
|
88
73
|
return outPath;
|
|
89
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/ideation/compile.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/ideation/compile.ts"],"names":[],"mappings":";;;;;AAiCA,0CA4CC;AA7ED,4CAAoB;AACpB,gDAAwB;AACxB,kDAA0B;AAC1B,mDAA8C;AAC9C,2CAAkD;AAElD,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;gGAyB0E,CAAC;AAE1F,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,GAAW;IACjE,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,IAAI,GAAG,cAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE7D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,cAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnE,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,IAAA,iBAAM,EAAC,aAAa,EAAE,qCAAqC,OAAO,EAAE,CAAC,CAAC;IAC3F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mBAAoB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,UAAU;SACxB,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;SACzB,IAAI,EAAE,CAAC;IAEV,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,MAAM,GAAG,mBAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACjH,CAAC;IAED,MAAM,IAAI,GAAS,MAAM,CAAC,IAAI,CAAC;IAE/B,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrD,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IACrD,YAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAElE,OAAO,OAAO,CAAC;AACjB,CAAC"}
|