@haibun/web-playwright 1.43.0 → 1.44.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/build/BrowserFactory.d.ts +15 -27
- package/build/BrowserFactory.d.ts.map +1 -1
- package/build/BrowserFactory.js +71 -50
- package/build/BrowserFactory.js.map +1 -1
- package/build/PlaywrightEvents.d.ts +3 -3
- package/build/PlaywrightEvents.d.ts.map +1 -1
- package/build/PlaywrightEvents.js +17 -13
- package/build/PlaywrightEvents.js.map +1 -1
- package/build/monitor/XXlogToMonitor.d.ts +8 -0
- package/build/monitor/XXlogToMonitor.d.ts.map +1 -0
- package/build/monitor/XXlogToMonitor.js +151 -0
- package/build/monitor/XXlogToMonitor.js.map +1 -0
- package/build/monitor/controls.d.ts +3 -0
- package/build/monitor/controls.d.ts.map +1 -0
- package/build/monitor/controls.js +318 -0
- package/build/monitor/controls.js.map +1 -0
- package/build/monitor/disclosureJson.d.ts +3 -0
- package/build/monitor/disclosureJson.d.ts.map +1 -0
- package/build/monitor/disclosureJson.js +121 -0
- package/build/monitor/disclosureJson.js.map +1 -0
- package/build/monitor/mermaidDiagram.d.ts +22 -0
- package/build/monitor/mermaidDiagram.d.ts.map +1 -0
- package/build/monitor/mermaidDiagram.js +199 -0
- package/build/monitor/mermaidDiagram.js.map +1 -0
- package/build/monitor/messages.d.ts +18 -0
- package/build/monitor/messages.d.ts.map +1 -0
- package/build/monitor/messages.js +303 -0
- package/build/monitor/messages.js.map +1 -0
- package/build/monitor/monitor.d.ts +16 -0
- package/build/monitor/monitor.d.ts.map +1 -0
- package/build/monitor/monitor.js +61 -0
- package/build/monitor/monitor.js.map +1 -0
- package/build/monitor/monitorHandler.d.ts +12 -0
- package/build/monitor/monitorHandler.d.ts.map +1 -0
- package/build/monitor/monitorHandler.js +89 -0
- package/build/monitor/monitorHandler.js.map +1 -0
- package/build/rest-playwright.d.ts +60 -2
- package/build/rest-playwright.d.ts.map +1 -1
- package/build/rest-playwright.js +170 -51
- package/build/rest-playwright.js.map +1 -1
- package/build/web-playwright.d.ts +142 -54
- package/build/web-playwright.d.ts.map +1 -1
- package/build/web-playwright.js +327 -110
- package/build/web-playwright.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
let userScrolledManually = false; // Flag to track manual scrolling (module-level)
|
|
2
|
+
export function setupControls() {
|
|
3
|
+
const levelSelect = document.getElementById('haibun-debug-level-select');
|
|
4
|
+
const levels = ['debug', 'log', 'info', 'error'];
|
|
5
|
+
const updateStyles = (selectedLevel) => {
|
|
6
|
+
const selectedIndex = levels.indexOf(selectedLevel);
|
|
7
|
+
let css = '';
|
|
8
|
+
levels.forEach((level, index) => {
|
|
9
|
+
if (index < selectedIndex) {
|
|
10
|
+
css += `div.haibun-log-entry.haibun-level-${level}:not(.disappeared) { display: none; }\n`;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
css += `div.haibun-log-entry.haibun-level-${level}:not(.disappeared) { display: flex; }\n`;
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
let styleElement = document.getElementById('haibun-dynamic-styles');
|
|
17
|
+
if (!styleElement) {
|
|
18
|
+
styleElement = document.createElement('style');
|
|
19
|
+
styleElement.id = 'haibun-dynamic-styles';
|
|
20
|
+
document.head.appendChild(styleElement);
|
|
21
|
+
}
|
|
22
|
+
styleElement.textContent = css;
|
|
23
|
+
};
|
|
24
|
+
if (levelSelect) {
|
|
25
|
+
levelSelect.addEventListener('change', (event) => {
|
|
26
|
+
const target = event.target;
|
|
27
|
+
updateStyles(target.value);
|
|
28
|
+
});
|
|
29
|
+
// Initial style update
|
|
30
|
+
updateStyles(levelSelect.value);
|
|
31
|
+
}
|
|
32
|
+
// Setup video playback functionality
|
|
33
|
+
setupVideoPlayback();
|
|
34
|
+
// Setup resize handle functionality
|
|
35
|
+
setupResizeHandle();
|
|
36
|
+
}
|
|
37
|
+
function setupResizeHandle() {
|
|
38
|
+
const resizeHandle = document.getElementById('resize-handle');
|
|
39
|
+
const topDisplay = document.getElementById('haibun-media-display');
|
|
40
|
+
const logDisplayArea = document.getElementById('haibun-log-display-area');
|
|
41
|
+
const header = document.querySelector('.haibun-header'); // Assuming header has this class
|
|
42
|
+
if (!resizeHandle || !topDisplay || !logDisplayArea || !header) {
|
|
43
|
+
console.error('Resize elements not found');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
let isResizing = false;
|
|
47
|
+
let startY;
|
|
48
|
+
let startHeightTop;
|
|
49
|
+
resizeHandle.addEventListener('mousedown', (e) => {
|
|
50
|
+
isResizing = true;
|
|
51
|
+
startY = e.clientY;
|
|
52
|
+
startHeightTop = topDisplay.clientHeight;
|
|
53
|
+
document.body.style.cursor = 'ns-resize'; // Change cursor during resize
|
|
54
|
+
document.body.style.userSelect = 'none'; // Prevent text selection
|
|
55
|
+
// Add listeners to document to capture mouse move everywhere
|
|
56
|
+
document.addEventListener('mousemove', handleMouseMove);
|
|
57
|
+
document.addEventListener('mouseup', handleMouseUp);
|
|
58
|
+
});
|
|
59
|
+
const handleMouseMove = (e) => {
|
|
60
|
+
if (!isResizing)
|
|
61
|
+
return;
|
|
62
|
+
const deltaY = e.clientY - startY; // Calculate change in Y (Reversed for top panel)
|
|
63
|
+
const newHeightTop = startHeightTop + deltaY;
|
|
64
|
+
const minHeight = 50; // Minimum height for the top panel
|
|
65
|
+
const maxHeight = window.innerHeight - header.clientHeight - 50; // Max height (leave space for header and min log area below)
|
|
66
|
+
// Clamp the new height
|
|
67
|
+
const clampedHeightTop = Math.max(minHeight, Math.min(newHeightTop, maxHeight));
|
|
68
|
+
// Apply new height to top panel
|
|
69
|
+
topDisplay.style.height = `${clampedHeightTop}px`;
|
|
70
|
+
};
|
|
71
|
+
const handleMouseUp = () => {
|
|
72
|
+
if (isResizing) {
|
|
73
|
+
isResizing = false;
|
|
74
|
+
document.body.style.cursor = ''; // Reset cursor
|
|
75
|
+
document.body.style.userSelect = ''; // Re-enable text selection
|
|
76
|
+
document.removeEventListener('mousemove', handleMouseMove);
|
|
77
|
+
document.removeEventListener('mouseup', handleMouseUp);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Helper function to show the media panel and resize handle
|
|
82
|
+
function showMediaPanelIfNeeded(mediaPanel, resizeHandle) {
|
|
83
|
+
if (mediaPanel && resizeHandle) {
|
|
84
|
+
// Check if already visible to avoid redundant style changes
|
|
85
|
+
if (mediaPanel.style.display !== 'flex') {
|
|
86
|
+
mediaPanel.style.display = 'flex';
|
|
87
|
+
}
|
|
88
|
+
if (resizeHandle.style.display !== 'block') {
|
|
89
|
+
resizeHandle.style.display = 'block';
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function setupVideoPlayback() {
|
|
94
|
+
// Get references to media elements and controls
|
|
95
|
+
const mediaPanel = document.getElementById('haibun-media-display');
|
|
96
|
+
const resizeHandle = document.getElementById('resize-handle');
|
|
97
|
+
const sequenceDiagram = document.getElementById('sequence-diagram'); // Check inner div for content
|
|
98
|
+
const videoContainer = document.getElementById('haibun-video');
|
|
99
|
+
const logDisplayArea = document.getElementById('haibun-log-display-area'); // Keep this check and cast
|
|
100
|
+
if (!logDisplayArea || !videoContainer || !mediaPanel || !resizeHandle) {
|
|
101
|
+
console.error("Required elements for video playback/layout not found.");
|
|
102
|
+
return; // Exit if essential elements are missing
|
|
103
|
+
}
|
|
104
|
+
// userScrolledManually is now module-level
|
|
105
|
+
// Check if media exists initially (video OR sequence diagram content)
|
|
106
|
+
const existingVideoCheck = videoContainer.querySelector('video');
|
|
107
|
+
if (existingVideoCheck || (sequenceDiagram && sequenceDiagram.hasChildNodes())) {
|
|
108
|
+
showMediaPanelIfNeeded(mediaPanel, resizeHandle);
|
|
109
|
+
}
|
|
110
|
+
// Setup click handlers for log entries to seek video
|
|
111
|
+
logDisplayArea.addEventListener('click', (event) => {
|
|
112
|
+
const target = event.target;
|
|
113
|
+
const logEntry = findLogEntry(target);
|
|
114
|
+
if (logEntry && logEntry.dataset.time) {
|
|
115
|
+
const videoElement = videoContainer.querySelector('video');
|
|
116
|
+
if (videoElement) {
|
|
117
|
+
userScrolledManually = false; // Resume auto-scroll on click/seek
|
|
118
|
+
// Get Monitor start time and Video start offset
|
|
119
|
+
const monitorStartTimeStr = document.body.dataset.startTime;
|
|
120
|
+
const videoStartOffsetStr = document.getElementById('haibun-video-start')?.dataset.start;
|
|
121
|
+
if (!monitorStartTimeStr || !videoStartOffsetStr) {
|
|
122
|
+
console.warn('Monitor start time or video start offset not found. Cannot seek video.');
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const monitorStartTime = parseInt(monitorStartTimeStr, 10);
|
|
126
|
+
const videoStartOffset = parseInt(videoStartOffsetStr, 10);
|
|
127
|
+
if (isNaN(monitorStartTime) || isNaN(videoStartOffset)) {
|
|
128
|
+
console.warn('Invalid monitor start time or video start offset.');
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const videoAbsoluteStartTime = monitorStartTime + videoStartOffset;
|
|
132
|
+
// Calculate the time to seek to
|
|
133
|
+
const entryAbsoluteTime = parseInt(logEntry.dataset.time, 10);
|
|
134
|
+
if (isNaN(entryAbsoluteTime)) {
|
|
135
|
+
console.warn('Clicked log entry missing or invalid data-time:', logEntry);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
// Calculate time relative to video start
|
|
139
|
+
const logRelativeToVideoMs = entryAbsoluteTime - videoAbsoluteStartTime;
|
|
140
|
+
const seekTime = logRelativeToVideoMs / 1000;
|
|
141
|
+
// Corrected variable names in the log message if uncommented later
|
|
142
|
+
// console.log(`Calculated seekTime: ${seekTime}s (Entry: ${entryAbsoluteTime}, Start: ${videoAbsoluteStartTime})`);
|
|
143
|
+
// Seek the video (allow seeking slightly before 0 for precision)
|
|
144
|
+
if (!isNaN(seekTime)) {
|
|
145
|
+
videoElement.currentTime = Math.max(0, seekTime); // Ensure seek time is not negative
|
|
146
|
+
// No need to manually update classes here,
|
|
147
|
+
// the 'seeked' event handler will take care of it.
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
// Detect manual scroll
|
|
153
|
+
let scrollTimeout;
|
|
154
|
+
logDisplayArea.addEventListener('scroll', () => {
|
|
155
|
+
const videoElement = videoContainer.querySelector('video'); // Need video element ref here too
|
|
156
|
+
// Use a timeout to avoid setting the flag during programmatic scrolls which might trigger rapid scroll events
|
|
157
|
+
clearTimeout(scrollTimeout);
|
|
158
|
+
scrollTimeout = window.setTimeout(() => {
|
|
159
|
+
// Simpler approach: Any scroll event sets the flag. Play/seek events clear it.
|
|
160
|
+
userScrolledManually = true;
|
|
161
|
+
// console.log('Manual scroll detected, setting flag.');
|
|
162
|
+
}, 150); // Wait 150ms after the last scroll event to set the flag
|
|
163
|
+
});
|
|
164
|
+
// Setup timeupdate handler for video to highlight current step
|
|
165
|
+
const setupVideoTimeUpdateHandler = (videoElement) => {
|
|
166
|
+
let playInterval; // Use number for interval ID, undefined when not set
|
|
167
|
+
let latestCurrentEntry = null; // Track the current entry
|
|
168
|
+
const updateVideoSteps = () => {
|
|
169
|
+
// Get Monitor start time and Video start offset
|
|
170
|
+
const monitorStartTimeStr = document.body.dataset.startTime;
|
|
171
|
+
const videoStartOffsetStr = document.getElementById('haibun-video-start')?.dataset.start;
|
|
172
|
+
if (!monitorStartTimeStr || !videoStartOffsetStr) {
|
|
173
|
+
// console.warn('Monitor start time or video start offset not found during update.');
|
|
174
|
+
return; // Cannot calculate relative times
|
|
175
|
+
}
|
|
176
|
+
const monitorStartTime = parseInt(monitorStartTimeStr, 10);
|
|
177
|
+
const videoStartOffset = parseInt(videoStartOffsetStr, 10);
|
|
178
|
+
if (isNaN(monitorStartTime) || isNaN(videoStartOffset)) {
|
|
179
|
+
// console.warn('Invalid monitor start time or video start offset during update.');
|
|
180
|
+
return; // Cannot calculate relative times
|
|
181
|
+
}
|
|
182
|
+
const videoAbsoluteStartTime = monitorStartTime + videoStartOffset;
|
|
183
|
+
const currentVideoTimeMs = videoElement.currentTime * 1000;
|
|
184
|
+
let currentLatestEntry = null; // Entry to be marked current in this update
|
|
185
|
+
document.querySelectorAll('.haibun-log-entry').forEach(entry => {
|
|
186
|
+
// Clear previous state for all entries first
|
|
187
|
+
entry.classList.remove('haibun-stepper-played', 'haibun-stepper-notplayed', 'haibun-stepper-current');
|
|
188
|
+
const entryTimeStr = entry.dataset.time;
|
|
189
|
+
if (!entryTimeStr)
|
|
190
|
+
return; // Skip entries without time
|
|
191
|
+
const entryAbsoluteTime = parseInt(entryTimeStr, 10);
|
|
192
|
+
if (isNaN(entryAbsoluteTime))
|
|
193
|
+
return; // Skip entries with invalid time
|
|
194
|
+
// Calculate entry time relative to video start
|
|
195
|
+
const logRelativeToVideoMs = entryAbsoluteTime - videoAbsoluteStartTime;
|
|
196
|
+
// Determine played/notplayed status
|
|
197
|
+
if (logRelativeToVideoMs <= currentVideoTimeMs) {
|
|
198
|
+
entry.classList.add('haibun-stepper-played');
|
|
199
|
+
entry.classList.remove('haibun-stepper-notplayed');
|
|
200
|
+
// This entry is a candidate for the current step
|
|
201
|
+
// Update if this entry is later than the current candidate
|
|
202
|
+
if (!currentLatestEntry || entryAbsoluteTime > parseInt(currentLatestEntry.dataset.time || '0', 10)) {
|
|
203
|
+
currentLatestEntry = entry;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
entry.classList.add('haibun-stepper-notplayed');
|
|
208
|
+
entry.classList.remove('haibun-stepper-played');
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
// Mark the actual latest entry as current and scroll if needed
|
|
212
|
+
if (currentLatestEntry) {
|
|
213
|
+
currentLatestEntry.classList.add('haibun-stepper-current');
|
|
214
|
+
// Scroll the current entry into view ONLY if the user hasn't scrolled manually
|
|
215
|
+
// Scroll the current entry into view ONLY if the user hasn't scrolled manually AND it's not already visible
|
|
216
|
+
if (!userScrolledManually && !isElementInViewport(currentLatestEntry)) {
|
|
217
|
+
// console.log('Auto-scrolling to:', currentLatestEntry);
|
|
218
|
+
currentLatestEntry.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); // Use 'nearest'
|
|
219
|
+
}
|
|
220
|
+
else if (userScrolledManually) {
|
|
221
|
+
// console.log('Manual scroll active, not auto-scrolling.');
|
|
222
|
+
} // else: Element is already in viewport, no need to scroll
|
|
223
|
+
latestCurrentEntry = currentLatestEntry; // Update the tracked entry
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
// If no entry is before or at the current time, clear the tracker
|
|
227
|
+
latestCurrentEntry = null;
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
// Update state definitively after a seek
|
|
231
|
+
videoElement.addEventListener('seeked', () => {
|
|
232
|
+
// console.log('seeked');
|
|
233
|
+
userScrolledManually = false; // Resume auto-scroll on seek
|
|
234
|
+
// console.log('Seek detected, clearing manual scroll flag.');
|
|
235
|
+
updateVideoSteps();
|
|
236
|
+
});
|
|
237
|
+
// Use interval for smooth updates during playback
|
|
238
|
+
videoElement.addEventListener('play', () => {
|
|
239
|
+
// console.log('play');
|
|
240
|
+
userScrolledManually = false; // Resume auto-scroll on play
|
|
241
|
+
// console.log('Play detected, clearing manual scroll flag.');
|
|
242
|
+
if (playInterval === undefined) { // Prevent multiple intervals
|
|
243
|
+
updateVideoSteps(); // Update immediately on play
|
|
244
|
+
playInterval = window.setInterval(updateVideoSteps, 50); // Update frequently (e.g., 50ms)
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
// Clear interval on pause or end
|
|
248
|
+
const clearPlayInterval = () => {
|
|
249
|
+
// console.log('pause/ended');
|
|
250
|
+
if (playInterval !== undefined) {
|
|
251
|
+
clearInterval(playInterval);
|
|
252
|
+
playInterval = undefined;
|
|
253
|
+
updateVideoSteps(); // Ensure final state is correct after pause/end
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
videoElement.addEventListener('pause', clearPlayInterval);
|
|
257
|
+
videoElement.addEventListener('ended', clearPlayInterval);
|
|
258
|
+
// Initial update in case video is loaded paused or has an initial time
|
|
259
|
+
updateVideoSteps();
|
|
260
|
+
};
|
|
261
|
+
// --- MutationObserver setup ---
|
|
262
|
+
let existingVideo = videoContainer.querySelector('video'); // Keep tracking var separate
|
|
263
|
+
if (existingVideo) { // Setup handler if video exists initially
|
|
264
|
+
setupVideoTimeUpdateHandler(existingVideo);
|
|
265
|
+
}
|
|
266
|
+
const observer = new MutationObserver((mutations) => {
|
|
267
|
+
mutations.forEach((mutation) => {
|
|
268
|
+
if (mutation.type === 'childList') {
|
|
269
|
+
const newVideo = videoContainer.querySelector('video');
|
|
270
|
+
if (newVideo && newVideo !== existingVideo) {
|
|
271
|
+
console.log('New video detected, setting up handlers and showing panel.');
|
|
272
|
+
// Show panel/handle when new video is added
|
|
273
|
+
showMediaPanelIfNeeded(mediaPanel, resizeHandle);
|
|
274
|
+
setupVideoTimeUpdateHandler(newVideo);
|
|
275
|
+
existingVideo = newVideo; // Update tracked video element
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
observer.observe(videoContainer, { childList: true });
|
|
281
|
+
// --- Separate Observer for Sequence Diagram Content ---
|
|
282
|
+
const diagramObserver = new MutationObserver((mutations) => {
|
|
283
|
+
mutations.forEach((mutation) => {
|
|
284
|
+
// Check if nodes were added AND the target is the sequence diagram div
|
|
285
|
+
if (mutation.type === 'childList' && mutation.addedNodes.length > 0 && mutation.target === sequenceDiagram) {
|
|
286
|
+
console.log('Sequence diagram content detected, showing panel.');
|
|
287
|
+
showMediaPanelIfNeeded(mediaPanel, resizeHandle);
|
|
288
|
+
diagramObserver.disconnect(); // Stop observing once content is added
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
// Start observing the sequence diagram div for added children (like the SVG)
|
|
293
|
+
if (sequenceDiagram) {
|
|
294
|
+
diagramObserver.observe(sequenceDiagram, { childList: true });
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// Helper function to find the parent log entry element
|
|
298
|
+
function findLogEntry(element) {
|
|
299
|
+
let current = element;
|
|
300
|
+
while (current && !current.classList.contains('haibun-log-entry')) {
|
|
301
|
+
current = current.parentElement;
|
|
302
|
+
}
|
|
303
|
+
return current;
|
|
304
|
+
}
|
|
305
|
+
// Helper function to check if an element is in the viewport
|
|
306
|
+
function isElementInViewport(element) {
|
|
307
|
+
const rect = element.getBoundingClientRect();
|
|
308
|
+
const logDisplayArea = document.getElementById('haibun-log-display-area');
|
|
309
|
+
if (!logDisplayArea)
|
|
310
|
+
return false; // Should not happen, but check
|
|
311
|
+
const logRect = logDisplayArea.getBoundingClientRect();
|
|
312
|
+
// Check if the element is within the visible bounds of the logDisplayArea
|
|
313
|
+
return (rect.top >= logRect.top &&
|
|
314
|
+
rect.left >= logRect.left &&
|
|
315
|
+
rect.bottom <= logRect.bottom &&
|
|
316
|
+
rect.right <= logRect.right);
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=controls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controls.js","sourceRoot":"","sources":["../../src/monitor/controls.ts"],"names":[],"mappings":"AAAA,IAAI,oBAAoB,GAAG,KAAK,CAAC,CAAC,gDAAgD;AAElF,MAAM,UAAU,aAAa;IAC5B,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,2BAA2B,CAAsB,CAAC;IAC9F,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjD,MAAM,YAAY,GAAG,CAAC,aAAqB,EAAE,EAAE;QAC9C,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC/B,IAAI,KAAK,GAAG,aAAa,EAAE,CAAC;gBAC3B,GAAG,IAAI,qCAAqC,KAAK,yCAAyC,CAAC;YAC5F,CAAC;iBAAM,CAAC;gBACP,GAAG,IAAI,qCAAqC,KAAK,yCAAyC,CAAC;YAC5F,CAAC;QACF,CAAC,CAAC,CAAC;QACH,IAAI,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;QACpE,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC/C,YAAY,CAAC,EAAE,GAAG,uBAAuB,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACzC,CAAC;QACD,YAAY,CAAC,WAAW,GAAG,GAAG,CAAC;IAChC,CAAC,CAAC;IAEF,IAAI,WAAW,EAAE,CAAC;QACjB,WAAW,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAChD,MAAM,MAAM,GAAG,KAAK,CAAC,MAA2B,CAAC;YACjD,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,uBAAuB;QACvB,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,qCAAqC;IACrC,kBAAkB,EAAE,CAAC;IACrB,oCAAoC;IACpC,iBAAiB,EAAE,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB;IACzB,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,sBAAsB,CAAgB,CAAC;IAClF,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,yBAAyB,CAAgB,CAAC;IACzF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,iCAAiC;IAE1F,IAAI,CAAC,YAAY,IAAI,CAAC,UAAU,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3C,OAAO;IACR,CAAC;IAED,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,MAAc,CAAC;IACnB,IAAI,cAAsB,CAAC;IAE3B,YAAY,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;QAChD,UAAU,GAAG,IAAI,CAAC;QAClB,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC;QACnB,cAAc,GAAG,UAAU,CAAC,YAAY,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,8BAA8B;QACxE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,yBAAyB;QAElE,6DAA6D;QAC7D,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACxD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,CAAC,CAAa,EAAE,EAAE;QACzC,IAAI,CAAC,UAAU;YAAE,OAAO;QAExB,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,iDAAiD;QACpF,MAAM,YAAY,GAAG,cAAc,GAAG,MAAM,CAAC;QAC7C,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,mCAAmC;QACzD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,6DAA6D;QAE9H,uBAAuB;QACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;QAEhF,gCAAgC;QAChC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,gBAAgB,IAAI,CAAC;IACnD,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QAC1B,IAAI,UAAU,EAAE,CAAC;YAChB,UAAU,GAAG,KAAK,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,eAAe;YAChD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,2BAA2B;YAChE,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;YAC3D,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACxD,CAAC;IACF,CAAC,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,SAAS,sBAAsB,CAAC,UAA8B,EAAE,YAAgC;IAC/F,IAAI,UAAU,IAAI,YAAY,EAAE,CAAC;QAChC,4DAA4D;QAC5D,IAAI,UAAU,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YACzC,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QACnC,CAAC;QACD,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC5C,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QACtC,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kBAAkB;IACjC,gDAAgD;IAChD,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAC9D,MAAM,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC,8BAA8B;IACnG,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,yBAAyB,CAAgB,CAAC,CAAC,2BAA2B;IAErH,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,EAAE,CAAC;QACxE,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACxE,OAAO,CAAC,yCAAyC;IAClD,CAAC;IACD,2CAA2C;IAE3C,sEAAsE;IACtE,MAAM,kBAAkB,GAAG,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACjE,IAAI,kBAAkB,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;QAChF,sBAAsB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAClD,CAAC;IAED,qDAAqD;IACrD,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;QAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEtC,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC3D,IAAI,YAAY,EAAE,CAAC;gBAClB,oBAAoB,GAAG,KAAK,CAAC,CAAC,mCAAmC;gBACjE,gDAAgD;gBAChD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;gBAC5D,MAAM,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC;gBAEzF,IAAI,CAAC,mBAAmB,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAClD,OAAO,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;oBACvF,OAAO;gBACR,CAAC;gBACD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;gBAC3D,MAAM,gBAAgB,GAAG,QAAQ,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;gBAE3D,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBACxD,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;oBAClE,OAAO;gBACR,CAAC;gBACD,MAAM,sBAAsB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;gBAEnE,gCAAgC;gBAChC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC9D,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBAC9B,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,QAAQ,CAAC,CAAC;oBAC1E,OAAO;gBACR,CAAC;gBACD,yCAAyC;gBACzC,MAAM,oBAAoB,GAAG,iBAAiB,GAAG,sBAAsB,CAAC;gBACxE,MAAM,QAAQ,GAAG,oBAAoB,GAAG,IAAI,CAAC;gBAC7C,mEAAmE;gBACnE,oHAAoH;gBAEpH,iEAAiE;gBACjE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACtB,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,mCAAmC;oBAErF,2CAA2C;oBAC3C,mDAAmD;gBACpD,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,IAAI,aAAiC,CAAC;IACtC,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC9C,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAkC;QAC9F,8GAA8G;QAC9G,YAAY,CAAC,aAAa,CAAC,CAAC;QAC5B,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACtC,+EAA+E;YAC/E,oBAAoB,GAAG,IAAI,CAAC;YAC5B,wDAAwD;QACzD,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,yDAAyD;IACnE,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,MAAM,2BAA2B,GAAG,CAAC,YAA8B,EAAE,EAAE;QACtE,IAAI,YAAgC,CAAC,CAAC,qDAAqD;QAC3F,IAAI,kBAAkB,GAAuB,IAAI,CAAC,CAAC,0BAA0B;QAE7E,MAAM,gBAAgB,GAAG,GAAG,EAAE;YAC7B,gDAAgD;YAChD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YAC5D,MAAM,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC;YAEzF,IAAI,CAAC,mBAAmB,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAClD,qFAAqF;gBACrF,OAAO,CAAC,kCAAkC;YAC3C,CAAC;YACD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;YAC3D,MAAM,gBAAgB,GAAG,QAAQ,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;YAE3D,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACxD,mFAAmF;gBACnF,OAAO,CAAC,kCAAkC;YAC3C,CAAC;YACD,MAAM,sBAAsB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;YAEnE,MAAM,kBAAkB,GAAG,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;YAC3D,IAAI,kBAAkB,GAAuB,IAAI,CAAC,CAAC,4CAA4C;YAE/F,QAAQ,CAAC,gBAAgB,CAAc,mBAAmB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBAC3E,6CAA6C;gBAC7C,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,EAAE,wBAAwB,CAAC,CAAC;gBAEtG,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBACxC,IAAI,CAAC,YAAY;oBAAE,OAAO,CAAC,4BAA4B;gBACvD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBACrD,IAAI,KAAK,CAAC,iBAAiB,CAAC;oBAAE,OAAO,CAAC,iCAAiC;gBAEvE,+CAA+C;gBAC/C,MAAM,oBAAoB,GAAG,iBAAiB,GAAG,sBAAsB,CAAC;gBAExE,oCAAoC;gBACpC,IAAI,oBAAoB,IAAI,kBAAkB,EAAE,CAAC;oBAChD,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;oBAC7C,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;oBACnD,iDAAiD;oBACjD,2DAA2D;oBAC3D,IAAI,CAAC,kBAAkB,IAAI,iBAAiB,GAAG,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;wBACrG,kBAAkB,GAAG,KAAK,CAAC;oBAC5B,CAAC;gBACF,CAAC;qBAAM,CAAC;oBACP,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;oBAChD,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;gBACjD,CAAC;YACF,CAAC,CAAC,CAAC;YAEH,+DAA+D;YAC/D,IAAI,kBAAkB,EAAE,CAAC;gBACxB,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;gBAC3D,+EAA+E;gBAC/E,4GAA4G;gBAC5G,IAAI,CAAC,oBAAoB,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBACvE,yDAAyD;oBACzD,kBAAkB,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,gBAAgB;gBAC9F,CAAC;qBAAM,IAAI,oBAAoB,EAAE,CAAC;oBACjC,4DAA4D;gBAC7D,CAAC,CAAC,0DAA0D;gBAC5D,kBAAkB,GAAG,kBAAkB,CAAC,CAAC,2BAA2B;YACrE,CAAC;iBAAM,CAAC;gBACP,kEAAkE;gBAClE,kBAAkB,GAAG,IAAI,CAAC;YAC3B,CAAC;QACF,CAAC,CAAC;QAEF,yCAAyC;QACzC,YAAY,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC5C,yBAAyB;YACzB,oBAAoB,GAAG,KAAK,CAAC,CAAC,6BAA6B;YAC3D,8DAA8D;YAC9D,gBAAgB,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,kDAAkD;QAClD,YAAY,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YAC1C,uBAAuB;YACvB,oBAAoB,GAAG,KAAK,CAAC,CAAC,6BAA6B;YAC3D,8DAA8D;YAC9D,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC,CAAC,6BAA6B;gBAC9D,gBAAgB,EAAE,CAAC,CAAC,6BAA6B;gBACjD,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,iCAAiC;YAC3F,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,iCAAiC;QACjC,MAAM,iBAAiB,GAAG,GAAG,EAAE;YAC9B,8BAA8B;YAC9B,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAChC,aAAa,CAAC,YAAY,CAAC,CAAC;gBAC5B,YAAY,GAAG,SAAS,CAAC;gBACzB,gBAAgB,EAAE,CAAC,CAAC,gDAAgD;YACrE,CAAC;QACF,CAAC,CAAC;QACF,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAC1D,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAE1D,uEAAuE;QACvE,gBAAgB,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,iCAAiC;IACjC,IAAI,aAAa,GAAG,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B;IACxF,IAAI,aAAa,EAAE,CAAC,CAAC,0CAA0C;QAC9D,2BAA2B,CAAC,aAAiC,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAAS,EAAE,EAAE;QACnD,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC9B,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBACvD,IAAI,QAAQ,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;oBAC5C,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;oBAC1E,4CAA4C;oBAC5C,sBAAsB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;oBACjD,2BAA2B,CAAC,QAA4B,CAAC,CAAC;oBAC1D,aAAa,GAAG,QAAQ,CAAC,CAAC,+BAA+B;gBAC1D,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtD,yDAAyD;IACzD,MAAM,eAAe,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAAS,EAAE,EAAE;QAC1D,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC9B,uEAAuE;YACvE,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;gBAC5G,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;gBACjE,sBAAsB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;gBACjD,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC,uCAAuC;YACtE,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,6EAA6E;IAC7E,IAAI,eAAe,EAAE,CAAC;QACrB,eAAe,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;AACF,CAAC;AAED,uDAAuD;AACvD,SAAS,YAAY,CAAC,OAAoB;IACzC,IAAI,OAAO,GAAG,OAAO,CAAC;IACtB,OAAO,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACnE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IACjC,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,4DAA4D;AAC5D,SAAS,mBAAmB,CAAC,OAAoB;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAC7C,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,yBAAyB,CAAC,CAAC;IAC1E,IAAI,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC,CAAC,+BAA+B;IAElE,MAAM,OAAO,GAAG,cAAc,CAAC,qBAAqB,EAAE,CAAC;IAEvD,0EAA0E;IAC1E,OAAO,CACN,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;QACvB,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI;QACzB,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;QAC7B,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAC3B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disclosureJson.d.ts","sourceRoot":"","sources":["../../src/monitor/disclosureJson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,sBAgChD"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
export function disclosureJson(jsonObj) {
|
|
2
|
+
const rootNode = buildRecursiveDetails(jsonObj, 0);
|
|
3
|
+
if (rootNode) {
|
|
4
|
+
if (typeof jsonObj === 'object' && jsonObj !== null) {
|
|
5
|
+
const rootDetails = document.createElement('details');
|
|
6
|
+
// Root should be closed by default
|
|
7
|
+
rootDetails.open = false;
|
|
8
|
+
// Add a class to ensure CSS styling is applied
|
|
9
|
+
rootDetails.className = 'json-root-details';
|
|
10
|
+
const summary = document.createElement('summary');
|
|
11
|
+
// Ensure the summary displays as a list item for proper disclosure triangle
|
|
12
|
+
summary.style.display = 'list-item';
|
|
13
|
+
summary.style.cursor = 'pointer'; // Add pointer cursor to indicate it's clickable
|
|
14
|
+
const count = Array.isArray(jsonObj) ? jsonObj.length : Object.keys(jsonObj).length;
|
|
15
|
+
// Use "JSON result with X keys" format for root
|
|
16
|
+
const countText = Array.isArray(jsonObj)
|
|
17
|
+
? `${count} ${count === 1 ? 'item' : 'items'}`
|
|
18
|
+
: `${count} ${count === 1 ? 'key' : 'keys'}`;
|
|
19
|
+
summary.innerHTML = `<span class="key root-key">JSON result with ${countText}</span>`;
|
|
20
|
+
rootDetails.appendChild(summary);
|
|
21
|
+
rootDetails.appendChild(rootNode);
|
|
22
|
+
rootDetails.dataset.rawJson = JSON.stringify(jsonObj);
|
|
23
|
+
return rootDetails;
|
|
24
|
+
} // End if (typeof jsonObj === 'object'...)
|
|
25
|
+
} // End if (rootNode)
|
|
26
|
+
// Return undefined or some fallback if rootNode couldn't be built or wasn't an object
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
function appendNode(key, value, isArrayIndex, parentElement, indentLevel = 0) {
|
|
30
|
+
const valueNode = buildRecursiveDetails(value, indentLevel);
|
|
31
|
+
// Fix 2 & 3: Type guard for Element properties
|
|
32
|
+
if (valueNode instanceof Element && valueNode.tagName === 'DIV' && valueNode.classList.contains('details-content')) {
|
|
33
|
+
const details = document.createElement('details');
|
|
34
|
+
details.className = isArrayIndex ? 'json-array-item' : 'json-object-item';
|
|
35
|
+
// Apply indentation to the details element
|
|
36
|
+
details.style.marginLeft = `${indentLevel * 20}px`;
|
|
37
|
+
const summary = document.createElement('summary');
|
|
38
|
+
summary.style.display = 'list-item'; // Ensure the summary displays as a list item for proper disclosure triangle
|
|
39
|
+
summary.style.cursor = 'pointer'; // Add pointer cursor to indicate it's clickable
|
|
40
|
+
const keyClass = isArrayIndex ? 'key index' : 'key';
|
|
41
|
+
const keyText = isArrayIndex ? `[${key}]:` : `${key}:`;
|
|
42
|
+
const valueCount = Array.isArray(value) ? value.length : Object.keys(value).length;
|
|
43
|
+
// More human-friendly type indicators
|
|
44
|
+
const typeIndicator = Array.isArray(value)
|
|
45
|
+
? `${valueCount} ${valueCount === 1 ? 'Item' : 'Items'}`
|
|
46
|
+
: `${valueCount} ${valueCount === 1 ? 'Key' : 'Keys'}`;
|
|
47
|
+
summary.innerHTML = `<span class="${keyClass}">${keyText}</span> <span class="type-indicator">${typeIndicator}</span>`;
|
|
48
|
+
details.appendChild(summary);
|
|
49
|
+
details.appendChild(valueNode);
|
|
50
|
+
parentElement.appendChild(details);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const lineDiv = document.createElement('div');
|
|
54
|
+
lineDiv.className = 'json-line';
|
|
55
|
+
// Apply indentation to primitive values
|
|
56
|
+
lineDiv.style.marginLeft = `${indentLevel * 20}px`;
|
|
57
|
+
const keyClass = isArrayIndex ? 'key index' : 'key';
|
|
58
|
+
const keyText = isArrayIndex ? `[${key}]:` : `${key}:`;
|
|
59
|
+
lineDiv.innerHTML = `<span class="${keyClass}">${keyText}</span> `;
|
|
60
|
+
lineDiv.appendChild(valueNode);
|
|
61
|
+
parentElement.appendChild(lineDiv);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function buildRecursiveDetails(data, indentLevel = 0) {
|
|
65
|
+
const type = typeof data;
|
|
66
|
+
if (data === null || ['string', 'number', 'boolean', 'undefined'].includes(type)) {
|
|
67
|
+
return createPrimitiveNode(data);
|
|
68
|
+
}
|
|
69
|
+
if (type === 'object') {
|
|
70
|
+
const isArray = Array.isArray(data);
|
|
71
|
+
const containerDiv = document.createElement('div');
|
|
72
|
+
containerDiv.className = 'details-content';
|
|
73
|
+
let isEmpty = true;
|
|
74
|
+
if (isArray) {
|
|
75
|
+
data.forEach((item, index) => {
|
|
76
|
+
isEmpty = false;
|
|
77
|
+
appendNode(index, item, true, containerDiv, indentLevel + 1);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
Object.keys(data).forEach(key => {
|
|
82
|
+
isEmpty = false;
|
|
83
|
+
appendNode(key, data[key], false, containerDiv, indentLevel + 1);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (isEmpty) {
|
|
87
|
+
const emptyIndicator = createEmptyIndicator(isArray ? 'Array' : 'Object');
|
|
88
|
+
// Apply indentation to empty indicators
|
|
89
|
+
emptyIndicator.style.marginLeft = `${indentLevel * 20}px`;
|
|
90
|
+
containerDiv.appendChild(emptyIndicator);
|
|
91
|
+
}
|
|
92
|
+
return containerDiv;
|
|
93
|
+
}
|
|
94
|
+
return document.createTextNode('(Unknown Type)');
|
|
95
|
+
}
|
|
96
|
+
function createPrimitiveNode(value) {
|
|
97
|
+
const span = document.createElement('span');
|
|
98
|
+
span.classList.add('value');
|
|
99
|
+
let displayValue = String(value);
|
|
100
|
+
let typeClass = typeof value; // Fix 4: Ensure typeClass is string
|
|
101
|
+
if (value === null) {
|
|
102
|
+
typeClass = 'null';
|
|
103
|
+
displayValue = 'null';
|
|
104
|
+
}
|
|
105
|
+
else if (typeClass === 'string') {
|
|
106
|
+
displayValue = `"${value}"`;
|
|
107
|
+
}
|
|
108
|
+
else if (typeClass === 'undefined') {
|
|
109
|
+
displayValue = 'undefined';
|
|
110
|
+
}
|
|
111
|
+
span.classList.add(`value-${typeClass}`);
|
|
112
|
+
span.textContent = displayValue;
|
|
113
|
+
return span;
|
|
114
|
+
}
|
|
115
|
+
function createEmptyIndicator(type) {
|
|
116
|
+
const indicator = document.createElement('span');
|
|
117
|
+
indicator.className = 'empty-indicator';
|
|
118
|
+
indicator.textContent = type === 'Array' ? '[] (Empty Array)' : '{} (Empty Object)';
|
|
119
|
+
return indicator;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=disclosureJson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disclosureJson.js","sourceRoot":"","sources":["../../src/monitor/disclosureJson.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,OAAkB;IAChD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACnD,IAAI,QAAQ,EAAE,CAAC;QACd,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YACtD,mCAAmC;YACnC,WAAW,CAAC,IAAI,GAAG,KAAK,CAAC;YAEzB,+CAA+C;YAC/C,WAAW,CAAC,SAAS,GAAG,mBAAmB,CAAC;YAE5C,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAClD,4EAA4E;YAC5E,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,gDAAgD;YAElF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;YAEpF,gDAAgD;YAChD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;gBACvC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE;gBAC9C,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAE9C,OAAO,CAAC,SAAS,GAAG,+CAA+C,SAAS,SAAS,CAAC;YACtF,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACjC,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAClC,WAAW,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACtD,OAAO,WAAW,CAAC;QACpB,CAAC,CAAC,0CAA0C;IAC7C,CAAC,CAAC,oBAAoB;IACtB,sFAAsF;IACtF,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,GAAoB,EAAE,KAAgB,EAAE,YAAqB,EAAE,aAA0B,EAAE,cAAsB,CAAC;IACrI,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAE5D,+CAA+C;IAC/C,IAAI,SAAS,YAAY,OAAO,IAAI,SAAS,CAAC,OAAO,KAAK,KAAK,IAAI,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACpH,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAClD,OAAO,CAAC,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAE1E,2CAA2C;QAC3C,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,WAAW,GAAG,EAAE,IAAI,CAAC;QAEnD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC,4EAA4E;QACjH,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,gDAAgD;QAElF,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;QACpD,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;QACvD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;QAEnF,sCAAsC;QACtC,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACzC,CAAC,CAAC,GAAG,UAAU,IAAI,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE;YACxD,CAAC,CAAC,GAAG,UAAU,IAAI,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAExD,OAAO,CAAC,SAAS,GAAG,gBAAgB,QAAQ,KAAK,OAAO,wCAAwC,aAAa,SAAS,CAAC;QAEvH,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC/B,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAEpC,CAAC;SAAM,CAAC;QACP,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC;QAEhC,wCAAwC;QACxC,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,WAAW,GAAG,EAAE,IAAI,CAAC;QAEnD,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;QACpD,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;QACvD,OAAO,CAAC,SAAS,GAAG,gBAAgB,QAAQ,KAAK,OAAO,UAAU,CAAC;QACnE,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC/B,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAe,EAAE,cAAsB,CAAC;IACtE,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC;IAEzB,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAClF,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACnD,YAAY,CAAC,SAAS,GAAG,iBAAiB,CAAC;QAE3C,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAoB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC7C,OAAO,GAAG,KAAK,CAAC;gBAChB,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;QACJ,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBAC/B,OAAO,GAAG,KAAK,CAAC;gBAChB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACb,MAAM,cAAc,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC1E,wCAAwC;YACxC,cAAc,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,WAAW,GAAG,EAAE,IAAI,CAAC;YAC1D,YAAY,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,YAAY,CAAC;IACrB,CAAC;IAED,OAAO,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAgB;IAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,IAAI,YAAY,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,SAAS,GAAW,OAAO,KAAK,CAAC,CAAC,oCAAoC;IAE1E,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACpB,SAAS,GAAG,MAAM,CAAC;QACnB,YAAY,GAAG,MAAM,CAAC;IACvB,CAAC;SAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QACnC,YAAY,GAAG,IAAI,KAAK,GAAG,CAAC;IAC7B,CAAC;SAAM,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QACtC,YAAY,GAAG,WAAW,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;IAChC,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACzC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACjD,SAAS,CAAC,SAAS,GAAG,iBAAiB,CAAC;IACxC,SAAS,CAAC,WAAW,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,mBAAmB,CAAC;IACpF,OAAO,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { TArtifactHTTPTrace, THTTPTraceContent } from '@haibun/core/build/lib/interfaces/logger.js';
|
|
2
|
+
export declare class SequenceDiagramGenerator {
|
|
3
|
+
private needsUpdate;
|
|
4
|
+
private diagramLines;
|
|
5
|
+
private pageNames;
|
|
6
|
+
private pageCounter;
|
|
7
|
+
private participantAdded;
|
|
8
|
+
private addParticipant;
|
|
9
|
+
processEvent(trace: THTTPTraceContent, httpEvent: TArtifactHTTPTrace['httpEvent'], filters?: {
|
|
10
|
+
request: {
|
|
11
|
+
method: string[];
|
|
12
|
+
accept: string[];
|
|
13
|
+
};
|
|
14
|
+
response: {
|
|
15
|
+
type: string[];
|
|
16
|
+
};
|
|
17
|
+
}): void;
|
|
18
|
+
getDiagram(): string;
|
|
19
|
+
update(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export declare function skipEvent(filters: any, httpEvent: any, serverName: any, { requestingPage, requestingURL, method, status, statusText, headers }: THTTPTraceContent): boolean;
|
|
22
|
+
//# sourceMappingURL=mermaidDiagram.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mermaidDiagram.d.ts","sourceRoot":"","sources":["../../src/monitor/mermaidDiagram.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAyBpG,qBAAa,wBAAwB;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,gBAAgB,CAA+B;IAGvD,OAAO,CAAC,cAAc;IAOf,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,kBAAkB,CAAC,WAAW,CAAC,EAAE,OAAO;;;;;;;;KAAc,GAAG,IAAI;IAwF/G,UAAU,IAAI,MAAM;IAGd,MAAM;CAsCnB;AACD,wBAAgB,SAAS,CAAC,OAAO,KAAA,EAAE,SAAS,KAAA,EAAE,UAAU,KAAA,EAAE,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,iBAAiB,WAkClJ"}
|