@eldrforge/kodrdriv 0.0.19 → 0.0.24

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.
Files changed (64) hide show
  1. package/dist/arguments.js +664 -0
  2. package/dist/arguments.js.map +1 -0
  3. package/dist/commands/audio-commit.js +99 -0
  4. package/dist/commands/audio-commit.js.map +1 -0
  5. package/dist/commands/audio-review.js +110 -0
  6. package/dist/commands/audio-review.js.map +1 -0
  7. package/dist/commands/clean.js +36 -0
  8. package/dist/commands/clean.js.map +1 -0
  9. package/dist/commands/commit.js +125 -0
  10. package/dist/commands/commit.js.map +1 -0
  11. package/dist/commands/link.js +184 -0
  12. package/dist/commands/link.js.map +1 -0
  13. package/dist/commands/publish.js +301 -0
  14. package/dist/commands/publish.js.map +1 -0
  15. package/dist/commands/release.js +85 -0
  16. package/dist/commands/release.js.map +1 -0
  17. package/dist/commands/review.js +268 -0
  18. package/dist/commands/review.js.map +1 -0
  19. package/dist/commands/select-audio.js +29 -0
  20. package/dist/commands/select-audio.js.map +1 -0
  21. package/dist/commands/unlink.js +180 -0
  22. package/dist/commands/unlink.js.map +1 -0
  23. package/dist/constants.js +154 -0
  24. package/dist/constants.js.map +1 -0
  25. package/dist/content/diff.js +220 -0
  26. package/dist/content/diff.js.map +1 -0
  27. package/dist/content/issues.js +360 -0
  28. package/dist/content/issues.js.map +1 -0
  29. package/dist/content/log.js +53 -0
  30. package/dist/content/log.js.map +1 -0
  31. package/dist/content/releaseNotes.js +90 -0
  32. package/dist/content/releaseNotes.js.map +1 -0
  33. package/dist/error/ExitError.js +9 -0
  34. package/dist/error/ExitError.js.map +1 -0
  35. package/dist/logging.js +103 -0
  36. package/dist/logging.js.map +1 -0
  37. package/dist/main.js +30 -3707
  38. package/dist/main.js.map +1 -1
  39. package/dist/prompt/commit.js +56 -0
  40. package/dist/prompt/commit.js.map +1 -0
  41. package/dist/prompt/release.js +52 -0
  42. package/dist/prompt/release.js.map +1 -0
  43. package/dist/prompt/review.js +64 -0
  44. package/dist/prompt/review.js.map +1 -0
  45. package/dist/types.js +88 -0
  46. package/dist/types.js.map +1 -0
  47. package/dist/util/child.js +23 -0
  48. package/dist/util/child.js.map +1 -0
  49. package/dist/util/general.js +96 -0
  50. package/dist/util/general.js.map +1 -0
  51. package/dist/util/github.js +208 -0
  52. package/dist/util/github.js.map +1 -0
  53. package/dist/util/openai.js +146 -0
  54. package/dist/util/openai.js.map +1 -0
  55. package/dist/util/stdin.js +101 -0
  56. package/dist/util/stdin.js.map +1 -0
  57. package/dist/util/storage.js +149 -0
  58. package/dist/util/storage.js.map +1 -0
  59. package/package.json +5 -5
  60. /package/dist/{src/prompt → prompt}/instructions/commit.md +0 -0
  61. /package/dist/{src/prompt → prompt}/instructions/release.md +0 -0
  62. /package/dist/{src/prompt → prompt}/instructions/review.md +0 -0
  63. /package/dist/{src/prompt → prompt}/personas/releaser.md +0 -0
  64. /package/dist/{src/prompt → prompt}/personas/you.md +0 -0
