@sparkleideas/providers 3.0.0-alpha.6-patch.17 → 3.0.0-alpha.6-patch.18

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.
@@ -1,489 +0,0 @@
1
- "use strict";
2
- /**
3
- * V3 Ollama Provider (Local Models)
4
- *
5
- * Supports Llama, Mistral, CodeLlama, Phi, and other local models.
6
- * Zero cost - runs entirely locally.
7
- *
8
- * @module @sparkleideas/providers/ollama-provider
9
- */
10
- var __extends = (this && this.__extends) || (function () {
11
- var extendStatics = function (d, b) {
12
- extendStatics = Object.setPrototypeOf ||
13
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
14
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
15
- return extendStatics(d, b);
16
- };
17
- return function (d, b) {
18
- if (typeof b !== "function" && b !== null)
19
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
20
- extendStatics(d, b);
21
- function __() { this.constructor = d; }
22
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
23
- };
24
- })();
25
- var __assign = (this && this.__assign) || function () {
26
- __assign = Object.assign || function(t) {
27
- for (var s, i = 1, n = arguments.length; i < n; i++) {
28
- s = arguments[i];
29
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
30
- t[p] = s[p];
31
- }
32
- return t;
33
- };
34
- return __assign.apply(this, arguments);
35
- };
36
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
- return new (P || (P = Promise))(function (resolve, reject) {
39
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
- step((generator = generator.apply(thisArg, _arguments || [])).next());
43
- });
44
- };
45
- var __generator = (this && this.__generator) || function (thisArg, body) {
46
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
47
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
48
- function verb(n) { return function (v) { return step([n, v]); }; }
49
- function step(op) {
50
- if (f) throw new TypeError("Generator is already executing.");
51
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
52
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
53
- if (y = 0, t) op = [op[0] & 2, t.value];
54
- switch (op[0]) {
55
- case 0: case 1: t = op; break;
56
- case 4: _.label++; return { value: op[1], done: false };
57
- case 5: _.label++; y = op[1]; op = [0]; continue;
58
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
59
- default:
60
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
61
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
62
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
63
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
64
- if (t[2]) _.ops.pop();
65
- _.trys.pop(); continue;
66
- }
67
- op = body.call(thisArg, _);
68
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
69
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
70
- }
71
- };
72
- var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
73
- var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
74
- if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
75
- var g = generator.apply(thisArg, _arguments || []), i, q = [];
76
- return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
77
- function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
78
- function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
79
- function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
80
- function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
81
- function fulfill(value) { resume("next", value); }
82
- function reject(value) { resume("throw", value); }
83
- function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
84
- };
85
- Object.defineProperty(exports, "__esModule", { value: true });
86
- exports.OllamaProvider = void 0;
87
- var base_provider_js_1 = require("./base-provider.js");
88
- var types_js_1 = require("./types.js");
89
- var OllamaProvider = /** @class */ (function (_super) {
90
- __extends(OllamaProvider, _super);
91
- function OllamaProvider(options) {
92
- var _this = _super.call(this, options) || this;
93
- _this.name = 'ollama';
94
- _this.capabilities = {
95
- supportedModels: [
96
- 'llama3.2',
97
- 'llama3.1',
98
- 'mistral',
99
- 'mixtral',
100
- 'codellama',
101
- 'phi-4',
102
- 'deepseek-coder',
103
- ],
104
- maxContextLength: {
105
- 'llama3.2': 128000,
106
- 'llama3.1': 128000,
107
- 'mistral': 32000,
108
- 'mixtral': 32000,
109
- 'codellama': 16000,
110
- 'phi-4': 16000,
111
- 'deepseek-coder': 16000,
112
- },
113
- maxOutputTokens: {
114
- 'llama3.2': 8192,
115
- 'llama3.1': 8192,
116
- 'mistral': 8192,
117
- 'mixtral': 8192,
118
- 'codellama': 8192,
119
- 'phi-4': 8192,
120
- 'deepseek-coder': 8192,
121
- },
122
- supportsStreaming: true,
123
- supportsToolCalling: true,
124
- supportsSystemMessages: true,
125
- supportsVision: true, // Some models
126
- supportsAudio: false,
127
- supportsFineTuning: false,
128
- supportsEmbeddings: true,
129
- supportsBatching: false,
130
- rateLimit: {
131
- requestsPerMinute: 10000, // Local - no rate limit
132
- tokensPerMinute: 10000000,
133
- concurrentRequests: 10,
134
- },
135
- // All free - local execution
136
- pricing: {
137
- 'llama3.2': { promptCostPer1k: 0, completionCostPer1k: 0, currency: 'USD' },
138
- 'llama3.1': { promptCostPer1k: 0, completionCostPer1k: 0, currency: 'USD' },
139
- 'mistral': { promptCostPer1k: 0, completionCostPer1k: 0, currency: 'USD' },
140
- 'mixtral': { promptCostPer1k: 0, completionCostPer1k: 0, currency: 'USD' },
141
- 'codellama': { promptCostPer1k: 0, completionCostPer1k: 0, currency: 'USD' },
142
- 'phi-4': { promptCostPer1k: 0, completionCostPer1k: 0, currency: 'USD' },
143
- 'deepseek-coder': { promptCostPer1k: 0, completionCostPer1k: 0, currency: 'USD' },
144
- },
145
- };
146
- _this.baseUrl = 'http://localhost:11434';
147
- return _this;
148
- }
149
- OllamaProvider.prototype.doInitialize = function () {
150
- return __awaiter(this, void 0, void 0, function () {
151
- var health;
152
- return __generator(this, function (_a) {
153
- switch (_a.label) {
154
- case 0:
155
- this.baseUrl = this.config.apiUrl || 'http://localhost:11434';
156
- return [4 /*yield*/, this.doHealthCheck()];
157
- case 1:
158
- health = _a.sent();
159
- if (!health.healthy) {
160
- this.logger.warn('Ollama server not detected. Ensure Ollama is running locally.');
161
- }
162
- return [2 /*return*/];
163
- }
164
- });
165
- });
166
- };
167
- OllamaProvider.prototype.doComplete = function (request) {
168
- return __awaiter(this, void 0, void 0, function () {
169
- var ollamaRequest, controller, timeout, response, data, error_1;
170
- return __generator(this, function (_a) {
171
- switch (_a.label) {
172
- case 0:
173
- ollamaRequest = this.buildRequest(request);
174
- controller = new AbortController();
175
- timeout = setTimeout(function () { return controller.abort(); }, this.config.timeout || 120000);
176
- _a.label = 1;
177
- case 1:
178
- _a.trys.push([1, 6, , 7]);
179
- return [4 /*yield*/, fetch("".concat(this.baseUrl, "/api/chat"), {
180
- method: 'POST',
181
- headers: { 'Content-Type': 'application/json' },
182
- body: JSON.stringify(ollamaRequest),
183
- signal: controller.signal,
184
- })];
185
- case 2:
186
- response = _a.sent();
187
- clearTimeout(timeout);
188
- if (!!response.ok) return [3 /*break*/, 4];
189
- return [4 /*yield*/, this.handleErrorResponse(response)];
190
- case 3:
191
- _a.sent();
192
- _a.label = 4;
193
- case 4: return [4 /*yield*/, response.json()];
194
- case 5:
195
- data = _a.sent();
196
- return [2 /*return*/, this.transformResponse(data, request)];
197
- case 6:
198
- error_1 = _a.sent();
199
- clearTimeout(timeout);
200
- throw this.transformError(error_1);
201
- case 7: return [2 /*return*/];
202
- }
203
- });
204
- });
205
- };
206
- OllamaProvider.prototype.doStreamComplete = function (request) {
207
- return __asyncGenerator(this, arguments, function doStreamComplete_1() {
208
- var ollamaRequest, controller, timeout, response, reader, decoder, buffer, promptTokens, completionTokens, _a, done, value, lines, _i, lines_1, line, chunk, _b, error_2;
209
- var _c;
210
- return __generator(this, function (_d) {
211
- switch (_d.label) {
212
- case 0:
213
- ollamaRequest = this.buildRequest(request, true);
214
- controller = new AbortController();
215
- timeout = setTimeout(function () { return controller.abort(); }, (this.config.timeout || 120000) * 2);
216
- _d.label = 1;
217
- case 1:
218
- _d.trys.push([1, 19, 20, 21]);
219
- return [4 /*yield*/, __await(fetch("".concat(this.baseUrl, "/api/chat"), {
220
- method: 'POST',
221
- headers: { 'Content-Type': 'application/json' },
222
- body: JSON.stringify(ollamaRequest),
223
- signal: controller.signal,
224
- }))];
225
- case 2:
226
- response = _d.sent();
227
- if (!!response.ok) return [3 /*break*/, 4];
228
- return [4 /*yield*/, __await(this.handleErrorResponse(response))];
229
- case 3:
230
- _d.sent();
231
- _d.label = 4;
232
- case 4:
233
- reader = response.body.getReader();
234
- decoder = new TextDecoder();
235
- buffer = '';
236
- promptTokens = 0;
237
- completionTokens = 0;
238
- _d.label = 5;
239
- case 5:
240
- if (!true) return [3 /*break*/, 18];
241
- return [4 /*yield*/, __await(reader.read())];
242
- case 6:
243
- _a = _d.sent(), done = _a.done, value = _a.value;
244
- if (done)
245
- return [3 /*break*/, 18];
246
- buffer += decoder.decode(value, { stream: true });
247
- lines = buffer.split('\n');
248
- buffer = lines.pop() || '';
249
- _i = 0, lines_1 = lines;
250
- _d.label = 7;
251
- case 7:
252
- if (!(_i < lines_1.length)) return [3 /*break*/, 17];
253
- line = lines_1[_i];
254
- if (!line.trim())
255
- return [3 /*break*/, 16];
256
- _d.label = 8;
257
- case 8:
258
- _d.trys.push([8, 15, , 16]);
259
- chunk = JSON.parse(line);
260
- if (!((_c = chunk.message) === null || _c === void 0 ? void 0 : _c.content)) return [3 /*break*/, 11];
261
- return [4 /*yield*/, __await({
262
- type: 'content',
263
- delta: { content: chunk.message.content },
264
- })];
265
- case 9: return [4 /*yield*/, _d.sent()];
266
- case 10:
267
- _d.sent();
268
- _d.label = 11;
269
- case 11:
270
- if (!chunk.done) return [3 /*break*/, 14];
271
- promptTokens = chunk.prompt_eval_count || 0;
272
- completionTokens = chunk.eval_count || 0;
273
- return [4 /*yield*/, __await({
274
- type: 'done',
275
- usage: {
276
- promptTokens: promptTokens,
277
- completionTokens: completionTokens,
278
- totalTokens: promptTokens + completionTokens,
279
- },
280
- cost: {
281
- promptCost: 0,
282
- completionCost: 0,
283
- totalCost: 0,
284
- currency: 'USD',
285
- },
286
- })];
287
- case 12: return [4 /*yield*/, _d.sent()];
288
- case 13:
289
- _d.sent();
290
- _d.label = 14;
291
- case 14: return [3 /*break*/, 16];
292
- case 15:
293
- _b = _d.sent();
294
- return [3 /*break*/, 16];
295
- case 16:
296
- _i++;
297
- return [3 /*break*/, 7];
298
- case 17: return [3 /*break*/, 5];
299
- case 18: return [3 /*break*/, 21];
300
- case 19:
301
- error_2 = _d.sent();
302
- clearTimeout(timeout);
303
- throw this.transformError(error_2);
304
- case 20:
305
- clearTimeout(timeout);
306
- return [7 /*endfinally*/];
307
- case 21: return [2 /*return*/];
308
- }
309
- });
310
- });
311
- };
312
- OllamaProvider.prototype.listModels = function () {
313
- return __awaiter(this, void 0, void 0, function () {
314
- var response, data, _a;
315
- var _b;
316
- return __generator(this, function (_c) {
317
- switch (_c.label) {
318
- case 0:
319
- _c.trys.push([0, 3, , 4]);
320
- return [4 /*yield*/, fetch("".concat(this.baseUrl, "/api/tags"))];
321
- case 1:
322
- response = _c.sent();
323
- if (!response.ok) {
324
- return [2 /*return*/, this.capabilities.supportedModels];
325
- }
326
- return [4 /*yield*/, response.json()];
327
- case 2:
328
- data = _c.sent();
329
- return [2 /*return*/, ((_b = data.models) === null || _b === void 0 ? void 0 : _b.map(function (m) { return m.name; })) || this.capabilities.supportedModels];
330
- case 3:
331
- _a = _c.sent();
332
- return [2 /*return*/, this.capabilities.supportedModels];
333
- case 4: return [2 /*return*/];
334
- }
335
- });
336
- });
337
- };
338
- OllamaProvider.prototype.getModelInfo = function (model) {
339
- return __awaiter(this, void 0, void 0, function () {
340
- var descriptions;
341
- return __generator(this, function (_a) {
342
- descriptions = {
343
- 'llama3.2': 'Meta Llama 3.2 - Fast and capable',
344
- 'llama3.1': 'Meta Llama 3.1 - High performance',
345
- 'mistral': 'Mistral 7B - Efficient and fast',
346
- 'mixtral': 'Mixtral 8x7B - Mixture of experts',
347
- 'codellama': 'Code Llama - Optimized for code',
348
- 'phi-4': 'Microsoft Phi-4 - Small but powerful',
349
- 'deepseek-coder': 'DeepSeek Coder - Code specialist',
350
- };
351
- return [2 /*return*/, {
352
- model: model,
353
- name: model,
354
- description: descriptions[model] || 'Local Ollama model',
355
- contextLength: this.capabilities.maxContextLength[model] || 8192,
356
- maxOutputTokens: this.capabilities.maxOutputTokens[model] || 4096,
357
- supportedFeatures: ['chat', 'completion', 'local'],
358
- pricing: { promptCostPer1k: 0, completionCostPer1k: 0, currency: 'USD' },
359
- }];
360
- });
361
- });
362
- };
363
- OllamaProvider.prototype.doHealthCheck = function () {
364
- return __awaiter(this, void 0, void 0, function () {
365
- var response, error_3;
366
- return __generator(this, function (_a) {
367
- switch (_a.label) {
368
- case 0:
369
- _a.trys.push([0, 2, , 3]);
370
- return [4 /*yield*/, fetch("".concat(this.baseUrl, "/api/tags"))];
371
- case 1:
372
- response = _a.sent();
373
- return [2 /*return*/, __assign({ healthy: response.ok, timestamp: new Date(), details: {
374
- server: 'ollama',
375
- local: true,
376
- } }, (response.ok ? {} : { error: "HTTP ".concat(response.status) }))];
377
- case 2:
378
- error_3 = _a.sent();
379
- return [2 /*return*/, {
380
- healthy: false,
381
- error: error_3 instanceof Error ? error_3.message : 'Ollama server not reachable',
382
- timestamp: new Date(),
383
- details: {
384
- hint: 'Ensure Ollama is running: ollama serve',
385
- },
386
- }];
387
- case 3: return [2 /*return*/];
388
- }
389
- });
390
- });
391
- };
392
- OllamaProvider.prototype.buildRequest = function (request, stream) {
393
- var _a, _b, _c;
394
- if (stream === void 0) { stream = false; }
395
- var ollamaRequest = {
396
- model: request.model || this.config.model,
397
- messages: request.messages.map(function (msg) { return ({
398
- role: msg.role === 'tool' ? 'assistant' : msg.role,
399
- content: typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content),
400
- }); }),
401
- stream: stream,
402
- };
403
- var options = {};
404
- if (request.temperature !== undefined || this.config.temperature !== undefined) {
405
- options.temperature = (_a = request.temperature) !== null && _a !== void 0 ? _a : this.config.temperature;
406
- }
407
- if (request.topP !== undefined || this.config.topP !== undefined) {
408
- options.top_p = (_b = request.topP) !== null && _b !== void 0 ? _b : this.config.topP;
409
- }
410
- if (request.topK !== undefined || this.config.topK !== undefined) {
411
- options.top_k = (_c = request.topK) !== null && _c !== void 0 ? _c : this.config.topK;
412
- }
413
- if (request.maxTokens || this.config.maxTokens) {
414
- options.num_predict = request.maxTokens || this.config.maxTokens;
415
- }
416
- if (request.stopSequences || this.config.stopSequences) {
417
- options.stop = request.stopSequences || this.config.stopSequences;
418
- }
419
- if (Object.keys(options).length > 0) {
420
- ollamaRequest.options = options;
421
- }
422
- if (request.tools) {
423
- ollamaRequest.tools = request.tools;
424
- }
425
- return ollamaRequest;
426
- };
427
- OllamaProvider.prototype.transformResponse = function (data, request) {
428
- var _a;
429
- var model = request.model || this.config.model;
430
- var promptTokens = data.prompt_eval_count || 0;
431
- var completionTokens = data.eval_count || 0;
432
- var toolCalls = (_a = data.message.tool_calls) === null || _a === void 0 ? void 0 : _a.map(function (tc) { return ({
433
- id: "tool_".concat(Date.now()),
434
- type: 'function',
435
- function: {
436
- name: tc.function.name,
437
- arguments: JSON.stringify(tc.function.arguments),
438
- },
439
- }); });
440
- return {
441
- id: "ollama-".concat(Date.now()),
442
- model: model,
443
- provider: 'ollama',
444
- content: data.message.content,
445
- toolCalls: (toolCalls === null || toolCalls === void 0 ? void 0 : toolCalls.length) ? toolCalls : undefined,
446
- usage: {
447
- promptTokens: promptTokens,
448
- completionTokens: completionTokens,
449
- totalTokens: promptTokens + completionTokens,
450
- },
451
- cost: {
452
- promptCost: 0,
453
- completionCost: 0,
454
- totalCost: 0,
455
- currency: 'USD',
456
- },
457
- finishReason: data.done ? 'stop' : 'length',
458
- latency: data.total_duration ? data.total_duration / 1e6 : undefined, // Convert ns to ms
459
- };
460
- };
461
- OllamaProvider.prototype.handleErrorResponse = function (response) {
462
- return __awaiter(this, void 0, void 0, function () {
463
- var errorText, errorData, message;
464
- return __generator(this, function (_a) {
465
- switch (_a.label) {
466
- case 0: return [4 /*yield*/, response.text()];
467
- case 1:
468
- errorText = _a.sent();
469
- try {
470
- errorData = JSON.parse(errorText);
471
- }
472
- catch (_b) {
473
- errorData = { error: errorText };
474
- }
475
- message = errorData.error || 'Unknown error';
476
- if (response.status === 0 || message.includes('connection')) {
477
- throw new types_js_1.ProviderUnavailableError('ollama', {
478
- message: message,
479
- hint: 'Ensure Ollama is running: ollama serve',
480
- });
481
- }
482
- throw new types_js_1.LLMProviderError(message, "OLLAMA_".concat(response.status), 'ollama', response.status, true, errorData);
483
- }
484
- });
485
- });
486
- };
487
- return OllamaProvider;
488
- }(base_provider_js_1.BaseProvider));
489
- exports.OllamaProvider = OllamaProvider;
@@ -1,26 +0,0 @@
1
- /**
2
- * V3 OpenAI Provider
3
- *
4
- * Supports GPT-4o, GPT-4, o1, and other OpenAI models.
5
- *
6
- * @module @sparkleideas/providers/openai-provider
7
- */
8
- import { BaseProvider, BaseProviderOptions } from './base-provider.js';
9
- import { LLMProvider, LLMModel, LLMRequest, LLMResponse, LLMStreamEvent, ModelInfo, ProviderCapabilities, HealthCheckResult } from './types.js';
10
- export declare class OpenAIProvider extends BaseProvider {
11
- readonly name: LLMProvider;
12
- readonly capabilities: ProviderCapabilities;
13
- private baseUrl;
14
- private headers;
15
- constructor(options: BaseProviderOptions);
16
- protected doInitialize(): Promise<void>;
17
- protected doComplete(request: LLMRequest): Promise<LLMResponse>;
18
- protected doStreamComplete(request: LLMRequest): AsyncIterable<LLMStreamEvent>;
19
- listModels(): Promise<LLMModel[]>;
20
- getModelInfo(model: LLMModel): Promise<ModelInfo>;
21
- protected doHealthCheck(): Promise<HealthCheckResult>;
22
- private buildRequest;
23
- private transformResponse;
24
- private handleErrorResponse;
25
- }
26
- //# sourceMappingURL=openai-provider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../src/openai-provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EACL,WAAW,EACX,QAAQ,EACR,UAAU,EACV,WAAW,EACX,cAAc,EACd,SAAS,EACT,oBAAoB,EACpB,iBAAiB,EAKlB,MAAM,YAAY,CAAC;AA0DpB,qBAAa,cAAe,SAAQ,YAAY;IAC9C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAY;IACtC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAsFzC;IAEF,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,OAAO,CAA8B;gBAEjC,OAAO,EAAE,mBAAmB;cAIxB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;cAgB7B,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;cA4BpD,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,aAAa,CAAC,cAAc,CAAC;IAoG/E,UAAU,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIjC,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;cA4BvC,aAAa,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAoB3D,OAAO,CAAC,YAAY;IA6CpB,OAAO,CAAC,iBAAiB;YAmCX,mBAAmB;CAoClC"}