living-documentation 3.4.0 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/frontend/admin.html +10 -0
- package/dist/src/frontend/diagram.html +102 -15
- package/dist/src/lib/config.d.ts +1 -0
- package/dist/src/lib/config.d.ts.map +1 -1
- package/dist/src/lib/config.js +1 -0
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/routes/config.d.ts.map +1 -1
- package/dist/src/routes/config.js +1 -0
- package/dist/src/routes/config.js.map +1 -1
- package/package.json +1 -1
|
@@ -146,6 +146,14 @@
|
|
|
146
146
|
</select>
|
|
147
147
|
<p class="text-xs text-gray-400 dark:text-gray-500">Users can always override with the toggle button.</p>
|
|
148
148
|
</div>
|
|
149
|
+
<div class="px-5 py-4">
|
|
150
|
+
<label class="flex items-center gap-3 cursor-pointer">
|
|
151
|
+
<input id="field-debug" name="showDiagramDebug" type="checkbox"
|
|
152
|
+
class="w-4 h-4 rounded border-gray-300 dark:border-gray-600 text-blue-600 focus:ring-blue-500" />
|
|
153
|
+
<span class="text-sm font-medium text-gray-700 dark:text-gray-300">Show debug button in diagram editor</span>
|
|
154
|
+
</label>
|
|
155
|
+
<p class="mt-1 text-xs text-gray-400 dark:text-gray-500 ml-7">Displays a Debug button that overlays raw position and size info on each node — useful for diagnosing snap-to-grid issues.</p>
|
|
156
|
+
</div>
|
|
149
157
|
<div class="px-5 py-4 space-y-1.5">
|
|
150
158
|
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300" for="field-pattern">Filename Pattern</label>
|
|
151
159
|
<input id="field-pattern" name="filenamePattern" type="text"
|
|
@@ -211,6 +219,7 @@
|
|
|
211
219
|
document.getElementById("field-theme").value = cfg.theme || "system";
|
|
212
220
|
document.getElementById("field-pattern").value =
|
|
213
221
|
cfg.filenamePattern || "";
|
|
222
|
+
document.getElementById("field-debug").checked = !!cfg.showDiagramDebug;
|
|
214
223
|
updatePreview(cfg.filenamePattern);
|
|
215
224
|
initExtraFiles(cfg);
|
|
216
225
|
} catch {
|
|
@@ -236,6 +245,7 @@
|
|
|
236
245
|
title: document.getElementById("field-title").value.trim(),
|
|
237
246
|
theme: document.getElementById("field-theme").value,
|
|
238
247
|
filenamePattern,
|
|
248
|
+
showDiagramDebug: document.getElementById("field-debug").checked,
|
|
239
249
|
};
|
|
240
250
|
|
|
241
251
|
try {
|
|
@@ -52,6 +52,21 @@
|
|
|
52
52
|
.dark #labelInput { background: rgba(17,24,39,.95); color: #f3f4f6; }
|
|
53
53
|
#labelInput.hidden { display: none; }
|
|
54
54
|
|
|
55
|
+
/* Debug overlay layer */
|
|
56
|
+
#debugLayer {
|
|
57
|
+
position: absolute; inset: 0;
|
|
58
|
+
pointer-events: none; z-index: 12; overflow: hidden;
|
|
59
|
+
}
|
|
60
|
+
.debug-box {
|
|
61
|
+
position: absolute; pointer-events: auto;
|
|
62
|
+
font: 10px/1.4 monospace; white-space: pre;
|
|
63
|
+
user-select: text; cursor: text;
|
|
64
|
+
padding: 3px 6px;
|
|
65
|
+
border: 1px solid #f97316; border-radius: 3px;
|
|
66
|
+
color: #c2410c; background: rgba(255,255,255,0.9);
|
|
67
|
+
}
|
|
68
|
+
.dark .debug-box { color: #fbbf24; background: rgba(0,0,0,0.78); }
|
|
69
|
+
|
|
55
70
|
/* Resize / selection overlay */
|
|
56
71
|
#selectionOverlay {
|
|
57
72
|
position: absolute; display: none;
|
|
@@ -150,6 +165,9 @@
|
|
|
150
165
|
<button onclick="toggleDark()" class="tool-btn"><span id="darkIcon">☽</span></button>
|
|
151
166
|
<div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div>
|
|
152
167
|
|
|
168
|
+
<button id="btnDebug" onclick="toggleDebug()" class="hidden tool-btn text-xs font-mono" title="Debug overlay">dbg</button>
|
|
169
|
+
<div id="sepDebug" class="hidden w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div>
|
|
170
|
+
|
|
153
171
|
<button id="btnSave" onclick="saveDiagram()" disabled
|
|
154
172
|
class="px-3 py-1.5 text-xs font-semibold rounded-lg bg-blue-600 hover:bg-blue-700 text-white disabled:opacity-40 disabled:cursor-not-allowed shrink-0 transition-colors">
|
|
155
173
|
Enregistrer
|
|
@@ -175,6 +193,9 @@
|
|
|
175
193
|
|
|
176
194
|
<div id="vis-canvas" class="w-full h-full"></div>
|
|
177
195
|
|
|
196
|
+
<!-- Debug overlay layer -->
|
|
197
|
+
<div id="debugLayer"></div>
|
|
198
|
+
|
|
178
199
|
<!-- Selection / resize overlay -->
|
|
179
200
|
<div id="selectionOverlay">
|
|
180
201
|
<div id="rh-tl" class="resize-handle" style="top:-5px;left:-5px; cursor:nw-resize;"></div>
|
|
@@ -302,6 +323,7 @@
|
|
|
302
323
|
let selectedEdgeIds = [];
|
|
303
324
|
let physicsEnabled = true;
|
|
304
325
|
let gridEnabled = false;
|
|
326
|
+
let debugMode = false;
|
|
305
327
|
const GRID_SIZE = 40;
|
|
306
328
|
let isDirty = false;
|
|
307
329
|
let sidebarOpen = true;
|
|
@@ -498,6 +520,7 @@
|
|
|
498
520
|
network.on('dragEnd', onDragEnd);
|
|
499
521
|
network.on('beforeDrawing', drawGrid);
|
|
500
522
|
network.on('afterDrawing', updateSelectionOverlay);
|
|
523
|
+
network.on('afterDrawing', () => drawDebugOverlay());
|
|
501
524
|
|
|
502
525
|
document.getElementById('emptyState').classList.add('hidden');
|
|
503
526
|
updateZoomDisplay();
|
|
@@ -886,6 +909,58 @@
|
|
|
886
909
|
btn.title = physicsEnabled ? 'Auto-espacement actif' : 'Auto-espacement inactif';
|
|
887
910
|
}
|
|
888
911
|
|
|
912
|
+
// ── Debug overlay ─────────────────────────────────────────────────────────
|
|
913
|
+
function toggleDebug() {
|
|
914
|
+
debugMode = !debugMode;
|
|
915
|
+
document.getElementById('btnDebug').classList.toggle('tool-active', debugMode);
|
|
916
|
+
if (network) network.redraw();
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
function drawDebugOverlay() {
|
|
920
|
+
const layer = document.getElementById('debugLayer');
|
|
921
|
+
if (!debugMode || !network) { layer.innerHTML = ''; return; }
|
|
922
|
+
|
|
923
|
+
// Recycle existing boxes keyed by node id
|
|
924
|
+
const existing = new Map([...layer.querySelectorAll('.debug-box')].map(el => [el.dataset.nid, el]));
|
|
925
|
+
const seen = new Set();
|
|
926
|
+
|
|
927
|
+
for (const id of _canonicalOrder) {
|
|
928
|
+
const bodyNode = network.body.nodes[id];
|
|
929
|
+
if (!bodyNode) continue;
|
|
930
|
+
const w = bodyNode.shape.width || 0;
|
|
931
|
+
const h = bodyNode.shape.height || 0;
|
|
932
|
+
const cx = bodyNode.x;
|
|
933
|
+
const cy = bodyNode.y;
|
|
934
|
+
const L = cx - w / 2;
|
|
935
|
+
const T = cy - h / 2;
|
|
936
|
+
|
|
937
|
+
// DOM position: right edge of the node + offset
|
|
938
|
+
const dom = network.canvasToDOM({ x: cx + w / 2 + 8, y: cy - h / 2 });
|
|
939
|
+
|
|
940
|
+
const text = [
|
|
941
|
+
`id : ${id}`,
|
|
942
|
+
`cx=${Math.round(cx)} cy=${Math.round(cy)}`,
|
|
943
|
+
`w =${Math.round(w)} h =${Math.round(h)}`,
|
|
944
|
+
`L =${Math.round(L)} T =${Math.round(T)}`,
|
|
945
|
+
].join('\n');
|
|
946
|
+
|
|
947
|
+
let box = existing.get(String(id));
|
|
948
|
+
if (!box) {
|
|
949
|
+
box = document.createElement('div');
|
|
950
|
+
box.className = 'debug-box';
|
|
951
|
+
box.dataset.nid = String(id);
|
|
952
|
+
layer.appendChild(box);
|
|
953
|
+
}
|
|
954
|
+
box.textContent = text;
|
|
955
|
+
box.style.left = Math.round(dom.x) + 'px';
|
|
956
|
+
box.style.top = Math.round(dom.y) + 'px';
|
|
957
|
+
seen.add(String(id));
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
// Remove boxes for deleted nodes
|
|
961
|
+
existing.forEach((el, nid) => { if (!seen.has(nid)) el.remove(); });
|
|
962
|
+
}
|
|
963
|
+
|
|
889
964
|
// ── Grid ─────────────────────────────────────────────────────────────────
|
|
890
965
|
function toggleGrid() {
|
|
891
966
|
gridEnabled = !gridEnabled;
|
|
@@ -904,17 +979,16 @@
|
|
|
904
979
|
const canvas = ctx.canvas;
|
|
905
980
|
const W = canvas.width, H = canvas.height;
|
|
906
981
|
|
|
907
|
-
//
|
|
908
|
-
|
|
982
|
+
// DPR: beforeDrawing ctx is in physical pixels (after setTransform(1,0,0,1,0,0))
|
|
983
|
+
// but center.x/y and scale are in vis.js CSS-pixel space → must multiply by DPR
|
|
984
|
+
const dpr = window.devicePixelRatio || 1;
|
|
985
|
+
const step = GRID_SIZE * scale * dpr;
|
|
909
986
|
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
const offsetX = ((W / 2 - center.x * scale) % step + step) % step;
|
|
913
|
-
const offsetY = ((H / 2 - center.y * scale) % step + step) % step;
|
|
987
|
+
const offsetX = ((W / 2 - center.x * scale * dpr) % step + step) % step;
|
|
988
|
+
const offsetY = ((H / 2 - center.y * scale * dpr) % step + step) % step;
|
|
914
989
|
|
|
915
990
|
ctx.save();
|
|
916
|
-
|
|
917
|
-
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
991
|
+
ctx.setTransform(1, 0, 0, 1, 0, 0); // physical pixel space
|
|
918
992
|
ctx.strokeStyle = color;
|
|
919
993
|
ctx.lineWidth = 1;
|
|
920
994
|
ctx.beginPath();
|
|
@@ -924,16 +998,20 @@
|
|
|
924
998
|
ctx.restore();
|
|
925
999
|
}
|
|
926
1000
|
|
|
927
|
-
function snapToGrid(v) {
|
|
928
|
-
return Math.round(v / GRID_SIZE) * GRID_SIZE;
|
|
929
|
-
}
|
|
930
|
-
|
|
931
1001
|
function onDragEnd(params) {
|
|
932
1002
|
if (gridEnabled && params.nodes && params.nodes.length > 0) {
|
|
933
|
-
const positions = network.getPositions(params.nodes);
|
|
934
1003
|
params.nodes.forEach(id => {
|
|
935
|
-
const
|
|
936
|
-
if (
|
|
1004
|
+
const bodyNode = network.body.nodes[id];
|
|
1005
|
+
if (!bodyNode) return;
|
|
1006
|
+
// shape.width/height are set by resize() during each draw — exact visual size
|
|
1007
|
+
const w = bodyNode.shape.width || 0;
|
|
1008
|
+
const h = bodyNode.shape.height || 0;
|
|
1009
|
+
const cx = bodyNode.x;
|
|
1010
|
+
const cy = bodyNode.y;
|
|
1011
|
+
// Snap the visual top-left corner (x - w/2, y - h/2) to grid lines
|
|
1012
|
+
const snappedLeft = Math.round((cx - w / 2) / GRID_SIZE) * GRID_SIZE;
|
|
1013
|
+
const snappedTop = Math.round((cy - h / 2) / GRID_SIZE) * GRID_SIZE;
|
|
1014
|
+
network.moveNode(id, snappedLeft + w / 2, snappedTop + h / 2);
|
|
937
1015
|
});
|
|
938
1016
|
}
|
|
939
1017
|
markDirty();
|
|
@@ -1177,6 +1255,15 @@
|
|
|
1177
1255
|
});
|
|
1178
1256
|
|
|
1179
1257
|
// ── Init ──────────────────────────────────────────────────────────────────
|
|
1258
|
+
(async () => {
|
|
1259
|
+
try {
|
|
1260
|
+
const cfg = await fetch('/api/config').then(r => r.json());
|
|
1261
|
+
if (cfg.showDiagramDebug) {
|
|
1262
|
+
document.getElementById('btnDebug').classList.remove('hidden');
|
|
1263
|
+
document.getElementById('sepDebug').classList.remove('hidden');
|
|
1264
|
+
}
|
|
1265
|
+
} catch { /* config non disponible — debug button reste caché */ }
|
|
1266
|
+
})();
|
|
1180
1267
|
loadDiagramList();
|
|
1181
1268
|
</script>
|
|
1182
1269
|
</body>
|
package/dist/src/lib/config.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export interface LivingDocConfig {
|
|
|
5
5
|
theme: 'light' | 'dark' | 'system';
|
|
6
6
|
port: number;
|
|
7
7
|
extraFiles: string[];
|
|
8
|
+
showDiagramDebug: boolean;
|
|
8
9
|
}
|
|
9
10
|
export declare function getConfigPath(docsPath: string): string;
|
|
10
11
|
export declare function readConfig(docsPath: string): LivingDocConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAcD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAY5D;AAED,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,GAC9B,eAAe,CAMjB"}
|
package/dist/src/lib/config.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":";;;;;AAyBA,sCAEC;AAED,gCAYC;AAED,kCASC;AApDD,4CAAoB;AACpB,gDAAwB;AAYxB,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAE3C,MAAM,QAAQ,GAAoB;IAChC,UAAU,EAAE,GAAG;IACf,eAAe,EAAE,6BAA6B;IAC9C,KAAK,EAAE,sBAAsB;IAC7B,KAAK,EAAE,QAAQ;IACf,IAAI,EAAE,IAAI;IACV,UAAU,EAAE,EAAE;IACd,gBAAgB,EAAE,KAAK;CACxB,CAAC;AAEF,SAAgB,aAAa,CAAC,QAAgB;IAC5C,OAAO,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AAC9C,CAAC;AAED,SAAgB,UAAU,CAAC,QAAgB;IACzC,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,IAAI,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B,CAAC;YAC3D,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;IACD,OAAO,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED,SAAgB,WAAW,CACzB,QAAgB,EAChB,KAA+B;IAE/B,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,OAAO,GAAoB,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;IAC1D,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACxE,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/routes/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAIpD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/routes/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAIpD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwDrD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/routes/config.ts"],"names":[],"mappings":";;;;;AAIA,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/routes/config.ts"],"names":[],"mappings":";;;;;AAIA,oCAwDC;AA5DD,qCAAoD;AACpD,gDAAwB;AACxB,0CAAyE;AAEzE,SAAgB,YAAY,CAAC,QAAgB;IAC3C,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;IAExB,kBAAkB;IAClB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QAC/C,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAClB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QAC9C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,GAAG,CAAC,IAAgC,CAAC;YACnD,6DAA6D;YAC7D,MAAM,OAAO,GAA8B;gBACzC,OAAO;gBACP,iBAAiB;gBACjB,OAAO;gBACP,kBAAkB;aACnB,CAAC;YACF,MAAM,IAAI,GAA6B,EAAE,CAAC;YAC1C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;oBAChB,IAAgC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;YACD,uDAAuD;YACvD,IAAI,iBAAiB,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;gBAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBAC7D,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACrC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC,CAAC;gBACpF,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sDAAsD,EAAE,CAAC,CAAC;gBACjG,CAAC;YACH,CAAC;YACD,sCAAsC;YACtC,IAAI,YAAY,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,UAAU,GAAI,KAAK,CAAC,UAAwB,CAAC,MAAM,CACtD,CAAC,CAAC,EAAe,EAAE,CACjB,OAAO,CAAC,KAAK,QAAQ;oBACrB,cAAI,CAAC,UAAU,CAAC,CAAC,CAAC;oBAClB,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAClC,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,GAAG,IAAA,oBAAW,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC5C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|