@dexto/agent-config 1.6.0 → 1.6.2

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/index.cjs CHANGED
@@ -31,6 +31,7 @@ __export(index_exports, {
31
31
  createAgentConfigSchema: () => import_agent_config.createAgentConfigSchema,
32
32
  loadImage: () => import_load_image.loadImage,
33
33
  resolveServicesFromConfig: () => import_resolve_services_from_config.resolveServicesFromConfig,
34
+ resolveToolsFromEntries: () => import_resolve_services_from_config2.resolveToolsFromEntries,
34
35
  setImageImporter: () => import_load_image.setImageImporter,
35
36
  toDextoAgentOptions: () => import_to_dexto_agent_options.toDextoAgentOptions
36
37
  });
@@ -41,6 +42,7 @@ var import_compaction = require("./schemas/compaction.js");
41
42
  var import_apply_image_defaults = require("./resolver/apply-image-defaults.js");
42
43
  var import_load_image = require("./resolver/load-image.js");
43
44
  var import_resolve_services_from_config = require("./resolver/resolve-services-from-config.js");
45
+ var import_resolve_services_from_config2 = require("./resolver/resolve-services-from-config.js");
44
46
  var import_to_dexto_agent_options = require("./resolver/to-dexto-agent-options.js");
45
47
  var import_clean_null_values = require("./utils/clean-null-values.js");
46
48
  // Annotate the CommonJS export names for ESM import in node:
@@ -58,6 +60,7 @@ var import_clean_null_values = require("./utils/clean-null-values.js");
58
60
  createAgentConfigSchema,
59
61
  loadImage,
60
62
  resolveServicesFromConfig,
63
+ resolveToolsFromEntries,
61
64
  setImageImporter,
62
65
  toDextoAgentOptions
63
66
  });
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@ export { applyImageDefaults } from './resolver/apply-image-defaults.js';
9
9
  export { loadImage, setImageImporter } from './resolver/load-image.js';
10
10
  export type { ImageImporter } from './resolver/load-image.js';
11
11
  export { resolveServicesFromConfig } from './resolver/resolve-services-from-config.js';
12
+ export { resolveToolsFromEntries } from './resolver/resolve-services-from-config.js';
12
13
  export { toDextoAgentOptions } from './resolver/to-dexto-agent-options.js';
13
14
  export type { ResolvedServices } from './resolver/types.js';
14
15
  export { cleanNullValues } from './utils/clean-null-values.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,WAAW,GACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACH,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,GACzB,MAAM,2BAA2B,CAAC;AAEnC,YAAY,EACR,WAAW,EACX,oBAAoB,EACpB,gBAAgB,GACnB,MAAM,2BAA2B,CAAC;AAEnC,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE9F,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE/E,OAAO,EACH,sBAAsB,EACtB,yBAAyB,EACzB,sCAAsC,EACtC,0BAA0B,GAC7B,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EACR,gBAAgB,EAChB,yBAAyB,EACzB,gCAAgC,EAChC,oBAAoB,GACvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACvE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAE3E,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,WAAW,GACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACH,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,GACzB,MAAM,2BAA2B,CAAC;AAEnC,YAAY,EACR,WAAW,EACX,oBAAoB,EACpB,gBAAgB,GACnB,MAAM,2BAA2B,CAAC;AAEnC,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE9F,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE/E,OAAO,EACH,sBAAsB,EACtB,yBAAyB,EACzB,sCAAsC,EACtC,0BAA0B,GAC7B,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EACR,gBAAgB,EAChB,yBAAyB,EACzB,gCAAgC,EAChC,oBAAoB,GACvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACvE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAE3E,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC"}