@@ -0,0 +1,90 @@
1
+ import { getLogger } from '../logging.js';
2
+ import { getOctokit, getRepoDetails } from '../util/github.js';
3
+
4
+ // Function to truncate overly large content while preserving structure
5
+ const truncateContent = (content, maxLength = 3000)=>{
6
+ if (content.length <= maxLength) {
7
+ return content;
8
+ }
9
+ const lines = content.split('\n');
10
+ const truncatedLines = [];
11
+ let currentLength = 0;
12
+ for (const line of lines){
13
+ if (currentLength + line.length + 1 > maxLength) {
14
+ break;
15
+ }
16
+ truncatedLines.push(line);
17
+ currentLength += line.length + 1; // +1 for newline
18
+ }
19
+ truncatedLines.push('');
20
+ truncatedLines.push(`... [TRUNCATED: Original content was ${content.length} characters, showing first ${currentLength}] ...`);
21
+ return truncatedLines.join('\n');
22
+ };
23
+ // Function to fetch recent releases from GitHub API
24
+ const findRecentReleaseNotes = async (limit)=>{
25
+ const logger = getLogger();
26
+ const releaseNotes = [];
27
+ if (limit <= 0) {
28
+ return releaseNotes;
29
+ }
30
+ try {
31
+ const octokit = getOctokit();
32
+ const { owner, repo } = await getRepoDetails();
33
+ logger.debug(`Fetching up to ${limit} recent releases from GitHub...`);
34
+ const response = await octokit.repos.listReleases({
35
+ owner,
36
+ repo,
37
+ per_page: Math.min(limit, 100)
38
+ });
39
+ const releases = response.data;
40
+ if (releases.length === 0) {
41
+ logger.debug('No releases found in GitHub repository');
42
+ return releaseNotes;
43
+ }
44
+ for (const release of releases.slice(0, limit)){
45
+ const releaseContent = [
46
+ `# ${release.name || release.tag_name}`,
47
+ `**Tag:** ${release.tag_name}`,
48
+ `**Published:** ${release.published_at}`,
49
+ release.prerelease ? '**Type:** Pre-release' : '**Type:** Release',
50
+ release.draft ? '**Status:** Draft' : '**Status:** Published',
51
+ '',
52
+ release.body || 'No release notes provided'
53
+ ].join('\n');
54
+ const truncatedContent = truncateContent(releaseContent);
55
+ releaseNotes.push(`=== GitHub Release: ${release.tag_name} ===\n${truncatedContent}`);
56
+ if (truncatedContent.length < releaseContent.length) {
57
+ logger.debug(`Found release ${release.tag_name} (%d characters, truncated from %d)`, truncatedContent.length, releaseContent.length);
58
+ } else {
59
+ logger.debug(`Found release ${release.tag_name} (%d characters)`, releaseContent.length);
60
+ }
61
+ }
62
+ logger.debug(`Fetched ${releaseNotes.length} releases from GitHub`);
63
+ } catch (error) {
64
+ logger.warn('Error fetching releases from GitHub API: %s', error.message);
65
+ // If we have a GitHub API error, we could fall back to checking for local release notes
66
+ // This maintains some backward compatibility
67
+ logger.debug('Falling back to local RELEASE_NOTES.md file...');
68
+ try {
69
+ const fs = await import('fs/promises');
70
+ const content = await fs.readFile('RELEASE_NOTES.md', 'utf-8');
71
+ if (content.trim()) {
72
+ const truncatedContent = truncateContent(content);
73
+ releaseNotes.push(`=== Local RELEASE_NOTES.md ===\n${truncatedContent}`);
74
+ logger.debug(`Found local release notes (%d characters)`, content.length);
75
+ }
76
+ } catch {
77
+ // No local file either, return empty array
78
+ logger.debug('No local RELEASE_NOTES.md file found either');
79
+ }
80
+ }
81
+ return releaseNotes.slice(0, limit);
82
+ };
83
+ const get = async (options = {})=>{
84
+ const { limit = 3 } = options;
85
+ const releaseNotes = await findRecentReleaseNotes(limit);
86
+ return releaseNotes.join('\n\n');
87
+ };
88
+
89
+ export { findRecentReleaseNotes, get };
90
+ //# sourceMappingURL=releaseNotes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"releaseNotes.js","sources":["../../src/content/releaseNotes.ts"],"sourcesContent":["import { getLogger } from '../logging';\nimport { getOctokit, getRepoDetails } from '../util/github';\n\n// Function to truncate overly large content while preserving structure\nconst truncateContent = (content: string, maxLength: number = 3000): string => {\n if (content.length <= maxLength) {\n return content;\n }\n\n const lines = content.split('\\n');\n const truncatedLines: string[] = [];\n let currentLength = 0;\n\n for (const line of lines) {\n if (currentLength + line.length + 1 > maxLength) {\n break;\n }\n truncatedLines.push(line);\n currentLength += line.length + 1; // +1 for newline\n }\n\n truncatedLines.push('');\n truncatedLines.push(`... [TRUNCATED: Original content was ${content.length} characters, showing first ${currentLength}] ...`);\n\n return truncatedLines.join('\\n');\n};\n\n// Function to fetch recent releases from GitHub API\nexport const findRecentReleaseNotes = async (limit: number): Promise<string[]> => {\n const logger = getLogger();\n const releaseNotes: string[] = [];\n\n if (limit <= 0) {\n return releaseNotes;\n }\n\n try {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n\n logger.debug(`Fetching up to ${limit} recent releases from GitHub...`);\n\n const response = await octokit.repos.listReleases({\n owner,\n repo,\n per_page: Math.min(limit, 100), // GitHub API limit\n });\n\n const releases = response.data;\n\n if (releases.length === 0) {\n logger.debug('No releases found in GitHub repository');\n return releaseNotes;\n }\n\n for (const release of releases.slice(0, limit)) {\n const releaseContent = [\n `# ${release.name || release.tag_name}`,\n `**Tag:** ${release.tag_name}`,\n `**Published:** ${release.published_at}`,\n release.prerelease ? '**Type:** Pre-release' : '**Type:** Release',\n release.draft ? '**Status:** Draft' : '**Status:** Published',\n '',\n release.body || 'No release notes provided'\n ].join('\\n');\n\n const truncatedContent = truncateContent(releaseContent);\n releaseNotes.push(`=== GitHub Release: ${release.tag_name} ===\\n${truncatedContent}`);\n\n if (truncatedContent.length < releaseContent.length) {\n logger.debug(`Found release ${release.tag_name} (%d characters, truncated from %d)`,\n truncatedContent.length, releaseContent.length);\n } else {\n logger.debug(`Found release ${release.tag_name} (%d characters)`, releaseContent.length);\n }\n }\n\n logger.debug(`Fetched ${releaseNotes.length} releases from GitHub`);\n\n } catch (error: any) {\n logger.warn('Error fetching releases from GitHub API: %s', error.message);\n\n // If we have a GitHub API error, we could fall back to checking for local release notes\n // This maintains some backward compatibility\n logger.debug('Falling back to local RELEASE_NOTES.md file...');\n try {\n const fs = await import('fs/promises');\n const content = await fs.readFile('RELEASE_NOTES.md', 'utf-8');\n if (content.trim()) {\n const truncatedContent = truncateContent(content);\n releaseNotes.push(`=== Local RELEASE_NOTES.md ===\\n${truncatedContent}`);\n logger.debug(`Found local release notes (%d characters)`, content.length);\n }\n } catch {\n // No local file either, return empty array\n logger.debug('No local RELEASE_NOTES.md file found either');\n }\n }\n\n return releaseNotes.slice(0, limit);\n};\n\nexport const get = async (options: { limit?: number } = {}): Promise<string> => {\n const { limit = 3 } = options;\n const releaseNotes = await findRecentReleaseNotes(limit);\n return releaseNotes.join('\\n\\n');\n}; "],"names":["truncateContent","content","maxLength","length","lines","split","truncatedLines","currentLength","line","push","join","findRecentReleaseNotes","limit","logger","getLogger","releaseNotes","octokit","getOctokit","owner","repo","getRepoDetails","debug","response","repos","listReleases","per_page","Math","min","releases","data","release","slice","releaseContent","name","tag_name","published_at","prerelease","draft","body","truncatedContent","error","warn","message","fs","readFile","trim","get","options"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ class ExitError extends Error {
2
+ constructor(message){
3
+ super(message);
4
+ this.name = 'ExitError';
5
+ }
6
+ }
7
+
8
+ export { ExitError };
9
+ //# sourceMappingURL=ExitError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExitError.js","sources":["../../src/error/ExitError.ts"],"sourcesContent":["export class ExitError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ExitError';\n }\n}\n"],"names":["ExitError","Error","message","name"],"mappings":"AAAO,MAAMA,SAAAA,SAAkBC,KAAAA,CAAAA;AAC3B,IAAA,WAAA,CAAYC,OAAe,CAAE;AACzB,QAAA,KAAK,CAACA,OAAAA,CAAAA;QACN,IAAI,CAACC,IAAI,GAAG,WAAA;AAChB,IAAA;AACJ;;;;"}
@@ -0,0 +1,103 @@
1
+ import winston from 'winston';
2
+ import * as fs from 'fs';
3
+ import path from 'path';
4
+ import { PROGRAM_NAME, DEFAULT_OUTPUT_DIRECTORY, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS } from './constants.js';
5
+
6
+ // Track if debug directory has been ensured for this session
7
+ let debugDirectoryEnsured = false;
8
+ const ensureDebugDirectory = ()=>{
9
+ if (debugDirectoryEnsured) return;
10
+ const debugDir = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug');
11
+ try {
12
+ fs.mkdirSync(debugDir, {
13
+ recursive: true
14
+ });
15
+ debugDirectoryEnsured = true;
16
+ } catch (error) {
17
+ // eslint-disable-next-line no-console
18
+ console.error(`Failed to create debug directory ${debugDir}:`, error);
19
+ }
20
+ };
21
+ const generateDebugLogFilename = ()=>{
22
+ const now = new Date();
23
+ const timestamp = now.toISOString().replace(/[-:]/g, '').replace(/\./g, '').replace('T', '-').replace('Z', '');
24
+ return `${timestamp}-debug.log`;
25
+ };
26
+ const createTransports = (level)=>{
27
+ const transports = [];
28
+ // Always add console transport for info level and above
29
+ if (level === 'info') {
30
+ transports.push(new winston.transports.Console({
31
+ format: winston.format.combine(winston.format.colorize(), winston.format.printf(({ level, message })=>{
32
+ return `${level}: ${message}`;
33
+ }))
34
+ }));
35
+ } else {
36
+ // For debug/verbose levels, add console transport that shows info and above
37
+ transports.push(new winston.transports.Console({
38
+ level: 'info',
39
+ format: winston.format.combine(winston.format.colorize(), winston.format.printf(({ timestamp, level, message, ...meta })=>{
40
+ // For info level messages, use simpler format without timestamp
41
+ if (level.includes('info')) {
42
+ return String(message);
43
+ }
44
+ const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';
45
+ return `${timestamp} ${level}: ${String(message)}${metaStr}`;
46
+ }))
47
+ }));
48
+ // Add file transport for debug levels (debug and silly)
49
+ if (level === 'debug' || level === 'silly') {
50
+ ensureDebugDirectory();
51
+ const debugLogPath = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug', generateDebugLogFilename());
52
+ transports.push(new winston.transports.File({
53
+ filename: debugLogPath,
54
+ level: 'debug',
55
+ format: winston.format.combine(winston.format.timestamp({
56
+ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS
57
+ }), winston.format.errors({
58
+ stack: true
59
+ }), winston.format.splat(), winston.format.printf(({ timestamp, level, message, ...meta })=>{
60
+ const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';
61
+ return `${timestamp} ${level}: ${message}${metaStr}`;
62
+ }))
63
+ }));
64
+ }
65
+ }
66
+ return transports;
67
+ };
68
+ const createFormat = (level)=>{
69
+ if (level === 'info') {
70
+ return winston.format.combine(winston.format.errors({
71
+ stack: true
72
+ }), winston.format.splat());
73
+ }
74
+ return winston.format.combine(winston.format.timestamp({
75
+ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS
76
+ }), winston.format.errors({
77
+ stack: true
78
+ }), winston.format.splat(), winston.format.json());
79
+ };
80
+ // Create the logger instance once
81
+ const logger = winston.createLogger({
82
+ level: 'info',
83
+ format: createFormat('info'),
84
+ defaultMeta: {
85
+ service: PROGRAM_NAME
86
+ },
87
+ transports: createTransports('info')
88
+ });
89
+ const setLogLevel = (level)=>{
90
+ // Reconfigure the existing logger instead of creating a new one
91
+ logger.configure({
92
+ level,
93
+ format: createFormat(level),
94
+ defaultMeta: {
95
+ service: PROGRAM_NAME
96
+ },
97
+ transports: createTransports(level)
98
+ });
99
+ };
100
+ const getLogger = ()=>logger;
101
+
102
+ export { getLogger, setLogLevel };
103
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sources":["../src/logging.ts"],"sourcesContent":["import winston from 'winston';\n// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\nimport path from 'path';\nimport { DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, PROGRAM_NAME, DEFAULT_OUTPUT_DIRECTORY } from './constants';\n\nexport interface LogContext {\n [key: string]: any;\n}\n\n// Track if debug directory has been ensured for this session\nlet debugDirectoryEnsured = false;\n\nconst ensureDebugDirectory = () => {\n if (debugDirectoryEnsured) return;\n\n const debugDir = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug');\n\n try {\n fs.mkdirSync(debugDir, { recursive: true });\n debugDirectoryEnsured = true;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Failed to create debug directory ${debugDir}:`, error);\n }\n};\n\nconst generateDebugLogFilename = () => {\n const now = new Date();\n const timestamp = now.toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\./g, '')\n .replace('T', '-')\n .replace('Z', '');\n\n return `${timestamp}-debug.log`;\n};\n\nconst createTransports = (level: string) => {\n const transports: winston.transport[] = [];\n\n // Always add console transport for info level and above\n if (level === 'info') {\n transports.push(\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ level, message }) => {\n return `${level}: ${message}`;\n })\n )\n })\n );\n } else {\n // For debug/verbose levels, add console transport that shows info and above\n transports.push(\n new winston.transports.Console({\n level: 'info', // Show info, warn, and error on console\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ timestamp, level, message, ...meta }): string => {\n // For info level messages, use simpler format without timestamp\n if (level.includes('info')) {\n return String(message);\n }\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} ${level}: ${String(message)}${metaStr}`;\n })\n )\n })\n );\n\n // Add file transport for debug levels (debug and silly)\n if (level === 'debug' || level === 'silly') {\n ensureDebugDirectory();\n\n const debugLogPath = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug', generateDebugLogFilename());\n\n transports.push(\n new winston.transports.File({\n filename: debugLogPath,\n level: 'debug', // Capture debug and above in the file\n format: winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.printf(({ timestamp, level, message, ...meta }) => {\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} ${level}: ${message}${metaStr}`;\n })\n )\n })\n );\n }\n }\n\n return transports;\n};\n\nconst createFormat = (level: string) => {\n if (level === 'info') {\n return winston.format.combine(\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n );\n }\n\n return winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.json()\n );\n};\n\n// Create the logger instance once\nconst logger = winston.createLogger({\n level: 'info',\n format: createFormat('info'),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports('info'),\n});\n\nexport const setLogLevel = (level: string) => {\n // Reconfigure the existing logger instead of creating a new one\n logger.configure({\n level,\n format: createFormat(level),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports(level),\n });\n};\n\nexport const getLogger = () => logger; "],"names":["debugDirectoryEnsured","ensureDebugDirectory","debugDir","path","join","DEFAULT_OUTPUT_DIRECTORY","fs","mkdirSync","recursive","error","console","generateDebugLogFilename","now","Date","timestamp","toISOString","replace","createTransports","level","transports","push","winston","Console","format","combine","colorize","printf","message","meta","includes","String","metaStr","Object","keys","length","JSON","stringify","debugLogPath","File","filename","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS","errors","stack","splat","createFormat","json","logger","createLogger","defaultMeta","service","PROGRAM_NAME","setLogLevel","configure","getLogger"],"mappings":";;;;;AAUA;AACA,IAAIA,qBAAAA,GAAwB,KAAA;AAE5B,MAAMC,oBAAAA,GAAuB,IAAA;AACzB,IAAA,IAAID,qBAAAA,EAAuB;AAE3B,IAAA,MAAME,QAAAA,GAAWC,IAAAA,CAAKC,IAAI,CAACC,wBAAAA,EAA0B,OAAA,CAAA;IAErD,IAAI;QACAC,EAAAA,CAAGC,SAAS,CAACL,QAAAA,EAAU;YAAEM,SAAAA,EAAW;AAAK,SAAA,CAAA;QACzCR,qBAAAA,GAAwB,IAAA;AAC5B,IAAA,CAAA,CAAE,OAAOS,KAAAA,EAAO;;QAEZC,OAAAA,CAAQD,KAAK,CAAC,CAAC,iCAAiC,EAAEP,QAAAA,CAAS,CAAC,CAAC,EAAEO,KAAAA,CAAAA;AACnE,IAAA;AACJ,CAAA;AAEA,MAAME,wBAAAA,GAA2B,IAAA;AAC7B,IAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;AAChB,IAAA,MAAMC,YAAYF,GAAAA,CAAIG,WAAW,GAC5BC,OAAO,CAAC,SAAS,EAAA,CAAA,CACjBA,OAAO,CAAC,KAAA,EAAO,IACfA,OAAO,CAAC,KAAK,GAAA,CAAA,CACbA,OAAO,CAAC,GAAA,EAAK,EAAA,CAAA;IAElB,OAAO,CAAA,EAAGF,SAAAA,CAAU,UAAU,CAAC;AACnC,CAAA;AAEA,MAAMG,mBAAmB,CAACC,KAAAA,GAAAA;AACtB,IAAA,MAAMC,aAAkC,EAAE;;AAG1C,IAAA,IAAID,UAAU,MAAA,EAAQ;AAClBC,QAAAA,UAAAA,CAAWC,IAAI,CACX,IAAIC,QAAQF,UAAU,CAACG,OAAO,CAAC;YAC3BC,MAAAA,EAAQF,OAAAA,CAAQE,MAAM,CAACC,OAAO,CAC1BH,OAAAA,CAAQE,MAAM,CAACE,QAAQ,EAAA,EACvBJ,QAAQE,MAAM,CAACG,MAAM,CAAC,CAAC,EAAER,KAAK,EAAES,OAAO,EAAE,GAAA;AACrC,gBAAA,OAAO,CAAA,EAAGT,KAAAA,CAAM,EAAE,EAAES,OAAAA,CAAAA,CAAS;AACjC,YAAA,CAAA,CAAA;AAER,SAAA,CAAA,CAAA;IAER,CAAA,MAAO;;AAEHR,QAAAA,UAAAA,CAAWC,IAAI,CACX,IAAIC,QAAQF,UAAU,CAACG,OAAO,CAAC;YAC3BJ,KAAAA,EAAO,MAAA;YACPK,MAAAA,EAAQF,OAAAA,CAAQE,MAAM,CAACC,OAAO,CAC1BH,QAAQE,MAAM,CAACE,QAAQ,EAAA,EACvBJ,OAAAA,CAAQE,MAAM,CAACG,MAAM,CAAC,CAAC,EAAEZ,SAAS,EAAEI,KAAK,EAAES,OAAO,EAAE,GAAGC,IAAAA,EAAM,GAAA;;gBAEzD,IAAIV,KAAAA,CAAMW,QAAQ,CAAC,MAAA,CAAA,EAAS;AACxB,oBAAA,OAAOC,MAAAA,CAAOH,OAAAA,CAAAA;AAClB,gBAAA;AACA,gBAAA,MAAMI,OAAAA,GAAUC,MAAAA,CAAOC,IAAI,CAACL,MAAMM,MAAM,GAAG,CAAC,CAAC,EAAEC,IAAAA,CAAKC,SAAS,CAACR,OAAO,GAAG,EAAA;gBACxE,OAAO,CAAA,EAAGd,UAAU,CAAC,EAAEI,MAAM,EAAE,EAAEY,MAAAA,CAAOH,OAAAA,CAAAA,CAAAA,EAAWI,OAAAA,CAAAA,CAAS;AAChE,YAAA,CAAA,CAAA;AAER,SAAA,CAAA,CAAA;;QAIJ,IAAIb,KAAAA,KAAU,OAAA,IAAWA,KAAAA,KAAU,OAAA,EAAS;AACxCjB,YAAAA,oBAAAA,EAAAA;AAEA,YAAA,MAAMoC,YAAAA,GAAelC,IAAAA,CAAKC,IAAI,CAACC,0BAA0B,OAAA,EAASM,wBAAAA,EAAAA,CAAAA;AAElEQ,YAAAA,UAAAA,CAAWC,IAAI,CACX,IAAIC,QAAQF,UAAU,CAACmB,IAAI,CAAC;gBACxBC,QAAAA,EAAUF,YAAAA;gBACVnB,KAAAA,EAAO,OAAA;gBACPK,MAAAA,EAAQF,OAAAA,CAAQE,MAAM,CAACC,OAAO,CAC1BH,OAAAA,CAAQE,MAAM,CAACT,SAAS,CAAC;oBAAES,MAAAA,EAAQiB;AAA8D,iBAAA,CAAA,EACjGnB,OAAAA,CAAQE,MAAM,CAACkB,MAAM,CAAC;oBAAEC,KAAAA,EAAO;AAAK,iBAAA,CAAA,EACpCrB,QAAQE,MAAM,CAACoB,KAAK,EAAA,EACpBtB,OAAAA,CAAQE,MAAM,CAACG,MAAM,CAAC,CAAC,EAAEZ,SAAS,EAAEI,KAAK,EAAES,OAAO,EAAE,GAAGC,IAAAA,EAAM,GAAA;AACzD,oBAAA,MAAMG,OAAAA,GAAUC,MAAAA,CAAOC,IAAI,CAACL,MAAMM,MAAM,GAAG,CAAC,CAAC,EAAEC,IAAAA,CAAKC,SAAS,CAACR,OAAO,GAAG,EAAA;oBACxE,OAAO,CAAA,EAAGd,UAAU,CAAC,EAAEI,MAAM,EAAE,EAAES,UAAUI,OAAAA,CAAAA,CAAS;AACxD,gBAAA,CAAA,CAAA;AAER,aAAA,CAAA,CAAA;AAER,QAAA;AACJ,IAAA;IAEA,OAAOZ,UAAAA;AACX,CAAA;AAEA,MAAMyB,eAAe,CAAC1B,KAAAA,GAAAA;AAClB,IAAA,IAAIA,UAAU,MAAA,EAAQ;QAClB,OAAOG,OAAAA,CAAQE,MAAM,CAACC,OAAO,CACzBH,OAAAA,CAAQE,MAAM,CAACkB,MAAM,CAAC;YAAEC,KAAAA,EAAO;SAAK,CAAA,EACpCrB,OAAAA,CAAQE,MAAM,CAACoB,KAAK,EAAA,CAAA;AAE5B,IAAA;IAEA,OAAOtB,OAAAA,CAAQE,MAAM,CAACC,OAAO,CACzBH,OAAAA,CAAQE,MAAM,CAACT,SAAS,CAAC;QAAES,MAAAA,EAAQiB;AAA8D,KAAA,CAAA,EACjGnB,OAAAA,CAAQE,MAAM,CAACkB,MAAM,CAAC;QAAEC,KAAAA,EAAO;KAAK,CAAA,EACpCrB,OAAAA,CAAQE,MAAM,CAACoB,KAAK,IACpBtB,OAAAA,CAAQE,MAAM,CAACsB,IAAI,EAAA,CAAA;AAE3B,CAAA;AAEA;AACA,MAAMC,MAAAA,GAASzB,OAAAA,CAAQ0B,YAAY,CAAC;IAChC7B,KAAAA,EAAO,MAAA;AACPK,IAAAA,MAAAA,EAAQqB,YAAAA,CAAa,MAAA,CAAA;IACrBI,WAAAA,EAAa;QAAEC,OAAAA,EAASC;AAAa,KAAA;AACrC/B,IAAAA,UAAAA,EAAYF,gBAAAA,CAAiB,MAAA;AACjC,CAAA,CAAA;AAEO,MAAMkC,cAAc,CAACjC,KAAAA,GAAAA;;AAExB4B,IAAAA,MAAAA,CAAOM,SAAS,CAAC;AACblC,QAAAA,KAAAA;AACAK,QAAAA,MAAAA,EAAQqB,YAAAA,CAAa1B,KAAAA,CAAAA;QACrB8B,WAAAA,EAAa;YAAEC,OAAAA,EAASC;AAAa,SAAA;AACrC/B,QAAAA,UAAAA,EAAYF,gBAAAA,CAAiBC,KAAAA;AACjC,KAAA,CAAA;AACJ;AAEO,MAAMmC,SAAAA,GAAY,IAAMP;;;;"}