@brainfile/cli 0.11.1 → 0.12.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.
Files changed (75) hide show
  1. package/brainfile.md +82 -5
  2. package/dist/cli.js +30 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/archive.d.ts +15 -2
  5. package/dist/commands/archive.d.ts.map +1 -1
  6. package/dist/commands/archive.js +351 -23
  7. package/dist/commands/archive.js.map +1 -1
  8. package/dist/commands/auth.d.ts +26 -0
  9. package/dist/commands/auth.d.ts.map +1 -0
  10. package/dist/commands/auth.js +141 -0
  11. package/dist/commands/auth.js.map +1 -0
  12. package/dist/tui/BrainfileTUI.d.ts.map +1 -1
  13. package/dist/tui/BrainfileTUI.js +69 -36
  14. package/dist/tui/BrainfileTUI.js.map +1 -1
  15. package/dist/tui/components/ArchivePanel.d.ts +3 -2
  16. package/dist/tui/components/ArchivePanel.d.ts.map +1 -1
  17. package/dist/tui/components/ArchivePanel.js +7 -6
  18. package/dist/tui/components/ArchivePanel.js.map +1 -1
  19. package/dist/tui/components/Header.d.ts +4 -1
  20. package/dist/tui/components/Header.d.ts.map +1 -1
  21. package/dist/tui/components/Header.js +25 -1
  22. package/dist/tui/components/Header.js.map +1 -1
  23. package/dist/tui/components/HelpOverlay.d.ts +3 -1
  24. package/dist/tui/components/HelpOverlay.d.ts.map +1 -1
  25. package/dist/tui/components/HelpOverlay.js +38 -1
  26. package/dist/tui/components/HelpOverlay.js.map +1 -1
  27. package/dist/tui/components/MainPanelTabs.d.ts +3 -2
  28. package/dist/tui/components/MainPanelTabs.d.ts.map +1 -1
  29. package/dist/tui/components/MainPanelTabs.js +20 -1
  30. package/dist/tui/components/MainPanelTabs.js.map +1 -1
  31. package/dist/tui/components/RulesPanel.d.ts +3 -2
  32. package/dist/tui/components/RulesPanel.d.ts.map +1 -1
  33. package/dist/tui/components/RulesPanel.js +20 -6
  34. package/dist/tui/components/RulesPanel.js.map +1 -1
  35. package/dist/tui/components/StackedTaskList.d.ts +26 -0
  36. package/dist/tui/components/StackedTaskList.d.ts.map +1 -0
  37. package/dist/tui/components/StackedTaskList.js +120 -0
  38. package/dist/tui/components/StackedTaskList.js.map +1 -0
  39. package/dist/tui/components/StatusBar.d.ts +3 -2
  40. package/dist/tui/components/StatusBar.d.ts.map +1 -1
  41. package/dist/tui/components/StatusBar.js +6 -3
  42. package/dist/tui/components/StatusBar.js.map +1 -1
  43. package/dist/tui/components/TaskCard.d.ts +3 -1
  44. package/dist/tui/components/TaskCard.d.ts.map +1 -1
  45. package/dist/tui/components/TaskCard.js +3 -2
  46. package/dist/tui/components/TaskCard.js.map +1 -1
  47. package/dist/tui/components/index.d.ts +2 -0
  48. package/dist/tui/components/index.d.ts.map +1 -1
  49. package/dist/tui/components/index.js +4 -1
  50. package/dist/tui/components/index.js.map +1 -1
  51. package/dist/tui/hooks/useKeyboardNavigation.d.ts +6 -2
  52. package/dist/tui/hooks/useKeyboardNavigation.d.ts.map +1 -1
  53. package/dist/tui/hooks/useKeyboardNavigation.js +88 -40
  54. package/dist/tui/hooks/useKeyboardNavigation.js.map +1 -1
  55. package/dist/tui/types.d.ts +9 -0
  56. package/dist/tui/types.d.ts.map +1 -1
  57. package/dist/tui/types.js +7 -1
  58. package/dist/tui/types.js.map +1 -1
  59. package/dist/utils/auth-store.d.ts +69 -0
  60. package/dist/utils/auth-store.d.ts.map +1 -0
  61. package/dist/utils/auth-store.js +308 -0
  62. package/dist/utils/auth-store.js.map +1 -0
  63. package/dist/utils/config.d.ts +89 -0
  64. package/dist/utils/config.d.ts.map +1 -0
  65. package/dist/utils/config.js +211 -0
  66. package/dist/utils/config.js.map +1 -0
  67. package/dist/utils/github-auth.d.ts +56 -0
  68. package/dist/utils/github-auth.d.ts.map +1 -0
  69. package/dist/utils/github-auth.js +341 -0
  70. package/dist/utils/github-auth.js.map +1 -0
  71. package/dist/utils/linear-auth.d.ts +59 -0
  72. package/dist/utils/linear-auth.d.ts.map +1 -0
  73. package/dist/utils/linear-auth.js +295 -0
  74. package/dist/utils/linear-auth.js.map +1 -0
  75. package/package.json +3 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-auth.d.ts","sourceRoot":"","sources":["../../src/utils/github-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA+CH;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE7D;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsCnE;AAwLD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC3B,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiEzF;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD"}
