@mikugg/guidance 0.17.1 → 0.18.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.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import * as Agents from "./lib/Agent";
2
- import * as Template from "./lib/template";
3
- import * as TokenGenerator from "./lib/token-generator";
4
- import * as Tokenizer from "./lib/tokenizer";
1
+ import * as Agents from './lib/Agent';
2
+ import * as Template from './lib/template';
3
+ import * as TokenGenerator from './lib/token-generator';
4
+ import * as Tokenizer from './lib/tokenizer';
5
5
  export { Agents, Template, TokenGenerator, Tokenizer };
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Agent.d.ts","sourceRoot":"","sources":["../../src/lib/Agent.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,wBAAwB,CAEvC,WAAW,SAAS,MAAM,EAAE,EAC5B,YAAY,SAAS,MAAM,EAAE;IAE7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5C,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;KAC/C,EAAE,CAAC;IACJ,gBAAgB,CAAC,EAAE;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,qBAAa,WAAW,CACtB,WAAW,SAAS,MAAM,EAAE,EAC5B,YAAY,SAAS,MAAM,EAAE;IAE7B,OAAO,CAAC,aAAa,CAOnB;gBAGA,aAAa,EAAE,wBAAwB,CAAC,WAAW,EAAE,YAAY,CAAC;IAc7D,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM;CA+B3E"}
1
+ {"version":3,"file":"Agent.d.ts","sourceRoot":"","sources":["../../src/lib/Agent.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,wBAAwB,CAEvC,WAAW,SAAS,MAAM,EAAE,EAC5B,YAAY,SAAS,MAAM,EAAE;IAE7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5C,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;KAC/C,EAAE,CAAC;IACJ,gBAAgB,CAAC,EAAE;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,qBAAa,WAAW,CAAC,WAAW,SAAS,MAAM,EAAE,EAAE,YAAY,SAAS,MAAM,EAAE;IAClF,OAAO,CAAC,aAAa,CAOnB;gBAEU,aAAa,EAAE,wBAAwB,CAAC,WAAW,EAAE,YAAY,CAAC;IAavE,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM;CA+B3E"}
package/dist/lib/Agent.js CHANGED
@@ -2,14 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AgentPrompt = void 0;
4
4
  function replaceTemplate(template, key, value) {
5
- let regex = new RegExp(`{{GEN ${key}[^}]*}}`, "g");
5
+ let regex = new RegExp(`{{GEN ${key}[^}]*}}`, 'g');
6
6
  template = template.replace(regex, value);
7
- regex = new RegExp(`{{SEL ${key}[^}]*}}`, "g");
7
+ regex = new RegExp(`{{SEL ${key}[^}]*}}`, 'g');
8
8
  return template.replace(regex, value);
9
9
  }
10
10
  class AgentPrompt {
11
11
  constructor(configuration) {
12
- this.configuration = Object.assign(Object.assign({}, configuration), { instructSettings: Object.assign({ system: "", instruction: "\n### Instruction:\n", input: "\n### Input:\n", output: "\n### Response:\n" }, configuration.instructSettings) });
12
+ this.configuration = Object.assign(Object.assign({}, configuration), { instructSettings: Object.assign({ system: '', instruction: '\n### Instruction:\n', input: '\n### Input:\n', output: '\n### Response:\n' }, configuration.instructSettings) });
13
13
  }
14
14
  generatePrompt(inputs) {
15
15
  let prompt = this.configuration.instructSettings.system;
@@ -21,13 +21,13 @@ class AgentPrompt {
21
21
  prompt += this.configuration.shotTemplate.input;
22
22
  Object.keys(shot.inputs).forEach((key) => {
23
23
  const value = shot.inputs[key];
24
- prompt = prompt.replace(new RegExp(`{{${key}}}`, "g"), value);
24
+ prompt = prompt.replace(new RegExp(`{{${key}}}`, 'g'), value);
25
25
  });
26
26
  prompt += this.configuration.instructSettings.output;
27
27
  prompt += this.configuration.shotTemplate.output;
28
28
  Object.keys(shot.outputs).forEach((key) => {
29
29
  const value = shot.outputs[key];
30
- prompt = prompt.replace(new RegExp(`{{${key}}}`, "g"), value);
30
+ prompt = prompt.replace(new RegExp(`{{${key}}}`, 'g'), value);
31
31
  prompt = replaceTemplate(prompt, key, value);
32
32
  });
33
33
  });
@@ -35,7 +35,7 @@ class AgentPrompt {
35
35
  prompt += this.configuration.shotTemplate.input;
36
36
  Object.keys(inputs).forEach((key) => {
37
37
  const value = inputs[key];
38
- prompt = prompt.replace(new RegExp(`{{${key}}}`, "g"), value);
38
+ prompt = prompt.replace(new RegExp(`{{${key}}}`, 'g'), value);
39
39
  });
40
40
  prompt += this.configuration.instructSettings.output;
41
41
  prompt += this.configuration.shotTemplate.output;
@@ -4,39 +4,39 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const _trie_1 = __importDefault(require("../_trie")); // replace './Trie' with the actual path of your Trie class
7
- describe("Trie", () => {
7
+ describe('Trie', () => {
8
8
  let trie;
9
9
  beforeEach(() => {
10
10
  trie = new _trie_1.default();
11
11
  });
12
- test("addPrefix should add numbers to the trie", () => {
12
+ test('addPrefix should add numbers to the trie', () => {
13
13
  var _a, _b, _c;
14
14
  trie.addPrefix([1, 2, 3]);
15
15
  expect(trie.root.children.has(1)).toBeTruthy();
16
16
  expect((_a = trie.root.children.get(1)) === null || _a === void 0 ? void 0 : _a.children.has(2)).toBeTruthy();
17
17
  expect((_c = (_b = trie.root.children.get(1)) === null || _b === void 0 ? void 0 : _b.children.get(2)) === null || _c === void 0 ? void 0 : _c.children.has(3)).toBeTruthy();
18
18
  });
19
- test("getNextChildren should return correct next children", () => {
19
+ test('getNextChildren should return correct next children', () => {
20
20
  trie.addPrefix([1, 2, 3]);
21
21
  trie.addPrefix([1, 2, 4]);
22
22
  expect(trie.getNextChildren([1, 2])).toEqual([3, 4]);
23
23
  });
24
- test("getNextPrefix should return correct next prefix", () => {
24
+ test('getNextPrefix should return correct next prefix', () => {
25
25
  trie.addPrefix([1, 2, 3]);
26
26
  trie.addPrefix([1, 2, 3, 4]);
27
27
  expect(trie.getNextPrefix([1, 2])).toEqual([1, 2, 3]);
28
28
  });
29
- test("getNextPrefix should return correct next prefix", () => {
29
+ test('getNextPrefix should return correct next prefix', () => {
30
30
  trie.addPrefix([1, 2, 3, 4, 5]);
31
31
  trie.addPrefix([1, 2, 3, 4, 7]);
32
32
  expect(trie.getNextPrefix([1, 2])).toEqual([1, 2, 3, 4]);
33
33
  });
34
- test("getWord should return correct word until the end of the prefix", () => {
34
+ test('getWord should return correct word until the end of the prefix', () => {
35
35
  trie.addPrefix([1, 2, 3]);
36
36
  trie.addPrefix([1, 2, 3, 4]);
37
37
  expect(trie.getWord([1, 2])).toEqual([1, 2, 3]);
38
38
  });
39
- test("getWord should return empty array if prefix not found", () => {
39
+ test('getWord should return empty array if prefix not found', () => {
40
40
  trie.addPrefix([1, 2, 3]);
41
41
  expect(trie.getWord([4])).toEqual([]);
42
42
  });
@@ -32,7 +32,7 @@ class MockTokenGenerator extends token_generator_1.AbstractTokenGenerator {
32
32
  logit_bias) {
33
33
  return __awaiter(this, void 0, void 0, function* () {
34
34
  return {
35
- "<TOK>": 100,
35
+ '<TOK>': 100,
36
36
  };
37
37
  });
38
38
  }
@@ -42,11 +42,11 @@ class MockTokenGenerator extends token_generator_1.AbstractTokenGenerator {
42
42
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
43
43
  options) {
44
44
  return __asyncGenerator(this, arguments, function* generateString_1() {
45
- return yield __await("generated");
45
+ return yield __await('generated');
46
46
  });
47
47
  }
48
48
  }
49
- describe("TemplateProcessor", () => {
49
+ describe('TemplateProcessor', () => {
50
50
  let tokenizer;
51
51
  let generator;
52
52
  let templateProcessor;
@@ -55,73 +55,75 @@ describe("TemplateProcessor", () => {
55
55
  generator = new MockTokenGenerator();
56
56
  templateProcessor = new template_1.TemplateProcessor(tokenizer, generator);
57
57
  });
58
- describe("processTemplate", () => {
59
- it("should process template with GEN method correctly", () => __awaiter(void 0, void 0, void 0, function* () {
60
- const spyGenerateString = jest.spyOn(generator, "generateString");
61
- const result = yield templateProcessor.processTemplate("Hello, {{user}}. The weather is {{GEN weather}}", new Map([["user", "Hina"]]));
62
- expect(spyGenerateString).toHaveBeenCalledWith("Hello, Hina. The weather is ", {});
63
- expect(result.get("weather")).toEqual("generated");
58
+ describe('processTemplate', () => {
59
+ it('should process template with GEN method correctly', () => __awaiter(void 0, void 0, void 0, function* () {
60
+ const spyGenerateString = jest.spyOn(generator, 'generateString');
61
+ const result = yield templateProcessor.processTemplate('Hello, {{user}}. The weather is {{GEN weather}}', new Map([['user', 'Hina']]));
62
+ expect(spyGenerateString).toHaveBeenCalledWith('Hello, Hina. The weather is ', {});
63
+ expect(result.get('weather')).toEqual('generated');
64
64
  }));
65
- it("should process template with GEN method and stop correctly", () => __awaiter(void 0, void 0, void 0, function* () {
66
- const spyGenerateString = jest.spyOn(generator, "generateString");
67
- const result = yield templateProcessor.processTemplate("Hello, {{user}}. The weather is {{GEN weather stop=.}}", new Map([["user", "Hina"]]));
68
- expect(spyGenerateString).toHaveBeenCalledWith("Hello, Hina. The weather is ", { stop: "." });
69
- expect(result.get("weather")).toEqual("generated");
65
+ it('should process template with GEN method and stop correctly', () => __awaiter(void 0, void 0, void 0, function* () {
66
+ const spyGenerateString = jest.spyOn(generator, 'generateString');
67
+ const result = yield templateProcessor.processTemplate('Hello, {{user}}. The weather is {{GEN weather stop=.}}', new Map([['user', 'Hina']]));
68
+ expect(spyGenerateString).toHaveBeenCalledWith('Hello, Hina. The weather is ', { stop: '.' });
69
+ expect(result.get('weather')).toEqual('generated');
70
70
  }));
71
- it("should process template with GEN method and temperature and repetition_penalty and stop correctly", () => __awaiter(void 0, void 0, void 0, function* () {
72
- const spyGenerateString = jest.spyOn(generator, "generateString");
73
- const result = yield templateProcessor.processTemplate("Hello, {{user}}. The weather is {{GEN weather temperature=0.5 repetition_penalty=1 stop=.}}", new Map([["user", "Hina"]]));
74
- expect(spyGenerateString).toHaveBeenCalledWith("Hello, Hina. The weather is ", { temperature: "0.5", repetition_penalty: "1", stop: "." });
75
- expect(result.get("weather")).toEqual("generated");
71
+ it('should process template with GEN method and temperature and repetition_penalty and stop correctly', () => __awaiter(void 0, void 0, void 0, function* () {
72
+ const spyGenerateString = jest.spyOn(generator, 'generateString');
73
+ const result = yield templateProcessor.processTemplate('Hello, {{user}}. The weather is {{GEN weather temperature=0.5 repetition_penalty=1 stop=.}}', new Map([['user', 'Hina']]));
74
+ expect(spyGenerateString).toHaveBeenCalledWith('Hello, Hina. The weather is ', {
75
+ temperature: '0.5',
76
+ repetition_penalty: '1',
77
+ stop: '.',
78
+ });
79
+ expect(result.get('weather')).toEqual('generated');
76
80
  }));
77
- it("should process template with SEL method correctly", () => __awaiter(void 0, void 0, void 0, function* () {
81
+ it('should process template with SEL method correctly', () => __awaiter(void 0, void 0, void 0, function* () {
78
82
  // 1153 = " ra"
79
83
  const spyGenerateToken = jest
80
- .spyOn(generator, "generateTokenLogProgs")
81
- .mockReturnValue(new Promise((resolve) => resolve({ " ra": 0 })));
82
- const result = yield templateProcessor.processTemplate("Hello, {{user}}. The weather is{{SEL weather options=weatherOptions}}", new Map([
83
- ["user", "Hina"],
84
- ["weatherOptions", [" sunny", " rainy", " cloudy"]],
84
+ .spyOn(generator, 'generateTokenLogProgs')
85
+ .mockReturnValue(new Promise((resolve) => resolve({ ' ra': 0 })));
86
+ const result = yield templateProcessor.processTemplate('Hello, {{user}}. The weather is{{SEL weather options=weatherOptions}}', new Map([
87
+ ['user', 'Hina'],
88
+ ['weatherOptions', [' sunny', ' rainy', ' cloudy']],
85
89
  ]));
86
- expect(spyGenerateToken).toHaveBeenCalledWith("Hello, Hina. The weather is", {
87
- "6575": 100,
88
- "1153": 100,
89
- "9570": 100,
90
+ expect(spyGenerateToken).toHaveBeenCalledWith('Hello, Hina. The weather is', {
91
+ '6575': 100,
92
+ '1153': 100,
93
+ '9570': 100,
90
94
  });
91
- expect(result.get("weather")).toEqual(" rainy");
95
+ expect(result.get('weather')).toEqual(' rainy');
92
96
  }));
93
- it("should process template with SEL method in a JSON correctly", () => __awaiter(void 0, void 0, void 0, function* () {
97
+ it('should process template with SEL method in a JSON correctly', () => __awaiter(void 0, void 0, void 0, function* () {
94
98
  const mockGenerateString = function () {
95
99
  return __asyncGenerator(this, arguments, function* () {
96
- yield yield __await("wizard");
100
+ yield yield __await('wizard');
97
101
  });
98
102
  };
99
103
  // 29879 = "s"
100
104
  const spyGenerateToken = jest
101
- .spyOn(generator, "generateTokenLogProgs")
105
+ .spyOn(generator, 'generateTokenLogProgs')
102
106
  .mockReturnValue(new Promise((resolve) => resolve({ s: 0 })));
103
- const spyGenerateString = jest
104
- .spyOn(generator, "generateString")
105
- .mockImplementation(mockGenerateString);
107
+ const spyGenerateString = jest.spyOn(generator, 'generateString').mockImplementation(mockGenerateString);
106
108
  const result = yield templateProcessor.processTemplate(`RPG Game Character specification
107
109
  {
108
110
  "name": "{{name}}",
109
111
  "job": "{{GEN job stop=",}}",
110
112
  "weapon": "{{SEL weapon options=valid_weapons}}",
111
113
  }`, new Map([
112
- ["name", "Rudeus"],
113
- ["valid_weapons", ["axe", "mace", "sword", "bow", "crossbow"]],
114
+ ['name', 'Rudeus'],
115
+ ['valid_weapons', ['axe', 'mace', 'sword', 'bow', 'crossbow']],
114
116
  ]));
115
117
  expect(spyGenerateString).toHaveBeenCalledWith('RPG Game Character specification\n {\n "name": "Rudeus",\n "job": "', { stop: '",' });
116
118
  expect(spyGenerateToken).toHaveBeenCalledWith('RPG Game Character specification\n {\n "name": "Rudeus",\n "job": "wizard",\n "weapon": "', {
117
- "29879": 100,
118
- "1165": 100,
119
- "655": 100,
120
- "17729": 100,
121
- "19128": 100,
119
+ '29879': 100,
120
+ '1165': 100,
121
+ '655': 100,
122
+ '17729': 100,
123
+ '19128': 100,
122
124
  });
123
- expect(result.get("weapon")).toEqual("sword");
124
- expect(result.get("job")).toEqual("wizard");
125
+ expect(result.get('weapon')).toEqual('sword');
126
+ expect(result.get('job')).toEqual('wizard');
125
127
  }));
126
128
  });
127
129
  });
@@ -4,69 +4,69 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const templateParser_1 = __importDefault(require("../templateParser")); // Adjust the import path as needed
7
- describe("extractGenParams", () => {
8
- it("extracts simple parameters correctly", () => {
7
+ describe('extractGenParams', () => {
8
+ it('extracts simple parameters correctly', () => {
9
9
  const template = `some text{{GEN example max_tokens=2000 stop=["End"]}}some other text`;
10
10
  expect((0, templateParser_1.default)(template)).toEqual({
11
- name: "example",
11
+ name: 'example',
12
12
  params: {
13
13
  max_tokens: 2000,
14
- stop: ["End"],
14
+ stop: ['End'],
15
15
  },
16
- type: "GEN",
16
+ type: 'GEN',
17
17
  });
18
18
  });
19
- it("handles multiple parameters and array values", () => {
19
+ it('handles multiple parameters and array values', () => {
20
20
  const template = `{{GEN complex max_tokens=3000 stop=["\\nExit:", "\\nAnon:"]}}`;
21
21
  console.log((0, templateParser_1.default)(template));
22
22
  expect((0, templateParser_1.default)(template)).toEqual({
23
- type: "GEN",
24
- name: "complex",
23
+ type: 'GEN',
24
+ name: 'complex',
25
25
  params: {
26
26
  max_tokens: 3000,
27
- stop: ["\nExit:", "\nAnon:"],
27
+ stop: ['\nExit:', '\nAnon:'],
28
28
  },
29
29
  });
30
30
  });
31
- it("returns null for a string without GEN pattern", () => {
31
+ it('returns null for a string without GEN pattern', () => {
32
32
  const template = `some regular text without GEN`;
33
33
  expect((0, templateParser_1.default)(template)).toEqual({
34
- type: "",
35
- name: "",
34
+ type: '',
35
+ name: '',
36
36
  params: {},
37
37
  });
38
38
  });
39
- it("handles the SEL pattern with options parameter", () => {
39
+ it('handles the SEL pattern with options parameter', () => {
40
40
  const template = `{{SEL choice options=SomeConstantName}}`;
41
41
  expect((0, templateParser_1.default)(template)).toEqual({
42
- type: "SEL",
43
- name: "choice",
42
+ type: 'SEL',
43
+ name: 'choice',
44
44
  params: {
45
- options: "SomeConstantName",
45
+ options: 'SomeConstantName',
46
46
  },
47
47
  });
48
48
  });
49
- it("extracts multiple parameters including strings, numbers, and arrays", () => {
49
+ it('extracts multiple parameters including strings, numbers, and arrays', () => {
50
50
  const template = `{{GEN multiParam type="stringType" count=10 flags=["flag1", "flag2"]}}`;
51
51
  expect((0, templateParser_1.default)(template)).toEqual({
52
- type: "GEN",
53
- name: "multiParam",
52
+ type: 'GEN',
53
+ name: 'multiParam',
54
54
  params: {
55
- type: "stringType",
55
+ type: 'stringType',
56
56
  count: 10,
57
- flags: ["flag1", "flag2"],
57
+ flags: ['flag1', 'flag2'],
58
58
  },
59
59
  });
60
60
  });
61
- it("handles complex parameters in SEL pattern", () => {
61
+ it('handles complex parameters in SEL pattern', () => {
62
62
  const template = `{{SEL complexChoice options=ComplexOptions max_selections=3 custom_flag="enabled"}}`;
63
63
  expect((0, templateParser_1.default)(template)).toEqual({
64
- type: "SEL",
65
- name: "complexChoice",
64
+ type: 'SEL',
65
+ name: 'complexChoice',
66
66
  params: {
67
- options: "ComplexOptions",
67
+ options: 'ComplexOptions',
68
68
  max_selections: 3,
69
- custom_flag: "enabled",
69
+ custom_flag: 'enabled',
70
70
  },
71
71
  });
72
72
  });
@@ -1 +1 @@
1
- {"version":3,"file":"_llama-tokenizer.d.ts","sourceRoot":"","sources":["../../src/lib/_llama-tokenizer.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,CACN,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,OAAO,EACvB,mBAAmB,CAAC,EAAE,OAAO,EAC7B,eAAe,CAAC,EAAE,OAAO,KACtB,MAAM,EAAE,CAAC;IACd,MAAM,EAAE,CACN,QAAQ,EAAE,MAAM,EAAE,EAClB,aAAa,CAAC,EAAE,OAAO,EACvB,mBAAmB,CAAC,EAAE,OAAO,KAC1B,MAAM,CAAC;CACb;AAED,QAAA,MAAM,cAAc,EAAE,cAAmB,CAAC;AAqgB1C,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"_llama-tokenizer.d.ts","sourceRoot":"","sources":["../../src/lib/_llama-tokenizer.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,OAAO,KAAK,MAAM,EAAE,CAAC;IACtH,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,aAAa,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;CAChG;AAED,QAAA,MAAM,cAAc,EAAE,cAAmB,CAAC;AA6c1C,eAAe,cAAc,CAAC"}