@ttpears/gitlab-mcp-server 1.7.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.
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod';
2
+ export declare const ConfigSchema: z.ZodObject<{
3
+ gitlabUrl: z.ZodDefault<z.ZodString>;
4
+ sharedAccessToken: z.ZodOptional<z.ZodString>;
5
+ maxPageSize: z.ZodDefault<z.ZodNumber>;
6
+ defaultTimeout: z.ZodDefault<z.ZodNumber>;
7
+ authMode: z.ZodDefault<z.ZodEnum<["shared", "per-user", "hybrid"]>>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ gitlabUrl: string;
10
+ maxPageSize: number;
11
+ defaultTimeout: number;
12
+ authMode: "shared" | "per-user" | "hybrid";
13
+ sharedAccessToken?: string | undefined;
14
+ }, {
15
+ gitlabUrl?: string | undefined;
16
+ sharedAccessToken?: string | undefined;
17
+ maxPageSize?: number | undefined;
18
+ defaultTimeout?: number | undefined;
19
+ authMode?: "shared" | "per-user" | "hybrid" | undefined;
20
+ }>;
21
+ export type Config = z.infer<typeof ConfigSchema>;
22
+ export declare const UserConfigSchema: z.ZodObject<{
23
+ accessToken: z.ZodString;
24
+ gitlabUrl: z.ZodOptional<z.ZodString>;
25
+ }, "strip", z.ZodTypeAny, {
26
+ accessToken: string;
27
+ gitlabUrl?: string | undefined;
28
+ }, {
29
+ accessToken: string;
30
+ gitlabUrl?: string | undefined;
31
+ }>;
32
+ export type UserConfig = z.infer<typeof UserConfigSchema>;
33
+ export declare function loadConfig(): Config;
34
+ export declare function validateUserConfig(userCredentials: any): UserConfig;
35
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;EAQvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAGlD,eAAO,MAAM,gBAAgB;;;;;;;;;EAG3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,wBAAgB,UAAU,IAAI,MAAM,CAUnC;AAED,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,GAAG,GAAG,UAAU,CAEnE"}
package/dist/config.js ADDED
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ export const ConfigSchema = z.object({
3
+ gitlabUrl: z.string().url().default('https://gitlab.com'),
4
+ // Shared read-only token (optional - for read operations when no user token provided)
5
+ sharedAccessToken: z.string().optional(),
6
+ maxPageSize: z.number().min(1).max(100).default(50),
7
+ defaultTimeout: z.number().min(1000).default(30000),
8
+ // Authentication mode
9
+ authMode: z.enum(['shared', 'per-user', 'hybrid']).default('hybrid'),
10
+ });
11
+ // User-specific configuration for per-user authentication
12
+ export const UserConfigSchema = z.object({
13
+ accessToken: z.string().min(1, 'User access token is required'),
14
+ gitlabUrl: z.string().url().optional(), // Allow user to override GitLab URL if needed
15
+ });
16
+ export function loadConfig() {
17
+ const config = {
18
+ gitlabUrl: process.env.GITLAB_URL || 'https://gitlab.com',
19
+ sharedAccessToken: process.env.GITLAB_SHARED_ACCESS_TOKEN || undefined,
20
+ maxPageSize: parseInt(process.env.GITLAB_MAX_PAGE_SIZE || '50'),
21
+ defaultTimeout: parseInt(process.env.GITLAB_TIMEOUT || '30000'),
22
+ authMode: process.env.GITLAB_AUTH_MODE || 'hybrid',
23
+ };
24
+ return ConfigSchema.parse(config);
25
+ }
26
+ export function validateUserConfig(userCredentials) {
27
+ return UserConfigSchema.parse(userCredentials);
28
+ }
29
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC;IACzD,sFAAsF;IACtF,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACnD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACnD,sBAAsB;IACtB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;CACrE,CAAC,CAAC;AAIH,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,+BAA+B,CAAC;IAC/D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,8CAA8C;CACvF,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG;QACb,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,oBAAoB;QACzD,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,SAAS;QACtE,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,IAAI,CAAC;QAC/D,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC;QAC/D,QAAQ,EAAG,OAAO,CAAC,GAAG,CAAC,gBAAqD,IAAI,QAAQ;KACzF,CAAC;IAEF,OAAO,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,eAAoB;IACrD,OAAO,gBAAgB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,96 @@
1
+ import type { Config, UserConfig } from './config.js';
2
+ export interface GitLabGraphQLError {
3
+ message: string;
4
+ locations?: Array<{
5
+ line: number;
6
+ column: number;
7
+ }>;
8
+ path?: string[];
9
+ extensions?: {
10
+ code?: string;
11
+ spam?: boolean;
12
+ needsCaptchaResponse?: boolean;
13
+ problems?: Array<{
14
+ path: string[];
15
+ explanation: string;
16
+ }>;
17
+ };
18
+ }
19
+ export declare class GitLabAPIError extends Error {
20
+ readonly code: string;
21
+ readonly statusCode?: number;
22
+ readonly isRetryable: boolean;
23
+ readonly isRateLimited: boolean;
24
+ readonly retryAfter?: number;
25
+ readonly originalError?: Error;
26
+ constructor(message: string, options?: {
27
+ code?: string;
28
+ statusCode?: number;
29
+ isRetryable?: boolean;
30
+ isRateLimited?: boolean;
31
+ retryAfter?: number;
32
+ originalError?: Error;
33
+ });
34
+ }
35
+ export declare class GitLabGraphQLClient {
36
+ private baseClient;
37
+ private config;
38
+ private schema;
39
+ private userClients;
40
+ constructor(config: Config);
41
+ private createClient;
42
+ /**
43
+ * Parse GraphQL/HTTP errors into structured GitLabAPIError
44
+ */
45
+ private parseError;
46
+ /**
47
+ * Execute request with exponential backoff retry
48
+ */
49
+ private executeWithRetry;
50
+ private getUserClient;
51
+ private getClient;
52
+ introspectSchema(userConfig?: UserConfig): Promise<void>;
53
+ query<T = any>(query: string, variables?: any, userConfig?: UserConfig, requiresWrite?: boolean): Promise<T>;
54
+ getCurrentUser(userConfig?: UserConfig): Promise<any>;
55
+ getProject(fullPath: string, userConfig?: UserConfig): Promise<any>;
56
+ getProjects(first?: number, after?: string, userConfig?: UserConfig): Promise<any>;
57
+ getIssues(projectPath: string, first?: number, after?: string, userConfig?: UserConfig): Promise<any>;
58
+ getMergeRequests(projectPath: string, first?: number, after?: string, userConfig?: UserConfig): Promise<any>;
59
+ createIssue(projectPath: string, title: string, description?: string, userConfig?: UserConfig): Promise<any>;
60
+ createMergeRequest(projectPath: string, title: string, sourceBranch: string, targetBranch: string, description?: string, userConfig?: UserConfig): Promise<any>;
61
+ getSchema(): any;
62
+ getAvailableQueries(): string[];
63
+ getAvailableMutations(): string[];
64
+ getIssueId(projectPath: string, iid: string, userConfig?: UserConfig): Promise<string>;
65
+ getUserIdsByUsernames(usernames: string[], userConfig?: UserConfig): Promise<Record<string, string>>;
66
+ getLabelIds(projectPath: string, labelNames: string[], userConfig?: UserConfig): Promise<Record<string, string>>;
67
+ updateIssueComposite(projectPath: string, iid: string, options: {
68
+ title?: string;
69
+ description?: string;
70
+ assigneeUsernames?: string[];
71
+ labelNames?: string[];
72
+ dueDate?: string;
73
+ }, userConfig?: UserConfig): Promise<any>;
74
+ getMergeRequestId(projectPath: string, iid: string, userConfig?: UserConfig): Promise<string>;
75
+ updateMergeRequestComposite(projectPath: string, iid: string, options: {
76
+ title?: string;
77
+ description?: string;
78
+ assigneeUsernames?: string[];
79
+ reviewerUsernames?: string[];
80
+ labelNames?: string[];
81
+ }, userConfig?: UserConfig): Promise<any>;
82
+ getTypeFields(typeName: string): string[];
83
+ globalSearch(searchTerm?: string, scope?: string, userConfig?: UserConfig): Promise<any>;
84
+ searchProjects(searchTerm: string, first?: number, after?: string, userConfig?: UserConfig): Promise<any>;
85
+ private getTypeName;
86
+ private getEnumValues;
87
+ searchIssues(searchTerm?: string, projectPath?: string, state?: string, first?: number, after?: string, userConfig?: UserConfig, assigneeUsernames?: string[], authorUsername?: string, labelNames?: string[]): Promise<any>;
88
+ searchMergeRequests(searchTerm: string, projectPath?: string, state?: string, first?: number, after?: string, userConfig?: UserConfig): Promise<any>;
89
+ searchRepositoryFiles(projectPath: string, path: string, ref?: string, userConfig?: UserConfig): Promise<any>;
90
+ resolvePath(fullPath: string, first?: number, after?: string, userConfig?: UserConfig): Promise<any>;
91
+ getGroup(fullPath: string, first?: number, after?: string, searchTerm?: string, userConfig?: UserConfig): Promise<any>;
92
+ getFileContent(projectPath: string, filePath: string, ref?: string, userConfig?: UserConfig): Promise<any>;
93
+ searchUsers(searchTerm: string, first?: number, userConfig?: UserConfig): Promise<any>;
94
+ searchGroups(searchTerm: string, first?: number, userConfig?: UserConfig): Promise<any>;
95
+ }
96
+ //# sourceMappingURL=gitlab-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitlab-client.d.ts","sourceRoot":"","sources":["../src/gitlab-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGtD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,QAAQ,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC3D,CAAC;CACH;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpC,SAAgB,WAAW,EAAE,OAAO,CAAC;IACrC,SAAgB,aAAa,EAAE,OAAO,CAAC;IACvC,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpC,SAAgB,aAAa,CAAC,EAAE,KAAK,CAAC;gBAGpC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,KAAK,CAAC;KAClB;CAWT;AAWD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,WAAW,CAAyC;gBAEhD,MAAM,EAAE,MAAM;IAS1B,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,OAAO,CAAC,UAAU;IA0GlB;;OAEG;YACW,gBAAgB;IAgD9B,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,SAAS;IAwBX,gBAAgB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxD,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,aAAa,UAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;IAQ1G,cAAc,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAerD,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IA4BnE,WAAW,CAAC,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAmBtF,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAuBzG,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IA0BhH,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IA8C5G,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAkDf,SAAS;IAIT,mBAAmB,IAAI,MAAM,EAAE;IAS/B,qBAAqB,IAAI,MAAM,EAAE;IAU3B,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IActF,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAgBpG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAkBhH,oBAAoB,CACxB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,EACD,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAiET,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAc7F,2BAA2B,CAC/B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,EACD,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAgFf,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAQnC,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IA+BxF,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAqBnH,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,aAAa;IAOf,YAAY,CAChB,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,UAAU,EACvB,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAC5B,cAAc,CAAC,EAAE,MAAM,EACvB,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,GAAG,CAAC;IA6FT,mBAAmB,CACvB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IA4GT,qBAAqB,CACzB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAmCT,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAqCxG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IA6B1H,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IA2BT,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAmB1F,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;CAmBlG"}