@arach/og 0.2.1 → 0.2.3
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/viewer.d.ts.map +1 -1
- package/dist/viewer.js +80 -18
- package/dist/viewer.js.map +1 -1
- package/package.json +1 -1
package/dist/viewer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../src/viewer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../src/viewer.ts"],"names":[],"mappings":"AAidA,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDzE"}
|
package/dist/viewer.js
CHANGED
|
@@ -11,6 +11,52 @@ const MIME_TYPES = {
|
|
|
11
11
|
'.svg': 'image/svg+xml',
|
|
12
12
|
'.json': 'application/json',
|
|
13
13
|
};
|
|
14
|
+
async function getImageDimensions(filePath) {
|
|
15
|
+
try {
|
|
16
|
+
const { createReadStream } = await import('node:fs');
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
const stream = createReadStream(filePath, { start: 0, end: 29 });
|
|
19
|
+
let data = Buffer.alloc(0);
|
|
20
|
+
stream.on('data', (chunk) => {
|
|
21
|
+
data = Buffer.concat([data, Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)]);
|
|
22
|
+
});
|
|
23
|
+
stream.on('end', () => {
|
|
24
|
+
// PNG: width at bytes 16-19, height at 20-23
|
|
25
|
+
if (data[0] === 0x89 && data[1] === 0x50 && data[2] === 0x4E && data[3] === 0x47) {
|
|
26
|
+
const width = data.readUInt32BE(16);
|
|
27
|
+
const height = data.readUInt32BE(20);
|
|
28
|
+
resolve({ width, height });
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// JPEG: Need to parse markers - just return null for now, we'll check by name
|
|
32
|
+
resolve(null);
|
|
33
|
+
});
|
|
34
|
+
stream.on('error', () => resolve(null));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function isLikelyOGImage(name, width, height) {
|
|
42
|
+
// Check filename first
|
|
43
|
+
const lowerName = name.toLowerCase();
|
|
44
|
+
if (lowerName.includes('og') || lowerName.includes('opengraph') || lowerName.includes('social')) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
// Check dimensions - OG images are typically 1200x630 (1.91:1 ratio)
|
|
48
|
+
if (width && height) {
|
|
49
|
+
const ratio = width / height;
|
|
50
|
+
// OG ratio is ~1.91, allow some variance (1.7 to 2.1)
|
|
51
|
+
const isOGRatio = ratio >= 1.7 && ratio <= 2.1;
|
|
52
|
+
// Also check if it's a reasonable OG size (at least 600px wide)
|
|
53
|
+
const isOGSize = width >= 600 && height >= 300;
|
|
54
|
+
if (isOGRatio && isOGSize) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
14
60
|
async function findOGImages(dir) {
|
|
15
61
|
const images = [];
|
|
16
62
|
async function scan(currentDir, depth = 0) {
|
|
@@ -29,19 +75,18 @@ async function findOGImages(dir) {
|
|
|
29
75
|
else if (entry.isFile()) {
|
|
30
76
|
const ext = extname(entry.name).toLowerCase();
|
|
31
77
|
if (['.png', '.jpg', '.jpeg'].includes(ext)) {
|
|
32
|
-
//
|
|
33
|
-
const
|
|
34
|
-
const isOG = name
|
|
35
|
-
currentDir.includes('public') ||
|
|
36
|
-
currentDir.includes('static') ||
|
|
37
|
-
currentDir.includes('assets');
|
|
78
|
+
// Get dimensions to check if it's an OG image
|
|
79
|
+
const dimensions = await getImageDimensions(fullPath);
|
|
80
|
+
const isOG = isLikelyOGImage(entry.name, dimensions?.width, dimensions?.height);
|
|
38
81
|
if (isOG) {
|
|
39
82
|
const stats = await stat(fullPath);
|
|
40
83
|
images.push({
|
|
41
84
|
path: fullPath,
|
|
42
85
|
name: entry.name,
|
|
43
86
|
size: stats.size,
|
|
44
|
-
url: `/image?path=${encodeURIComponent(fullPath)}
|
|
87
|
+
url: `/image?path=${encodeURIComponent(fullPath)}`,
|
|
88
|
+
width: dimensions?.width,
|
|
89
|
+
height: dimensions?.height
|
|
45
90
|
});
|
|
46
91
|
}
|
|
47
92
|
}
|
|
@@ -355,6 +400,7 @@ function generateHTML(images, dir) {
|
|
|
355
400
|
<div class="card-meta">
|
|
356
401
|
<div class="card-name">${img.name}</div>
|
|
357
402
|
<div class="card-details">
|
|
403
|
+
${img.width && img.height ? `<span>${img.width}x${img.height}</span>` : ''}
|
|
358
404
|
<span>${Math.round(img.size / 1024)}KB</span>
|
|
359
405
|
<span>${img.path.replace(dir, '.')}</span>
|
|
360
406
|
</div>
|
|
@@ -419,16 +465,32 @@ export async function startViewer(dir, port = 3333) {
|
|
|
419
465
|
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
420
466
|
res.end(html);
|
|
421
467
|
});
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
468
|
+
const tryListen = (currentPort) => {
|
|
469
|
+
server.once('error', (err) => {
|
|
470
|
+
if (err.code === 'EADDRINUSE' && currentPort < port + 10) {
|
|
471
|
+
tryListen(currentPort + 1);
|
|
472
|
+
}
|
|
473
|
+
else if (err.code === 'EADDRINUSE') {
|
|
474
|
+
console.error(`\n Could not find available port (tried ${port}-${currentPort})`);
|
|
475
|
+
process.exit(1);
|
|
476
|
+
}
|
|
477
|
+
else {
|
|
478
|
+
throw err;
|
|
479
|
+
}
|
|
480
|
+
});
|
|
481
|
+
server.listen(currentPort, () => {
|
|
482
|
+
console.log(`\n OG Viewer running at http://localhost:${currentPort}`);
|
|
483
|
+
console.log(` Scanning: ${dir}`);
|
|
484
|
+
console.log(` Found ${images.length} image${images.length !== 1 ? 's' : ''}\n`);
|
|
485
|
+
console.log(` Press Ctrl+C to stop\n`);
|
|
486
|
+
// Try to open in browser
|
|
487
|
+
import('node:child_process').then(m => {
|
|
488
|
+
const cmd = process.platform === 'darwin' ? 'open' :
|
|
489
|
+
process.platform === 'win32' ? 'start' : 'xdg-open';
|
|
490
|
+
m.exec(`${cmd} http://localhost:${currentPort}`);
|
|
491
|
+
});
|
|
492
|
+
});
|
|
493
|
+
};
|
|
494
|
+
tryListen(port);
|
|
433
495
|
}
|
|
434
496
|
//# sourceMappingURL=viewer.js.map
|
package/dist/viewer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewer.js","sourceRoot":"","sources":["../src/viewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAY,MAAM,WAAW,CAAA;AAEnD,MAAM,UAAU,GAA2B;IACzC,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,UAAU;IAClB,KAAK,EAAE,wBAAwB;IAC/B,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,kBAAkB;CAC5B,CAAA;
|
|
1
|
+
{"version":3,"file":"viewer.js","sourceRoot":"","sources":["../src/viewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAY,MAAM,WAAW,CAAA;AAEnD,MAAM,UAAU,GAA2B;IACzC,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,UAAU;IAClB,KAAK,EAAE,wBAAwB;IAC/B,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,kBAAkB;CAC5B,CAAA;AAWD,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IAChD,IAAI,CAAC;QACH,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAA;QAEpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAA;YAChE,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAE1B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC1B,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACnF,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACpB,6CAA6C;gBAC7C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBACjF,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;oBACnC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;oBACpC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;oBAC1B,OAAM;gBACR,CAAC;gBAED,8EAA8E;gBAC9E,OAAO,CAAC,IAAI,CAAC,CAAA;YACf,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,KAAc,EAAE,MAAe;IACpE,uBAAuB;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IACpC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChG,OAAO,IAAI,CAAA;IACb,CAAC;IAED,qEAAqE;IACrE,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAA;QAC5B,sDAAsD;QACtD,MAAM,SAAS,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,CAAA;QAC9C,gEAAgE;QAChE,MAAM,QAAQ,GAAG,KAAK,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,CAAA;QAE9C,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,MAAM,MAAM,GAAgB,EAAE,CAAA;IAE9B,KAAK,UAAU,IAAI,CAAC,UAAkB,EAAE,KAAK,GAAG,CAAC;QAC/C,IAAI,KAAK,GAAG,CAAC;YAAE,OAAM,CAAC,oBAAoB;QAE1C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;YAElE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;gBAE7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,oCAAoC;oBACpC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;wBAAE,SAAQ;oBACzE,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;gBACjC,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;oBAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;oBAC7C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC5C,8CAA8C;wBAC9C,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAA;wBACrD,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;wBAE/E,IAAI,IAAI,EAAE,CAAC;4BACT,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAA;4BAClC,MAAM,CAAC,IAAI,CAAC;gCACV,IAAI,EAAE,QAAQ;gCACd,IAAI,EAAE,KAAK,CAAC,IAAI;gCAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gCAChB,GAAG,EAAE,eAAe,kBAAkB,CAAC,QAAQ,CAAC,EAAE;gCAClD,KAAK,EAAE,UAAU,EAAE,KAAK;gCACxB,MAAM,EAAE,UAAU,EAAE,MAAM;6BAC3B,CAAC,CAAA;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,GAAG,CAAC,CAAA;IACf,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,YAAY,CAAC,MAAmB,EAAE,GAAW;IACpD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAgPiB,GAAG;;yBAEJ,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;;;IAGzE,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCAuCQ,GAAG;;;;GAIlC,CAAC,CAAC,CAAC;;MAEA,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;;;oBAGJ,GAAG,CAAC,GAAG,UAAU,GAAG,CAAC,IAAI;;;;mCAIV,GAAG,CAAC,IAAI;;cAE7B,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE;oBAClE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;;;;mDAIK,GAAG,CAAC,IAAI;;;;;;;;wBAQnC,GAAG,CAAC,GAAG;;;;wBAIP,GAAG,CAAC,GAAG;;;;wBAIP,GAAG,CAAC,GAAG;;;;;KAK1B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;GAEZ;;;;;;;;QAQK,CAAA;AACR,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,IAAI,GAAG,IAAI;IACxD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAA;IAEtC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAA;QAE/D,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAC9C,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAA;oBACtC,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAA;oBAC5C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,0BAA0B,EAAE,CAAC,CAAA;oBACrF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;oBACb,OAAM;gBACR,CAAC;gBAAC,MAAM,CAAC;oBACP,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;oBAClB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;oBACpB,OAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QACtC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAA;QACnD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,CAAC,WAAmB,EAAQ,EAAE;QAC9C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAClD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,WAAW,GAAG,IAAI,GAAG,EAAE,EAAE,CAAC;gBACzD,SAAS,CAAC,WAAW,GAAG,CAAC,CAAC,CAAA;YAC5B,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACrC,OAAO,CAAC,KAAK,CAAC,4CAA4C,IAAI,IAAI,WAAW,GAAG,CAAC,CAAA;gBACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,CAAA;YACX,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,6CAA6C,WAAW,EAAE,CAAC,CAAA;YACvE,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC,CAAA;YACjC,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YAChF,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;YAEvC,yBAAyB;YACzB,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBACpC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBACxC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAA;gBAC/D,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,qBAAqB,WAAW,EAAE,CAAC,CAAA;YAClD,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,SAAS,CAAC,IAAI,CAAC,CAAA;AACjB,CAAC"}
|