@sharpee/transcript-tester 0.9.61-beta
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/.turbo/turbo-build.log +4 -0
- package/LICENSE +21 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +367 -0
- package/dist/cli.js.map +1 -0
- package/dist/condition-evaluator.d.ts +30 -0
- package/dist/condition-evaluator.d.ts.map +1 -0
- package/dist/condition-evaluator.js +314 -0
- package/dist/condition-evaluator.js.map +1 -0
- package/dist/fast-cli.d.ts +13 -0
- package/dist/fast-cli.d.ts.map +1 -0
- package/dist/fast-cli.js +363 -0
- package/dist/fast-cli.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/navigator.d.ts +27 -0
- package/dist/navigator.d.ts.map +1 -0
- package/dist/navigator.js +303 -0
- package/dist/navigator.js.map +1 -0
- package/dist/parser.d.ts +19 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +453 -0
- package/dist/parser.js.map +1 -0
- package/dist/reporter.d.ts +41 -0
- package/dist/reporter.d.ts.map +1 -0
- package/dist/reporter.js +386 -0
- package/dist/reporter.js.map +1 -0
- package/dist/runner.d.ts +44 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +977 -0
- package/dist/runner.js.map +1 -0
- package/dist/story-loader.d.ts +31 -0
- package/dist/story-loader.d.ts.map +1 -0
- package/dist/story-loader.js +169 -0
- package/dist/story-loader.js.map +1 -0
- package/dist/types.d.ts +204 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist-esm/cli.d.ts +11 -0
- package/dist-esm/cli.d.ts.map +1 -0
- package/dist-esm/cli.js +332 -0
- package/dist-esm/cli.js.map +1 -0
- package/dist-esm/condition-evaluator.d.ts +30 -0
- package/dist-esm/condition-evaluator.d.ts.map +1 -0
- package/dist-esm/condition-evaluator.js +311 -0
- package/dist-esm/condition-evaluator.js.map +1 -0
- package/dist-esm/fast-cli.d.ts +13 -0
- package/dist-esm/fast-cli.d.ts.map +1 -0
- package/dist-esm/fast-cli.js +328 -0
- package/dist-esm/fast-cli.js.map +1 -0
- package/dist-esm/index.d.ts +17 -0
- package/dist-esm/index.d.ts.map +1 -0
- package/dist-esm/index.js +21 -0
- package/dist-esm/index.js.map +1 -0
- package/dist-esm/navigator.d.ts +27 -0
- package/dist-esm/navigator.d.ts.map +1 -0
- package/dist-esm/navigator.js +300 -0
- package/dist-esm/navigator.js.map +1 -0
- package/dist-esm/parser.d.ts +19 -0
- package/dist-esm/parser.d.ts.map +1 -0
- package/dist-esm/parser.js +415 -0
- package/dist-esm/parser.js.map +1 -0
- package/dist-esm/reporter.d.ts +41 -0
- package/dist-esm/reporter.d.ts.map +1 -0
- package/dist-esm/reporter.js +342 -0
- package/dist-esm/reporter.js.map +1 -0
- package/dist-esm/runner.d.ts +44 -0
- package/dist-esm/runner.d.ts.map +1 -0
- package/dist-esm/runner.js +941 -0
- package/dist-esm/runner.js.map +1 -0
- package/dist-esm/story-loader.d.ts +31 -0
- package/dist-esm/story-loader.d.ts.map +1 -0
- package/dist-esm/story-loader.js +131 -0
- package/dist-esm/story-loader.js.map +1 -0
- package/dist-esm/types.d.ts +204 -0
- package/dist-esm/types.d.ts.map +1 -0
- package/dist-esm/types.js +7 -0
- package/dist-esm/types.js.map +1 -0
- package/dist-npm/cli.d.ts +11 -0
- package/dist-npm/cli.d.ts.map +1 -0
- package/dist-npm/cli.js +367 -0
- package/dist-npm/cli.js.map +1 -0
- package/dist-npm/condition-evaluator.d.ts +30 -0
- package/dist-npm/condition-evaluator.d.ts.map +1 -0
- package/dist-npm/condition-evaluator.js +314 -0
- package/dist-npm/condition-evaluator.js.map +1 -0
- package/dist-npm/fast-cli.d.ts +13 -0
- package/dist-npm/fast-cli.d.ts.map +1 -0
- package/dist-npm/fast-cli.js +363 -0
- package/dist-npm/fast-cli.js.map +1 -0
- package/dist-npm/index.d.ts +17 -0
- package/dist-npm/index.d.ts.map +1 -0
- package/dist-npm/index.js +48 -0
- package/dist-npm/index.js.map +1 -0
- package/dist-npm/navigator.d.ts +27 -0
- package/dist-npm/navigator.d.ts.map +1 -0
- package/dist-npm/navigator.js +303 -0
- package/dist-npm/navigator.js.map +1 -0
- package/dist-npm/parser.d.ts +19 -0
- package/dist-npm/parser.d.ts.map +1 -0
- package/dist-npm/parser.js +453 -0
- package/dist-npm/parser.js.map +1 -0
- package/dist-npm/reporter.d.ts +41 -0
- package/dist-npm/reporter.d.ts.map +1 -0
- package/dist-npm/reporter.js +386 -0
- package/dist-npm/reporter.js.map +1 -0
- package/dist-npm/runner.d.ts +44 -0
- package/dist-npm/runner.d.ts.map +1 -0
- package/dist-npm/runner.js +977 -0
- package/dist-npm/runner.js.map +1 -0
- package/dist-npm/story-loader.d.ts +31 -0
- package/dist-npm/story-loader.d.ts.map +1 -0
- package/dist-npm/story-loader.js +169 -0
- package/dist-npm/story-loader.js.map +1 -0
- package/dist-npm/types.d.ts +204 -0
- package/dist-npm/types.d.ts.map +1 -0
- package/dist-npm/types.js +8 -0
- package/dist-npm/types.js.map +1 -0
- package/package.json +49 -0
- package/src/cli.ts +385 -0
- package/src/condition-evaluator.ts +382 -0
- package/src/fast-cli.ts +403 -0
- package/src/index.ts +26 -0
- package/src/navigator.ts +365 -0
- package/src/parser.ts +488 -0
- package/src/reporter.ts +409 -0
- package/src/runner.ts +1152 -0
- package/src/story-loader.ts +168 -0
- package/src/types.ts +244 -0
- package/tsconfig.esm.json +11 -0
- package/tsconfig.esm.tsbuildinfo +1 -0
- package/tsconfig.json +22 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Navigator for Smart Transcript Directives (ADR-092)
|
|
4
|
+
*
|
|
5
|
+
* Handles NAVIGATE TO directives by pathfinding to target rooms
|
|
6
|
+
* and executing GO commands. Handles random outcomes (e.g., Round Room
|
|
7
|
+
* carousel) by recalculating path when actual location differs from expected.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.executeNavigate = executeNavigate;
|
|
11
|
+
// Constants
|
|
12
|
+
const MAX_NAVIGATE_ATTEMPTS = 50; // Max attempts to handle random outcomes
|
|
13
|
+
const ROOM_TRAIT_TYPE = 'if.trait.room';
|
|
14
|
+
/**
|
|
15
|
+
* Calculate room-to-room distance using BFS
|
|
16
|
+
* Returns Infinity if no path exists
|
|
17
|
+
*/
|
|
18
|
+
function calculateRoomDistance(world, fromRoomId, toRoomId) {
|
|
19
|
+
if (fromRoomId === toRoomId)
|
|
20
|
+
return 0;
|
|
21
|
+
const visited = new Set();
|
|
22
|
+
const queue = [{ roomId: fromRoomId, distance: 0 }];
|
|
23
|
+
while (queue.length > 0) {
|
|
24
|
+
const { roomId, distance } = queue.shift();
|
|
25
|
+
if (visited.has(roomId))
|
|
26
|
+
continue;
|
|
27
|
+
visited.add(roomId);
|
|
28
|
+
const room = world.getEntity(roomId);
|
|
29
|
+
const roomTrait = room?.get?.('room') || room?.getTrait?.('room');
|
|
30
|
+
if (!roomTrait?.exits)
|
|
31
|
+
continue;
|
|
32
|
+
for (const [_direction, exitInfo] of Object.entries(roomTrait.exits)) {
|
|
33
|
+
if (!exitInfo)
|
|
34
|
+
continue;
|
|
35
|
+
let dest;
|
|
36
|
+
if (typeof exitInfo === 'string') {
|
|
37
|
+
dest = exitInfo;
|
|
38
|
+
}
|
|
39
|
+
else if (typeof exitInfo === 'object') {
|
|
40
|
+
dest = exitInfo.destination;
|
|
41
|
+
}
|
|
42
|
+
if (!dest)
|
|
43
|
+
continue;
|
|
44
|
+
// Found destination!
|
|
45
|
+
if (dest === toRoomId) {
|
|
46
|
+
return distance + 1;
|
|
47
|
+
}
|
|
48
|
+
// Add to queue if not visited
|
|
49
|
+
if (!visited.has(dest)) {
|
|
50
|
+
queue.push({ roomId: dest, distance: distance + 1 });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return Infinity; // No path found
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Find a room by name (searches identity.name)
|
|
58
|
+
*/
|
|
59
|
+
function findRoomByName(world, name) {
|
|
60
|
+
const nameLower = name.toLowerCase();
|
|
61
|
+
const rooms = world.findWhere((entity) => {
|
|
62
|
+
// Check if it's a room
|
|
63
|
+
const roomTrait = entity.get?.('room') || entity.traits?.get?.('room');
|
|
64
|
+
if (!roomTrait)
|
|
65
|
+
return false;
|
|
66
|
+
const identity = entity.get?.('identity') || entity.traits?.get?.('identity');
|
|
67
|
+
if (!identity)
|
|
68
|
+
return false;
|
|
69
|
+
const entityName = (identity.name || '').toLowerCase();
|
|
70
|
+
const aliases = (identity.aliases || []).map((a) => a.toLowerCase());
|
|
71
|
+
return entityName === nameLower ||
|
|
72
|
+
entityName.includes(nameLower) ||
|
|
73
|
+
aliases.some((a) => a === nameLower || a.includes(nameLower));
|
|
74
|
+
});
|
|
75
|
+
return rooms[0] || null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get the name of a room by ID
|
|
79
|
+
*/
|
|
80
|
+
function getRoomName(world, roomId) {
|
|
81
|
+
const room = world.getEntity(roomId);
|
|
82
|
+
if (!room)
|
|
83
|
+
return roomId;
|
|
84
|
+
const identity = room.get?.('identity') || room.traits?.get?.('identity');
|
|
85
|
+
return identity?.name || roomId;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the direction that leads from one room to another
|
|
89
|
+
*/
|
|
90
|
+
function getDirectionToRoom(world, fromRoomId, toRoomId) {
|
|
91
|
+
const fromRoom = world.getEntity(fromRoomId);
|
|
92
|
+
if (!fromRoom)
|
|
93
|
+
return null;
|
|
94
|
+
const roomTrait = fromRoom.get?.('room') || fromRoom.traits?.get?.('room');
|
|
95
|
+
if (!roomTrait || !roomTrait.exits)
|
|
96
|
+
return null;
|
|
97
|
+
// Check each exit to find one that leads to the target room
|
|
98
|
+
for (const [direction, exitInfo] of Object.entries(roomTrait.exits)) {
|
|
99
|
+
if (!exitInfo)
|
|
100
|
+
continue;
|
|
101
|
+
let destination;
|
|
102
|
+
if (typeof exitInfo === 'string') {
|
|
103
|
+
destination = exitInfo;
|
|
104
|
+
}
|
|
105
|
+
else if (typeof exitInfo === 'object') {
|
|
106
|
+
destination = exitInfo.destination;
|
|
107
|
+
}
|
|
108
|
+
if (destination === toRoomId) {
|
|
109
|
+
return direction.toLowerCase();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Execute navigation to a target room
|
|
116
|
+
*
|
|
117
|
+
* Uses pathfinding to find route, executes GO commands, and handles
|
|
118
|
+
* random outcomes by recalculating path from actual location.
|
|
119
|
+
*/
|
|
120
|
+
async function executeNavigate(targetRoomName, world, engine, playerId, verbose = false) {
|
|
121
|
+
const path = [];
|
|
122
|
+
const commands = [];
|
|
123
|
+
// Find target room
|
|
124
|
+
if (verbose) {
|
|
125
|
+
console.log(` [NAVIGATE] Searching for room: "${targetRoomName}"`);
|
|
126
|
+
}
|
|
127
|
+
const targetRoom = findRoomByName(world, targetRoomName);
|
|
128
|
+
if (!targetRoom) {
|
|
129
|
+
if (verbose) {
|
|
130
|
+
// Debug: list all rooms to see what's available
|
|
131
|
+
const allRooms = world.findWhere((e) => {
|
|
132
|
+
const roomTrait = e.get?.('room') || e.getTrait?.('room');
|
|
133
|
+
return !!roomTrait;
|
|
134
|
+
});
|
|
135
|
+
console.log(` [NAVIGATE] Available rooms: ${allRooms.map((r) => {
|
|
136
|
+
const identity = r.get?.('identity') || r.getTrait?.('identity');
|
|
137
|
+
return identity?.name || r.id;
|
|
138
|
+
}).join(', ')}`);
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
success: false,
|
|
142
|
+
path,
|
|
143
|
+
commands,
|
|
144
|
+
error: `Target room "${targetRoomName}" not found`
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
if (verbose) {
|
|
148
|
+
console.log(` [NAVIGATE] Found target room: ${targetRoom.id}`);
|
|
149
|
+
}
|
|
150
|
+
const targetRoomId = targetRoom.id;
|
|
151
|
+
// Check if already at destination
|
|
152
|
+
let currentRoomId = world.getLocation(playerId);
|
|
153
|
+
if (!currentRoomId) {
|
|
154
|
+
return {
|
|
155
|
+
success: false,
|
|
156
|
+
path,
|
|
157
|
+
commands,
|
|
158
|
+
error: 'Player location unknown'
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
if (currentRoomId === targetRoomId) {
|
|
162
|
+
if (verbose) {
|
|
163
|
+
console.log(` [NAVIGATE] Already at "${targetRoomName}"`);
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
success: true,
|
|
167
|
+
path: [getRoomName(world, currentRoomId)],
|
|
168
|
+
commands
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// Navigation loop - keep trying until we reach destination or run out of attempts
|
|
172
|
+
let attempts = 0;
|
|
173
|
+
if (verbose) {
|
|
174
|
+
console.log(` [NAVIGATE] Starting navigation from ${currentRoomId} to ${targetRoomId}`);
|
|
175
|
+
}
|
|
176
|
+
while (attempts < MAX_NAVIGATE_ATTEMPTS) {
|
|
177
|
+
attempts++;
|
|
178
|
+
currentRoomId = world.getLocation(playerId);
|
|
179
|
+
if (!currentRoomId) {
|
|
180
|
+
return {
|
|
181
|
+
success: false,
|
|
182
|
+
path,
|
|
183
|
+
commands,
|
|
184
|
+
error: 'Player location unknown'
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
// Already at destination?
|
|
188
|
+
if (currentRoomId === targetRoomId) {
|
|
189
|
+
if (verbose) {
|
|
190
|
+
console.log(` [NAVIGATE] Arrived at "${targetRoomName}" after ${commands.length} commands`);
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
success: true,
|
|
194
|
+
path,
|
|
195
|
+
commands
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
// Find an exit that leads toward the destination
|
|
199
|
+
// We check each exit and verify it leads closer using findPath
|
|
200
|
+
const currentRoom = world.getEntity(currentRoomId);
|
|
201
|
+
const roomTrait = currentRoom?.get?.('room') || currentRoom?.getTrait?.('room');
|
|
202
|
+
if (!roomTrait?.exits) {
|
|
203
|
+
return {
|
|
204
|
+
success: false,
|
|
205
|
+
path,
|
|
206
|
+
commands,
|
|
207
|
+
error: `No exits from "${getRoomName(world, currentRoomId)}"`
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
// Find the best exit (one that gets us closest to destination)
|
|
211
|
+
let nextRoomId = null;
|
|
212
|
+
let bestDirection = null;
|
|
213
|
+
let shortestPathLength = Infinity;
|
|
214
|
+
for (const [direction, exitInfo] of Object.entries(roomTrait.exits)) {
|
|
215
|
+
if (!exitInfo)
|
|
216
|
+
continue;
|
|
217
|
+
let dest;
|
|
218
|
+
if (typeof exitInfo === 'string') {
|
|
219
|
+
dest = exitInfo;
|
|
220
|
+
}
|
|
221
|
+
else if (typeof exitInfo === 'object') {
|
|
222
|
+
dest = exitInfo.destination;
|
|
223
|
+
}
|
|
224
|
+
if (!dest)
|
|
225
|
+
continue;
|
|
226
|
+
// If this exit leads directly to destination, use it immediately
|
|
227
|
+
if (dest === targetRoomId) {
|
|
228
|
+
nextRoomId = dest;
|
|
229
|
+
bestDirection = direction;
|
|
230
|
+
shortestPathLength = 0;
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
// Calculate actual room distance from this exit to destination
|
|
234
|
+
const distanceFromDest = calculateRoomDistance(world, dest, targetRoomId);
|
|
235
|
+
if (distanceFromDest < Infinity && distanceFromDest < shortestPathLength) {
|
|
236
|
+
nextRoomId = dest;
|
|
237
|
+
bestDirection = direction;
|
|
238
|
+
shortestPathLength = distanceFromDest;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (!nextRoomId || !bestDirection) {
|
|
242
|
+
return {
|
|
243
|
+
success: false,
|
|
244
|
+
path,
|
|
245
|
+
commands,
|
|
246
|
+
error: `No path from "${getRoomName(world, currentRoomId)}" toward "${targetRoomName}"`
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
// Record current room name
|
|
250
|
+
const currentRoomName = getRoomName(world, currentRoomId);
|
|
251
|
+
if (path.length === 0 || path[path.length - 1] !== currentRoomName) {
|
|
252
|
+
path.push(currentRoomName);
|
|
253
|
+
}
|
|
254
|
+
// Execute direction command (parser uses just the direction, not "go direction")
|
|
255
|
+
const command = bestDirection.toLowerCase();
|
|
256
|
+
commands.push(command);
|
|
257
|
+
if (verbose) {
|
|
258
|
+
console.log(` [NAVIGATE] ${currentRoomName} -> go ${bestDirection.toLowerCase()}`);
|
|
259
|
+
}
|
|
260
|
+
try {
|
|
261
|
+
await engine.executeCommand(command);
|
|
262
|
+
}
|
|
263
|
+
catch (e) {
|
|
264
|
+
return {
|
|
265
|
+
success: false,
|
|
266
|
+
path,
|
|
267
|
+
commands,
|
|
268
|
+
error: `Command failed: ${command} - ${e instanceof Error ? e.message : String(e)}`
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
// Verify we moved to expected room (or handle random outcome)
|
|
272
|
+
const newRoomId = world.getLocation(playerId);
|
|
273
|
+
if (newRoomId !== nextRoomId && newRoomId !== currentRoomId) {
|
|
274
|
+
// We moved, but not to expected room (e.g., Round Room carousel)
|
|
275
|
+
// This is OK - we'll recalculate path from wherever we are
|
|
276
|
+
if (verbose) {
|
|
277
|
+
console.log(` [NAVIGATE] Ended up in "${getRoomName(world, newRoomId)}" (expected "${getRoomName(world, nextRoomId)}")`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
else if (newRoomId === currentRoomId) {
|
|
281
|
+
// Didn't move at all - blocked?
|
|
282
|
+
return {
|
|
283
|
+
success: false,
|
|
284
|
+
path,
|
|
285
|
+
commands,
|
|
286
|
+
error: `Blocked: could not go ${bestDirection.toLowerCase()} from "${currentRoomName}"`
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
// Update path with new location
|
|
290
|
+
if (newRoomId) {
|
|
291
|
+
const newRoomName = getRoomName(world, newRoomId);
|
|
292
|
+
path.push(newRoomName);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// Exceeded max attempts
|
|
296
|
+
return {
|
|
297
|
+
success: false,
|
|
298
|
+
path,
|
|
299
|
+
commands,
|
|
300
|
+
error: `Navigation exceeded ${MAX_NAVIGATE_ATTEMPTS} attempts (random outcomes?)`
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=navigator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigator.js","sourceRoot":"","sources":["../src/navigator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transcript Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses .transcript files into a structured format for testing.
|
|
5
|
+
*/
|
|
6
|
+
import { Transcript } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Parse a transcript file from disk
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseTranscriptFile(filePath: string): Transcript;
|
|
11
|
+
/**
|
|
12
|
+
* Parse transcript content string
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseTranscript(content: string, filePath?: string): Transcript;
|
|
15
|
+
/**
|
|
16
|
+
* Validate a transcript for common issues
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateTranscript(transcript: Transcript): string[];
|
|
19
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,UAAU,EAOX,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAGhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAmB,GAAG,UAAU,CAqI1F;AAgTD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,EAAE,CAkBnE"}
|