mcp-adr-analysis-server 2.3.0 → 2.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/dist/.tsbuildinfo +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +140 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/resources/release-history-resource.d.ts +11 -0
- package/dist/src/resources/release-history-resource.d.ts.map +1 -0
- package/dist/src/resources/release-history-resource.js +63 -0
- package/dist/src/resources/release-history-resource.js.map +1 -0
- package/dist/src/tools/release-tracking-tool.d.ts +19 -0
- package/dist/src/tools/release-tracking-tool.d.ts.map +1 -0
- package/dist/src/tools/release-tracking-tool.js +528 -0
- package/dist/src/tools/release-tracking-tool.js.map +1 -0
- package/dist/src/tools/tool-catalog.d.ts.map +1 -1
- package/dist/src/tools/tool-catalog.js +43 -0
- package/dist/src/tools/tool-catalog.js.map +1 -1
- package/dist/src/types/tool-arguments.d.ts +20 -0
- package/dist/src/types/tool-arguments.d.ts.map +1 -1
- package/dist/src/utils/release-tracker.d.ts +137 -0
- package/dist/src/utils/release-tracker.d.ts.map +1 -0
- package/dist/src/utils/release-tracker.js +626 -0
- package/dist/src/utils/release-tracker.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release History Resource
|
|
3
|
+
* Provides read-only access to release tracking state including
|
|
4
|
+
* releases, ADR mappings, milestones, and tracking metadata.
|
|
5
|
+
*/
|
|
6
|
+
import { ResourceGenerationResult } from './index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generate release history resource content
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateReleaseHistoryResource(projectPath: string, _searchParams?: URLSearchParams): Promise<ResourceGenerationResult>;
|
|
11
|
+
//# sourceMappingURL=release-history-resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-history-resource.d.ts","sourceRoot":"","sources":["../../../src/resources/release-history-resource.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAGtD;;GAEG;AACH,wBAAsB,8BAA8B,CAClD,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,eAAe,GAC9B,OAAO,CAAC,wBAAwB,CAAC,CAwDnC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release History Resource
|
|
3
|
+
* Provides read-only access to release tracking state including
|
|
4
|
+
* releases, ADR mappings, milestones, and tracking metadata.
|
|
5
|
+
*/
|
|
6
|
+
import { McpAdrError } from '../types/index.js';
|
|
7
|
+
import { generateETag } from './resource-cache.js';
|
|
8
|
+
import { loadTrackingState } from '../utils/release-tracker.js';
|
|
9
|
+
/**
|
|
10
|
+
* Generate release history resource content
|
|
11
|
+
*/
|
|
12
|
+
export async function generateReleaseHistoryResource(projectPath, _searchParams) {
|
|
13
|
+
try {
|
|
14
|
+
const state = loadTrackingState(projectPath);
|
|
15
|
+
const data = state
|
|
16
|
+
? {
|
|
17
|
+
projectType: state.projectType,
|
|
18
|
+
detectedPhase: state.detectedPhase,
|
|
19
|
+
totalReleases: state.releases.length,
|
|
20
|
+
releases: state.releases.map(r => ({
|
|
21
|
+
version: r.version,
|
|
22
|
+
date: r.date,
|
|
23
|
+
source: r.source,
|
|
24
|
+
adrCount: r.adrs.length,
|
|
25
|
+
featureCount: r.features.length,
|
|
26
|
+
bugfixCount: r.bugfixes.length,
|
|
27
|
+
breakingChangeCount: r.breakingChanges.length,
|
|
28
|
+
adrs: r.adrs.map(a => ({
|
|
29
|
+
filename: a.adrFilename,
|
|
30
|
+
title: a.adrTitle,
|
|
31
|
+
status: a.adrStatus,
|
|
32
|
+
changeType: a.changeType,
|
|
33
|
+
confidence: a.confidence,
|
|
34
|
+
mappingMethod: a.mappingMethod,
|
|
35
|
+
})),
|
|
36
|
+
})),
|
|
37
|
+
unmappedAdrs: state.unmappedAdrs,
|
|
38
|
+
milestones: state.milestones,
|
|
39
|
+
lastScanTimestamp: state.lastScanTimestamp,
|
|
40
|
+
}
|
|
41
|
+
: {
|
|
42
|
+
message: 'No release tracking data available. Run release_tracking with detect_releases first.',
|
|
43
|
+
projectType: 'unknown',
|
|
44
|
+
totalReleases: 0,
|
|
45
|
+
releases: [],
|
|
46
|
+
unmappedAdrs: [],
|
|
47
|
+
milestones: [],
|
|
48
|
+
};
|
|
49
|
+
const cacheKey = `release_history:${projectPath}`;
|
|
50
|
+
return {
|
|
51
|
+
data,
|
|
52
|
+
contentType: 'application/json',
|
|
53
|
+
lastModified: new Date().toISOString(),
|
|
54
|
+
cacheKey,
|
|
55
|
+
ttl: 60,
|
|
56
|
+
etag: generateETag(data),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
throw new McpAdrError(`Failed to generate release history resource: ${error instanceof Error ? error.message : String(error)}`, 'RESOURCE_ERROR');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=release-history-resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-history-resource.js","sourceRoot":"","sources":["../../../src/resources/release-history-resource.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,WAAmB,EACnB,aAA+B;IAE/B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAE7C,MAAM,IAAI,GAAG,KAAK;YAChB,CAAC,CAAC;gBACE,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;gBACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACjC,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM;oBACvB,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM;oBAC/B,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM;oBAC9B,mBAAmB,EAAE,CAAC,CAAC,eAAe,CAAC,MAAM;oBAC7C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACrB,QAAQ,EAAE,CAAC,CAAC,WAAW;wBACvB,KAAK,EAAE,CAAC,CAAC,QAAQ;wBACjB,MAAM,EAAE,CAAC,CAAC,SAAS;wBACnB,UAAU,EAAE,CAAC,CAAC,UAAU;wBACxB,UAAU,EAAE,CAAC,CAAC,UAAU;wBACxB,aAAa,EAAE,CAAC,CAAC,aAAa;qBAC/B,CAAC,CAAC;iBACJ,CAAC,CAAC;gBACH,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;aAC3C;YACH,CAAC,CAAC;gBACE,OAAO,EACL,sFAAsF;gBACxF,WAAW,EAAE,SAAS;gBACtB,aAAa,EAAE,CAAC;gBAChB,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,EAAE;aACf,CAAC;QAEN,MAAM,QAAQ,GAAG,mBAAmB,WAAW,EAAE,CAAC;QAElD,OAAO;YACL,IAAI;YACJ,WAAW,EAAE,kBAAkB;YAC/B,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACtC,QAAQ;YACR,GAAG,EAAE,EAAE;YACP,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;SACzB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CACnB,gDAAgD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACxG,gBAAgB,CACjB,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release Tracking Tool
|
|
3
|
+
*
|
|
4
|
+
* MCP tool for tracking releases mapped to ADRs, generating changelogs,
|
|
5
|
+
* managing milestones, and assessing release readiness.
|
|
6
|
+
* Supports both greenfield and brownfield applications.
|
|
7
|
+
*
|
|
8
|
+
* IMPORTANT FOR AI ASSISTANTS: This tool provides:
|
|
9
|
+
* 1. Release Detection: Discovers releases from git tags and GitHub Releases
|
|
10
|
+
* 2. ADR-to-Release Mapping: Three-pass mapping with confidence scoring
|
|
11
|
+
* 3. Changelog Generation: Keep a Changelog format with ADR sections
|
|
12
|
+
* 4. Milestone Management: Tracks milestones linked to ADRs and tasks
|
|
13
|
+
* 5. Release Comparison: Diffs ADR changes between releases
|
|
14
|
+
* 6. Next Release Preview: Shows unreleased work with readiness scoring
|
|
15
|
+
* 7. GitHub Integration: Creates GitHub Releases and Milestones
|
|
16
|
+
* 8. Persistence: Writes CHANGELOG.md, updates TODO.md
|
|
17
|
+
*/
|
|
18
|
+
export declare function releaseTracking(args: Record<string, unknown>): Promise<any>;
|
|
19
|
+
//# sourceMappingURL=release-tracking-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-tracking-tool.d.ts","sourceRoot":"","sources":["../../../src/tools/release-tracking-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAiFH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAgDjF"}
|
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release Tracking Tool
|
|
3
|
+
*
|
|
4
|
+
* MCP tool for tracking releases mapped to ADRs, generating changelogs,
|
|
5
|
+
* managing milestones, and assessing release readiness.
|
|
6
|
+
* Supports both greenfield and brownfield applications.
|
|
7
|
+
*
|
|
8
|
+
* IMPORTANT FOR AI ASSISTANTS: This tool provides:
|
|
9
|
+
* 1. Release Detection: Discovers releases from git tags and GitHub Releases
|
|
10
|
+
* 2. ADR-to-Release Mapping: Three-pass mapping with confidence scoring
|
|
11
|
+
* 3. Changelog Generation: Keep a Changelog format with ADR sections
|
|
12
|
+
* 4. Milestone Management: Tracks milestones linked to ADRs and tasks
|
|
13
|
+
* 5. Release Comparison: Diffs ADR changes between releases
|
|
14
|
+
* 6. Next Release Preview: Shows unreleased work with readiness scoring
|
|
15
|
+
* 7. GitHub Integration: Creates GitHub Releases and Milestones
|
|
16
|
+
* 8. Persistence: Writes CHANGELOG.md, updates TODO.md
|
|
17
|
+
*/
|
|
18
|
+
import { z } from 'zod';
|
|
19
|
+
import { McpAdrError } from '../types/index.js';
|
|
20
|
+
import { validateMcpResponse } from '../utils/mcp-response-validator.js';
|
|
21
|
+
import { jsonSafeError } from '../utils/json-safe.js';
|
|
22
|
+
import { detectReleases, detectProjectType, mapAdrsToReleases, generateChangelog, writeChangelog, compareReleases, buildMilestoneMap, createGitHubRelease, syncGitHubMilestone, updateTodoMilestones, previewNextRelease, saveTrackingState, } from '../utils/release-tracker.js';
|
|
23
|
+
// ─── Schema ────────────────────────────────────────────────────────
|
|
24
|
+
const ReleaseTrackingSchema = z.object({
|
|
25
|
+
operation: z
|
|
26
|
+
.enum([
|
|
27
|
+
'detect_releases',
|
|
28
|
+
'track_release',
|
|
29
|
+
'generate_changelog',
|
|
30
|
+
'compare_releases',
|
|
31
|
+
'release_summary',
|
|
32
|
+
'next_release_preview',
|
|
33
|
+
'create_milestone',
|
|
34
|
+
'sync_milestones',
|
|
35
|
+
])
|
|
36
|
+
.describe('Operation to perform'),
|
|
37
|
+
projectPath: z.string().optional().describe('Project root path'),
|
|
38
|
+
// For track_release
|
|
39
|
+
version: z.string().optional().describe('Release version to track (e.g., v2.3.0)'),
|
|
40
|
+
// For compare_releases
|
|
41
|
+
compareFrom: z.string().optional().describe('Starting version for comparison'),
|
|
42
|
+
compareTo: z.string().optional().describe('Ending version for comparison'),
|
|
43
|
+
// For generate_changelog
|
|
44
|
+
format: z
|
|
45
|
+
.enum(['markdown', 'keep-a-changelog', 'conventional'])
|
|
46
|
+
.default('keep-a-changelog')
|
|
47
|
+
.describe('Changelog output format'),
|
|
48
|
+
includeAdrLinks: z.boolean().default(true).describe('Include ADR references in changelog'),
|
|
49
|
+
includeCommitHashes: z.boolean().default(false).describe('Include commit hashes'),
|
|
50
|
+
groupByAdr: z.boolean().default(false).describe('Group changelog entries by ADR'),
|
|
51
|
+
writeToFile: z.boolean().default(false).describe('Write CHANGELOG.md to repo'),
|
|
52
|
+
// For release_summary and next_release_preview
|
|
53
|
+
includeReadiness: z.boolean().default(true).describe('Include release readiness score'),
|
|
54
|
+
includeTimeline: z.boolean().default(true).describe('Include mermaid timeline diagram'),
|
|
55
|
+
// For create_milestone
|
|
56
|
+
milestoneTitle: z.string().optional().describe('GitHub milestone title'),
|
|
57
|
+
milestoneDescription: z.string().optional().describe('GitHub milestone description'),
|
|
58
|
+
milestoneDueDate: z.string().optional().describe('Milestone due date (YYYY-MM-DD)'),
|
|
59
|
+
// For GitHub integration
|
|
60
|
+
createGithubRelease: z
|
|
61
|
+
.boolean()
|
|
62
|
+
.default(false)
|
|
63
|
+
.describe('Create a GitHub Release (requires gh CLI)'),
|
|
64
|
+
syncGithubMilestones: z
|
|
65
|
+
.boolean()
|
|
66
|
+
.default(false)
|
|
67
|
+
.describe('Sync milestones to GitHub (requires gh CLI)'),
|
|
68
|
+
updateTodo: z.boolean().default(false).describe('Update TODO.md with milestone status'),
|
|
69
|
+
});
|
|
70
|
+
// ─── Main Export ───────────────────────────────────────────────────
|
|
71
|
+
export async function releaseTracking(args) {
|
|
72
|
+
try {
|
|
73
|
+
const validatedArgs = ReleaseTrackingSchema.parse(args);
|
|
74
|
+
const projectPath = validatedArgs.projectPath || process.cwd();
|
|
75
|
+
// Discover ADRs
|
|
76
|
+
const { discoverAdrsInDirectory } = await import('../utils/adr-discovery.js');
|
|
77
|
+
const adrDirectory = process.env['ADR_DIRECTORY'] || 'docs/adrs';
|
|
78
|
+
const discoveryResult = await discoverAdrsInDirectory(adrDirectory, projectPath, {
|
|
79
|
+
includeContent: false,
|
|
80
|
+
includeTimeline: false,
|
|
81
|
+
});
|
|
82
|
+
const adrs = discoveryResult.adrs;
|
|
83
|
+
switch (validatedArgs.operation) {
|
|
84
|
+
case 'detect_releases':
|
|
85
|
+
return await handleDetectReleases(projectPath, adrs);
|
|
86
|
+
case 'track_release':
|
|
87
|
+
return await handleTrackRelease(projectPath, adrs, validatedArgs);
|
|
88
|
+
case 'generate_changelog':
|
|
89
|
+
return await handleGenerateChangelog(projectPath, adrs, validatedArgs);
|
|
90
|
+
case 'compare_releases':
|
|
91
|
+
return await handleCompareReleases(projectPath, adrs, validatedArgs);
|
|
92
|
+
case 'release_summary':
|
|
93
|
+
return await handleReleaseSummary(projectPath, adrs, validatedArgs);
|
|
94
|
+
case 'next_release_preview':
|
|
95
|
+
return await handleNextReleasePreview(projectPath, adrs, validatedArgs);
|
|
96
|
+
case 'create_milestone':
|
|
97
|
+
return await handleCreateMilestone(projectPath, validatedArgs);
|
|
98
|
+
case 'sync_milestones':
|
|
99
|
+
return await handleSyncMilestones(projectPath, adrs, validatedArgs);
|
|
100
|
+
default:
|
|
101
|
+
throw new McpAdrError('INVALID_ARGS', `Unknown operation: ${validatedArgs.operation}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
throw new McpAdrError('RELEASE_TRACKING_ERROR', `Release tracking failed: ${jsonSafeError(error)}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// ─── Operation Handlers ────────────────────────────────────────────
|
|
109
|
+
async function handleDetectReleases(projectPath, adrs) {
|
|
110
|
+
const releases = await detectReleases(projectPath);
|
|
111
|
+
const { projectType, phase } = await detectProjectType(projectPath, adrs.length);
|
|
112
|
+
if (releases.length === 0) {
|
|
113
|
+
return validateMcpResponse({
|
|
114
|
+
content: [
|
|
115
|
+
{
|
|
116
|
+
type: 'text',
|
|
117
|
+
text: `# Release Detection - ${projectType === 'greenfield' ? 'Greenfield' : 'Brownfield'} Project
|
|
118
|
+
|
|
119
|
+
## No Releases Detected
|
|
120
|
+
|
|
121
|
+
**Project Type**: ${projectType}
|
|
122
|
+
**Project Phase**: ${phase}
|
|
123
|
+
**ADRs Found**: ${adrs.length}
|
|
124
|
+
|
|
125
|
+
### Getting Started with Release Tracking
|
|
126
|
+
|
|
127
|
+
${projectType === 'greenfield'
|
|
128
|
+
? `This appears to be a new project. To start tracking releases:
|
|
129
|
+
|
|
130
|
+
1. **Tag your first release**: \`git tag v0.1.0\`
|
|
131
|
+
2. **Create ADRs** to document architectural decisions
|
|
132
|
+
3. **Set up TODO.md** with milestone structure
|
|
133
|
+
4. Re-run \`release_tracking\` with \`detect_releases\` to see your releases mapped to ADRs`
|
|
134
|
+
: `This project has existing history but no semver tags. To start:
|
|
135
|
+
|
|
136
|
+
1. **Tag your current state**: \`git tag v1.0.0\`
|
|
137
|
+
2. **Run \`generate_changelog\`** to create a CHANGELOG.md
|
|
138
|
+
3. **Run \`sync_milestones\`** to map ADRs to milestones`}
|
|
139
|
+
|
|
140
|
+
### ADR Summary
|
|
141
|
+
${adrs.length > 0 ? adrs.map((a) => `- **${a.title}**: ${a.status}`).join('\n') : 'No ADRs found. Consider creating architectural decision records.'}`,
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
// Map ADRs to releases
|
|
147
|
+
const { mappedReleases, unmappedAdrs } = await mapAdrsToReleases(adrs, releases, projectPath);
|
|
148
|
+
// Save state
|
|
149
|
+
const state = {
|
|
150
|
+
projectType,
|
|
151
|
+
detectedPhase: phase,
|
|
152
|
+
releases: mappedReleases,
|
|
153
|
+
unmappedAdrs,
|
|
154
|
+
milestones: [],
|
|
155
|
+
lastScanTimestamp: new Date().toISOString(),
|
|
156
|
+
};
|
|
157
|
+
saveTrackingState(projectPath, state);
|
|
158
|
+
return validateMcpResponse({
|
|
159
|
+
content: [
|
|
160
|
+
{
|
|
161
|
+
type: 'text',
|
|
162
|
+
text: `# Release Detection Results
|
|
163
|
+
|
|
164
|
+
**Project Type**: ${projectType}
|
|
165
|
+
**Project Phase**: ${phase}
|
|
166
|
+
**Releases Found**: ${mappedReleases.length}
|
|
167
|
+
**ADRs Found**: ${adrs.length}
|
|
168
|
+
**Unmapped ADRs**: ${unmappedAdrs.length}
|
|
169
|
+
|
|
170
|
+
## Releases
|
|
171
|
+
|
|
172
|
+
${mappedReleases
|
|
173
|
+
.map(r => `### ${r.version} (${r.date.split('T')[0]})
|
|
174
|
+
- **Features**: ${r.features.length}
|
|
175
|
+
- **Bug Fixes**: ${r.bugfixes.length}
|
|
176
|
+
- **Breaking Changes**: ${r.breakingChanges.length}
|
|
177
|
+
- **Linked ADRs**: ${r.adrs.length}
|
|
178
|
+
${r.adrs.map(a => ` - ${a.adrTitle} (${a.mappingMethod}, ${(a.confidence * 100).toFixed(0)}% confidence)`).join('\n')}`)
|
|
179
|
+
.join('\n\n')}
|
|
180
|
+
|
|
181
|
+
${unmappedAdrs.length > 0
|
|
182
|
+
? `## Unmapped ADRs
|
|
183
|
+
These ADRs are not linked to any release:
|
|
184
|
+
${unmappedAdrs.map(a => `- ${a}`).join('\n')}
|
|
185
|
+
|
|
186
|
+
Consider using \`track_release\` to manually link them.`
|
|
187
|
+
: ''}`,
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
async function handleTrackRelease(projectPath, adrs, args) {
|
|
193
|
+
if (!args.version) {
|
|
194
|
+
throw new McpAdrError('INVALID_ARGS', 'Version is required for track_release operation');
|
|
195
|
+
}
|
|
196
|
+
const releases = await detectReleases(projectPath);
|
|
197
|
+
const { mappedReleases } = await mapAdrsToReleases(adrs, releases, projectPath);
|
|
198
|
+
const targetRelease = mappedReleases.find(r => r.version === args.version);
|
|
199
|
+
if (!targetRelease) {
|
|
200
|
+
return validateMcpResponse({
|
|
201
|
+
content: [
|
|
202
|
+
{
|
|
203
|
+
type: 'text',
|
|
204
|
+
text: `# Release Not Found: ${args.version}
|
|
205
|
+
|
|
206
|
+
Available releases: ${releases.map(r => r.version).join(', ') || 'None'}
|
|
207
|
+
|
|
208
|
+
To create this release, first tag it: \`git tag ${args.version}\``,
|
|
209
|
+
},
|
|
210
|
+
],
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
// Create GitHub Release if requested
|
|
214
|
+
let githubReleaseInfo = '';
|
|
215
|
+
if (args.createGithubRelease) {
|
|
216
|
+
const releaseNotes = generateReleaseNotes(targetRelease);
|
|
217
|
+
const result = createGitHubRelease(projectPath, args.version, releaseNotes);
|
|
218
|
+
githubReleaseInfo = result.success
|
|
219
|
+
? `\n### GitHub Release\n- Created: ${result.url}`
|
|
220
|
+
: `\n### GitHub Release\n- Failed: ${result.error}`;
|
|
221
|
+
}
|
|
222
|
+
// Update TODO.md if requested
|
|
223
|
+
if (args.updateTodo) {
|
|
224
|
+
const milestones = await buildMilestoneMap(adrs, projectPath);
|
|
225
|
+
updateTodoMilestones(projectPath, milestones, adrs);
|
|
226
|
+
}
|
|
227
|
+
return validateMcpResponse({
|
|
228
|
+
content: [
|
|
229
|
+
{
|
|
230
|
+
type: 'text',
|
|
231
|
+
text: `# Release Tracked: ${args.version}
|
|
232
|
+
|
|
233
|
+
**Date**: ${targetRelease.date.split('T')[0]}
|
|
234
|
+
**Linked ADRs**: ${targetRelease.adrs.length}
|
|
235
|
+
**Features**: ${targetRelease.features.length}
|
|
236
|
+
**Bug Fixes**: ${targetRelease.bugfixes.length}
|
|
237
|
+
**Breaking Changes**: ${targetRelease.breakingChanges.length}
|
|
238
|
+
|
|
239
|
+
## ADR Mappings
|
|
240
|
+
${targetRelease.adrs.length > 0
|
|
241
|
+
? targetRelease.adrs
|
|
242
|
+
.map(a => `- **${a.adrTitle}** (${a.adrFilename})
|
|
243
|
+
- Change Type: ${a.changeType}
|
|
244
|
+
- Mapping Method: ${a.mappingMethod}
|
|
245
|
+
- Confidence: ${(a.confidence * 100).toFixed(0)}%`)
|
|
246
|
+
.join('\n')
|
|
247
|
+
: 'No ADRs linked to this release.'}
|
|
248
|
+
${githubReleaseInfo}`,
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
async function handleGenerateChangelog(projectPath, adrs, args) {
|
|
254
|
+
const releases = await detectReleases(projectPath);
|
|
255
|
+
const { mappedReleases } = await mapAdrsToReleases(adrs, releases, projectPath);
|
|
256
|
+
const options = {
|
|
257
|
+
format: args.format,
|
|
258
|
+
includeAdrLinks: args.includeAdrLinks,
|
|
259
|
+
includeCommitHashes: args.includeCommitHashes,
|
|
260
|
+
groupByAdr: args.groupByAdr,
|
|
261
|
+
};
|
|
262
|
+
const changelogContent = generateChangelog(mappedReleases, options);
|
|
263
|
+
if (args.writeToFile) {
|
|
264
|
+
writeChangelog(projectPath, changelogContent);
|
|
265
|
+
}
|
|
266
|
+
return validateMcpResponse({
|
|
267
|
+
content: [
|
|
268
|
+
{
|
|
269
|
+
type: 'text',
|
|
270
|
+
text: `# Changelog Generated
|
|
271
|
+
|
|
272
|
+
**Releases**: ${mappedReleases.length}
|
|
273
|
+
**Format**: ${args.format}
|
|
274
|
+
${args.writeToFile ? '**Written to**: CHANGELOG.md' : '**Preview mode** (use writeToFile: true to save)'}
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
${changelogContent}`,
|
|
279
|
+
},
|
|
280
|
+
],
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
async function handleCompareReleases(projectPath, adrs, args) {
|
|
284
|
+
if (!args.compareFrom || !args.compareTo) {
|
|
285
|
+
throw new McpAdrError('INVALID_ARGS', 'compareFrom and compareTo are required for compare_releases operation');
|
|
286
|
+
}
|
|
287
|
+
const releases = await detectReleases(projectPath);
|
|
288
|
+
const { mappedReleases } = await mapAdrsToReleases(adrs, releases, projectPath);
|
|
289
|
+
const comparison = compareReleases(mappedReleases, args.compareFrom, args.compareTo);
|
|
290
|
+
return validateMcpResponse({
|
|
291
|
+
content: [
|
|
292
|
+
{
|
|
293
|
+
type: 'text',
|
|
294
|
+
text: `# Release Comparison: ${args.compareFrom} -> ${args.compareTo}
|
|
295
|
+
|
|
296
|
+
## ADR Changes
|
|
297
|
+
- **Added**: ${comparison.addedAdrs.length}
|
|
298
|
+
- **Modified**: ${comparison.modifiedAdrs.length}
|
|
299
|
+
- **Deprecated**: ${comparison.deprecatedAdrs.length}
|
|
300
|
+
|
|
301
|
+
${comparison.addedAdrs.length > 0
|
|
302
|
+
? `### New ADRs
|
|
303
|
+
${comparison.addedAdrs.map(a => `- ${a.adrTitle} (${a.adrFilename})`).join('\n')}`
|
|
304
|
+
: ''}
|
|
305
|
+
|
|
306
|
+
${comparison.modifiedAdrs.length > 0
|
|
307
|
+
? `### Modified ADRs
|
|
308
|
+
${comparison.modifiedAdrs.map(a => `- ${a.adrTitle} (${a.adrFilename})`).join('\n')}`
|
|
309
|
+
: ''}
|
|
310
|
+
|
|
311
|
+
${comparison.deprecatedAdrs.length > 0
|
|
312
|
+
? `### Deprecated ADRs
|
|
313
|
+
${comparison.deprecatedAdrs.map(a => `- ${a.adrTitle} (${a.adrFilename})`).join('\n')}`
|
|
314
|
+
: ''}
|
|
315
|
+
|
|
316
|
+
## Code Changes
|
|
317
|
+
- **New Features**: ${comparison.featuresDelta.length}
|
|
318
|
+
- **Bug Fixes**: ${comparison.bugfixesDelta.length}
|
|
319
|
+
- **Breaking Changes**: ${comparison.breakingChangesDelta.length}
|
|
320
|
+
|
|
321
|
+
${comparison.featuresDelta.length > 0 ? `### Features\n${comparison.featuresDelta.map(f => `- ${f}`).join('\n')}` : ''}
|
|
322
|
+
${comparison.bugfixesDelta.length > 0 ? `### Bug Fixes\n${comparison.bugfixesDelta.map(f => `- ${f}`).join('\n')}` : ''}
|
|
323
|
+
${comparison.breakingChangesDelta.length > 0 ? `### Breaking Changes\n${comparison.breakingChangesDelta.map(c => `- ${c}`).join('\n')}` : ''}`,
|
|
324
|
+
},
|
|
325
|
+
],
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
async function handleReleaseSummary(projectPath, adrs, args) {
|
|
329
|
+
const releases = await detectReleases(projectPath);
|
|
330
|
+
const { projectType, phase } = await detectProjectType(projectPath, adrs.length);
|
|
331
|
+
const { mappedReleases, unmappedAdrs } = await mapAdrsToReleases(adrs, releases, projectPath);
|
|
332
|
+
const milestones = args.includeReadiness ? await buildMilestoneMap(adrs, projectPath) : [];
|
|
333
|
+
let timelineDiagram = '';
|
|
334
|
+
if (args.includeTimeline && mappedReleases.length > 0) {
|
|
335
|
+
timelineDiagram = generateMermaidTimeline(mappedReleases);
|
|
336
|
+
}
|
|
337
|
+
return validateMcpResponse({
|
|
338
|
+
content: [
|
|
339
|
+
{
|
|
340
|
+
type: 'text',
|
|
341
|
+
text: `# Release Summary
|
|
342
|
+
|
|
343
|
+
**Project Type**: ${projectType}
|
|
344
|
+
**Project Phase**: ${phase}
|
|
345
|
+
**Total Releases**: ${mappedReleases.length}
|
|
346
|
+
**Total ADRs**: ${adrs.length}
|
|
347
|
+
**Unmapped ADRs**: ${unmappedAdrs.length}
|
|
348
|
+
|
|
349
|
+
## Release History
|
|
350
|
+
${mappedReleases.length > 0
|
|
351
|
+
? mappedReleases
|
|
352
|
+
.map(r => `| ${r.version} | ${r.date.split('T')[0]} | ${r.features.length} features | ${r.bugfixes.length} fixes | ${r.adrs.length} ADRs |`)
|
|
353
|
+
.join('\n| Version | Date | Features | Fixes | ADRs |\n|---------|------|----------|-------|------|\n')
|
|
354
|
+
: 'No releases found.'}
|
|
355
|
+
|
|
356
|
+
${milestones.length > 0
|
|
357
|
+
? `## Milestone Status
|
|
358
|
+
${milestones
|
|
359
|
+
.map(m => `- **${m.name}**: ${(m.completionRate * 100).toFixed(0)}% complete (${m.completed}/${m.total})${m.criticalTodos > 0 ? ` - ${m.criticalTodos} blockers` : ''}`)
|
|
360
|
+
.join('\n')}`
|
|
361
|
+
: ''}
|
|
362
|
+
|
|
363
|
+
${timelineDiagram ? `## Release Timeline\n\n${timelineDiagram}` : ''}
|
|
364
|
+
|
|
365
|
+
${unmappedAdrs.length > 0
|
|
366
|
+
? `## Unmapped ADRs
|
|
367
|
+
${unmappedAdrs.map(a => `- ${a}`).join('\n')}`
|
|
368
|
+
: ''}`,
|
|
369
|
+
},
|
|
370
|
+
],
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
async function handleNextReleasePreview(projectPath, adrs, _args) {
|
|
374
|
+
const releases = await detectReleases(projectPath);
|
|
375
|
+
const { mappedReleases } = await mapAdrsToReleases(adrs, releases, projectPath);
|
|
376
|
+
const preview = await previewNextRelease(projectPath, adrs, mappedReleases);
|
|
377
|
+
return validateMcpResponse({
|
|
378
|
+
content: [
|
|
379
|
+
{
|
|
380
|
+
type: 'text',
|
|
381
|
+
text: `# Next Release Preview
|
|
382
|
+
|
|
383
|
+
**Suggested Version Bump**: ${preview.suggestedVersion}
|
|
384
|
+
**Unreleased Commits**: ${preview.unreleaseCommits.length}
|
|
385
|
+
**Pending ADRs**: ${preview.pendingAdrs.length}
|
|
386
|
+
|
|
387
|
+
## Release Readiness
|
|
388
|
+
${preview.readiness.summary}
|
|
389
|
+
|
|
390
|
+
## Unreleased Changes
|
|
391
|
+
${preview.unreleaseCommits.length > 0
|
|
392
|
+
? preview.unreleaseCommits
|
|
393
|
+
.slice(0, 20)
|
|
394
|
+
.map(c => `- ${c}`)
|
|
395
|
+
.join('\n')
|
|
396
|
+
: 'No unreleased commits.'}
|
|
397
|
+
${preview.unreleaseCommits.length > 20 ? `\n... and ${preview.unreleaseCommits.length - 20} more commits` : ''}
|
|
398
|
+
|
|
399
|
+
## Pending ADRs (Accepted, Not Yet Released)
|
|
400
|
+
${preview.pendingAdrs.length > 0
|
|
401
|
+
? preview.pendingAdrs.map(a => `- **${a.title}** (${a.filename}): ${a.status}`).join('\n')
|
|
402
|
+
: 'All accepted ADRs are linked to releases.'}
|
|
403
|
+
|
|
404
|
+
## Recommendations
|
|
405
|
+
${preview.readiness.recommendations.join('\n')}`,
|
|
406
|
+
},
|
|
407
|
+
],
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
async function handleCreateMilestone(projectPath, args) {
|
|
411
|
+
if (!args.milestoneTitle) {
|
|
412
|
+
throw new McpAdrError('INVALID_ARGS', 'milestoneTitle is required for create_milestone operation');
|
|
413
|
+
}
|
|
414
|
+
const result = syncGitHubMilestone(projectPath, args.milestoneTitle, args.milestoneDescription || '', args.milestoneDueDate);
|
|
415
|
+
return validateMcpResponse({
|
|
416
|
+
content: [
|
|
417
|
+
{
|
|
418
|
+
type: 'text',
|
|
419
|
+
text: result.success
|
|
420
|
+
? `# Milestone Created/Updated
|
|
421
|
+
|
|
422
|
+
**Title**: ${args.milestoneTitle}
|
|
423
|
+
**Number**: #${result.number}
|
|
424
|
+
${args.milestoneDescription ? `**Description**: ${args.milestoneDescription}` : ''}
|
|
425
|
+
${args.milestoneDueDate ? `**Due Date**: ${args.milestoneDueDate}` : ''}`
|
|
426
|
+
: `# Milestone Creation Failed
|
|
427
|
+
|
|
428
|
+
**Error**: ${result.error}
|
|
429
|
+
|
|
430
|
+
Make sure:
|
|
431
|
+
1. \`gh\` CLI is installed and authenticated
|
|
432
|
+
2. You have write access to the repository
|
|
433
|
+
3. Run \`gh auth status\` to verify`,
|
|
434
|
+
},
|
|
435
|
+
],
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
async function handleSyncMilestones(projectPath, adrs, args) {
|
|
439
|
+
const milestones = await buildMilestoneMap(adrs, projectPath);
|
|
440
|
+
// Update TODO.md
|
|
441
|
+
if (args.updateTodo) {
|
|
442
|
+
updateTodoMilestones(projectPath, milestones, adrs);
|
|
443
|
+
}
|
|
444
|
+
// Sync to GitHub
|
|
445
|
+
const githubResults = [];
|
|
446
|
+
if (args.syncGithubMilestones) {
|
|
447
|
+
for (const milestone of milestones) {
|
|
448
|
+
const adrLinks = adrs
|
|
449
|
+
.filter(a => milestone.blockers.some(b => b.includes(a.filename)))
|
|
450
|
+
.map(a => `- ${a.title} (${a.filename})`)
|
|
451
|
+
.join('\n');
|
|
452
|
+
const description = `Milestone from release tracking.\n\nLinked ADRs:\n${adrLinks || 'None'}`;
|
|
453
|
+
const result = syncGitHubMilestone(projectPath, milestone.name, description);
|
|
454
|
+
githubResults.push(result.success
|
|
455
|
+
? `- ${milestone.name}: synced (#${result.number})`
|
|
456
|
+
: `- ${milestone.name}: failed (${result.error})`);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
return validateMcpResponse({
|
|
460
|
+
content: [
|
|
461
|
+
{
|
|
462
|
+
type: 'text',
|
|
463
|
+
text: `# Milestones Synced
|
|
464
|
+
|
|
465
|
+
**Total Milestones**: ${milestones.length}
|
|
466
|
+
${args.updateTodo ? '**TODO.md**: Updated' : ''}
|
|
467
|
+
${args.syncGithubMilestones ? `**GitHub**: ${githubResults.length} milestones processed` : ''}
|
|
468
|
+
|
|
469
|
+
## Milestone Status
|
|
470
|
+
${milestones
|
|
471
|
+
.map(m => `### ${m.name}
|
|
472
|
+
- Progress: ${(m.completionRate * 100).toFixed(0)}% (${m.completed}/${m.total})
|
|
473
|
+
- Critical Blockers: ${m.criticalTodos}
|
|
474
|
+
${m.blockers.length > 0 ? m.blockers.map(b => ` - ${b}`).join('\n') : ' - None'}`)
|
|
475
|
+
.join('\n\n')}
|
|
476
|
+
|
|
477
|
+
${githubResults.length > 0
|
|
478
|
+
? `## GitHub Sync Results
|
|
479
|
+
${githubResults.join('\n')}`
|
|
480
|
+
: ''}`,
|
|
481
|
+
},
|
|
482
|
+
],
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
// ─── Helpers ───────────────────────────────────────────────────────
|
|
486
|
+
function generateReleaseNotes(release) {
|
|
487
|
+
const lines = [`# ${release.version}`, ''];
|
|
488
|
+
if (release.adrs.length > 0) {
|
|
489
|
+
lines.push('## Architecture Decisions');
|
|
490
|
+
for (const adr of release.adrs) {
|
|
491
|
+
lines.push(`- **${adr.adrTitle}** (${adr.changeType})`);
|
|
492
|
+
}
|
|
493
|
+
lines.push('');
|
|
494
|
+
}
|
|
495
|
+
if (release.features.length > 0) {
|
|
496
|
+
lines.push('## Features');
|
|
497
|
+
for (const f of release.features) {
|
|
498
|
+
lines.push(`- ${f}`);
|
|
499
|
+
}
|
|
500
|
+
lines.push('');
|
|
501
|
+
}
|
|
502
|
+
if (release.bugfixes.length > 0) {
|
|
503
|
+
lines.push('## Bug Fixes');
|
|
504
|
+
for (const f of release.bugfixes) {
|
|
505
|
+
lines.push(`- ${f}`);
|
|
506
|
+
}
|
|
507
|
+
lines.push('');
|
|
508
|
+
}
|
|
509
|
+
if (release.breakingChanges.length > 0) {
|
|
510
|
+
lines.push('## Breaking Changes');
|
|
511
|
+
for (const c of release.breakingChanges) {
|
|
512
|
+
lines.push(`- ${c}`);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
return lines.join('\n');
|
|
516
|
+
}
|
|
517
|
+
function generateMermaidTimeline(releases) {
|
|
518
|
+
if (releases.length === 0)
|
|
519
|
+
return '';
|
|
520
|
+
const lines = ['```mermaid', 'gantt', ' title Release Timeline', ' dateFormat YYYY-MM-DD'];
|
|
521
|
+
for (const release of releases.slice().reverse()) {
|
|
522
|
+
const date = release.date.split('T')[0];
|
|
523
|
+
lines.push(` ${release.version} :milestone, ${date}, 0d`);
|
|
524
|
+
}
|
|
525
|
+
lines.push('```');
|
|
526
|
+
return lines.join('\n');
|
|
527
|
+
}
|
|
528
|
+
//# sourceMappingURL=release-tracking-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-tracking-tool.js","sourceRoot":"","sources":["../../../src/tools/release-tracking-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,GAGlB,MAAM,6BAA6B,CAAC;AAErC,sEAAsE;AAEtE,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,SAAS,EAAE,CAAC;SACT,IAAI,CAAC;QACJ,iBAAiB;QACjB,eAAe;QACf,oBAAoB;QACpB,kBAAkB;QAClB,iBAAiB;QACjB,sBAAsB;QACtB,kBAAkB;QAClB,iBAAiB;KAClB,CAAC;SACD,QAAQ,CAAC,sBAAsB,CAAC;IAEnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IAEhE,oBAAoB;IACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IAElF,uBAAuB;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC9E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAE1E,yBAAyB;IACzB,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,UAAU,EAAE,kBAAkB,EAAE,cAAc,CAAC,CAAC;SACtD,OAAO,CAAC,kBAAkB,CAAC;SAC3B,QAAQ,CAAC,yBAAyB,CAAC;IACtC,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IAC1F,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACjF,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IACjF,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAE9E,+CAA+C;IAC/C,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACvF,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAEvF,uBAAuB;IACvB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IACxE,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IACpF,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAEnF,yBAAyB;IACzB,mBAAmB,EAAE,CAAC;SACnB,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,2CAA2C,CAAC;IACxD,oBAAoB,EAAE,CAAC;SACpB,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,6CAA6C,CAAC;IAC1D,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;CACxF,CAAC,CAAC;AAEH,sEAAsE;AAEtE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAA6B;IACjE,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAE/D,gBAAgB;QAChB,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAC9E,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,WAAW,CAAC;QACjE,MAAM,eAAe,GAAG,MAAM,uBAAuB,CAAC,YAAY,EAAE,WAAW,EAAE;YAC/E,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC;QAElC,QAAQ,aAAa,CAAC,SAAS,EAAE,CAAC;YAChC,KAAK,iBAAiB;gBACpB,OAAO,MAAM,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAEvD,KAAK,eAAe;gBAClB,OAAO,MAAM,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YAEpE,KAAK,oBAAoB;gBACvB,OAAO,MAAM,uBAAuB,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YAEzE,KAAK,kBAAkB;gBACrB,OAAO,MAAM,qBAAqB,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YAEvE,KAAK,iBAAiB;gBACpB,OAAO,MAAM,oBAAoB,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YAEtE,KAAK,sBAAsB;gBACzB,OAAO,MAAM,wBAAwB,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YAE1E,KAAK,kBAAkB;gBACrB,OAAO,MAAM,qBAAqB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;YAEjE,KAAK,iBAAiB;gBACpB,OAAO,MAAM,oBAAoB,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YAEtE;gBACE,MAAM,IAAI,WAAW,CAAC,cAAc,EAAE,sBAAsB,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CACnB,wBAAwB,EACxB,4BAA4B,aAAa,CAAC,KAAK,CAAC,EAAE,CACnD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,sEAAsE;AAEtE,KAAK,UAAU,oBAAoB,CAAC,WAAmB,EAAE,IAAW;IAClE,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAEjF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,mBAAmB,CAAC;YACzB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yBAAyB,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY;;;;oBAI/E,WAAW;qBACV,KAAK;kBACR,IAAI,CAAC,MAAM;;;;EAK3B,WAAW,KAAK,YAAY;wBAC1B,CAAC,CAAC;;;;;4FAKsF;wBACxF,CAAC,CAAC;;;;yDAKN;;;EAGE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kEAAkE,EAAE;iBAClJ;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE9F,aAAa;IACb,MAAM,KAAK,GAAyB;QAClC,WAAW;QACX,aAAa,EAAE,KAAY;QAC3B,QAAQ,EAAE,cAAc;QACxB,YAAY;QACZ,UAAU,EAAE,EAAE;QACd,iBAAiB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC5C,CAAC;IACF,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEtC,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;;oBAEM,WAAW;qBACV,KAAK;sBACJ,cAAc,CAAC,MAAM;kBACzB,IAAI,CAAC,MAAM;qBACR,YAAY,CAAC,MAAM;;;;EAItC,cAAc;qBACb,GAAG,CACF,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;kBAChC,CAAC,CAAC,QAAQ,CAAC,MAAM;mBAChB,CAAC,CAAC,QAAQ,CAAC,MAAM;0BACV,CAAC,CAAC,eAAe,CAAC,MAAM;qBAC7B,CAAC,CAAC,IAAI,CAAC,MAAM;EAChC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrH;qBACA,IAAI,CAAC,MAAM,CAAC;;EAGb,YAAY,CAAC,MAAM,GAAG,CAAC;oBACrB,CAAC,CAAC;;EAEJ,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;wDAEY;oBACpD,CAAC,CAAC,EACN,EAAE;aACK;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,WAAmB,EACnB,IAAW,EACX,IAA2C;IAE3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,WAAW,CAAC,cAAc,EAAE,iDAAiD,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChF,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC;IAE3E,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,mBAAmB,CAAC;YACzB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,wBAAwB,IAAI,CAAC,OAAO;;sBAE9B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;;kDAErB,IAAI,CAAC,OAAO,IAAI;iBACzD;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,qCAAqC;IACrC,IAAI,iBAAiB,GAAG,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC5E,iBAAiB,GAAG,MAAM,CAAC,OAAO;YAChC,CAAC,CAAC,oCAAoC,MAAM,CAAC,GAAG,EAAE;YAClD,CAAC,CAAC,mCAAmC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxD,CAAC;IAED,8BAA8B;IAC9B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC9D,oBAAoB,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,sBAAsB,IAAI,CAAC,OAAO;;YAEpC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;mBACzB,aAAa,CAAC,IAAI,CAAC,MAAM;gBAC5B,aAAa,CAAC,QAAQ,CAAC,MAAM;iBAC5B,aAAa,CAAC,QAAQ,CAAC,MAAM;wBACtB,aAAa,CAAC,eAAe,CAAC,MAAM;;;EAI1D,aAAa,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;oBAC3B,CAAC,CAAC,aAAa,CAAC,IAAI;yBACf,GAAG,CACF,CAAC,CAAC,EAAE,CACF,OAAO,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC,WAAW;mBAC9B,CAAC,CAAC,UAAU;sBACT,CAAC,CAAC,aAAa;kBACnB,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAC3C;yBACA,IAAI,CAAC,IAAI,CAAC;oBACf,CAAC,CAAC,iCACN;EACE,iBAAiB,EAAE;aACd;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,WAAmB,EACnB,IAAW,EACX,IAA2C;IAE3C,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEhF,MAAM,OAAO,GAAqB;QAChC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC;IAEF,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAEpE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,cAAc,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;;gBAEE,cAAc,CAAC,MAAM;cACvB,IAAI,CAAC,MAAM;EACvB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,kDAAkD;;;;EAItG,gBAAgB,EAAE;aACb;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,WAAmB,EACnB,IAAW,EACX,IAA2C;IAE3C,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,IAAI,WAAW,CACnB,cAAc,EACd,uEAAuE,CACxE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,eAAe,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAErF,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,yBAAyB,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC,SAAS;;;eAG7D,UAAU,CAAC,SAAS,CAAC,MAAM;kBACxB,UAAU,CAAC,YAAY,CAAC,MAAM;oBAC5B,UAAU,CAAC,cAAc,CAAC,MAAM;;EAGlD,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;oBAC7B,CAAC,CAAC;EACJ,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAC9E,CAAC,CAAC,EACN;;EAGE,UAAU,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;oBAChC,CAAC,CAAC;EACJ,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACjF,CAAC,CAAC,EACN;;EAGE,UAAU,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;oBAClC,CAAC,CAAC;EACJ,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACnF,CAAC,CAAC,EACN;;;sBAGsB,UAAU,CAAC,aAAa,CAAC,MAAM;mBAClC,UAAU,CAAC,aAAa,CAAC,MAAM;0BACxB,UAAU,CAAC,oBAAoB,CAAC,MAAM;;EAE9D,UAAU,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;EACpH,UAAU,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;EACrH,UAAU,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,yBAAyB,UAAU,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;aACvI;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,WAAmB,EACnB,IAAW,EACX,IAA2C;IAE3C,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjF,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC9F,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3F,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,IAAI,CAAC,eAAe,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,eAAe,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;;oBAEM,WAAW;qBACV,KAAK;sBACJ,cAAc,CAAC,MAAM;kBACzB,IAAI,CAAC,MAAM;qBACR,YAAY,CAAC,MAAM;;;EAItC,cAAc,CAAC,MAAM,GAAG,CAAC;oBACvB,CAAC,CAAC,cAAc;yBACX,GAAG,CACF,CAAC,CAAC,EAAE,CACF,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,eAAe,CAAC,CAAC,QAAQ,CAAC,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,SAAS,CACpI;yBACA,IAAI,CACH,gGAAgG,CACjG;oBACL,CAAC,CAAC,oBACN;;EAGE,UAAU,CAAC,MAAM,GAAG,CAAC;oBACnB,CAAC,CAAC;EACJ,UAAU;yBACT,GAAG,CACF,CAAC,CAAC,EAAE,CACF,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAChK;yBACA,IAAI,CAAC,IAAI,CAAC,EAAE;oBACX,CAAC,CAAC,EACN;;EAEE,eAAe,CAAC,CAAC,CAAC,0BAA0B,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE;;EAGlE,YAAY,CAAC,MAAM,GAAG,CAAC;oBACrB,CAAC,CAAC;EACJ,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAC1C,CAAC,CAAC,EACN,EAAE;aACK;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,WAAmB,EACnB,IAAW,EACX,KAA4C;IAE5C,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAE5E,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;;8BAEgB,OAAO,CAAC,gBAAgB;0BAC5B,OAAO,CAAC,gBAAgB,CAAC,MAAM;oBACrC,OAAO,CAAC,WAAW,CAAC,MAAM;;;EAG5C,OAAO,CAAC,SAAS,CAAC,OAAO;;;EAIzB,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC;oBACjC,CAAC,CAAC,OAAO,CAAC,gBAAgB;yBACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;yBACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;yBAClB,IAAI,CAAC,IAAI,CAAC;oBACf,CAAC,CAAC,wBACN;EACE,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE;;;EAI5G,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;oBAC5B,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC1F,CAAC,CAAC,2CACN;;;EAGE,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACzC;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,WAAmB,EACnB,IAA2C;IAE3C,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACzB,MAAM,IAAI,WAAW,CACnB,cAAc,EACd,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAChC,WAAW,EACX,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,oBAAoB,IAAI,EAAE,EAC/B,IAAI,CAAC,gBAAgB,CACtB,CAAC;IAEF,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,MAAM,CAAC,OAAO;oBAClB,CAAC,CAAC;;aAEC,IAAI,CAAC,cAAc;eACjB,MAAM,CAAC,MAAM;EAC1B,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE;EAChF,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;oBAC/D,CAAC,CAAC;;aAEC,MAAM,CAAC,KAAK;;;;;oCAKW;aAC7B;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,WAAmB,EACnB,IAAW,EACX,IAA2C;IAE3C,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAE9D,iBAAiB;IACjB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,oBAAoB,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,iBAAiB;IACjB,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI;iBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;iBACjE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC;iBACxC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,MAAM,WAAW,GAAG,qDAAqD,QAAQ,IAAI,MAAM,EAAE,CAAC;YAC9F,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAE7E,aAAa,CAAC,IAAI,CAChB,MAAM,CAAC,OAAO;gBACZ,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,cAAc,MAAM,CAAC,MAAM,GAAG;gBACnD,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,aAAa,MAAM,CAAC,KAAK,GAAG,CACpD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;;wBAEU,UAAU,CAAC,MAAM;EACvC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE;EAC7C,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,eAAe,aAAa,CAAC,MAAM,uBAAuB,CAAC,CAAC,CAAC,EAAE;;;EAG3F,UAAU;qBACT,GAAG,CACF,CAAC,CAAC,EAAE,CACF,OAAO,CAAC,CAAC,IAAI;cACL,CAAC,CAAC,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK;uBACtD,CAAC,CAAC,aAAa;EACpC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAChF;qBACA,IAAI,CAAC,MAAM,CAAC;;EAGb,aAAa,CAAC,MAAM,GAAG,CAAC;oBACtB,CAAC,CAAC;EACJ,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACxB,CAAC,CAAC,EACN,EAAE;aACK;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,sEAAsE;AAEtE,SAAS,oBAAoB,CAAC,OAAY;IACxC,MAAM,KAAK,GAAa,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,QAAQ,OAAO,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC;QAC1D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAe;IAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,KAAK,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,4BAA4B,EAAE,2BAA2B,CAAC,CAAC;IAEjG,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,OAAO,gBAAgB,IAAI,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|