@hatiolab/figure-model 0.1.93 → 0.1.95
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/asset-types.d.ts +7 -1
- package/dist/asset-types.d.ts.map +1 -1
- package/dist/asset.d.ts +12 -0
- package/dist/asset.d.ts.map +1 -1
- package/dist/asset.js +29 -8
- package/dist/asset.js.map +1 -1
- package/dist/authoring-actions.d.ts +13 -2
- package/dist/authoring-actions.d.ts.map +1 -1
- package/dist/authoring-actions.js +58 -31
- package/dist/authoring-actions.js.map +1 -1
- package/dist/authoring-session.d.ts +2 -0
- package/dist/authoring-session.d.ts.map +1 -1
- package/dist/authoring-session.js.map +1 -1
- package/dist/clip-keeping.d.ts +30 -0
- package/dist/clip-keeping.d.ts.map +1 -0
- package/dist/clip-keeping.js +77 -0
- package/dist/clip-keeping.js.map +1 -0
- package/dist/command-preview.d.ts +125 -0
- package/dist/command-preview.d.ts.map +1 -0
- package/dist/command-preview.js +246 -0
- package/dist/command-preview.js.map +1 -0
- package/dist/editor-workspace.d.ts +65 -1
- package/dist/editor-workspace.d.ts.map +1 -1
- package/dist/editor-workspace.js +48 -6
- package/dist/editor-workspace.js.map +1 -1
- package/dist/gate.d.ts +8 -0
- package/dist/gate.d.ts.map +1 -1
- package/dist/gate.js +13 -7
- package/dist/gate.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/kernel-version.d.ts +1 -1
- package/dist/kernel-version.js +1 -1
- package/dist/part-edit.d.ts +3 -2
- package/dist/part-edit.d.ts.map +1 -1
- package/dist/part-edit.js +22 -6
- package/dist/part-edit.js.map +1 -1
- package/dist/proposal.d.ts +15 -2
- package/dist/proposal.d.ts.map +1 -1
- package/dist/proposal.js +12 -4
- package/dist/proposal.js.map +1 -1
- package/dist/release-contract.d.ts.map +1 -1
- package/dist/release-contract.js +3 -2
- package/dist/release-contract.js.map +1 -1
- package/dist/resize-plan.d.ts +61 -0
- package/dist/resize-plan.d.ts.map +1 -0
- package/dist/resize-plan.js +189 -0
- package/dist/resize-plan.js.map +1 -0
- package/dist/room.d.ts +53 -0
- package/dist/room.d.ts.map +1 -0
- package/dist/room.js +90 -0
- package/dist/room.js.map +1 -0
- package/dist/shape-provider.d.ts +37 -0
- package/dist/shape-provider.d.ts.map +1 -0
- package/dist/shape-provider.js +69 -0
- package/dist/shape-provider.js.map +1 -0
- package/dist/size-edit.d.ts +38 -0
- package/dist/size-edit.d.ts.map +1 -0
- package/dist/size-edit.js +178 -0
- package/dist/size-edit.js.map +1 -0
- package/package.json +1 -1
|
@@ -3,6 +3,8 @@ import type { FigureUnit } from './graph-types.ts';
|
|
|
3
3
|
export interface FigureEditControl {
|
|
4
4
|
origin: 'ui' | 'ai';
|
|
5
5
|
expectedRevision: number;
|
|
6
|
+
/** The clips the author agreed to let go, as a CLIPS_DROPPED refusal named them (clip-keeping.ts). */
|
|
7
|
+
dropClips?: readonly string[];
|
|
6
8
|
}
|
|
7
9
|
export interface FigureInputChange {
|
|
8
10
|
kind: 'set-design' | 'set-state';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authoring-session.d.ts","sourceRoot":"","sources":["../src/authoring-session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,IAAI,GAAG,IAAI,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"authoring-session.d.ts","sourceRoot":"","sources":["../src/authoring-session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,IAAI,GAAG,IAAI,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,sGAAsG;IACtG,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC9B;AACD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,GAAG,WAAW,CAAA;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CACd;AACD,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAC7B;AA6BD,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;;;;;;;eAmE7F,iBAAiB;;;;;;;;;kBAvGxB,YAAY,GAAG,WAAW;mBACzB,MAAM;kBACP,UAAU;mBACT,MAAM;;;;;;;;;;;;;;;;;aAwGF,iBAAiB;;;;;;;;;;;sBA3GtB,YAAY,GAAG,WAAW;uBACzB,MAAM;sBACP,UAAU;uBACT,MAAM;;;;;;;;;;;;;;;;;;YAkHH,iBAAiB;;;;;;;;;;;;;;;;YAYjB,iBAAiB;;;;;;;;;;;;;;;;EAa5B;AAED,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authoring-session.js","sourceRoot":"","sources":["../src/authoring-session.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,OAAO,EAAE,qBAAqB,IAAI,eAAe,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"authoring-session.js","sourceRoot":"","sources":["../src/authoring-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { FigureContractError } from './contract.ts';
|
|
2
|
+
import type { FigureAsset } from './asset-types.ts';
|
|
3
|
+
/** What the caller agreed to let go: the ids of clips an edit would stop, as a CLIPS_DROPPED refusal named them. */
|
|
4
|
+
export interface FigureClipConsent {
|
|
5
|
+
dropClips?: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
/** A clip an edit would stop playing, and why: its control is gone, or now moves something else, or another way. */
|
|
8
|
+
export interface FigureClipLoss {
|
|
9
|
+
id: string;
|
|
10
|
+
clip: string;
|
|
11
|
+
state: string;
|
|
12
|
+
why: 'gone' | 'changed';
|
|
13
|
+
}
|
|
14
|
+
/** The refusal that asks first: these clips would go; pass their ids as `dropClips` to go ahead. */
|
|
15
|
+
export declare class FigureClipsDroppedError extends FigureContractError {
|
|
16
|
+
readonly clips: FigureClipLoss[];
|
|
17
|
+
constructor(clips: FigureClipLoss[]);
|
|
18
|
+
}
|
|
19
|
+
/** A part renamed: the name it had, the name it has. Ids it owned (`<part>.…`) follow it. */
|
|
20
|
+
export interface FigurePartRenamed {
|
|
21
|
+
from: string;
|
|
22
|
+
to: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The clips of `after`, settled against `before`: each clip of `before` whose control means the same after the edit is
|
|
26
|
+
* kept (on its control's id now, which a rename may have changed); each whose control is gone or means something else
|
|
27
|
+
* goes only if `consent` names it, and otherwise the edit is refused. Clips the edit itself made are kept as it made them.
|
|
28
|
+
*/
|
|
29
|
+
export declare function settleFigureClips(before: FigureAsset, after: FigureAsset, consent?: FigureClipConsent, renamed?: FigurePartRenamed): FigureAsset;
|
|
30
|
+
//# sourceMappingURL=clip-keeping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clip-keeping.d.ts","sourceRoot":"","sources":["../src/clip-keeping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAcnD,oHAAoH;AACpH,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC9B;AAED,oHAAoH;AACpH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CACxB;AAED,oGAAoG;AACpG,qBAAa,uBAAwB,SAAQ,mBAAmB;IAC9D,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAAA;gBACpB,KAAK,EAAE,cAAc,EAAE;CAIpC;AAgBD,6FAA6F;AAC7F,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,GAAE,iBAAsB,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,WAAW,CAuCpJ"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { FigureContractError } from "./contract.js";
|
|
2
|
+
/** The refusal that asks first: these clips would go; pass their ids as `dropClips` to go ahead. */
|
|
3
|
+
export class FigureClipsDroppedError extends FigureContractError {
|
|
4
|
+
clips;
|
|
5
|
+
constructor(clips) {
|
|
6
|
+
super('CLIPS_DROPPED', 'drivers', `${clips.map(c => `${c.clip} (${c.state})`).join(', ')} would stop playing; agree to it by naming them in dropClips`);
|
|
7
|
+
this.clips = clips;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const stateIdOf = (j) => j.state?.id ?? j.id;
|
|
11
|
+
function meaningOf(asset, state) {
|
|
12
|
+
const input = asset.document.model.inputs.find(i => i.id === state && i.role === 'state');
|
|
13
|
+
if (!input)
|
|
14
|
+
return { kind: 'gone' };
|
|
15
|
+
if (typeof input.unit !== 'string' || !input.unit)
|
|
16
|
+
return { kind: 'unknown', why: `${state} has no unit` };
|
|
17
|
+
const owners = (asset.joints ?? []).filter(j => j.type !== 'fixed' && !j.mimic && stateIdOf(j) === state);
|
|
18
|
+
if (owners.length)
|
|
19
|
+
return { kind: 'joint', joints: owners.map(j => ({ id: j.id, type: j.type })), unit: input.unit };
|
|
20
|
+
return { kind: 'free', unit: input.unit };
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The clips of `after`, settled against `before`: each clip of `before` whose control means the same after the edit is
|
|
24
|
+
* kept (on its control's id now, which a rename may have changed); each whose control is gone or means something else
|
|
25
|
+
* goes only if `consent` names it, and otherwise the edit is refused. Clips the edit itself made are kept as it made them.
|
|
26
|
+
*/
|
|
27
|
+
export function settleFigureClips(before, after, consent = {}, renamed) {
|
|
28
|
+
const clips = before.drivers ?? [];
|
|
29
|
+
if (!clips.length)
|
|
30
|
+
return after;
|
|
31
|
+
const map = (id) => (!renamed ? id : id === renamed.from ? renamed.to : id.startsWith(`${renamed.from}.`) ? renamed.to + id.slice(renamed.from.length) : id);
|
|
32
|
+
const madeAfter = new Map((after.drivers ?? []).map(d => [d.id, d]));
|
|
33
|
+
const kept = [];
|
|
34
|
+
const lost = [];
|
|
35
|
+
const settled = new Set();
|
|
36
|
+
for (const clip of clips) {
|
|
37
|
+
const was = meaningOf(before, clip.state);
|
|
38
|
+
if (was.kind === 'unknown')
|
|
39
|
+
throw new FigureContractError('CLIP_MEANING', `drivers.${clip.id}`, `what ${clip.clip} plays cannot be told: ${was.why}`);
|
|
40
|
+
if (was.kind === 'gone')
|
|
41
|
+
throw new FigureContractError('CLIP_MEANING', `drivers.${clip.id}`, `${clip.clip} plays ${clip.state}, which is not a control of this figure`);
|
|
42
|
+
let state;
|
|
43
|
+
if (was.kind === 'joint') {
|
|
44
|
+
/* Where the joints that moved it are now: their control, if they still move and still name one control. */
|
|
45
|
+
const joints = (after.joints ?? []).filter(j => was.joints.some(w => map(w.id) === j.id) && j.type !== 'fixed' && !j.mimic);
|
|
46
|
+
const named = new Set(joints.map(stateIdOf));
|
|
47
|
+
state = joints.length && named.size === 1 ? [...named][0] : undefined;
|
|
48
|
+
}
|
|
49
|
+
else
|
|
50
|
+
state = map(clip.state);
|
|
51
|
+
const now = state === undefined ? { kind: 'gone' } : meaningOf(after, state);
|
|
52
|
+
if (now.kind === 'unknown')
|
|
53
|
+
throw new FigureContractError('CLIP_MEANING', `drivers.${clip.id}`, `what ${clip.clip} would play cannot be told: ${now.why}`);
|
|
54
|
+
const key = (joints) => joints.map(j => `${j.id}:${j.type}`).sort().join(',');
|
|
55
|
+
const same = was.kind === 'joint'
|
|
56
|
+
? now.kind === 'joint' && key(now.joints) === key(was.joints.map(j => ({ id: map(j.id), type: j.type }))) && now.unit === was.unit
|
|
57
|
+
: now.kind === 'free' && now.unit === was.unit;
|
|
58
|
+
const id = madeAfter.has(clip.id) ? clip.id : map(clip.id);
|
|
59
|
+
settled.add(id);
|
|
60
|
+
if (same)
|
|
61
|
+
kept.push({ ...(madeAfter.get(id) ?? clip), state: state });
|
|
62
|
+
else
|
|
63
|
+
lost.push({ id: clip.id, clip: clip.clip, state: clip.state, why: now.kind === 'gone' ? 'gone' : 'changed' });
|
|
64
|
+
}
|
|
65
|
+
const agreed = new Set(consent.dropClips ?? []);
|
|
66
|
+
const unagreed = lost.filter(c => !agreed.has(c.id));
|
|
67
|
+
if (unagreed.length)
|
|
68
|
+
throw new FigureClipsDroppedError(lost);
|
|
69
|
+
const drivers = [...kept, ...(after.drivers ?? []).filter(d => !settled.has(d.id))];
|
|
70
|
+
const out = { ...after };
|
|
71
|
+
if (drivers.length)
|
|
72
|
+
out.drivers = drivers;
|
|
73
|
+
else
|
|
74
|
+
delete out.drivers;
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=clip-keeping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clip-keeping.js","sourceRoot":"","sources":["../src/clip-keeping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { type FigureAuthoringAction } from './authoring-actions.ts';
|
|
2
|
+
import { type FigureClipLoss } from './clip-keeping.ts';
|
|
3
|
+
import type { FigureAsset } from './asset-types.ts';
|
|
4
|
+
type Vec = [number, number, number];
|
|
5
|
+
/** How one body moves: how far, in the figure's frame, and how it turns, about one axis, in degrees. */
|
|
6
|
+
export interface FigureBodyMove {
|
|
7
|
+
/** The body as the figure evaluates it; a row's copy has an id of its own. */
|
|
8
|
+
body: string;
|
|
9
|
+
/** The part the body belongs to. */
|
|
10
|
+
part: string;
|
|
11
|
+
translate: Vec;
|
|
12
|
+
/** The turn from where it stands to where it would, when it turns: a named axis of the figure's frame, or a direction. */
|
|
13
|
+
turn?: {
|
|
14
|
+
axis: 'x' | 'y' | 'z' | Vec;
|
|
15
|
+
degrees: number;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface FigureCommandPreview {
|
|
19
|
+
/** The figure as it would be. */
|
|
20
|
+
asset: FigureAsset;
|
|
21
|
+
/** What it would draw, at the values given. */
|
|
22
|
+
geometry: unknown[];
|
|
23
|
+
/** Every body that would move; the ones that stay are left out. */
|
|
24
|
+
moves: FigureBodyMove[];
|
|
25
|
+
/** Bodies it would draw that are not drawn now: a row's copies, a part a proposal adds. */
|
|
26
|
+
added: string[];
|
|
27
|
+
/** The clips the command would stop -- asked about when it is applied, never here. */
|
|
28
|
+
clipsWouldGo: FigureClipLoss[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The part a body belongs to: its own id, or -- for a copy drawn through a row -- the part at the end of its path. A mark
|
|
32
|
+
* hanging on a roller's copies is the mark (`["roller.repeat",2,"mark.placed"]`), not the roller.
|
|
33
|
+
*/
|
|
34
|
+
export declare function figureBodyOwnerOf(id: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* The command, run on a copy of the figure with the values the author is looking at: the figure it would make, what it
|
|
37
|
+
* would draw, every body it would move and how, and the clips it would stop. Refused as the command itself would be,
|
|
38
|
+
* except for clips: those it names and still shows, since only the apply asks about them.
|
|
39
|
+
*/
|
|
40
|
+
export declare function previewFigureCommand(source: FigureAsset, action: FigureAuthoringAction, values?: Record<string, number>): FigureCommandPreview;
|
|
41
|
+
/** A face of a part, where it lies: its centre, the way it faces, its two sides' directions and lengths. */
|
|
42
|
+
export interface FigureFaceArea {
|
|
43
|
+
part: string;
|
|
44
|
+
face: string;
|
|
45
|
+
centre: Vec;
|
|
46
|
+
normal: Vec;
|
|
47
|
+
u: Vec;
|
|
48
|
+
v: Vec;
|
|
49
|
+
size: {
|
|
50
|
+
u: number;
|
|
51
|
+
v: number;
|
|
52
|
+
};
|
|
53
|
+
/** A round face (a cylinder's end): `size` is its diameter both ways. */
|
|
54
|
+
round?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Where a part's named face lies in the figure, at the values given: from the shape's provider, as attaching reads it.
|
|
58
|
+
* Nothing for a face the shape does not declare, a part drawn in a row, or a shape whose section is not a plain box or
|
|
59
|
+
* disc -- a highlight in a guessed place would point at the wrong face.
|
|
60
|
+
*/
|
|
61
|
+
export declare function figurePartFaceOf(source: FigureAsset, part: string, face: string, values?: Record<string, number>): FigureFaceArea | undefined;
|
|
62
|
+
/** A row as it stands: how many, how far apart centre to centre, what is left at either end, what rides it. */
|
|
63
|
+
export interface FigureRowReading {
|
|
64
|
+
part: string;
|
|
65
|
+
/** The axis of the figure's frame the row runs along. */
|
|
66
|
+
axis: 'x' | 'y' | 'z';
|
|
67
|
+
count: number;
|
|
68
|
+
/** Centre to centre, measured on the copies; absent when they are not evenly spaced. */
|
|
69
|
+
pitch?: number;
|
|
70
|
+
/**
|
|
71
|
+
* What is left of the part it stands on beyond the first and the last copy, at the low and the high end, measured on
|
|
72
|
+
* the bodies. Absent when the part it stands on is turned in the figure: the ends are then not read.
|
|
73
|
+
*/
|
|
74
|
+
margins?: {
|
|
75
|
+
low: number;
|
|
76
|
+
high: number;
|
|
77
|
+
};
|
|
78
|
+
/** Whether the copies sit in the middle of what they stand on. */
|
|
79
|
+
centred?: boolean;
|
|
80
|
+
/** Parts drawn on every copy, with how many of each. */
|
|
81
|
+
companions: Array<{
|
|
82
|
+
part: string;
|
|
83
|
+
count: number;
|
|
84
|
+
}>;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* A row read from what the figure draws (ADR-0097 §5.5): the count, the spacing and the ends as they come out, never
|
|
88
|
+
* worked out again by a formula of the screen's own. Read on a preview's figure, it is the row a command would make.
|
|
89
|
+
*/
|
|
90
|
+
export declare function figureRowOf(source: FigureAsset, part: string, values?: Record<string, number>): FigureRowReading | undefined;
|
|
91
|
+
/** How a fastened part lies on the face it is fastened to: within its edges, past them, perhaps past them, or not known. */
|
|
92
|
+
export interface FigureFaceOverhang {
|
|
93
|
+
part: string;
|
|
94
|
+
on: {
|
|
95
|
+
part: string;
|
|
96
|
+
face: string;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* `inside` -- within the face's edges; `out` -- past them where it would fit, measured exactly (the part stands
|
|
100
|
+
* square to the face); `possible` -- its turned box reaches past them where it would fit, so it may; `larger` -- past
|
|
101
|
+
* them only along axes where it is wider than the face, as a bench top is wider than its leg: said as a fact, with
|
|
102
|
+
* its numbers, not as a fault -- and not hidden, since wider says nothing of whether it sits where it was meant to
|
|
103
|
+
* (designer 2026-09-27); `unknown` -- the face's outline is not read here (a round face, a shape without a flat face,
|
|
104
|
+
* a face turned in the figure). Never a claim beyond what was measured.
|
|
105
|
+
*/
|
|
106
|
+
state: 'inside' | 'out' | 'possible' | 'larger' | 'unknown';
|
|
107
|
+
/** Where, and how far past the edge, in mm, along the figure's axes -- every axis, the wider ones too. */
|
|
108
|
+
sides: Array<{
|
|
109
|
+
axis: 'x' | 'y' | 'z';
|
|
110
|
+
side: 'low' | 'high';
|
|
111
|
+
mm: number;
|
|
112
|
+
}>;
|
|
113
|
+
/** The axes along which it is wider than the face. */
|
|
114
|
+
wider: Array<'x' | 'y' | 'z'>;
|
|
115
|
+
/** Along a wider axis, it comes past one edge more than the other: off to one side. */
|
|
116
|
+
lopsided: Array<'x' | 'y' | 'z'>;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Whether a part fastened to another part's face lies within that face's edges (ADR-0097 §5.5, designer's Q3). Past
|
|
120
|
+
* them is not wrong in itself -- a device may overhang a bench top -- and not the figure's room: it is said apart, and
|
|
121
|
+
* nothing is moved. Measured on the evaluated bodies, a row's copies included.
|
|
122
|
+
*/
|
|
123
|
+
export declare function figureFaceOverhangOf(source: FigureAsset, part: string, values?: Record<string, number>): FigureFaceOverhang | undefined;
|
|
124
|
+
export {};
|
|
125
|
+
//# sourceMappingURL=command-preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-preview.d.ts","sourceRoot":"","sources":["../src/command-preview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { applyFigureAuthoring } from "./authoring-actions.js";
|
|
2
|
+
import { compileFigureAsset, upgradeFigurePlacement } from "./asset.js";
|
|
3
|
+
import { compileFigureGraph } from "./graph.js";
|
|
4
|
+
import { figureShapeProviderOf } from "./shape-provider.js";
|
|
5
|
+
import { figureOccupiedBoxesOf, figureWritersOf } from "./gate.js";
|
|
6
|
+
import { FigureClipsDroppedError } from "./clip-keeping.js";
|
|
7
|
+
const round = (v, places = 3) => Math.round(v * 10 ** places) / 10 ** places || 0;
|
|
8
|
+
const pick = (values, of) => Object.fromEntries(Object.entries(values).filter(([id]) => id in of));
|
|
9
|
+
const evaluate = (asset, values) => compileFigureAsset({ ...asset, designInputs: { ...asset.designInputs, ...pick(values, asset.designInputs) }, stateDefaults: { ...asset.stateDefaults, ...pick(values, asset.stateDefaults) } }).evaluate()
|
|
10
|
+
.geometry;
|
|
11
|
+
/**
|
|
12
|
+
* The part a body belongs to: its own id, or -- for a copy drawn through a row -- the part at the end of its path. A mark
|
|
13
|
+
* hanging on a roller's copies is the mark (`["roller.repeat",2,"mark.placed"]`), not the roller.
|
|
14
|
+
*/
|
|
15
|
+
export function figureBodyOwnerOf(id) {
|
|
16
|
+
if (!id.startsWith('['))
|
|
17
|
+
return id;
|
|
18
|
+
try {
|
|
19
|
+
const path = JSON.parse(id);
|
|
20
|
+
const last = [...path].reverse().find((step) => typeof step === 'string');
|
|
21
|
+
return last ? last.replace(/\.(placed|value)$/, '').replace(/\.repeat$/, '') : id;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return id;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** The turn taking `from` to `to`, as one axis and one angle; nothing when they are the same. */
|
|
28
|
+
function turnBetween(from, to) {
|
|
29
|
+
/* R = to × fromᵀ: the turn, in the figure's frame, that takes the body from how it stands to how it would. */
|
|
30
|
+
const R = [0, 1, 2].map(i => [0, 1, 2].map(j => to[i][0] * from[j][0] + to[i][1] * from[j][1] + to[i][2] * from[j][2]));
|
|
31
|
+
const trace = R[0][0] + R[1][1] + R[2][2];
|
|
32
|
+
const angle = Math.acos(Math.max(-1, Math.min(1, (trace - 1) / 2)));
|
|
33
|
+
if (angle < 1e-6)
|
|
34
|
+
return undefined;
|
|
35
|
+
let axis;
|
|
36
|
+
if (Math.PI - angle > 1e-4) {
|
|
37
|
+
const s = 2 * Math.sin(angle);
|
|
38
|
+
axis = [(R[2][1] - R[1][2]) / s, (R[0][2] - R[2][0]) / s, (R[1][0] - R[0][1]) / s];
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
/* A half turn: the axis from the diagonal, its signs from the largest component's row. */
|
|
42
|
+
const d = [0, 1, 2].map(i => Math.sqrt(Math.max(0, (R[i][i] + 1) / 2)));
|
|
43
|
+
const k = d.indexOf(Math.max(...d));
|
|
44
|
+
axis = [0, 1, 2].map(i => (i === k ? d[i] : (R[k][i] + R[i][k]) / (4 * d[k])));
|
|
45
|
+
}
|
|
46
|
+
const length = Math.hypot(...axis);
|
|
47
|
+
axis = axis.map(v => v / length);
|
|
48
|
+
let degrees = (angle * 180) / Math.PI;
|
|
49
|
+
const named = ['x', 'y', 'z'].findIndex((_, i) => Math.abs(Math.abs(axis[i]) - 1) < 1e-6);
|
|
50
|
+
if (named >= 0) {
|
|
51
|
+
if (axis[named] < 0)
|
|
52
|
+
degrees = -degrees;
|
|
53
|
+
return { axis: ['x', 'y', 'z'][named], degrees: round(degrees) };
|
|
54
|
+
}
|
|
55
|
+
return { axis: axis.map(v => round(v, 4)), degrees: round(degrees) };
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The command, run on a copy of the figure with the values the author is looking at: the figure it would make, what it
|
|
59
|
+
* would draw, every body it would move and how, and the clips it would stop. Refused as the command itself would be,
|
|
60
|
+
* except for clips: those it names and still shows, since only the apply asks about them.
|
|
61
|
+
*/
|
|
62
|
+
export function previewFigureCommand(source, action, values = {}) {
|
|
63
|
+
source = upgradeFigurePlacement(source);
|
|
64
|
+
let asset;
|
|
65
|
+
let clipsWouldGo = [];
|
|
66
|
+
try {
|
|
67
|
+
asset = applyFigureAuthoring(source, action);
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
if (!(e instanceof FigureClipsDroppedError))
|
|
71
|
+
throw e;
|
|
72
|
+
clipsWouldGo = e.clips;
|
|
73
|
+
asset = applyFigureAuthoring(source, action, { dropClips: e.clips.map(c => c.id) });
|
|
74
|
+
}
|
|
75
|
+
const before = new Map(evaluate(source, values).filter(b => b.pose).map(b => [b.id, b.pose]));
|
|
76
|
+
const geometry = evaluate(asset, values);
|
|
77
|
+
const moves = [];
|
|
78
|
+
for (const body of geometry) {
|
|
79
|
+
const was = before.get(body.id);
|
|
80
|
+
if (!was || !body.pose)
|
|
81
|
+
continue;
|
|
82
|
+
const translate = [0, 1, 2].map(i => round(body.pose.t[i] - was.t[i]));
|
|
83
|
+
const turn = turnBetween(was.r, body.pose.r);
|
|
84
|
+
if (!turn && translate.every(v => Math.abs(v) < 1e-3))
|
|
85
|
+
continue;
|
|
86
|
+
moves.push({ body: body.id, part: figureBodyOwnerOf(body.id), translate, ...(turn ? { turn } : {}) });
|
|
87
|
+
}
|
|
88
|
+
const added = geometry.filter(b => b.pose && !before.has(b.id)).map(b => b.id);
|
|
89
|
+
return { asset, geometry, moves, added, clipsWouldGo };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Where a part's named face lies in the figure, at the values given: from the shape's provider, as attaching reads it.
|
|
93
|
+
* Nothing for a face the shape does not declare, a part drawn in a row, or a shape whose section is not a plain box or
|
|
94
|
+
* disc -- a highlight in a guessed place would point at the wrong face.
|
|
95
|
+
*/
|
|
96
|
+
export function figurePartFaceOf(source, part, face, values = {}) {
|
|
97
|
+
const asset = upgradeFigurePlacement(source);
|
|
98
|
+
const m = asset.document.model;
|
|
99
|
+
const place = m.nodes.find((n) => n.id === part && n.op === 'place@1');
|
|
100
|
+
if (!place)
|
|
101
|
+
return undefined;
|
|
102
|
+
const shape = m.nodes.find((n) => Object.values(n.outputs ?? {}).includes(place.args[0]));
|
|
103
|
+
const provider = shape && figureShapeProviderOf(shape.op);
|
|
104
|
+
const f = provider?.faces[face];
|
|
105
|
+
if (!f)
|
|
106
|
+
return undefined;
|
|
107
|
+
const box = ['box-shape@1', 'rounded-box@1', 'hollow-box@2'].includes(shape.op);
|
|
108
|
+
const disc = shape.op === 'cylinder-shape@1';
|
|
109
|
+
if (!box && !disc)
|
|
110
|
+
return undefined;
|
|
111
|
+
const inputs = { ...asset.designInputs, ...asset.stateDefaults, ...pick(values, { ...asset.designInputs, ...asset.stateDefaults }) };
|
|
112
|
+
const got = compileFigureGraph(m).evaluate(inputs).values;
|
|
113
|
+
const arg = (i) => got[shape.args[i]];
|
|
114
|
+
const along = f.plane.reduce((s, p) => s + p.k * arg(p.arg), 0);
|
|
115
|
+
const reach = (axis) => {
|
|
116
|
+
const terms = provider.measure[axis];
|
|
117
|
+
return terms === 'profile' ? NaN : Math.max(...terms.map((t) => t.k * arg(t.arg)));
|
|
118
|
+
};
|
|
119
|
+
const axes = ['x', 'y', 'z'].filter(a => a !== f.axis);
|
|
120
|
+
const body = evaluate(asset, values).find(b => b.id === part);
|
|
121
|
+
if (!body?.pose)
|
|
122
|
+
return undefined;
|
|
123
|
+
const { r, t } = body.pose;
|
|
124
|
+
const column = (i) => [r[0][i], r[1][i], r[2][i]];
|
|
125
|
+
const index = { x: 0, y: 1, z: 2 };
|
|
126
|
+
const local = [0, 0, 0];
|
|
127
|
+
local[index[f.axis]] = along;
|
|
128
|
+
const centre = [0, 1, 2].map(i => round(r[i][0] * local[0] + r[i][1] * local[1] + r[i][2] * local[2] + t[i]));
|
|
129
|
+
const normal = column(index[f.axis]).map(v => round(v * f.normal, 6));
|
|
130
|
+
const [a, b] = axes;
|
|
131
|
+
const size = { u: reach(a), v: reach(b) };
|
|
132
|
+
if (!Number.isFinite(size.u) || !Number.isFinite(size.v))
|
|
133
|
+
return undefined;
|
|
134
|
+
return {
|
|
135
|
+
part,
|
|
136
|
+
face,
|
|
137
|
+
centre,
|
|
138
|
+
normal,
|
|
139
|
+
u: column(index[a]).map(v => round(v, 6)),
|
|
140
|
+
v: column(index[b]).map(v => round(v, 6)),
|
|
141
|
+
size: disc ? { u: Math.max(size.u, size.v), v: Math.max(size.u, size.v) } : size,
|
|
142
|
+
...(disc ? { round: true } : {})
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* A row read from what the figure draws (ADR-0097 §5.5): the count, the spacing and the ends as they come out, never
|
|
147
|
+
* worked out again by a formula of the screen's own. Read on a preview's figure, it is the row a command would make.
|
|
148
|
+
*/
|
|
149
|
+
export function figureRowOf(source, part, values = {}) {
|
|
150
|
+
const asset = upgradeFigurePlacement(source);
|
|
151
|
+
const joint = (asset.joints ?? []).find((j) => j.body1.part === part);
|
|
152
|
+
if (!joint?.repeat || !('part' in joint.body0))
|
|
153
|
+
return undefined;
|
|
154
|
+
const axis = String(joint.repeat.axis).toLowerCase();
|
|
155
|
+
const geometry = evaluate(asset, values);
|
|
156
|
+
const boxes = figureOccupiedBoxesOf(geometry, figureWritersOf(asset));
|
|
157
|
+
const copies = boxes.filter(b => b.part === part);
|
|
158
|
+
if (!copies.length)
|
|
159
|
+
return undefined;
|
|
160
|
+
const centres = copies.map(b => b.centre[axis]).sort((a, b) => a - b);
|
|
161
|
+
const steps = centres.slice(1).map((c, i) => c - centres[i]);
|
|
162
|
+
const pitch = steps.length && steps.every(s => Math.abs(s - steps[0]) < 1e-3) ? round(steps[0]) : undefined;
|
|
163
|
+
const companions = new Map();
|
|
164
|
+
for (const g of geometry) {
|
|
165
|
+
if (!g.id.startsWith('[') || !g.id.includes(`"${part}.repeat"`))
|
|
166
|
+
continue;
|
|
167
|
+
const owner = figureBodyOwnerOf(g.id);
|
|
168
|
+
if (owner !== part)
|
|
169
|
+
companions.set(owner, (companions.get(owner) ?? 0) + 1);
|
|
170
|
+
}
|
|
171
|
+
const reading = { part, axis, count: copies.length, ...(pitch !== undefined ? { pitch } : {}), companions: [...companions].map(([p, count]) => ({ part: p, count })) };
|
|
172
|
+
/* The ends, on the part it stands on -- only when that part is square to the figure, so its box is its extent. */
|
|
173
|
+
const parent = geometry.find(g => g.id === joint.body0.part);
|
|
174
|
+
const square = parent?.pose && parent.pose.r.every((row, i) => row.every((v, k) => Math.abs(v - (i === k ? 1 : 0)) < 1e-9));
|
|
175
|
+
const base = boxes.find(b => b.part === joint.body0.part);
|
|
176
|
+
if (square && base) {
|
|
177
|
+
const lowest = Math.min(...copies.map(b => b.centre[axis] - b.extent[axis] / 2));
|
|
178
|
+
const highest = Math.max(...copies.map(b => b.centre[axis] + b.extent[axis] / 2));
|
|
179
|
+
const low = round(lowest - (base.centre[axis] - base.extent[axis] / 2));
|
|
180
|
+
const high = round(base.centre[axis] + base.extent[axis] / 2 - highest);
|
|
181
|
+
reading.margins = { low, high };
|
|
182
|
+
reading.centred = Math.abs(low - high) < 0.5;
|
|
183
|
+
}
|
|
184
|
+
return reading;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Whether a part fastened to another part's face lies within that face's edges (ADR-0097 §5.5, designer's Q3). Past
|
|
188
|
+
* them is not wrong in itself -- a device may overhang a bench top -- and not the figure's room: it is said apart, and
|
|
189
|
+
* nothing is moved. Measured on the evaluated bodies, a row's copies included.
|
|
190
|
+
*/
|
|
191
|
+
export function figureFaceOverhangOf(source, part, values = {}) {
|
|
192
|
+
const asset = upgradeFigurePlacement(source);
|
|
193
|
+
const joint = (asset.joints ?? []).find((j) => j.body1.part === part);
|
|
194
|
+
if (!joint || !('part' in joint.body0))
|
|
195
|
+
return undefined;
|
|
196
|
+
const on = { part: joint.body0.part, face: joint.body0.face };
|
|
197
|
+
const unknown = { part, on, state: 'unknown', sides: [], wider: [], lopsided: [] };
|
|
198
|
+
const face = figurePartFaceOf(asset, on.part, on.face, values);
|
|
199
|
+
if (!face || face.round)
|
|
200
|
+
return unknown;
|
|
201
|
+
/* The face's two sides must run along the figure's axes for its edges to be compared with the part's box. */
|
|
202
|
+
const axisOf = (d) => {
|
|
203
|
+
const i = d.findIndex(c => Math.abs(Math.abs(c) - 1) < 1e-6);
|
|
204
|
+
return i >= 0 && d.every((c, k) => k === i || Math.abs(c) < 1e-6) ? i : -1;
|
|
205
|
+
};
|
|
206
|
+
const ui = axisOf(face.u);
|
|
207
|
+
const vi = axisOf(face.v);
|
|
208
|
+
if (ui < 0 || vi < 0)
|
|
209
|
+
return unknown;
|
|
210
|
+
const geometry = evaluate(asset, values);
|
|
211
|
+
const boxes = figureOccupiedBoxesOf(geometry, figureWritersOf(asset)).filter(b => b.part === part);
|
|
212
|
+
if (!boxes.length)
|
|
213
|
+
return unknown;
|
|
214
|
+
/* Square to the figure, its box is its outline; turned any other way, its box is larger than it is. */
|
|
215
|
+
const bodies = geometry.filter(g => g.pose && figureBodyOwnerOf(g.id) === part);
|
|
216
|
+
const square = bodies.every(g => g.pose.r.every(row => row.filter(v => Math.abs(v) > 1e-9).length === 1 && row.some(v => Math.abs(Math.abs(v) - 1) < 1e-9)));
|
|
217
|
+
const names = ['x', 'y', 'z'];
|
|
218
|
+
const sides = [];
|
|
219
|
+
const wider = [];
|
|
220
|
+
const lopsided = [];
|
|
221
|
+
let pastWhereItFits = false;
|
|
222
|
+
for (const [i, size] of [[ui, face.size.u], [vi, face.size.v]]) {
|
|
223
|
+
const axis = names[i];
|
|
224
|
+
const lo = face.centre[i] - size / 2;
|
|
225
|
+
const hi = face.centre[i] + size / 2;
|
|
226
|
+
const min = Math.min(...boxes.map(b => b.centre[axis] - b.extent[axis] / 2));
|
|
227
|
+
const max = Math.max(...boxes.map(b => b.centre[axis] + b.extent[axis] / 2));
|
|
228
|
+
const low = lo - min;
|
|
229
|
+
const high = max - hi;
|
|
230
|
+
if (low > 0.05)
|
|
231
|
+
sides.push({ axis, side: 'low', mm: round(low, 1) });
|
|
232
|
+
if (high > 0.05)
|
|
233
|
+
sides.push({ axis, side: 'high', mm: round(high, 1) });
|
|
234
|
+
if (max - min > size + 0.05) {
|
|
235
|
+
/* Wider than the face along this axis: past its edges by its size -- and how evenly is still said. */
|
|
236
|
+
wider.push(axis);
|
|
237
|
+
if (Math.abs(low - high) > 0.5)
|
|
238
|
+
lopsided.push(axis);
|
|
239
|
+
}
|
|
240
|
+
else if (low > 0.05 || high > 0.05)
|
|
241
|
+
pastWhereItFits = true;
|
|
242
|
+
}
|
|
243
|
+
const state = pastWhereItFits ? (square ? 'out' : 'possible') : sides.length ? 'larger' : 'inside';
|
|
244
|
+
return { part, on, state, sides, wider, lopsided };
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=command-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-preview.js","sourceRoot":"","sources":["../src/command-preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAA8B,MAAM,wBAAwB,CAAA;AACzF,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAClE,OAAO,EAAE,uBAAuB,EAAuB,MAAM,mBAAmB,CAAA;AAuChF,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,GAAG,EAAE,IAAI,MAAM,IAAI,CAAC,CAAA;AACzF,MAAM,IAAI,GAAG,CAAC,MAA8B,EAAE,EAA0B,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AAClJ,MAAM,QAAQ,GAAG,CAAC,KAAkB,EAAE,MAA8B,EAAE,EAAE,CACtE,kBAAkB,CAAC,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,KAAK,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;KACvM,QAAyD,CAAA;AAE9D;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAU;IAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAClC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAc,CAAA;QACxC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAA;QACzF,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,iGAAiG;AACjG,SAAS,WAAW,CAAC,IAAgB,EAAE,EAAc;IACnD,8GAA8G;IAC9G,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAA;IACnI,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAA;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACnE,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,SAAS,CAAA;IAClC,IAAI,IAAS,CAAA;IACb,IAAI,IAAI,CAAC,EAAE,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC7B,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IAChG,CAAC;SAAM,CAAC;QACN,0FAA0F;QAC1F,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACzE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACnC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAQ,CAAA;IAC7F,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;IAClC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAQ,CAAA;IACvC,IAAI,OAAO,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;IACrC,MAAM,KAAK,GAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACrG,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,IAAI,IAAI,CAAC,KAAK,CAAE,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC,OAAO,CAAA;QACxC,OAAO,EAAE,IAAI,EAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAW,CAAC,KAAK,CAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAA;IAC9E,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAA;AAC7E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAmB,EAAE,MAA6B,EAAE,SAAiC,EAAE;IAC1H,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAA;IACvC,IAAI,KAAkB,CAAA;IACtB,IAAI,YAAY,GAAqB,EAAE,CAAA;IACvC,IAAI,CAAC;QACH,KAAK,GAAG,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,CAAC,CAAC,YAAY,uBAAuB,CAAC;YAAE,MAAM,CAAC,CAAA;QACpD,YAAY,GAAG,CAAC,CAAC,KAAK,CAAA;QACtB,KAAK,GAAG,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACrF,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,CAAA;IAC9F,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACxC,MAAM,KAAK,GAAqB,EAAE,CAAA;IAClC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,SAAQ;QAChC,MAAM,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAQ,CAAA;QAChF,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC5C,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YAAE,SAAQ;QAC/D,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACvG,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC9E,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAA;AACxD,CAAC;AAeD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB,EAAE,IAAY,EAAE,IAAY,EAAE,SAAiC,EAAE;IACnH,MAAM,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAA;IAC5C,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAgB,CAAA;IACzC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;IAC/E,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAClG,MAAM,QAAQ,GAAG,KAAK,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACzD,MAAM,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,IAAI,CAA4G,CAAA;IAC1I,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IACxB,MAAM,GAAG,GAAG,CAAC,aAAa,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC/E,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,KAAK,kBAAkB,CAAA;IAC5C,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAA;IACnC,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC,EAAE,CAAA;IACpI,MAAM,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAgC,CAAA;IACnF,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAA;IAC9C,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,CAA6B,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACnG,MAAM,KAAK,GAAG,CAAC,IAAqB,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,QAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACrC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAA6B,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAChH,CAAC,CAAA;IACD,MAAM,IAAI,GAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA;IACjE,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAA;IAC7D,IAAI,CAAC,IAAI,EAAE,IAAI;QAAE,OAAO,SAAS,CAAA;IACjC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;IAC1B,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAQ,CAAA;IACtE,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAW,CAAA;IAC3C,MAAM,KAAK,GAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC5B,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAA;IAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAQ,CAAA;IAC3H,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAQ,CAAA;IAC5E,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAA0C,CAAA;IACzD,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IAC1E,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,MAAM;QACN,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAQ;QAChD,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAQ;QAChD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;QAChF,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjC,CAAA;AACH,CAAC;AAqBD;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAmB,EAAE,IAAY,EAAE,SAAiC,EAAE;IAChG,MAAM,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAA;IAC5C,MAAM,KAAK,GAAG,CAAE,KAAiB,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IAC3F,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAChE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAqB,CAAA;IACvE,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAkD,CAAA;IACzF,MAAM,KAAK,GAAG,qBAAqB,CAAC,QAAiB,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9E,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IACjD,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,CAAA;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7G,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC5C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,UAAU,CAAC;YAAE,SAAQ;QACzE,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACrC,IAAI,KAAK,KAAK,IAAI;YAAE,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAC7E,CAAC;IACD,MAAM,OAAO,GAAqB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAA;IACxL,kHAAkH;IAClH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IAC3H,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACzD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAChF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACjF,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACvE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAA;QACvE,OAAO,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;QAC/B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,CAAA;IAC9C,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAuBD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAmB,EAAE,IAAY,EAAE,SAAiC,EAAE;IACzG,MAAM,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAA;IAC5C,MAAM,KAAK,GAAG,CAAE,KAAiB,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IAC3F,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACxD,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAc,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAc,EAAE,CAAA;IACjF,MAAM,OAAO,GAAuB,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;IACtG,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC9D,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,OAAO,CAAA;IACvC,6GAA6G;IAC7G,MAAM,MAAM,GAAG,CAAC,CAAM,EAAE,EAAE;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;QAC5D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5E,CAAC,CAAA;IACD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACzB,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACzB,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;QAAE,OAAO,OAAO,CAAA;IACpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAkD,CAAA;IACzF,MAAM,KAAK,GAAG,qBAAqB,CAAC,QAAiB,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IAC3G,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,OAAO,CAAA;IACjC,uGAAuG;IACvG,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,CAAA;IAC/E,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IAC7J,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAA;IACtC,MAAM,KAAK,GAAgC,EAAE,CAAA;IAC7C,MAAM,KAAK,GAAgC,EAAE,CAAA;IAC7C,MAAM,QAAQ,GAAmC,EAAE,CAAA;IACnD,IAAI,eAAe,GAAG,KAAK,CAAA;IAC3B,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAU,EAAE,CAAC;QACxE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QACtB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,IAAI,GAAG,CAAC,CAAA;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,IAAI,GAAG,CAAC,CAAA;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC5E,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,CAAA;QACpB,MAAM,IAAI,GAAG,GAAG,GAAG,EAAE,CAAA;QACrB,IAAI,GAAG,GAAG,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;QACpE,IAAI,IAAI,GAAG,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;QACvE,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;YAC5B,sGAAsG;YACtG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG;gBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrD,CAAC;aAAM,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI;YAAE,eAAe,GAAG,IAAI,CAAA;IAC9D,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;IAClG,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;AACpD,CAAC"}
|