@@ -0,0 +1,341 @@
1
+ "use strict";
2
+ /**
3
+ * GitHub Authentication for Brainfile CLI
4
+ *
5
+ * Supports:
6
+ * 1. Piggyback on gh CLI auth (if available)
7
+ * 2. OAuth Device Flow (browser-based, no server needed)
8
+ * 3. Personal Access Token (manual entry)
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ var __importDefault = (this && this.__importDefault) || function (mod) {
46
+ return (mod && mod.__esModule) ? mod : { "default": mod };
47
+ };
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.isGitHubAuthenticated = isGitHubAuthenticated;
50
+ exports.getGitHubToken = getGitHubToken;
51
+ exports.authenticateGitHub = authenticateGitHub;
52
+ exports.createGitHubIssue = createGitHubIssue;
53
+ exports.logoutGitHub = logoutGitHub;
54
+ const chalk_1 = __importDefault(require("chalk"));
55
+ const auth_store_1 = require("./auth-store");
56
+ // ============================================================================
57
+ // Constants
58
+ // ============================================================================
59
+ // GitHub OAuth App Client ID for Brainfile
60
+ // This is a public client ID for the device flow - safe to commit
61
+ // TODO: Register a Brainfile OAuth App and replace this
62
+ const GITHUB_CLIENT_ID = process.env.BRAINFILE_GITHUB_CLIENT_ID || 'Ov23liYourClientId';
63
+ const GITHUB_DEVICE_CODE_URL = 'https://github.com/login/device/code';
64
+ const GITHUB_TOKEN_URL = 'https://github.com/login/oauth/access_token';
65
+ const GITHUB_API_URL = 'https://api.github.com';
66
+ // ============================================================================
67
+ // GitHub Auth Functions
68
+ // ============================================================================
69
+ /**
70
+ * Check if GitHub is already authenticated
71
+ */
72
+ async function isGitHubAuthenticated() {
73
+ return await auth_store_1.authStore.isAuthenticated('github');
74
+ }
75
+ /**
76
+ * Get the current GitHub token (from any source)
77
+ */
78
+ async function getGitHubToken() {
79
+ return await auth_store_1.authStore.get('github');
80
+ }
81
+ /**
82
+ * Authenticate with GitHub using the best available method
83
+ *
84
+ * Priority:
85
+ * 1. Use existing gh CLI auth
86
+ * 2. OAuth Device Flow
87
+ * 3. Manual PAT entry
88
+ */
89
+ async function authenticateGitHub(options) {
90
+ const { usePAT, token, silent } = options;
91
+ // If token provided directly, verify and store it
92
+ if (token) {
93
+ return await verifyAndStoreToken(token, silent);
94
+ }
95
+ // If PAT mode requested, prompt for token
96
+ if (usePAT) {
97
+ return { success: false, error: 'PAT mode requires --token flag with token value' };
98
+ }
99
+ // Check if gh CLI is available
100
+ if ((0, auth_store_1.isGitHubCLIAvailable)()) {
101
+ const ghToken = (0, auth_store_1.getGitHubCLIToken)();
102
+ if (ghToken) {
103
+ if (!silent) {
104
+ console.log(chalk_1.default.green('✓') + ' Found existing GitHub CLI authentication');
105
+ }
106
+ // Verify the token and get username
107
+ const user = await getGitHubUser(ghToken);
108
+ if (user) {
109
+ // Store it in our auth store too for consistency
110
+ await auth_store_1.authStore.set('github', ghToken, { username: user.login });
111
+ if (!silent) {
112
+ console.log(chalk_1.default.green('✓') + ` Authenticated as ${chalk_1.default.cyan('@' + user.login)}`);
113
+ }
114
+ return { success: true, username: user.login };
115
+ }
116
+ }
117
+ }
118
+ // Fall back to OAuth Device Flow
119
+ return await deviceFlowAuth(silent);
120
+ }
121
+ /**
122
+ * Verify a token and store it
123
+ */
124
+ async function verifyAndStoreToken(token, silent) {
125
+ const user = await getGitHubUser(token);
126
+ if (!user) {
127
+ return { success: false, error: 'Invalid token or token lacks required permissions' };
128
+ }
129
+ await auth_store_1.authStore.set('github', token, { username: user.login });
130
+ if (!silent) {
131
+ console.log(chalk_1.default.green('✓') + ' Token verified');
132
+ console.log(chalk_1.default.green('✓') + ` Authenticated as ${chalk_1.default.cyan('@' + user.login)}`);
133
+ }
134
+ return { success: true, username: user.login };
135
+ }
136
+ /**
137
+ * OAuth Device Flow authentication
138
+ */
139
+ async function deviceFlowAuth(silent) {
140
+ if (!silent) {
141
+ console.log('');
142
+ console.log('Starting GitHub OAuth authentication...');
143
+ console.log('');
144
+ }
145
+ try {
146
+ // Step 1: Request device code
147
+ const deviceCode = await requestDeviceCode();
148
+ if (!silent) {
149
+ console.log(chalk_1.default.yellow('!') + ` First, copy your one-time code: ${chalk_1.default.bold.cyan(deviceCode.user_code)}`);
150
+ console.log('');
151
+ console.log(`Then visit: ${chalk_1.default.underline(deviceCode.verification_uri)}`);
152
+ console.log('');
153
+ }
154
+ // Try to open browser
155
+ try {
156
+ const open = await Promise.resolve().then(() => __importStar(require('open')));
157
+ await open.default(deviceCode.verification_uri);
158
+ if (!silent) {
159
+ console.log(chalk_1.default.gray('(Opening browser...)'));
160
+ }
161
+ }
162
+ catch {
163
+ // Browser open failed, user will need to manually navigate
164
+ }
165
+ if (!silent) {
166
+ console.log('');
167
+ console.log('Waiting for authentication...');
168
+ }
169
+ // Step 2: Poll for token
170
+ const token = await pollForToken(deviceCode);
171
+ if (!token) {
172
+ return { success: false, error: 'Authentication timed out or was denied' };
173
+ }
174
+ // Step 3: Verify and store
175
+ return await verifyAndStoreToken(token, silent);
176
+ }
177
+ catch (error) {
178
+ return {
179
+ success: false,
180
+ error: error instanceof Error ? error.message : 'Unknown error during authentication',
181
+ };
182
+ }
183
+ }
184
+ /**
185
+ * Request a device code from GitHub
186
+ */
187
+ async function requestDeviceCode() {
188
+ const response = await fetch(GITHUB_DEVICE_CODE_URL, {
189
+ method: 'POST',
190
+ headers: {
191
+ Accept: 'application/json',
192
+ 'Content-Type': 'application/x-www-form-urlencoded',
193
+ },
194
+ body: new URLSearchParams({
195
+ client_id: GITHUB_CLIENT_ID,
196
+ scope: 'repo',
197
+ }),
198
+ });
199
+ if (!response.ok) {
200
+ throw new Error(`Failed to request device code: ${response.status}`);
201
+ }
202
+ return (await response.json());
203
+ }
204
+ /**
205
+ * Poll for the access token after user authorizes
206
+ */
207
+ async function pollForToken(deviceCode) {
208
+ const startTime = Date.now();
209
+ const expiresAt = startTime + deviceCode.expires_in * 1000;
210
+ const interval = Math.max(deviceCode.interval, 5) * 1000; // At least 5 seconds
211
+ while (Date.now() < expiresAt) {
212
+ await sleep(interval);
213
+ const response = await fetch(GITHUB_TOKEN_URL, {
214
+ method: 'POST',
215
+ headers: {
216
+ Accept: 'application/json',
217
+ 'Content-Type': 'application/x-www-form-urlencoded',
218
+ },
219
+ body: new URLSearchParams({
220
+ client_id: GITHUB_CLIENT_ID,
221
+ device_code: deviceCode.device_code,
222
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
223
+ }),
224
+ });
225
+ const data = (await response.json());
226
+ if (data.access_token) {
227
+ return data.access_token;
228
+ }
229
+ if (data.error === 'authorization_pending') {
230
+ // User hasn't authorized yet, keep polling
231
+ continue;
232
+ }
233
+ if (data.error === 'slow_down') {
234
+ // Back off
235
+ await sleep(5000);
236
+ continue;
237
+ }
238
+ if (data.error === 'expired_token') {
239
+ throw new Error('Device code expired. Please try again.');
240
+ }
241
+ if (data.error === 'access_denied') {
242
+ throw new Error('Authorization was denied.');
243
+ }
244
+ if (data.error) {
245
+ throw new Error(data.error_description || data.error);
246
+ }
247
+ }
248
+ return null;
249
+ }
250
+ /**
251
+ * Get the authenticated GitHub user
252
+ */
253
+ async function getGitHubUser(token) {
254
+ try {
255
+ const response = await fetch(`${GITHUB_API_URL}/user`, {
256
+ headers: {
257
+ Authorization: `Bearer ${token}`,
258
+ Accept: 'application/vnd.github.v3+json',
259
+ 'User-Agent': 'brainfile-cli',
260
+ },
261
+ });
262
+ if (!response.ok) {
263
+ return null;
264
+ }
265
+ return (await response.json());
266
+ }
267
+ catch {
268
+ return null;
269
+ }
270
+ }
271
+ /**
272
+ * Create a GitHub Issue
273
+ */
274
+ async function createGitHubIssue(options) {
275
+ const token = await getGitHubToken();
276
+ if (!token) {
277
+ return { success: false, error: 'Not authenticated with GitHub. Run: brainfile auth github' };
278
+ }
279
+ try {
280
+ // Create the issue
281
+ const createResponse = await fetch(`${GITHUB_API_URL}/repos/${options.owner}/${options.repo}/issues`, {
282
+ method: 'POST',
283
+ headers: {
284
+ Authorization: `Bearer ${token}`,
285
+ Accept: 'application/vnd.github.v3+json',
286
+ 'User-Agent': 'brainfile-cli',
287
+ 'Content-Type': 'application/json',
288
+ },
289
+ body: JSON.stringify({
290
+ title: options.title,
291
+ body: options.body,
292
+ labels: options.labels,
293
+ }),
294
+ });
295
+ if (!createResponse.ok) {
296
+ const errorData = await createResponse.json();
297
+ return {
298
+ success: false,
299
+ error: `Failed to create issue: ${errorData.message || createResponse.status}`,
300
+ };
301
+ }
302
+ const issue = (await createResponse.json());
303
+ // Close the issue if requested
304
+ if (options.state === 'closed') {
305
+ await fetch(`${GITHUB_API_URL}/repos/${options.owner}/${options.repo}/issues/${issue.number}`, {
306
+ method: 'PATCH',
307
+ headers: {
308
+ Authorization: `Bearer ${token}`,
309
+ Accept: 'application/vnd.github.v3+json',
310
+ 'User-Agent': 'brainfile-cli',
311
+ 'Content-Type': 'application/json',
312
+ },
313
+ body: JSON.stringify({ state: 'closed' }),
314
+ });
315
+ }
316
+ return {
317
+ success: true,
318
+ issueNumber: issue.number,
319
+ issueUrl: issue.html_url,
320
+ };
321
+ }
322
+ catch (err) {
323
+ return {
324
+ success: false,
325
+ error: err instanceof Error ? err.message : 'Unknown error creating issue',
326
+ };
327
+ }
328
+ }
329
+ /**
330
+ * Logout from GitHub
331
+ */
332
+ async function logoutGitHub() {
333
+ await auth_store_1.authStore.clear('github');
334
+ }
335
+ // ============================================================================
336
+ // Helpers
337
+ // ============================================================================
338
+ function sleep(ms) {
339
+ return new Promise((resolve) => setTimeout(resolve, ms));
340
+ }
341
+ //# sourceMappingURL=github-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-auth.js","sourceRoot":"","sources":["../../src/utils/github-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Linear Authentication for Brainfile CLI
3
+ *
4
+ * Supports:
5
+ * 1. OAuth Device Flow (browser-based)
6
+ * 2. API Key (manual entry)
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ interface LinearTeam {
11
+ id: string;
12
+ name: string;
13
+ key: string;
14
+ }
15
+ /**
16
+ * Check if Linear is already authenticated
17
+ */
18
+ export declare function isLinearAuthenticated(): Promise<boolean>;
19
+ /**
20
+ * Get the current Linear token
21
+ */
22
+ export declare function getLinearToken(): Promise<string | null>;
23
+ /**
24
+ * Authenticate with Linear using API key
25
+ */
26
+ export declare function authenticateLinear(options: {
27
+ token?: string;
28
+ silent?: boolean;
29
+ }): Promise<{
30
+ success: boolean;
31
+ workspace?: string;
32
+ error?: string;
33
+ }>;
34
+ /**
35
+ * Get Linear teams
36
+ */
37
+ export declare function getLinearTeams(): Promise<LinearTeam[]>;
38
+ /**
39
+ * Create a Linear issue
40
+ */
41
+ export declare function createLinearIssue(options: {
42
+ teamId: string;
43
+ title: string;
44
+ description?: string;
45
+ priority?: number;
46
+ labelNames?: string[];
47
+ stateName?: string;
48
+ }): Promise<{
49
+ success: boolean;
50
+ issueId?: string;
51
+ issueUrl?: string;
52
+ error?: string;
53
+ }>;
54
+ /**
55
+ * Logout from Linear
56
+ */
57
+ export declare function logoutLinear(): Promise<void>;
58
+ export {};
59
+ //# sourceMappingURL=linear-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-auth.d.ts","sourceRoot":"","sources":["../../src/utils/linear-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAiBD;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE7D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoCpE;AAuED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAqC5D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmFrF;AA6DD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD"}