@bingine/cemem 0.0.0-stage → 0.1.1

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 (138) hide show
  1. package/PORT-SCOPE.md +169 -0
  2. package/README.md +451 -2
  3. package/dist/cjs/addr/expression.js +650 -0
  4. package/dist/cjs/addr/expression.js.map +1 -0
  5. package/dist/cjs/addresslist/memory-record.js +612 -0
  6. package/dist/cjs/addresslist/memory-record.js.map +1 -0
  7. package/dist/cjs/asm/assembler.js +354 -0
  8. package/dist/cjs/asm/assembler.js.map +1 -0
  9. package/dist/cjs/asm/autoassembler-directives.js +362 -0
  10. package/dist/cjs/asm/autoassembler-directives.js.map +1 -0
  11. package/dist/cjs/asm/autoassembler.js +2163 -0
  12. package/dist/cjs/asm/autoassembler.js.map +1 -0
  13. package/dist/cjs/asm/backend.js +394 -0
  14. package/dist/cjs/asm/backend.js.map +1 -0
  15. package/dist/cjs/asm/disassembler.js +715 -0
  16. package/dist/cjs/asm/disassembler.js.map +1 -0
  17. package/dist/cjs/backend/dbk-backend.js +683 -0
  18. package/dist/cjs/backend/dbk-backend.js.map +1 -0
  19. package/dist/cjs/backend/native-ce-backend.js +667 -0
  20. package/dist/cjs/backend/native-ce-backend.js.map +1 -0
  21. package/dist/cjs/backend/self-backend.js +449 -0
  22. package/dist/cjs/backend/self-backend.js.map +1 -0
  23. package/dist/cjs/backend/types.js +48 -0
  24. package/dist/cjs/backend/types.js.map +1 -0
  25. package/dist/cjs/cheattable/ct-format.js +533 -0
  26. package/dist/cjs/cheattable/ct-format.js.map +1 -0
  27. package/dist/cjs/index.js +219 -0
  28. package/dist/cjs/index.js.map +1 -0
  29. package/dist/cjs/lua/aa.js +230 -0
  30. package/dist/cjs/lua/aa.js.map +1 -0
  31. package/dist/cjs/lua/addressing.js +118 -0
  32. package/dist/cjs/lua/addressing.js.map +1 -0
  33. package/dist/cjs/lua/api.js +736 -0
  34. package/dist/cjs/lua/api.js.map +1 -0
  35. package/dist/cjs/lua/asm.js +220 -0
  36. package/dist/cjs/lua/asm.js.map +1 -0
  37. package/dist/cjs/lua/bridge.js +526 -0
  38. package/dist/cjs/lua/bridge.js.map +1 -0
  39. package/dist/cjs/lua/marshal.js +562 -0
  40. package/dist/cjs/lua/marshal.js.map +1 -0
  41. package/dist/cjs/lua/memory.js +213 -0
  42. package/dist/cjs/lua/memory.js.map +1 -0
  43. package/dist/cjs/lua/objects.js +1070 -0
  44. package/dist/cjs/lua/objects.js.map +1 -0
  45. package/dist/cjs/lua/scan.js +543 -0
  46. package/dist/cjs/lua/scan.js.map +1 -0
  47. package/dist/cjs/lua/types.js +103 -0
  48. package/dist/cjs/lua/types.js.map +1 -0
  49. package/dist/cjs/scanner/matcher.js +781 -0
  50. package/dist/cjs/scanner/matcher.js.map +1 -0
  51. package/dist/cjs/scanner/pointer-scan.js +546 -0
  52. package/dist/cjs/scanner/pointer-scan.js.map +1 -0
  53. package/dist/cjs/scanner/scanner.js +513 -0
  54. package/dist/cjs/scanner/scanner.js.map +1 -0
  55. package/dist/cjs/scanner/shared-layout.js +207 -0
  56. package/dist/cjs/scanner/shared-layout.js.map +1 -0
  57. package/dist/cjs/types.js +190 -0
  58. package/dist/cjs/types.js.map +1 -0
  59. package/dist/cjs/value-codec.js +515 -0
  60. package/dist/cjs/value-codec.js.map +1 -0
  61. package/dist/cjs/win/process.js +475 -0
  62. package/dist/cjs/win/process.js.map +1 -0
  63. package/dist/cjs/win/scan-worker.js +84 -0
  64. package/dist/cjs/win/scan-worker.js.map +1 -0
  65. package/dist/cjs/win/winapi.js +403 -0
  66. package/dist/cjs/win/winapi.js.map +1 -0
  67. package/dist/types/addr/expression.d.ts +98 -0
  68. package/dist/types/addr/expression.d.ts.map +1 -0
  69. package/dist/types/addresslist/memory-record.d.ts +218 -0
  70. package/dist/types/addresslist/memory-record.d.ts.map +1 -0
  71. package/dist/types/asm/assembler.d.ts +106 -0
  72. package/dist/types/asm/assembler.d.ts.map +1 -0
  73. package/dist/types/asm/autoassembler-directives.d.ts +118 -0
  74. package/dist/types/asm/autoassembler-directives.d.ts.map +1 -0
  75. package/dist/types/asm/autoassembler.d.ts +434 -0
  76. package/dist/types/asm/autoassembler.d.ts.map +1 -0
  77. package/dist/types/asm/backend.d.ts +167 -0
  78. package/dist/types/asm/backend.d.ts.map +1 -0
  79. package/dist/types/asm/disassembler.d.ts +194 -0
  80. package/dist/types/asm/disassembler.d.ts.map +1 -0
  81. package/dist/types/backend/dbk-backend.d.ts +353 -0
  82. package/dist/types/backend/dbk-backend.d.ts.map +1 -0
  83. package/dist/types/backend/native-ce-backend.d.ts +213 -0
  84. package/dist/types/backend/native-ce-backend.d.ts.map +1 -0
  85. package/dist/types/backend/self-backend.d.ts +64 -0
  86. package/dist/types/backend/self-backend.d.ts.map +1 -0
  87. package/dist/types/backend/types.d.ts +176 -0
  88. package/dist/types/backend/types.d.ts.map +1 -0
  89. package/dist/types/cheattable/ct-format.d.ts +100 -0
  90. package/dist/types/cheattable/ct-format.d.ts.map +1 -0
  91. package/dist/types/index.d.ts +54 -0
  92. package/dist/types/index.d.ts.map +1 -0
  93. package/dist/types/lua/aa.d.ts +107 -0
  94. package/dist/types/lua/aa.d.ts.map +1 -0
  95. package/dist/types/lua/addressing.d.ts +41 -0
  96. package/dist/types/lua/addressing.d.ts.map +1 -0
  97. package/dist/types/lua/api.d.ts +46 -0
  98. package/dist/types/lua/api.d.ts.map +1 -0
  99. package/dist/types/lua/asm.d.ts +42 -0
  100. package/dist/types/lua/asm.d.ts.map +1 -0
  101. package/dist/types/lua/bridge.d.ts +129 -0
  102. package/dist/types/lua/bridge.d.ts.map +1 -0
  103. package/dist/types/lua/marshal.d.ts +244 -0
  104. package/dist/types/lua/marshal.d.ts.map +1 -0
  105. package/dist/types/lua/memory.d.ts +61 -0
  106. package/dist/types/lua/memory.d.ts.map +1 -0
  107. package/dist/types/lua/objects.d.ts +210 -0
  108. package/dist/types/lua/objects.d.ts.map +1 -0
  109. package/dist/types/lua/scan.d.ts +106 -0
  110. package/dist/types/lua/scan.d.ts.map +1 -0
  111. package/dist/types/lua/types.d.ts +146 -0
  112. package/dist/types/lua/types.d.ts.map +1 -0
  113. package/dist/types/scanner/matcher.d.ts +122 -0
  114. package/dist/types/scanner/matcher.d.ts.map +1 -0
  115. package/dist/types/scanner/pointer-scan.d.ts +187 -0
  116. package/dist/types/scanner/pointer-scan.d.ts.map +1 -0
  117. package/dist/types/scanner/scanner.d.ts +150 -0
  118. package/dist/types/scanner/scanner.d.ts.map +1 -0
  119. package/dist/types/scanner/shared-layout.d.ts +96 -0
  120. package/dist/types/scanner/shared-layout.d.ts.map +1 -0
  121. package/dist/types/types.d.ts +239 -0
  122. package/dist/types/types.d.ts.map +1 -0
  123. package/dist/types/value-codec.d.ts +134 -0
  124. package/dist/types/value-codec.d.ts.map +1 -0
  125. package/dist/types/win/process.d.ts +190 -0
  126. package/dist/types/win/process.d.ts.map +1 -0
  127. package/dist/types/win/scan-worker.d.ts +51 -0
  128. package/dist/types/win/scan-worker.d.ts.map +1 -0
  129. package/dist/types/win/winapi.d.ts +144 -0
  130. package/dist/types/win/winapi.d.ts.map +1 -0
  131. package/docs/assembler.md +371 -0
  132. package/docs/autoassembler.md +423 -0
  133. package/docs/backend-dbk.md +305 -0
  134. package/docs/backends.md +273 -0
  135. package/docs/evidence/atomics-wait-io.js +20 -0
  136. package/docs/evidence/mini-repro.js +98 -0
  137. package/docs/lua-api.md +718 -0
  138. package/package.json +60 -4
