@fdm-monster/server 2.0.7 → 2.0.8
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/.yarn/install-state.gz +0 -0
- package/RELEASE_NOTES.MD +23 -0
- package/dist/controllers/print-job.controller.js +12 -151
- package/dist/controllers/print-job.controller.js.map +1 -1
- package/dist/controllers/print-queue.controller.js +82 -17
- package/dist/controllers/print-queue.controller.js.map +1 -1
- package/dist/controllers/printer-files.controller.js +8 -2
- package/dist/controllers/printer-files.controller.js.map +1 -1
- package/dist/controllers/printer.controller.js +3 -3
- package/dist/controllers/printer.controller.js.map +1 -1
- package/dist/entities/print-job.entity.js.map +1 -1
- package/dist/server.constants.js +1 -1
- package/dist/services/bambu/bambu-ftp.adapter.js +3 -13
- package/dist/services/bambu/bambu-ftp.adapter.js.map +1 -1
- package/dist/services/bambu.api.js +7 -18
- package/dist/services/bambu.api.js.map +1 -1
- package/dist/services/file-storage.service.js +11 -2
- package/dist/services/file-storage.service.js.map +1 -1
- package/dist/services/moonraker/moonraker.client.js +5 -17
- package/dist/services/moonraker/moonraker.client.js.map +1 -1
- package/dist/services/moonraker.api.js +3 -2
- package/dist/services/moonraker.api.js.map +1 -1
- package/dist/services/octoprint/octoprint.client.js +5 -17
- package/dist/services/octoprint/octoprint.client.js.map +1 -1
- package/dist/services/octoprint.api.js +3 -2
- package/dist/services/octoprint.api.js.map +1 -1
- package/dist/services/orm/print-job.service.js +55 -47
- package/dist/services/orm/print-job.service.js.map +1 -1
- package/dist/services/print-queue.service.js +90 -30
- package/dist/services/print-queue.service.js.map +1 -1
- package/dist/services/printer-api.interface.js +13 -0
- package/dist/services/printer-api.interface.js.map +1 -1
- package/dist/services/prusa-link/prusa-link.api.js +12 -22
- package/dist/services/prusa-link/prusa-link.api.js.map +1 -1
- package/dist/tasks/print-job-analysis.task.js.map +1 -1
- package/dist/utils/bgcode/bgcode-thumbnail.parser.js +50 -0
- package/dist/utils/bgcode/bgcode-thumbnail.parser.js.map +1 -0
- package/dist/utils/bgcode/bgcode.constants.js +57 -0
- package/dist/utils/bgcode/bgcode.constants.js.map +1 -0
- package/dist/utils/bgcode/bgcode.types.js +132 -0
- package/dist/utils/bgcode/bgcode.types.js.map +1 -0
- package/dist/utils/bgcode/bgcode.utils.js +288 -0
- package/dist/utils/bgcode/bgcode.utils.js.map +1 -0
- package/dist/utils/bgcode/heatshrink-decoder.js +172 -0
- package/dist/utils/bgcode/heatshrink-decoder.js.map +1 -0
- package/dist/utils/bgcode/png-encoder.js +76 -0
- package/dist/utils/bgcode/png-encoder.js.map +1 -0
- package/dist/utils/bgcode/qoi-decoder.js +141 -0
- package/dist/utils/bgcode/qoi-decoder.js.map +1 -0
- package/dist/utils/image-dimensions.js +62 -0
- package/dist/utils/image-dimensions.js.map +1 -0
- package/dist/utils/job-stats.util.js +79 -0
- package/dist/utils/job-stats.util.js.map +1 -0
- package/dist/utils/parsers/3mf.parser.js +39 -9
- package/dist/utils/parsers/3mf.parser.js.map +1 -1
- package/dist/utils/parsers/bgcode.parser.js +125 -144
- package/dist/utils/parsers/bgcode.parser.js.map +1 -1
- package/dist/utils/parsers/gcode.parser.js +13 -2
- package/dist/utils/parsers/gcode.parser.js.map +1 -1
- package/dist/utils/parsers/parser.types.js +6 -0
- package/dist/utils/parsers/parser.types.js.map +1 -0
- package/dist/utils/thumbnail.util.js +24 -0
- package/dist/utils/thumbnail.util.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get decompressBlock () {
|
|
13
|
+
return decompressBlock;
|
|
14
|
+
},
|
|
15
|
+
get extractMetadataFromBlocks () {
|
|
16
|
+
return extractMetadataFromBlocks;
|
|
17
|
+
},
|
|
18
|
+
get getBlockData () {
|
|
19
|
+
return getBlockData;
|
|
20
|
+
},
|
|
21
|
+
get getBlockParsedParameters () {
|
|
22
|
+
return getBlockParsedParameters;
|
|
23
|
+
},
|
|
24
|
+
get parseBlockHeader () {
|
|
25
|
+
return parseBlockHeader;
|
|
26
|
+
},
|
|
27
|
+
get parseBlockHeaders () {
|
|
28
|
+
return parseBlockHeaders;
|
|
29
|
+
},
|
|
30
|
+
get parseBlockParameters () {
|
|
31
|
+
return parseBlockParameters;
|
|
32
|
+
},
|
|
33
|
+
get parseFileHeader () {
|
|
34
|
+
return parseFileHeader;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
const _bgcodeconstants = require("./bgcode.constants");
|
|
38
|
+
const _bgcodetypes = require("./bgcode.types");
|
|
39
|
+
const _nodezlib = require("node:zlib");
|
|
40
|
+
const _heatshrinkdecoder = require("./heatshrink-decoder");
|
|
41
|
+
async function parseFileHeader(fileHandle) {
|
|
42
|
+
const buffer = Buffer.alloc(_bgcodeconstants.BGCODE_HEADER_SIZE);
|
|
43
|
+
await fileHandle.read(buffer);
|
|
44
|
+
if (buffer.length < _bgcodeconstants.BGCODE_HEADER_SIZE) {
|
|
45
|
+
throw new Error("File too small to be a valid BGCode file");
|
|
46
|
+
}
|
|
47
|
+
const magic = buffer.toString("ascii", 0, 4);
|
|
48
|
+
if (magic !== _bgcodeconstants.BGCODE_HEADER_MARKER) {
|
|
49
|
+
throw new Error(`Invalid BGCode file: magic number not found (got "${magic}", expected ${_bgcodeconstants.BGCODE_HEADER_MARKER})`);
|
|
50
|
+
}
|
|
51
|
+
const version = buffer.readUInt32LE(4);
|
|
52
|
+
const checksumType = buffer.readUInt16LE(8);
|
|
53
|
+
return {
|
|
54
|
+
magic,
|
|
55
|
+
version,
|
|
56
|
+
checksumType
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async function parseBlockHeaders(fileHandle, fileSize, checksumType, skipGcode) {
|
|
60
|
+
let offset = _bgcodeconstants.BGCODE_HEADER_SIZE;
|
|
61
|
+
const blockHeaders = [];
|
|
62
|
+
let currentExpectedHeaderIndex = 0;
|
|
63
|
+
while(offset < fileSize){
|
|
64
|
+
const blockHeader = await parseBlockHeader(fileHandle, fileSize, offset, checksumType);
|
|
65
|
+
if (skipGcode && blockHeader.type == _bgcodetypes.BgCodeBlockTypes.GCode) {
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
const expectedType = _bgcodeconstants.BGCODE_EXPECTED_HEADERS[currentExpectedHeaderIndex];
|
|
69
|
+
if (blockHeader.type !== expectedType) {
|
|
70
|
+
const nextExpectedType = _bgcodeconstants.BGCODE_EXPECTED_HEADERS[currentExpectedHeaderIndex + 1];
|
|
71
|
+
if (blockHeader.type !== nextExpectedType) {
|
|
72
|
+
throw new Error(`Unexpected header header type ${blockHeader.type}, expected either ${expectedType} or next ${nextExpectedType}`);
|
|
73
|
+
}
|
|
74
|
+
currentExpectedHeaderIndex++;
|
|
75
|
+
}
|
|
76
|
+
if (Number.isNaN(blockHeader.blockSize)) {
|
|
77
|
+
throw new Error(`Unexpected blockHeader.blockSize ${blockHeader.blockSize}`);
|
|
78
|
+
}
|
|
79
|
+
offset += blockHeader.blockSize;
|
|
80
|
+
blockHeaders.push(blockHeader);
|
|
81
|
+
}
|
|
82
|
+
return blockHeaders;
|
|
83
|
+
}
|
|
84
|
+
async function parseBlockHeader(fileHandle, fileSize, blockStartOffset, checksumType) {
|
|
85
|
+
if (blockStartOffset + _bgcodeconstants.BGCODE_MAX_BLOCK_HEADER_SIZE > fileSize) {
|
|
86
|
+
throw new Error("Not enough data for block header");
|
|
87
|
+
}
|
|
88
|
+
const buffer = Buffer.alloc(_bgcodeconstants.BGCODE_MAX_BLOCK_HEADER_SIZE);
|
|
89
|
+
await fileHandle.read({
|
|
90
|
+
buffer,
|
|
91
|
+
offset: 0,
|
|
92
|
+
length: _bgcodeconstants.BGCODE_MAX_BLOCK_HEADER_SIZE,
|
|
93
|
+
position: blockStartOffset
|
|
94
|
+
});
|
|
95
|
+
const type = buffer.readUInt16LE(0);
|
|
96
|
+
if (type > _bgcodeconstants.BGCODE_MAX_BLOCK_TYPE) {
|
|
97
|
+
throw new Error(`Block header type ${type} exceeds ${_bgcodeconstants.BGCODE_MAX_BLOCK_TYPE}, cant parse block`);
|
|
98
|
+
}
|
|
99
|
+
const compression = buffer.readUInt16LE(2);
|
|
100
|
+
if (compression > _bgcodeconstants.BGCODE_MAX_COMPRESSION) {
|
|
101
|
+
throw new Error(`Block header compression ${compression} exceeds ${_bgcodeconstants.BGCODE_MAX_COMPRESSION}, cant parse block`);
|
|
102
|
+
}
|
|
103
|
+
const uncompressedSize = buffer.readUInt32LE(4);
|
|
104
|
+
if (uncompressedSize === 0) {
|
|
105
|
+
throw new Error(`Uncompressed Size is 0`);
|
|
106
|
+
}
|
|
107
|
+
let compressedSize = 0;
|
|
108
|
+
let headerSize = _bgcodeconstants.BGCODE_MIN_BLOCK_HEADER_SIZE;
|
|
109
|
+
if (compression > 0) {
|
|
110
|
+
compressedSize = buffer.readUInt32LE(8);
|
|
111
|
+
if (compressedSize === 0) {
|
|
112
|
+
throw new Error(`Compression is ${_bgcodetypes.BgCodeCompressionName[compression]} but compressed size is ${compressedSize}}`);
|
|
113
|
+
}
|
|
114
|
+
headerSize = _bgcodeconstants.BGCODE_MAX_BLOCK_HEADER_SIZE;
|
|
115
|
+
}
|
|
116
|
+
const checksumSize = calculateChecksumSize(checksumType);
|
|
117
|
+
const blockSize = calculateBlockSize(checksumSize, type, compression, uncompressedSize, compressedSize);
|
|
118
|
+
const parameterOffset = blockStartOffset + headerSize;
|
|
119
|
+
const parametersSize = calculateParameterSize(type);
|
|
120
|
+
const parameterBuffer = await getBlockParsedParameters(fileHandle, parameterOffset, parametersSize);
|
|
121
|
+
const parameters = parseBlockParameters(type, parameterBuffer);
|
|
122
|
+
const dataOffset = parameterOffset + parametersSize;
|
|
123
|
+
const dataSize = blockSize - parametersSize - checksumSize;
|
|
124
|
+
const checksumOffset = dataOffset + dataSize;
|
|
125
|
+
return {
|
|
126
|
+
type,
|
|
127
|
+
compression,
|
|
128
|
+
uncompressedSize,
|
|
129
|
+
compressedSize,
|
|
130
|
+
blockSize,
|
|
131
|
+
blockStartOffset,
|
|
132
|
+
headerSize,
|
|
133
|
+
parameterOffset,
|
|
134
|
+
parameters,
|
|
135
|
+
parametersSize,
|
|
136
|
+
dataOffset,
|
|
137
|
+
dataSize,
|
|
138
|
+
checksumOffset,
|
|
139
|
+
checksumSize,
|
|
140
|
+
checksumType
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
async function getBlockParsedParameters(fileHandle, parameterOffset, parametersSize) {
|
|
144
|
+
const parameters = Buffer.alloc(parametersSize);
|
|
145
|
+
if (parametersSize > 0) {
|
|
146
|
+
await fileHandle.read({
|
|
147
|
+
buffer: parameters,
|
|
148
|
+
offset: 0,
|
|
149
|
+
length: parametersSize,
|
|
150
|
+
position: parameterOffset
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return parameters;
|
|
154
|
+
}
|
|
155
|
+
async function getBlockData(fileHandle, blockHeader) {
|
|
156
|
+
if (blockHeader.blockSize === 0) {
|
|
157
|
+
throw new Error("Cant get block data for block with size 0");
|
|
158
|
+
}
|
|
159
|
+
if (blockHeader.blockSize === 1E3) {
|
|
160
|
+
throw new Error(`Cant get block data for block with size ${blockHeader.blockSize} > ${1E3}`);
|
|
161
|
+
}
|
|
162
|
+
const data = Buffer.alloc(blockHeader.dataSize);
|
|
163
|
+
await fileHandle.read({
|
|
164
|
+
buffer: data,
|
|
165
|
+
offset: 0,
|
|
166
|
+
length: blockHeader.dataSize,
|
|
167
|
+
position: blockHeader.dataOffset
|
|
168
|
+
});
|
|
169
|
+
return data;
|
|
170
|
+
}
|
|
171
|
+
function decompressBlock(compression, data) {
|
|
172
|
+
const info = _bgcodetypes.BgCodeCompressionInfo[compression];
|
|
173
|
+
switch(info.kind){
|
|
174
|
+
case "none":
|
|
175
|
+
return data;
|
|
176
|
+
case "deflate":
|
|
177
|
+
return (0, _nodezlib.inflateSync)(data);
|
|
178
|
+
case "heatshrink":
|
|
179
|
+
const decoder = new _heatshrinkdecoder.HeatshrinkDecoder(info.window, info.lookahead);
|
|
180
|
+
return decoder.decompress(data);
|
|
181
|
+
default:
|
|
182
|
+
throw new Error(`Unknown compression type: ${compression}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function parseBlockParameters(blockType, parameters) {
|
|
186
|
+
const parameterSize = _bgcodetypes.BgCodeBlockParameterSizes[blockType];
|
|
187
|
+
if (parameters.length !== parameterSize) {
|
|
188
|
+
throw new Error(`Block Parameters should be exactly ${parameterSize} bytes long`);
|
|
189
|
+
}
|
|
190
|
+
if (blockType === _bgcodetypes.BgCodeBlockTypes.Thumbnail) {
|
|
191
|
+
return {
|
|
192
|
+
format: calculateThumbnailFormat(parameters.readUInt16LE(0)),
|
|
193
|
+
width: parameters.readUInt16LE(2),
|
|
194
|
+
height: parameters.readUInt16LE(4)
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
encoding: parameters.readUInt16LE(0)
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function calculateBlockSize(checksumSize, blockType, compression, uncompressedSize, compressedSize) {
|
|
202
|
+
const headerSize = compression > 0 ? 12 : 8;
|
|
203
|
+
const dataSize = compression === 0 ? uncompressedSize : compressedSize;
|
|
204
|
+
const parametersSize = blockType === _bgcodetypes.BgCodeBlockTypes.Thumbnail ? 6 : 2;
|
|
205
|
+
return headerSize + parametersSize + dataSize + checksumSize;
|
|
206
|
+
}
|
|
207
|
+
function calculateChecksumSize(checksumType) {
|
|
208
|
+
if (checksumType > _bgcodeconstants.BGCODE_MAX_CHECKSUM_TYPE) {
|
|
209
|
+
throw new Error(`Checksum type ${checksumType} exceeds max ${_bgcodeconstants.BGCODE_MAX_CHECKSUM_TYPE}`);
|
|
210
|
+
}
|
|
211
|
+
return _bgcodetypes.BgCodeChecksumTypeSize[checksumType];
|
|
212
|
+
}
|
|
213
|
+
function calculateParameterSize(blockType) {
|
|
214
|
+
if (blockType > _bgcodeconstants.BGCODE_MAX_BLOCK_TYPE) {
|
|
215
|
+
throw new Error(`Checksum type ${blockType} exceeds max ${_bgcodeconstants.BGCODE_MAX_BLOCK_TYPE}`);
|
|
216
|
+
}
|
|
217
|
+
return _bgcodetypes.BgCodeBlockParameterSizes[blockType];
|
|
218
|
+
}
|
|
219
|
+
function calculateThumbnailFormat(formatParameter) {
|
|
220
|
+
if (formatParameter > _bgcodeconstants.BGCODE_PARAMETER_THUMBNAIL_MAX_FORMAT) {
|
|
221
|
+
throw new Error(`Thumbnail format type ${formatParameter} exceeds max ${_bgcodeconstants.BGCODE_PARAMETER_THUMBNAIL_MAX_FORMAT}`);
|
|
222
|
+
}
|
|
223
|
+
return formatParameter;
|
|
224
|
+
}
|
|
225
|
+
async function extractMetadataFromBlocks(fileHandle, blockHeaders) {
|
|
226
|
+
const metadata = {};
|
|
227
|
+
const metadataBlocks = blockHeaders.filter((b)=>b.type === _bgcodetypes.BgCodeBlockTypes.FileMetadata || b.type === _bgcodetypes.BgCodeBlockTypes.SlicerMetadata || b.type === _bgcodetypes.BgCodeBlockTypes.PrinterMetadata || b.type === _bgcodetypes.BgCodeBlockTypes.PrintMetadata);
|
|
228
|
+
for (const header of metadataBlocks){
|
|
229
|
+
const blockData = await getBlockData(fileHandle, header);
|
|
230
|
+
const data = decompressBlock(header.compression, blockData);
|
|
231
|
+
const text = data.toString("utf8");
|
|
232
|
+
extractMetadataFromText(text, metadata);
|
|
233
|
+
}
|
|
234
|
+
return metadata;
|
|
235
|
+
}
|
|
236
|
+
const METADATA_KEY_NORMALIZATION = {
|
|
237
|
+
'producer': 'producer',
|
|
238
|
+
'produced on': 'produced_on',
|
|
239
|
+
'print time': 'print_time',
|
|
240
|
+
'estimated printing time (silent mode)': 'estimated_printing_time_silent_mode',
|
|
241
|
+
'estimated printing time (normal mode)': 'estimated_printing_time_normal_mode',
|
|
242
|
+
'layer height': 'layer_height',
|
|
243
|
+
'first layer height': 'first_layer_height',
|
|
244
|
+
'initial layer height': 'initial_layer_height',
|
|
245
|
+
'nozzle diameter': 'nozzle_diameter',
|
|
246
|
+
'filament diameter': 'filament_diameter',
|
|
247
|
+
'filament density': 'filament_density',
|
|
248
|
+
'filament used [mm]': 'filament_used_mm',
|
|
249
|
+
'filament used [cm3]': 'filament_used_cm3',
|
|
250
|
+
'filament used [g]': 'filament_used_g',
|
|
251
|
+
'bed temperature': 'bed_temperature',
|
|
252
|
+
'temperature': 'temperature',
|
|
253
|
+
'fill density': 'fill_density',
|
|
254
|
+
'filament type': 'filament_type',
|
|
255
|
+
'printer model': 'printer_model',
|
|
256
|
+
'max layer z': 'max_layer_z',
|
|
257
|
+
'total layers': 'total_layers',
|
|
258
|
+
'layer count': 'layer_count'
|
|
259
|
+
};
|
|
260
|
+
function extractMetadataFromText(text, metadata) {
|
|
261
|
+
const lines = text.split('\n');
|
|
262
|
+
for (const line of lines){
|
|
263
|
+
const keyValuePair = parseMetadataLine(line);
|
|
264
|
+
if (!keyValuePair) {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
const { key, value } = keyValuePair;
|
|
268
|
+
metadata[key] = value;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
function parseMetadataLine(line) {
|
|
272
|
+
const equalIndex = line.indexOf('=');
|
|
273
|
+
if (equalIndex === -1) {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
const rawKey = line.substring(0, equalIndex).trim().toLowerCase();
|
|
277
|
+
const value = line.substring(equalIndex + 1).trim();
|
|
278
|
+
if (!rawKey || !value) {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
const normalizedKey = METADATA_KEY_NORMALIZATION[rawKey] || rawKey.replace(/\s+/g, '_');
|
|
282
|
+
return {
|
|
283
|
+
key: normalizedKey,
|
|
284
|
+
value
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
//# sourceMappingURL=bgcode.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/bgcode/bgcode.utils.ts"],"names":["decompressBlock","extractMetadataFromBlocks","getBlockData","getBlockParsedParameters","parseBlockHeader","parseBlockHeaders","parseBlockParameters","parseFileHeader","fileHandle","buffer","Buffer","alloc","BGCODE_HEADER_SIZE","read","length","Error","magic","toString","BGCODE_HEADER_MARKER","version","readUInt32LE","checksumType","readUInt16LE","fileSize","skipGcode","offset","blockHeaders","currentExpectedHeaderIndex","blockHeader","type","BgCodeBlockTypes","GCode","expectedType","BGCODE_EXPECTED_HEADERS","nextExpectedType","Number","isNaN","blockSize","push","blockStartOffset","BGCODE_MAX_BLOCK_HEADER_SIZE","position","BGCODE_MAX_BLOCK_TYPE","compression","BGCODE_MAX_COMPRESSION","uncompressedSize","compressedSize","headerSize","BGCODE_MIN_BLOCK_HEADER_SIZE","BgCodeCompressionName","checksumSize","calculateChecksumSize","calculateBlockSize","parameterOffset","parametersSize","calculateParameterSize","parameterBuffer","parameters","dataOffset","dataSize","checksumOffset","data","info","BgCodeCompressionInfo","kind","inflateSync","decoder","HeatshrinkDecoder","window","lookahead","decompress","blockType","parameterSize","BgCodeBlockParameterSizes","Thumbnail","format","calculateThumbnailFormat","width","height","encoding","BGCODE_MAX_CHECKSUM_TYPE","BgCodeChecksumTypeSize","formatParameter","BGCODE_PARAMETER_THUMBNAIL_MAX_FORMAT","metadata","metadataBlocks","filter","b","FileMetadata","SlicerMetadata","PrinterMetadata","PrintMetadata","header","blockData","text","extractMetadataFromText","METADATA_KEY_NORMALIZATION","lines","split","line","keyValuePair","parseMetadataLine","key","value","equalIndex","indexOf","rawKey","substring","trim","toLowerCase","normalizedKey","replace"],"mappings":"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"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "HeatshrinkDecoder", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return HeatshrinkDecoder;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
var HSState = /*#__PURE__*/ function(HSState) {
|
|
12
|
+
HSState[HSState["TAG_BIT"] = 0] = "TAG_BIT";
|
|
13
|
+
HSState[HSState["YIELD_LITERAL"] = 1] = "YIELD_LITERAL";
|
|
14
|
+
HSState[HSState["BACKREF_INDEX_MSB"] = 2] = "BACKREF_INDEX_MSB";
|
|
15
|
+
HSState[HSState["BACKREF_INDEX_LSB"] = 3] = "BACKREF_INDEX_LSB";
|
|
16
|
+
HSState[HSState["BACKREF_COUNT_MSB"] = 4] = "BACKREF_COUNT_MSB";
|
|
17
|
+
HSState[HSState["BACKREF_COUNT_LSB"] = 5] = "BACKREF_COUNT_LSB";
|
|
18
|
+
HSState[HSState["YIELD_BACKREF"] = 6] = "YIELD_BACKREF";
|
|
19
|
+
return HSState;
|
|
20
|
+
}(HSState || {});
|
|
21
|
+
class HeatshrinkDecoder {
|
|
22
|
+
windowBits;
|
|
23
|
+
lookaheadBits;
|
|
24
|
+
windowSize;
|
|
25
|
+
window;
|
|
26
|
+
head = 0;
|
|
27
|
+
state = 0;
|
|
28
|
+
outputIndex = 0;
|
|
29
|
+
outputCount = 0;
|
|
30
|
+
inputBuffer;
|
|
31
|
+
inputIndex = 0;
|
|
32
|
+
bitAccumulator = 0;
|
|
33
|
+
bitsAvailable = 0;
|
|
34
|
+
constructor(windowBits, lookaheadBits){
|
|
35
|
+
this.windowBits = windowBits;
|
|
36
|
+
this.lookaheadBits = lookaheadBits;
|
|
37
|
+
this.windowSize = 1 << windowBits;
|
|
38
|
+
this.window = Buffer.alloc(this.windowSize);
|
|
39
|
+
this.inputBuffer = Buffer.alloc(0);
|
|
40
|
+
}
|
|
41
|
+
decompress(input) {
|
|
42
|
+
this.inputBuffer = input;
|
|
43
|
+
this.inputIndex = 0;
|
|
44
|
+
this.bitAccumulator = 0;
|
|
45
|
+
this.bitsAvailable = 0;
|
|
46
|
+
this.head = 0;
|
|
47
|
+
this.state = 0;
|
|
48
|
+
const output = [];
|
|
49
|
+
while(this.inputIndex < this.inputBuffer.length || this.bitsAvailable > 0){
|
|
50
|
+
const result = this.step();
|
|
51
|
+
if (result === null) {
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
if (result >= 0) {
|
|
55
|
+
output.push(result);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return Buffer.from(output);
|
|
59
|
+
}
|
|
60
|
+
step() {
|
|
61
|
+
switch(this.state){
|
|
62
|
+
case 0:
|
|
63
|
+
return this.handleTagBit();
|
|
64
|
+
case 1:
|
|
65
|
+
return this.handleYieldLiteral();
|
|
66
|
+
case 2:
|
|
67
|
+
return this.handleBackrefIndexMSB();
|
|
68
|
+
case 3:
|
|
69
|
+
return this.handleBackrefIndexLSB();
|
|
70
|
+
case 4:
|
|
71
|
+
return this.handleBackrefCountMSB();
|
|
72
|
+
case 5:
|
|
73
|
+
return this.handleBackrefCountLSB();
|
|
74
|
+
case 6:
|
|
75
|
+
return this.handleYieldBackref();
|
|
76
|
+
default:
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
readBits(count) {
|
|
81
|
+
while(this.bitsAvailable < count && this.inputIndex < this.inputBuffer.length){
|
|
82
|
+
this.bitAccumulator = this.bitAccumulator << 8 | this.inputBuffer[this.inputIndex++];
|
|
83
|
+
this.bitsAvailable += 8;
|
|
84
|
+
}
|
|
85
|
+
if (this.bitsAvailable < count) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
this.bitsAvailable -= count;
|
|
89
|
+
const result = this.bitAccumulator >> this.bitsAvailable & (1 << count) - 1;
|
|
90
|
+
this.bitAccumulator &= (1 << this.bitsAvailable) - 1;
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
handleTagBit() {
|
|
94
|
+
const bit = this.readBits(1);
|
|
95
|
+
if (bit === null) return null;
|
|
96
|
+
if (bit === 1) {
|
|
97
|
+
this.state = 1;
|
|
98
|
+
} else {
|
|
99
|
+
if (this.windowBits > 8) {
|
|
100
|
+
this.state = 2;
|
|
101
|
+
} else {
|
|
102
|
+
this.outputIndex = 0;
|
|
103
|
+
this.state = 3;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return -1;
|
|
107
|
+
}
|
|
108
|
+
handleYieldLiteral() {
|
|
109
|
+
const byte = this.readBits(8);
|
|
110
|
+
if (byte === null) return null;
|
|
111
|
+
this.pushByte(byte);
|
|
112
|
+
this.state = 0;
|
|
113
|
+
return byte;
|
|
114
|
+
}
|
|
115
|
+
handleBackrefIndexMSB() {
|
|
116
|
+
const msb = this.readBits(this.windowBits - 8);
|
|
117
|
+
if (msb === null) return null;
|
|
118
|
+
this.outputIndex = msb << 8;
|
|
119
|
+
this.state = 3;
|
|
120
|
+
return -1;
|
|
121
|
+
}
|
|
122
|
+
handleBackrefIndexLSB() {
|
|
123
|
+
const bits = this.windowBits > 8 ? 8 : this.windowBits;
|
|
124
|
+
const lsb = this.readBits(bits);
|
|
125
|
+
if (lsb === null) return null;
|
|
126
|
+
this.outputIndex |= lsb;
|
|
127
|
+
this.outputCount = 0;
|
|
128
|
+
if (this.lookaheadBits > 8) {
|
|
129
|
+
this.state = 4;
|
|
130
|
+
} else {
|
|
131
|
+
this.state = 5;
|
|
132
|
+
}
|
|
133
|
+
return -1;
|
|
134
|
+
}
|
|
135
|
+
handleBackrefCountMSB() {
|
|
136
|
+
const msb = this.readBits(this.lookaheadBits - 8);
|
|
137
|
+
if (msb === null) return null;
|
|
138
|
+
this.outputCount = msb << 8;
|
|
139
|
+
this.state = 5;
|
|
140
|
+
return -1;
|
|
141
|
+
}
|
|
142
|
+
handleBackrefCountLSB() {
|
|
143
|
+
const bits = this.lookaheadBits > 8 ? 8 : this.lookaheadBits;
|
|
144
|
+
const lsb = this.readBits(bits);
|
|
145
|
+
if (lsb === null) return null;
|
|
146
|
+
this.outputCount |= lsb;
|
|
147
|
+
this.outputCount += 1;
|
|
148
|
+
this.outputIndex += 1;
|
|
149
|
+
this.state = 6;
|
|
150
|
+
return -1;
|
|
151
|
+
}
|
|
152
|
+
handleYieldBackref() {
|
|
153
|
+
if (this.outputCount === 0) {
|
|
154
|
+
this.state = 0;
|
|
155
|
+
return -1;
|
|
156
|
+
}
|
|
157
|
+
const pos = (this.head - this.outputIndex + this.windowSize) % this.windowSize;
|
|
158
|
+
const byte = this.window[pos];
|
|
159
|
+
this.pushByte(byte);
|
|
160
|
+
this.outputCount--;
|
|
161
|
+
if (this.outputCount === 0) {
|
|
162
|
+
this.state = 0;
|
|
163
|
+
}
|
|
164
|
+
return byte;
|
|
165
|
+
}
|
|
166
|
+
pushByte(byte) {
|
|
167
|
+
this.window[this.head] = byte;
|
|
168
|
+
this.head = (this.head + 1) % this.windowSize;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
//# sourceMappingURL=heatshrink-decoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/bgcode/heatshrink-decoder.ts"],"names":["HeatshrinkDecoder","HSState","windowBits","lookaheadBits","windowSize","window","head","state","outputIndex","outputCount","inputBuffer","inputIndex","bitAccumulator","bitsAvailable","Buffer","alloc","decompress","input","output","length","result","step","push","from","handleTagBit","handleYieldLiteral","handleBackrefIndexMSB","handleBackrefIndexLSB","handleBackrefCountMSB","handleBackrefCountLSB","handleYieldBackref","readBits","count","bit","byte","pushByte","msb","bits","lsb","pos"],"mappings":";;;;+BAgBaA;;;eAAAA;;;AAVb,IAAA,AAAKC,iCAAAA;;;;;;;;WAAAA;EAAAA;AAUE,MAAMD;IACME,WAAmB;IACnBC,cAAsB;IACtBC,WAAmB;IAEnBC,OAAe;IACxBC,OAAe,EAAE;IACjBC,UAAiC;IAEjCC,cAAsB,EAAE;IACxBC,cAAsB,EAAE;IAExBC,YAAoB;IACpBC,aAAqB,EAAE;IACvBC,iBAAyB,EAAE;IAC3BC,gBAAwB,EAAE;IAElC,YAAYX,UAAkB,EAAEC,aAAqB,CAAE;QACrD,IAAI,CAACD,UAAU,GAAGA;QAClB,IAAI,CAACC,aAAa,GAAGA;QACrB,IAAI,CAACC,UAAU,GAAG,KAAKF;QAEvB,IAAI,CAACG,MAAM,GAAGS,OAAOC,KAAK,CAAC,IAAI,CAACX,UAAU;QAC1C,IAAI,CAACM,WAAW,GAAGI,OAAOC,KAAK,CAAC;IAClC;IAEAC,WAAWC,KAAa,EAAU;QAChC,IAAI,CAACP,WAAW,GAAGO;QACnB,IAAI,CAACN,UAAU,GAAG;QAClB,IAAI,CAACC,cAAc,GAAG;QACtB,IAAI,CAACC,aAAa,GAAG;QACrB,IAAI,CAACP,IAAI,GAAG;QACZ,IAAI,CAACC,KAAK;QAEV,MAAMW,SAAmB,EAAE;QAE3B,MAAO,IAAI,CAACP,UAAU,GAAG,IAAI,CAACD,WAAW,CAACS,MAAM,IAAI,IAAI,CAACN,aAAa,GAAG,EAAG;YAC1E,MAAMO,SAAS,IAAI,CAACC,IAAI;YACxB,IAAID,WAAW,MAAM;gBACnB;YACF;YACA,IAAIA,UAAU,GAAG;gBACfF,OAAOI,IAAI,CAACF;YACd;QACF;QAEA,OAAON,OAAOS,IAAI,CAACL;IACrB;IAEQG,OAAsB;QAC5B,OAAQ,IAAI,CAACd,KAAK;YAChB;gBACE,OAAO,IAAI,CAACiB,YAAY;YAC1B;gBACE,OAAO,IAAI,CAACC,kBAAkB;YAChC;gBACE,OAAO,IAAI,CAACC,qBAAqB;YACnC;gBACE,OAAO,IAAI,CAACC,qBAAqB;YACnC;gBACE,OAAO,IAAI,CAACC,qBAAqB;YACnC;gBACE,OAAO,IAAI,CAACC,qBAAqB;YACnC;gBACE,OAAO,IAAI,CAACC,kBAAkB;YAChC;gBACE,OAAO;QACX;IACF;IAEQC,SAASC,KAAa,EAAiB;QAE7C,MAAO,IAAI,CAACnB,aAAa,GAAGmB,SAAS,IAAI,CAACrB,UAAU,GAAG,IAAI,CAACD,WAAW,CAACS,MAAM,CAAE;YAC9E,IAAI,CAACP,cAAc,GAAG,AAAC,IAAI,CAACA,cAAc,IAAI,IAAK,IAAI,CAACF,WAAW,CAAC,IAAI,CAACC,UAAU,GAAG;YACtF,IAAI,CAACE,aAAa,IAAI;QACxB;QAEA,IAAI,IAAI,CAACA,aAAa,GAAGmB,OAAO;YAC9B,OAAO;QACT;QAGA,IAAI,CAACnB,aAAa,IAAImB;QACtB,MAAMZ,SAAS,AAAC,IAAI,CAACR,cAAc,IAAI,IAAI,CAACC,aAAa,GAAK,AAAC,CAAA,KAAKmB,KAAI,IAAK;QAC7E,IAAI,CAACpB,cAAc,IAAI,AAAC,CAAA,KAAK,IAAI,CAACC,aAAa,AAAD,IAAK;QAEnD,OAAOO;IACT;IAEQI,eAA8B;QACpC,MAAMS,MAAM,IAAI,CAACF,QAAQ,CAAC;QAC1B,IAAIE,QAAQ,MAAM,OAAO;QAEzB,IAAIA,QAAQ,GAAG;YAEb,IAAI,CAAC1B,KAAK;QACZ,OAAO;YAEL,IAAI,IAAI,CAACL,UAAU,GAAG,GAAG;gBACvB,IAAI,CAACK,KAAK;YACZ,OAAO;gBACL,IAAI,CAACC,WAAW,GAAG;gBACnB,IAAI,CAACD,KAAK;YACZ;QACF;QACA,OAAO,CAAC;IACV;IAEQkB,qBAAoC;QAC1C,MAAMS,OAAO,IAAI,CAACH,QAAQ,CAAC;QAC3B,IAAIG,SAAS,MAAM,OAAO;QAE1B,IAAI,CAACC,QAAQ,CAACD;QACd,IAAI,CAAC3B,KAAK;QACV,OAAO2B;IACT;IAEQR,wBAAuC;QAC7C,MAAMU,MAAM,IAAI,CAACL,QAAQ,CAAC,IAAI,CAAC7B,UAAU,GAAG;QAC5C,IAAIkC,QAAQ,MAAM,OAAO;QAEzB,IAAI,CAAC5B,WAAW,GAAG4B,OAAO;QAC1B,IAAI,CAAC7B,KAAK;QACV,OAAO,CAAC;IACV;IAEQoB,wBAAuC;QAC7C,MAAMU,OAAO,IAAI,CAACnC,UAAU,GAAG,IAAI,IAAI,IAAI,CAACA,UAAU;QACtD,MAAMoC,MAAM,IAAI,CAACP,QAAQ,CAACM;QAC1B,IAAIC,QAAQ,MAAM,OAAO;QAEzB,IAAI,CAAC9B,WAAW,IAAI8B;QACpB,IAAI,CAAC7B,WAAW,GAAG;QAEnB,IAAI,IAAI,CAACN,aAAa,GAAG,GAAG;YAC1B,IAAI,CAACI,KAAK;QACZ,OAAO;YACL,IAAI,CAACA,KAAK;QACZ;QACA,OAAO,CAAC;IACV;IAEQqB,wBAAuC;QAC7C,MAAMQ,MAAM,IAAI,CAACL,QAAQ,CAAC,IAAI,CAAC5B,aAAa,GAAG;QAC/C,IAAIiC,QAAQ,MAAM,OAAO;QAEzB,IAAI,CAAC3B,WAAW,GAAG2B,OAAO;QAC1B,IAAI,CAAC7B,KAAK;QACV,OAAO,CAAC;IACV;IAEQsB,wBAAuC;QAC7C,MAAMQ,OAAO,IAAI,CAAClC,aAAa,GAAG,IAAI,IAAI,IAAI,CAACA,aAAa;QAC5D,MAAMmC,MAAM,IAAI,CAACP,QAAQ,CAACM;QAC1B,IAAIC,QAAQ,MAAM,OAAO;QAEzB,IAAI,CAAC7B,WAAW,IAAI6B;QACpB,IAAI,CAAC7B,WAAW,IAAI;QACpB,IAAI,CAACD,WAAW,IAAI;QAEpB,IAAI,CAACD,KAAK;QACV,OAAO,CAAC;IACV;IAEQuB,qBAAoC;QAC1C,IAAI,IAAI,CAACrB,WAAW,KAAK,GAAG;YAC1B,IAAI,CAACF,KAAK;YACV,OAAO,CAAC;QACV;QAGA,MAAMgC,MAAM,AAAC,CAAA,IAAI,CAACjC,IAAI,GAAG,IAAI,CAACE,WAAW,GAAG,IAAI,CAACJ,UAAU,AAAD,IAAK,IAAI,CAACA,UAAU;QAC9E,MAAM8B,OAAO,IAAI,CAAC7B,MAAM,CAACkC,IAAI;QAE7B,IAAI,CAACJ,QAAQ,CAACD;QACd,IAAI,CAACzB,WAAW;QAEhB,IAAI,IAAI,CAACA,WAAW,KAAK,GAAG;YAC1B,IAAI,CAACF,KAAK;QACZ;QAEA,OAAO2B;IACT;IAEQC,SAASD,IAAY,EAAQ;QACnC,IAAI,CAAC7B,MAAM,CAAC,IAAI,CAACC,IAAI,CAAC,GAAG4B;QACzB,IAAI,CAAC5B,IAAI,GAAG,AAAC,CAAA,IAAI,CAACA,IAAI,GAAG,CAAA,IAAK,IAAI,CAACF,UAAU;IAC/C;AACF"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "encodePNG", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return encodePNG;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _nodezlib = require("node:zlib");
|
|
12
|
+
const PNG_SIGNATURE = Buffer.from([
|
|
13
|
+
0x89,
|
|
14
|
+
0x50,
|
|
15
|
+
0x4E,
|
|
16
|
+
0x47,
|
|
17
|
+
0x0D,
|
|
18
|
+
0x0A,
|
|
19
|
+
0x1A,
|
|
20
|
+
0x0A
|
|
21
|
+
]);
|
|
22
|
+
function crc32(buffer) {
|
|
23
|
+
let crc = 0xffffffff;
|
|
24
|
+
for(let i = 0; i < buffer.length; i++){
|
|
25
|
+
crc ^= buffer[i];
|
|
26
|
+
for(let j = 0; j < 8; j++){
|
|
27
|
+
crc = crc >>> 1 ^ 0xedb88320 & -(crc & 1);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return (crc ^ 0xffffffff) >>> 0;
|
|
31
|
+
}
|
|
32
|
+
function writeChunk(type, data) {
|
|
33
|
+
const typeBuffer = Buffer.from(type, 'ascii');
|
|
34
|
+
const length = Buffer.alloc(4);
|
|
35
|
+
length.writeUInt32BE(data.length, 0);
|
|
36
|
+
const crcBuffer = Buffer.concat([
|
|
37
|
+
typeBuffer,
|
|
38
|
+
data
|
|
39
|
+
]);
|
|
40
|
+
const crc = Buffer.alloc(4);
|
|
41
|
+
crc.writeUInt32BE(crc32(crcBuffer), 0);
|
|
42
|
+
return Buffer.concat([
|
|
43
|
+
length,
|
|
44
|
+
typeBuffer,
|
|
45
|
+
data,
|
|
46
|
+
crc
|
|
47
|
+
]);
|
|
48
|
+
}
|
|
49
|
+
function encodePNG(width, height, rgba) {
|
|
50
|
+
const ihdr = Buffer.alloc(13);
|
|
51
|
+
ihdr.writeUInt32BE(width, 0);
|
|
52
|
+
ihdr.writeUInt32BE(height, 4);
|
|
53
|
+
ihdr.writeUInt8(8, 8);
|
|
54
|
+
ihdr.writeUInt8(6, 9);
|
|
55
|
+
ihdr.writeUInt8(0, 10);
|
|
56
|
+
ihdr.writeUInt8(0, 11);
|
|
57
|
+
ihdr.writeUInt8(0, 12);
|
|
58
|
+
const bytesPerPixel = 4;
|
|
59
|
+
const scanlineLength = width * bytesPerPixel;
|
|
60
|
+
const filteredData = Buffer.alloc(height * (scanlineLength + 1));
|
|
61
|
+
for(let y = 0; y < height; y++){
|
|
62
|
+
const scanlineOffset = y * (scanlineLength + 1);
|
|
63
|
+
filteredData[scanlineOffset] = 0;
|
|
64
|
+
rgba.copy(filteredData, scanlineOffset + 1, y * scanlineLength, (y + 1) * scanlineLength);
|
|
65
|
+
}
|
|
66
|
+
const compressed = (0, _nodezlib.deflateSync)(filteredData);
|
|
67
|
+
const chunks = [
|
|
68
|
+
PNG_SIGNATURE,
|
|
69
|
+
writeChunk('IHDR', ihdr),
|
|
70
|
+
writeChunk('IDAT', compressed),
|
|
71
|
+
writeChunk('IEND', Buffer.alloc(0))
|
|
72
|
+
];
|
|
73
|
+
return Buffer.concat(chunks);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=png-encoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/bgcode/png-encoder.ts"],"names":["encodePNG","PNG_SIGNATURE","Buffer","from","crc32","buffer","crc","i","length","j","writeChunk","type","data","typeBuffer","alloc","writeUInt32BE","crcBuffer","concat","width","height","rgba","ihdr","writeUInt8","bytesPerPixel","scanlineLength","filteredData","y","scanlineOffset","copy","compressed","deflateSync","chunks"],"mappings":";;;;+BAiCgBA;;;eAAAA;;;0BA5BY;AAE5B,MAAMC,gBAAgBC,OAAOC,IAAI,CAAC;IAAC;IAAM;IAAM;IAAM;IAAM;IAAM;IAAM;IAAM;CAAK;AAElF,SAASC,MAAMC,MAAc;IAE3B,IAAIC,MAAM;IACV,IAAK,IAAIC,IAAI,GAAGA,IAAIF,OAAOG,MAAM,EAAED,IAAK;QACtCD,OAAOD,MAAM,CAACE,EAAE;QAChB,IAAK,IAAIE,IAAI,GAAGA,IAAI,GAAGA,IAAK;YAC1BH,MAAM,AAACA,QAAQ,IAAM,aAAa,CAAEA,CAAAA,MAAM,CAAA;QAC5C;IACF;IACA,OAAO,AAACA,CAAAA,MAAM,UAAS,MAAO;AAChC;AAEA,SAASI,WAAWC,IAAY,EAAEC,IAAY;IAC5C,MAAMC,aAAaX,OAAOC,IAAI,CAACQ,MAAM;IACrC,MAAMH,SAASN,OAAOY,KAAK,CAAC;IAC5BN,OAAOO,aAAa,CAACH,KAAKJ,MAAM,EAAE;IAElC,MAAMQ,YAAYd,OAAOe,MAAM,CAAC;QAACJ;QAAYD;KAAK;IAClD,MAAMN,MAAMJ,OAAOY,KAAK,CAAC;IACzBR,IAAIS,aAAa,CAACX,MAAMY,YAAY;IAEpC,OAAOd,OAAOe,MAAM,CAAC;QAACT;QAAQK;QAAYD;QAAMN;KAAI;AACtD;AAEO,SAASN,UAAUkB,KAAa,EAAEC,MAAc,EAAEC,IAAY;IACnE,MAAMC,OAAOnB,OAAOY,KAAK,CAAC;IAC1BO,KAAKN,aAAa,CAACG,OAAO;IAC1BG,KAAKN,aAAa,CAACI,QAAQ;IAC3BE,KAAKC,UAAU,CAAC,GAAG;IACnBD,KAAKC,UAAU,CAAC,GAAG;IACnBD,KAAKC,UAAU,CAAC,GAAG;IACnBD,KAAKC,UAAU,CAAC,GAAG;IACnBD,KAAKC,UAAU,CAAC,GAAG;IAGnB,MAAMC,gBAAgB;IACtB,MAAMC,iBAAiBN,QAAQK;IAC/B,MAAME,eAAevB,OAAOY,KAAK,CAACK,SAAUK,CAAAA,iBAAiB,CAAA;IAE7D,IAAK,IAAIE,IAAI,GAAGA,IAAIP,QAAQO,IAAK;QAC/B,MAAMC,iBAAiBD,IAAKF,CAAAA,iBAAiB,CAAA;QAC7CC,YAAY,CAACE,eAAe,GAAG;QAC/BP,KAAKQ,IAAI,CAACH,cAAcE,iBAAiB,GAAGD,IAAIF,gBAAgB,AAACE,CAAAA,IAAI,CAAA,IAAKF;IAC5E;IAGA,MAAMK,aAAaC,IAAAA,qBAAW,EAACL;IAG/B,MAAMM,SAAS;QACb9B;QACAS,WAAW,QAAQW;QACnBX,WAAW,QAAQmB;QACnBnB,WAAW,QAAQR,OAAOY,KAAK,CAAC;KACjC;IAED,OAAOZ,OAAOe,MAAM,CAACc;AACvB"}
|