package/dist/index.js CHANGED
@@ -13,6 +13,7 @@ import {
13
13
  import { applyImageDefaults } from "./resolver/apply-image-defaults.js";
14
14
  import { loadImage, setImageImporter } from "./resolver/load-image.js";
15
15
  import { resolveServicesFromConfig } from "./resolver/resolve-services-from-config.js";
16
+ import { resolveToolsFromEntries } from "./resolver/resolve-services-from-config.js";
16
17
  import { toDextoAgentOptions } from "./resolver/to-dexto-agent-options.js";
17
18
  import { cleanNullValues } from "./utils/clean-null-values.js";
18
19
  export {
@@ -29,6 +30,7 @@ export {
29
30
  createAgentConfigSchema,
30
31
  loadImage,
31
32
  resolveServicesFromConfig,
33
+ resolveToolsFromEntries,
32
34
  setImageImporter,
33
35
  toDextoAgentOptions
34
36
  };
@@ -18,7 +18,8 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var resolve_services_from_config_exports = {};
20
20
  __export(resolve_services_from_config_exports, {
21
- resolveServicesFromConfig: () => resolveServicesFromConfig
21
+ resolveServicesFromConfig: () => resolveServicesFromConfig,
22
+ resolveToolsFromEntries: () => resolveToolsFromEntries
22
23
  });
23
24
  module.exports = __toCommonJS(resolve_services_from_config_exports);
24
25
  var import_utils = require("./utils.js");
@@ -77,33 +78,11 @@ async function resolveServicesFromConfig(config, image) {
77
78
  cache: await cacheFactory.create(cacheConfig, logger)
78
79
  };
79
80
  const toolEntries = config.tools ?? image.defaults?.tools ?? [];
80
- const tools = [];
81
- const toolIds = /* @__PURE__ */ new Set();
82
- for (const entry of toolEntries) {
83
- if (entry.enabled === false) {
84
- continue;
85
- }
86
- const factory = resolveByType({
87
- kind: "tool",
88
- type: entry.type,
89
- factories: image.tools,
90
- imageName
91
- });
92
- const validatedConfig = factory.configSchema.parse(stripEnabled(entry));
93
- for (const tool of factory.create(validatedConfig)) {
94
- if (tool.id.startsWith(MCP_TOOL_PREFIX)) {
95
- throw new Error(
96
- `Invalid local tool id '${tool.id}': '${MCP_TOOL_PREFIX}' prefix is reserved for MCP tools.`
97
- );
98
- }
99
- if (toolIds.has(tool.id)) {
100
- logger.warn(`Tool id conflict for '${tool.id}'. Skipping duplicate tool.`);
101
- continue;
102
- }
103
- toolIds.add(tool.id);
104
- tools.push(tool);
105
- }
106
- }
81
+ const tools = resolveToolsFromEntries({ entries: toolEntries, image, logger });
82
+ const toolkitLoader = async (toolkits) => {
83
+ const entries = toolkits.map((type) => ({ type }));
84
+ return resolveToolsFromEntries({ entries, image, logger });
85
+ };
107
86
  const hookEntries = config.hooks ?? image.defaults?.hooks ?? [];
108
87
  const hooks = [];
109
88
  for (const entry of hookEntries) {
@@ -138,9 +117,42 @@ async function resolveServicesFromConfig(config, image) {
138
117
  const parsedConfig = factory.configSchema.parse(compactionConfig);
139
118
  compaction = await factory.create(parsedConfig);
140
119
  }
141
- return { logger, storage, tools, hooks, compaction };
120
+ return { logger, storage, tools, toolkitLoader, hooks, compaction };
121
+ }
122
+ function resolveToolsFromEntries(options) {
123
+ const { entries, image, logger } = options;
124
+ const imageName = image.metadata.name;
125
+ const tools = [];
126
+ const toolIds = /* @__PURE__ */ new Set();
127
+ for (const entry of entries) {
128
+ if (entry.enabled === false) {
129
+ continue;
130
+ }
131
+ const factory = resolveByType({
132
+ kind: "tool",
133
+ type: entry.type,
134
+ factories: image.tools,
135
+ imageName
136
+ });
137
+ const validatedConfig = factory.configSchema.parse(stripEnabled(entry));
138
+ for (const tool of factory.create(validatedConfig)) {
139
+ if (tool.id.startsWith(MCP_TOOL_PREFIX)) {
140
+ throw new Error(
141
+ `Invalid local tool id '${tool.id}': '${MCP_TOOL_PREFIX}' prefix is reserved for MCP tools.`
142
+ );
143
+ }
144
+ if (toolIds.has(tool.id)) {
145
+ logger.warn(`Tool id conflict for '${tool.id}'. Skipping duplicate tool.`);
146
+ continue;
147
+ }
148
+ toolIds.add(tool.id);
149
+ tools.push(tool);
150
+ }
151
+ }
152
+ return tools;
142
153
  }
143
154
  // Annotate the CommonJS export names for ESM import in node:
144
155
  0 && (module.exports = {
145
- resolveServicesFromConfig
156
+ resolveServicesFromConfig,
157
+ resolveToolsFromEntries
146
158
  });
@@ -1,5 +1,11 @@
1
- import type { ValidatedAgentConfig } from '../schemas/agent-config.js';
1
+ import type { Logger, Tool } from '@dexto/core';
2
+ import type { ToolFactoryEntry, ValidatedAgentConfig } from '../schemas/agent-config.js';
2
3
  import type { DextoImage } from '../image/types.js';
3
4
  import type { ResolvedServices } from './types.js';
4
5
  export declare function resolveServicesFromConfig(config: ValidatedAgentConfig, image: DextoImage): Promise<ResolvedServices>;
6
+ export declare function resolveToolsFromEntries(options: {
7
+ entries: ToolFactoryEntry[];
8
+ image: DextoImage;
9
+ logger: Logger;
10
+ }): Tool[];
5
11
  //# sourceMappingURL=resolve-services-from-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-services-from-config.d.ts","sourceRoot":"","sources":["../../src/resolver/resolve-services-from-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAmCnD,wBAAsB,yBAAyB,CAC3C,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,UAAU,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAqH3B"}
1
+ {"version":3,"file":"resolve-services-from-config.d.ts","sourceRoot":"","sources":["../../src/resolver/resolve-services-from-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,MAAM,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAmCnD,wBAAsB,yBAAyB,CAC3C,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,UAAU,GAClB,OAAO,CAAC,gBAAgB,CAAC,CA2F3B;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC7C,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,EAAE,CAoCT"}
@@ -54,33 +54,11 @@ async function resolveServicesFromConfig(config, image) {
54
54
  cache: await cacheFactory.create(cacheConfig, logger)
55
55
  };
56
56
  const toolEntries = config.tools ?? image.defaults?.tools ?? [];
57
- const tools = [];
58
- const toolIds = /* @__PURE__ */ new Set();
59
- for (const entry of toolEntries) {
60
- if (entry.enabled === false) {
61
- continue;
62
- }
63
- const factory = resolveByType({
64
- kind: "tool",
65
- type: entry.type,
66
- factories: image.tools,
67
- imageName
68
- });
69
- const validatedConfig = factory.configSchema.parse(stripEnabled(entry));
70
- for (const tool of factory.create(validatedConfig)) {
71
- if (tool.id.startsWith(MCP_TOOL_PREFIX)) {
72
- throw new Error(
73
- `Invalid local tool id '${tool.id}': '${MCP_TOOL_PREFIX}' prefix is reserved for MCP tools.`
74
- );
75
- }
76
- if (toolIds.has(tool.id)) {
77
- logger.warn(`Tool id conflict for '${tool.id}'. Skipping duplicate tool.`);
78
- continue;
79
- }
80
- toolIds.add(tool.id);
81
- tools.push(tool);
82
- }
83
- }
57
+ const tools = resolveToolsFromEntries({ entries: toolEntries, image, logger });
58
+ const toolkitLoader = async (toolkits) => {
59
+ const entries = toolkits.map((type) => ({ type }));
60
+ return resolveToolsFromEntries({ entries, image, logger });
61
+ };
84
62
  const hookEntries = config.hooks ?? image.defaults?.hooks ?? [];
85
63
  const hooks = [];
86
64
  for (const entry of hookEntries) {
@@ -115,8 +93,41 @@ async function resolveServicesFromConfig(config, image) {
115
93
  const parsedConfig = factory.configSchema.parse(compactionConfig);
116
94
  compaction = await factory.create(parsedConfig);
117
95
  }
118
- return { logger, storage, tools, hooks, compaction };
96
+ return { logger, storage, tools, toolkitLoader, hooks, compaction };
97
+ }
98
+ function resolveToolsFromEntries(options) {
99
+ const { entries, image, logger } = options;
100
+ const imageName = image.metadata.name;
101
+ const tools = [];
102
+ const toolIds = /* @__PURE__ */ new Set();
103
+ for (const entry of entries) {
104
+ if (entry.enabled === false) {
105
+ continue;
106
+ }
107
+ const factory = resolveByType({
108
+ kind: "tool",
109
+ type: entry.type,
110
+ factories: image.tools,
111
+ imageName
112
+ });
113
+ const validatedConfig = factory.configSchema.parse(stripEnabled(entry));
114
+ for (const tool of factory.create(validatedConfig)) {
115
+ if (tool.id.startsWith(MCP_TOOL_PREFIX)) {
116
+ throw new Error(
117
+ `Invalid local tool id '${tool.id}': '${MCP_TOOL_PREFIX}' prefix is reserved for MCP tools.`
118
+ );
119
+ }
120
+ if (toolIds.has(tool.id)) {
121
+ logger.warn(`Tool id conflict for '${tool.id}'. Skipping duplicate tool.`);
122
+ continue;
123
+ }
124
+ toolIds.add(tool.id);
125
+ tools.push(tool);
126
+ }
127
+ }
128
+ return tools;
119
129
  }
120
130
  export {
121
- resolveServicesFromConfig
131
+ resolveServicesFromConfig,
132
+ resolveToolsFromEntries
122
133
  };
@@ -40,6 +40,7 @@ function toDextoAgentOptions(options) {
40
40
  logger: services.logger,
41
41
  storage: services.storage,
42
42
  tools: services.tools,
43
+ toolkitLoader: services.toolkitLoader,
43
44
  hooks: services.hooks,
44
45
  compaction: services.compaction,
45
46
  ...overrides ? { overrides } : {}
@@ -1 +1 @@
1
- {"version":3,"file":"to-dexto-agent-options.d.ts","sourceRoot":"","sources":["../../src/resolver/to-dexto-agent-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,wBAAwB;IACrC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,CAAC,EAAE,yBAAyB,GAAG,SAAS,CAAC;CACrD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAwBxF"}
1
+ {"version":3,"file":"to-dexto-agent-options.d.ts","sourceRoot":"","sources":["../../src/resolver/to-dexto-agent-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,wBAAwB;IACrC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,CAAC,EAAE,yBAAyB,GAAG,SAAS,CAAC;CACrD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAyBxF"}
@@ -17,6 +17,7 @@ function toDextoAgentOptions(options) {
17
17
  logger: services.logger,
18
18
  storage: services.storage,
19
19
  tools: services.tools,
20
+ toolkitLoader: services.toolkitLoader,
20
21
  hooks: services.hooks,
21
22
  compaction: services.compaction,
22
23
  ...overrides ? { overrides } : {}
@@ -4,7 +4,7 @@ import type { Database } from '@dexto/core';
4
4
  import type { Hook } from '@dexto/core';
5
5
  import type { CompactionStrategy } from '@dexto/core';
6
6
  import type { Logger } from '@dexto/core';
7
- import type { Tool } from '@dexto/core';
7
+ import type { Tool, ToolkitLoader } from '@dexto/core';
8
8
  export interface ResolvedServices {
9
9
  logger: Logger;
10
10
  storage: {
@@ -13,6 +13,7 @@ export interface ResolvedServices {
13
13
  cache: Cache;
14
14
  };
15
15
  tools: Tool[];
16
+ toolkitLoader?: ToolkitLoader;
16
17
  hooks: Hook[];
17
18
  compaction: CompactionStrategy | null;
18
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/resolver/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC;IAC/D,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACzC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/resolver/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC;IAC/D,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACzC"}