@@ -0,0 +1,533 @@
1
+ "use strict";
2
+ /**
3
+ * Cheat Table (.CT) 读写 —— 对齐 Cheat Engine 的 XML 表格式。
4
+ *
5
+ * 元素与属性名严格对齐 `MemoryRecordUnit.pas` / `addresslist.pas` 的写出逻辑:
6
+ *
7
+ * ```xml
8
+ * <?xml version="1.0" encoding="utf-8"?>
9
+ * <CheatTable CheatEngineTableVersion="46">
10
+ * <CheatEntries>
11
+ * <CheatEntry>
12
+ * <ID>1</ID>
13
+ * <Description>"生命值"</Description>
14
+ * <VariableType>4 Bytes</VariableType>
15
+ * <Address>"game.exe"+0012AB34</Address>
16
+ * <Offsets><Offset>10</Offset><Offset>8</Offset></Offsets>
17
+ * <LastState Value="1000" RealAddress="7FF6..."/>
18
+ * <ShowAsHex>1</ShowAsHex>
19
+ * <Color>FF0000</Color>
20
+ * <CheatEntries> ... 子条目 ... </CheatEntries>
21
+ * </CheatEntry>
22
+ * </CheatEntries>
23
+ * </CheatTable>
24
+ * ```
25
+ *
26
+ * 关键映射(来自 CEFuncProc.VariableTypeToString / StringToVariableType):
27
+ * Byte→'Byte'、Word→'2 Bytes'、DWord→'4 Bytes'、QWord→'8 Bytes'、
28
+ * Single→'Float'、Double→'Double'、String→'String'、UnicodeString→'Unicode String'、
29
+ * ByteArray→'Array of byte'、Binary→'Binary'、All→'All'、Pointer→'Pointer'、
30
+ * AutoAssembler→'Auto Assembler Script'、Custom→'Custom'
31
+ *
32
+ * 关于 XML 解析:这里用自写的轻量解析器而不是 DOMParser,
33
+ * 目的是**保留原始元素顺序与未知元素**,从而做到"读进来再写出去不丢信息"
34
+ * (CE 表里存在大量本移植不关心的元素,例如 Hotkeys、Color、DropDownList)。
35
+ * 未知元素统一收进 MemoryRecordData.extra,写回时原样附着。
36
+ */
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.variableTypeToString = variableTypeToString;
39
+ exports.stringToVariableType = stringToVariableType;
40
+ exports.parseXml = parseXml;
41
+ exports.parseCheatTable = parseCheatTable;
42
+ exports.writeCheatTable = writeCheatTable;
43
+ exports.loadCheatTable = loadCheatTable;
44
+ exports.saveCheatTable = saveCheatTable;
45
+ const memory_record_1 = require("../addresslist/memory-record");
46
+ const types_1 = require("../types");
47
+ /* ------------------------------------------------------------------ *
48
+ * 类型名映射(严格对齐 CEFuncProc)
49
+ * ------------------------------------------------------------------ */
50
+ const TYPE_TO_STRING = {
51
+ [types_1.VariableType.All]: 'All',
52
+ [types_1.VariableType.Binary]: 'Binary',
53
+ [types_1.VariableType.ByteArray]: 'Array of byte',
54
+ [types_1.VariableType.Byte]: 'Byte',
55
+ [types_1.VariableType.Word]: '2 Bytes',
56
+ [types_1.VariableType.DWord]: '4 Bytes',
57
+ [types_1.VariableType.QWord]: '8 Bytes',
58
+ [types_1.VariableType.Single]: 'Float',
59
+ [types_1.VariableType.Double]: 'Double',
60
+ [types_1.VariableType.String]: 'String',
61
+ [types_1.VariableType.UnicodeString]: 'Unicode String',
62
+ [types_1.VariableType.Pointer]: 'Pointer',
63
+ [types_1.VariableType.AutoAssembler]: 'Auto Assembler Script',
64
+ [types_1.VariableType.Custom]: 'Custom',
65
+ [types_1.VariableType.Grouped]: 'Grouped',
66
+ [types_1.VariableType.ByteArrays]: 'Array of byte',
67
+ [types_1.VariableType.CodePageString]: 'String',
68
+ };
69
+ const STRING_TO_TYPE = {
70
+ all: types_1.VariableType.All,
71
+ binary: types_1.VariableType.Binary,
72
+ 'array of byte': types_1.VariableType.ByteArray,
73
+ byte: types_1.VariableType.Byte,
74
+ '2 bytes': types_1.VariableType.Word,
75
+ '4 bytes': types_1.VariableType.DWord,
76
+ '8 bytes': types_1.VariableType.QWord,
77
+ float: types_1.VariableType.Single,
78
+ double: types_1.VariableType.Double,
79
+ string: types_1.VariableType.String,
80
+ 'unicode string': types_1.VariableType.UnicodeString,
81
+ pointer: types_1.VariableType.Pointer,
82
+ custom: types_1.VariableType.Custom,
83
+ grouped: types_1.VariableType.Grouped,
84
+ 'auto assembler script': types_1.VariableType.AutoAssembler,
85
+ };
86
+ /** 变量类型 → CE 表里的字符串 */
87
+ function variableTypeToString(type) {
88
+ return TYPE_TO_STRING[type] ?? 'Error';
89
+ }
90
+ /** CE 表里的字符串 → 变量类型(未知时按 CE 一样回落到 Byte) */
91
+ function stringToVariableType(s) {
92
+ const key = s.trim().toLowerCase();
93
+ return STRING_TO_TYPE[key] ?? types_1.VariableType.Byte;
94
+ }
95
+ /** 解析 XML 为元素树(保留顺序与未知元素)。 */
96
+ function parseXml(source) {
97
+ let i = 0;
98
+ const n = source.length;
99
+ const root = { kind: 'element', name: '#root', attributes: {}, children: [], text: '' };
100
+ const stack = [root];
101
+ const decode = (s) => s
102
+ .replace(/&lt;/g, '<')
103
+ .replace(/&gt;/g, '>')
104
+ .replace(/&quot;/g, '"')
105
+ .replace(/&apos;/g, "'")
106
+ .replace(/&#(\d+);/g, (_, d) => String.fromCharCode(Number(d)))
107
+ .replace(/&amp;/g, '&');
108
+ while (i < n) {
109
+ const lt = source.indexOf('<', i);
110
+ if (lt === -1) {
111
+ const t = source.slice(i).trim();
112
+ if (t)
113
+ stack[stack.length - 1].children.push({ kind: 'text', value: decode(t) });
114
+ break;
115
+ }
116
+ if (lt > i) {
117
+ const t = source.slice(i, lt).trim();
118
+ if (t)
119
+ stack[stack.length - 1].children.push({ kind: 'text', value: decode(t) });
120
+ }
121
+ // 注释 / 声明 / CDATA
122
+ if (source.startsWith('<!--', lt)) {
123
+ const end = source.indexOf('-->', lt);
124
+ i = end === -1 ? n : end + 3;
125
+ continue;
126
+ }
127
+ if (source.startsWith('<?', lt)) {
128
+ const end = source.indexOf('?>', lt);
129
+ i = end === -1 ? n : end + 2;
130
+ continue;
131
+ }
132
+ if (source.startsWith('<![CDATA[', lt)) {
133
+ const end = source.indexOf(']]>', lt);
134
+ const content = source.slice(lt + 9, end === -1 ? n : end);
135
+ stack[stack.length - 1].children.push({ kind: 'text', value: content });
136
+ i = end === -1 ? n : end + 3;
137
+ continue;
138
+ }
139
+ if (source.startsWith('<!', lt)) {
140
+ const end = source.indexOf('>', lt);
141
+ i = end === -1 ? n : end + 1;
142
+ continue;
143
+ }
144
+ const gt = source.indexOf('>', lt);
145
+ if (gt === -1)
146
+ break;
147
+ const raw = source.slice(lt + 1, gt);
148
+ // 闭合标签
149
+ if (raw.startsWith('/')) {
150
+ const name = raw.slice(1).trim();
151
+ // 容错:找到匹配的祖先
152
+ for (let k = stack.length - 1; k >= 1; k--) {
153
+ if (stack[k].name === name) {
154
+ stack.length = k;
155
+ break;
156
+ }
157
+ }
158
+ i = gt + 1;
159
+ continue;
160
+ }
161
+ const selfClosing = raw.endsWith('/');
162
+ const body = selfClosing ? raw.slice(0, -1) : raw;
163
+ // 分离标签名与属性
164
+ const nameMatch = body.match(/^([^\s/]+)/);
165
+ const name = nameMatch ? nameMatch[1] : '';
166
+ const attrStr = body.slice(name.length);
167
+ const attributes = {};
168
+ const attrRe = /([^\s=]+)\s*=\s*("([^"]*)"|'([^']*)')/g;
169
+ let am;
170
+ while ((am = attrRe.exec(attrStr)) !== null) {
171
+ attributes[am[1]] = decode(am[3] ?? am[4] ?? '');
172
+ }
173
+ const el = { kind: 'element', name, attributes, children: [], text: '' };
174
+ stack[stack.length - 1].children.push(el);
175
+ if (!selfClosing)
176
+ stack.push(el);
177
+ i = gt + 1;
178
+ }
179
+ // 计算每个元素的 text
180
+ const computeText = (el) => {
181
+ let s = '';
182
+ for (const c of el.children) {
183
+ if (c.kind === 'text')
184
+ s += c.value;
185
+ else
186
+ computeText(c);
187
+ }
188
+ el.text = s.trim();
189
+ };
190
+ computeText(root);
191
+ return root;
192
+ }
193
+ /** 在元素下找第一个指定名字的子元素 */
194
+ function child(el, name) {
195
+ for (const c of el.children) {
196
+ if (c.kind === 'element' && c.name === name)
197
+ return c;
198
+ }
199
+ return undefined;
200
+ }
201
+ /** 在元素下找全部指定名字的子元素 */
202
+ function children(el, name) {
203
+ const out = [];
204
+ for (const c of el.children) {
205
+ if (c.kind === 'element' && c.name === name)
206
+ out.push(c);
207
+ }
208
+ return out;
209
+ }
210
+ /** 描述在 CE 表里被引号包裹;去掉外层引号(若无引号则原样) */
211
+ function unquoteDescription(s) {
212
+ const t = s.trim();
213
+ if (t.length >= 2 && t.startsWith('"') && t.endsWith('"'))
214
+ return t.slice(1, -1);
215
+ return t;
216
+ }
217
+ /**
218
+ * 给描述/地址加 CE 约定的包裹引号(幂等)。
219
+ *
220
+ * CE 表里描述与地址都用一对字面量双引号包裹。若值自身已经是"外层包裹"形式
221
+ * 就不再重复加,避免写出 `""生命值""`。
222
+ * 注意与之区分:`"node.exe"+0` 里的引号属于表达式内部,整体**仍需要**再包一层,
223
+ * 写成 `""node.exe"+0"` 正是 CE 的格式 —— 因此判断条件是"首尾引号且内部无引号"。
224
+ */
225
+ function quoteDescription(s) {
226
+ const t = s.trim();
227
+ if (t.length >= 2 && t.startsWith('"') && t.endsWith('"') && !t.slice(1, -1).includes('"')) {
228
+ return t;
229
+ }
230
+ return `"${t}"`;
231
+ }
232
+ /**
233
+ * 解析 .CT 内容为地址表数据。
234
+ */
235
+ function parseCheatTable(xml) {
236
+ const root = parseXml(xml);
237
+ const table = root.name === 'CheatTable' ? root : findFirstByName(root, 'CheatTable') ?? root;
238
+ const versionRaw = table.attributes['CheatEngineTableVersion'] ?? '1';
239
+ const version = Number.parseInt(versionRaw, 10) || 1;
240
+ const commentEl = child(table, 'Comment');
241
+ const comment = commentEl ? commentEl.text : '';
242
+ const symbols = [];
243
+ const symsEl = child(table, 'UserdefinedSymbols');
244
+ if (symsEl) {
245
+ for (const s of children(symsEl, 'SymbolEntry')) {
246
+ const name = s.attributes['Name'] ?? '';
247
+ const address = s.attributes['Address'] ?? '';
248
+ if (name)
249
+ symbols.push({ name, address });
250
+ }
251
+ }
252
+ let records = [];
253
+ const entriesEl = child(table, 'CheatEntries');
254
+ if (entriesEl) {
255
+ records = children(entriesEl, 'CheatEntry').map((e) => parseCheatEntry(e));
256
+ }
257
+ else {
258
+ // 少数表把 CheatEntry 直接放在 CheatTable 下
259
+ records = children(table, 'CheatEntry').map((e) => parseCheatEntry(e));
260
+ }
261
+ return { version, comment, records, symbols, rootAttributes: { ...table.attributes } };
262
+ }
263
+ function findFirstByName(el, name) {
264
+ for (const c of el.children) {
265
+ if (c.kind !== 'element')
266
+ continue;
267
+ if (c.name === name)
268
+ return c;
269
+ const inner = findFirstByName(c, name);
270
+ if (inner)
271
+ return inner;
272
+ }
273
+ return null;
274
+ }
275
+ /** 解析单个 <CheatEntry> */
276
+ function parseCheatEntry(el) {
277
+ const known = new Set([
278
+ 'ID',
279
+ 'Description',
280
+ 'VariableType',
281
+ 'Address',
282
+ 'Offsets',
283
+ 'CheatEntries',
284
+ 'LastState',
285
+ 'ShowAsHex',
286
+ 'ShowAsSigned',
287
+ 'Color',
288
+ 'GroupHeader',
289
+ 'Options',
290
+ 'Length',
291
+ 'Unicode',
292
+ 'CodePage',
293
+ 'ZeroTerminate',
294
+ 'ByteLength',
295
+ 'BitStart',
296
+ 'BitLength',
297
+ 'ShowAsBinary',
298
+ 'CustomType',
299
+ 'AssemblerScript',
300
+ 'DropDownListLink',
301
+ 'DropDownList',
302
+ ]);
303
+ const idEl = child(el, 'ID');
304
+ const id = idEl ? Number.parseInt(idEl.text, 10) || 0 : 0;
305
+ const descEl = child(el, 'Description');
306
+ const description = descEl ? unquoteDescription(descEl.text) : '';
307
+ const typeEl = child(el, 'VariableType');
308
+ const groupHeader = child(el, 'GroupHeader');
309
+ let variableType = typeEl ? stringToVariableType(typeEl.text) : types_1.VariableType.Byte;
310
+ if (!typeEl && groupHeader) {
311
+ // 分组头在 CE 里没有 VariableType,用 Byte 占位
312
+ variableType = types_1.VariableType.Byte;
313
+ }
314
+ const addrEl = child(el, 'Address');
315
+ const address = addrEl ? unquoteDescription(addrEl.text) : '';
316
+ const offsetsEl = child(el, 'Offsets');
317
+ let offsets;
318
+ if (offsetsEl) {
319
+ offsets = children(offsetsEl, 'Offset')
320
+ .map((o) => Number.parseInt(o.text, 10))
321
+ .filter((v) => !Number.isNaN(v));
322
+ if (offsets.length === 0)
323
+ offsets = undefined;
324
+ }
325
+ const hexEl = child(el, 'ShowAsHex');
326
+ const hexadecimal = hexEl ? hexEl.text.trim() === '1' : false;
327
+ const binEl = child(el, 'ShowAsBinary');
328
+ const binary = binEl ? binEl.text.trim().toLowerCase() === 'true' || binEl.text.trim() === '1' : false;
329
+ const lenEl = child(el, 'Length');
330
+ const stringLength = lenEl ? Number.parseInt(lenEl.text, 10) || 0 : 0;
331
+ const cpEl = child(el, 'CodePage');
332
+ const codePageRaw = cpEl ? cpEl.text.trim() : '';
333
+ const codePage = codePageRaw === '1' || codePageRaw.toLowerCase() === 'true' ? 1 : 0;
334
+ const lastState = child(el, 'LastState');
335
+ const value = lastState?.attributes['Value'];
336
+ // 冻结状态:CE 用 <LastState ... /> 无专门字段,但表里常见 Active 属性;
337
+ // 这里同时兼容 LastState 上的 Active(部分版本)与顶层 <Active>
338
+ const activeAttr = lastState?.attributes['Active'] ?? child(el, 'Active')?.text;
339
+ const active = activeAttr === undefined ? true : activeAttr !== '0' && activeAttr.toLowerCase() !== 'false';
340
+ const data = {
341
+ id,
342
+ description,
343
+ address,
344
+ variableType,
345
+ };
346
+ if (value !== undefined)
347
+ data.value = value;
348
+ if (offsets)
349
+ data.offsets = offsets;
350
+ if (hexadecimal)
351
+ data.hexadecimal = true;
352
+ if (binary)
353
+ data.binary = true;
354
+ if (stringLength)
355
+ data.stringLength = stringLength;
356
+ if (codePage)
357
+ data.codePage = codePage;
358
+ if (!active)
359
+ data.active = false;
360
+ // 未知元素原样保留,保证往返不丢信息
361
+ const extra = {};
362
+ for (const c of el.children) {
363
+ if (c.kind !== 'element')
364
+ continue;
365
+ if (known.has(c.name))
366
+ continue;
367
+ extra[c.name] = c.text;
368
+ }
369
+ // 已知但本移植不建模的元素也保留下来(例如 Options / Color / AssemblerScript)
370
+ for (const name of ['Options', 'Color', 'AssemblerScript', 'DropDownList', 'DropDownListLink', 'CustomType', 'GroupHeader']) {
371
+ const c = child(el, name);
372
+ if (c)
373
+ extra[name] = c.text || '1';
374
+ }
375
+ if (Object.keys(extra).length > 0)
376
+ data.extra = extra;
377
+ const sub = child(el, 'CheatEntries');
378
+ if (sub) {
379
+ const kids = children(sub, 'CheatEntry').map((e) => parseCheatEntry(e));
380
+ if (kids.length > 0)
381
+ data.children = kids;
382
+ }
383
+ return data;
384
+ }
385
+ /**
386
+ * XML **文本节点**转义。
387
+ *
388
+ * 关键:这里**不转义双引号**。因为 CE 表约定描述与地址用字面量双引号包裹
389
+ * (`<Description>"生命值"</Description>`),这些引号必须原样出现在文本里。
390
+ * 文本节点里出现裸引号是合法 XML,CE 的解析器同样如此处理。
391
+ *
392
+ * 早期实现把引号转成 `&quot;` 再还原回 `"`,两次替换互相抵消等于没转义,
393
+ * 却让"已带引号"的地址变成 `""game.exe"+0"` —— 请勿改回。
394
+ * 属性值请用 escAttr(那里必须转义引号)。
395
+ */
396
+ function esc(s) {
397
+ return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
398
+ }
399
+ /** XML **属性值**转义(引号必须转义)。 */
400
+ function escAttr(s) {
401
+ return s
402
+ .replace(/&/g, '&amp;')
403
+ .replace(/</g, '&lt;')
404
+ .replace(/>/g, '&gt;')
405
+ .replace(/"/g, '&quot;');
406
+ }
407
+ /**
408
+ * 把地址表序列化为 .CT 内容。
409
+ *
410
+ * @param list 地址表;若为纯数据数组也可直接传
411
+ */
412
+ function writeCheatTable(list, options = {}) {
413
+ const version = options.version ?? 46;
414
+ const includeLastState = options.includeLastState !== false;
415
+ let records;
416
+ if (Array.isArray(list)) {
417
+ records = list.map((r) => typeof r.toData === 'function' ? r.toData() : r);
418
+ }
419
+ else {
420
+ records = list.toData();
421
+ }
422
+ const symbols = options.symbols ??
423
+ (list instanceof memory_record_1.AddressList ? [...list.symbols.entries()].filter(([k]) => k === k) : []).map(([name, address]) => ({
424
+ name,
425
+ address: '0x' + address.toString(16).toUpperCase(),
426
+ }));
427
+ const lines = [];
428
+ lines.push('<?xml version="1.0" encoding="utf-8"?>');
429
+ lines.push(`<CheatTable CheatEngineTableVersion="${version}">`);
430
+ if (options.comment) {
431
+ lines.push(` <Comment>${esc(options.comment)}</Comment>`);
432
+ }
433
+ if (symbols.length > 0) {
434
+ lines.push(' <UserdefinedSymbols>');
435
+ for (const s of symbols) {
436
+ lines.push(` <SymbolEntry Name="${escAttr(s.name)}" Address="${escAttr(s.address)}"/>`);
437
+ }
438
+ lines.push(' </UserdefinedSymbols>');
439
+ }
440
+ lines.push(' <CheatEntries>');
441
+ for (const r of records) {
442
+ writeEntry(lines, r, 2, includeLastState);
443
+ }
444
+ lines.push(' </CheatEntries>');
445
+ lines.push('</CheatTable>');
446
+ return lines.join('\n') + '\n';
447
+ }
448
+ function writeEntry(lines, r, indent, includeLastState) {
449
+ const pad = ' '.repeat(indent);
450
+ const pad2 = ' '.repeat(indent + 1);
451
+ lines.push(`${pad}<CheatEntry>`);
452
+ lines.push(`${pad2}<ID>${r.id}</ID>`);
453
+ lines.push(`${pad2}<Description>${esc(quoteDescription(r.description))}</Description>`);
454
+ // 分组头没有 VariableType
455
+ const isGroupHeader = r.extra?.['GroupHeader'] !== undefined;
456
+ if (!isGroupHeader) {
457
+ lines.push(`${pad2}<VariableType>${esc(variableTypeToString(r.variableType))}</VariableType>`);
458
+ }
459
+ if (r.address) {
460
+ lines.push(`${pad2}<Address>${esc(quoteDescription(r.address))}</Address>`);
461
+ }
462
+ if (r.offsets && r.offsets.length > 0) {
463
+ lines.push(`${pad2}<Offsets>`);
464
+ for (const o of r.offsets) {
465
+ lines.push(`${pad2} <Offset>${o}</Offset>`);
466
+ }
467
+ lines.push(`${pad2}</Offsets>`);
468
+ }
469
+ // 未知/未建模元素原样写回
470
+ if (r.extra) {
471
+ for (const [name, text] of Object.entries(r.extra)) {
472
+ if (name === 'GroupHeader') {
473
+ lines.push(`${pad2}<GroupHeader>${esc(text || '1')}</GroupHeader>`);
474
+ continue;
475
+ }
476
+ if (name === 'AssemblerScript') {
477
+ lines.push(`${pad2}<AssemblerScript>${esc(text)}</AssemblerScript>`);
478
+ continue;
479
+ }
480
+ if (name === 'Color') {
481
+ lines.push(`${pad2}<Color>${esc(text)}</Color>`);
482
+ continue;
483
+ }
484
+ // 其余按简单文本元素写回
485
+ lines.push(`${pad2}<${name}>${esc(text)}</${name}>`);
486
+ }
487
+ }
488
+ if (r.hexadecimal)
489
+ lines.push(`${pad2}<ShowAsHex>1</ShowAsHex>`);
490
+ if (includeLastState && r.value !== undefined && r.value !== '') {
491
+ lines.push(`${pad2}<LastState Value="${escAttr(r.value)}"/>`);
492
+ }
493
+ else if (includeLastState) {
494
+ lines.push(`${pad2}<LastState/>`);
495
+ }
496
+ if (r.children && r.children.length > 0) {
497
+ lines.push(`${pad2}<CheatEntries>`);
498
+ for (const c of r.children)
499
+ writeEntry(lines, c, indent + 2, includeLastState);
500
+ lines.push(`${pad2}</CheatEntries>`);
501
+ }
502
+ lines.push(`${pad}</CheatEntry>`);
503
+ }
504
+ /* ------------------------------------------------------------------ *
505
+ * 高层 API
506
+ * ------------------------------------------------------------------ */
507
+ /** 从 .CT 文本构建 AddressList(不改动传入的 XML) */
508
+ function loadCheatTable(xml, process) {
509
+ const parsed = parseCheatTable(xml);
510
+ const list = new memory_record_1.AddressList(process ?? null);
511
+ list.comment = parsed.comment;
512
+ list.version = parsed.version;
513
+ for (const r of parsed.records)
514
+ list.add(r);
515
+ if (list.process)
516
+ list.preloadModules();
517
+ return { list, parsed };
518
+ }
519
+ /** 把地址表写回 .CT 文本 */
520
+ function saveCheatTable(list, options = {}) {
521
+ // 只导出用户注册的符号(去重:内部同时存了原名与小写名)
522
+ const seen = new Set();
523
+ const symbols = [];
524
+ for (const [name, address] of list.symbols) {
525
+ if (seen.has(name))
526
+ continue;
527
+ // 跳过纯小写重复项:若存在同名的大小写变体,只保留第一个
528
+ seen.add(name);
529
+ symbols.push({ name, address: '0x' + address.toString(16).toUpperCase() });
530
+ }
531
+ return writeCheatTable(list, { ...options, comment: options.comment ?? list.comment, symbols });
532
+ }
533
+ //# sourceMappingURL=ct-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ct-format.js","sourceRoot":"","sources":["../../../src/cheattable/ct-format.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;;AAoDH,oDAEC;AAGD,oDAGC;AAuBD,4BAqGC;AA2DD,0CA+BC;AAyKD,0CA2CC;AA0ED,wCAWC;AAGD,wCAcC;AA1kBD,gEAIsC;AACtC,oCAAwC;AAExC;;wEAEwE;AAExE,MAAM,cAAc,GAA0C;IAC5D,CAAC,oBAAY,CAAC,GAAG,CAAC,EAAE,KAAK;IACzB,CAAC,oBAAY,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC/B,CAAC,oBAAY,CAAC,SAAS,CAAC,EAAE,eAAe;IACzC,CAAC,oBAAY,CAAC,IAAI,CAAC,EAAE,MAAM;IAC3B,CAAC,oBAAY,CAAC,IAAI,CAAC,EAAE,SAAS;IAC9B,CAAC,oBAAY,CAAC,KAAK,CAAC,EAAE,SAAS;IAC/B,CAAC,oBAAY,CAAC,KAAK,CAAC,EAAE,SAAS;IAC/B,CAAC,oBAAY,CAAC,MAAM,CAAC,EAAE,OAAO;IAC9B,CAAC,oBAAY,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC/B,CAAC,oBAAY,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC/B,CAAC,oBAAY,CAAC,aAAa,CAAC,EAAE,gBAAgB;IAC9C,CAAC,oBAAY,CAAC,OAAO,CAAC,EAAE,SAAS;IACjC,CAAC,oBAAY,CAAC,aAAa,CAAC,EAAE,uBAAuB;IACrD,CAAC,oBAAY,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC/B,CAAC,oBAAY,CAAC,OAAO,CAAC,EAAE,SAAS;IACjC,CAAC,oBAAY,CAAC,UAAU,CAAC,EAAE,eAAe;IAC1C,CAAC,oBAAY,CAAC,cAAc,CAAC,EAAE,QAAQ;CACxC,CAAC;AAEF,MAAM,cAAc,GAAiC;IACnD,GAAG,EAAE,oBAAY,CAAC,GAAG;IACrB,MAAM,EAAE,oBAAY,CAAC,MAAM;IAC3B,eAAe,EAAE,oBAAY,CAAC,SAAS;IACvC,IAAI,EAAE,oBAAY,CAAC,IAAI;IACvB,SAAS,EAAE,oBAAY,CAAC,IAAI;IAC5B,SAAS,EAAE,oBAAY,CAAC,KAAK;IAC7B,SAAS,EAAE,oBAAY,CAAC,KAAK;IAC7B,KAAK,EAAE,oBAAY,CAAC,MAAM;IAC1B,MAAM,EAAE,oBAAY,CAAC,MAAM;IAC3B,MAAM,EAAE,oBAAY,CAAC,MAAM;IAC3B,gBAAgB,EAAE,oBAAY,CAAC,aAAa;IAC5C,OAAO,EAAE,oBAAY,CAAC,OAAO;IAC7B,MAAM,EAAE,oBAAY,CAAC,MAAM;IAC3B,OAAO,EAAE,oBAAY,CAAC,OAAO;IAC7B,uBAAuB,EAAE,oBAAY,CAAC,aAAa;CACpD,CAAC;AAEF,uBAAuB;AACvB,SAAgB,oBAAoB,CAAC,IAAkB;IACrD,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC;AACzC,CAAC;AAED,2CAA2C;AAC3C,SAAgB,oBAAoB,CAAC,CAAS;IAC5C,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,oBAAY,CAAC,IAAI,CAAC;AAClD,CAAC;AAsBD,8BAA8B;AAC9B,SAAgB,QAAQ,CAAC,MAAc;IACrC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACpG,MAAM,KAAK,GAAiB,CAAC,IAAI,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CACnC,CAAC;SACE,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;SACtE,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACb,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAClC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC;gBAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjF,MAAM;QACR,CAAC;QACD,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,IAAI,CAAC;gBAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;QAED,kBAAkB;QAClB,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACtC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACrC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3D,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACxE,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACpC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,MAAM;QACrB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAErC,OAAO;QACP,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,aAAa;YACb,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBAC3B,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;oBACjB,MAAM;gBACR,CAAC;YACH,CAAC;YACD,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAElD,WAAW;QACX,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,wCAAwC,CAAC;QACxD,IAAI,EAA0B,CAAC;QAC/B,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5C,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,EAAE,GAAe,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACrF,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE1C,IAAI,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACb,CAAC;IAED,eAAe;IACf,MAAM,WAAW,GAAG,CAAC,EAAc,EAAQ,EAAE;QAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;gBAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;;gBAC/B,WAAW,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC,CAAC;IACF,WAAW,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uBAAuB;AACvB,SAAS,KAAK,CAAC,EAAc,EAAE,IAAY;IACzC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,sBAAsB;AACtB,SAAS,QAAQ,CAAC,EAAc,EAAE,IAAY;IAC5C,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,qCAAqC;AACrC,SAAS,kBAAkB,CAAC,CAAS;IACnC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACnB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,gBAAgB,CAAC,CAAS;IACjC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACnB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3F,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC;AAClB,CAAC;AAgBD;;GAEG;AACH,SAAgB,eAAe,CAAC,GAAW;IACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,KAAK,GACT,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,IAAI,CAAC;IAElF,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,yBAAyB,CAAC,IAAI,GAAG,CAAC;IACtE,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAErD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhD,MAAM,OAAO,GAA6C,EAAE,CAAC;IAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;IAClD,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,IAAI;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,IAAI,OAAO,GAAuB,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAC/C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,GAAG,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,oCAAoC;QACpC,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;AACzF,CAAC;AAED,SAAS,eAAe,CAAC,EAAc,EAAE,IAAY;IACnD,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS;QACnC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wBAAwB;AACxB,SAAS,eAAe,CAAC,EAAc;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC;QACpB,IAAI;QACJ,aAAa;QACb,cAAc;QACd,SAAS;QACT,SAAS;QACT,cAAc;QACd,WAAW;QACX,WAAW;QACX,cAAc;QACd,OAAO;QACP,aAAa;QACb,SAAS;QACT,QAAQ;QACR,SAAS;QACT,UAAU;QACV,eAAe;QACf,YAAY;QACZ,UAAU;QACV,WAAW;QACX,cAAc;QACd,YAAY;QACZ,iBAAiB;QACjB,kBAAkB;QAClB,cAAc;KACf,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAElE,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,KAAK,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAC7C,IAAI,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,oBAAY,CAAC,IAAI,CAAC;IAClF,IAAI,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;QAC3B,qCAAqC;QACrC,YAAY,GAAG,oBAAY,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9D,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACvC,IAAI,OAA6B,CAAC;IAClC,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,GAAG,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;aACvC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,SAAS,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAE9D,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAEvG,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtE,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,WAAW,KAAK,GAAG,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAErF,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAE7C,qDAAqD;IACrD,+CAA+C;IAC/C,MAAM,UAAU,GAAG,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChF,MAAM,MAAM,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,KAAK,GAAG,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;IAE5G,MAAM,IAAI,GAAqB;QAC7B,EAAE;QACF,WAAW;QACX,OAAO;QACP,YAAY;KACb,CAAC;IACF,IAAI,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAC5C,IAAI,OAAO;QAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACpC,IAAI,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IACzC,IAAI,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IAC/B,IAAI,YAAY;QAAE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnD,IAAI,QAAQ;QAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACvC,IAAI,CAAC,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IAEjC,oBAAoB;IACpB,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS;QACnC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QAChC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IACzB,CAAC;IACD,0DAA0D;IAC1D,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC;QAC5H,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;IACrC,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAEtD,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IACtC,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC5C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAiBD;;;;;;;;;;GAUG;AACH,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED,6BAA6B;AAC7B,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAC7B,IAAuD,EACvD,UAAkC,EAAE;IAEpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACtC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,KAAK,KAAK,CAAC;IAE5D,IAAI,OAA2B,CAAC;IAChC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACvB,OAAQ,CAAkB,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAE,CAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAE,CAAsB,CAC1G,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,OAAO,GACX,OAAO,CAAC,OAAO;QACf,CAAC,IAAI,YAAY,2BAAW,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YAClH,IAAI;YACJ,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE;SACnD,CAAC,CAAC,CAAC;IAEN,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,wCAAwC,OAAO,IAAI,CAAC,CAAC;IAChE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,0BAA0B,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7F,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACxC,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC5C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,UAAU,CACjB,KAAe,EACf,CAAmB,EACnB,MAAc,EACd,gBAAyB;IAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,gBAAgB,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAExF,qBAAqB;IACrB,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,KAAK,SAAS,CAAC;IAC7D,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,iBAAiB,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,YAAY,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC;IAClC,CAAC;IAED,eAAe;IACf,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,gBAAgB,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBACpE,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,oBAAoB,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACrE,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACjD,SAAS;YACX,CAAC;YACD,cAAc;YACd,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC;IAEjE,IAAI,gBAAgB,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,qBAAqB,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;SAAM,IAAI,gBAAgB,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,gBAAgB,CAAC,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ;YAAE,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAC/E,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC,CAAC;AACpC,CAAC;AAED;;wEAEwE;AAExE,yCAAyC;AACzC,SAAgB,cAAc,CAC5B,GAAW,EACX,OAAmE;IAEnE,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,2BAAW,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO;QAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,OAAO;QAAE,IAAI,CAAC,cAAc,EAAE,CAAC;IACxC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,oBAAoB;AACpB,SAAgB,cAAc,CAC5B,IAAiB,EACjB,UAAkC,EAAE;IAEpC,8BAA8B;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAA6C,EAAE,CAAC;IAC7D,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,8BAA8B;QAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AAClG,CAAC"}