@ontrails/testing 1.0.0-beta.3 → 1.0.0-beta.5
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-lint.log +1 -1
- package/CHANGELOG.md +36 -0
- package/README.md +6 -7
- package/dist/contracts.d.ts +3 -3
- package/dist/contracts.js +6 -6
- package/dist/contracts.js.map +1 -1
- package/dist/examples.d.ts +2 -2
- package/dist/examples.d.ts.map +1 -1
- package/dist/examples.js +43 -55
- package/dist/examples.js.map +1 -1
- package/dist/follows.d.ts +32 -0
- package/dist/follows.d.ts.map +1 -0
- package/dist/{hike.js → follows.js} +15 -15
- package/dist/follows.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/trail.js +1 -1
- package/dist/trail.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/contracts.test.ts +15 -14
- package/src/__tests__/detours.test.ts +3 -3
- package/src/__tests__/examples.test.ts +21 -22
- package/src/__tests__/{hike.test.ts → follows.test.ts} +27 -28
- package/src/__tests__/trail.test.ts +4 -4
- package/src/contracts.ts +7 -7
- package/src/examples.ts +55 -91
- package/src/{hike.ts → follows.ts} +30 -30
- package/src/index.ts +3 -3
- package/src/trail.ts +1 -1
- package/src/types.ts +3 -3
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/hike.d.ts +0 -32
- package/dist/hike.d.ts.map +0 -1
- package/dist/hike.js.map +0 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* testFollows — composition-aware scenario testing for trails with follow.
|
|
3
3
|
*
|
|
4
|
-
* Tests the
|
|
4
|
+
* Tests the follow graph: which trails were followed, in what order,
|
|
5
5
|
* and supports failure injection from followed trail examples.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { describe, expect, test } from 'bun:test';
|
|
9
9
|
|
|
10
|
-
import type {
|
|
10
|
+
import type { AnyTrail, FollowFn, TrailContext } from '@ontrails/core';
|
|
11
11
|
import {
|
|
12
12
|
InternalError,
|
|
13
13
|
Result,
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
expectOk,
|
|
23
23
|
} from './assertions.js';
|
|
24
24
|
import { mergeTestContext } from './context.js';
|
|
25
|
-
import type {
|
|
25
|
+
import type { FollowScenario } from './types.js';
|
|
26
26
|
|
|
27
27
|
// ---------------------------------------------------------------------------
|
|
28
28
|
// Follow trace
|
|
@@ -58,7 +58,7 @@ const findErrorExample = (
|
|
|
58
58
|
*/
|
|
59
59
|
const tryInjectError = (
|
|
60
60
|
id: string,
|
|
61
|
-
scenario:
|
|
61
|
+
scenario: FollowScenario,
|
|
62
62
|
trailsMap: ReadonlyMap<string, AnyTrail> | undefined
|
|
63
63
|
): Result<unknown, Error> | undefined => {
|
|
64
64
|
const injection = scenario.injectFromExample?.[id];
|
|
@@ -101,7 +101,7 @@ const executeFromMap = (
|
|
|
101
101
|
if (validated.isErr()) {
|
|
102
102
|
return validated;
|
|
103
103
|
}
|
|
104
|
-
return trailDef.
|
|
104
|
+
return trailDef.run(validated.value, ctx);
|
|
105
105
|
};
|
|
106
106
|
|
|
107
107
|
// ---------------------------------------------------------------------------
|
|
@@ -113,7 +113,7 @@ const executeFromMap = (
|
|
|
113
113
|
*/
|
|
114
114
|
const createRecordingFollow = (
|
|
115
115
|
trace: FollowRecord[],
|
|
116
|
-
scenario:
|
|
116
|
+
scenario: FollowScenario,
|
|
117
117
|
trailsMap: ReadonlyMap<string, AnyTrail> | undefined,
|
|
118
118
|
baseFollow: FollowFn | undefined,
|
|
119
119
|
ctx: TrailContext
|
|
@@ -148,8 +148,8 @@ const createRecordingFollow = (
|
|
|
148
148
|
|
|
149
149
|
const assertScenarioResult = (
|
|
150
150
|
result: Result<unknown, Error>,
|
|
151
|
-
scenario:
|
|
152
|
-
|
|
151
|
+
scenario: FollowScenario,
|
|
152
|
+
trailDef: AnyTrail
|
|
153
153
|
): void => {
|
|
154
154
|
if (scenario.expectValue !== undefined) {
|
|
155
155
|
assertFullMatch(result, scenario.expectValue);
|
|
@@ -162,13 +162,13 @@ const assertScenarioResult = (
|
|
|
162
162
|
}
|
|
163
163
|
} else if (scenario.expectOk === true) {
|
|
164
164
|
expect(result.isOk()).toBe(true);
|
|
165
|
-
assertSchemaMatch(result,
|
|
165
|
+
assertSchemaMatch(result, trailDef.output);
|
|
166
166
|
}
|
|
167
167
|
};
|
|
168
168
|
|
|
169
169
|
const assertFollowTrace = (
|
|
170
170
|
trace: readonly FollowRecord[],
|
|
171
|
-
scenario:
|
|
171
|
+
scenario: FollowScenario
|
|
172
172
|
): void => {
|
|
173
173
|
if (scenario.expectFollowed !== undefined) {
|
|
174
174
|
const followedIds = trace.map((r) => r.id);
|
|
@@ -185,7 +185,7 @@ const assertFollowTrace = (
|
|
|
185
185
|
|
|
186
186
|
const handleValidationError = (
|
|
187
187
|
validated: Result<unknown, Error>,
|
|
188
|
-
scenario:
|
|
188
|
+
scenario: FollowScenario
|
|
189
189
|
): boolean => {
|
|
190
190
|
if (!validated.isErr()) {
|
|
191
191
|
return false;
|
|
@@ -207,7 +207,7 @@ const handleValidationError = (
|
|
|
207
207
|
// ---------------------------------------------------------------------------
|
|
208
208
|
|
|
209
209
|
const buildTestContext = (
|
|
210
|
-
scenario:
|
|
210
|
+
scenario: FollowScenario,
|
|
211
211
|
ctx: Partial<TrailContext> | undefined,
|
|
212
212
|
trailsMap: ReadonlyMap<string, AnyTrail> | undefined
|
|
213
213
|
): { trace: FollowRecord[]; testCtx: TrailContext } => {
|
|
@@ -224,28 +224,28 @@ const buildTestContext = (
|
|
|
224
224
|
};
|
|
225
225
|
|
|
226
226
|
const runScenario = async (
|
|
227
|
-
|
|
228
|
-
scenario:
|
|
227
|
+
trailDef: AnyTrail,
|
|
228
|
+
scenario: FollowScenario,
|
|
229
229
|
ctx: Partial<TrailContext> | undefined,
|
|
230
230
|
trailsMap: ReadonlyMap<string, AnyTrail> | undefined
|
|
231
231
|
): Promise<void> => {
|
|
232
|
-
const validated = validateInput(
|
|
232
|
+
const validated = validateInput(trailDef.input, scenario.input);
|
|
233
233
|
if (handleValidationError(validated, scenario)) {
|
|
234
234
|
return;
|
|
235
235
|
}
|
|
236
236
|
|
|
237
237
|
const { trace, testCtx } = buildTestContext(scenario, ctx, trailsMap);
|
|
238
|
-
const result = await
|
|
238
|
+
const result = await trailDef.run(expectOk(validated), testCtx);
|
|
239
239
|
assertFollowTrace(trace, scenario);
|
|
240
|
-
assertScenarioResult(result, scenario,
|
|
240
|
+
assertScenarioResult(result, scenario, trailDef);
|
|
241
241
|
};
|
|
242
242
|
|
|
243
243
|
// ---------------------------------------------------------------------------
|
|
244
|
-
//
|
|
244
|
+
// testFollows
|
|
245
245
|
// ---------------------------------------------------------------------------
|
|
246
246
|
|
|
247
|
-
/** Options for
|
|
248
|
-
export interface
|
|
247
|
+
/** Options for testFollows that provide trail definitions for injection. */
|
|
248
|
+
export interface TestFollowOptions {
|
|
249
249
|
/** Partial context overrides. */
|
|
250
250
|
readonly ctx?: Partial<TrailContext> | undefined;
|
|
251
251
|
/** Map of trail ID to trail definition, used for injectFromExample. */
|
|
@@ -253,11 +253,11 @@ export interface TestHikeOptions {
|
|
|
253
253
|
}
|
|
254
254
|
|
|
255
255
|
/**
|
|
256
|
-
* Generate a describe block for a
|
|
256
|
+
* Generate a describe block for a composition trail with one test per scenario.
|
|
257
257
|
*
|
|
258
258
|
* @example
|
|
259
259
|
* ```ts
|
|
260
|
-
*
|
|
260
|
+
* testFollows(onboardTrail, [
|
|
261
261
|
* {
|
|
262
262
|
* description: "follows add then relate",
|
|
263
263
|
* input: { name: "Alpha" },
|
|
@@ -267,16 +267,16 @@ export interface TestHikeOptions {
|
|
|
267
267
|
* ]);
|
|
268
268
|
* ```
|
|
269
269
|
*/
|
|
270
|
-
export const
|
|
271
|
-
|
|
272
|
-
scenarios: readonly
|
|
273
|
-
options?:
|
|
270
|
+
export const testFollows = (
|
|
271
|
+
trailDef: AnyTrail,
|
|
272
|
+
scenarios: readonly FollowScenario[],
|
|
273
|
+
options?: TestFollowOptions
|
|
274
274
|
): void => {
|
|
275
|
-
describe(
|
|
275
|
+
describe(trailDef.id, () => {
|
|
276
276
|
test.each([...scenarios])(
|
|
277
277
|
'$description',
|
|
278
|
-
async (scenario:
|
|
279
|
-
await runScenario(
|
|
278
|
+
async (scenario: FollowScenario) => {
|
|
279
|
+
await runScenario(trailDef, scenario, options?.ctx, options?.trails);
|
|
280
280
|
}
|
|
281
281
|
);
|
|
282
282
|
});
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Contract-driven testing
|
|
2
2
|
export { testAll } from './all.js';
|
|
3
3
|
export { testExamples } from './examples.js';
|
|
4
|
-
export {
|
|
4
|
+
export { testFollows } from './follows.js';
|
|
5
5
|
export { testTrail } from './trail.js';
|
|
6
6
|
export { testContracts } from './contracts.js';
|
|
7
7
|
export { testDetours } from './detours.js';
|
|
@@ -24,10 +24,10 @@ export { createCliHarness } from './harness-cli.js';
|
|
|
24
24
|
export { createMcpHarness } from './harness-mcp.js';
|
|
25
25
|
|
|
26
26
|
// Types
|
|
27
|
-
export type {
|
|
27
|
+
export type { TestFollowOptions } from './follows.js';
|
|
28
28
|
|
|
29
29
|
export type {
|
|
30
|
-
|
|
30
|
+
FollowScenario,
|
|
31
31
|
TestScenario,
|
|
32
32
|
TestLogger,
|
|
33
33
|
TestTrailContextOptions,
|
package/src/trail.ts
CHANGED
|
@@ -82,7 +82,7 @@ const runScenario = async (
|
|
|
82
82
|
}
|
|
83
83
|
const validatedInput = expectOk(validated);
|
|
84
84
|
|
|
85
|
-
const result = await trailDef.
|
|
85
|
+
const result = await trailDef.run(validatedInput, testCtx);
|
|
86
86
|
assertScenarioResult(result, scenario, trailDef);
|
|
87
87
|
};
|
|
88
88
|
|
package/src/types.ts
CHANGED
|
@@ -26,11 +26,11 @@ export interface TestScenario {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
// ---------------------------------------------------------------------------
|
|
29
|
-
//
|
|
29
|
+
// Follow Scenario (for testFollows)
|
|
30
30
|
// ---------------------------------------------------------------------------
|
|
31
31
|
|
|
32
|
-
/** A test scenario for a
|
|
33
|
-
export interface
|
|
32
|
+
/** A test scenario for a trail's composition graph. */
|
|
33
|
+
export interface FollowScenario extends TestScenario {
|
|
34
34
|
/** Assert these trail IDs were followed, in order. */
|
|
35
35
|
readonly expectFollowed?: readonly string[] | undefined;
|
|
36
36
|
/** Assert follow counts per trail ID. */
|
package/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["./src/all.ts","./src/assertions.ts","./src/context.ts","./src/contracts.ts","./src/detours.ts","./src/examples.ts","./src/
|
|
1
|
+
{"root":["./src/all.ts","./src/assertions.ts","./src/context.ts","./src/contracts.ts","./src/detours.ts","./src/examples.ts","./src/follows.ts","./src/harness-cli.ts","./src/harness-mcp.ts","./src/index.ts","./src/logger.ts","./src/trail.ts","./src/types.ts"],"version":"5.9.3"}
|
package/dist/hike.d.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* testHike — composition-aware scenario testing for hikes.
|
|
3
|
-
*
|
|
4
|
-
* Tests the composition graph: which trails were followed, in what order,
|
|
5
|
-
* and supports failure injection from followed trail examples.
|
|
6
|
-
*/
|
|
7
|
-
import type { AnyHike, AnyTrail, TrailContext } from '@ontrails/core';
|
|
8
|
-
import type { HikeScenario } from './types.js';
|
|
9
|
-
/** Options for testHike that provide trail definitions for injection. */
|
|
10
|
-
export interface TestHikeOptions {
|
|
11
|
-
/** Partial context overrides. */
|
|
12
|
-
readonly ctx?: Partial<TrailContext> | undefined;
|
|
13
|
-
/** Map of trail ID to trail definition, used for injectFromExample. */
|
|
14
|
-
readonly trails?: ReadonlyMap<string, AnyTrail> | undefined;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Generate a describe block for a hike with one test per scenario.
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```ts
|
|
21
|
-
* testHike(onboardHike, [
|
|
22
|
-
* {
|
|
23
|
-
* description: "follows add then relate",
|
|
24
|
-
* input: { name: "Alpha" },
|
|
25
|
-
* expectOk: true,
|
|
26
|
-
* expectFollowed: ["entity.add", "entity.relate"],
|
|
27
|
-
* },
|
|
28
|
-
* ]);
|
|
29
|
-
* ```
|
|
30
|
-
*/
|
|
31
|
-
export declare const testHike: (hikeDef: AnyHike, scenarios: readonly HikeScenario[], options?: TestHikeOptions) => void;
|
|
32
|
-
//# sourceMappingURL=hike.d.ts.map
|
package/dist/hike.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hike.d.ts","sourceRoot":"","sources":["../src/hike.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAY,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAehF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA8N/C,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IACjD,uEAAuE;IACvE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC;CAC7D;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,QAAQ,GACnB,SAAS,OAAO,EAChB,WAAW,SAAS,YAAY,EAAE,EAClC,UAAU,eAAe,KACxB,IASF,CAAC"}
|
package/dist/hike.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hike.js","sourceRoot":"","sources":["../src/hike.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGlD,OAAO,EACL,aAAa,EACb,MAAM,EACN,eAAe,EACf,aAAa,GACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,QAAQ,GACT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAYhD,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,gBAAgB,GAAG,CACvB,QAAkB,EAClB,WAAmB,EACC,EAAE;IACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CACrC,CAAC,EAAE,EAAE,EAAE,CACL,EAAE,CAAC,KAAK,KAAK,SAAS;QACtB,CAAC,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAC3E,CAAC;IACF,OAAO,OAAO,EAAE,KAAK,CAAC;AACxB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,cAAc,GAAG,CACrB,EAAU,EACV,QAAsB,EACtB,SAAoD,EAChB,EAAE;IACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC;IACnD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,GAAG,CACf,IAAI,aAAa,CAAC,yBAAyB,EAAE,eAAe,CAAC,CAC9D,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACxD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,GAAG,CACf,IAAI,aAAa,CACf,8BAA8B,SAAS,eAAe,EAAE,GAAG,CAC5D,CACF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,cAAc,GAAG,CACrB,EAAU,EACV,KAAc,EACd,SAAoD,EACpD,GAAiB,EACqD,EAAE;IACxE,MAAM,QAAQ,GAAG,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACvD,IAAI,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,qBAAqB,GAAG,CAC5B,KAAqB,EACrB,QAAsB,EACtB,SAAoD,EACpD,UAAgC,EAChC,GAAiB,EACP,EAAE;IACZ,mEAAmE;IACnE,oEAAoE;IACpE,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,KAAc,EAAE,EAAE;QAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACzD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC3D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC;IACF,OAAO,MAAkB,CAAC;AAC5B,CAAC,CAAC;AAEF,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,MAAM,oBAAoB,GAAG,CAC3B,MAA8B,EAC9B,QAAsB,EACtB,OAAgB,EACV,EAAE;IACR,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACvC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;SAAM,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5C,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC1E,CAAC;SAAM,IAAI,QAAQ,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CACxB,KAA8B,EAC9B,QAAsB,EAChB,EAAE;IACR,IAAI,QAAQ,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,QAAQ,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,QAAQ,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAC5B,SAAiC,EACjC,QAAsB,EACb,EAAE;IACX,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS,KAAK,eAAe,EAAE,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QACxD,IAAI,QAAQ,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,KAAK,CACb,yCAAyC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,CACnE,CAAC;AACJ,CAAC,CAAC;AAEF,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,gBAAgB,GAAG,CACvB,QAAsB,EACtB,GAAsC,EACtC,SAAoD,EACF,EAAE;IACpD,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,qBAAqB,CAClC,KAAK,EACL,QAAQ,EACR,SAAS,EACT,OAAO,CAAC,MAAM,EACd,OAAO,CACR,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,KAAK,EACvB,OAAgB,EAChB,QAAsB,EACtB,GAAsC,EACtC,SAAoD,EACrC,EAAE;IACjB,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/D,IAAI,qBAAqB,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1E,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnC,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC,CAAC;AAcF;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,OAAgB,EAChB,SAAkC,EAClC,OAAyB,EACnB,EAAE;IACR,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE;QACxB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CACvB,cAAc,EACd,KAAK,EAAE,QAAsB,EAAE,EAAE;YAC/B,MAAM,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACtE,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|