@mark1russell7/layout-contract 0.2.15 → 0.2.17

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["byCode","partOf","isObject"],"sources":["../src/geometry.ts","../src/shapes.ts","../src/tolerance.ts","../src/input.ts","../src/turn.ts","../src/output.ts","../src/record.ts","../src/rules.ts","../src/measures.ts","../src/utf8.ts","../src/random.ts","../src/edges.ts","../src/hash.ts","../src/portfolio.ts","../src/corpus.ts","../src/strategy-space.ts","../src/verdict.ts","../src/families.ts"],"sourcesContent":["/** A side of a box. The y axis points down, so `top` has the smallest y. */\nexport type Side = \"top\" | \"right\" | \"bottom\" | \"left\";\n\n/** The sides in clockwise order, from the top. */\nexport const SIDES: readonly Side[] = [\"top\", \"right\", \"bottom\", \"left\"];\n\nexport interface Point {\n readonly x: number;\n readonly y: number;\n}\n\n/** A rectangle: its top-left corner and its size. */\nexport interface Rect {\n readonly x: number;\n readonly y: number;\n readonly w: number;\n readonly h: number;\n}\n\n/** A value for each side of a box. */\nexport interface Sides {\n readonly top: number;\n readonly right: number;\n readonly bottom: number;\n readonly left: number;\n}\n\n/**\n * A region. The forms and the rules are those of `docs/FORMAT.md` of `packing`.\n * A ring of a polygon closes without a copy of its first point.\n */\nexport type Region =\n | { readonly kind: \"rect\"; readonly x: number; readonly y: number; readonly w: number; readonly h: number }\n | {\n readonly kind: \"polygon\";\n readonly points: readonly (readonly [number, number])[];\n readonly holes?: readonly (readonly (readonly [number, number])[])[];\n }\n | { readonly kind: \"circle\"; readonly cx: number; readonly cy: number; readonly r: number }\n | { readonly kind: \"ellipse\"; readonly cx: number; readonly cy: number; readonly rx: number; readonly ry: number };\n\n/** A margin: one value for the four sides, or one value for each side. */\nexport type Margin = number | Sides;\n\n/** This function gives the value of each side of a margin. No margin gives 0 on each side. */\nexport function marginSides(margin: Margin | undefined): Sides {\n if (margin === undefined) return { top: 0, right: 0, bottom: 0, left: 0 };\n if (typeof margin === \"number\") return { top: margin, right: margin, bottom: margin, left: margin };\n return margin;\n}\n\n/** This function gives the rectangle made larger by the margin on each side. */\nexport function grow(rect: Rect, margin: Margin | undefined): Rect {\n const m = marginSides(margin);\n return { x: rect.x - m.left, y: rect.y - m.top, w: rect.w + m.left + m.right, h: rect.h + m.top + m.bottom };\n}\n\n/** This function gives the bounding box of a region. */\nexport function boundsOf(region: Region): Rect {\n switch (region.kind) {\n case \"rect\":\n return { x: region.x, y: region.y, w: region.w, h: region.h };\n case \"circle\":\n return { x: region.cx - region.r, y: region.cy - region.r, w: 2 * region.r, h: 2 * region.r };\n case \"ellipse\":\n return { x: region.cx - region.rx, y: region.cy - region.ry, w: 2 * region.rx, h: 2 * region.ry };\n case \"polygon\": {\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n for (const [x, y] of region.points) {\n x0 = Math.min(x0, x);\n y0 = Math.min(y0, y);\n x1 = Math.max(x1, x);\n y1 = Math.max(y1, y);\n }\n return { x: x0, y: y0, w: x1 - x0, h: y1 - y0 };\n }\n }\n}\n\n/** This function gives the region moved by `dx` and `dy`. */\nexport function translate(region: Region, dx: number, dy: number): Region {\n switch (region.kind) {\n case \"rect\":\n return { ...region, x: region.x + dx, y: region.y + dy };\n case \"circle\":\n case \"ellipse\":\n return { ...region, cx: region.cx + dx, cy: region.cy + dy };\n case \"polygon\": {\n const move = (ring: readonly (readonly [number, number])[]): [number, number][] => ring.map(([x, y]) => [x + dx, y + dy]);\n return region.holes === undefined\n ? { kind: \"polygon\", points: move(region.points) }\n : { kind: \"polygon\", points: move(region.points), holes: region.holes.map(move) };\n }\n }\n}\n\n/**\n * This function gives the overlap of the insides of two rectangles on each axis.\n * A value of 0 or less on an axis is no overlap. Two rectangles with a common edge have an overlap of 0.\n */\nexport function overlapOf(a: Rect, b: Rect): { readonly x: number; readonly y: number } {\n return {\n x: Math.min(a.x + a.w, b.x + b.w) - Math.max(a.x, b.x),\n y: Math.min(a.y + a.h, b.y + b.h) - Math.max(a.y, b.y),\n };\n}\n","// The shape kinds of the items (`docs/SHAPES.md`): the declared set, the kind of a box and the check of the measures and rules on a run.\nimport type { ClaimBreak } from \"./corpus.ts\";\nimport type { Region } from \"./geometry.ts\";\nimport type { LayoutBox, LayoutInput } from \"./input.ts\";\n\n/**\n * The kind of the shape of an item. A box without `shape` and without `shapeKind` is a `rect`.\n * The set is open: a later version can add a kind. A reader treats an unknown kind as a kind that it does not support.\n */\nexport type ShapeKind = \"rect\" | \"polygon\" | \"circle\" | \"free\";\n\n/** The geometry of a shape kind that this package gives. A `false` value tells that the kind declares the operation, but this package does not supply it. */\nexport interface ShapeGeometry {\n /** The bounding box: `boundsOf` and `placedRect`. */\n readonly bounds: boolean;\n /** The area of the shape. */\n readonly area: boolean;\n /** The test that the shape is inside a region: `rectInRegion` for a `rect`. */\n readonly contains: boolean;\n /** The test that two shapes overlap: `overlapOf` for two `rect` shapes. */\n readonly overlap: boolean;\n}\n\n/** The facts of one shape kind: its fields, the kinds of `Region` that give it, and its geometry. */\nexport interface ShapeKindSpec {\n readonly id: ShapeKind;\n /** The fields of the outline, relative to the top-left corner of the box. A name with `?` is optional. */\n readonly fields: readonly string[];\n /** The kinds of `LayoutBox.shape` that agree with this kind. */\n readonly regions: readonly Region[\"kind\"][];\n readonly geometry: ShapeGeometry;\n}\n\n/** The declared shape kinds, in their order. Only `rect` has all of its geometry. The other kinds have their bounding box only. */\nexport const SHAPE_KINDS: readonly ShapeKindSpec[] = Object.freeze([\n { id: \"rect\", fields: [\"w\", \"h\"], regions: [\"rect\"], geometry: { bounds: true, area: true, contains: true, overlap: true } },\n { id: \"polygon\", fields: [\"points\", \"holes?\"], regions: [\"polygon\"], geometry: { bounds: true, area: false, contains: false, overlap: false } },\n { id: \"circle\", fields: [\"cx\", \"cy\", \"r\"], regions: [\"circle\"], geometry: { bounds: true, area: false, contains: false, overlap: false } },\n { id: \"free\", fields: [\"w\", \"h\", \"shape?\"], regions: [\"rect\", \"polygon\", \"circle\", \"ellipse\"], geometry: { bounds: true, area: false, contains: false, overlap: false } },\n] as const);\n\n/** The ids of `SHAPE_KINDS`, in their order. */\nexport const SHAPE_KIND_IDS: readonly ShapeKind[] = Object.freeze(SHAPE_KINDS.map((k) => k.id));\n\n/** The shape kinds of a measure or a rule without `shapes`. The contract measured only rectangles before L46. */\nexport const DEFAULT_SHAPES: readonly ShapeKind[] = Object.freeze([\"rect\"] as const);\n\n/** A measure or a rule, with the shape kinds that it supports. Without `shapes`, it supports `DEFAULT_SHAPES`. */\nexport interface ShapeSupport<Id extends string = string> {\n readonly id: Id;\n readonly shapes?: readonly ShapeKind[];\n}\n\nconst REGION_KIND: Readonly<Record<Region[\"kind\"], ShapeKind>> = { rect: \"rect\", polygon: \"polygon\", circle: \"circle\", ellipse: \"free\" };\n\n/** This function tells if a value is a declared shape kind. */\nexport function isShapeKind(value: unknown): value is ShapeKind {\n return typeof value === \"string\" && (SHAPE_KIND_IDS as readonly string[]).includes(value);\n}\n\n/**\n * This function gives the shape kind of a box. A box with `shapeKind` has that kind.\n * Without it, the kind comes from `shape`: no shape is a `rect`, and an ellipse is `free`.\n */\nexport function shapeKindOf(box: LayoutBox): ShapeKind {\n if (box.shapeKind !== undefined) return box.shapeKind;\n return box.shape === undefined ? \"rect\" : REGION_KIND[box.shape.kind];\n}\n\n/** This function gives the shape kinds of the boxes of an input, in the order of `SHAPE_KINDS`. An input without boxes gives an empty list. */\nexport function shapeKindsOf(input: Pick<LayoutInput, \"boxes\">): ShapeKind[] {\n const seen = new Set(input.boxes.map(shapeKindOf));\n return SHAPE_KIND_IDS.filter((k) => seen.has(k));\n}\n\n/** This function gives the value of the cell dimension `itemShape` of an input: its one kind, `mixed` for more kinds, or `rect` without boxes. */\nexport function itemShapeOf(input: Pick<LayoutInput, \"boxes\">): ShapeKind | \"mixed\" {\n const kinds = shapeKindsOf(input);\n return kinds.length === 0 ? \"rect\" : kinds.length === 1 ? kinds[0]! : \"mixed\";\n}\n\n/** This function gives the problem of the shape kind of a box, or `undefined` when `shapeKind` and `shape` agree. */\nexport function shapeKindProblem(box: LayoutBox): string | undefined {\n const k: unknown = box.shapeKind;\n if (k === undefined) return undefined;\n const spec = SHAPE_KINDS.find((s) => s.id === k);\n if (spec === undefined) return `box ${box.id}: the shape kind ${String(k)} is not a declared kind`;\n if (box.shape === undefined) return k === \"rect\" || k === \"free\" ? undefined : `box ${box.id}: the shape kind ${k} has no shape`;\n if (!spec.regions.includes(box.shape.kind)) return `box ${box.id}: the shape kind ${k} does not agree with a shape of the kind ${box.shape.kind}`;\n return undefined;\n}\n\n/** This function gives the shape kinds that a measure or a rule supports. */\nexport function shapesOf(use: Pick<ShapeSupport, \"shapes\">): readonly ShapeKind[] {\n return use.shapes ?? DEFAULT_SHAPES;\n}\n\n/**\n * This function checks that each measure and each rule of a run supports each shape kind of the input. An empty list tells that the run is good.\n * Each break has the claim `shape`, the id of the input, and the first 5 ids of the boxes of the kind.\n */\nexport function checkShapes(input: Pick<LayoutInput, \"id\" | \"boxes\">, uses: readonly ShapeSupport[]): ClaimBreak[] {\n const kinds = shapeKindsOf(input);\n const out: ClaimBreak[] = [];\n for (const use of uses) {\n const shapes = shapesOf(use);\n for (const kind of kinds) {\n if (shapes.includes(kind)) continue;\n const ids = input.boxes.filter((b) => shapeKindOf(b) === kind).map((b) => b.id);\n const shown = ids.slice(0, 5).join(\", \") + (ids.length > 5 ? `, and ${ids.length - 5} more` : \"\");\n out.push({\n claim: \"shape\",\n detail: `${use.id} supports only the shape kinds ${shapes.join(\", \") || \"(none)\"}, but the input ${input.id} has ${kind} boxes: ${shown}`,\n inputs: [input.id],\n });\n }\n }\n return out;\n}\n","/** The epsilon for the float compares in an engine. */\nexport const EPS = 1e-6;\n\n/**\n * The count of grid steps in one unit of a written file. A file rounds each number `v` to `Math.round(v * RECORD_SCALE) / RECORD_SCALE`.\n * Use a multiplication by this value, not a division by `RECORD_EPS`. The two differ at some half steps.\n */\nexport const RECORD_SCALE = 1000;\n\n/**\n * The epsilon for the float compares on a written file. A file rounds each number to 3 decimals,\n * so a difference of two values can move by up to 0.001. It is `1 / RECORD_SCALE`.\n */\nexport const RECORD_EPS = 1e-3;\n\n/**\n * The tolerance of each hard rule, in layout units. A record writes the tolerance that its run used,\n * in its field `tolerance`, next to `hard`.\n */\nexport interface Tolerance {\n /** Two boxes with their margins break `no-overlap` when their insides overlap by more than this on each axis. */\n readonly overlap: number;\n /** A route breaks `no-pass-through` when a part longer than this is inside a box made this much smaller. */\n readonly through: number;\n}\n\n/**\n * The default tolerance of each rule. The packer is exact, so `overlap` is one unit of the rounding.\n * Routes are sampled curves that follow the margin line, so `through` is larger.\n */\nexport const DEFAULT_TOLERANCE: Tolerance = Object.freeze({ overlap: 0.001, through: 0.5 });\n","import type { Margin, Point, Region, Side } from \"./geometry.ts\";\nimport type { ShapeKind } from \"./shapes.ts\";\n\n/**\n * A port of a box: a place where edges go into the box.\n * With `x` and `y`, the port is fixed on the border of the box, relative to its top-left corner.\n * With `side` and `along`, the port is fixed at a fraction of its side.\n * With only a side, the router places the port on that side. Without a side, the router picks the side.\n */\nexport interface Port {\n readonly id: string;\n readonly side?: Side;\n readonly x?: number;\n readonly y?: number;\n /**\n * The place of the port on its `side`: a fraction from 0 to 1, from the start of the side.\n * The start of `left` and `right` is the top end. The start of `top` and `bottom` is the left end.\n * It needs a `side`. A port with `along` has no `x` and no `y`.\n */\n readonly along?: number;\n}\n\n/**\n * This function gives the point of a port on the border of its box, relative to the top-left corner of the box.\n * A port with `x` and `y` gives that point. A port with `side` and `along` gives the point at that fraction of the side.\n * Another port gives `undefined`, because the router picks its point.\n */\nexport function portPoint(box: Pick<LayoutBox, \"w\" | \"h\">, port: Port): Point | undefined {\n if (port.x !== undefined && port.y !== undefined) return { x: port.x, y: port.y };\n if (port.side === undefined || port.along === undefined) return undefined;\n switch (port.side) {\n case \"top\":\n return { x: port.along * box.w, y: 0 };\n case \"bottom\":\n return { x: port.along * box.w, y: box.h };\n case \"left\":\n return { x: 0, y: port.along * box.h };\n case \"right\":\n return { x: box.w, y: port.along * box.h };\n }\n}\n\n/** A box of an input. In the packer, its name is item. */\nexport interface LayoutBox {\n readonly id: string;\n readonly w: number;\n readonly h: number;\n /** The packer writes the position. The router reads it. */\n readonly x?: number;\n readonly y?: number;\n /** A locked box keeps `x` and `y`. The packer reads it as an obstacle. */\n readonly locked?: boolean;\n /** The reading order. Without it, the order of the array is the rank. */\n readonly rank?: number;\n readonly parent?: string;\n readonly group?: string;\n /** A region relative to the origin of the box. Without it, the box is the rectangle `w` by `h`. */\n readonly shape?: Region;\n /**\n * The shape kind of the box (`docs/SHAPES.md`). Without it, `shapeKindOf` gives the kind of `shape`, or `rect` without a shape.\n * The kind `free` tells that the contract knows only the bounding box `w` by `h`.\n */\n readonly shapeKind?: ShapeKind;\n readonly ports?: readonly Port[];\n /** A ring around the box. No other box enters it. Only a route from a port of the box enters it, at a right angle. */\n readonly margin?: Margin;\n /** The packer can turn the box by 90 degrees. The output has the turned box and ports. */\n readonly turnable?: boolean;\n /** The free data of the node. The grouping rule `keys` of `highways` reads `data.group`. */\n readonly data?: Readonly<Record<string, unknown>>;\n}\n\n/** The packer name of a box. It is the same type. */\nexport type Item = LayoutBox;\n\n/** An edge between two boxes, with optional ports. */\nexport interface LayoutEdge {\n readonly id: string;\n readonly source: string;\n readonly target: string;\n readonly sourcePort?: string;\n readonly targetPort?: string;\n readonly data?: Readonly<Record<string, unknown>>;\n}\n\n/** The container. `fixed` tells which sides of the size stay. */\nexport interface LayoutContainer {\n readonly w?: number;\n readonly h?: number;\n readonly fixed: \"size\" | \"width\" | \"height\" | \"none\";\n /** The target aspect: the width divided by the height. The default is 1. */\n readonly aspect?: number;\n /** The weight of the aspect error in the objective. 0 gives the least area. The default is 1. */\n readonly aspectWeight?: number;\n /** The shape. Without it, the container is the rectangle from 0, 0 to `w`, `h`. */\n readonly shape?: Region;\n /** The space between the border and the boxes with their margins. */\n readonly inset?: number;\n}\n\n/** An area that boxes and routes avoid. Without `move`, it stays. With `move`, the packer can move it for `cost` times the distance. */\nexport interface Obstacle {\n readonly id: string;\n readonly region: Region;\n readonly move?: { readonly cost: number };\n}\n\n/** The generator of an input. The same name, version, parameters and seed give the same file, byte for byte. */\nexport interface LayoutGenerator {\n readonly name: string;\n readonly version: number;\n readonly params: Readonly<Record<string, unknown>>;\n readonly seed: number;\n}\n\n/**\n * One minimum distance between two boxes (`a` and `b`). It replaces the two margins of the boxes for this pair, and the global `gap`.\n * The order of `a` and `b` has no meaning. A pair without an entry keeps the margins and the `gap`.\n */\nexport interface PairGap {\n readonly a: string;\n readonly b: string;\n /** The minimum distance between the two boxes, in units: a finite number of 0 or more. */\n readonly gap: number;\n /** The count of the channels that the gap has space for. It is information only: a whole number of 0 or more. */\n readonly lanes?: number;\n}\n\n/** The cell of an input in the taxonomy: one value for each dimension. The dimensions are in `docs/FORMAT.md` of `packing`. */\nexport interface LayoutCell {\n readonly containerSize?: \"fixed\" | \"freeHeight\" | \"freeWidth\" | \"freeAspect\" | \"freeArea\";\n readonly containerShape?: \"rect\" | \"convex\" | \"polygon\" | \"circle\" | \"ellipse\" | \"holes\";\n readonly obstacles?: \"none\" | \"center\" | \"scattered\" | \"wall\" | \"corridors\" | \"touching\" | \"edge\";\n readonly sizes?: \"identical\" | \"uniform\" | \"heavyTail\" | \"bimodal\" | \"extremeAspect\" | \"nearIdentical\";\n readonly count?: \"1\" | \"10\" | \"100\" | \"1k\" | \"10k\";\n readonly mode?: \"offline\" | \"online\" | \"incremental\";\n readonly edgeDensity?: \"sparse\" | \"medium\" | \"dense\";\n readonly edgeShape?: \"random\" | \"clustered\" | \"hubChain\" | \"longRange\" | \"tree\" | \"bundled\";\n readonly groups?: \"none\" | \"flat\" | \"nested\";\n readonly ports?: \"free\" | \"sides\" | \"fixed\";\n /** The shape kinds of the boxes: one kind, or `mixed` for more kinds. Without it, each box is a `rect`. `itemShapeOf` gives the value. */\n readonly itemShape?: ShapeKind | \"mixed\";\n}\n\n/** An input of the corpus: the format `layout-input/1`. */\nexport interface LayoutInput {\n readonly schema: \"layout-input/1\";\n readonly id: string;\n readonly set?: string;\n readonly family?: string;\n readonly seed?: number;\n /** The origin: `made-up`, `published:<set>` or `known-best:<construction>`. */\n readonly source?: string;\n /** The first 16 hex characters of the SHA-256 of the canonical file without this field. */\n readonly hash?: string;\n /** The generator of the input. `null` or no value tells that a person made the input. */\n readonly generator?: LayoutGenerator | null;\n /** The steps that changed the input after its generator, in their order. `edgeStep` adds one. */\n readonly steps?: readonly LayoutGenerator[];\n readonly cell?: LayoutCell;\n /** The place of the input in a sequence of changes. */\n readonly step?: number;\n /** A router input can have no container. */\n readonly container?: LayoutContainer;\n /** The free space between two boxes with their margins. Routes use it. */\n readonly gap?: number;\n /** The distances of some pairs of boxes. An entry replaces the margins and the `gap` for its pair. `canonicalInput` sorts the list. */\n readonly pairGaps?: readonly PairGap[];\n readonly boxes: readonly LayoutBox[];\n readonly edges?: readonly LayoutEdge[];\n readonly obstacles?: readonly Obstacle[];\n /**\n * A variant names its base input and its change.\n * With `packed`, the variant is the packed output of its base input: the router routes the positions of that pack.\n */\n readonly base?: string;\n readonly change?: \"add\" | \"remove\" | \"resize\" | \"reorder\" | \"packed\";\n /**\n * The fields that a corpus registry removed, because a dimension value made them wrong (`CorpusDimension.invalidates`).\n * The names are sorted. An input with no removed field has no `invalidated`.\n */\n readonly invalidated?: readonly string[];\n}\n\n/** The input of a packer: a `layout-input/1` file without the edges. */\nexport interface PackInput {\n readonly container: LayoutContainer;\n readonly items: readonly Item[];\n readonly obstacles?: readonly Obstacle[];\n readonly gap?: number;\n readonly pairGaps?: readonly PairGap[];\n}\n\n/** This function gives the packer input of a file. An input without a container gets `{ fixed: \"none\" }`, so the packer picks the size. */\nexport function toPackInput(input: LayoutInput): PackInput {\n return {\n container: input.container ?? { fixed: \"none\" },\n items: input.boxes,\n ...(input.obstacles === undefined ? {} : { obstacles: input.obstacles }),\n ...(input.gap === undefined ? {} : { gap: input.gap }),\n ...(input.pairGaps === undefined ? {} : { pairGaps: input.pairGaps }),\n };\n}\n\n/** This function compares two strings by their UTF-16 code units, as `Array.prototype.sort` does without a compare function. */\nconst byCode = (x: string, y: string): number => (x < y ? -1 : x > y ? 1 : 0);\n\n/**\n * This function gives the canonical form of an input. `documentHash` uses it for each `layout-input/1` document.\n * Each pair of `pairGaps` gets `a` before `b`, and the list is sorted by `a` and then by `b`.\n * An input without `pairGaps` is the same object, so its hash does not change.\n */\nexport function canonicalInput<T extends LayoutInput>(input: T): T {\n if (!Array.isArray(input.pairGaps)) return input;\n const pairGaps = input.pairGaps\n .map((p): PairGap => (byCode(p.a, p.b) > 0 ? { ...p, a: p.b, b: p.a } : p))\n .sort((x, y) => byCode(x.a, y.a) || byCode(x.b, y.b));\n return { ...input, pairGaps };\n}\n","import { SIDES, marginSides, type Margin, type Region, type Side } from \"./geometry.ts\";\nimport type { LayoutBox, Port } from \"./input.ts\";\n\n/*\n * The turn: 90 degrees clockwise, with the y axis down. The turned box has `w` and `h` swapped,\n * and its top-left corner stays at the position of the box. A point (px, py) of a box of height h\n * goes to (h - py, px). Thus the top-left corner goes to the top-right corner, and each side moves\n * one step clockwise: top to right, right to bottom, bottom to left, left to top.\n */\n\n/** This function gives the side after a turn of 90 degrees clockwise. */\nexport function turnSide(side: Side): Side {\n return SIDES[(SIDES.indexOf(side) + 1) % 4]!;\n}\n\n/** This function gives a point of a box of height `h` after the turn. */\nexport function turnPoint(x: number, y: number, h: number): [number, number] {\n return [h - y, x];\n}\n\n/**\n * This function gives a port of a box of height `h` after the turn. Each value of the port turns, also a port with only `x` or only `y`.\n * The start of a side is its top end or its left end. Thus `left` goes to `top` and `right` goes to `bottom` with `along` changed to `1 - along`.\n * `top` goes to `right` and `bottom` goes to `left` with the same `along`.\n */\nexport function turnPort(port: Port, h: number): Port {\n const { side, x, y, along, ...rest } = port;\n const flips = side === \"left\" || side === \"right\";\n return {\n ...rest,\n ...(side === undefined ? {} : { side: turnSide(side) }),\n ...(y === undefined ? {} : { x: h - y }),\n ...(x === undefined ? {} : { y: x }),\n ...(along === undefined ? {} : { along: flips ? 1 - along : along }),\n };\n}\n\n/** This function gives a margin after the turn: the value of each side moves one side clockwise. */\nexport function turnMargin(margin: Margin): Margin {\n if (typeof margin === \"number\") return margin;\n const m = marginSides(margin);\n return { top: m.left, right: m.top, bottom: m.right, left: m.bottom };\n}\n\n/** This function gives a region relative to the origin of a box of height `h` after the turn. */\nexport function turnRegion(region: Region, h: number): Region {\n switch (region.kind) {\n case \"rect\":\n return { kind: \"rect\", x: h - region.y - region.h, y: region.x, w: region.h, h: region.w };\n case \"circle\":\n return { ...region, cx: h - region.cy, cy: region.cx };\n case \"ellipse\":\n return { kind: \"ellipse\", cx: h - region.cy, cy: region.cx, rx: region.ry, ry: region.rx };\n case \"polygon\": {\n const turn = (ring: readonly (readonly [number, number])[]): [number, number][] => ring.map(([x, y]) => turnPoint(x, y, h));\n return region.holes === undefined\n ? { kind: \"polygon\", points: turn(region.points) }\n : { kind: \"polygon\", points: turn(region.points), holes: region.holes.map(turn) };\n }\n }\n}\n\n/** This function gives a box after the turn: the size, the ports, the margin and the shape turn. The position stays. */\nexport function turnBox(box: LayoutBox): LayoutBox {\n return {\n ...box,\n w: box.h,\n h: box.w,\n ...(box.ports === undefined ? {} : { ports: box.ports.map((p) => turnPort(p, box.h)) }),\n ...(box.margin === undefined ? {} : { margin: turnMargin(box.margin) }),\n ...(box.shape === undefined ? {} : { shape: turnRegion(box.shape, box.h) }),\n };\n}\n","import { boundsOf, translate } from \"./geometry.ts\";\nimport type { LayoutInput } from \"./input.ts\";\nimport { turnBox } from \"./turn.ts\";\n\n/** The position of one item. `turn` is 90 when the packer turned a turnable item. */\nexport interface Placement {\n readonly id: string;\n readonly x: number;\n readonly y: number;\n readonly turn?: 0 | 90;\n}\n\n/** The facts of one stage of a strategy, for the records and the site. */\nexport interface StageTrace {\n readonly id: string;\n readonly ms?: number;\n readonly measures?: Readonly<Record<string, number>>;\n}\n\n/** The output of a packer. It does not change the input. */\nexport interface PackOutput {\n readonly placements: readonly Placement[];\n /** The ids of the items that the packer did not place. */\n readonly overflow: readonly string[];\n /** The size of the container after the pack. For a free size, the size that the search found. */\n readonly size: { readonly w: number; readonly h: number };\n /** The new top-left corner of the bounding box of each obstacle that moved. */\n readonly moved: readonly { readonly id: string; readonly x: number; readonly y: number }[];\n readonly trace?: readonly StageTrace[];\n}\n\n/**\n * This function gives the input with the output of a packer applied. Each placed box gets its position.\n * A turned box gets its turned size, ports, margin and shape. Each moved obstacle moves.\n * The container gets the size of the output. The router reads this result. It does not read `turn`.\n */\nexport function applyPack(input: LayoutInput, output: PackOutput): LayoutInput {\n const at = new Map(output.placements.map((p) => [p.id, p]));\n const moved = new Map(output.moved.map((m) => [m.id, m]));\n const boxes = input.boxes.map((box) => {\n const p = at.get(box.id);\n if (p === undefined) return box;\n const turned = p.turn === 90 ? turnBox(box) : box;\n return { ...turned, x: p.x, y: p.y };\n });\n const obstacles = input.obstacles?.map((o) => {\n const m = moved.get(o.id);\n if (m === undefined) return o;\n const b = boundsOf(o.region);\n return { ...o, region: translate(o.region, m.x - b.x, m.y - b.y) };\n });\n return {\n ...input,\n container: { ...(input.container ?? { fixed: \"none\" }), w: output.size.w, h: output.size.h },\n boxes,\n ...(obstacles === undefined ? {} : { obstacles }),\n };\n}\n","import type { Tolerance } from \"./tolerance.ts\";\nimport type { LayoutInput } from \"./input.ts\";\nimport { shapeKindsOf, type ShapeKind } from \"./shapes.ts\";\n\n/** The stage of a record: the packer, the router, or both together. */\nexport type Stage = \"pack\" | \"route\" | \"joint\";\n\n/** One run of one strategy on one input and seed: the format `layout-record/1`. A run writes one line of JSON Lines. */\nexport interface LayoutRecord {\n readonly schema: \"layout-record/1\";\n readonly stage: Stage;\n readonly step: string;\n readonly strategy: string;\n /** The options in full, with the defaults. */\n readonly options: Readonly<Record<string, unknown>>;\n readonly corpus: string;\n /** The id of the input. */\n readonly input: string;\n /** The `hash` of the input file. */\n readonly inputHash: string;\n readonly set: string;\n readonly seed: number;\n readonly nodes: number;\n readonly edges: number;\n /** The shape kinds of the boxes of the input, in the order of `SHAPE_KINDS`. Without it, each box is a `rect`. */\n readonly shapes?: readonly ShapeKind[];\n /** The value of each measure, by its name: `pack.*`, `route.*` or `joint.*`. */\n readonly measures: Readonly<Record<string, number>>;\n /** The count of the breaks of each hard rule. A good run has 0 for each rule. */\n readonly hard: Readonly<Record<string, number>>;\n /** The tolerance of each hard rule of the run. */\n readonly tolerance?: Readonly<Partial<Tolerance>>;\n /** `true` when two runs with the same seed give the same positions. */\n readonly deterministic: boolean;\n /** The id of the prediction that was written before the run. */\n readonly prediction?: string;\n /** The median of `msRuns`, or the time of the one run. */\n readonly ms: number;\n /** The time of each timed repeat, in milliseconds. */\n readonly msRuns?: readonly number[];\n /**\n * The first 16 hex characters of the SHA-256 of the canonical output of the stage.\n * The packer hashes its placements by the order of the ids. The router hashes its routes by the order of the edge ids.\n */\n readonly outputHash?: string;\n /** The facts of the computer of the run. */\n readonly env?: RunEnv;\n /** The reason when the strategy did not run, for example an input over its `maxNodes`. Then the record has no measures. */\n readonly skipped?: string;\n readonly commit?: string;\n}\n\n/**\n * The values that a strategy supports, for each dimension of a taxonomy.\n * The dimension names are in `docs/FORMAT.md` of `packing` and `docs/LAYOUT-RECORDS.md` of `highways`.\n */\nexport type Supports = Readonly<Record<string, readonly string[]>>;\n\n/** The facts of the computer of a run. */\nexport interface RunEnv {\n readonly node: string;\n readonly os: string;\n readonly arch: string;\n /** The name of the runner, for example `ubuntu-latest` or `local`. */\n readonly runner: string;\n /** The model of the processor. */\n readonly cpu: string;\n /** The count of the logical processors. */\n readonly cpus: number;\n}\n\n/** The facts of a run that the input does not give. */\nexport type RunFacts = Omit<LayoutRecord, \"schema\" | \"input\" | \"inputHash\" | \"set\" | \"nodes\" | \"edges\" | \"shapes\">;\n\n/**\n * This function gives the record of a run. The input gives its id, its hash, its set and the counts of the nodes and the edges.\n * The input also gives `shapes`. An input with only `rect` boxes gets no `shapes`, so its record does not change.\n */\nexport function toLayoutRecord(input: LayoutInput, run: RunFacts): LayoutRecord {\n const shapes = shapeKindsOf(input);\n const onlyRect = shapes.length === 0 || (shapes.length === 1 && shapes[0] === \"rect\");\n return {\n schema: \"layout-record/1\",\n ...run,\n input: input.id,\n inputHash: input.hash ?? \"\",\n set: input.set ?? \"\",\n nodes: input.boxes.length,\n edges: input.edges?.length ?? 0,\n ...(onlyRect ? {} : { shapes }),\n };\n}\n","import { boundsOf, grow, overlapOf, type Rect, type Region } from \"./geometry.ts\";\nimport type { LayoutBox, LayoutInput, Obstacle, PairGap, Port } from \"./input.ts\";\nimport { applyPack, type PackOutput } from \"./output.ts\";\nimport { SHAPE_KIND_IDS, shapeKindProblem, type ShapeSupport } from \"./shapes.ts\";\nimport { DEFAULT_TOLERANCE, EPS, RECORD_EPS } from \"./tolerance.ts\";\n\n/** This function gives the area of a placed box: its shape or its rectangle, at its position. A box without a position gives `undefined`. */\nexport function placedRect(box: LayoutBox): Rect | undefined {\n if (box.x === undefined || box.y === undefined) return undefined;\n if (box.shape === undefined) return { x: box.x, y: box.y, w: box.w, h: box.h };\n const b = boundsOf(box.shape);\n return { x: box.x + b.x, y: box.y + b.y, w: b.w, h: b.h };\n}\n\n/**\n * This function counts the pairs of placed boxes whose insides, with their margins, overlap by more than `tolerance` on each axis.\n * A box with a shape counts as its bounding box. That area is larger, thus the count is safe.\n *\n * A pair of `pairGaps`, in either order, uses its `gap` in place of the two margins. One box grows by the gap, and the other box does not grow.\n * Thus the pair breaks the rule only when the boxes are nearer than the gap on each axis. The other pairs do not change.\n */\nexport function countOverlaps(boxes: readonly LayoutBox[], tolerance: number = DEFAULT_TOLERANCE.overlap, pairGaps?: readonly PairGap[]): number {\n if (pairGaps === undefined || pairGaps.length === 0) return marginOverlaps(boxes, tolerance, undefined);\n const gaps = new Map<string, number>();\n for (const p of pairGaps) {\n const key = pairKey(p.a, p.b);\n if (p.a !== p.b && !gaps.has(key)) gaps.set(key, p.gap);\n }\n const raw = new Map<string, Rect>();\n for (const box of boxes) {\n const r = placedRect(box);\n if (r !== undefined && !raw.has(box.id)) raw.set(box.id, r);\n }\n let count = marginOverlaps(boxes, tolerance, gaps);\n for (const [key, gap] of gaps) {\n const [a, b] = JSON.parse(key) as [string, string];\n const ra = raw.get(a);\n const rb = raw.get(b);\n if (ra === undefined || rb === undefined) continue;\n const o = overlapOf(grow(ra, gap), rb);\n if (o.x > tolerance && o.y > tolerance) count++;\n }\n return count;\n}\n\n/** This function gives the key of a pair of box ids, with the same key for each order. */\nconst pairKey = (a: string, b: string): string => JSON.stringify(a < b ? [a, b] : [b, a]);\n\n/** This function counts the overlaps of the boxes with their margins. It skips the pairs of `skip`. Without `skip`, it is the rule of 0.2.13. */\nfunction marginOverlaps(boxes: readonly LayoutBox[], tolerance: number, skip: ReadonlyMap<string, number> | undefined): number {\n const rects: { readonly id: string; readonly r: Rect }[] = [];\n for (const box of boxes) {\n const r = placedRect(box);\n if (r !== undefined) rects.push({ id: box.id, r: grow(r, box.margin) });\n }\n rects.sort((a, b) => a.r.x - b.r.x);\n let count = 0;\n for (let i = 0; i < rects.length; i++) {\n const a = rects[i]!.r;\n for (let j = i + 1; j < rects.length; j++) {\n const b = rects[j]!.r;\n if (b.x >= a.x + a.w - tolerance) break;\n if (skip !== undefined && skip.has(pairKey(rects[i]!.id, rects[j]!.id))) continue;\n const o = overlapOf(a, b);\n if (o.x > tolerance && o.y > tolerance) count++;\n }\n }\n return count;\n}\n\n/** The options of the container test of `countOutside` and `packHard`. */\nexport interface ContainerTest {\n /**\n * With `true`, a box of a shaped container with the size `fixed` must stay inside the shape, not only inside its bounding box.\n * The default is `false`. The default changes to `true` at the next breaking version.\n */\n readonly exactContainer?: boolean;\n}\n\n/**\n * This function counts the placed boxes that go out of the container.\n * Each box with its margin must stay inside the container made smaller by `inset`. Only the fixed sides of the size count. A shaped container counts as its bounding box.\n *\n * With `exactContainer`, a box of a shaped container with the size `fixed` also counts when `rectInRegion` tells that it is not inside the shape.\n * For that test, the box grows by `inset` and becomes smaller by `tolerance` on each side. A shaped container with a free side keeps the bounding test only.\n * An input without a container gives 0.\n */\nexport function countOutside(input: LayoutInput, tolerance: number = DEFAULT_TOLERANCE.overlap, options: ContainerTest = {}): number {\n const c = input.container;\n if (c === undefined) return 0;\n const shape = options.exactContainer === true && c.fixed === \"size\" ? c.shape : undefined;\n const area = c.shape === undefined ? { x: 0, y: 0, w: c.w ?? Infinity, h: c.h ?? Infinity } : boundsOf(c.shape);\n const inset = c.inset ?? 0;\n const fixW = c.fixed === \"size\" || c.fixed === \"width\";\n const fixH = c.fixed === \"size\" || c.fixed === \"height\";\n let count = 0;\n for (const box of input.boxes) {\n const r0 = placedRect(box);\n if (r0 === undefined) continue;\n const r = grow(r0, box.margin);\n const outX = r.x < area.x + inset - tolerance || r.x + r.w > area.x + area.w - inset + tolerance;\n const outY = r.y < area.y + inset - tolerance || r.y + r.h > area.y + area.h - inset + tolerance;\n if ((fixW && outX) || (fixH && outY)) count++;\n else if (shape !== undefined && !rectInRegion(shape, shrink(grow(r, inset), tolerance))) count++;\n }\n return count;\n}\n\n/** This function counts the fixed ports that are not on the border of their box, with the epsilon of a written file. A port without a side does not count. */\nexport function countPortsOffBorder(boxes: readonly LayoutBox[], eps: number = RECORD_EPS): number {\n let count = 0;\n for (const box of boxes) {\n for (const p of box.ports ?? []) {\n if (p.x === undefined || p.y === undefined || p.side === undefined) continue;\n const along = p.side === \"top\" || p.side === \"bottom\" ? p.x : p.y;\n const length = p.side === \"top\" || p.side === \"bottom\" ? box.w : box.h;\n const across = { top: p.y, bottom: p.y - box.h, left: p.x, right: p.x - box.w }[p.side];\n if (Math.abs(across) > eps || along < -eps || along > length + eps) count++;\n }\n }\n return count;\n}\n\n/** The count of the breaks of each hard rule of a pack. */\nexport interface PackHard {\n readonly \"no-overlap\": number;\n readonly \"in-container\": number;\n readonly \"locked-kept\": number;\n readonly complete: number;\n}\n\n/**\n * The hard rules of a pack, with the shape kinds that each rule supports.\n * `no-overlap` and `in-container` test the bounding box of a shape. That count is exact only for a `rect`.\n * `locked-kept` and `complete` read only the positions and the ids, so they support each kind.\n */\nexport const PACK_HARD_RULES: readonly ShapeSupport<keyof PackHard>[] = Object.freeze([\n { id: \"no-overlap\", shapes: [\"rect\"] },\n { id: \"in-container\", shapes: [\"rect\"] },\n { id: \"locked-kept\", shapes: SHAPE_KIND_IDS },\n { id: \"complete\", shapes: SHAPE_KIND_IDS },\n] as const);\n\n/** This function tells if the inside of `region` and the inside of `rect` have a common point. */\nexport function regionHitsRect(region: Region, rect: Rect): boolean {\n if (rect.w <= 0 || rect.h <= 0) return false;\n switch (region.kind) {\n case \"rect\": {\n const o = overlapOf(region, rect);\n return o.x > 0 && o.y > 0;\n }\n case \"circle\":\n return circleHitsRect(region.cx, region.cy, region.r, region.r, rect);\n case \"ellipse\":\n return circleHitsRect(region.cx, region.cy, region.rx, region.ry, rect);\n case \"polygon\": {\n const rings = [region.points, ...(region.holes ?? [])];\n const inside = (x: number, y: number): boolean => x > rect.x && x < rect.x + rect.w && y > rect.y && y < rect.y + rect.h;\n if (region.points.some(([x, y]) => inside(x, y))) return true;\n for (const ring of rings) {\n for (let i = 0; i < ring.length; i++) {\n const a = ring[i]!;\n const b = ring[(i + 1) % ring.length]!;\n const m = clipMid(a[0], a[1], b[0], b[1], rect);\n if (m !== undefined && inside(m[0], m[1])) return true;\n }\n }\n return pointInRings(rect.x + rect.w / 2, rect.y + rect.h / 2, rings);\n }\n }\n}\n\n/**\n * This function tells if all of `rect` is inside `region`. A point on the border counts as inside. No part of `rect` can overlap a hole.\n * The test of a circle, an ellipse or a polygon accepts an error of `EPS` on the border. A polygon can be concave.\n */\nexport function rectInRegion(region: Region, rect: Rect): boolean {\n const x1 = rect.x + rect.w;\n const y1 = rect.y + rect.h;\n const corners: readonly (readonly [number, number])[] = [\n [rect.x, rect.y],\n [x1, rect.y],\n [x1, y1],\n [rect.x, y1],\n ];\n switch (region.kind) {\n case \"rect\":\n return rect.x >= region.x && rect.y >= region.y && x1 <= region.x + region.w && y1 <= region.y + region.h;\n case \"circle\":\n return corners.every(([x, y]) => inEllipse(region.cx, region.cy, region.r, region.r, x, y));\n case \"ellipse\":\n return corners.every(([x, y]) => inEllipse(region.cx, region.cy, region.rx, region.ry, x, y));\n case \"polygon\": {\n const ring = region.points;\n if (ring.length < 3) return false;\n const points = [...corners, [rect.x + rect.w / 2, rect.y + rect.h / 2] as const];\n if (!points.every(([x, y]) => onRing(x, y, ring) || pointInRings(x, y, [ring]))) return false;\n const deep = (x: number, y: number): boolean => x > rect.x + EPS && x < x1 - EPS && y > rect.y + EPS && y < y1 - EPS;\n for (let i = 0; i < ring.length; i++) {\n const a = ring[i]!;\n const b = ring[(i + 1) % ring.length]!;\n const m = clipMid(a[0], a[1], b[0], b[1], rect);\n if (m !== undefined && deep(m[0], m[1])) return false;\n }\n return (region.holes ?? []).every((hole) => !regionHitsRect({ kind: \"polygon\", points: hole }, rect));\n }\n }\n}\n\n/** This function gives the rectangle made smaller by `d` on each side. A side does not become smaller than 0. */\nfunction shrink(r: Rect, d: number): Rect {\n const dx = Math.min(d, r.w / 2);\n const dy = Math.min(d, r.h / 2);\n return { x: r.x + dx, y: r.y + dy, w: r.w - 2 * dx, h: r.h - 2 * dy };\n}\n\n/** This function tells if a point is inside an ellipse or on its border, with an error of `EPS`. */\nfunction inEllipse(cx: number, cy: number, rx: number, ry: number, x: number, y: number): boolean {\n if (rx <= 0 || ry <= 0) return false;\n const u = (x - cx) / rx;\n const v = (y - cy) / ry;\n return u * u + v * v <= 1 + EPS;\n}\n\n/** This function tells if a point is on a ring of a polygon, with an error of `EPS`. */\nfunction onRing(x: number, y: number, ring: readonly (readonly [number, number])[]): boolean {\n for (let i = 0; i < ring.length; i++) {\n const [ax, ay] = ring[i]!;\n const [bx, by] = ring[(i + 1) % ring.length]!;\n const dx = bx - ax;\n const dy = by - ay;\n const len2 = dx * dx + dy * dy;\n const t = len2 === 0 ? 0 : Math.max(0, Math.min(1, ((x - ax) * dx + (y - ay) * dy) / len2));\n if (Math.hypot(x - (ax + t * dx), y - (ay + t * dy)) <= EPS) return true;\n }\n return false;\n}\n\n/** An ellipse with the radii `rx` and `ry` scales to a unit circle. The rectangle scales with it. */\nfunction circleHitsRect(cx: number, cy: number, rx: number, ry: number, rect: Rect): boolean {\n if (rx <= 0 || ry <= 0) return false;\n const x0 = (rect.x - cx) / rx;\n const x1 = (rect.x + rect.w - cx) / rx;\n const y0 = (rect.y - cy) / ry;\n const y1 = (rect.y + rect.h - cy) / ry;\n const dx = Math.max(x0, 0, -x1);\n const dy = Math.max(y0, 0, -y1);\n return dx * dx + dy * dy < 1;\n}\n\n/** This function gives the middle of the part of a segment inside a rectangle, or `undefined` when that part is a point or empty. */\nfunction clipMid(ax: number, ay: number, bx: number, by: number, r: Rect): readonly [number, number] | undefined {\n let t0 = 0;\n let t1 = 1;\n const dx = bx - ax;\n const dy = by - ay;\n const edges: readonly (readonly [number, number])[] = [\n [-dx, ax - r.x],\n [dx, r.x + r.w - ax],\n [-dy, ay - r.y],\n [dy, r.y + r.h - ay],\n ];\n for (const [p, q] of edges) {\n if (p === 0) {\n if (q < 0) return undefined;\n } else if (p < 0) {\n t0 = Math.max(t0, q / p);\n } else {\n t1 = Math.min(t1, q / p);\n }\n }\n if (t1 <= t0) return undefined;\n const t = (t0 + t1) / 2;\n return [ax + t * dx, ay + t * dy];\n}\n\n/** The even-odd rule over the outer ring and the holes. */\nfunction pointInRings(x: number, y: number, rings: readonly (readonly (readonly [number, number])[])[]): boolean {\n let inside = false;\n for (const ring of rings) {\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n const [xi, yi] = ring[i]!;\n const [xj, yj] = ring[j]!;\n if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) inside = !inside;\n }\n }\n return inside;\n}\n\n/**\n * This function counts the pairs of a placed box and an obstacle that overlap by more than `tolerance`.\n * The box counts with its margin. A box with a shape counts as its bounding box.\n */\nexport function countObstacleHits(\n boxes: readonly LayoutBox[],\n obstacles: readonly Obstacle[] | undefined,\n tolerance: number = DEFAULT_TOLERANCE.overlap,\n): number {\n if (obstacles === undefined || obstacles.length === 0) return 0;\n let count = 0;\n for (const box of boxes) {\n const r0 = placedRect(box);\n if (r0 === undefined) continue;\n const r = grow(r0, box.margin);\n const small = { x: r.x + tolerance, y: r.y + tolerance, w: r.w - 2 * tolerance, h: r.h - 2 * tolerance };\n for (const o of obstacles) if (regionHitsRect(o.region, small)) count++;\n }\n return count;\n}\n\n/**\n * This function gives the count of each hard rule of the output of a packer.\n * It applies the output with `applyPack`. Only the placed boxes and the locked boxes count for the overlaps and the container.\n * `no-overlap` counts the pairs of boxes and the pairs of a box and an obstacle. A pair of `pairGaps` uses its gap in place of the margins.\n *\n * A locked box without a placement, or with a move of more than `RECORD_EPS`, breaks `locked-kept`.\n * A locked box without a position in the input is a bad input, not a break. `checkInput` finds it.\n * Another box without a placement that is not in `overflow` breaks `complete`.\n *\n * `options` goes to `countOutside` for `in-container`.\n */\nexport function packHard(input: LayoutInput, output: PackOutput, tolerance: number = DEFAULT_TOLERANCE.overlap, options: ContainerTest = {}): PackHard {\n const after = applyPack(input, output);\n const placed = new Set(output.placements.map((p) => p.id));\n const out = new Set(output.overflow);\n const was = new Map(input.boxes.map((b) => [b.id, b]));\n let lockedMoved = 0;\n let incomplete = 0;\n const kept: LayoutBox[] = [];\n for (const box of after.boxes) {\n const old = was.get(box.id);\n if (old?.locked === true) {\n if (old.x === undefined || old.y === undefined) continue;\n const moved = Math.abs(old.x - (box.x ?? old.x)) > RECORD_EPS || Math.abs(old.y - (box.y ?? old.y)) > RECORD_EPS;\n if (!placed.has(box.id) || moved) lockedMoved++;\n kept.push(box);\n } else if (placed.has(box.id)) {\n kept.push(box);\n } else if (!out.has(box.id)) {\n incomplete++;\n }\n }\n return {\n \"no-overlap\": countOverlaps(kept, tolerance, input.pairGaps) + countObstacleHits(kept, after.obstacles, tolerance),\n \"in-container\": countOutside({ ...after, boxes: kept }, tolerance, options),\n \"locked-kept\": lockedMoved,\n complete: incomplete,\n };\n}\n\n/**\n * This function gives the problems of an input file. An empty list tells that the file is good.\n * A problem is a bad input, not a break of a hard rule. Thus an engine refuses the input.\n * In `pairGaps`, an unknown box, a pair of one box, a repeated pair in either order, a bad `gap` and bad `lanes` are problems.\n * A port with `along` and no `side`, with `x` or `y`, or with a value outside [0, 1] is a problem.\n */\nexport function checkInput(input: LayoutInput): readonly string[] {\n const problems: string[] = [];\n const ids = new Set<string>();\n for (const box of input.boxes) {\n if (ids.has(box.id)) problems.push(`box ${box.id}: the id is not unique`);\n ids.add(box.id);\n if (!(box.w > 0 && box.h > 0 && Number.isFinite(box.w) && Number.isFinite(box.h))) problems.push(`box ${box.id}: the size is not positive and finite`);\n if (box.locked === true && (box.x === undefined || box.y === undefined)) problems.push(`box ${box.id}: a locked box has no position`);\n const shape = shapeKindProblem(box);\n if (shape !== undefined) problems.push(shape);\n for (const port of box.ports ?? []) problems.push(...alongProblems(box.id, port));\n }\n if (countPortsOffBorder(input.boxes) > 0) problems.push(\"a fixed port is not on the border of its box\");\n for (const edge of input.edges ?? []) {\n if (!ids.has(edge.source) || !ids.has(edge.target)) problems.push(`edge ${edge.id}: a box of the edge is not in the input`);\n }\n problems.push(...pairGapProblems(input.pairGaps, ids));\n return problems;\n}\n\n/** This function gives the problems of the `along` of a port: no side, a value outside [0, 1], or `x` or `y` with it. A port without `along` has no problem. */\nfunction alongProblems(boxId: string, port: Port): string[] {\n if (port.along === undefined) return [];\n const at = `box ${boxId} port ${port.id}`;\n const problems: string[] = [];\n if (port.side === undefined) problems.push(`${at}: a port with along has no side`);\n if (typeof port.along !== \"number\" || !Number.isFinite(port.along) || port.along < 0 || port.along > 1)\n problems.push(`${at}: the along value ${String(port.along)} is not a finite number from 0 to 1`);\n if (port.x !== undefined || port.y !== undefined) problems.push(`${at}: a port with along also has x or y`);\n return problems;\n}\n\n/** This function gives the problems of the `pairGaps` of an input. `ids` has the ids of the boxes. */\nfunction pairGapProblems(pairGaps: LayoutInput[\"pairGaps\"], ids: ReadonlySet<string>): string[] {\n if (pairGaps === undefined) return [];\n if (!Array.isArray(pairGaps)) return [\"pairGaps: the value is not a list\"];\n const problems: string[] = [];\n const seen = new Map<string, number>();\n pairGaps.forEach((p: PairGap, i) => {\n const at = `pair gap ${i} (${String(p?.a)}, ${String(p?.b)})`;\n if (typeof p !== \"object\" || p === null || typeof p.a !== \"string\" || typeof p.b !== \"string\") {\n problems.push(`pair gap ${i}: the entry has no string ids a and b`);\n return;\n }\n for (const id of [p.a, p.b]) if (!ids.has(id)) problems.push(`${at}: the box ${id} is not in the input`);\n if (p.a === p.b) problems.push(`${at}: the two ids are the same box`);\n if (typeof p.gap !== \"number\" || !Number.isFinite(p.gap) || p.gap < 0) problems.push(`${at}: the gap ${String(p.gap)} is not a finite number of 0 or more`);\n if (p.lanes !== undefined && (typeof p.lanes !== \"number\" || !Number.isInteger(p.lanes) || p.lanes < 0))\n problems.push(`${at}: the lanes value ${String(p.lanes)} is not a whole number of 0 or more`);\n const key = JSON.stringify(p.a < p.b ? [p.a, p.b] : [p.b, p.a]);\n const first = seen.get(key);\n if (first !== undefined) problems.push(`${at}: the pair is also pair gap ${first}`);\n else seen.set(key, i);\n });\n return problems;\n}\n","import { SHAPE_KIND_IDS, type ShapeKind } from \"./shapes.ts\";\nimport { RECORD_EPS, RECORD_SCALE } from \"./tolerance.ts\";\n\n/** The direction of a measure: the side of the better values. */\nexport type Direction = \"lower\" | \"higher\";\n\n/**\n * The facts of one measure: its unit, its direction and its range.\n * `floor` and `tol` are the parameters of the floor rule of the promotion rule (`docs/PROMOTION.md` of `highways`).\n * Each engine exports the specs of its own measures. This package exports the specs of the `joint.*` measures.\n */\nexport interface MeasureSpec<Id extends string = string> {\n readonly id: Id;\n readonly unit: string;\n readonly direction: Direction;\n /** The lowest value. */\n readonly min: number;\n /** The highest value. The value `Infinity` tells that the measure has no upper limit. */\n readonly max: number;\n /** The family of the measure in the measure note of its engine. */\n readonly family?: string;\n /** The best value. Without it, the measure has no floor. */\n readonly floor?: number;\n /** The absolute tolerance at the floor. */\n readonly tol?: number;\n /**\n * The smallest change that counts as better or worse. A number is an absolute change. `{ rel }` is a share of the larger of the two values.\n * `docs/JOINT-MEASURES.md` gives the reason of each joint value.\n */\n readonly minEffect?: number | { readonly rel: number };\n /** The role of the measure in the joint selector. */\n readonly role?: \"guard\" | \"change-guard\" | \"diagnostic\" | \"time\";\n /** The shape kinds of the boxes that the measure supports. Without it, the measure supports only `rect`. `checkShapes` refuses the other kinds. */\n readonly shapes?: readonly ShapeKind[];\n}\n\n/** The id of a joint measure. `docs/JOINT-MEASURES.md` gives the definitions. */\nexport type JointMeasureId =\n | \"joint.fill\"\n | \"joint.aspectError\"\n | \"joint.spill\"\n | \"joint.straight.crossings\"\n | \"joint.straight.length\"\n | \"joint.stability.mean\"\n | \"joint.stability.moved\"\n | \"joint.proxy.rank\"\n | \"joint.ms\";\n\n/** The shape kinds of a joint measure that reads only the bounding boxes, the centers and the positions of the boxes. */\nconst BOUNDS_ONLY = SHAPE_KIND_IDS;\n/** The shape kinds of a joint measure that reads the area `w` by `h` of each box. */\nconst AREA: readonly ShapeKind[] = [\"rect\"];\n\n/**\n * The specs of the joint measures, in the order of `docs/JOINT-MEASURES.md`.\n * `joint.fill` and `joint.straight.length` read the area of each box, so they support only `rect`. `docs/SHAPES.md` tells the reasons.\n */\nexport const JOINT_MEASURES: readonly MeasureSpec<JointMeasureId>[] = Object.freeze([\n { id: \"joint.fill\", minEffect: 0.001, unit: \"0 to 1\", direction: \"higher\", min: 0, max: 1, floor: 1, role: \"guard\", shapes: AREA },\n { id: \"joint.aspectError\", minEffect: 0.01, unit: \"natural log\", direction: \"lower\", min: 0, max: Infinity, floor: 0, tol: 0.01, role: \"guard\", shapes: BOUNDS_ONLY },\n { id: \"joint.spill\", minEffect: 0.001, unit: \"0 to 1\", direction: \"lower\", min: 0, max: 1, floor: 0, tol: 0.001, role: \"guard\", shapes: BOUNDS_ONLY },\n { id: \"joint.straight.crossings\", minEffect: 0, unit: \"count\", direction: \"lower\", min: 0, max: Infinity, floor: 0, tol: 0, role: \"guard\", shapes: BOUNDS_ONLY },\n { id: \"joint.straight.length\", minEffect: 0.01, unit: \"S for each edge\", direction: \"lower\", min: 0, max: Infinity, floor: 0, tol: 0.01, role: \"guard\", shapes: AREA },\n { id: \"joint.stability.mean\", minEffect: 0.005, unit: \"W\", direction: \"lower\", min: 0, max: Infinity, floor: 0, tol: 0.005, role: \"change-guard\", shapes: BOUNDS_ONLY },\n { id: \"joint.stability.moved\", minEffect: 0.02, unit: \"0 to 1\", direction: \"lower\", min: 0, max: 1, floor: 0, tol: 0.02, role: \"change-guard\", shapes: BOUNDS_ONLY },\n { id: \"joint.proxy.rank\", unit: \"-1 to 1\", direction: \"higher\", min: -1, max: 1, role: \"diagnostic\", shapes: BOUNDS_ONLY },\n { id: \"joint.ms\", unit: \"milliseconds\", direction: \"lower\", min: 0, max: Infinity, role: \"time\", shapes: BOUNDS_ONLY },\n] as const);\n\n/** The threshold of `joint.stability.moved`, in widths `W` of the base. */\nexport const JOINT_MOVED_MIN = 0.01;\n\n/** The result of a compare of a candidate with a baseline on one measure. A tie is not better. */\nexport type Verdict = \"better\" | \"worse\" | \"tie\";\n\n/**\n * This function gives the smallest change of a measure that counts between the values `a` and `b`.\n * The value is `max(RECORD_EPS, minEffect)`, or `max(RECORD_EPS, rel * max(|a|, |b|))` for a relative `minEffect`.\n * The larger value makes the threshold the same after a swap of `a` and `b`.\n */\nexport function minEffectOf(spec: Pick<MeasureSpec, \"minEffect\">, a = 0, b = 0): number {\n const m = spec.minEffect ?? 0;\n const t = typeof m === \"number\" ? m : m.rel * Math.max(Math.abs(a), Math.abs(b));\n return Math.max(RECORD_EPS, Number.isFinite(t) ? t : 0);\n}\n\n/** The slack of the threshold in grid steps. It absorbs only the float noise of the threshold, because the change is a whole number. */\nconst STEP_NOISE = 1e-6;\n\n/**\n * This function compares the value `candidate` with the value `baseline` of one measure on one input.\n * The compare uses whole grid steps of `RECORD_EPS`. Thus a live value and its rounded record give the same verdict.\n * A change of at most the threshold of `minEffectOf` in grid steps is a tie. A swap of the two values swaps better and worse.\n * Two equal values are a tie, also two infinite values. A value `NaN` is an error.\n */\nexport function compareMeasure(candidate: number, baseline: number, spec: Pick<MeasureSpec, \"direction\" | \"minEffect\">): Verdict {\n if (Number.isNaN(candidate) || Number.isNaN(baseline)) throw new RangeError(\"compareMeasure: a value is NaN\");\n if (candidate === baseline) return \"tie\";\n const a = Math.round(candidate * RECORD_SCALE);\n const b = Math.round(baseline * RECORD_SCALE);\n let delta: number;\n if (Number.isSafeInteger(a) && Number.isSafeInteger(b)) {\n delta = a - b;\n const m = spec.minEffect ?? 0;\n const t = typeof m === \"number\" ? m * RECORD_SCALE : m.rel * Math.max(Math.abs(a), Math.abs(b));\n if (Math.abs(delta) <= Math.max(1, Number.isFinite(t) ? t : 0) + STEP_NOISE) return \"tie\";\n } else {\n delta = candidate - baseline;\n if (!(Math.abs(delta) > minEffectOf(spec, candidate, baseline))) return \"tie\";\n }\n const better = spec.direction === \"lower\" ? delta < 0 : delta > 0;\n return better ? \"better\" : \"worse\";\n}\n","/** This function gives the UTF-8 bytes of a string. The package has no runtime dependencies, thus it does not use `TextEncoder`. */\nexport function utf8(text: string): number[] {\n const bytes: number[] = [];\n for (const ch of text) {\n const c = ch.codePointAt(0)!;\n if (c < 0x80) bytes.push(c);\n else if (c < 0x800) bytes.push(0xc0 | (c >> 6), 0x80 | (c & 63));\n else if (c < 0x10000) bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 63), 0x80 | (c & 63));\n else bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 63), 0x80 | ((c >> 6) & 63), 0x80 | (c & 63));\n }\n return bytes;\n}\n","import { utf8 } from \"./utf8.ts\";\n\n/** This function gives a generator of random numbers in [0, 1). It is `mulberry32`, as in `docs/FORMAT.md` of `packing`. */\nexport function mulberry32(seed: number): () => number {\n let s = seed >>> 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/** This function gives the FNV-1a hash of 32 bits of the UTF-8 bytes of a string. */\nexport function fnv1a32(text: string): number {\n let h = 0x811c9dc5;\n for (const b of utf8(text)) h = Math.imul(h ^ b, 0x01000193) >>> 0;\n return h;\n}\n\n/** This function gives the generator of one step of a seeded generator: `mulberry32(fnv1a32(\"<seed>:<step>\"))`. */\nexport function stepRandom(seed: number, step: string): () => number {\n return mulberry32(fnv1a32(`${seed}:${step}`));\n}\n\n/** This function gives a whole number from `lo` to `hi`, both included. */\nexport function randomInt(r: () => number, lo: number, hi: number): number {\n return lo + Math.floor(r() * (hi - lo + 1));\n}\n","import { SIDES, type Side } from \"./geometry.ts\";\nimport type { LayoutBox, LayoutEdge, LayoutGenerator, LayoutInput, Port } from \"./input.ts\";\nimport { randomInt, stepRandom } from \"./random.ts\";\n\n/**\n * The shape of the edges of `edgeStep`. The values are the cells of `edgeShape`, and `hubs`.\n * `hubs` waits for the next breaking change to become a value of `LayoutCell.edgeShape`.\n */\nexport type EdgeShape = \"random\" | \"clustered\" | \"hubChain\" | \"hubs\" | \"longRange\" | \"tree\" | \"bundled\";\n\n/** The parameters of `edgeStep`. */\nexport interface EdgeStepParams {\n readonly edgeDensity: \"sparse\" | \"medium\" | \"dense\";\n readonly edgeShape: EdgeShape;\n /** The default is `none`. */\n readonly groups?: \"none\" | \"flat\" | \"nested\";\n /** The default is `free`. */\n readonly ports?: \"free\" | \"sides\" | \"fixed\";\n /** The order of the hubs of `hubs` and `tree`: the largest box first, or a random order. The default is `area`. */\n readonly hubBy?: \"area\" | \"random\";\n}\n\n/** The mean count of the edges of each box for each value of `edgeDensity`. */\nexport const EDGE_DENSITY: Readonly<Record<EdgeStepParams[\"edgeDensity\"], number>> = Object.freeze({ sparse: 0.5, medium: 1.5, dense: 4 });\n\n/** The version of `edgeStep`. A change of its output gives a new version. */\nexport const EDGE_STEP_VERSION = 1;\n\nconst CLUSTER = 8;\nconst CHAIN = 32;\nconst INSIDE = 0.85;\nconst FAN_SHARE = 0.6;\nconst FIXED_SHARE = 0.2;\nconst COLLECTIONS = [\"users\", \"orders\", \"items\", \"events\"] as const;\n\nconst round3 = (x: number): number => Math.round(x * 1000) / 1000;\n\n/**\n * This function gives the input with edges, groups and ports from its topology alone: a joint input has no positions before the pack.\n * The random numbers come from the steps `edges` and `ports` of `seed`. The function appends its stamp to `steps`, and removes the old `hash`.\n * The rules of each shape are in `docs/JOINT-CORPUS.md`.\n */\nexport function edgeStep(input: LayoutInput, params: EdgeStepParams, seed: number = input.seed ?? 0): LayoutInput {\n if ((input.edges?.length ?? 0) > 0) throw new RangeError(\"edgeStep: the input has edges already\");\n const full: Required<EdgeStepParams> = { groups: \"none\", ports: \"free\", hubBy: \"area\", ...params };\n const n = input.boxes.length;\n const r = stepRandom(seed, \"edges\");\n\n const perm = input.boxes.map((_, i) => i);\n for (let i = n - 1; i > 0; i--) {\n const j = randomInt(r, 0, i);\n [perm[i], perm[j]] = [perm[j]!, perm[i]!];\n }\n const clusterOf: number[] = new Array<number>(n);\n perm.forEach((box, p) => (clusterOf[box] = Math.floor(p / CLUSTER)));\n const clusters = Math.ceil(n / CLUSTER);\n const members = (c: number): readonly number[] => perm.slice(c * CLUSTER, (c + 1) * CLUSTER);\n const collectionOf =\n full.edgeShape === \"bundled\"\n ? clusterOf.map((c) => `${COLLECTIONS[c % COLLECTIONS.length]!}-${c}`)\n : input.boxes.map(() => COLLECTIONS[randomInt(r, 0, COLLECTIONS.length - 1)]!);\n const area = (i: number): number => input.boxes[i]!.w * input.boxes[i]!.h;\n const rank = full.hubBy === \"area\" ? input.boxes.map((_, i) => i).sort((a, b) => area(b) - area(a) || a - b) : perm;\n\n const pairs: [number, number][] = [];\n const seen = new Set<string>();\n const add = (u: number, v: number): void => {\n const key = u < v ? `${u}-${v}` : `${v}-${u}`;\n if (u === v || seen.has(key)) return;\n seen.add(key);\n pairs.push([u, v]);\n };\n const anyBox = (): number => randomInt(r, 0, n - 1);\n const inCluster = (c: number): number => {\n const m = members(c);\n return m[randomInt(r, 0, m.length - 1)]!;\n };\n const otherCluster = (c: number): number => {\n const o = randomInt(r, 0, clusters - 2);\n return o >= c ? o + 1 : o;\n };\n const target = Math.min(Math.round(n * EDGE_DENSITY[full.edgeDensity]), (n * (n - 1)) / 2);\n const fill = (pick: () => [number, number]): void => {\n for (let tries = 0; pairs.length < target && tries < target * 30; tries++) add(...pick());\n };\n const clustered = (): [number, number] => {\n const u = anyBox();\n return [u, r() < INSIDE ? inCluster(clusterOf[u]!) : anyBox()];\n };\n\n if (n >= 2) {\n switch (full.edgeShape) {\n case \"random\":\n fill(() => [anyBox(), anyBox()]);\n break;\n case \"clustered\":\n fill(clustered);\n break;\n case \"longRange\":\n fill(() => {\n const u = anyBox();\n return [u, clusters > 1 ? inCluster(otherCluster(clusterOf[u]!)) : anyBox()];\n });\n break;\n case \"hubs\":\n fill(() => [anyBox(), rank[Math.floor(n * r() ** 3)]!]);\n break;\n case \"tree\":\n for (let i = 1; i < n; i++) add(rank[randomInt(r, 0, i - 1)]!, rank[i]!);\n break;\n case \"hubChain\": {\n const k = Math.ceil(n / CHAIN);\n const length = Math.ceil(n / k);\n const chains = Array.from({ length: k }, (_, c) => perm.slice(c * length, (c + 1) * length));\n for (const chain of chains) for (let i = 0; i + 1 < chain.length; i++) add(chain[i]!, chain[i + 1]!);\n const skips = Math.max(0, target - pairs.length);\n for (let s = 0; s < skips; s++) {\n const c = k > 1 ? randomInt(r, 0, k - 2) : 0;\n const from = chains[c]!;\n const to = chains[k > 1 ? c + 1 : 0]!;\n const i = randomInt(r, 0, from.length - 1);\n const j = i + Math.floor(from.length / 8) + randomInt(r, 0, Math.floor(from.length / 2));\n if (j < to.length) add(from[i]!, to[j]!);\n }\n break;\n }\n case \"bundled\":\n for (let rounds = 0; pairs.length < target * FAN_SHARE && clusters > 1 && rounds < target; rounds++) {\n const u = anyBox();\n const c = otherCluster(clusterOf[u]!);\n const fan = randomInt(r, 4, 15);\n for (let f = 0; f < fan && pairs.length < target; f++) add(u, inCluster(c));\n }\n fill(clustered);\n break;\n }\n }\n\n const rp = stepRandom(seed, \"ports\");\n const ports: Port[][] = input.boxes.map((b) => [...(b.ports ?? [])]);\n const portOn = (box: LayoutBox, id: string, side: Side, fixed: boolean): Port => {\n if (!fixed) return { id, side };\n const along = round3(rp() * (side === \"top\" || side === \"bottom\" ? box.w : box.h));\n const at = { top: [along, 0], bottom: [along, box.h], left: [0, along], right: [box.w, along] }[side];\n return { id, side, x: at[0]!, y: at[1]! };\n };\n const out = new Set<number>();\n if (full.ports === \"fixed\") {\n input.boxes.forEach((box, i) => {\n if (rp() >= FIXED_SHARE) return;\n const side = SIDES[randomInt(rp, 0, 3)]!;\n ports[i]!.push(portOn(box, \"out\", side, true));\n out.add(i);\n });\n }\n const edges: LayoutEdge[] = pairs.map(([u, v], k) => {\n const id = `e${k}`;\n const s = input.boxes[u]!;\n const t = input.boxes[v]!;\n let ends: { sourcePort?: string; targetPort?: string } = {};\n if (full.ports === \"sides\") {\n ports[u]!.push(portOn(s, `${id}.s`, SIDES[randomInt(rp, 0, 3)]!, false));\n ports[v]!.push(portOn(t, `${id}.t`, SIDES[randomInt(rp, 0, 3)]!, false));\n ends = { sourcePort: `${id}.s`, targetPort: `${id}.t` };\n } else if (out.has(u)) {\n ends = { sourcePort: \"out\" };\n }\n return { id, source: s.id, target: t.id, ...ends, data: { collection: collectionOf[v]! } };\n });\n\n const boxes = input.boxes.map((box, i): LayoutBox => {\n const c = clusterOf[i]!;\n const group = full.groups === \"none\" ? undefined : `g${c}`;\n const path = full.groups === \"nested\" ? `G${Math.floor(c / 4)}/g${c}` : group;\n return {\n ...box,\n ...(group === undefined ? {} : { group, data: { ...box.data, group: path } }),\n ...(ports[i]!.length === 0 ? {} : { ports: ports[i]! }),\n };\n });\n const stamp: LayoutGenerator = { name: \"edges\", version: EDGE_STEP_VERSION, params: { ...full }, seed };\n const { hash: _old, ...rest } = input;\n return { ...rest, boxes, edges, steps: [...(input.steps ?? []), stamp] };\n}\n","import { canonicalInput, type LayoutInput } from \"./input.ts\";\nimport { RECORD_EPS } from \"./tolerance.ts\";\nimport { utf8 } from \"./utf8.ts\";\n\n/** The round constants of SHA-256. */\nconst K: readonly number[] = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe,\n 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n];\n\n/**\n * This function gives the SHA-256 digest of the UTF-8 bytes of a string, as 64 lowercase hex characters.\n * It uses no API of Node or of the browser.\n */\nexport function sha256Hex(text: string): string {\n const bytes = utf8(text);\n const bits = bytes.length * 8;\n const total = Math.ceil((bytes.length + 9) / 64) * 64;\n const data = new Uint8Array(total);\n data.set(bytes);\n data[bytes.length] = 0x80;\n const view = new DataView(data.buffer);\n view.setUint32(total - 8, Math.floor(bits / 0x100000000));\n view.setUint32(total - 4, bits >>> 0);\n const h = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19];\n const w = new Uint32Array(64);\n const rotr = (x: number, n: number): number => (x >>> n) | (x << (32 - n));\n for (let off = 0; off < total; off += 64) {\n for (let i = 0; i < 16; i++) w[i] = view.getUint32(off + 4 * i);\n for (let i = 16; i < 64; i++) {\n const a = w[i - 15]!;\n const b = w[i - 2]!;\n const s0 = rotr(a, 7) ^ rotr(a, 18) ^ (a >>> 3);\n const s1 = rotr(b, 17) ^ rotr(b, 19) ^ (b >>> 10);\n w[i] = (w[i - 16]! + s0 + w[i - 7]! + s1) >>> 0;\n }\n let [a, b, c, d, e, f, g, k] = h as [number, number, number, number, number, number, number, number];\n for (let i = 0; i < 64; i++) {\n const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);\n const ch = (e & f) ^ (~e & g);\n const t1 = (k + s1 + ch + K[i]! + w[i]!) >>> 0;\n const s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const t2 = (s0 + maj) >>> 0;\n k = g;\n g = f;\n f = e;\n e = (d + t1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) >>> 0;\n }\n h[0] = (h[0]! + a) >>> 0;\n h[1] = (h[1]! + b) >>> 0;\n h[2] = (h[2]! + c) >>> 0;\n h[3] = (h[3]! + d) >>> 0;\n h[4] = (h[4]! + e) >>> 0;\n h[5] = (h[5]! + f) >>> 0;\n h[6] = (h[6]! + g) >>> 0;\n h[7] = (h[7]! + k) >>> 0;\n }\n return h.map((x) => x.toString(16).padStart(8, \"0\")).join(\"\");\n}\n\n/**\n * This function gives the canonical form of a value: sorted keys and no whitespace, with the numbers of `JSON.stringify`.\n * A key with the value `undefined` is not in the form. An `undefined` in an array becomes `null`.\n */\nexport function canonicalJson(value: unknown): string {\n if (value === null || typeof value !== \"object\") return JSON.stringify(value) ?? \"null\";\n if (Array.isArray(value)) return `[${value.map((v: unknown) => (v === undefined ? \"null\" : canonicalJson(v))).join(\",\")}]`;\n const o = value as Record<string, unknown>;\n const keys = Object.keys(o)\n .filter((k) => o[k] !== undefined)\n .sort();\n return `{${keys.map((k) => `${JSON.stringify(k)}:${canonicalJson(o[k])}`).join(\",\")}}`;\n}\n\n/** The options of `outputHash` and `documentHash`. */\nexport interface HashOptions {\n /**\n * The step of the grid of the numbers. The default is `RECORD_EPS`, so a number keeps 3 decimals.\n * The value `0` keeps the exact numbers. A negative value or a value that is not finite causes a `RangeError`.\n */\n readonly grid?: number;\n}\n\n/** This function gives the factor of a grid: `1 / grid`, or `undefined` for the exact numbers. */\nfunction gridFactor(options: HashOptions): number | undefined {\n const grid = options.grid ?? RECORD_EPS;\n if (!Number.isFinite(grid) || grid < 0) throw new RangeError(`The grid ${grid} is not a finite number of 0 or more.`);\n return grid === 0 ? undefined : 1 / grid;\n}\n\n/**\n * This function gives a copy of a value with each number on the grid. The value `-0` becomes `0`.\n * It throws a `RangeError` for a number that is not finite.\n */\nfunction onGrid(value: unknown, path: string, k: number | undefined): unknown {\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new RangeError(`The value has the number ${value} at ${path}. JSON has no form for it.`);\n if (k === undefined) return value;\n const r = Math.round(value * k) / k;\n if (!Number.isFinite(r)) throw new RangeError(`The number at ${path} is too large for the grid.`);\n return r === 0 ? 0 : r;\n }\n if (value === null || typeof value !== \"object\") return value;\n if (Array.isArray(value)) return value.map((v: unknown, i) => onGrid(v, `${path}[${i}]`, k));\n const o = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(o)) out[key] = onGrid(o[key], `${path}.${key}`, k);\n return out;\n}\n\n/**\n * This function gives the hash of an output: the first 16 hex characters of the SHA-256 of its canonical form.\n * Before the canonical form, each number goes to the nearest point of the grid, and `-0` becomes `0`.\n * With the default grid, the rounding is `round3` of `packing`: `Math.round(x * 1000) / 1000`.\n * The function throws a `RangeError` for `NaN` and for an infinite number.\n *\n * The grid can split two outputs. Two numbers near a rounding boundary can go to two different points.\n * The grid can also merge two outputs whose numbers go to the same points. This merge is intentional: it removes the noise of floating-point numbers.\n */\nexport function outputHash(value: unknown, options: HashOptions = {}): string {\n return sha256Hex(canonicalJson(onGrid(value, \"$\", gridFactor(options)))).slice(0, 16);\n}\n\n/**\n * This function gives the hash of a document. It uses the rule of `outputHash`, but the form does not include the field `hash` of the document.\n * With the default grid, it is the input hash of `docs/FORMAT.md` of `packing`.\n * A document with the schema `layout-input/1` goes through `canonicalInput` first. Thus the order of its `pairGaps` does not change the hash.\n */\nexport function documentHash(doc: object, options: HashOptions = {}): string {\n const { hash: _hash, ...rest } = doc as { readonly hash?: unknown; readonly schema?: unknown };\n return outputHash(rest.schema === \"layout-input/1\" ? canonicalInput(rest as unknown as LayoutInput) : rest, options);\n}\n\n/** One output group: the candidates with the same output hash on each decision input. */\nexport interface OutputGroup {\n /** The id of the group: its first member. */\n readonly id: string;\n /** The ids of the candidates of the group, in sorted order. */\n readonly members: readonly string[];\n}\n\n/**\n * This function gives the output groups of the candidates. The key of `hashes` is the id of a candidate.\n * Its value is the list of the output hashes of the candidate, in the order of the decision inputs.\n * Candidates with equal lists make one group. The groups are in the order of their ids.\n * The function throws a `RangeError` when two lists have different lengths.\n */\nexport function outputGroups(hashes: Readonly<Record<string, readonly string[]>>): OutputGroup[] {\n const byList = new Map<string, string[]>();\n let first: string | undefined;\n for (const id of Object.keys(hashes)) {\n const list = hashes[id]!;\n if (first === undefined) first = id;\n else if (list.length !== hashes[first]!.length)\n throw new RangeError(`The candidate \"${id}\" has ${list.length} hashes, but \"${first}\" has ${hashes[first]!.length}.`);\n const key = JSON.stringify(list);\n const members = byList.get(key);\n if (members) members.push(id);\n else byList.set(key, [id]);\n }\n const groups = [...byList.values()].map((members): OutputGroup => {\n const sorted = [...members].sort();\n return { id: sorted[0]!, members: sorted };\n });\n return groups.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n}\n\n/** The evidence that a candidate is exercised on its decision inputs. */\nexport interface ExerciseEvidence {\n /** The move counts of the candidate, by name. A record keeps each one as the trace measure `move.<name>`. */\n readonly moves?: Readonly<Record<string, number>>;\n /** The output hashes of the candidate, in the order of the decision inputs. */\n readonly hashes?: readonly string[];\n /** The output hashes of the base of the candidate, in the same order. */\n readonly baseHashes?: readonly string[];\n}\n\n/**\n * This function tells if a candidate is exercised. It gives `true` when a move count is more than 0.\n * It also gives `true` when `hashes` and `baseHashes` are different at one place or more.\n * Without evidence, it gives `false`.\n * The function throws a `RangeError` when only one of the two lists is given, or when their lengths are different.\n */\nexport function exercised(evidence: ExerciseEvidence): boolean {\n const { moves, hashes, baseHashes } = evidence;\n if ((hashes === undefined) !== (baseHashes === undefined)) throw new RangeError(\"The evidence must have both hashes and baseHashes, or neither of them.\");\n if (hashes && baseHashes && hashes.length !== baseHashes.length)\n throw new RangeError(`The candidate has ${hashes.length} hashes, but its base has ${baseHashes.length}.`);\n if (moves && Object.values(moves).some((n) => n > 0)) return true;\n if (hashes && baseHashes) return hashes.some((h, i) => h !== baseHashes[i]);\n return false;\n}\n","import { outputHash } from \"./hash.ts\";\nimport { compareMeasure, type MeasureSpec } from \"./measures.ts\";\n\n/** The part of a `MeasureSpec` that a pick uses: the direction and the `minEffect`. */\nexport type PickSpec = Pick<MeasureSpec, \"direction\" | \"minEffect\">;\n\n/** A member of a portfolio: a function with an id. A portfolio is also a member. */\nexport interface Member<I, O> {\n readonly id: string;\n /** This function gives the output of the member for an input. */\n run(input: I): O;\n}\n\n/** One level of the key of a portfolio: a measure of an output. */\nexport interface PortfolioLevel<I, O> {\n /** The id of the level. The id `hard` is reserved. */\n readonly id: string;\n readonly spec: PickSpec;\n /** This function gives the value of the measure for the output of a member. The value must be finite. */\n value(input: I, output: O): number;\n}\n\n/** The key of a portfolio: the hard level, then the other levels in order. */\nexport interface PortfolioKey<I, O> {\n /** This function gives the count of hard breaks. It is level 0, with the direction `lower` and the `minEffect` 0. */\n hard(input: I, output: O): number;\n /** The levels after the hard level, in the order of the pick. */\n readonly levels: readonly PortfolioLevel<I, O>[];\n /** This function gives the hash of an output. The default is `outputHash` with the default grid. */\n hash?(output: O): string;\n}\n\n/** The options of a portfolio. */\nexport interface PortfolioOptions {\n /** The time limit in milliseconds, 0 or more. The first member always starts. A member that starts always finishes. */\n readonly budgetMs?: number;\n /** The largest count of members that run, a whole number of 1 or more. The other members are cut. */\n readonly maxMembers?: number;\n /** The clock in milliseconds. The default is `performance.now`, or `Date.now` without `performance`. */\n readonly now?: () => number;\n /**\n * The members that get an output hash. The default `all` hashes each member with the status `ran`. A hash that throws then gives the status `error`.\n * With `pick`, only member 0 and the winner get a hash, and only when the winner is not member 0. Then a hash that throws makes `pick` throw.\n */\n readonly hashes?: \"all\" | \"pick\";\n}\n\n/** The status of a member in a pick. */\nexport type MemberStatus = \"ran\" | \"cut\" | \"error\";\n\n/** The trace of one member in a pick. */\nexport interface MemberTrace {\n readonly id: string;\n readonly status: MemberStatus;\n /** The value of each level, with the key `hard` for the hard level. Only a member with the status `ran` has values. */\n readonly values?: Readonly<Record<string, number>>;\n /** The time of the run of the member, in milliseconds. */\n readonly ms?: number;\n /**\n * The hash of the output of the member. Under the option `hashes` \"all\" (the default), each member with the status `ran` has it.\n * Under `hashes` \"pick\", it is absent, except for member 0 and the winner when the winner is not member 0.\n */\n readonly outputHash?: string;\n /** The message of the error of a member with the status `error`. */\n readonly error?: string;\n}\n\n/** The trace of one pick of a portfolio. */\nexport interface PortfolioTrace {\n /** One entry for each member, in the order of the members. A cut member is also in the list. */\n readonly members: readonly MemberTrace[];\n readonly winner: string;\n /** The index of the winner in the list of the members. */\n readonly winnerIndex: number;\n /** The value `true` tells that the winner is not member 0 and has a different output hash. */\n readonly picked: boolean;\n /** The time of the full pick, in milliseconds. */\n readonly totalMs: number;\n readonly budgetMs?: number;\n readonly maxMembers?: number;\n /** The count of the cut members. */\n readonly cut: number;\n /** The value `false` tells that the time limit cut one member or more. Then a run on a different computer can give a different pick. */\n readonly deterministic: boolean;\n /** The ids of the members that stay in after each level of `selectBest`. The first list is for the hard level. */\n readonly kept: readonly (readonly string[])[];\n}\n\n/** The result of one pick of a portfolio: the output of the winner, its id and the trace. */\nexport interface PortfolioPick<O> {\n readonly output: O;\n readonly winner: string;\n readonly trace: PortfolioTrace;\n}\n\n/** A portfolio: a member that runs its members and gives the output of the best member. */\nexport interface Portfolio<I, O> extends Member<I, O> {\n /** This function starts the members on an input and gives the output of the winner with the trace. */\n pick(input: I): PortfolioPick<O>;\n}\n\n/** A candidate of `selectBest`: an id and the value of each level. */\nexport interface SelectCandidate {\n readonly id: string;\n readonly values: Readonly<Record<string, number>>;\n}\n\n/** A level of `selectBest`: the id of a value and its spec. */\nexport interface SelectLevel {\n readonly id: string;\n readonly spec: PickSpec;\n}\n\n/** The result of `selectBest`. */\nexport interface Selection {\n readonly winner: string;\n /** The ids of the candidates that stay in after each level, in the given order. */\n readonly kept: readonly (readonly string[])[];\n}\n\n/**\n * This function picks the best candidate. For each level, it finds the best value of the candidates that stay in.\n * It keeps each candidate that is not worse than that best value by `compareMeasure`.\n * The winner is the first candidate, in the given order, that stays in after the last level.\n * Without levels, the winner is the first candidate and `kept` is empty.\n *\n * The reason for the rule: a scan that compares each candidate with the current winner is not transitive, because of the `minEffect` ties.\n * Such a scan can drift away from the best value. An example: \"a\" is lower with the `minEffect` 0.005, and \"b\" is higher.\n * The candidates A (0, 1), B (0.004, 2) and C (0.008, 3) give the winner B.\n * The scan picks C, but A is better than C on \"a\".\n *\n * The function throws a `RangeError` for an empty list of candidates, for a missing value, and for a value that is not finite.\n */\nexport function selectBest(candidates: readonly SelectCandidate[], levels: readonly SelectLevel[]): Selection {\n if (candidates.length === 0) throw new RangeError(\"selectBest: the list of candidates is empty.\");\n for (const level of levels) {\n for (const c of candidates) {\n const v = c.values[level.id];\n if (typeof v !== \"number\") throw new RangeError(`selectBest: the candidate \"${c.id}\" has no value for the level \"${level.id}\".`);\n if (!Number.isFinite(v)) throw new RangeError(`selectBest: the candidate \"${c.id}\" has the value ${v} for the level \"${level.id}\".`);\n }\n }\n let alive: readonly SelectCandidate[] = candidates;\n const kept: (readonly string[])[] = [];\n for (const level of levels) {\n const at = (c: SelectCandidate): number => c.values[level.id]!;\n let best = at(alive[0]!);\n for (const c of alive) best = level.spec.direction === \"lower\" ? Math.min(best, at(c)) : Math.max(best, at(c));\n alive = alive.filter((c) => compareMeasure(at(c), best, level.spec) !== \"worse\");\n kept.push(alive.map((c) => c.id));\n }\n return { winner: alive[0]!.id, kept };\n}\n\n/** This function gives the move `pick` of a pick: 1 when `picked` is true, else 0. A record keeps it as the trace measure `move.pick`. */\nexport function pickMoves(trace: Pick<PortfolioTrace, \"picked\">): { pick: number } {\n return { pick: trace.picked ? 1 : 0 };\n}\n\n/** This function gives the default clock: `performance.now`, or `Date.now` without `performance`. */\nfunction defaultClock(): () => number {\n const perf = (globalThis as { readonly performance?: { now(): number } }).performance;\n return perf ? () => perf.now() : () => Date.now();\n}\n\n/** This function gives the message of an error value. */\nfunction messageOf(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n\n/** This function throws a `RangeError` for an empty list of members or for two members with the same id. */\nfunction checkMembers(id: string, members: readonly Member<unknown, unknown>[]): void {\n if (members.length === 0) throw new RangeError(`The portfolio \"${id}\" has no members.`);\n const seen = new Set<string>();\n for (const m of members) {\n if (seen.has(m.id)) throw new RangeError(`The portfolio \"${id}\" has two members with the id \"${m.id}\".`);\n seen.add(m.id);\n }\n}\n\n/** The result of the run of one member. */\ntype Ran<O> = { readonly ok: true; readonly output: O; readonly values: Record<string, number>; readonly hash?: string } | { readonly ok: false; readonly error: unknown };\n\n/**\n * This function makes a portfolio. Its `pick` starts the members in their order. `selectBest` picks the winner of the members with the status `ran`.\n * The first level is the hard level, then the levels of the key follow.\n * `members` is a list, or a function of the input that gives the list.\n *\n * A member that throws, or that gives a value that is not finite, gets the status `error`. It does not win.\n * When each member has an error, `pick` throws the error of the first member.\n * `docs/PORTFOLIO.md` tells the rules of the time limit, the trace and `picked`.\n *\n * The function throws a `RangeError` for a level with the id `hard`, for two levels with the same id and for a bad option.\n * It also throws a `RangeError` for an empty list of members, or for two members with the same id.\n */\nexport function portfolio<I, O>(\n id: string,\n members: readonly Member<I, O>[] | ((input: I) => readonly Member<I, O>[]),\n key: PortfolioKey<I, O>,\n options: PortfolioOptions = {},\n): Portfolio<I, O> {\n const levelIds = new Set<string>();\n for (const level of key.levels) {\n if (level.id === \"hard\") throw new RangeError(`The portfolio \"${id}\" has a level with the reserved id \"hard\".`);\n if (levelIds.has(level.id)) throw new RangeError(`The portfolio \"${id}\" has two levels with the id \"${level.id}\".`);\n levelIds.add(level.id);\n }\n const { budgetMs, maxMembers, hashes = \"all\" } = options;\n if (budgetMs !== undefined && !(budgetMs >= 0)) throw new RangeError(`The portfolio \"${id}\" has the budgetMs ${budgetMs}. It must be 0 or more.`);\n if (maxMembers !== undefined && !(Number.isInteger(maxMembers) && maxMembers >= 1))\n throw new RangeError(`The portfolio \"${id}\" has the maxMembers ${maxMembers}. It must be a whole number of 1 or more.`);\n if (hashes !== \"all\" && hashes !== \"pick\") throw new RangeError(`The portfolio \"${id}\" has the hashes ${String(hashes)}. It must be \"all\" or \"pick\".`);\n if (typeof members !== \"function\") checkMembers(id, members);\n const levels: readonly SelectLevel[] = [{ id: \"hard\", spec: { direction: \"lower\", minEffect: 0 } }, ...key.levels.map((l) => ({ id: l.id, spec: l.spec }))];\n const now = options.now ?? defaultClock();\n\n /** This function gives the hash of the output of a member. A hash that throws causes a `RangeError`. */\n const hashOf = (m: Member<I, O>, output: O): string => {\n try {\n return key.hash ? key.hash(output) : outputHash(output);\n } catch (e) {\n throw new RangeError(`The hash of the member \"${m.id}\" of the portfolio \"${id}\" throws: ${messageOf(e)}`, { cause: e });\n }\n };\n\n const evaluate = (m: Member<I, O>, input: I, output: O): Ran<O> => {\n const values: Record<string, number> = {};\n const measure = (level: string, f: () => number): void => {\n let v: number;\n try {\n v = f();\n } catch (e) {\n throw new RangeError(`The level \"${level}\" of the member \"${m.id}\" of the portfolio \"${id}\" throws: ${messageOf(e)}`, { cause: e });\n }\n if (typeof v !== \"number\" || !Number.isFinite(v))\n throw new RangeError(`The member \"${m.id}\" of the portfolio \"${id}\" has the value ${v} for the level \"${level}\".`);\n values[level] = v;\n };\n try {\n measure(\"hard\", () => key.hard(input, output));\n for (const level of key.levels) measure(level.id, () => level.value(input, output));\n if (hashes === \"pick\") return { ok: true, output, values };\n return { ok: true, output, values, hash: hashOf(m, output) };\n } catch (e) {\n return { ok: false, error: e };\n }\n };\n\n const pick = (input: I): PortfolioPick<O> => {\n const list = typeof members === \"function\" ? members(input) : members;\n if (typeof members === \"function\") checkMembers(id, list);\n const start = now();\n const traces: MemberTrace[] = [];\n const outputs = new Map<string, O>();\n const ran: SelectCandidate[] = [];\n let firstError: { readonly error: unknown } | undefined;\n let cut = 0;\n let outOfTime = false;\n for (let i = 0; i < list.length; i++) {\n const m = list[i]!;\n if (maxMembers !== undefined && i >= maxMembers) {\n traces.push({ id: m.id, status: \"cut\" });\n cut++;\n continue;\n }\n if (i > 0 && budgetMs !== undefined && (outOfTime || now() - start >= budgetMs)) {\n outOfTime = true;\n traces.push({ id: m.id, status: \"cut\" });\n cut++;\n continue;\n }\n const t0 = now();\n let result: Ran<O>;\n let ms: number;\n try {\n const output = m.run(input);\n ms = now() - t0;\n result = evaluate(m, input, output);\n } catch (e) {\n ms = now() - t0;\n result = { ok: false, error: e };\n }\n if (result.ok) {\n traces.push(\n result.hash === undefined\n ? { id: m.id, status: \"ran\", values: result.values, ms }\n : { id: m.id, status: \"ran\", values: result.values, ms, outputHash: result.hash },\n );\n outputs.set(m.id, result.output);\n ran.push({ id: m.id, values: result.values });\n } else {\n traces.push({ id: m.id, status: \"error\", ms, error: messageOf(result.error) });\n firstError ??= { error: result.error };\n }\n }\n if (ran.length === 0) throw firstError!.error;\n const { winner, kept } = selectBest(ran, levels);\n const winnerIndex = traces.findIndex((t) => t.id === winner);\n if (hashes === \"pick\" && winnerIndex > 0 && traces[0]!.status === \"ran\") {\n // Only member 0 and the winner get a hash. Their two trace entries are new objects with the hash.\n for (const i of [0, winnerIndex]) traces[i] = { ...traces[i]!, outputHash: hashOf(list[i]!, outputs.get(traces[i]!.id)!) };\n }\n const base = traces[0]!;\n const picked = winnerIndex > 0 && (base.status !== \"ran\" || traces[winnerIndex]!.outputHash !== base.outputHash);\n const trace: PortfolioTrace = {\n members: traces,\n winner,\n winnerIndex,\n picked,\n totalMs: now() - start,\n ...(budgetMs !== undefined ? { budgetMs } : {}),\n ...(maxMembers !== undefined ? { maxMembers } : {}),\n cut,\n deterministic: !outOfTime,\n kept,\n };\n return { output: outputs.get(winner)!, winner, trace };\n };\n\n return { id, pick, run: (input: I): O => pick(input).output };\n}\n","// The checks of the claims of a corpus (`docs/CORPUS-CHECKS.md`). The joint corpus, `packing` and `highways` use the same checks.\nimport { canonicalJson, sha256Hex } from \"./hash.ts\";\n\n/** One broken claim of a corpus, with the ids of the inputs that break it. */\nexport interface ClaimBreak {\n /** The name of the claim, for example `declared`, `split` or `index`. */\n readonly claim: string;\n /** The text of the break. */\n readonly detail: string;\n /** The ids of the inputs that break the claim. The list is empty when the break has no input. */\n readonly inputs: readonly string[];\n}\n\n/** The claim `claims.declared` of a manifest: the count of the inputs for each declared property. */\nexport interface DeclaredClaim {\n /** A property with fewer inputs than this count is thin. */\n readonly minCount: number;\n /** The ids of the properties with a count below `minCount`. */\n readonly thin: readonly string[];\n /** The count of the inputs for each property id. */\n readonly counts: Readonly<Record<string, number>>;\n /** The key of the family of an input. `familyOf` gives the key of one cell. The family is the unit of a verdict. */\n readonly familyBy?: FamilyBy;\n /** The minimum count of the inputs of each family. Without it, `checkDeclared` does not count the families. */\n readonly familyMin?: number;\n}\n\n/**\n * The key of the family of a cell (`docs/CORPUS-CHECKS.md`).\n *\n * - The flat form is a list of dimensions. The key is the values of these dimensions of the cell, in order, with `/` between them.\n * - The map form chooses an entry by the field `kind` of the cell, or the entry `\"*\"`. The key is the kind, then the values of the dimensions of the entry.\n */\nexport type FamilyBy = readonly string[] | { readonly [kind: string]: readonly string[] };\n\n/** A cell of an input: one value for each dimension. The map form of `FamilyBy` also reads the field `kind`. */\nexport type FamilyCell = Readonly<Record<string, unknown>>;\n\n/** The entry of the map form of `FamilyBy` for each kind without its own entry. */\nexport const FAMILY_ANY_KIND = \"*\";\n\n/** The separator of the parts of a family key. */\nconst FAMILY_SEP = \"/\";\n\n/** The parts of the key of one cell, or the text of the problem. */\ntype FamilyParts = { readonly parts: readonly string[] } | { readonly problem: string };\n\n/** This function gives the text of a dimension value. A missing value, or a value that is not a string, a number or a boolean, gives `undefined`. */\nfunction partOf(value: unknown): string | undefined {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return undefined;\n}\n\n/** This function gives the parts of the family key of a cell. A missing dimension, a missing kind or a kind without an entry gives a problem. */\nfunction familyParts(cell: FamilyCell, familyBy: FamilyBy): FamilyParts {\n let dims: readonly string[];\n let kind: string | undefined;\n const parts: string[] = [];\n if (Array.isArray(familyBy)) {\n dims = familyBy as readonly string[];\n } else {\n const map = familyBy as Readonly<Record<string, readonly string[]>>;\n kind = partOf(cell[\"kind\"]);\n if (kind === undefined) return { problem: \"a cell without kind, which the map form of familyBy needs\" };\n const entry = Object.hasOwn(map, kind) ? map[kind] : Object.hasOwn(map, FAMILY_ANY_KIND) ? map[FAMILY_ANY_KIND] : undefined;\n if (entry === undefined) return { problem: `the kind \"${kind}\", which has no entry in familyBy and no entry \"${FAMILY_ANY_KIND}\"` };\n dims = entry;\n parts.push(kind);\n }\n for (const dim of dims) {\n const part = partOf(cell[dim]);\n if (part === undefined) return { problem: `a cell${kind === undefined ? \"\" : ` of the kind \"${kind}\"`} without the dimension \"${dim}\" of familyBy` };\n parts.push(part);\n }\n return { parts };\n}\n\n/**\n * This function gives the family key of a cell. It throws a `RangeError` when the cell does not have a dimension of the key.\n * In the map form, it also throws for a cell without `kind`, and for a kind with no entry and no entry `\"*\"`.\n * For example, `{ \"rect-grid\": [\"obstacles\"], \"*\": [] }` gives `rect-grid/wall` for a `rect-grid` cell and `gallery` for a `gallery` cell.\n */\nexport function familyOf(cell: FamilyCell, familyBy: FamilyBy): string {\n const found = familyParts(cell, familyBy);\n if (\"problem\" in found) throw new RangeError(`familyOf: ${found.problem}.`);\n return found.parts.join(FAMILY_SEP);\n}\n\n/** This function tells if a value is a `FamilyBy`: a list of dimensions, or a map from a kind to a list of dimensions. */\nfunction isFamilyBy(value: unknown): value is FamilyBy {\n const isDims = (v: unknown): boolean => Array.isArray(v) && v.every((d) => typeof d === \"string\");\n return isDims(value) || (isObject(value) && Object.values(value).every(isDims));\n}\n\n/** The hook that gives the ids of the properties that one input declares. */\nexport type Declares<I> = (input: I) => readonly string[];\n\n/**\n * This function gives the count of the inputs for each property id. Each id of `ids` has a count, also when the count is 0.\n * An id from `declares` that is not in `ids` comes after the ids of `ids`, in the order of the first input that declares it.\n */\nexport function declaredCounts<I>(inputs: Iterable<I>, declares: Declares<I>, ids: readonly string[] = []): Record<string, number> {\n const out: Record<string, number> = Object.fromEntries(ids.map((id) => [id, 0]));\n for (const input of inputs) for (const id of declares(input)) out[id] = (out[id] ?? 0) + 1;\n return out;\n}\n\n/** This function tells if a value is a plain object. */\nconst isObject = (value: unknown): value is Record<string, unknown> => value !== null && typeof value === \"object\" && !Array.isArray(value);\n\n/**\n * This function reads the field `claims.declared` of a manifest. A manifest without it gives `undefined`.\n * It throws an `Error` for a claim without a whole `minCount`, a list `thin` of ids and a whole count for each id.\n */\nexport function declaredClaimOf(manifest: object): DeclaredClaim | undefined {\n const claims = (manifest as Record<string, unknown>)[\"claims\"];\n if (claims === undefined) return undefined;\n if (!isObject(claims)) throw new Error(\"The field claims of a corpus file is an object.\");\n const declared = claims[\"declared\"];\n if (declared === undefined) return undefined;\n if (!isObject(declared)) throw new Error(\"The field claims.declared of a corpus file is an object.\");\n const { minCount, thin, counts } = declared;\n if (!Number.isInteger(minCount) || (minCount as number) < 0) throw new Error(\"The field claims.declared.minCount is a whole number of 0 or more.\");\n if (!Array.isArray(thin) || !thin.every((id) => typeof id === \"string\")) throw new Error(\"The field claims.declared.thin is a list of property ids.\");\n if (!isObject(counts) || !Object.values(counts).every((n) => Number.isInteger(n) && (n as number) >= 0)) {\n throw new Error(\"The field claims.declared.counts gives a whole count for each property id.\");\n }\n const { familyBy, familyMin } = declared;\n if (familyBy !== undefined && !isFamilyBy(familyBy)) throw new Error(\"The field claims.declared.familyBy is a list of dimensions, or a map from a kind to a list of dimensions.\");\n if (familyMin !== undefined && (!Number.isInteger(familyMin) || (familyMin as number) < 0)) throw new Error(\"The field claims.declared.familyMin is a whole number of 0 or more.\");\n return {\n minCount: minCount as number,\n thin: [...(thin as string[])],\n counts: { ...(counts as Record<string, number>) },\n ...(familyBy === undefined ? {} : { familyBy: Array.isArray(familyBy) ? [...familyBy] : { ...(familyBy as Record<string, readonly string[]>) } }),\n ...(familyMin === undefined ? {} : { familyMin: familyMin as number }),\n };\n}\n\n/**\n * This function checks the claim `claims.declared` against the inputs. It gives one break `declared` for each problem. An empty list tells that the claim is true.\n *\n * - `ids` are the property ids. The default is the ids of `claim.counts`.\n * - Each id of `ids` has a count in `claim.counts`, and `claim.counts` has no other id. Each count is the count of the inputs.\n * - An id with a count below `minCount` is in `thin`. Each id of `thin` is an id of `ids`.\n * - Each id that `declares` gives is an id of `ids`.\n *\n * With `claim.familyBy`, the hook `cellOf` gives the cell of each input. The default reads the field `cell` of the input.\n *\n * - Each cell has each dimension of its key. In the map form, each cell has a `kind`, and the kind has an entry or the entry `\"*\"` is there.\n * - Two cells with different dimension values do not give the same key.\n * - With `claim.familyMin`, each family has `familyMin` inputs or more.\n */\nexport function checkDeclared<I>(\n inputs: Iterable<I>,\n declares: Declares<I>,\n claim: DeclaredClaim,\n ids: readonly string[] = Object.keys(claim.counts),\n cellOf: (input: I) => FamilyCell | undefined = cellField,\n): ClaimBreak[] {\n const list = [...inputs];\n const computed = declaredCounts(list, declares, ids);\n const out: string[] = [];\n for (const id of ids) {\n if (!(id in claim.counts)) out.push(`the property \"${id}\" has no count`);\n else if (claim.counts[id] !== computed[id]) out.push(`the property \"${id}\" has the count ${claim.counts[id]}, but the inputs give ${computed[id]}`);\n }\n for (const id of Object.keys(claim.counts)) if (!ids.includes(id)) out.push(`\"${id}\" is not a declared property`);\n for (const id of ids) {\n const thin = (computed[id] ?? 0) < claim.minCount;\n if (thin && !claim.thin.includes(id)) out.push(`the property \"${id}\" has ${computed[id]} inputs, below minCount ${claim.minCount}, and it is not in thin`);\n }\n for (const id of claim.thin) if (!ids.includes(id)) out.push(`\"${id}\" of thin is not a declared property`);\n for (const id of Object.keys(computed)) if (!ids.includes(id)) out.push(`${computed[id]} inputs declare \"${id}\", which is not a declared property`);\n const breaks: ClaimBreak[] = out.map((detail) => ({ claim: \"declared\", detail, inputs: [] }));\n if (claim.familyBy !== undefined) breaks.push(...checkFamilies(list, claim.familyBy, claim.familyMin, cellOf));\n return breaks;\n}\n\n/** This function gives the field `cell` of an input, when it is an object. */\nfunction cellField(input: unknown): FamilyCell | undefined {\n const cell = isObject(input) ? input[\"cell\"] : undefined;\n return isObject(cell) ? cell : undefined;\n}\n\n/** This function gives the field `id` of an input, or its place in the list. */\nfunction inputId(input: unknown, at: number): string {\n const id = isObject(input) ? input[\"id\"] : undefined;\n return typeof id === \"string\" ? id : `#${at}`;\n}\n\n/** This function gives the breaks of the family keys of the inputs: the problems of each key, the collisions and the thin families. */\nfunction checkFamilies<I>(inputs: readonly I[], familyBy: FamilyBy, familyMin: number | undefined, cellOf: (input: I) => FamilyCell | undefined): ClaimBreak[] {\n const problems = new Map<string, string[]>();\n const members = new Map<string, { readonly tuples: Map<string, string[]>; readonly ids: string[] }>();\n inputs.forEach((input, at) => {\n const id = inputId(input, at);\n const cell = cellOf(input);\n const found: FamilyParts = cell === undefined ? { problem: \"no cell, which familyBy needs\" } : familyParts(cell, familyBy);\n if (\"problem\" in found) {\n problems.set(found.problem, [...(problems.get(found.problem) ?? []), id]);\n return;\n }\n const key = found.parts.join(FAMILY_SEP);\n const family = members.get(key) ?? { tuples: new Map<string, string[]>(), ids: [] };\n const tuple = JSON.stringify(found.parts);\n family.tuples.set(tuple, [...(family.tuples.get(tuple) ?? []), id]);\n family.ids.push(id);\n members.set(key, family);\n });\n const breaks: ClaimBreak[] = [];\n const add = (detail: string, ids: readonly string[]): void => void breaks.push({ claim: \"declared\", detail, inputs: [...ids] });\n for (const [problem, ids] of problems) add(`${ids.length} inputs have ${problem}`, ids);\n for (const [key, family] of members) {\n if (family.tuples.size > 1) {\n const forms = [...family.tuples.keys()].join(\" and \");\n add(`the family \"${key}\" comes from different dimension values: ${forms}`, family.ids);\n }\n if (familyMin !== undefined && family.ids.length < familyMin) add(`the family \"${key}\" has ${family.ids.length} inputs, below familyMin ${familyMin}`, family.ids);\n }\n return breaks;\n}\n\n/** The id and the hash of one input of a corpus. */\nexport interface CorpusEntry {\n readonly id: string;\n readonly hash: string;\n}\n\n/**\n * This function gives the hash of a corpus: the first 16 hex characters of a SHA-256. The text of the SHA-256 is `canonicalJson`\n * of the corpus id and the `[id, hash]` of each input, in the order of the manifest. A change of one input changes the hash.\n */\nexport function corpusHashOf(corpus: string, inputs: readonly CorpusEntry[]): string {\n return sha256Hex(canonicalJson({ corpus, inputs: inputs.map((i) => [i.id, i.hash]) })).slice(0, 16);\n}\n\n/** The schema of a split file. */\nexport const SPLIT_SCHEMA = \"corpus-split/1\";\n\n/** One fold of a split: the seeds that fit a selector and the seeds that score it. */\nexport interface SplitFold {\n readonly train: readonly number[];\n readonly heldOut: readonly number[];\n}\n\n/** A split file `corpus-split/1`. Its name is `<corpus id>.<corpus hash>.json`. It is beside the corpus, so the corpus does not change. */\nexport interface CorpusSplit {\n readonly schema: typeof SPLIT_SCHEMA;\n readonly corpus: string;\n /** The hash of the corpus: `corpusHashOf` of its manifest. */\n readonly corpusHash: string;\n /** The splits by name. Each split has one fold or more. */\n readonly splits: Readonly<Record<string, { readonly folds: readonly SplitFold[] }>>;\n}\n\n/** The fields of a manifest that the split check reads. */\nexport interface SplitCorpus {\n readonly corpus: string;\n readonly specs: readonly { readonly seeds: readonly number[] }[];\n readonly inputs: readonly CorpusEntry[];\n}\n\n/** This function gives the name of the split file of a corpus. */\nexport function splitFileName(corpus: string, hash: string): string {\n return `${corpus}.${hash}.json`;\n}\n\n/** This function tells if a value is a list of whole numbers. */\nconst isSeeds = (value: unknown): value is number[] => Array.isArray(value) && value.every((s) => Number.isInteger(s));\n\n/**\n * This function checks a split file against a manifest. It gives one break `split` for each problem. An empty list tells that the file is good.\n *\n * - The schema is `corpus-split/1`, the corpus is the id of the manifest and `corpusHash` is `corpusHashOf` of the manifest.\n * - Each split has one fold or more. In each fold, `train` and `heldOut` are lists of seeds, not empty and with no common seed.\n * - Each seed is a seed of a spec of the manifest.\n * - With `name`, the file has the split `name`.\n */\nexport function checkSplit(split: unknown, corpus: SplitCorpus, name?: string): ClaimBreak[] {\n const out: string[] = [];\n const done = (): ClaimBreak[] => out.map((detail) => ({ claim: \"split\", detail, inputs: [] }));\n const f = split as Partial<CorpusSplit> | null;\n if (f === null || typeof f !== \"object\") {\n out.push(\"the split file is not an object\");\n return done();\n }\n if (f.schema !== SPLIT_SCHEMA) out.push(`the schema is ${String(f.schema)}, not ${SPLIT_SCHEMA}`);\n if (f.corpus !== corpus.corpus) out.push(`the corpus is ${String(f.corpus)}, not ${corpus.corpus}`);\n const hash = corpusHashOf(corpus.corpus, corpus.inputs);\n if (f.corpusHash !== hash) out.push(`the corpusHash is ${String(f.corpusHash)}, but the corpus gives ${hash}`);\n const seeds = new Set(corpus.specs.flatMap((s) => s.seeds));\n if (f.splits === null || typeof f.splits !== \"object\") {\n out.push(\"the field splits is not an object\");\n return done();\n }\n for (const [key, value] of Object.entries(f.splits)) {\n const folds = (value as { folds?: unknown } | null)?.folds;\n if (!Array.isArray(folds) || folds.length === 0) {\n out.push(`the split ${key} has no folds`);\n continue;\n }\n folds.forEach((fold: Partial<SplitFold> | null, k) => {\n const at = `the fold ${k} of the split ${key}`;\n const { train, heldOut } = fold ?? {};\n if (!isSeeds(train) || train.length === 0) out.push(`${at} has no train seeds`);\n if (!isSeeds(heldOut) || heldOut.length === 0) out.push(`${at} has no heldOut seeds`);\n if (!isSeeds(train) || !isSeeds(heldOut)) return;\n const common = train.filter((s) => heldOut.includes(s));\n if (common.length > 0) out.push(`${at} has the seeds ${common.join(\", \")} in train and in heldOut`);\n const unknown = [...train, ...heldOut].filter((s) => !seeds.has(s));\n if (unknown.length > 0) out.push(`${at} has the seeds ${unknown.join(\", \")}, which are not in the corpus`);\n });\n }\n if (name !== undefined && !Object.hasOwn(f.splits, name)) out.push(`the split file has no split ${name}. Its splits are ${Object.keys(f.splits).join(\", \")}`);\n return done();\n}\n\n/**\n * This function gives a copy of the folds of the split `name` of a split file. `where` names the file in the text of an error.\n * It throws an `Error` for each problem of `checkSplit`, and then for an unknown split name.\n */\nexport function splitFolds(split: unknown, corpus: SplitCorpus, name: string, where: string = \"The split file\"): SplitFold[] {\n const breaks = checkSplit(split, corpus);\n if (breaks.length > 0) throw new Error(`${where} is not good: ${breaks.map((b) => b.detail).join(\"; \")}.`);\n const splits = (split as CorpusSplit).splits;\n const found = Object.hasOwn(splits, name) ? splits[name] : undefined;\n if (found === undefined) throw new Error(`${where} has no split ${name}. Its splits are ${Object.keys(splits).join(\", \")}.`);\n return found.folds.map((f) => ({ train: [...f.train], heldOut: [...f.heldOut] }));\n}\n\n/** This function gives the folds that hold out one seed each, in the order of the seeds. Each fold trains on the other seeds. */\nexport function leaveOneSeedOut(seeds: readonly number[]): SplitFold[] {\n const sorted = [...new Set(seeds)].sort((a, b) => a - b);\n return sorted.map((s) => ({ train: sorted.filter((t) => t !== s), heldOut: [s] }));\n}\n","// The strategy space of an engine (`docs/STRATEGY-SPACE.md`): its stages, their options and the ranges of their params, as data.\nimport type { ClaimBreak } from \"./corpus.ts\";\nimport { canonicalJson, sha256Hex } from \"./hash.ts\";\nimport { stepRandom } from \"./random.ts\";\nimport { isShapeKind, SHAPE_KIND_IDS, type ShapeKind } from \"./shapes.ts\";\n\n/** The schema of a strategy space. */\nexport const STRATEGY_SPACE_SCHEMA = \"strategy-space/1\";\n\n/** The kind of a param: a whole number, a real number, one value of a list, or `true` and `false`. */\nexport type ParamKind = \"int\" | \"real\" | \"enum\" | \"bool\";\n\n/** The value of one param in a config. */\nexport type ParamValue = number | string | boolean;\n\n/** The condition of a conditional param: the param is active only when an earlier param of the same option has one of the values `in`. */\nexport interface ParamWhen {\n /** The name of an earlier param of the same option. */\n readonly param: string;\n /** The values of that param that make this param active. */\n readonly in: readonly ParamValue[];\n}\n\n/** One param of a stage option, with its range. */\nexport interface SpaceParam {\n readonly name: string;\n readonly kind: ParamKind;\n /** The smallest value of an `int` or `real` param. */\n readonly min?: number;\n /** The largest value of an `int` or `real` param. */\n readonly max?: number;\n /** The step of the values from `min`. An `int` param has the step 1 by default. */\n readonly step?: number;\n /** The scale of the grid and of the samples. The scale `log` needs a `min` above 0. The default is `linear`. */\n readonly scale?: \"linear\" | \"log\";\n /** The values of an `enum` param. */\n readonly values?: readonly (string | number)[];\n /** The value that a config gets when it does not set the param. */\n readonly default: ParamValue;\n /** Without `when`, the param is active each time its option is chosen. */\n readonly when?: ParamWhen;\n}\n\n/** The rule of the members of a meta option: a count from `min` to `max`. Members with `ordered: false` are sorted by their `configId`. */\nexport interface MemberRule {\n readonly min: number;\n readonly max: number;\n readonly ordered: boolean;\n /**\n * The member lists that the option permits. Each entry is a list of whole configs of the space of the members.\n * Without `pool`, each list of base configs with a good count is a member list.\n * With `pool`, a config of the option has the members of one entry, and `spaceSize` counts each entry one time.\n */\n readonly pool?: readonly (readonly StrategyConfig[])[];\n}\n\n/** The inputs that an option supports. A missing field supports each value. */\nexport interface OptionSupports {\n /** The shape kinds of the boxes (`docs/SHAPES.md`). Without it, the option supports each kind. */\n readonly shape?: readonly ShapeKind[];\n}\n\n/** One implementation of a stage. An option with `members` is a meta option: it chooses between whole configs, or wraps them. */\nexport interface StageOption {\n readonly id: string;\n readonly params: readonly SpaceParam[];\n readonly members?: MemberRule;\n /** The inputs that the option supports. It describes the option, so it is not part of a config or of its id. */\n readonly supports?: OptionSupports;\n}\n\n/** The shape kinds of the inputs of a check, a count or an enumeration. Without `shapes`, each option counts. */\nexport interface ShapeFilter {\n /** The shape kinds of the input. Only the options that support each of these kinds count. */\n readonly shapes?: readonly ShapeKind[];\n}\n\n/** One stage of the pipeline of an engine. A config of an `optional` stage can have no option. */\nexport interface SpaceStage {\n readonly name: string;\n readonly options: readonly StageOption[];\n readonly optional?: boolean;\n}\n\n/** A reference to one option of a stage. The option `null` refers to an optional stage that a config does not use. */\nexport interface OptionRef {\n readonly stage: string;\n readonly option: string | null;\n}\n\n/** A rule that keeps out invalid combinations. A config with the option `if` also has the option `then`, or does not have the option `then.not`. */\nexport interface SpaceConstraint {\n readonly if: OptionRef;\n readonly then: OptionRef | { readonly not: OptionRef };\n}\n\n/** The strategy space of an engine: the stages, the constraints and the named configs. `docs/STRATEGY-SPACE.md` tells the rules. */\nexport interface StrategySpace {\n readonly schema: typeof STRATEGY_SPACE_SCHEMA;\n /** The name of the space. A config names the space with this value. */\n readonly engine: string;\n /** The version of the space. It is not part of a config or of its id. A record writes it. */\n readonly version: string;\n readonly stages: readonly SpaceStage[];\n readonly constraints?: readonly SpaceConstraint[];\n /** The named strategies of the engine, as points of the space. Old records stay comparable through them. */\n readonly named?: Readonly<Record<string, StrategyConfig>>;\n /** The spaces of a product space, from `productSpace`. A meta option of a part takes members of that part. */\n readonly parts?: readonly StrategySpace[];\n}\n\n/** The choice of one stage in a config: an option, its params and, for a meta option, its members. */\nexport interface StageChoice {\n readonly option: string;\n /** The values of the active params. A param that is not set gets its default. */\n readonly params?: Readonly<Record<string, ParamValue>>;\n /** The members of a meta option: configs of the same space, with no meta option. */\n readonly members?: readonly StrategyConfig[];\n}\n\n/** One point of a strategy space. The value `null` of a stage tells that the config does not use the optional stage. */\nexport interface StrategyConfig {\n /** The `engine` of the space, without its version. */\n readonly space: string;\n readonly stages: Readonly<Record<string, StageChoice | null>>;\n}\n\n/** The count of the grid points of a space. */\nexport interface SpaceSize {\n /** The count of the configs without a meta option. */\n readonly base: bigint;\n /** The count of the configs with a meta option. The value is `null` when the count is more than `maxMeta`. */\n readonly meta: bigint | null;\n}\n\n/** The options of `spaceSize`. */\nexport interface SpaceSizeOptions extends ShapeFilter {\n /** The count of the levels of each numeric param, a whole number of 1 or more. */\n readonly levels: number;\n /** The largest meta count that `spaceSize` gives. The default is `10n ** 18n`. */\n readonly maxMeta?: bigint;\n}\n\n/** The options of a grid. The grid gives only the configs without a meta option. */\nexport interface GridOptions extends ShapeFilter {\n readonly mode: \"grid\";\n readonly levels: number;\n /** The largest count of configs. A larger grid causes a `RangeError`. The default is 100000. */\n readonly limit?: number;\n}\n\n/** The options of a sample. */\nexport interface SampleOptions extends ShapeFilter {\n readonly mode: \"sample\";\n /** The count of the configs, a whole number of 0 or more. */\n readonly n: number;\n readonly seed: number;\n /** With `skip` (the default), the sample has no meta option. With `sample`, a meta option draws its members from base samples, or one entry of its `pool`. */\n readonly meta?: \"skip\" | \"sample\";\n /** The largest count of option draws. The default is the larger value of 1000 and `100 * n`. */\n readonly maxTries?: number;\n}\n\n/** The options of `enumerateSpace`. */\nexport type EnumerateOptions = GridOptions | SampleOptions;\n\ntype Problem = readonly [claim: string, detail: string];\ntype Choices = ReadonlyMap<string, StageOption | null>;\ntype Values = Record<string, ParamValue>;\n\nconst isObject = (value: unknown): value is Record<string, unknown> => value !== null && typeof value === \"object\" && !Array.isArray(value);\nconst show = (value: unknown): string => (typeof value === \"string\" ? `\"${value}\"` : String(value));\nconst isNumeric = (p: SpaceParam): boolean => p.kind === \"int\" || p.kind === \"real\";\nconst zero = (v: number): number => (v === 0 ? 0 : v);\n\n/** This function gives the stable form of a real number: 12 significant digits, with `-0` as `0`. */\nconst realForm = (v: number, digits = 12): number => zero(Number(v.toPrecision(digits)));\n\n/** This function gives the stable form of a value of a param. */\nfunction normalize(p: SpaceParam, v: ParamValue): ParamValue {\n if (typeof v !== \"number\") return v;\n if (p.kind !== \"real\") return zero(v);\n return Math.min(p.max ?? Infinity, Math.max(p.min ?? -Infinity, realForm(v)));\n}\n\n/** This function tells if a value is on the step of a param. */\nfunction onStep(p: SpaceParam, v: number): boolean {\n if (p.step === undefined || p.min === undefined) return true;\n const q = (v - p.min) / p.step;\n return Math.abs(q - Math.round(q)) <= 1e-9 * Math.max(1, Math.abs(q));\n}\n\n/** This function gives the problem of a value of a param, or `undefined` for a value in the range. */\nfunction valueProblem(p: SpaceParam, v: unknown): string | undefined {\n if (p.kind === \"bool\") return typeof v === \"boolean\" ? undefined : `${show(v)} is not true or false`;\n if (p.kind === \"enum\") return (p.values ?? []).some((x) => x === v) ? undefined : `${show(v)} is not one of ${(p.values ?? []).map(show).join(\", \")}`;\n if (typeof v !== \"number\" || !Number.isFinite(v)) return `${show(v)} is not a finite number`;\n if (p.kind === \"int\" && !Number.isInteger(v)) return `${v} is not a whole number`;\n if (p.min !== undefined && v < p.min) return `${v} is less than the min ${p.min}`;\n if (p.max !== undefined && v > p.max) return `${v} is more than the max ${p.max}`;\n if (!onStep(p, v)) return `${v} is not on the step ${p.step} from ${p.min}`;\n return undefined;\n}\n\n/** This function tells if a param is active for the values of the earlier params. */\nfunction isActive(p: SpaceParam, values: Values): boolean {\n if (p.when === undefined) return true;\n if (!Object.hasOwn(values, p.when.param)) return false;\n const v = values[p.when.param];\n return p.when.in.some((x) => x === v);\n}\n\n/** This function gives the problem of a value of a param, or `undefined` for a value in its range. The corpus dimensions of `families.ts` use it. */\nexport function paramProblem(param: SpaceParam, value: unknown): string | undefined {\n return valueProblem(param, value);\n}\n\n/** This function tells if a param is active for the values of the earlier params. A param without `when` is always active. */\nexport function paramActive(param: SpaceParam, values: Readonly<Record<string, ParamValue>>): boolean {\n return isActive(param, values);\n}\n\n/** This function gives the stable form of a value of a param: a real number gets 12 significant digits, and `-0` becomes `0`. */\nexport function paramValue(param: SpaceParam, value: ParamValue): ParamValue {\n return normalize(param, value);\n}\n\n/** This function gives the part of a space that has a stage, and the prefix of the names of its stages. */\nfunction partOf(space: StrategySpace, stage: string): { readonly space: StrategySpace; readonly prefix: string } {\n for (const part of space.parts ?? []) {\n const head = `${part.engine}.`;\n if (stage.startsWith(head)) {\n const inner = partOf(part, stage.slice(head.length));\n return { space: inner.space, prefix: head + inner.prefix };\n }\n }\n return { space, prefix: \"\" };\n}\n\n/** This function gives the prefix of the innermost part of each stage. */\nconst prefixes = (space: StrategySpace): Map<string, string> => new Map(space.stages.map((s) => [s.name, partOf(space, s.name).prefix]));\n\nconst refMatches = (ref: OptionRef, choices: ReadonlyMap<string, string | null>): boolean => (choices.get(ref.stage) ?? null) === ref.option;\n\n/** This function tells if the option choices keep a constraint. */\nfunction holds(c: SpaceConstraint, choices: ReadonlyMap<string, string | null>): boolean {\n if (!refMatches(c.if, choices)) return true;\n return \"not\" in c.then ? !refMatches(c.then.not, choices) : refMatches(c.then, choices);\n}\n\nconst describe = (c: SpaceConstraint): string => {\n const ref = (r: OptionRef): string => `${r.stage}=${r.option ?? \"null\"}`;\n return \"not\" in c.then ? `if ${ref(c.if)} then not ${ref(c.then.not)}` : `if ${ref(c.if)} then ${ref(c.then)}`;\n};\n\n/** This function gives the problems of the range and the default of one param. */\nfunction paramProblems(p: SpaceParam, at: string): Problem[] {\n const out: Problem[] = [];\n if (isNumeric(p)) {\n const { min, max, step } = p;\n if (typeof min !== \"number\" || typeof max !== \"number\" || !Number.isFinite(min) || !Number.isFinite(max)) {\n out.push([\"range\", `${at} has no finite min and max`]);\n return out;\n }\n if (min > max) out.push([\"range\", `${at} has an empty range: the min ${min} is more than the max ${max}`]);\n if (p.kind === \"int\" && (!Number.isInteger(min) || !Number.isInteger(max))) out.push([\"range\", `${at} is an int with a min or a max that is not whole`]);\n if (step !== undefined && (!Number.isFinite(step) || step <= 0 || (p.kind === \"int\" && !Number.isInteger(step))))\n out.push([\"range\", `${at} has the step ${step}, which is not a ${p.kind === \"int\" ? \"whole \" : \"\"}number above 0`]);\n if (p.scale === \"log\" && min <= 0) out.push([\"scale\", `${at} has the scale log with the min ${min}, which is not above 0`]);\n } else {\n if (p.scale !== undefined) out.push([\"scale\", `${at} is a ${p.kind} param with a scale`]);\n if (p.kind === \"enum\") {\n if (!Array.isArray(p.values) || p.values.length === 0) out.push([\"values\", `${at} is an enum without values`]);\n else {\n const seen = new Set<unknown>();\n for (const v of p.values) {\n if (seen.has(v)) out.push([\"duplicate\", `${at} has the value ${show(v)} two times`]);\n seen.add(v);\n }\n }\n }\n }\n if (out.length === 0) {\n const problem = valueProblem(p, p.default);\n if (problem !== undefined) out.push([\"default\", `the default of ${at} is not in its range: ${problem}`]);\n }\n return out;\n}\n\n/** This function gives the problems of one stage option. */\nfunction optionProblems(stage: SpaceStage, o: StageOption): Problem[] {\n const out: Problem[] = [];\n const at = `the option ${stage.name}.${o.id}`;\n if (!Array.isArray(o.params)) return [[\"config\", `${at} has no list of params`]];\n const names = o.params.map((p) => p.name);\n o.params.forEach((p, i) => {\n const pat = `the param ${stage.name}.${o.id}.${p.name}`;\n if (names.indexOf(p.name) !== i) out.push([\"duplicate\", `${at} has the param ${p.name} two times`]);\n out.push(...paramProblems(p, pat));\n if (p.when === undefined) return;\n const j = names.indexOf(p.when.param);\n if (j < 0) out.push([\"unknown\", `${pat} has a when with the unknown param ${p.when.param}`]);\n else if (j >= i) out.push([\"when\", `${pat} has a when with the param ${p.when.param}, which does not come before it`]);\n else if (!Array.isArray(p.when.in) || p.when.in.length === 0) out.push([\"when\", `${pat} has a when with no values`]);\n else for (const v of p.when.in) {\n const problem = valueProblem(o.params[j]!, v);\n if (problem !== undefined) out.push([\"when\", `${pat} has a when value that is not a value of ${p.when.param}: ${problem}`]);\n }\n });\n if (o.supports !== undefined) out.push(...supportsProblems(o.supports, at));\n if (o.members !== undefined) {\n const { min, max, ordered } = o.members;\n if (!Number.isInteger(min) || !Number.isInteger(max) || min < 1 || min > max || typeof ordered !== \"boolean\")\n out.push([\"members\", `${at} has a member rule without whole counts 1 <= min <= max and a boolean ordered`]);\n const pool: unknown = o.members.pool;\n if (pool !== undefined && (!Array.isArray(pool) || pool.length === 0 || !pool.every((entry: unknown) => Array.isArray(entry))))\n out.push([\"pool\", `${at} has a pool that is not a list of one or more member lists`]);\n }\n return out;\n}\n\n/** This function gives the problems of the `supports` of an option. */\nfunction supportsProblems(supports: unknown, at: string): Problem[] {\n if (!isObject(supports)) return [[\"shape\", `the supports of ${at} are not an object`]];\n const shape = supports[\"shape\"];\n if (shape === undefined) return [];\n if (!Array.isArray(shape) || shape.length === 0) return [[\"shape\", `${at} supports no shape kind. Remove shape to support each kind`]];\n const out: Problem[] = [];\n shape.forEach((k: unknown, i) => {\n if (!isShapeKind(k)) out.push([\"shape\", `${at} supports the shape kind ${show(k)}, which is not one of ${SHAPE_KIND_IDS.join(\", \")}`]);\n else if (shape.indexOf(k) !== i) out.push([\"duplicate\", `${at} has the shape kind ${k} two times`]);\n });\n return out;\n}\n\n/** This function tells if an option supports each shape kind of the list. */\nconst supportsShapes = (o: StageOption, shapes: readonly ShapeKind[] | undefined): boolean =>\n shapes === undefined || o.supports?.shape === undefined || shapes.every((k) => o.supports!.shape!.includes(k));\n\n/** This function gives the problems of the params of one stage choice. */\nfunction choiceParamProblems(o: StageOption, params: unknown, at: string): Problem[] {\n if (params !== undefined && !isObject(params)) return [[\"config\", `the params of ${at} are not an object`]];\n const given = (params ?? {}) as Values;\n const out: Problem[] = [];\n for (const key of Object.keys(given)) if (!o.params.some((p) => p.name === key)) out.push([\"unknown\", `${at} has the unknown param ${key}`]);\n const values: Values = {};\n for (const p of o.params) {\n const has = Object.hasOwn(given, p.name);\n if (!isActive(p, values)) {\n if (has) out.push([\"inactive\", `${at} sets the param ${p.name}, which is not active`]);\n continue;\n }\n const v = has ? given[p.name] : p.default;\n const problem = valueProblem(p, v);\n if (problem !== undefined) out.push([\"param\", `the param ${p.name} of ${at} is not in its range: ${problem}`]);\n else values[p.name] = normalize(p, v as ParamValue);\n }\n return out;\n}\n\n/** This function gives the problems of a config of a space. A member of a meta option has `member: true`. */\nfunction configProblems(space: StrategySpace, config: unknown, member: boolean, shapes?: readonly ShapeKind[]): Problem[] {\n if (!isObject(config) || !isObject(config[\"stages\"])) return [[\"config\", \"the config is not an object with stages\"]];\n const out: Problem[] = [];\n const stages = config[\"stages\"];\n if (config[\"space\"] !== space.engine) out.push([\"space\", `the space of the config is ${show(config[\"space\"])}, not ${show(space.engine)}`]);\n for (const key of Object.keys(stages)) if (!space.stages.some((s) => s.name === key)) out.push([\"unknown\", `the config has the unknown stage ${key}`]);\n const optionOf = (s: SpaceStage): StageOption | undefined => {\n const c = stages[s.name];\n return isObject(c) ? s.options.find((o) => o.id === c[\"option\"]) : undefined;\n };\n const prefix = prefixes(space);\n const metaStage = new Map<string, string>();\n for (const s of space.stages) {\n if (optionOf(s)?.members === undefined) continue;\n const p = prefix.get(s.name)!;\n if (metaStage.has(p)) out.push([\"meta\", `the stages ${metaStage.get(p)} and ${s.name} both have a meta option`]);\n else metaStage.set(p, s.name);\n }\n const chosen = new Map<string, string | null>();\n for (const s of space.stages) {\n const c = Object.hasOwn(stages, s.name) ? stages[s.name] : undefined;\n const meta = metaStage.get(prefix.get(s.name)!);\n chosen.set(s.name, null);\n if (c === undefined || c === null) {\n if (!s.optional && meta === undefined) out.push([\"missing\", `the config has no option for the stage ${s.name}`]);\n continue;\n }\n if (!isObject(c) || typeof c[\"option\"] !== \"string\") {\n out.push([\"config\", `the choice of the stage ${s.name} has no option`]);\n continue;\n }\n const o = s.options.find((x) => x.id === c[\"option\"]);\n if (o === undefined) {\n out.push([\"unknown\", `the stage ${s.name} has no option ${c[\"option\"]}`]);\n continue;\n }\n chosen.set(s.name, o.id);\n const at = `the option ${s.name}.${o.id}`;\n if (!supportsShapes(o, shapes)) {\n const missing = shapes!.filter((k) => !o.supports!.shape!.includes(k));\n out.push([\"shape\", `${at} supports the shape kinds ${o.supports!.shape!.join(\", \")}, not ${missing.join(\", \")}`]);\n }\n if (meta !== undefined && meta !== s.name) out.push([\"meta\", `the stage ${s.name} is set, but the meta option of ${meta} replaces the other stages of its part`]);\n out.push(...choiceParamProblems(o, c[\"params\"], at));\n if (o.members === undefined) {\n if (c[\"members\"] !== undefined) out.push([\"members\", `${at} is not a meta option, but the config gives members`]);\n continue;\n }\n if (member) {\n out.push([\"depth\", `a member has the meta option ${s.name}.${o.id}. The depth of a meta config is 1`]);\n continue;\n }\n out.push(...memberProblems(partOf(space, s.name).space, o.members, c[\"members\"], at, shapes));\n }\n for (const c of space.constraints ?? []) if (!holds(c, chosen)) out.push([\"constraint\", `the config breaks the constraint ${describe(c)}`]);\n return out;\n}\n\n/** This function gives the problems of the members of a meta option. `part` is the space of the members. */\nfunction memberProblems(part: StrategySpace, rule: MemberRule, members: unknown, at: string, shapes?: readonly ShapeKind[]): Problem[] {\n if (!Array.isArray(members)) return [[\"members\", `${at} is a meta option without a list of members`]];\n const out: Problem[] = [];\n if (members.length < rule.min || members.length > rule.max) out.push([\"members\", `${at} has ${members.length} members, not ${rule.min} to ${rule.max}`]);\n const ids = new Map<string, number>();\n members.forEach((m: unknown, k) => {\n const inner = configProblems(part, m, true, shapes);\n for (const [claim, detail] of inner) out.push([claim, `the member ${k} of ${at}: ${detail}`]);\n if (inner.length > 0) return;\n const id = idOf(canonicalOf(part, m as StrategyConfig, true));\n if (ids.has(id)) out.push([\"duplicate\", `the members ${ids.get(id)} and ${k} of ${at} are the same config ${id}`]);\n else ids.set(id, k);\n });\n if (rule.pool !== undefined && out.length === 0) {\n const key = memberKey(part, rule, members as readonly StrategyConfig[]);\n if (!rule.pool.some((entry) => memberKey(part, rule, entry) === key))\n out.push([\"pool\", `${at} has a member list that is not in its pool of ${rule.pool.length} ${rule.pool.length === 1 ? \"list\" : \"lists\"}`]);\n }\n return out;\n}\n\n/** This function gives the key of a good member list: the `configId` of each member, sorted when the rule is not ordered. */\nfunction memberKey(part: StrategySpace, rule: MemberRule, members: readonly StrategyConfig[]): string {\n const ids = members.map((m) => idOf(canonicalOf(part, m, true)));\n if (!rule.ordered) ids.sort();\n return ids.join(\",\");\n}\n\n/** This function gives the problems of the pool of a meta option of a good space. `part` is the space of the members. */\nfunction poolProblems(part: StrategySpace, rule: MemberRule, at: string): Problem[] {\n const out: Problem[] = [];\n const keys = new Map<string, number>();\n const plain: MemberRule = { min: rule.min, max: rule.max, ordered: rule.ordered };\n (rule.pool ?? []).forEach((entry, j) => {\n const inner = memberProblems(part, plain, entry, `the pool entry ${j} of ${at}`);\n out.push(...inner);\n if (inner.length > 0) return;\n const key = memberKey(part, rule, entry);\n if (keys.has(key)) out.push([\"duplicate\", `the pool entries ${keys.get(key)} and ${j} of ${at} have the same members`]);\n else keys.set(key, j);\n });\n return out;\n}\n\n/** This function tells if a member list fits a space: each member is a good config of the space. A shape filter removes options from the space. */\nconst fits = (part: StrategySpace, entry: readonly StrategyConfig[]): boolean => entry.every((m) => configProblems(part, m, true).length === 0);\n\nconst toBreaks = (problems: readonly Problem[], inputs: readonly string[] = []): ClaimBreak[] => problems.map(([claim, detail]) => ({ claim, detail, inputs }));\n\n/**\n * This function checks one config of a space. It gives one break for each problem. An empty list tells that the config is good.\n * The `claim` of a break is the kind of the problem, for example `missing`, `unknown`, `inactive`, `param`, `constraint`, `members` or `depth`.\n *\n * A member list that is not an entry of the `pool` of its option gives the claim `pool`.\n * With `shapes`, an option that does not support a kind of the list gives the claim `shape`. A member of a meta option gets the same check.\n */\nexport function checkConfig(space: StrategySpace, config: StrategyConfig, options: ShapeFilter = {}): ClaimBreak[] {\n return toBreaks(configProblems(space, config, false, options.shapes));\n}\n\n/**\n * This function checks a space. It gives one break for each problem. An empty list tells that the space is good.\n * It finds duplicate names, empty ranges, defaults out of range, enums without values, bad log scales, unknown names and bad named configs.\n * It also checks each entry of a `pool`: the count of its members, each member and a repeated entry.\n * The `inputs` of a break of a named config have the name of the config.\n */\nexport function checkSpace(space: StrategySpace): ClaimBreak[] {\n if (!isObject(space) || !Array.isArray(space.stages)) return toBreaks([[\"schema\", \"the space is not an object with stages\"]]);\n const out: Problem[] = [];\n if (space.schema !== STRATEGY_SPACE_SCHEMA) out.push([\"schema\", `the schema is ${show(space.schema)}, not ${STRATEGY_SPACE_SCHEMA}`]);\n if (typeof space.engine !== \"string\" || space.engine === \"\") out.push([\"schema\", \"the space has no engine name\"]);\n if (typeof space.version !== \"string\") out.push([\"schema\", \"the space has no version\"]);\n const names = space.stages.map((s) => s.name);\n space.stages.forEach((s, i) => {\n if (names.indexOf(s.name) !== i) out.push([\"duplicate\", `the space has the stage ${s.name} two times`]);\n const options: readonly StageOption[] = Array.isArray(s.options) ? s.options : [];\n if (options.length === 0) {\n out.push([\"options\", `the stage ${s.name} has no options`]);\n return;\n }\n const ids = options.map((o) => o.id);\n options.forEach((o, j) => {\n if (ids.indexOf(o.id) !== j) out.push([\"duplicate\", `the stage ${s.name} has the option ${o.id} two times`]);\n out.push(...optionProblems(s, o));\n });\n if (!s.optional && options.every((o) => o.members !== undefined)) out.push([\"meta\", `the stage ${s.name} is not optional and has only meta options, so no base config exists`]);\n });\n const known = (ref: OptionRef, at: string): void => {\n const s = space.stages.find((x) => x.name === ref?.stage);\n if (s === undefined) out.push([\"unknown\", `${at} has the unknown stage ${ref?.stage}`]);\n else if (ref.option === null ? !s.optional : !s.options.some((o) => o.id === ref.option))\n out.push([\"unknown\", `${at} has the unknown option ${s.name}=${ref.option ?? \"null\"}`]);\n };\n (space.constraints ?? []).forEach((c, k) => {\n known(c.if, `the constraint ${k}`);\n known(\"not\" in c.then ? c.then.not : c.then, `the constraint ${k}`);\n });\n for (const part of space.parts ?? []) for (const b of checkSpace(part)) out.push([b.claim, `the part ${part.engine}: ${b.detail}`]);\n if (space.parts !== undefined)\n for (const s of space.stages) if (partOf(space, s.name).prefix === \"\") out.push([\"parts\", `the stage ${s.name} is not a stage of a part`]);\n const breaks = toBreaks(out);\n if (breaks.length > 0) return breaks;\n for (const s of space.stages)\n for (const o of s.options) if (o.members?.pool !== undefined) breaks.push(...toBreaks(poolProblems(partOf(space, s.name).space, o.members, `the option ${s.name}.${o.id}`)));\n if (breaks.length > 0) return breaks;\n for (const [name, config] of Object.entries(space.named ?? {}))\n breaks.push(...toBreaks(configProblems(space, config, false).map(([c, d]) => [c, `the named config ${name}: ${d}`] as const), [name]));\n return breaks;\n}\n\n/** This function gives the canonical form of a config that is known to be good. */\nfunction canonicalOf(space: StrategySpace, config: StrategyConfig, member: boolean): StrategyConfig {\n const stages: Record<string, StageChoice | null> = {};\n for (const s of space.stages) {\n const c = Object.hasOwn(config.stages, s.name) ? config.stages[s.name] : undefined;\n if (c === undefined || c === null) {\n stages[s.name] = null;\n continue;\n }\n const o = s.options.find((x) => x.id === c.option)!;\n const given = c.params ?? {};\n const params: Values = {};\n for (const p of o.params) if (isActive(p, params)) params[p.name] = normalize(p, Object.hasOwn(given, p.name) ? given[p.name]! : p.default);\n if (o.members === undefined || member) {\n stages[s.name] = { option: o.id, params };\n continue;\n }\n const part = partOf(space, s.name).space;\n const members = (c.members ?? []).map((m) => canonicalOf(part, m, true));\n if (!o.members.ordered) members.sort((a, b) => (idOf(a) < idOf(b) ? -1 : idOf(a) > idOf(b) ? 1 : 0));\n stages[s.name] = { option: o.id, params, members };\n }\n return { space: space.engine, stages };\n}\n\nconst idOf = (canonical: StrategyConfig): string => sha256Hex(canonicalJson(canonical)).slice(0, 16);\n\n/**\n * This function gives the canonical form of a config: each stage of the space, the active params only, the defaults, and stable numbers.\n * An unused optional stage is `null`. The members of an unordered meta option are sorted by their `configId`.\n * It throws an `Error` for a config with a break of `checkConfig`.\n */\nexport function canonicalConfig(space: StrategySpace, config: StrategyConfig): StrategyConfig {\n const problems = configProblems(space, config, false);\n if (problems.length > 0) throw new Error(`The config of the space ${space.engine} is not good: ${problems.map((p) => p[1]).join(\"; \")}.`);\n return canonicalOf(space, config, false);\n}\n\n/**\n * This function gives the id of a config: the first 16 hex characters of the SHA-256 of `canonicalJson` of `canonicalConfig`.\n * Two spellings of one config get one id. The version of the space is not part of the id.\n */\nexport function configId(space: StrategySpace, config: StrategyConfig): string {\n return idOf(canonicalConfig(space, config));\n}\n\n/** This function throws an `Error` for a space with a break of `checkSpace`. */\nfunction assertSpace(space: StrategySpace): void {\n const breaks = checkSpace(space);\n if (breaks.length > 0) throw new Error(`The space ${String(space?.engine)} is not good: ${breaks.map((b) => b.detail).join(\"; \")}.`);\n}\n\n/** This function throws a `RangeError` when a value is not a whole number of `min` or more. */\nfunction assertWhole(value: number, name: string, min: number): void {\n if (!Number.isInteger(value) || value < min) throw new RangeError(`The option ${name} is ${value}, not a whole number of ${min} or more.`);\n}\n\n/** This function gives the last point of the step grid of a numeric param. */\nfunction lastPoint(p: SpaceParam): number {\n const min = p.min!;\n const step = p.step ?? (p.kind === \"int\" ? 1 : undefined);\n if (step === undefined) return p.max!;\n return min + Math.floor((p.max! - min) / step + 1e-9) * step;\n}\n\n/** This function moves a value of a numeric param onto its step and into its range. */\nfunction snap(p: SpaceParam, x: number, digits: number): number {\n const min = p.min!;\n const step = p.step ?? (p.kind === \"int\" ? 1 : undefined);\n let v = step === undefined ? x : min + Math.round((x - min) / step) * step;\n v = Math.min(lastPoint(p), Math.max(min, v));\n return p.kind === \"int\" ? zero(Math.round(v)) : Math.min(p.max!, Math.max(min, realForm(v, digits)));\n}\n\n/** This function gives the point at the fraction `t` of the range of a numeric param, on its scale. */\nfunction at01(p: SpaceParam, t: number): number {\n const min = p.min!;\n const max = p.max!;\n if (p.scale === \"log\") return Math.exp(Math.log(min) + t * (Math.log(max) - Math.log(min)));\n return min + t * (max - min);\n}\n\n/**\n * This function gives the grid values of one param, in increasing order. An `enum` gives its values, and a `bool` gives `false` and `true`.\n * With 1 level, a numeric param gives its default. With k levels, it gives k points from `min` to `max` on its scale and step, without repeats.\n */\nexport function paramLevels(param: SpaceParam, levels: number): ParamValue[] {\n assertWhole(levels, \"levels\", 1);\n if (param.kind === \"bool\") return [false, true];\n if (param.kind === \"enum\") return [...(param.values ?? [])];\n if (levels === 1 || param.min === param.max) return [normalize(param, param.default)];\n const out: number[] = [];\n const steps = param.kind === \"int\" || param.step !== undefined ? Math.round((lastPoint(param) - param.min!) / (param.step ?? 1)) + 1 : Infinity;\n if (steps <= levels && param.scale !== \"log\") {\n for (let j = 0; j < steps; j++) out.push(snap(param, param.min! + j * (param.step ?? 1), 12));\n } else {\n for (let j = 0; j < levels; j++) out.push(snap(param, at01(param, j / (levels - 1)), 12));\n }\n return [...new Set(out)];\n}\n\n/** This function tells if a later param of the list reads a param in its `when`. */\nconst readLater = (params: readonly SpaceParam[], i: number): boolean => params.slice(i + 1).some((q) => q.when?.param === params[i]!.name);\n\n/** This function gives the count of the grid assignments of the params of an option, with only the active params. */\nfunction countParams(params: readonly SpaceParam[], levels: number, i = 0, values: Values = {}): bigint {\n if (i === params.length) return 1n;\n const p = params[i]!;\n if (!isActive(p, values)) return countParams(params, levels, i + 1, values);\n const lv = paramLevels(p, levels);\n if (!readLater(params, i)) return BigInt(lv.length) * countParams(params, levels, i + 1, values);\n let sum = 0n;\n for (const v of lv) sum += countParams(params, levels, i + 1, { ...values, [p.name]: v });\n return sum;\n}\n\n/** This function gives the grid assignments of the params of an option, in a stable order. */\nfunction* gridParams(params: readonly SpaceParam[], levels: number, i = 0, values: Values = {}): Generator<Values> {\n if (i === params.length) {\n yield { ...values };\n return;\n }\n const p = params[i]!;\n if (!isActive(p, values)) {\n yield* gridParams(params, levels, i + 1, values);\n return;\n }\n for (const v of paramLevels(p, levels)) yield* gridParams(params, levels, i + 1, { ...values, [p.name]: v });\n}\n\n/** One combination of options of a space, with its count of grid points. */\ninterface Combo {\n readonly choices: Choices;\n readonly base: boolean;\n /** The count of the grid points, or `null` when the count is more than the limit. */\n readonly weight: bigint | null;\n}\n\nconst optionIds = (choices: Choices): Map<string, string | null> => new Map([...choices].map(([k, o]) => [k, o?.id ?? null]));\nconst keeps = (space: StrategySpace, choices: Choices): boolean => (space.constraints ?? []).every((c) => holds(c, optionIds(choices)));\n\n/** This function gives the count of the member lists of a meta option without a pool from `base` base configs, or `null` above `limit`. */\nfunction memberLists(base: bigint, rule: MemberRule, limit: bigint): bigint | null {\n let sum = 0n;\n for (let m = rule.min; m <= rule.max; m++) {\n let n = 1n;\n for (let k = 0; k < m; k++) {\n n = (n * (base - BigInt(k))) / (rule.ordered ? 1n : BigInt(k + 1));\n if (n <= 0n) break;\n }\n if (n <= 0n) break;\n sum += n;\n if (sum > limit) return null;\n }\n return sum;\n}\n\n/** This function multiplies two counts. A `null` count or a product above `limit` gives `null`. */\nconst times = (a: bigint | null, b: bigint | null, limit: bigint): bigint | null => (a === null || b === null ? null : a * b > limit ? null : a * b);\n\n/**\n * This function gives the combinations of options of a space and their grid counts.\n * A product space joins the combinations of its parts. Each combination keeps the constraints.\n */\nfunction combos(space: StrategySpace, levels: number, meta: boolean, limit: bigint): Combo[] {\n if (space.parts !== undefined && space.parts.length > 0) {\n let acc: Combo[] = [{ choices: new Map(), base: true, weight: 1n }];\n for (const part of space.parts) {\n const head = `${part.engine}.`;\n const own = combos(part, levels, meta, limit);\n const next: Combo[] = [];\n for (const a of acc)\n for (const b of own) {\n const choices = new Map(a.choices);\n for (const [k, o] of b.choices) choices.set(head + k, o);\n const base = a.base && b.base;\n next.push({ choices, base, weight: base ? a.weight! * b.weight! : times(a.weight, b.weight, limit) });\n }\n acc = next;\n }\n return acc.filter((c) => keeps(space, c.choices));\n }\n const counts = new Map<StageOption, bigint>();\n const countOf = (o: StageOption): bigint => {\n if (!counts.has(o)) counts.set(o, countParams(o.params, levels));\n return counts.get(o)!;\n };\n const out: Combo[] = [];\n const stages = space.stages;\n const walk = (i: number, choices: Map<string, StageOption | null>, weight: bigint): void => {\n if (i === stages.length) {\n if (keeps(space, choices)) out.push({ choices: new Map(choices), base: true, weight });\n return;\n }\n const s = stages[i]!;\n const list: (StageOption | null)[] = s.options.filter((o) => o.members === undefined);\n if (s.optional) list.push(null);\n for (const o of list) {\n choices.set(s.name, o);\n walk(i + 1, choices, o === null ? weight : weight * countOf(o));\n }\n choices.delete(s.name);\n };\n walk(0, new Map(), 1n);\n if (!meta) return out;\n const base = out.reduce((sum, c) => sum + c.weight!, 0n);\n for (const s of stages)\n for (const o of s.options) {\n if (o.members === undefined) continue;\n const choices = new Map<string, StageOption | null>(stages.map((x) => [x.name, x === s ? o : null]));\n const lists = o.members.pool === undefined ? memberLists(base, o.members, limit) : BigInt(o.members.pool.length);\n if (keeps(space, choices)) out.push({ choices, base: false, weight: times(countOf(o), lists, limit) });\n }\n return out;\n}\n\n/**\n * This function gives the count of the grid points of a space, with `levels` levels for each numeric param.\n * It counts only the active params and the combinations that keep the constraints. It gives the meta configs apart.\n * A meta option with a `pool` counts each entry of the pool one time.\n * With `shapes`, it counts only the options that support each kind of the list.\n */\nexport function spaceSize(space: StrategySpace, options: SpaceSizeOptions): SpaceSize {\n assertSpace(space);\n assertWhole(options.levels, \"levels\", 1);\n assertShapes(options.shapes);\n return sizeOf(restrict(space, options.shapes), options.levels, options.maxMeta ?? 10n ** 18n);\n}\n\n/**\n * This function gives the space with only the options that support each shape kind of `shapes`. Without `shapes`, it gives the same space.\n * A stage can lose all of its options. Then the space has no config with that stage.\n * A pool keeps only the entries whose members fit the smaller space. A meta option without such an entry goes out.\n */\nfunction restrict(space: StrategySpace, shapes: readonly ShapeKind[] | undefined): StrategySpace {\n if (shapes === undefined) return space;\n const kept: StrategySpace = {\n ...space,\n stages: space.stages.map((s) => ({ ...s, options: s.options.filter((o) => supportsShapes(o, shapes)) })),\n ...(space.parts === undefined ? {} : { parts: space.parts.map((p) => restrict(p, shapes)) }),\n };\n const withPool = (s: SpaceStage, o: StageOption): StageOption[] => {\n if (o.members?.pool === undefined) return [o];\n const part = partOf(kept, s.name).space;\n const pool = o.members.pool.filter((entry) => fits(part, entry));\n return pool.length === 0 ? [] : [{ ...o, members: { ...o.members, pool } }];\n };\n return { ...kept, stages: kept.stages.map((s) => ({ ...s, options: s.options.flatMap((o) => withPool(s, o)) })) };\n}\n\n/** This function throws a `RangeError` for a list of shape kinds with a kind that is not declared. */\nfunction assertShapes(shapes: readonly ShapeKind[] | undefined): void {\n if (shapes === undefined) return;\n if (!Array.isArray(shapes)) throw new RangeError(\"The option shapes is not a list of shape kinds.\");\n for (const k of shapes) if (!isShapeKind(k)) throw new RangeError(`The shape kind ${show(k)} is not one of ${SHAPE_KIND_IDS.join(\", \")}.`);\n}\n\n/** This function gives the count of the grid points of a space that is known to be good. */\nfunction sizeOf(space: StrategySpace, levels: number, limit: bigint): SpaceSize {\n let base = 0n;\n let meta: bigint | null = 0n;\n for (const c of combos(space, levels, true, limit)) {\n if (c.base) base += c.weight!;\n else meta = meta === null || c.weight === null || meta + c.weight > limit ? null : meta + c.weight;\n }\n return { base, meta };\n}\n\n/** This function gives the cartesian product of lists, with the last list as the fastest. */\nfunction* product<T>(lists: readonly (readonly T[])[], i = 0, acc: T[] = []): Generator<T[]> {\n if (i === lists.length) {\n yield [...acc];\n return;\n }\n for (const x of lists[i]!) {\n acc.push(x);\n yield* product(lists, i + 1, acc);\n acc.pop();\n }\n}\n\n/** This function gives the configs of the grid of a space, without meta options. */\nfunction gridConfigs(space: StrategySpace, levels: number, limit: number, shapes: readonly ShapeKind[] | undefined): StrategyConfig[] {\n const kept = restrict(space, shapes);\n const size = sizeOf(kept, levels, 0n).base;\n if (size > BigInt(limit)) throw new RangeError(`The grid of the space ${space.engine} has ${size} configs, more than the limit ${limit}.`);\n const out: StrategyConfig[] = [];\n for (const c of combos(kept, levels, false, 0n)) {\n const names = [...c.choices.keys()];\n const lists = names.map((k) => {\n const o = c.choices.get(k)!;\n return o === null ? [null] : [...gridParams(o.params, levels)].map((params): StageChoice => ({ option: o.id, params }));\n });\n for (const row of product<StageChoice | null>(lists)) out.push(canonicalOf(space, { space: space.engine, stages: Object.fromEntries(names.map((k, i) => [k, row[i]!])) }, false));\n }\n return out;\n}\n\n/** This function gives a random order of the numbers from 0 to `n - 1`. */\nfunction permutation(n: number, r: () => number): number[] {\n const out = Array.from({ length: n }, (_, i) => i);\n for (let i = n - 1; i > 0; i--) {\n const j = Math.floor(r() * (i + 1));\n [out[i], out[j]] = [out[j]!, out[i]!];\n }\n return out;\n}\n\n/** This function gives the value of a param at the fraction `u` of its range. A sampled real number has 6 significant digits. */\nfunction sampleValue(p: SpaceParam, u: number): ParamValue {\n if (p.kind === \"bool\") return u >= 0.5;\n if (p.kind === \"enum\") {\n const values = p.values!;\n return values[Math.min(values.length - 1, Math.floor(u * values.length))]!;\n }\n if (p.min === p.max) return normalize(p, p.min!);\n if (p.scale !== \"log\" && (p.kind === \"int\" || p.step !== undefined)) {\n const steps = Math.round((lastPoint(p) - p.min!) / (p.step ?? 1)) + 1;\n return snap(p, p.min! + Math.min(steps - 1, Math.floor(u * steps)) * (p.step ?? 1), 6);\n }\n return snap(p, at01(p, u), 6);\n}\n\n/** This function gives a seed of 32 bits from a seed and a step name. */\nconst subSeed = (seed: number, step: string): number => Math.floor(stepRandom(seed, step)() * 4294967296);\n\n/** This function gives a sample of a space: Latin hypercube strata over the options, the params and the member counts. */\nfunction sampleConfigs(space: StrategySpace, n: number, seed: number, meta: boolean, maxTries: number): StrategyConfig[] {\n const stages = space.stages;\n const prefix = prefixes(space);\n const lists = stages.map((s) => {\n const list: (StageOption | null)[] = s.options.filter((o) => meta || o.members === undefined);\n if (s.optional) list.push(null);\n if (list.length === 0) throw new Error(`The stage ${s.name} of the space ${space.engine} has no option for a sample. A shape filter can remove all of its options.`);\n return list;\n });\n const points: Map<string, StageOption | null>[] = [];\n let tries = 0;\n for (let round = 0; points.length < n; round++) {\n const r = stepRandom(seed, `options:${round}`);\n const columns = lists.map((list) => permutation(n, r).map((p) => list[Math.floor((p * list.length) / n)]!));\n for (let i = 0; i < n && points.length < n; i++) {\n if (tries >= maxTries) throw new Error(`The constraints of the space ${space.engine} remove too many points: ${points.length} of ${n} configs after ${tries} tries.`);\n tries++;\n const choices = new Map<string, StageOption | null>(stages.map((s, k) => [s.name, columns[k]![i]!]));\n const metaPart = new Map<string, string>();\n for (const s of stages) {\n const o = choices.get(s.name);\n if (o?.members !== undefined && !metaPart.has(prefix.get(s.name)!)) metaPart.set(prefix.get(s.name)!, s.name);\n }\n for (const s of stages) {\n const m = metaPart.get(prefix.get(s.name)!);\n if (m !== undefined && m !== s.name) choices.set(s.name, null);\n }\n if (keeps(space, choices)) points.push(choices);\n }\n }\n const values: Values[][] = points.map(() => stages.map(() => ({})));\n const members: StrategyConfig[][][] = points.map(() => stages.map(() => []));\n stages.forEach((s, k) => {\n for (const o of s.options) {\n const users = points.flatMap((c, i) => (c.get(s.name) === o ? [i] : []));\n if (users.length === 0) continue;\n for (const p of o.params) {\n const active = users.filter((i) => isActive(p, values[i]![k]!));\n const r = stepRandom(seed, `param:${s.name}:${o.id}:${p.name}`);\n permutation(active.length, r).forEach((stratum, j) => {\n values[active[j]!]![k]![p.name] = sampleValue(p, (stratum + r()) / active.length);\n });\n }\n if (o.members === undefined) continue;\n const fixed = o.members.pool;\n if (fixed !== undefined) {\n const r = stepRandom(seed, `pool-entry:${s.name}:${o.id}`);\n permutation(users.length, r).forEach((stratum, j) => {\n members[users[j]!]![k] = [...fixed[Math.min(fixed.length - 1, Math.floor(((stratum + r()) / users.length) * fixed.length))]!];\n });\n continue;\n }\n const part = partOf(space, s.name).space;\n const poolSize = Math.max(n, 4 * o.members.max, 8);\n const seen = new Set<string>();\n const pool = sampleConfigs(part, poolSize, subSeed(seed, `pool:${s.name}:${o.id}`), false, Math.max(1000, 100 * poolSize)).filter((c) => {\n const id = idOf(c);\n return seen.has(id) ? false : (seen.add(id), true);\n });\n const r = stepRandom(seed, `members:${s.name}:${o.id}`);\n const { min, max } = o.members;\n permutation(users.length, r).forEach((stratum, j) => {\n const count = min + Math.min(max - min, Math.floor(((stratum + r()) / users.length) * (max - min + 1)));\n if (pool.length < count) throw new Error(`The space ${part.engine} has only ${pool.length} distinct base samples, fewer than the ${count} members of ${s.name}.${o.id}.`);\n const picked = permutation(pool.length, r).slice(0, count);\n members[users[j]!]![k] = picked.map((x) => pool[x]!);\n });\n }\n });\n return points.map((choices, i) => {\n const out: Record<string, StageChoice | null> = {};\n stages.forEach((s, k) => {\n const o = choices.get(s.name)!;\n out[s.name] = o === null ? null : o.members === undefined ? { option: o.id, params: values[i]![k]! } : { option: o.id, params: values[i]![k]!, members: members[i]![k]! };\n });\n return canonicalConfig(space, { space: space.engine, stages: out });\n });\n}\n\n/**\n * This function gives configs of a space, in their canonical form. Each config keeps the constraints. The result is deterministic.\n *\n * - The mode `grid` gives each grid point without a meta option, in a stable order. Stages, options and values go in the order of the space.\n * - The mode `sample` gives `n` configs of a seeded Latin hypercube. The options of a stage get equal strata, and each active param gets its own strata.\n * - A sample draws again when a point breaks a constraint. After `maxTries` draws, it throws an `Error`. Two sampled configs can be equal.\n * - With `shapes`, only the options that support each kind of the list count. Without `shapes`, the result does not change.\n * - A meta option with a `pool` gives only the entries of its pool. With `shapes`, only the entries whose members support each kind count.\n */\nexport function enumerateSpace(space: StrategySpace, options: EnumerateOptions): StrategyConfig[] {\n assertSpace(space);\n assertShapes(options.shapes);\n if (options.mode === \"grid\") {\n assertWhole(options.levels, \"levels\", 1);\n return gridConfigs(space, options.levels, options.limit ?? 100_000, options.shapes);\n }\n if (options.mode !== \"sample\") throw new RangeError(`The mode ${String((options as { mode?: unknown }).mode)} is not grid or sample.`);\n assertWhole(options.n, \"n\", 0);\n if (!Number.isInteger(options.seed)) throw new RangeError(`The seed ${options.seed} is not a whole number.`);\n const meta = options.meta ?? \"skip\";\n if (meta !== \"skip\" && meta !== \"sample\") throw new RangeError(`The option meta is ${String(meta)}, not skip or sample.`);\n if (options.n === 0) return [];\n return sampleConfigs(restrict(space, options.shapes), options.n, options.seed, meta === \"sample\", options.maxTries ?? Math.max(1000, 100 * options.n));\n}\n\n/**\n * This function gives the shape kinds that a space accepts, in the order of `SHAPE_KINDS`. The value comes from the `supports` of the options.\n * A space accepts a kind when it has at least one config without a meta option on that kind.\n */\nexport function spaceShapeKinds(space: StrategySpace): ShapeKind[] {\n assertSpace(space);\n return SHAPE_KIND_IDS.filter((k) => sizeOf(restrict(space, [k]), 1, 0n).base > 0n);\n}\n\n/**\n * This function joins configs of the parts of a product space into one config of the space `space`.\n * The name of each stage gets the prefix `<space of the part>.`. The members of a meta option do not change.\n */\nexport function joinConfigs(space: string, parts: readonly StrategyConfig[]): StrategyConfig {\n const stages: Record<string, StageChoice | null> = {};\n for (const part of parts) for (const [k, c] of Object.entries(part.stages)) stages[`${part.space}.${k}`] = c;\n return { space, stages };\n}\n\n/** This function gives the config of the part `engine` of a joint config. It throws a `RangeError` when no stage has the prefix `<engine>.`. */\nexport function splitConfig(config: StrategyConfig, engine: string): StrategyConfig {\n const head = `${engine}.`;\n const entries = Object.entries(config.stages).filter(([k]) => k.startsWith(head));\n if (entries.length === 0) throw new RangeError(`The config of the space ${config.space} has no stage of the part ${engine}.`);\n return { space: engine, stages: Object.fromEntries(entries.map(([k, c]) => [k.slice(head.length), c])) };\n}\n\n/**\n * This function joins two spaces, for example a packer and a router, into the space `name`. The stages of `a` and `b` get the prefixes `<a.engine>.` and `<b.engine>.`.\n * The constraints get the same prefixes. The named configs are the pairs `<name of a>+<name of b>`. It throws a `RangeError` when the two engines have the same name.\n */\nexport function productSpace(a: StrategySpace, b: StrategySpace, name: string): StrategySpace {\n if (a.engine === b.engine) throw new RangeError(`The two spaces have the same engine ${a.engine}.`);\n if (name === \"\") throw new RangeError(\"The product space has no name.\");\n const stagesOf = (s: StrategySpace): SpaceStage[] => s.stages.map((x) => ({ ...x, name: `${s.engine}.${x.name}` }));\n const ref = (s: StrategySpace, r: OptionRef): OptionRef => ({ stage: `${s.engine}.${r.stage}`, option: r.option });\n const constraintsOf = (s: StrategySpace): SpaceConstraint[] =>\n (s.constraints ?? []).map((c) => ({ if: ref(s, c.if), then: \"not\" in c.then ? { not: ref(s, c.then.not) } : ref(s, c.then) }));\n const named: Record<string, StrategyConfig> = {};\n for (const [ka, ca] of Object.entries(a.named ?? {})) for (const [kb, cb] of Object.entries(b.named ?? {})) named[`${ka}+${kb}`] = joinConfigs(name, [ca, cb]);\n const constraints = [...constraintsOf(a), ...constraintsOf(b)];\n return {\n schema: STRATEGY_SPACE_SCHEMA,\n engine: name,\n version: `${a.engine}@${a.version}+${b.engine}@${b.version}`,\n stages: [...stagesOf(a), ...stagesOf(b)],\n ...(constraints.length > 0 ? { constraints } : {}),\n ...(Object.keys(named).length > 0 ? { named } : {}),\n parts: [a, b],\n };\n}\n","// The verdict over families (`docs/VERDICT.md`). highways, packing and the joint bench use the same rule, so they give the same verdict.\nimport { compareMeasure, type MeasureSpec } from \"./measures.ts\";\nimport { stepRandom } from \"./random.ts\";\nimport type { LayoutRecord } from \"./record.ts\";\n\n/**\n * The largest count of inputs for the exact permutation test. Up to this count, the test enumerates all `2^n` sign sets.\n * At 16 inputs, that is 65 536 sign sets, approximately 3 times the default draws. Above it, the cost doubles with each input, so the test uses seeded draws.\n */\nexport const VERDICT_EXACT_MAX = 16;\n\n/** The largest value of the option `exactMax`. At 20 inputs, the exact test has approximately 1 million sign sets. */\nexport const VERDICT_EXACT_CAP = 20;\n\n/** The default count of the samples of each bootstrap. It is the parameter `bootstrapRuns` of `docs/PROMOTION.md`. */\nexport const VERDICT_RUNS = 10000;\n\n/** The default count of the random sign sets of the permutation test above `VERDICT_EXACT_MAX` inputs. */\nexport const VERDICT_DRAWS = 20000;\n\n/** The default seed of the bootstraps and of the random sign sets. */\nexport const VERDICT_SEED = 1;\n\n/** The fields of a record that the verdict reads. */\nexport type VerdictRecord = Pick<LayoutRecord, \"strategy\" | \"input\" | \"seed\" | \"measures\"> & { readonly skipped?: string };\n\n/** One side of a verdict: a strategy id, or a test that selects the records of the side. */\nexport type VerdictSide<R extends VerdictRecord = VerdictRecord> = string | ((record: R) => boolean);\n\n/** The arguments of `verdict`. `tie` and `level` have no default. */\nexport interface VerdictOptions<R extends VerdictRecord = VerdictRecord> {\n /** The unit of the verdict. The family is the only unit. */\n readonly by: \"family\";\n /** The hook that gives the family of a record, for example `familyOf` of the cell of its input. */\n readonly family: (record: R) => string;\n /** The measure. Its direction tells which side is better. */\n readonly measure: Pick<MeasureSpec, \"id\" | \"direction\">;\n /** The baseline side. */\n readonly a: VerdictSide<R>;\n /** The candidate side. A positive difference tells that `b` is better than `a`. */\n readonly b: VerdictSide<R>;\n /**\n * The minimum effect of the sign of a family, as `minEffect` of `MeasureSpec`. A smaller change of the family mean is a tie.\n * `compareMeasure` compares the two family means, so the smallest tie is one grid step of `RECORD_EPS`.\n */\n readonly tie: number | { readonly rel: number };\n /** The significance level, from 0 to 1. The permutation p must be below it. The intervals have the level `1 - level`. */\n readonly level: number;\n /** The count of the samples of each bootstrap. The default is `VERDICT_RUNS`. */\n readonly runs?: number;\n /** The count of the random sign sets above the exact limit. The default is `VERDICT_DRAWS`. */\n readonly draws?: number;\n /** The seed of the bootstraps and of the random sign sets. The default is `VERDICT_SEED`. */\n readonly seed?: number;\n /** The largest count of inputs for the exact test. The default is `VERDICT_EXACT_MAX`. The value 0 always uses draws. */\n readonly exactMax?: number;\n}\n\n/** A mean with its bootstrap interval. The interval is clear of 0 when `lo > 0` or `hi < 0`. */\nexport interface VerdictInterval {\n readonly mean: number;\n readonly lo: number;\n readonly hi: number;\n}\n\n/** The difference of one family: the count of its inputs, the mean of their differences and its sign. */\nexport interface FamilyVerdict {\n readonly family: string;\n readonly n: number;\n readonly mean: number;\n /** The value 1 tells that `b` is better, -1 that `b` is worse, and 0 a tie by `tie`. */\n readonly sign: -1 | 0 | 1;\n}\n\n/** The stratified paired permutation test. With `exact`, `draws` is the count of all the sign sets. */\nexport interface VerdictPermutation {\n readonly p: number;\n readonly exact: boolean;\n readonly draws: number;\n readonly seed: number;\n}\n\n/** The two-sided exact sign test of the family signs. It is a report only. Ties do not count. */\nexport interface VerdictSignTest {\n readonly wins: number;\n readonly losses: number;\n readonly ties: number;\n readonly p: number;\n}\n\n/** The label of a verdict. `better` and `worse` tell the side of `b`. */\nexport type VerdictLabel = \"better\" | \"worse\" | \"depends on the mix\" | \"no verdict\";\n\n/**\n * The scope of a verdict. The test keeps the families of the corpus as fixed, so its claim is about these families only.\n * It is not a claim about a new kind of input.\n */\nexport type VerdictScope = \"these families\";\n\n/**\n * The breadth of a verdict: the count of the families against its side.\n * The side is the side of the label. For `depends on the mix` and `no verdict`, it is the sign of the stratified mean.\n */\nexport interface VerdictBreadth {\n /** The count of the families with a sign against the side. A stratified mean of exactly 0 has no side, so this count is 0. */\n readonly against: number;\n /** The count of the families. */\n readonly of: number;\n /** The count of the families with the sign 0. */\n readonly ties: number;\n}\n\n/** The result of `verdict`. */\nexport interface VerdictResult {\n readonly measure: string;\n /** The count of the paired inputs. */\n readonly n: number;\n /** The mean of the family means, with a bootstrap of the seeds inside each family. */\n readonly stratified: VerdictInterval;\n /** The mean of the inputs, with a bootstrap of the inputs. */\n readonly pooled: VerdictInterval;\n readonly permutation: VerdictPermutation;\n /** The families, in sort order. */\n readonly families: readonly FamilyVerdict[];\n readonly signTest: VerdictSignTest;\n /** `true` only when the two means have the same sign, the two intervals are clear of 0 and the permutation p is below `level`. */\n readonly agree: boolean;\n readonly label: VerdictLabel;\n /** The scope of the claim: the families of the corpus, not a new kind of input. */\n readonly scope: VerdictScope;\n /** The count of the families against the side of the verdict, of all the families and of the ties. */\n readonly breadth: VerdictBreadth;\n /** The label, the scope and the breadth in one line, for example `better on these families, worse on 2 of 6 (1 tie)`. */\n readonly summary: string;\n /** The inputs without a pair: one side has no record, a skipped record or no value of the measure. */\n readonly dropped: readonly string[];\n}\n\n/** One paired input: its key, its family, the two values and the difference in the direction of the measure. */\ninterface Pair {\n readonly key: string;\n readonly family: string;\n readonly a: number;\n readonly b: number;\n readonly d: number;\n}\n\n/** This function gives the mean of a list that is not empty. */\nconst meanOf = (values: readonly number[]): number => values.reduce((s, v) => s + v, 0) / values.length;\n\n/** This function gives the `q` quantile of sorted values, with linear interpolation. */\nfunction quantileOf(sorted: readonly number[], q: number): number {\n const at = (sorted.length - 1) * q;\n const lo = Math.floor(at);\n const hi = Math.ceil(at);\n return sorted[lo]! + (sorted[hi]! - sorted[lo]!) * (at - lo);\n}\n\n/** This function gives the interval of the samples of a bootstrap at the level `1 - level`. */\nfunction intervalOf(mean: number, samples: number[], level: number): VerdictInterval {\n samples.sort((x, y) => x - y);\n return { mean, lo: quantileOf(samples, level / 2), hi: quantileOf(samples, 1 - level / 2) };\n}\n\n/** This function tells if an interval is clear of 0 on the side of the sign `sign`. */\nconst clearOn = (i: VerdictInterval, sign: number): boolean => (sign > 0 ? i.lo > 0 : sign < 0 ? i.hi < 0 : false);\n\n/** This function gives the two-sided p of the exact binomial sign test, with `p = 0.5`. No count gives 1. */\nfunction signP(wins: number, losses: number): number {\n const n = wins + losses;\n if (n === 0) return 1;\n const k = Math.min(wins, losses);\n let tail = 0;\n let c = 1;\n for (let i = 0; i <= k; i++) {\n tail += c;\n c = (c * (n - i)) / (i + 1);\n }\n return Math.min(1, (2 * tail) / 2 ** n);\n}\n\n/** This function gives the breadth of a verdict with the side `side`: 1, -1, or 0 for no side. */\nfunction breadthOf(families: readonly FamilyVerdict[], side: number): VerdictBreadth {\n const ties = families.filter((f) => f.sign === 0).length;\n const against = side === 0 ? 0 : families.filter((f) => f.sign === -side).length;\n return { against, of: families.length, ties };\n}\n\n/** This function gives the line of a verdict: its label, its scope and its breadth (`docs/VERDICT.md`). */\nfunction summaryOf(label: VerdictLabel, side: number, breadth: VerdictBreadth): string {\n const ties = breadth.ties === 0 ? \"\" : ` (${breadth.ties} ${breadth.ties === 1 ? \"tie\" : \"ties\"})`;\n const word = side > 0 ? \"better\" : \"worse\";\n const other = side > 0 ? \"worse\" : \"better\";\n const count = breadth.against === 0 ? \"none\" : String(breadth.against);\n if (label === \"better\" || label === \"worse\") return `${label} on these families, ${other} on ${count} of ${breadth.of}${ties}`;\n if (side === 0) return `${label}: the family mean is 0, on ${breadth.of} families${ties}`;\n return `${label}: ${word} on the family mean, ${other} on ${count} of ${breadth.of}${ties}`;\n}\n\n/** This function tells if a value is a positive whole number. */\nconst isCount = (v: number): boolean => Number.isInteger(v) && v > 0;\n\n/** This function gives the test of one side. */\nfunction sideTest<R extends VerdictRecord>(side: VerdictSide<R>): (record: R) => boolean {\n return typeof side === \"string\" ? (r) => r.strategy === side : side;\n}\n\n/** This function pairs the records of `a` and `b` by input and seed, and gives the pairs in the order of family and key. */\nfunction pairsOf<R extends VerdictRecord>(records: Iterable<R>, options: VerdictOptions<R>): { pairs: Pair[]; dropped: string[] } {\n const isA = sideTest(options.a);\n const isB = sideTest(options.b);\n const sides = new Map<string, { a?: R; b?: R }>();\n for (const r of records) {\n const inA = isA(r);\n const inB = isB(r);\n if (inA && inB) throw new RangeError(`verdict: the record of the input \"${r.input}\" is in the two sides`);\n if (!inA && !inB) continue;\n const key = `${r.input}#${r.seed}`;\n const entry = sides.get(key) ?? {};\n const side = inA ? \"a\" : \"b\";\n if (entry[side] !== undefined) throw new RangeError(`verdict: the side ${side} has two records of the input \"${r.input}\" and the seed ${r.seed}`);\n entry[side] = r;\n sides.set(key, entry);\n }\n const pairs: Pair[] = [];\n const dropped: string[] = [];\n const id = options.measure.id;\n for (const [key, { a, b }] of sides) {\n const va = a?.skipped === undefined ? a?.measures[id] : undefined;\n const vb = b?.skipped === undefined ? b?.measures[id] : undefined;\n if (a === undefined || b === undefined || va === undefined || vb === undefined) {\n dropped.push(key);\n continue;\n }\n if (!Number.isFinite(va) || !Number.isFinite(vb)) throw new RangeError(`verdict: the measure ${id} of the input \"${a.input}\" is not finite`);\n const family = options.family(a);\n if (options.family(b) !== family) throw new RangeError(`verdict: the two records of the input \"${a.input}\" have different families`);\n pairs.push({ key, family, a: va, b: vb, d: options.measure.direction === \"higher\" ? vb - va : va - vb });\n }\n pairs.sort((x, y) => (x.family < y.family ? -1 : x.family > y.family ? 1 : x.key < y.key ? -1 : x.key > y.key ? 1 : 0));\n dropped.sort();\n return { pairs, dropped };\n}\n\n/**\n * This function gives the verdict of the candidate `b` against the baseline `a` on one measure, with the family as the unit (`docs/VERDICT.md`).\n *\n * - It pairs the records by input and seed. The difference of a pair is `b - a` for a measure where more is better, else `a - b`.\n * - `stratified` is the mean of the family means. Its bootstrap draws the seeds inside each family. `pooled` is the mean of the inputs.\n * - The permutation test changes the sign of each difference inside its family. Its statistic is the mean of the family means.\n * - The label is `better` or `worse` only when `agree` is `true`. Opposite signs of the two means give `depends on the mix`.\n * - `scope`, `breadth` and `summary` tell that the claim is about these families, and how many families are against it.\n *\n * It throws a `RangeError` for a missing `tie` or `level`, and for no pair. Two records of one side and input, or a value that is not finite, also cause a `RangeError`.\n */\nexport function verdict<R extends VerdictRecord>(records: Iterable<R>, options: VerdictOptions<R>): VerdictResult {\n const { tie, level, measure } = options;\n if (options.by !== \"family\") throw new RangeError(`verdict: the unit is \"family\", not \"${String(options.by)}\"`);\n if (tie === undefined || (typeof tie === \"number\" ? !(tie >= 0) : !(tie.rel >= 0))) throw new RangeError(\"verdict: tie is a required number of 0 or more, or { rel } of 0 or more\");\n if (level === undefined || !(level > 0 && level < 1)) throw new RangeError(\"verdict: level is a required number between 0 and 1\");\n const runs = options.runs ?? VERDICT_RUNS;\n const draws = options.draws ?? VERDICT_DRAWS;\n const seed = options.seed ?? VERDICT_SEED;\n const exactMax = options.exactMax ?? VERDICT_EXACT_MAX;\n if (!isCount(runs) || !isCount(draws)) throw new RangeError(\"verdict: runs and draws are whole numbers above 0\");\n if (!Number.isInteger(exactMax) || exactMax < 0 || exactMax > VERDICT_EXACT_CAP) throw new RangeError(`verdict: exactMax is a whole number from 0 to ${VERDICT_EXACT_CAP}`);\n\n const { pairs, dropped } = pairsOf(records, options);\n const n = pairs.length;\n if (n === 0) throw new RangeError(`verdict: the records give no pair of the measure ${measure.id}`);\n\n const groups = new Map<string, Pair[]>();\n for (const p of pairs) groups.set(p.family, [...(groups.get(p.family) ?? []), p]);\n const lists = [...groups.values()];\n const spec = { direction: measure.direction, minEffect: tie };\n const families: FamilyVerdict[] = lists.map((list) => {\n const verdictOf = compareMeasure(meanOf(list.map((p) => p.b)), meanOf(list.map((p) => p.a)), spec);\n return { family: list[0]!.family, n: list.length, mean: meanOf(list.map((p) => p.d)), sign: verdictOf === \"better\" ? 1 : verdictOf === \"worse\" ? -1 : 0 };\n });\n\n // The stratified bootstrap draws the seeds of each family with replacement. The pooled bootstrap draws all the inputs.\n const stratMean = meanOf(families.map((f) => f.mean));\n const rs = stepRandom(seed, \"verdict.stratified\");\n const stratSamples: number[] = [];\n for (let run = 0; run < runs; run++) {\n let sum = 0;\n for (const list of lists) {\n let s = 0;\n for (let j = 0; j < list.length; j++) s += list[Math.floor(rs() * list.length)]!.d;\n sum += s / list.length;\n }\n stratSamples.push(sum / lists.length);\n }\n const stratified = intervalOf(stratMean, stratSamples, level);\n\n const pooledMean = meanOf(pairs.map((p) => p.d));\n const rp = stepRandom(seed, \"verdict.pooled\");\n const pooledSamples: number[] = [];\n for (let run = 0; run < runs; run++) {\n let s = 0;\n for (let j = 0; j < n; j++) s += pairs[Math.floor(rp() * n)]!.d;\n pooledSamples.push(s / n);\n }\n const pooled = intervalOf(pooledMean, pooledSamples, level);\n\n // The statistic is a weighted sum: the weight of an input is 1 / (the count of families × the count of its family).\n const terms = lists.flatMap((list) => list.map((p) => p.d / (lists.length * list.length)));\n const observed = Math.abs(terms.reduce((s, t) => s + t, 0));\n const slack = 1e-12 * terms.reduce((s, t) => s + Math.abs(t), 0);\n const exact = n <= exactMax;\n let hits = 0;\n let total: number;\n if (exact) {\n total = 2 ** n;\n for (let mask = 0; mask < total; mask++) {\n let t = 0;\n for (let i = 0; i < n; i++) t += mask & (1 << i) ? -terms[i]! : terms[i]!;\n if (Math.abs(t) >= observed - slack) hits++;\n }\n } else {\n total = draws;\n const rf = stepRandom(seed, \"verdict.permutation\");\n for (let k = 0; k < draws; k++) {\n let t = 0;\n for (let i = 0; i < n; i++) t += rf() < 0.5 ? -terms[i]! : terms[i]!;\n if (Math.abs(t) >= observed - slack) hits++;\n }\n }\n // A drawn p counts the observed sign set as one draw, so it is always above 0.\n const permutation: VerdictPermutation = { p: exact ? hits / total : (hits + 1) / (total + 1), exact, draws: total, seed };\n\n const wins = families.filter((f) => f.sign === 1).length;\n const losses = families.filter((f) => f.sign === -1).length;\n const signTest: VerdictSignTest = { wins, losses, ties: families.length - wins - losses, p: signP(wins, losses) };\n\n const sign = Math.sign(stratified.mean);\n const agree = sign !== 0 && sign === Math.sign(pooled.mean) && clearOn(stratified, sign) && clearOn(pooled, sign) && permutation.p < level;\n const label: VerdictLabel = agree ? (sign > 0 ? \"better\" : \"worse\") : sign * Math.sign(pooled.mean) < 0 ? \"depends on the mix\" : \"no verdict\";\n const breadth = breadthOf(families, sign);\n const summary = summaryOf(label, sign, breadth);\n return { measure: measure.id, n, stratified, pooled, permutation, families, signTest, agree, label, scope: \"these families\", breadth, summary, dropped };\n}\n","// The shared corpus generator (`docs/CORPUS.md`): the dimension schema, the family registry and the seeded random numbers.\n// An engine owns its families and gives them to a registry. This file imports no engine and no API of Node, so a browser can run it.\nimport type { FamilyBy } from \"./corpus.ts\";\nimport { edgeStep, type EdgeStepParams } from \"./edges.ts\";\nimport { documentHash } from \"./hash.ts\";\nimport type { LayoutInput, Obstacle } from \"./input.ts\";\nimport { mulberry32, randomInt, stepRandom } from \"./random.ts\";\nimport { SHAPE_KIND_IDS } from \"./shapes.ts\";\nimport { paramActive, paramLevels, paramProblem, paramValue, type ParamValue, type SpaceParam } from \"./strategy-space.ts\";\n\n/**\n * One dimension of a corpus: a param of `strategy-space.ts` with its meaning and the engines that use it.\n * The field `when` has the form of `SpaceParam.when`: the dimension is active only for some values of an earlier dimension.\n */\nexport interface CorpusDimension extends SpaceParam {\n /** The meaning of the dimension, in one sentence. */\n readonly meaning: string;\n /** The engines that read the dimension, for example `packing`, `highways` and `joint`. */\n readonly engines: readonly string[];\n /** The values of a sweep. Without them, a sweep uses the values of an `enum`, `false` and `true` of a `bool`, or the default. */\n readonly levels?: readonly ParamValue[];\n /**\n * The values that the family accepts. Without it, the family accepts each value of the dimension.\n * A list is for an `enum` or a `bool`. A sub-range is for an `int` or a `real`.\n * The default and each level are supported values. `resolve` and `generate` refuse a value that is not supported.\n */\n readonly supported?: SupportedValues;\n /**\n * The output fields that a value other than the default makes wrong, for example `known`.\n * Then `generate` of a registry removes these fields from the output, and lists them in `invalidated`.\n */\n readonly invalidates?: readonly string[];\n}\n\n/**\n * The supported values of a dimension (`CorpusDimension.supported`).\n * The list form gives the values of an `enum` or a `bool`. The range form gives a sub-range of an `int` or a `real`.\n * A range without `min` or `max` keeps that end of the dimension.\n */\nexport type SupportedValues = readonly ParamValue[] | SupportedRange;\n\n/** The range form of `SupportedValues`: the least and the largest supported value of a numeric dimension. */\nexport interface SupportedRange {\n readonly min?: number;\n readonly max?: number;\n}\n\n/** The name of the output field that lists the fields that `generate` of a registry removed. */\nexport const INVALIDATED_FIELD = \"invalidated\";\n\n/** The values of the dimensions of one input: one value for each name. */\nexport type DimensionValues = Readonly<Record<string, ParamValue>>;\n\n/** A factory of seeded random numbers: it gives a source of numbers in [0, 1) for a seed. */\nexport type RngFactory = (seed: number) => () => number;\n\n/**\n * The cross-engine note of a family. `exact` tells that each JavaScript engine gives the same output.\n * `libm-dependent` tells that the family uses a function that is not correctly rounded in each engine, for example `Math.log`, `Math.cos` or `**`.\n */\nexport type CrossEngine = \"exact\" | \"libm-dependent\";\n\n/** The random numbers of the default factory: `mulberry32` of `random.ts`. Its stream is pinned in `families.test.ts`. */\nexport const DEFAULT_RNG: RngFactory = mulberry32;\n\n/** The context that a registry gives to `generate`. */\nexport interface GenerateContext {\n /** The random factory of the family: its own `rng`, or `DEFAULT_RNG`. */\n readonly rng: RngFactory;\n /** The source of random numbers of the input: `rng(rngSeed(seed, dims))`. A family that does not use it takes no numbers from it. */\n readonly random: () => number;\n /** The name of the corpus of the input, when the caller gives one. */\n readonly set?: string;\n}\n\n/**\n * A family of a corpus: a seeded generator with declared dimensions. The engine that owns it gives it to a registry.\n * The registry gives `generate` the raw seed and the full dimension values.\n * The registry changes the output only for a dimension with `invalidates` at a value other than its default.\n */\nexport interface CorpusFamily<O = LayoutInput> {\n /** The name of the family, for example `rect-grid`. */\n readonly name: string;\n /** The version. A change of the output of the family needs a new version. A dimension of only some versions is in the list of those versions only. */\n readonly version: number;\n /** The engine that owns the definition of the family, for example `packing`. */\n readonly owner: string;\n /** The meaning of the family, in one sentence. */\n readonly meaning: string;\n /** The dimensions of the family, in their order. A dimension with `when` comes after the dimension that its `when` names. The name `kind` is reserved. */\n readonly dimensions: readonly CorpusDimension[];\n /** The text of the rule that gives the random numbers of an input from its seed and its dimensions. */\n readonly seeding: string;\n /** The cross-engine note of the family. */\n readonly crossEngine: CrossEngine;\n /** The random factory of the family. The default is `DEFAULT_RNG`. */\n readonly rng?: RngFactory;\n /** This function gives the seed of `context.random` from the input seed and the full dimension values. The default gives the input seed. */\n readonly rngSeed?: (seed: number, dims: DimensionValues) => number;\n /** The dimensions of the family key of `familyBy`, after the kind of the cell. A dimension with `when` is not permitted. The default is no dimension. */\n readonly familyBy?: readonly string[];\n /**\n * This function gives the hash of an output after the registry removes the fields of `invalidates`. The default is `documentHash` of `hash.ts`.\n * The registry uses it only for an output with a `hash` field of text. The registry gives it an output of the family.\n * Its parameter has the type `never`, so a family of each output type can be a `CorpusFamily<unknown>`.\n */\n readonly hash?: (output: never) => string;\n /** This function gives the input of a seed. `dims` has a value for each dimension, also for an inactive dimension. */\n generate(seed: number, dims: DimensionValues, context: GenerateContext): O;\n}\n\n/** The options of `generate` of a registry. */\nexport interface GenerateOptions {\n /** The version of the family. The default is the first version that the registry got. */\n readonly version?: number;\n /** The name of the corpus. The registry gives it to the family in `context.set`. */\n readonly set?: string;\n}\n\n/** The options of `cells` and `cellCount` of a registry. */\nexport interface CellsOptions {\n readonly version?: number;\n /** The dimensions of the sweep. The other dimensions keep their defaults. The default is each dimension of the family. */\n readonly sweep?: readonly string[];\n /** The values of a sweep for some dimensions, in place of the levels of the dimensions. */\n readonly levels?: Readonly<Record<string, readonly ParamValue[]>>;\n}\n\n/** The cell of an input of a registry: `<name>@<version>` of its family in `kind` (`familyKind`), and the value of each active dimension. */\nexport type RegistryCell = Readonly<Record<string, ParamValue>> & { readonly kind: string };\n\n/** This function gives the `kind` of the cells of a version of a family: `<name>@<version>`, for example `rect-grid@2`. Thus two versions do not share a family key. */\nexport function familyKind(name: string, version: number): string {\n return `${name}@${version}`;\n}\n\n/** A registry of families. An import registers nothing: a host makes a registry from the lists of families of the engines. */\nexport interface FamilyRegistry<O = LayoutInput> {\n /** This method adds a family. It throws a `RangeError` for a second family with the same name and version, or for a bad dimension. */\n register(family: CorpusFamily<O>): FamilyRegistry<O>;\n /** This method gives a family. Without a version, it gives the first version that the registry got. It throws a `RangeError` for an unknown family. */\n family(name: string, version?: number): CorpusFamily<O>;\n /** This method gives each family, in the order of registration. */\n families(): readonly CorpusFamily<O>[];\n /**\n * This method gives the full dimension values of an input. It throws a `RangeError` for an unknown dimension, a bad value or a value that is not supported.\n * The methods with `dims` accept a cell of `cellOf`: they ignore a `kind` that is the `familyKind` of the family, and refuse another `kind`.\n */\n resolve(name: string, dims?: Readonly<Record<string, ParamValue>>, version?: number): DimensionValues;\n /**\n * This method gives the input of a seed: the output of the family. A dimension with `invalidates` at a value other than its default changes it.\n * Then the method removes those fields, adds their names to `invalidated` and calculates the `hash` again. Another output has no change.\n */\n generate(name: string, seed: number, dims?: Readonly<Record<string, ParamValue>>, options?: GenerateOptions): O;\n /** This method gives the cell of an input: the `familyKind` of the family version and the value of each active dimension. */\n cellOf(name: string, dims?: Readonly<Record<string, ParamValue>>, version?: number): RegistryCell;\n /** This method gives the full dimension values of each cell of a sweep, without the dead combinations of `when`. */\n cells(name: string, options?: CellsOptions): Generator<DimensionValues>;\n /** This method gives the count of the cells of `cells`. It makes no input. */\n cellCount(name: string, options?: CellsOptions): number;\n /** This method gives the defaults, and each end of each numeric range. The dimensions that a `when` needs get its first value. The other dimensions keep their defaults. */\n boundaryCells(name: string, version?: number): DimensionValues[];\n /** This method gives the random source of an input: the stream that `generate` gets in `context.random`. */\n rngOf(name: string, version?: number): (seed: number, dims?: Readonly<Record<string, ParamValue>>) => () => number;\n /** This method gives the map form of `FamilyBy` for the cells of `cellOf`: the `familyKind` of each family version, with its own `familyBy`. */\n familyBy(): FamilyBy;\n}\n\n/** The default key of a family in a manifest: the kind of the cell alone. It is the map form of `FamilyBy` with the entry `\"*\"`. */\nexport const DEFAULT_FAMILY_BY: FamilyBy = Object.freeze({ \"*\": Object.freeze([]) as readonly string[] });\n\n/** This function gives an `enum` dimension. */\nconst choice = (name: string, values: readonly string[], value: string, meaning: string, engines: readonly string[]): CorpusDimension =>\n Object.freeze({ name, kind: \"enum\", values: Object.freeze([...values]), default: value, meaning, engines: Object.freeze([...engines]) });\n\n/** This function gives an `int` or a `real` dimension. */\nconst range = (\n name: string,\n kind: \"int\" | \"real\",\n limits: { readonly min: number; readonly max: number; readonly value: number; readonly scale?: \"linear\" | \"log\"; readonly levels?: readonly number[] },\n meaning: string,\n engines: readonly string[],\n): CorpusDimension =>\n Object.freeze({\n name,\n kind,\n min: limits.min,\n max: limits.max,\n default: limits.value,\n scale: limits.scale ?? \"linear\",\n ...(limits.levels === undefined ? {} : { levels: Object.freeze([...limits.levels]) }),\n meaning,\n engines: Object.freeze([...engines]),\n });\n\nconst P = \"packing\";\nconst H = \"highways\";\nconst J = \"joint\";\n\n/**\n * The shared dimension table. A family takes a dimension of it with `sharedDimension`, or declares its own dimension.\n * The coverage table of each dimension and each engine is in `docs/CORPUS.md`.\n */\nexport const CORPUS_DIMENSIONS: Readonly<Record<string, CorpusDimension>> = Object.freeze({\n count: range(\"count\", \"int\", { min: 0, max: 100_000, value: 100, scale: \"log\", levels: [1, 10, 100, 1000, 10_000] }, \"The count of the items (n) of an input.\", [P, H, J]),\n sizes: choice(\"sizes\", [\"identical\", \"nearIdentical\", \"uniform\", \"heavyTail\", \"bimodal\", \"extremeAspect\"], \"uniform\", \"The distribution of the sizes of the items.\", [P, J]),\n aspect: range(\"aspect\", \"real\", { min: 0.25, max: 4, value: 1, scale: \"log\" }, \"The width over the height of a container with no fixed size.\", [P]),\n density: range(\"density\", \"real\", { min: 0.05, max: 1, value: 0.4, scale: \"linear\" }, \"The area of the items over the area of the frame of the container.\", [P]),\n obstacles: choice(\"obstacles\", [\"none\", \"center\", \"scattered\", \"wall\", \"corridors\", \"touching\", \"edge\"], \"none\", \"The layout of the fixed obstacles.\", [P, J]),\n containerSize: choice(\"containerSize\", [\"fixed\", \"freeHeight\", \"freeWidth\", \"freeAspect\", \"freeArea\"], \"fixed\", \"The sides of the container that the engine can change.\", [P, J]),\n containerShape: choice(\"containerShape\", [\"rect\", \"convex\", \"polygon\", \"circle\", \"ellipse\", \"holes\"], \"rect\", \"The kind of the shape of the container.\", [P, J]),\n shape: choice(\"shape\", SHAPE_KIND_IDS, \"rect\", \"The shape kind of each item: a `ShapeKind` of `shapes.ts`.\", [P]),\n order: choice(\"order\", [\"free\", \"soft\"], \"free\", \"The reading order of the items: no order, or a rank on each item.\", [P]),\n groups: choice(\"groups\", [\"none\", \"flat\", \"nested\"], \"none\", \"The groups of the items: no groups, one level, or groups in groups.\", [H, J]),\n edgeDensity: choice(\"edgeDensity\", [\"sparse\", \"medium\", \"dense\"], \"medium\", \"The mean count of the edges of each item: 0.5, 1.5 or 4.\", [H, J]),\n edgeShape: choice(\"edgeShape\", [\"random\", \"clustered\", \"hubChain\", \"hubs\", \"longRange\", \"tree\", \"bundled\"], \"random\", \"The topology of the edges.\", [H, J]),\n ports: choice(\"ports\", [\"free\", \"sides\", \"fixed\"], \"free\", \"The ports of the edges: free, a side for each end, or fixed ports.\", [H, J]),\n hubBy: Object.freeze({\n ...choice(\"hubBy\", [\"area\", \"random\"], \"area\", \"The order of the hubs of the shapes hubs and tree: the largest item first, or random.\", [J]),\n when: Object.freeze({ param: \"edgeShape\", in: Object.freeze([\"hubs\", \"tree\"]) }),\n }),\n spacing: choice(\"spacing\", [\"stress\", \"gap\", \"margin\", \"both\"], \"both\", \"The split of the route clearance between the margins and the gap. `stress` has neither.\", [J]),\n margin: range(\"margin\", \"real\", { min: 0, max: 32, value: 0 }, \"The margin of each item, in units.\", [P, J]),\n gap: range(\"gap\", \"real\", { min: 0, max: 32, value: 0 }, \"The free space between two items, in units.\", [P, J]),\n});\n\n/**\n * This function gives a dimension of `CORPUS_DIMENSIONS`, with the fields of `patch` over it. It throws a `RangeError` for an unknown name.\n * With `supported` or `invalidates` in the patch, it also throws a `RangeError` for a bad dimension, as `ownerDimension` does.\n */\nexport function sharedDimension(name: string, patch: Partial<CorpusDimension> = {}): CorpusDimension {\n const base = Object.hasOwn(CORPUS_DIMENSIONS, name) ? CORPUS_DIMENSIONS[name] : undefined;\n if (base === undefined) throw new RangeError(`The shared dimension table has no dimension \"${name}\".`);\n const dim: CorpusDimension = Object.freeze({ ...base, ...patch, name });\n if (patch.supported !== undefined || patch.invalidates !== undefined) throwProblems(`sharedDimension: the dimension \"${name}\"`, ownProblems(dim));\n return dim;\n}\n\n/** The fields of a dimension that the owner declares: each field of `CorpusDimension` but the name. */\nexport type OwnerDimensionSpec = Omit<CorpusDimension, \"name\">;\n\n/**\n * This function gives a dimension that only its owner declares, for example `cut` of a family of `packing`.\n * It throws a `RangeError` for a name of `CORPUS_DIMENSIONS`, the reserved name `kind`, or a bad default, level, `supported` or `invalidates`.\n * The registry examines the `when` of the dimension, because it needs the earlier dimensions.\n */\nexport function ownerDimension(name: string, spec: OwnerDimensionSpec): CorpusDimension {\n const where = `ownerDimension: the dimension \"${name}\"`;\n if (typeof name !== \"string\" || name === \"\") throw new RangeError(\"ownerDimension: the name of a dimension is a text that is not empty.\");\n if (name === \"kind\") throw new RangeError(`${where} has a reserved name: the cell of \\`cellOf\\` has the \\`familyKind\\` of the family in \\`kind\\`.`);\n if (Object.hasOwn(CORPUS_DIMENSIONS, name)) throw new RangeError(`${where} is in the shared dimension table. Use sharedDimension(\"${name}\") for it.`);\n const dim: CorpusDimension = Object.freeze({ ...spec, name });\n throwProblems(where, ownProblems(dim));\n return dim;\n}\n\n/** This function throws a `RangeError` with each problem of a list. An empty list throws nothing. */\nfunction throwProblems(where: string, problems: readonly string[]): void {\n if (problems.length > 0) throw new RangeError(`${where} is not good: ${problems.join(\"; \")}.`);\n}\n\n/** This function tells if a value of the stable form of a dimension is in its `supported` values. Without `supported`, each value is in them. */\nfunction inSupported(dim: CorpusDimension, value: ParamValue): boolean {\n const s = dim.supported;\n if (s === undefined) return true;\n if (isSupportedList(s)) return s.some((v) => paramValue(dim, v) === value);\n if (typeof value !== \"number\") return false;\n return (s.min === undefined || value >= s.min) && (s.max === undefined || value <= s.max);\n}\n\n/** This function tells if `SupportedValues` has the list form. */\nconst isSupportedList = (s: SupportedValues): s is readonly ParamValue[] => Array.isArray(s);\n\n/**\n * This function tells if a family accepts a value of a dimension. A site uses it to show the values that a family does not support.\n * It gives `false` for a bad value, and for a value outside `supported`. Without `supported`, it gives `true` for each good value.\n */\nexport function dimensionSupports(dim: CorpusDimension, value: unknown): boolean {\n if (paramProblem(dim, value) !== undefined) return false;\n return inSupported(dim, paramValue(dim, value as ParamValue));\n}\n\n/** This function gives the text of the supported values of a dimension, for a message. */\nfunction supportedText(dim: CorpusDimension): string {\n const s = dim.supported;\n if (s === undefined) return \"each value\";\n if (isSupportedList(s)) return s.map((v) => JSON.stringify(v)).join(\", \");\n return `the values from ${s.min ?? dim.min} to ${s.max ?? dim.max}`;\n}\n\n/** This function gives the problems of one dimension that need no other dimension: the default, the levels, `supported` and `invalidates`. */\nfunction ownProblems(d: CorpusDimension): string[] {\n const out: string[] = [];\n const bad = paramProblem(d, d.default);\n if (bad !== undefined) out.push(`the default of \"${d.name}\" is bad: ${bad}`);\n for (const v of d.levels ?? []) {\n const p = paramProblem(d, v);\n if (p !== undefined) out.push(`a level of \"${d.name}\" is bad: ${p}`);\n }\n out.push(...supportProblems(d, bad === undefined));\n out.push(...invalidatesProblems(d));\n return out;\n}\n\n/** This function gives the problems of the `supported` values of a dimension. `goodDefault` tells that the default is a good value. */\nfunction supportProblems(d: CorpusDimension, goodDefault: boolean): string[] {\n const s = d.supported;\n if (s === undefined) return [];\n const out: string[] = [];\n const numeric = d.kind === \"int\" || d.kind === \"real\";\n if (isSupportedList(s)) {\n if (numeric) return [`the supported values of \"${d.name}\" are a range with min and max, because the dimension is numeric`];\n if (s.length === 0) return [`the supported values of \"${d.name}\" are an empty list`];\n for (const v of s) {\n const p = paramProblem(d, v);\n if (p !== undefined) out.push(`a supported value of \"${d.name}\" is bad: ${p}`);\n }\n if (new Set(s).size !== s.length) out.push(`the supported values of \"${d.name}\" have a value two times`);\n } else {\n if (s === null || typeof s !== \"object\") return [`the supported values of \"${d.name}\" are a list or a range`];\n if (!numeric) return [`the supported values of \"${d.name}\" are a list, because the dimension is not numeric`];\n for (const end of [s.min, s.max]) {\n if (end === undefined) continue;\n const p = paramProblem(d, end);\n if (p !== undefined) out.push(`an end of the supported range of \"${d.name}\" is bad: ${p}`);\n }\n if (s.min !== undefined && s.max !== undefined && s.min > s.max) out.push(`the supported range of \"${d.name}\" has a min above its max`);\n }\n if (out.length > 0) return out;\n if (goodDefault && !inSupported(d, paramValue(d, d.default))) out.push(`the default of \"${d.name}\" is not a supported value`);\n for (const v of d.levels ?? []) if (paramProblem(d, v) === undefined && !inSupported(d, paramValue(d, v))) out.push(`the level ${JSON.stringify(v)} of \"${d.name}\" is not a supported value`);\n return out;\n}\n\n/** This function gives the problems of the `invalidates` fields of a dimension. */\nfunction invalidatesProblems(d: CorpusDimension): string[] {\n const list = d.invalidates;\n if (list === undefined) return [];\n if (!Array.isArray(list) || !list.every((f) => typeof f === \"string\" && f !== \"\")) return [`the invalidates of \"${d.name}\" is not a list of field names`];\n const out: string[] = [];\n if (new Set(list).size !== list.length) out.push(`the invalidates of \"${d.name}\" has a field two times`);\n for (const f of [\"hash\", INVALIDATED_FIELD]) if (list.includes(f)) out.push(`the invalidates of \"${d.name}\" has the field \"${f}\", which the registry writes`);\n return out;\n}\n\n/** This function tells if a log scale of a range starts at 0. Then the scale is the log of `1 + x - min`. */\nconst fromZero = (d: SpaceParam): boolean => d.scale === \"log\" && (d.min ?? 0) <= 0;\n\n/**\n * This function gives the value at the fraction `t` of the range of a numeric dimension, on its scale. A slider of a site uses it.\n * A log scale with a `min` of 0 or less is the log of `1 + x - min`. An `int` dimension gives a whole number.\n */\nexport function dimensionAt(dim: SpaceParam, t: number): number {\n const min = dim.min ?? 0;\n const max = dim.max ?? min;\n const u = Math.min(1, Math.max(0, t));\n let v: number;\n if (dim.scale !== \"log\") v = min + u * (max - min);\n else if (fromZero(dim)) v = min + Math.expm1(u * Math.log1p(max - min));\n else v = Math.exp(Math.log(min) + u * (Math.log(max) - Math.log(min)));\n v = Math.min(max, Math.max(min, v));\n return dim.kind === \"int\" ? Math.round(v) : (paramValue(dim, v) as number);\n}\n\n/** This function gives the fraction of the range of a numeric dimension at a value, on its scale. It is the inverse of `dimensionAt`. */\nexport function dimensionUnit(dim: SpaceParam, value: number): number {\n const min = dim.min ?? 0;\n const max = dim.max ?? min;\n if (max === min) return 0;\n const v = Math.min(max, Math.max(min, value));\n if (dim.scale !== \"log\") return (v - min) / (max - min);\n if (fromZero(dim)) return Math.log1p(v - min) / Math.log1p(max - min);\n return (Math.log(v) - Math.log(min)) / (Math.log(max) - Math.log(min));\n}\n\n/** This function gives the range of the supported values of a numeric dimension: its own `min` and `max` in place of the ends of `supported`. */\nfunction supportedSpan(dim: CorpusDimension): { readonly min: number | undefined; readonly max: number | undefined } {\n const s = dim.supported;\n const range = s === undefined || isSupportedList(s) ? {} : s;\n return { min: range.min ?? dim.min, max: range.max ?? dim.max };\n}\n\n/**\n * This function gives the values of a sweep of a dimension. `levels` of the dimension come first. Then an `enum` gives its values, and a `bool` gives `false` and `true`.\n * With `steps`, a numeric dimension gives `steps` points from `min` to `max` on its scale. Else it gives its default.\n * With `supported`, an `enum` and a `bool` give only the supported values, and the points of a numeric dimension stay in the supported range.\n */\nexport function levelsOf(dim: CorpusDimension, steps?: number): ParamValue[] {\n if (dim.levels !== undefined) return [...dim.levels];\n if (dim.kind === \"enum\" || dim.kind === \"bool\") return paramLevels(dim, 1).filter((v) => inSupported(dim, paramValue(dim, v)));\n if (steps === undefined) return paramLevels(dim, 1);\n if (dim.supported !== undefined) {\n const { supported: _supported, ...rest } = dim;\n const span = supportedSpan(dim);\n return levelsOf({ ...rest, ...(span.min === undefined ? {} : { min: span.min }), ...(span.max === undefined ? {} : { max: span.max }) }, steps);\n }\n if (!fromZero(dim)) return paramLevels(dim, steps);\n if (!Number.isInteger(steps) || steps < 1) throw new RangeError(`The steps of a sweep are a whole number of 1 or more, not ${steps}.`);\n if (steps === 1) return [paramValue(dim, dim.default)];\n return [...new Set(Array.from({ length: steps }, (_, j) => dimensionAt(dim, j / (steps - 1))))];\n}\n\n/** This function gives the problems of the dimensions of a family: a repeated name, a bad default, level, `supported`, `invalidates` or `when`. */\nfunction dimensionProblems(dims: readonly CorpusDimension[]): string[] {\n const out: string[] = [];\n const names = dims.map((d) => d.name);\n dims.forEach((d, i) => {\n if (names.indexOf(d.name) !== i) out.push(`the dimension \"${d.name}\" is in the list two times`);\n out.push(...ownProblems(d));\n if (d.when === undefined) return;\n const j = names.indexOf(d.when.param);\n if (j < 0 || j >= i) out.push(`the when of \"${d.name}\" names \"${d.when.param}\", which is not an earlier dimension`);\n else if (d.when.in.length === 0) out.push(`the when of \"${d.name}\" has no values`);\n else for (const v of d.when.in) if (paramProblem(dims[j]!, v) !== undefined) out.push(`the when of \"${d.name}\" has a value that \"${d.when.param}\" does not have`);\n });\n return out;\n}\n\n/**\n * This function gives the full dimension values of an input. A missing dimension gets its default. An inactive dimension of `when` also gets its default.\n * Thus a default that the caller gives, a missing value and an inactive value give the same values. A real number gets its stable form.\n *\n * The function throws a `RangeError` for an unknown dimension or a bad value, also for a bad value of an inactive dimension.\n * It also throws a `RangeError` for a value outside `supported`, with the text \"not supported by\" and `by`.\n */\nexport function resolveDimensions(\n dimensions: readonly CorpusDimension[],\n dims: Readonly<Record<string, ParamValue>> = {},\n where: string = \"The family\",\n by: string = \"the family\",\n): DimensionValues {\n const known = new Set(dimensions.map((d) => d.name));\n for (const key of Object.keys(dims)) if (!known.has(key)) throw new RangeError(`${where} has no dimension \"${key}\".`);\n const active: Record<string, ParamValue> = {};\n const out: Record<string, ParamValue> = {};\n for (const d of dimensions) {\n const given = Object.hasOwn(dims, d.name) ? dims[d.name] : undefined;\n if (given !== undefined) {\n const bad = paramProblem(d, given);\n if (bad !== undefined) throw new RangeError(`${where}: the dimension \"${d.name}\" is bad: ${bad}.`);\n if (!inSupported(d, paramValue(d, given))) {\n throw new RangeError(`${where}: the value ${JSON.stringify(given)} of the dimension \"${d.name}\" is not supported by ${by}. The supported values are ${supportedText(d)}.`);\n }\n }\n const on = paramActive(d, active);\n const value = paramValue(d, on && given !== undefined ? given : d.default);\n if (on) active[d.name] = value;\n out[d.name] = value;\n }\n return out;\n}\n\n/** This function gives the values of the active dimensions only. */\nfunction activeValues(dimensions: readonly CorpusDimension[], full: DimensionValues): Record<string, ParamValue> {\n const active: Record<string, ParamValue> = {};\n for (const d of dimensions) if (paramActive(d, active)) active[d.name] = full[d.name]!;\n return active;\n}\n\n/** This function gives the active values of each cell of a sweep, in the order of the dimensions. The last dimension changes first. */\nfunction* sweepOf(dimensions: readonly CorpusDimension[], levels: readonly (readonly ParamValue[] | undefined)[], i = 0, values: Record<string, ParamValue> = {}): Generator<Record<string, ParamValue>> {\n if (i === dimensions.length) {\n yield { ...values };\n return;\n }\n const d = dimensions[i]!;\n const lv = levels[i];\n if (lv === undefined || !paramActive(d, values)) {\n yield* sweepOf(dimensions, levels, i + 1, paramActive(d, values) ? { ...values, [d.name]: paramValue(d, d.default) } : values);\n return;\n }\n for (const v of lv) yield* sweepOf(dimensions, levels, i + 1, { ...values, [d.name]: paramValue(d, v) });\n}\n\n/** This function counts the cells of a sweep with no list of the cells. A dimension that a later `when` reads splits the count. */\nfunction countOf(dimensions: readonly CorpusDimension[], levels: readonly (readonly ParamValue[] | undefined)[], i = 0, values: Record<string, ParamValue> = {}): number {\n if (i === dimensions.length) return 1;\n const d = dimensions[i]!;\n if (!paramActive(d, values)) return countOf(dimensions, levels, i + 1, values);\n const lv = levels[i] ?? [d.default];\n const readLater = dimensions.slice(i + 1).some((q) => q.when?.param === d.name);\n if (!readLater) return lv.length * countOf(dimensions, levels, i + 1, values);\n let sum = 0;\n for (const v of lv) sum += countOf(dimensions, levels, i + 1, { ...values, [d.name]: paramValue(d, v) });\n return sum;\n}\n\n/** This function gives the levels of each dimension of a sweep. A dimension outside the sweep has `undefined`, so it keeps its default. */\nfunction sweepLevels(dimensions: readonly CorpusDimension[], options: CellsOptions, where: string, by: string): (readonly ParamValue[] | undefined)[] {\n const names = new Set(dimensions.map((d) => d.name));\n for (const name of [...(options.sweep ?? []), ...Object.keys(options.levels ?? {})]) if (!names.has(name)) throw new RangeError(`${where} has no dimension \"${name}\".`);\n return dimensions.map((d) => {\n if (options.sweep !== undefined && !options.sweep.includes(d.name)) return undefined;\n const lv = options.levels !== undefined && Object.hasOwn(options.levels, d.name) ? options.levels[d.name]! : levelsOf(d);\n for (const v of lv) {\n const bad = paramProblem(d, v);\n if (bad !== undefined) throw new RangeError(`${where}: a level of \"${d.name}\" is bad: ${bad}.`);\n if (!inSupported(d, paramValue(d, v))) throw new RangeError(`${where}: the level ${JSON.stringify(v)} of \"${d.name}\" is not supported by ${by}.`);\n }\n return lv;\n });\n}\n\n/** This function gives the output fields that the values make wrong: the `invalidates` of each dimension with a value other than its default, sorted. */\nfunction invalidFields(dimensions: readonly CorpusDimension[], full: DimensionValues): string[] {\n const out = new Set<string>();\n for (const d of dimensions) {\n if (d.invalidates === undefined || d.invalidates.length === 0) continue;\n if (full[d.name] !== paramValue(d, d.default)) for (const f of d.invalidates) out.add(f);\n }\n return [...out].sort(byCode);\n}\n\n/** This function compares two strings by their UTF-16 code units. */\nconst byCode = (x: string, y: string): number => (x < y ? -1 : x > y ? 1 : 0);\n\n/**\n * This function removes the fields of `fields` from an output, and adds their names to its field `invalidated`, sorted.\n * Only a field of the output counts. The `hash` of text gets the value of `hash` again. An output with none of the fields is the same object.\n */\nfunction dropFields<O>(output: O, fields: readonly string[], hash: (output: O) => string, where: string): O {\n if (fields.length === 0) return output;\n if (output === null || typeof output !== \"object\" || Array.isArray(output)) throw new RangeError(`${where} invalidates the fields ${fields.join(\", \")}, but its output is not an object.`);\n const o = output as Record<string, unknown>;\n const dropped = fields.filter((f) => Object.hasOwn(o, f));\n if (dropped.length === 0) return output;\n const before = o[INVALIDATED_FIELD];\n const prior = Array.isArray(before) ? before.filter((f): f is string => typeof f === \"string\") : [];\n const body: Record<string, unknown> = {};\n for (const key of Object.keys(o)) if (key !== \"hash\" && key !== INVALIDATED_FIELD && !dropped.includes(key)) body[key] = o[key];\n body[INVALIDATED_FIELD] = [...new Set([...prior, ...dropped])].sort(byCode);\n if (typeof o[\"hash\"] !== \"string\") return (Object.hasOwn(o, \"hash\") ? { ...body, hash: o[\"hash\"] } : body) as O;\n return { ...body, hash: hash(body as O) } as O;\n}\n\n/** This function gives the values that make a dimension active: the first value of its `when`, and the values that make that dimension active. */\nfunction activation(dimensions: readonly CorpusDimension[], dim: CorpusDimension): Record<string, ParamValue> {\n const out: Record<string, ParamValue> = {};\n let d: CorpusDimension | undefined = dim;\n while (d?.when !== undefined) {\n const param: string = d.when.param;\n out[param] = d.when.in[0]!;\n d = dimensions.find((q) => q.name === param);\n }\n return out;\n}\n\n/** This function throws a `RangeError` when a seed is not a whole number of 0 or more. */\nfunction checkSeed(seed: number): void {\n if (!Number.isSafeInteger(seed) || seed < 0) throw new RangeError(`The seed is a whole number of 0 or more, not ${seed}.`);\n}\n\n/** This function gives a new registry with the families of the list. Each engine gives the list of its families. An import registers nothing. */\nexport function createFamilyRegistry<O = LayoutInput>(families: Iterable<CorpusFamily<O>> = []): FamilyRegistry<O> {\n const list: CorpusFamily<O>[] = [];\n const label = (f: CorpusFamily<O>): string => `The family \"${f.name}\" version ${f.version}`;\n const find = (name: string, version?: number): CorpusFamily<O> => {\n const named = list.filter((f) => f.name === name);\n if (named.length === 0) throw new RangeError(`The registry has no family \"${name}\".`);\n if (version === undefined) return named[0]!;\n const found = named.find((f) => f.version === version);\n if (found === undefined) throw new RangeError(`The family \"${name}\" has the versions ${named.map((f) => f.version).join(\", \")}, not ${version}.`);\n return found;\n };\n /** This function removes the `kind` of a cell of `cellOf` when it is the `familyKind` of `f`. It throws a `RangeError` for another kind. */\n const ownDims = (f: CorpusFamily<O>, dims: Readonly<Record<string, ParamValue>> | undefined): Readonly<Record<string, ParamValue>> | undefined => {\n if (dims === undefined || !Object.hasOwn(dims, \"kind\")) return dims;\n const kind = familyKind(f.name, f.version);\n if (dims[\"kind\"] !== kind) throw new RangeError(`${label(f)} has the kind \"${kind}\", not the kind ${JSON.stringify(dims[\"kind\"])} of the cell.`);\n const { kind: _kind, ...rest } = dims;\n return rest;\n };\n /** This function gives the full dimension values of an input of `f`. A message names the family as `familyKind` gives it. */\n const resolveIn = (f: CorpusFamily<O>, dims: Readonly<Record<string, ParamValue>> | undefined): DimensionValues =>\n resolveDimensions(f.dimensions, dims, label(f), familyKind(f.name, f.version));\n const streamOf = (f: CorpusFamily<O>, seed: number, full: DimensionValues): { readonly rng: RngFactory; readonly random: () => number } => {\n const rng = f.rng ?? DEFAULT_RNG;\n return { rng, random: rng(f.rngSeed === undefined ? seed : f.rngSeed(seed, full)) };\n };\n const registry: FamilyRegistry<O> = {\n register(family) {\n if (!Number.isInteger(family.version) || family.version < 1) throw new RangeError(`${label(family)} has a version that is not a whole number of 1 or more.`);\n if (list.some((f) => f.name === family.name && f.version === family.version)) throw new RangeError(`${label(family)} is in the registry already.`);\n const problems = dimensionProblems(family.dimensions);\n const names = family.dimensions.map((d) => d.name);\n if (names.includes(\"kind\")) problems.push('the dimension name \"kind\" is reserved: the cell of `cellOf` has the `familyKind` of the family in `kind`');\n for (const key of family.familyBy ?? []) {\n const d = family.dimensions.find((q) => q.name === key);\n if (d === undefined) problems.push(`the familyBy dimension \"${key}\" is not a dimension of the family`);\n else if (d.when !== undefined) problems.push(`the familyBy dimension \"${key}\" has a when, so a cell without it has no family key`);\n }\n if (problems.length > 0) throw new RangeError(`${label(family)} is not good: ${problems.join(\"; \")}.`);\n list.push(family);\n return registry;\n },\n family: find,\n families: () => [...list],\n resolve(name, dims, version) {\n const f = find(name, version);\n return resolveIn(f, ownDims(f, dims));\n },\n generate(name, seed, dims, options = {}) {\n checkSeed(seed);\n const f = find(name, options.version);\n const full = resolveIn(f, ownDims(f, dims));\n const context: GenerateContext = { ...streamOf(f, seed, full), ...(options.set === undefined ? {} : { set: options.set }) };\n const output = f.generate(seed, full, context);\n const hash = (f.hash ?? documentHash) as (o: O) => string;\n return dropFields(output, invalidFields(f.dimensions, full), hash, label(f));\n },\n cellOf(name, dims, version) {\n const f = find(name, version);\n return { kind: familyKind(f.name, f.version), ...activeValues(f.dimensions, resolveIn(f, ownDims(f, dims))) };\n },\n *cells(name, options = {}) {\n const f = find(name, options.version);\n for (const values of sweepOf(f.dimensions, sweepLevels(f.dimensions, options, label(f), familyKind(f.name, f.version)))) yield resolveIn(f, values);\n },\n cellCount(name, options = {}) {\n const f = find(name, options.version);\n return countOf(f.dimensions, sweepLevels(f.dimensions, options, label(f), familyKind(f.name, f.version)));\n },\n boundaryCells(name, version) {\n const f = find(name, version);\n const base = resolveIn(f, {});\n const out: DimensionValues[] = [base];\n const seen = new Set([JSON.stringify(base)]);\n for (const d of f.dimensions) {\n if (d.kind !== \"int\" && d.kind !== \"real\") continue;\n const span = supportedSpan(d);\n for (const end of [span.min, span.max]) {\n if (end === undefined) continue;\n const cell = resolveIn(f, { ...activation(f.dimensions, d), [d.name]: end });\n const key = JSON.stringify(cell);\n if (!seen.has(key)) {\n seen.add(key);\n out.push(cell);\n }\n }\n }\n return out;\n },\n rngOf(name, version) {\n const f = find(name, version);\n return (seed, dims) => {\n checkSeed(seed);\n return streamOf(f, seed, resolveIn(f, ownDims(f, dims))).random;\n };\n },\n familyBy() {\n const out: Record<string, readonly string[]> = {};\n for (const f of list) out[familyKind(f.name, f.version)] = [...(f.familyBy ?? [])];\n return out;\n },\n };\n for (const f of families) registry.register(f);\n return registry;\n}\n\n/** A step of a composed family: a pure function that changes an input after its base family, as `edgeStep` does. */\nexport interface CorpusStep {\n readonly name: string;\n readonly version: number;\n /** The engine that owns the definition of the step. */\n readonly owner: string;\n readonly meaning: string;\n /** The dimensions of the step. Their names are not names of the dimensions of the base family. */\n readonly dimensions: readonly CorpusDimension[];\n /** The text of the rule that gives the random numbers of the step from the seed. */\n readonly seeding: string;\n readonly crossEngine: CrossEngine;\n /** This function gives the part of the family of the input that tells the values of the step. Without it, the family does not change. */\n readonly familyPart?: (dims: DimensionValues) => string;\n /** This function gives the changed input. It removes the old `hash` of the input. */\n apply(input: LayoutInput, seed: number, dims: DimensionValues): LayoutInput;\n}\n\n/** The options of `composeFamily`. */\nexport interface ComposeOptions {\n /** The default is the name of the base family and the names of the steps, with `+` between them. */\n readonly name?: string;\n /** The default is the owner of the base family. */\n readonly owner?: string;\n readonly meaning?: string;\n /** The hash of the composed input. The default is `documentHash` of `hash.ts`. The composed family also gives it to the registry in `hash`. */\n readonly hash?: (input: LayoutInput) => string;\n}\n\n/** This function gives the values of a list of dimensions from the full values. */\nconst pick = (dims: readonly CorpusDimension[], full: DimensionValues): DimensionValues => Object.fromEntries(dims.map((d) => [d.name, full[d.name]!]));\n\n/**\n * This function gives a family that runs the base family and then each step, with the same seed.\n * The family of the input gets the part of each step after a dot. The id becomes `<set>/<family>/s<seed>`, and the input gets the hash of `options.hash`.\n * The function throws a `RangeError` when a step has a dimension with the name of an earlier dimension.\n */\nexport function composeFamily(base: CorpusFamily<LayoutInput>, steps: readonly CorpusStep[], options: ComposeOptions = {}): CorpusFamily<LayoutInput> {\n const dimensions = [...base.dimensions, ...steps.flatMap((s) => s.dimensions)];\n const seen = new Set<string>();\n for (const d of dimensions) {\n if (seen.has(d.name)) throw new RangeError(`composeFamily: the dimension \"${d.name}\" is in the base family or in an earlier step already.`);\n seen.add(d.name);\n }\n const hash = options.hash ?? documentHash;\n const libm = base.crossEngine === \"libm-dependent\" || steps.some((s) => s.crossEngine === \"libm-dependent\");\n return Object.freeze({\n name: options.name ?? [base.name, ...steps.map((s) => s.name)].join(\"+\"),\n version: base.version,\n owner: options.owner ?? base.owner,\n meaning: options.meaning ?? `${base.meaning} Then the steps ${steps.map((s) => s.name).join(\", \")}.`,\n dimensions,\n seeding: [base.seeding, ...steps.map((s) => `${s.name}: ${s.seeding}`)].join(\" \"),\n crossEngine: libm ? \"libm-dependent\" : \"exact\",\n ...(base.rng === undefined ? {} : { rng: base.rng }),\n ...(base.rngSeed === undefined ? {} : { rngSeed: (seed: number, full: DimensionValues) => base.rngSeed!(seed, pick(base.dimensions, full)) }),\n ...(base.familyBy === undefined ? {} : { familyBy: base.familyBy }),\n ...(options.hash === undefined ? {} : { hash: options.hash }),\n generate(seed: number, full: DimensionValues, context: GenerateContext): LayoutInput {\n let input = base.generate(seed, pick(base.dimensions, full), context);\n const parts: string[] = [];\n for (const step of steps) {\n const values = pick(step.dimensions, full);\n input = step.apply(input, seed, values);\n if (step.familyPart !== undefined) parts.push(step.familyPart(values));\n }\n const family = [input.family ?? base.name, ...parts].join(\".\");\n const set = input.set ?? context.set;\n const id = `${set === undefined ? \"\" : `${set}/`}${family}/s${seed}`;\n const stepped: LayoutInput = { ...input, id, family };\n return { ...stepped, hash: hash(stepped) };\n },\n });\n}\n\n/** The dimensions of `EDGES_STEP`: the parameters of `edgeStep`, from the shared table. */\nconst EDGE_DIMENSIONS: readonly CorpusDimension[] = Object.freeze([\"edgeDensity\", \"edgeShape\", \"groups\", \"ports\", \"hubBy\"].map((n) => CORPUS_DIMENSIONS[n]!));\n\n/** This function gives the parameters of `edgeStep` from the values of the dimensions. It throws a `RangeError` for a missing or a bad value. */\nfunction edgeParams(d: DimensionValues): EdgeStepParams {\n const text = (name: string): string => {\n const dim = EDGE_DIMENSIONS.find((q) => q.name === name)!;\n const value = Object.hasOwn(d, name) ? d[name] : undefined;\n const bad = value === undefined ? \"the value is missing\" : paramProblem(dim, value);\n if (bad !== undefined || typeof value !== \"string\") throw new RangeError(`EDGES_STEP: the dimension \"${name}\" is bad: ${bad ?? \"it is not text\"}.`);\n return value;\n };\n return {\n edgeDensity: text(\"edgeDensity\") as EdgeStepParams[\"edgeDensity\"],\n edgeShape: text(\"edgeShape\") as EdgeStepParams[\"edgeShape\"],\n groups: text(\"groups\") as NonNullable<EdgeStepParams[\"groups\"]>,\n ports: text(\"ports\") as NonNullable<EdgeStepParams[\"ports\"]>,\n hubBy: text(\"hubBy\") as NonNullable<EdgeStepParams[\"hubBy\"]>,\n };\n}\n\n/**\n * The step `edges` of `edgeStep` (version 1), as a corpus step. Its family part is `e-<edgeDensity>.<edgeShape>.<groups>.<ports>`.\n * The value `random` of `hubBy` adds the part `.hub-random`.\n */\nexport const EDGES_STEP: CorpusStep = Object.freeze({\n name: \"edges\",\n version: 1,\n owner: \"layout-contract\",\n meaning: \"The edges, the groups and the ports of an input, from its topology alone.\",\n dimensions: EDGE_DIMENSIONS,\n seeding: \"stepRandom(seed, step) for the steps edges and ports.\",\n crossEngine: \"libm-dependent\",\n familyPart: (d: DimensionValues) => `e-${d[\"edgeDensity\"]}.${d[\"edgeShape\"]}.${d[\"groups\"]}.${d[\"ports\"]}${d[\"hubBy\"] === \"random\" ? \".hub-random\" : \"\"}`,\n apply: (input: LayoutInput, seed: number, d: DimensionValues) => edgeStep(input, edgeParams(d), seed),\n});\n\n/** The set of `RECT_SCATTERED` when the caller gives no set. */\nconst XCHECK_SET = \"xcheck-v1\";\n\n/**\n * The shared family `rect-scattered`, version 1: a fixed rectangle container, rectangle obstacles at random places and boxes without positions.\n * It is the one copy of the generator of `docs/FORMAT.md` of `packing`. Its input is the input of `packing`, byte for byte.\n * The steps `container`, `obstacles` and `boxes` each have a stream of `stepRandom`. Each value is a whole number, so the family is `exact`.\n */\nexport const RECT_SCATTERED: CorpusFamily<LayoutInput> = Object.freeze({\n name: \"rect-scattered\",\n version: 1,\n owner: \"layout-contract\",\n meaning: \"Rectangle obstacles at random places in a fixed rectangle container, and boxes of random sizes.\",\n dimensions: Object.freeze([sharedDimension(\"count\", { default: 40 })]),\n seeding: \"stepRandom(seed, container) gives w and h. stepRandom(seed, obstacles) gives n, then ow, oh, x and y of each obstacle. stepRandom(seed, boxes) gives bw and bh of each box.\",\n crossEngine: \"exact\",\n generate(seed: number, dims: DimensionValues, context: GenerateContext): LayoutInput {\n const count = dims[\"count\"];\n if (typeof count !== \"number\" || !Number.isInteger(count) || count < 0) throw new RangeError(`rect-scattered: the count is a whole number of 0 or more, not ${String(count)}.`);\n const set = context.set ?? XCHECK_SET;\n let r = stepRandom(seed, \"container\");\n const w = randomInt(r, 600, 1000);\n const h = randomInt(r, 400, 800);\n r = stepRandom(seed, \"obstacles\");\n const n = randomInt(r, 3, 8);\n const obstacles: Obstacle[] = [];\n for (let i = 0; i < n; i++) {\n const ow = randomInt(r, 40, 160);\n const oh = randomInt(r, 40, 160);\n const x = randomInt(r, 0, w - ow);\n const y = randomInt(r, 0, h - oh);\n obstacles.push({ id: `o${i}`, region: { kind: \"rect\", x, y, w: ow, h: oh } });\n }\n r = stepRandom(seed, \"boxes\");\n const boxes = Array.from({ length: count }, (_, i) => {\n const bw = randomInt(r, 20, 120);\n const bh = randomInt(r, 20, 80);\n return { id: `b${i}`, w: bw, h: bh };\n });\n const body: LayoutInput = {\n schema: \"layout-input/1\",\n id: `${set}/rect-scattered/s${seed}`,\n set,\n family: \"rect-scattered\",\n seed,\n source: \"made-up\",\n generator: { name: \"rect-scattered\", version: 1, params: { count }, seed },\n container: { w, h, fixed: \"size\" },\n obstacles,\n boxes,\n edges: [],\n };\n return { ...body, hash: documentHash(body) };\n },\n});\n"],"mappings":";;AAIA,MAAa,QAAyB;CAAC;CAAO;CAAS;CAAU;AAAM;;AAyCvE,SAAgB,YAAY,QAAmC;CAC7D,IAAI,WAAW,KAAA,GAAW,OAAO;EAAE,KAAK;EAAG,OAAO;EAAG,QAAQ;EAAG,MAAM;CAAE;CACxE,IAAI,OAAO,WAAW,UAAU,OAAO;EAAE,KAAK;EAAQ,OAAO;EAAQ,QAAQ;EAAQ,MAAM;CAAO;CAClG,OAAO;AACT;;AAGA,SAAgB,KAAK,MAAY,QAAkC;CACjE,MAAM,IAAI,YAAY,MAAM;CAC5B,OAAO;EAAE,GAAG,KAAK,IAAI,EAAE;EAAM,GAAG,KAAK,IAAI,EAAE;EAAK,GAAG,KAAK,IAAI,EAAE,OAAO,EAAE;EAAO,GAAG,KAAK,IAAI,EAAE,MAAM,EAAE;CAAO;AAC7G;;AAGA,SAAgB,SAAS,QAAsB;CAC7C,QAAQ,OAAO,MAAf;EACE,KAAK,QACH,OAAO;GAAE,GAAG,OAAO;GAAG,GAAG,OAAO;GAAG,GAAG,OAAO;GAAG,GAAG,OAAO;EAAE;EAC9D,KAAK,UACH,OAAO;GAAE,GAAG,OAAO,KAAK,OAAO;GAAG,GAAG,OAAO,KAAK,OAAO;GAAG,GAAG,IAAI,OAAO;GAAG,GAAG,IAAI,OAAO;EAAE;EAC9F,KAAK,WACH,OAAO;GAAE,GAAG,OAAO,KAAK,OAAO;GAAI,GAAG,OAAO,KAAK,OAAO;GAAI,GAAG,IAAI,OAAO;GAAI,GAAG,IAAI,OAAO;EAAG;EAClG,KAAK,WAAW;GACd,IAAI,KAAK;GACT,IAAI,KAAK;GACT,IAAI,KAAK;GACT,IAAI,KAAK;GACT,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ;IAClC,KAAK,KAAK,IAAI,IAAI,CAAC;IACnB,KAAK,KAAK,IAAI,IAAI,CAAC;IACnB,KAAK,KAAK,IAAI,IAAI,CAAC;IACnB,KAAK,KAAK,IAAI,IAAI,CAAC;GACrB;GACA,OAAO;IAAE,GAAG;IAAI,GAAG;IAAI,GAAG,KAAK;IAAI,GAAG,KAAK;GAAG;EAChD;CACF;AACF;;AAGA,SAAgB,UAAU,QAAgB,IAAY,IAAoB;CACxE,QAAQ,OAAO,MAAf;EACE,KAAK,QACH,OAAO;GAAE,GAAG;GAAQ,GAAG,OAAO,IAAI;GAAI,GAAG,OAAO,IAAI;EAAG;EACzD,KAAK;EACL,KAAK,WACH,OAAO;GAAE,GAAG;GAAQ,IAAI,OAAO,KAAK;GAAI,IAAI,OAAO,KAAK;EAAG;EAC7D,KAAK,WAAW;GACd,MAAM,QAAQ,SAAqE,KAAK,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;GACxH,OAAO,OAAO,UAAU,KAAA,IACpB;IAAE,MAAM;IAAW,QAAQ,KAAK,OAAO,MAAM;GAAE,IAC/C;IAAE,MAAM;IAAW,QAAQ,KAAK,OAAO,MAAM;IAAG,OAAO,OAAO,MAAM,IAAI,IAAI;GAAE;EACpF;CACF;AACF;;;;;AAMA,SAAgB,UAAU,GAAS,GAAqD;CACtF,OAAO;EACL,GAAG,KAAK,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;EACrD,GAAG,KAAK,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;CACvD;AACF;;;AC1EA,MAAa,cAAwC,OAAO,OAAO;CACjE;EAAE,IAAI;EAAQ,QAAQ,CAAC,KAAK,GAAG;EAAG,SAAS,CAAC,MAAM;EAAG,UAAU;GAAE,QAAQ;GAAM,MAAM;GAAM,UAAU;GAAM,SAAS;EAAK;CAAE;CAC3H;EAAE,IAAI;EAAW,QAAQ,CAAC,UAAU,QAAQ;EAAG,SAAS,CAAC,SAAS;EAAG,UAAU;GAAE,QAAQ;GAAM,MAAM;GAAO,UAAU;GAAO,SAAS;EAAM;CAAE;CAC9I;EAAE,IAAI;EAAU,QAAQ;GAAC;GAAM;GAAM;EAAG;EAAG,SAAS,CAAC,QAAQ;EAAG,UAAU;GAAE,QAAQ;GAAM,MAAM;GAAO,UAAU;GAAO,SAAS;EAAM;CAAE;CACzI;EAAE,IAAI;EAAQ,QAAQ;GAAC;GAAK;GAAK;EAAQ;EAAG,SAAS;GAAC;GAAQ;GAAW;GAAU;EAAS;EAAG,UAAU;GAAE,QAAQ;GAAM,MAAM;GAAO,UAAU;GAAO,SAAS;EAAM;CAAE;AAC1K,CAAU;;AAGV,MAAa,iBAAuC,OAAO,OAAO,YAAY,KAAK,MAAM,EAAE,EAAE,CAAC;;AAG9F,MAAa,iBAAuC,OAAO,OAAO,CAAC,MAAM,CAAU;AAQnF,MAAM,cAA2D;CAAE,MAAM;CAAQ,SAAS;CAAW,QAAQ;CAAU,SAAS;AAAO;;AAGvI,SAAgB,YAAY,OAAoC;CAC9D,OAAO,OAAO,UAAU,YAAa,eAAqC,SAAS,KAAK;AAC1F;;;;;AAMA,SAAgB,YAAY,KAA2B;CACrD,IAAI,IAAI,cAAc,KAAA,GAAW,OAAO,IAAI;CAC5C,OAAO,IAAI,UAAU,KAAA,IAAY,SAAS,YAAY,IAAI,MAAM;AAClE;;AAGA,SAAgB,aAAa,OAAgD;CAC3E,MAAM,OAAO,IAAI,IAAI,MAAM,MAAM,IAAI,WAAW,CAAC;CACjD,OAAO,eAAe,QAAQ,MAAM,KAAK,IAAI,CAAC,CAAC;AACjD;;AAGA,SAAgB,YAAY,OAAwD;CAClF,MAAM,QAAQ,aAAa,KAAK;CAChC,OAAO,MAAM,WAAW,IAAI,SAAS,MAAM,WAAW,IAAI,MAAM,KAAM;AACxE;;AAGA,SAAgB,iBAAiB,KAAoC;CACnE,MAAM,IAAa,IAAI;CACvB,IAAI,MAAM,KAAA,GAAW,OAAO,KAAA;CAC5B,MAAM,OAAO,YAAY,MAAM,MAAM,EAAE,OAAO,CAAC;CAC/C,IAAI,SAAS,KAAA,GAAW,OAAO,OAAO,IAAI,GAAG,mBAAmB,OAAO,CAAC,EAAE;CAC1E,IAAI,IAAI,UAAU,KAAA,GAAW,OAAO,MAAM,UAAU,MAAM,SAAS,KAAA,IAAY,OAAO,IAAI,GAAG,mBAAmB,EAAE;CAClH,IAAI,CAAC,KAAK,QAAQ,SAAS,IAAI,MAAM,IAAI,GAAG,OAAO,OAAO,IAAI,GAAG,mBAAmB,EAAE,2CAA2C,IAAI,MAAM;AAE7I;;AAGA,SAAgB,SAAS,KAAyD;CAChF,OAAO,IAAI,UAAU;AACvB;;;;;AAMA,SAAgB,YAAY,OAA0C,MAA6C;CACjH,MAAM,QAAQ,aAAa,KAAK;CAChC,MAAM,MAAoB,CAAC;CAC3B,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,SAAS,SAAS,GAAG;EAC3B,KAAK,MAAM,QAAQ,OAAO;GACxB,IAAI,OAAO,SAAS,IAAI,GAAG;GAC3B,MAAM,MAAM,MAAM,MAAM,QAAQ,MAAM,YAAY,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,MAAM,EAAE,EAAE;GAC9E,MAAM,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS,EAAE,SAAS;GAC9F,IAAI,KAAK;IACP,OAAO;IACP,QAAQ,GAAG,IAAI,GAAG,iCAAiC,OAAO,KAAK,IAAI,KAAK,SAAS,kBAAkB,MAAM,GAAG,OAAO,KAAK,UAAU;IAClI,QAAQ,CAAC,MAAM,EAAE;GACnB,CAAC;EACH;CACF;CACA,OAAO;AACT;;;ACrHA,MAAa,MAAM;;;;;AAMnB,MAAa,eAAe;;;;;AAM5B,MAAa,aAAa;;;;;AAiB1B,MAAa,oBAA+B,OAAO,OAAO;CAAE,SAAS;CAAO,SAAS;AAAI,CAAC;;;;;;;ACH1F,SAAgB,UAAU,KAAiC,MAA+B;CACxF,IAAI,KAAK,MAAM,KAAA,KAAa,KAAK,MAAM,KAAA,GAAW,OAAO;EAAE,GAAG,KAAK;EAAG,GAAG,KAAK;CAAE;CAChF,IAAI,KAAK,SAAS,KAAA,KAAa,KAAK,UAAU,KAAA,GAAW,OAAO,KAAA;CAChE,QAAQ,KAAK,MAAb;EACE,KAAK,OACH,OAAO;GAAE,GAAG,KAAK,QAAQ,IAAI;GAAG,GAAG;EAAE;EACvC,KAAK,UACH,OAAO;GAAE,GAAG,KAAK,QAAQ,IAAI;GAAG,GAAG,IAAI;EAAE;EAC3C,KAAK,QACH,OAAO;GAAE,GAAG;GAAG,GAAG,KAAK,QAAQ,IAAI;EAAE;EACvC,KAAK,SACH,OAAO;GAAE,GAAG,IAAI;GAAG,GAAG,KAAK,QAAQ,IAAI;EAAE;CAC7C;AACF;;AA0JA,SAAgB,YAAY,OAA+B;CACzD,OAAO;EACL,WAAW,MAAM,aAAa,EAAE,OAAO,OAAO;EAC9C,OAAO,MAAM;EACb,GAAI,MAAM,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW,MAAM,UAAU;EACtE,GAAI,MAAM,QAAQ,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK,MAAM,IAAI;EACpD,GAAI,MAAM,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;CACrE;AACF;;AAGA,MAAMA,YAAU,GAAW,MAAuB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;;;;;;AAO3E,SAAgB,eAAsC,OAAa;CACjE,IAAI,CAAC,MAAM,QAAQ,MAAM,QAAQ,GAAG,OAAO;CAC3C,MAAM,WAAW,MAAM,SACpB,KAAK,MAAgBA,SAAO,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI;EAAE,GAAG;EAAG,GAAG,EAAE;EAAG,GAAG,EAAE;CAAE,IAAI,CAAE,CAAC,CAC1E,MAAM,GAAG,MAAMA,SAAO,EAAE,GAAG,EAAE,CAAC,KAAKA,SAAO,EAAE,GAAG,EAAE,CAAC,CAAC;CACtD,OAAO;EAAE,GAAG;EAAO;CAAS;AAC9B;;;AC/MA,SAAgB,SAAS,MAAkB;CACzC,OAAO,OAAO,MAAM,QAAQ,IAAI,IAAI,KAAK;AAC3C;;AAGA,SAAgB,UAAU,GAAW,GAAW,GAA6B;CAC3E,OAAO,CAAC,IAAI,GAAG,CAAC;AAClB;;;;;;AAOA,SAAgB,SAAS,MAAY,GAAiB;CACpD,MAAM,EAAE,MAAM,GAAG,GAAG,OAAO,GAAG,SAAS;CACvC,MAAM,QAAQ,SAAS,UAAU,SAAS;CAC1C,OAAO;EACL,GAAG;EACH,GAAI,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,SAAS,IAAI,EAAE;EACrD,GAAI,MAAM,KAAA,IAAY,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE;EACtC,GAAI,MAAM,KAAA,IAAY,CAAC,IAAI,EAAE,GAAG,EAAE;EAClC,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,IAAI,QAAQ,MAAM;CACpE;AACF;;AAGA,SAAgB,WAAW,QAAwB;CACjD,IAAI,OAAO,WAAW,UAAU,OAAO;CACvC,MAAM,IAAI,YAAY,MAAM;CAC5B,OAAO;EAAE,KAAK,EAAE;EAAM,OAAO,EAAE;EAAK,QAAQ,EAAE;EAAO,MAAM,EAAE;CAAO;AACtE;;AAGA,SAAgB,WAAW,QAAgB,GAAmB;CAC5D,QAAQ,OAAO,MAAf;EACE,KAAK,QACH,OAAO;GAAE,MAAM;GAAQ,GAAG,IAAI,OAAO,IAAI,OAAO;GAAG,GAAG,OAAO;GAAG,GAAG,OAAO;GAAG,GAAG,OAAO;EAAE;EAC3F,KAAK,UACH,OAAO;GAAE,GAAG;GAAQ,IAAI,IAAI,OAAO;GAAI,IAAI,OAAO;EAAG;EACvD,KAAK,WACH,OAAO;GAAE,MAAM;GAAW,IAAI,IAAI,OAAO;GAAI,IAAI,OAAO;GAAI,IAAI,OAAO;GAAI,IAAI,OAAO;EAAG;EAC3F,KAAK,WAAW;GACd,MAAM,QAAQ,SAAqE,KAAK,KAAK,CAAC,GAAG,OAAO,UAAU,GAAG,GAAG,CAAC,CAAC;GAC1H,OAAO,OAAO,UAAU,KAAA,IACpB;IAAE,MAAM;IAAW,QAAQ,KAAK,OAAO,MAAM;GAAE,IAC/C;IAAE,MAAM;IAAW,QAAQ,KAAK,OAAO,MAAM;IAAG,OAAO,OAAO,MAAM,IAAI,IAAI;GAAE;EACpF;CACF;AACF;;AAGA,SAAgB,QAAQ,KAA2B;CACjD,OAAO;EACL,GAAG;EACH,GAAG,IAAI;EACP,GAAG,IAAI;EACP,GAAI,IAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM,KAAK,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,EAAE;EACrF,GAAI,IAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,WAAW,IAAI,MAAM,EAAE;EACrE,GAAI,IAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,WAAW,IAAI,OAAO,IAAI,CAAC,EAAE;CAC3E;AACF;;;;;;;ACpCA,SAAgB,UAAU,OAAoB,QAAiC;CAC7E,MAAM,KAAK,IAAI,IAAI,OAAO,WAAW,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;CAC1D,MAAM,QAAQ,IAAI,IAAI,OAAO,MAAM,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;CACxD,MAAM,QAAQ,MAAM,MAAM,KAAK,QAAQ;EACrC,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE;EACvB,IAAI,MAAM,KAAA,GAAW,OAAO;EAE5B,OAAO;GAAE,GADM,EAAE,SAAS,KAAK,QAAQ,GAAG,IAAI;GAC1B,GAAG,EAAE;GAAG,GAAG,EAAE;EAAE;CACrC,CAAC;CACD,MAAM,YAAY,MAAM,WAAW,KAAK,MAAM;EAC5C,MAAM,IAAI,MAAM,IAAI,EAAE,EAAE;EACxB,IAAI,MAAM,KAAA,GAAW,OAAO;EAC5B,MAAM,IAAI,SAAS,EAAE,MAAM;EAC3B,OAAO;GAAE,GAAG;GAAG,QAAQ,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;EAAE;CACnE,CAAC;CACD,OAAO;EACL,GAAG;EACH,WAAW;GAAE,GAAI,MAAM,aAAa,EAAE,OAAO,OAAO;GAAI,GAAG,OAAO,KAAK;GAAG,GAAG,OAAO,KAAK;EAAE;EAC3F;EACA,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU;CACjD;AACF;;;;;;ACqBA,SAAgB,eAAe,OAAoB,KAA6B;CAC9E,MAAM,SAAS,aAAa,KAAK;CACjC,MAAM,WAAW,OAAO,WAAW,KAAM,OAAO,WAAW,KAAK,OAAO,OAAO;CAC9E,OAAO;EACL,QAAQ;EACR,GAAG;EACH,OAAO,MAAM;EACb,WAAW,MAAM,QAAQ;EACzB,KAAK,MAAM,OAAO;EAClB,OAAO,MAAM,MAAM;EACnB,OAAO,MAAM,OAAO,UAAU;EAC9B,GAAI,WAAW,CAAC,IAAI,EAAE,OAAO;CAC/B;AACF;;;ACpFA,SAAgB,WAAW,KAAkC;CAC3D,IAAI,IAAI,MAAM,KAAA,KAAa,IAAI,MAAM,KAAA,GAAW,OAAO,KAAA;CACvD,IAAI,IAAI,UAAU,KAAA,GAAW,OAAO;EAAE,GAAG,IAAI;EAAG,GAAG,IAAI;EAAG,GAAG,IAAI;EAAG,GAAG,IAAI;CAAE;CAC7E,MAAM,IAAI,SAAS,IAAI,KAAK;CAC5B,OAAO;EAAE,GAAG,IAAI,IAAI,EAAE;EAAG,GAAG,IAAI,IAAI,EAAE;EAAG,GAAG,EAAE;EAAG,GAAG,EAAE;CAAE;AAC1D;;;;;;;;AASA,SAAgB,cAAc,OAA6B,YAAoB,kBAAkB,SAAS,UAAuC;CAC/I,IAAI,aAAa,KAAA,KAAa,SAAS,WAAW,GAAG,OAAO,eAAe,OAAO,WAAW,KAAA,CAAS;CACtG,MAAM,uBAAO,IAAI,IAAoB;CACrC,KAAK,MAAM,KAAK,UAAU;EACxB,MAAM,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC;EAC5B,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,KAAK,EAAE,GAAG;CACxD;CACA,MAAM,sBAAM,IAAI,IAAkB;CAClC,KAAK,MAAM,OAAO,OAAO;EACvB,MAAM,IAAI,WAAW,GAAG;EACxB,IAAI,MAAM,KAAA,KAAa,CAAC,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC;CAC5D;CACA,IAAI,QAAQ,eAAe,OAAO,WAAW,IAAI;CACjD,KAAK,MAAM,CAAC,KAAK,QAAQ,MAAM;EAC7B,MAAM,CAAC,GAAG,KAAK,KAAK,MAAM,GAAG;EAC7B,MAAM,KAAK,IAAI,IAAI,CAAC;EACpB,MAAM,KAAK,IAAI,IAAI,CAAC;EACpB,IAAI,OAAO,KAAA,KAAa,OAAO,KAAA,GAAW;EAC1C,MAAM,IAAI,UAAU,KAAK,IAAI,GAAG,GAAG,EAAE;EACrC,IAAI,EAAE,IAAI,aAAa,EAAE,IAAI,WAAW;CAC1C;CACA,OAAO;AACT;;AAGA,MAAM,WAAW,GAAW,MAAsB,KAAK,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;AAGxF,SAAS,eAAe,OAA6B,WAAmB,MAAuD;CAC7H,MAAM,QAAqD,CAAC;CAC5D,KAAK,MAAM,OAAO,OAAO;EACvB,MAAM,IAAI,WAAW,GAAG;EACxB,IAAI,MAAM,KAAA,GAAW,MAAM,KAAK;GAAE,IAAI,IAAI;GAAI,GAAG,KAAK,GAAG,IAAI,MAAM;EAAE,CAAC;CACxE;CACA,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;CAClC,IAAI,QAAQ;CACZ,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,IAAI,MAAM,EAAE,CAAE;EACpB,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;GACzC,MAAM,IAAI,MAAM,EAAE,CAAE;GACpB,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,WAAW;GAClC,IAAI,SAAS,KAAA,KAAa,KAAK,IAAI,QAAQ,MAAM,EAAE,CAAE,IAAI,MAAM,EAAE,CAAE,EAAE,CAAC,GAAG;GACzE,MAAM,IAAI,UAAU,GAAG,CAAC;GACxB,IAAI,EAAE,IAAI,aAAa,EAAE,IAAI,WAAW;EAC1C;CACF;CACA,OAAO;AACT;;;;;;;;;AAmBA,SAAgB,aAAa,OAAoB,YAAoB,kBAAkB,SAAS,UAAyB,CAAC,GAAW;CACnI,MAAM,IAAI,MAAM;CAChB,IAAI,MAAM,KAAA,GAAW,OAAO;CAC5B,MAAM,QAAQ,QAAQ,mBAAmB,QAAQ,EAAE,UAAU,SAAS,EAAE,QAAQ,KAAA;CAChF,MAAM,OAAO,EAAE,UAAU,KAAA,IAAY;EAAE,GAAG;EAAG,GAAG;EAAG,GAAG,EAAE,KAAK;EAAU,GAAG,EAAE,KAAK;CAAS,IAAI,SAAS,EAAE,KAAK;CAC9G,MAAM,QAAQ,EAAE,SAAS;CACzB,MAAM,OAAO,EAAE,UAAU,UAAU,EAAE,UAAU;CAC/C,MAAM,OAAO,EAAE,UAAU,UAAU,EAAE,UAAU;CAC/C,IAAI,QAAQ;CACZ,KAAK,MAAM,OAAO,MAAM,OAAO;EAC7B,MAAM,KAAK,WAAW,GAAG;EACzB,IAAI,OAAO,KAAA,GAAW;EACtB,MAAM,IAAI,KAAK,IAAI,IAAI,MAAM;EAC7B,MAAM,OAAO,EAAE,IAAI,KAAK,IAAI,QAAQ,aAAa,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK,IAAI,QAAQ;EACvF,MAAM,OAAO,EAAE,IAAI,KAAK,IAAI,QAAQ,aAAa,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK,IAAI,QAAQ;EACvF,IAAK,QAAQ,QAAU,QAAQ,MAAO;OACjC,IAAI,UAAU,KAAA,KAAa,CAAC,aAAa,OAAO,OAAO,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC,GAAG;CAC3F;CACA,OAAO;AACT;;AAGA,SAAgB,oBAAoB,OAA6B,MAAc,YAAoB;CACjG,IAAI,QAAQ;CACZ,KAAK,MAAM,OAAO,OAChB,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,GAAG;EAC/B,IAAI,EAAE,MAAM,KAAA,KAAa,EAAE,MAAM,KAAA,KAAa,EAAE,SAAS,KAAA,GAAW;EACpE,MAAM,QAAQ,EAAE,SAAS,SAAS,EAAE,SAAS,WAAW,EAAE,IAAI,EAAE;EAChE,MAAM,SAAS,EAAE,SAAS,SAAS,EAAE,SAAS,WAAW,IAAI,IAAI,IAAI;EACrE,MAAM,SAAS;GAAE,KAAK,EAAE;GAAG,QAAQ,EAAE,IAAI,IAAI;GAAG,MAAM,EAAE;GAAG,OAAO,EAAE,IAAI,IAAI;EAAE,EAAE,EAAE;EAClF,IAAI,KAAK,IAAI,MAAM,IAAI,OAAO,QAAQ,CAAC,OAAO,QAAQ,SAAS,KAAK;CACtE;CAEF,OAAO;AACT;;;;;;AAeA,MAAa,kBAA2D,OAAO,OAAO;CACpF;EAAE,IAAI;EAAc,QAAQ,CAAC,MAAM;CAAE;CACrC;EAAE,IAAI;EAAgB,QAAQ,CAAC,MAAM;CAAE;CACvC;EAAE,IAAI;EAAe,QAAQ;CAAe;CAC5C;EAAE,IAAI;EAAY,QAAQ;CAAe;AAC3C,CAAU;;AAGV,SAAgB,eAAe,QAAgB,MAAqB;CAClE,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,OAAO;CACvC,QAAQ,OAAO,MAAf;EACE,KAAK,QAAQ;GACX,MAAM,IAAI,UAAU,QAAQ,IAAI;GAChC,OAAO,EAAE,IAAI,KAAK,EAAE,IAAI;EAC1B;EACA,KAAK,UACH,OAAO,eAAe,OAAO,IAAI,OAAO,IAAI,OAAO,GAAG,OAAO,GAAG,IAAI;EACtE,KAAK,WACH,OAAO,eAAe,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,IAAI;EACxE,KAAK,WAAW;GACd,MAAM,QAAQ,CAAC,OAAO,QAAQ,GAAI,OAAO,SAAS,CAAC,CAAE;GACrD,MAAM,UAAU,GAAW,MAAuB,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK;GACvH,IAAI,OAAO,OAAO,MAAM,CAAC,GAAG,OAAO,OAAO,GAAG,CAAC,CAAC,GAAG,OAAO;GACzD,KAAK,MAAM,QAAQ,OACjB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;IACpC,MAAM,IAAI,KAAK;IACf,MAAM,IAAI,MAAM,IAAI,KAAK,KAAK;IAC9B,MAAM,IAAI,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI;IAC9C,IAAI,MAAM,KAAA,KAAa,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO;GACpD;GAEF,OAAO,aAAa,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK;EACrE;CACF;AACF;;;;;AAMA,SAAgB,aAAa,QAAgB,MAAqB;CAChE,MAAM,KAAK,KAAK,IAAI,KAAK;CACzB,MAAM,KAAK,KAAK,IAAI,KAAK;CACzB,MAAM,UAAkD;EACtD,CAAC,KAAK,GAAG,KAAK,CAAC;EACf,CAAC,IAAI,KAAK,CAAC;EACX,CAAC,IAAI,EAAE;EACP,CAAC,KAAK,GAAG,EAAE;CACb;CACA,QAAQ,OAAO,MAAf;EACE,KAAK,QACH,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,OAAO,IAAI,OAAO,KAAK,MAAM,OAAO,IAAI,OAAO;EAC1G,KAAK,UACH,OAAO,QAAQ,OAAO,CAAC,GAAG,OAAO,UAAU,OAAO,IAAI,OAAO,IAAI,OAAO,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC;EAC5F,KAAK,WACH,OAAO,QAAQ,OAAO,CAAC,GAAG,OAAO,UAAU,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,GAAG,CAAC,CAAC;EAC9F,KAAK,WAAW;GACd,MAAM,OAAO,OAAO;GACpB,IAAI,KAAK,SAAS,GAAG,OAAO;GAE5B,IAAI,CAAC,CADW,GAAG,SAAS,CAAC,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC,CAC3D,CAAC,CAAC,OAAO,CAAC,GAAG,OAAO,OAAO,GAAG,GAAG,IAAI,KAAK,aAAa,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO;GACxF,MAAM,QAAQ,GAAW,MAAuB,IAAI,KAAK,IAAA,QAAW,IAAI,KAAA,QAAY,IAAI,KAAK,IAAA,QAAW,IAAI,KAAA;GAC5G,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;IACpC,MAAM,IAAI,KAAK;IACf,MAAM,IAAI,MAAM,IAAI,KAAK,KAAK;IAC9B,MAAM,IAAI,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI;IAC9C,IAAI,MAAM,KAAA,KAAa,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO;GAClD;GACA,QAAQ,OAAO,SAAS,CAAC,EAAA,CAAG,OAAO,SAAS,CAAC,eAAe;IAAE,MAAM;IAAW,QAAQ;GAAK,GAAG,IAAI,CAAC;EACtG;CACF;AACF;;AAGA,SAAS,OAAO,GAAS,GAAiB;CACxC,MAAM,KAAK,KAAK,IAAI,GAAG,EAAE,IAAI,CAAC;CAC9B,MAAM,KAAK,KAAK,IAAI,GAAG,EAAE,IAAI,CAAC;CAC9B,OAAO;EAAE,GAAG,EAAE,IAAI;EAAI,GAAG,EAAE,IAAI;EAAI,GAAG,EAAE,IAAI,IAAI;EAAI,GAAG,EAAE,IAAI,IAAI;CAAG;AACtE;;AAGA,SAAS,UAAU,IAAY,IAAY,IAAY,IAAY,GAAW,GAAoB;CAChG,IAAI,MAAM,KAAK,MAAM,GAAG,OAAO;CAC/B,MAAM,KAAK,IAAI,MAAM;CACrB,MAAM,KAAK,IAAI,MAAM;CACrB,OAAO,IAAI,IAAI,IAAI,KAAK;AAC1B;;AAGA,SAAS,OAAO,GAAW,GAAW,MAAuD;CAC3F,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,CAAC,IAAI,MAAM,KAAK;EACtB,MAAM,CAAC,IAAI,MAAM,MAAM,IAAI,KAAK,KAAK;EACrC,MAAM,KAAK,KAAK;EAChB,MAAM,KAAK,KAAK;EAChB,MAAM,OAAO,KAAK,KAAK,KAAK;EAC5B,MAAM,IAAI,SAAS,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,MAAM,MAAM,IAAI,MAAM,MAAM,IAAI,CAAC;EAC1F,IAAI,KAAK,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,KAAA,MAAU,OAAO;CACtE;CACA,OAAO;AACT;;AAGA,SAAS,eAAe,IAAY,IAAY,IAAY,IAAY,MAAqB;CAC3F,IAAI,MAAM,KAAK,MAAM,GAAG,OAAO;CAC/B,MAAM,MAAM,KAAK,IAAI,MAAM;CAC3B,MAAM,MAAM,KAAK,IAAI,KAAK,IAAI,MAAM;CACpC,MAAM,MAAM,KAAK,IAAI,MAAM;CAC3B,MAAM,MAAM,KAAK,IAAI,KAAK,IAAI,MAAM;CACpC,MAAM,KAAK,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE;CAC9B,MAAM,KAAK,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE;CAC9B,OAAO,KAAK,KAAK,KAAK,KAAK;AAC7B;;AAGA,SAAS,QAAQ,IAAY,IAAY,IAAY,IAAY,GAAgD;CAC/G,IAAI,KAAK;CACT,IAAI,KAAK;CACT,MAAM,KAAK,KAAK;CAChB,MAAM,KAAK,KAAK;CAChB,MAAM,QAAgD;EACpD,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;EACd,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;EACnB,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;EACd,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;CACrB;CACA,KAAK,MAAM,CAAC,GAAG,MAAM,OACnB,IAAI,MAAM,GACJ;MAAA,IAAI,GAAG,OAAO,KAAA;CAAA,OACb,IAAI,IAAI,GACb,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC;MAEvB,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC;CAG3B,IAAI,MAAM,IAAI,OAAO,KAAA;CACrB,MAAM,KAAK,KAAK,MAAM;CACtB,OAAO,CAAC,KAAK,IAAI,IAAI,KAAK,IAAI,EAAE;AAClC;;AAGA,SAAS,aAAa,GAAW,GAAW,OAAqE;CAC/G,IAAI,SAAS;CACb,KAAK,MAAM,QAAQ,OACjB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,IAAI,KAAK,QAAQ,IAAI,KAAK;EAC7D,MAAM,CAAC,IAAI,MAAM,KAAK;EACtB,MAAM,CAAC,IAAI,MAAM,KAAK;EACtB,IAAI,KAAK,MAAM,KAAK,KAAK,KAAM,KAAK,OAAO,IAAI,OAAQ,KAAK,MAAM,IAAI,SAAS,CAAC;CAClF;CAEF,OAAO;AACT;;;;;AAMA,SAAgB,kBACd,OACA,WACA,YAAoB,kBAAkB,SAC9B;CACR,IAAI,cAAc,KAAA,KAAa,UAAU,WAAW,GAAG,OAAO;CAC9D,IAAI,QAAQ;CACZ,KAAK,MAAM,OAAO,OAAO;EACvB,MAAM,KAAK,WAAW,GAAG;EACzB,IAAI,OAAO,KAAA,GAAW;EACtB,MAAM,IAAI,KAAK,IAAI,IAAI,MAAM;EAC7B,MAAM,QAAQ;GAAE,GAAG,EAAE,IAAI;GAAW,GAAG,EAAE,IAAI;GAAW,GAAG,EAAE,IAAI,IAAI;GAAW,GAAG,EAAE,IAAI,IAAI;EAAU;EACvG,KAAK,MAAM,KAAK,WAAW,IAAI,eAAe,EAAE,QAAQ,KAAK,GAAG;CAClE;CACA,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,SAAS,OAAoB,QAAoB,YAAoB,kBAAkB,SAAS,UAAyB,CAAC,GAAa;CACrJ,MAAM,QAAQ,UAAU,OAAO,MAAM;CACrC,MAAM,SAAS,IAAI,IAAI,OAAO,WAAW,KAAK,MAAM,EAAE,EAAE,CAAC;CACzD,MAAM,MAAM,IAAI,IAAI,OAAO,QAAQ;CACnC,MAAM,MAAM,IAAI,IAAI,MAAM,MAAM,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;CACrD,IAAI,cAAc;CAClB,IAAI,aAAa;CACjB,MAAM,OAAoB,CAAC;CAC3B,KAAK,MAAM,OAAO,MAAM,OAAO;EAC7B,MAAM,MAAM,IAAI,IAAI,IAAI,EAAE;EAC1B,IAAI,KAAK,WAAW,MAAM;GACxB,IAAI,IAAI,MAAM,KAAA,KAAa,IAAI,MAAM,KAAA,GAAW;GAChD,MAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,EAAE,IAAA,QAAkB,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,EAAE,IAAA;GAClG,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,KAAK,OAAO;GAClC,KAAK,KAAK,GAAG;EACf,OAAO,IAAI,OAAO,IAAI,IAAI,EAAE,GAC1B,KAAK,KAAK,GAAG;OACR,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,GACxB;CAEJ;CACA,OAAO;EACL,cAAc,cAAc,MAAM,WAAW,MAAM,QAAQ,IAAI,kBAAkB,MAAM,MAAM,WAAW,SAAS;EACjH,gBAAgB,aAAa;GAAE,GAAG;GAAO,OAAO;EAAK,GAAG,WAAW,OAAO;EAC1E,eAAe;EACf,UAAU;CACZ;AACF;;;;;;;AAQA,SAAgB,WAAW,OAAuC;CAChE,MAAM,WAAqB,CAAC;CAC5B,MAAM,sBAAM,IAAI,IAAY;CAC5B,KAAK,MAAM,OAAO,MAAM,OAAO;EAC7B,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,SAAS,KAAK,OAAO,IAAI,GAAG,uBAAuB;EACxE,IAAI,IAAI,IAAI,EAAE;EACd,IAAI,EAAE,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,OAAO,SAAS,IAAI,CAAC,KAAK,OAAO,SAAS,IAAI,CAAC,IAAI,SAAS,KAAK,OAAO,IAAI,GAAG,sCAAsC;EACrJ,IAAI,IAAI,WAAW,SAAS,IAAI,MAAM,KAAA,KAAa,IAAI,MAAM,KAAA,IAAY,SAAS,KAAK,OAAO,IAAI,GAAG,+BAA+B;EACpI,MAAM,QAAQ,iBAAiB,GAAG;EAClC,IAAI,UAAU,KAAA,GAAW,SAAS,KAAK,KAAK;EAC5C,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,GAAG,SAAS,KAAK,GAAG,cAAc,IAAI,IAAI,IAAI,CAAC;CAClF;CACA,IAAI,oBAAoB,MAAM,KAAK,IAAI,GAAG,SAAS,KAAK,8CAA8C;CACtG,KAAK,MAAM,QAAQ,MAAM,SAAS,CAAC,GACjC,IAAI,CAAC,IAAI,IAAI,KAAK,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,MAAM,GAAG,SAAS,KAAK,QAAQ,KAAK,GAAG,wCAAwC;CAE5H,SAAS,KAAK,GAAG,gBAAgB,MAAM,UAAU,GAAG,CAAC;CACrD,OAAO;AACT;;AAGA,SAAS,cAAc,OAAe,MAAsB;CAC1D,IAAI,KAAK,UAAU,KAAA,GAAW,OAAO,CAAC;CACtC,MAAM,KAAK,OAAO,MAAM,QAAQ,KAAK;CACrC,MAAM,WAAqB,CAAC;CAC5B,IAAI,KAAK,SAAS,KAAA,GAAW,SAAS,KAAK,GAAG,GAAG,gCAAgC;CACjF,IAAI,OAAO,KAAK,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,KAAK,KAAK,QAAQ,KAAK,KAAK,QAAQ,GACnG,SAAS,KAAK,GAAG,GAAG,oBAAoB,OAAO,KAAK,KAAK,EAAE,oCAAoC;CACjG,IAAI,KAAK,MAAM,KAAA,KAAa,KAAK,MAAM,KAAA,GAAW,SAAS,KAAK,GAAG,GAAG,oCAAoC;CAC1G,OAAO;AACT;;AAGA,SAAS,gBAAgB,UAAmC,KAAoC;CAC9F,IAAI,aAAa,KAAA,GAAW,OAAO,CAAC;CACpC,IAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG,OAAO,CAAC,mCAAmC;CACzE,MAAM,WAAqB,CAAC;CAC5B,MAAM,uBAAO,IAAI,IAAoB;CACrC,SAAS,SAAS,GAAY,MAAM;EAClC,MAAM,KAAK,YAAY,EAAE,IAAI,OAAO,GAAG,CAAC,EAAE,IAAI,OAAO,GAAG,CAAC,EAAE;EAC3D,IAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,OAAO,EAAE,MAAM,YAAY,OAAO,EAAE,MAAM,UAAU;GAC7F,SAAS,KAAK,YAAY,EAAE,sCAAsC;GAClE;EACF;EACA,KAAK,MAAM,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,GAAG,SAAS,KAAK,GAAG,GAAG,YAAY,GAAG,qBAAqB;EACvG,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,KAAK,GAAG,GAAG,+BAA+B;EACpE,IAAI,OAAO,EAAE,QAAQ,YAAY,CAAC,OAAO,SAAS,EAAE,GAAG,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,GAAG,GAAG,YAAY,OAAO,EAAE,GAAG,EAAE,qCAAqC;EAC1J,IAAI,EAAE,UAAU,KAAA,MAAc,OAAO,EAAE,UAAU,YAAY,CAAC,OAAO,UAAU,EAAE,KAAK,KAAK,EAAE,QAAQ,IACnG,SAAS,KAAK,GAAG,GAAG,oBAAoB,OAAO,EAAE,KAAK,EAAE,oCAAoC;EAC9F,MAAM,MAAM,KAAK,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;EAC9D,MAAM,QAAQ,KAAK,IAAI,GAAG;EAC1B,IAAI,UAAU,KAAA,GAAW,SAAS,KAAK,GAAG,GAAG,8BAA8B,OAAO;OAC7E,KAAK,IAAI,KAAK,CAAC;CACtB,CAAC;CACD,OAAO;AACT;;;AC1WA,MAAM,cAAc;;AAEpB,MAAM,OAA6B,CAAC,MAAM;;;;;AAM1C,MAAa,iBAAyD,OAAO,OAAO;CAClF;EAAE,IAAI;EAAc,WAAW;EAAO,MAAM;EAAU,WAAW;EAAU,KAAK;EAAG,KAAK;EAAG,OAAO;EAAG,MAAM;EAAS,QAAQ;CAAK;CACjI;EAAE,IAAI;EAAqB,WAAW;EAAM,MAAM;EAAe,WAAW;EAAS,KAAK;EAAG,KAAK;EAAU,OAAO;EAAG,KAAK;EAAM,MAAM;EAAS,QAAQ;CAAY;CACpK;EAAE,IAAI;EAAe,WAAW;EAAO,MAAM;EAAU,WAAW;EAAS,KAAK;EAAG,KAAK;EAAG,OAAO;EAAG,KAAK;EAAO,MAAM;EAAS,QAAQ;CAAY;CACpJ;EAAE,IAAI;EAA4B,WAAW;EAAG,MAAM;EAAS,WAAW;EAAS,KAAK;EAAG,KAAK;EAAU,OAAO;EAAG,KAAK;EAAG,MAAM;EAAS,QAAQ;CAAY;CAC/J;EAAE,IAAI;EAAyB,WAAW;EAAM,MAAM;EAAmB,WAAW;EAAS,KAAK;EAAG,KAAK;EAAU,OAAO;EAAG,KAAK;EAAM,MAAM;EAAS,QAAQ;CAAK;CACrK;EAAE,IAAI;EAAwB,WAAW;EAAO,MAAM;EAAK,WAAW;EAAS,KAAK;EAAG,KAAK;EAAU,OAAO;EAAG,KAAK;EAAO,MAAM;EAAgB,QAAQ;CAAY;CACtK;EAAE,IAAI;EAAyB,WAAW;EAAM,MAAM;EAAU,WAAW;EAAS,KAAK;EAAG,KAAK;EAAG,OAAO;EAAG,KAAK;EAAM,MAAM;EAAgB,QAAQ;CAAY;CACnK;EAAE,IAAI;EAAoB,MAAM;EAAW,WAAW;EAAU,KAAK;EAAI,KAAK;EAAG,MAAM;EAAc,QAAQ;CAAY;CACzH;EAAE,IAAI;EAAY,MAAM;EAAgB,WAAW;EAAS,KAAK;EAAG,KAAK;EAAU,MAAM;EAAQ,QAAQ;CAAY;AACvH,CAAU;;AAGV,MAAa,kBAAkB;;;;;;AAU/B,SAAgB,YAAY,MAAsC,IAAI,GAAG,IAAI,GAAW;CACtF,MAAM,IAAI,KAAK,aAAa;CAC5B,MAAM,IAAI,OAAO,MAAM,WAAW,IAAI,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;CAC/E,OAAO,KAAK,IAAI,YAAY,OAAO,SAAS,CAAC,IAAI,IAAI,CAAC;AACxD;;AAGA,MAAM,aAAa;;;;;;;AAQnB,SAAgB,eAAe,WAAmB,UAAkB,MAA6D;CAC/H,IAAI,OAAO,MAAM,SAAS,KAAK,OAAO,MAAM,QAAQ,GAAG,MAAM,IAAI,WAAW,gCAAgC;CAC5G,IAAI,cAAc,UAAU,OAAO;CACnC,MAAM,IAAI,KAAK,MAAM,YAAY,YAAY;CAC7C,MAAM,IAAI,KAAK,MAAM,WAAW,YAAY;CAC5C,IAAI;CACJ,IAAI,OAAO,cAAc,CAAC,KAAK,OAAO,cAAc,CAAC,GAAG;EACtD,QAAQ,IAAI;EACZ,MAAM,IAAI,KAAK,aAAa;EAC5B,MAAM,IAAI,OAAO,MAAM,WAAW,IAAI,eAAe,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;EAC9F,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,YAAY,OAAO;CACtF,OAAO;EACL,QAAQ,YAAY;EACpB,IAAI,EAAE,KAAK,IAAI,KAAK,IAAI,YAAY,MAAM,WAAW,QAAQ,IAAI,OAAO;CAC1E;CAEA,QADe,KAAK,cAAc,UAAU,QAAQ,IAAI,QAAQ,KAChD,WAAW;AAC7B;;;AC/GA,SAAgB,KAAK,MAAwB;CAC3C,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,MAAM,MAAM;EACrB,MAAM,IAAI,GAAG,YAAY,CAAC;EAC1B,IAAI,IAAI,KAAM,MAAM,KAAK,CAAC;OACrB,IAAI,IAAI,MAAO,MAAM,KAAK,MAAQ,KAAK,GAAI,MAAQ,IAAI,EAAG;OAC1D,IAAI,IAAI,OAAS,MAAM,KAAK,MAAQ,KAAK,IAAK,MAAS,KAAK,IAAK,IAAK,MAAQ,IAAI,EAAG;OACrF,MAAM,KAAK,MAAQ,KAAK,IAAK,MAAS,KAAK,KAAM,IAAK,MAAS,KAAK,IAAK,IAAK,MAAQ,IAAI,EAAG;CACpG;CACA,OAAO;AACT;;;ACRA,SAAgB,WAAW,MAA4B;CACrD,IAAI,IAAI,SAAS;CACjB,aAAa;EACX,IAAK,IAAI,aAAc;EACvB,IAAI,IAAI,KAAK,KAAK,IAAK,MAAM,IAAK,IAAI,CAAC;EACvC,IAAK,IAAI,KAAK,KAAK,IAAK,MAAM,GAAI,KAAK,CAAC,IAAK;EAC7C,SAAS,IAAK,MAAM,QAAS,KAAK;CACpC;AACF;;AAGA,SAAgB,QAAQ,MAAsB;CAC5C,IAAI,IAAI;CACR,KAAK,MAAM,KAAK,KAAK,IAAI,GAAG,IAAI,KAAK,KAAK,IAAI,GAAG,QAAU,MAAM;CACjE,OAAO;AACT;;AAGA,SAAgB,WAAW,MAAc,MAA4B;CACnE,OAAO,WAAW,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAC9C;;AAGA,SAAgB,UAAU,GAAiB,IAAY,IAAoB;CACzE,OAAO,KAAK,KAAK,MAAM,EAAE,KAAK,KAAK,KAAK,EAAE;AAC5C;;;ACLA,MAAa,eAAwE,OAAO,OAAO;CAAE,QAAQ;CAAK,QAAQ;CAAK,OAAO;AAAE,CAAC;;AAGzI,MAAa,oBAAoB;AAEjC,MAAM,UAAU;AAChB,MAAM,QAAQ;AACd,MAAM,SAAS;AACf,MAAM,YAAY;AAClB,MAAM,cAAc;AACpB,MAAM,cAAc;CAAC;CAAS;CAAU;CAAS;AAAQ;AAEzD,MAAM,UAAU,MAAsB,KAAK,MAAM,IAAI,GAAI,IAAI;;;;;;AAO7D,SAAgB,SAAS,OAAoB,QAAwB,OAAe,MAAM,QAAQ,GAAgB;CAChH,KAAK,MAAM,OAAO,UAAU,KAAK,GAAG,MAAM,IAAI,WAAW,uCAAuC;CAChG,MAAM,OAAiC;EAAE,QAAQ;EAAQ,OAAO;EAAQ,OAAO;EAAQ,GAAG;CAAO;CACjG,MAAM,IAAI,MAAM,MAAM;CACtB,MAAM,IAAI,WAAW,MAAM,OAAO;CAElC,MAAM,OAAO,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC;CACxC,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;EAC9B,MAAM,IAAI,UAAU,GAAG,GAAG,CAAC;EAC3B,CAAC,KAAK,IAAI,KAAK,MAAM,CAAC,KAAK,IAAK,KAAK,EAAG;CAC1C;CACA,MAAM,YAAsB,IAAI,MAAc,CAAC;CAC/C,KAAK,SAAS,KAAK,MAAO,UAAU,OAAO,KAAK,MAAM,IAAI,OAAO,CAAE;CACnE,MAAM,WAAW,KAAK,KAAK,IAAI,OAAO;CACtC,MAAM,WAAW,MAAiC,KAAK,MAAM,IAAI,UAAU,IAAI,KAAK,OAAO;CAC3F,MAAM,eACJ,KAAK,cAAc,YACf,UAAU,KAAK,MAAM,GAAG,YAAY,IAAI,YAAY,QAAS,GAAG,GAAG,IACnE,MAAM,MAAM,UAAU,YAAY,UAAU,GAAG,GAAG,YAAY,SAAS,CAAC,EAAG;CACjF,MAAM,QAAQ,MAAsB,MAAM,MAAM,EAAE,CAAE,IAAI,MAAM,MAAM,EAAE,CAAE;CACxE,MAAM,OAAO,KAAK,UAAU,SAAS,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI;CAE/G,MAAM,QAA4B,CAAC;CACnC,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,OAAO,GAAW,MAAoB;EAC1C,MAAM,MAAM,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,GAAG;EAC1C,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG,GAAG;EAC9B,KAAK,IAAI,GAAG;EACZ,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;CACnB;CACA,MAAM,eAAuB,UAAU,GAAG,GAAG,IAAI,CAAC;CAClD,MAAM,aAAa,MAAsB;EACvC,MAAM,IAAI,QAAQ,CAAC;EACnB,OAAO,EAAE,UAAU,GAAG,GAAG,EAAE,SAAS,CAAC;CACvC;CACA,MAAM,gBAAgB,MAAsB;EAC1C,MAAM,IAAI,UAAU,GAAG,GAAG,WAAW,CAAC;EACtC,OAAO,KAAK,IAAI,IAAI,IAAI;CAC1B;CACA,MAAM,SAAS,KAAK,IAAI,KAAK,MAAM,IAAI,aAAa,KAAK,YAAY,GAAI,KAAK,IAAI,KAAM,CAAC;CACzF,MAAM,QAAQ,SAAuC;EACnD,KAAK,IAAI,QAAQ,GAAG,MAAM,SAAS,UAAU,QAAQ,SAAS,IAAI,SAAS,IAAI,GAAG,KAAK,CAAC;CAC1F;CACA,MAAM,kBAAoC;EACxC,MAAM,IAAI,OAAO;EACjB,OAAO,CAAC,GAAG,EAAE,IAAI,SAAS,UAAU,UAAU,EAAG,IAAI,OAAO,CAAC;CAC/D;CAEA,IAAI,KAAK,GACP,QAAQ,KAAK,WAAb;EACE,KAAK;GACH,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC;GAC/B;EACF,KAAK;GACH,KAAK,SAAS;GACd;EACF,KAAK;GACH,WAAW;IACT,MAAM,IAAI,OAAO;IACjB,OAAO,CAAC,GAAG,WAAW,IAAI,UAAU,aAAa,UAAU,EAAG,CAAC,IAAI,OAAO,CAAC;GAC7E,CAAC;GACD;EACF,KAAK;GACH,WAAW,CAAC,OAAO,GAAG,KAAK,KAAK,MAAM,IAAI,EAAE,KAAK,CAAC,EAAG,CAAC;GACtD;EACF,KAAK;GACH,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,IAAI,KAAK,UAAU,GAAG,GAAG,IAAI,CAAC,IAAK,KAAK,EAAG;GACvE;EACF,KAAK,YAAY;GACf,MAAM,IAAI,KAAK,KAAK,IAAI,KAAK;GAC7B,MAAM,SAAS,KAAK,KAAK,IAAI,CAAC;GAC9B,MAAM,SAAS,MAAM,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,KAAK,MAAM,IAAI,SAAS,IAAI,KAAK,MAAM,CAAC;GAC3F,KAAK,MAAM,SAAS,QAAQ,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAK,MAAM,IAAI,EAAG;GACnG,MAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,MAAM,MAAM;GAC/C,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;IAC9B,MAAM,IAAI,IAAI,IAAI,UAAU,GAAG,GAAG,IAAI,CAAC,IAAI;IAC3C,MAAM,OAAO,OAAO;IACpB,MAAM,KAAK,OAAO,IAAI,IAAI,IAAI,IAAI;IAClC,MAAM,IAAI,UAAU,GAAG,GAAG,KAAK,SAAS,CAAC;IACzC,MAAM,IAAI,IAAI,KAAK,MAAM,KAAK,SAAS,CAAC,IAAI,UAAU,GAAG,GAAG,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC;IACvF,IAAI,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAK,GAAG,EAAG;GACzC;GACA;EACF;EACA,KAAK;GACH,KAAK,IAAI,SAAS,GAAG,MAAM,SAAS,SAAS,aAAa,WAAW,KAAK,SAAS,QAAQ,UAAU;IACnG,MAAM,IAAI,OAAO;IACjB,MAAM,IAAI,aAAa,UAAU,EAAG;IACpC,MAAM,MAAM,UAAU,GAAG,GAAG,EAAE;IAC9B,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,MAAM,SAAS,QAAQ,KAAK,IAAI,GAAG,UAAU,CAAC,CAAC;GAC5E;GACA,KAAK,SAAS;CAElB;CAGF,MAAM,KAAK,WAAW,MAAM,OAAO;CACnC,MAAM,QAAkB,MAAM,MAAM,KAAK,MAAM,CAAC,GAAI,EAAE,SAAS,CAAC,CAAE,CAAC;CACnE,MAAM,UAAU,KAAgB,IAAY,MAAY,UAAyB;EAC/E,IAAI,CAAC,OAAO,OAAO;GAAE;GAAI;EAAK;EAC9B,MAAM,QAAQ,OAAO,GAAG,KAAK,SAAS,SAAS,SAAS,WAAW,IAAI,IAAI,IAAI,EAAE;EACjF,MAAM,KAAK;GAAE,KAAK,CAAC,OAAO,CAAC;GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC;GAAG,MAAM,CAAC,GAAG,KAAK;GAAG,OAAO,CAAC,IAAI,GAAG,KAAK;EAAE,EAAE;EAChG,OAAO;GAAE;GAAI;GAAM,GAAG,GAAG;GAAK,GAAG,GAAG;EAAI;CAC1C;CACA,MAAM,sBAAM,IAAI,IAAY;CAC5B,IAAI,KAAK,UAAU,SACjB,MAAM,MAAM,SAAS,KAAK,MAAM;EAC9B,IAAI,GAAG,KAAK,aAAa;EACzB,MAAM,OAAO,MAAM,UAAU,IAAI,GAAG,CAAC;EACrC,MAAM,EAAE,CAAE,KAAK,OAAO,KAAK,OAAO,MAAM,IAAI,CAAC;EAC7C,IAAI,IAAI,CAAC;CACX,CAAC;CAEH,MAAM,QAAsB,MAAM,KAAK,CAAC,GAAG,IAAI,MAAM;EACnD,MAAM,KAAK,IAAI;EACf,MAAM,IAAI,MAAM,MAAM;EACtB,MAAM,IAAI,MAAM,MAAM;EACtB,IAAI,OAAqD,CAAC;EAC1D,IAAI,KAAK,UAAU,SAAS;GAC1B,MAAM,EAAE,CAAE,KAAK,OAAO,GAAG,GAAG,GAAG,KAAK,MAAM,UAAU,IAAI,GAAG,CAAC,IAAK,KAAK,CAAC;GACvE,MAAM,EAAE,CAAE,KAAK,OAAO,GAAG,GAAG,GAAG,KAAK,MAAM,UAAU,IAAI,GAAG,CAAC,IAAK,KAAK,CAAC;GACvE,OAAO;IAAE,YAAY,GAAG,GAAG;IAAK,YAAY,GAAG,GAAG;GAAI;EACxD,OAAO,IAAI,IAAI,IAAI,CAAC,GAClB,OAAO,EAAE,YAAY,MAAM;EAE7B,OAAO;GAAE;GAAI,QAAQ,EAAE;GAAI,QAAQ,EAAE;GAAI,GAAG;GAAM,MAAM,EAAE,YAAY,aAAa,GAAI;EAAE;CAC3F,CAAC;CAED,MAAM,QAAQ,MAAM,MAAM,KAAK,KAAK,MAAiB;EACnD,MAAM,IAAI,UAAU;EACpB,MAAM,QAAQ,KAAK,WAAW,SAAS,KAAA,IAAY,IAAI;EACvD,MAAM,OAAO,KAAK,WAAW,WAAW,IAAI,KAAK,MAAM,IAAI,CAAC,EAAE,IAAI,MAAM;EACxE,OAAO;GACL,GAAG;GACH,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI;IAAE;IAAO,MAAM;KAAE,GAAG,IAAI;KAAM,OAAO;IAAK;GAAE;GAC3E,GAAI,MAAM,EAAE,CAAE,WAAW,IAAI,CAAC,IAAI,EAAE,OAAO,MAAM,GAAI;EACvD;CACF,CAAC;CACD,MAAM,QAAyB;EAAE,MAAM;EAAS,SAAA;EAA4B,QAAQ,EAAE,GAAG,KAAK;EAAG;CAAK;CACtG,MAAM,EAAE,MAAM,MAAM,GAAG,SAAS;CAChC,OAAO;EAAE,GAAG;EAAM;EAAO;EAAO,OAAO,CAAC,GAAI,MAAM,SAAS,CAAC,GAAI,KAAK;CAAE;AACzE;;;AClLA,MAAM,IAAuB;CAC3B;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAC5J;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAC5J;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAC5J;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAC5J;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;AACtF;;;;;AAMA,SAAgB,UAAU,MAAsB;CAC9C,MAAM,QAAQ,KAAK,IAAI;CACvB,MAAM,OAAO,MAAM,SAAS;CAC5B,MAAM,QAAQ,KAAK,MAAM,MAAM,SAAS,KAAK,EAAE,IAAI;CACnD,MAAM,OAAO,IAAI,WAAW,KAAK;CACjC,KAAK,IAAI,KAAK;CACd,KAAK,MAAM,UAAU;CACrB,MAAM,OAAO,IAAI,SAAS,KAAK,MAAM;CACrC,KAAK,UAAU,QAAQ,GAAG,KAAK,MAAM,OAAO,UAAW,CAAC;CACxD,KAAK,UAAU,QAAQ,GAAG,SAAS,CAAC;CACpC,MAAM,IAAI;EAAC;EAAY;EAAY;EAAY;EAAY;EAAY;EAAY;EAAY;CAAU;CACzG,MAAM,oBAAI,IAAI,YAAY,EAAE;CAC5B,MAAM,QAAQ,GAAW,MAAuB,MAAM,IAAM,KAAM,KAAK;CACvE,KAAK,IAAI,MAAM,GAAG,MAAM,OAAO,OAAO,IAAI;EACxC,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK,EAAE,KAAK,KAAK,UAAU,MAAM,IAAI,CAAC;EAC9D,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK;GAC5B,MAAM,IAAI,EAAE,IAAI;GAChB,MAAM,IAAI,EAAE,IAAI;GAChB,MAAM,KAAK,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,IAAK,MAAM;GAC7C,MAAM,KAAK,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,EAAE,IAAK,MAAM;GAC9C,EAAE,KAAM,EAAE,IAAI,MAAO,KAAK,EAAE,IAAI,KAAM,OAAQ;EAChD;EACA,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK;EAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;GAC3B,MAAM,KAAK,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,EAAE;GAChD,MAAM,KAAM,IAAI,IAAM,CAAC,IAAI;GAC3B,MAAM,KAAM,IAAI,KAAK,KAAK,EAAE,KAAM,EAAE,OAAS;GAG7C,MAAM,MAFK,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,EAAE,MACnC,IAAI,IAAM,IAAI,IAAM,IAAI,OACX;GAC1B,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAK,IAAI,OAAQ;GACjB,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAK,KAAK,OAAQ;EACpB;EACA,EAAE,KAAM,EAAE,KAAM,MAAO;EACvB,EAAE,KAAM,EAAE,KAAM,MAAO;EACvB,EAAE,KAAM,EAAE,KAAM,MAAO;EACvB,EAAE,KAAM,EAAE,KAAM,MAAO;EACvB,EAAE,KAAM,EAAE,KAAM,MAAO;EACvB,EAAE,KAAM,EAAE,KAAM,MAAO;EACvB,EAAE,KAAM,EAAE,KAAM,MAAO;EACvB,EAAE,KAAM,EAAE,KAAM,MAAO;CACzB;CACA,OAAO,EAAE,KAAK,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;AAC9D;;;;;AAMA,SAAgB,cAAc,OAAwB;CACpD,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU,OAAO,KAAK,UAAU,KAAK,KAAK;CACjF,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,IAAI,MAAM,KAAK,MAAgB,MAAM,KAAA,IAAY,SAAS,cAAc,CAAC,CAAE,CAAC,CAAC,KAAK,GAAG,EAAE;CACxH,MAAM,IAAI;CAIV,OAAO,IAHM,OAAO,KAAK,CAAC,CAAC,CACxB,QAAQ,MAAM,EAAE,OAAO,KAAA,CAAS,CAAC,CACjC,KACW,CAAC,CAAC,KAAK,MAAM,GAAG,KAAK,UAAU,CAAC,EAAE,GAAG,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;AACtF;;AAYA,SAAS,WAAW,SAA0C;CAC5D,MAAM,OAAO,QAAQ,QAAA;CACrB,IAAI,CAAC,OAAO,SAAS,IAAI,KAAK,OAAO,GAAG,MAAM,IAAI,WAAW,YAAY,KAAK,sCAAsC;CACpH,OAAO,SAAS,IAAI,KAAA,IAAY,IAAI;AACtC;;;;;AAMA,SAAS,OAAO,OAAgB,MAAc,GAAgC;CAC5E,IAAI,OAAO,UAAU,UAAU;EAC7B,IAAI,CAAC,OAAO,SAAS,KAAK,GAAG,MAAM,IAAI,WAAW,4BAA4B,MAAM,MAAM,KAAK,2BAA2B;EAC1H,IAAI,MAAM,KAAA,GAAW,OAAO;EAC5B,MAAM,IAAI,KAAK,MAAM,QAAQ,CAAC,IAAI;EAClC,IAAI,CAAC,OAAO,SAAS,CAAC,GAAG,MAAM,IAAI,WAAW,iBAAiB,KAAK,4BAA4B;EAChG,OAAO,MAAM,IAAI,IAAI;CACvB;CACA,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU,OAAO;CACxD,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,KAAK,GAAY,MAAM,OAAO,GAAG,GAAG,KAAK,GAAG,EAAE,IAAI,CAAC,CAAC;CAC3F,MAAM,IAAI;CACV,MAAM,MAA+B,CAAC;CACtC,KAAK,MAAM,OAAO,OAAO,KAAK,CAAC,GAAG,IAAI,OAAO,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;CAC/E,OAAO;AACT;;;;;;;;;;AAWA,SAAgB,WAAW,OAAgB,UAAuB,CAAC,GAAW;CAC5E,OAAO,UAAU,cAAc,OAAO,OAAO,KAAK,WAAW,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE;AACtF;;;;;;AAOA,SAAgB,aAAa,KAAa,UAAuB,CAAC,GAAW;CAC3E,MAAM,EAAE,MAAM,OAAO,GAAG,SAAS;CACjC,OAAO,WAAW,KAAK,WAAW,mBAAmB,eAAe,IAA8B,IAAI,MAAM,OAAO;AACrH;;;;;;;AAgBA,SAAgB,aAAa,QAAoE;CAC/F,MAAM,yBAAS,IAAI,IAAsB;CACzC,IAAI;CACJ,KAAK,MAAM,MAAM,OAAO,KAAK,MAAM,GAAG;EACpC,MAAM,OAAO,OAAO;EACpB,IAAI,UAAU,KAAA,GAAW,QAAQ;OAC5B,IAAI,KAAK,WAAW,OAAO,MAAM,CAAE,QACtC,MAAM,IAAI,WAAW,kBAAkB,GAAG,QAAQ,KAAK,OAAO,gBAAgB,MAAM,QAAQ,OAAO,MAAM,CAAE,OAAO,EAAE;EACtH,MAAM,MAAM,KAAK,UAAU,IAAI;EAC/B,MAAM,UAAU,OAAO,IAAI,GAAG;EAC9B,IAAI,SAAS,QAAQ,KAAK,EAAE;OACvB,OAAO,IAAI,KAAK,CAAC,EAAE,CAAC;CAC3B;CAKA,OAJe,CAAC,GAAG,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,YAAyB;EAChE,MAAM,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK;EACjC,OAAO;GAAE,IAAI,OAAO;GAAK,SAAS;EAAO;CAC3C,CACY,CAAC,CAAC,MAAM,GAAG,MAAO,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAE;AACvE;;;;;;;AAkBA,SAAgB,UAAU,UAAqC;CAC7D,MAAM,EAAE,OAAO,QAAQ,eAAe;CACtC,IAAK,WAAW,KAAA,OAAgB,eAAe,KAAA,IAAY,MAAM,IAAI,WAAW,wEAAwE;CACxJ,IAAI,UAAU,cAAc,OAAO,WAAW,WAAW,QACvD,MAAM,IAAI,WAAW,qBAAqB,OAAO,OAAO,4BAA4B,WAAW,OAAO,EAAE;CAC1G,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC,CAAC,MAAM,MAAM,IAAI,CAAC,GAAG,OAAO;CAC7D,IAAI,UAAU,YAAY,OAAO,OAAO,MAAM,GAAG,MAAM,MAAM,WAAW,EAAE;CAC1E,OAAO;AACT;;;;;;;;;;;;;;;AClEA,SAAgB,WAAW,YAAwC,QAA2C;CAC5G,IAAI,WAAW,WAAW,GAAG,MAAM,IAAI,WAAW,8CAA8C;CAChG,KAAK,MAAM,SAAS,QAClB,KAAK,MAAM,KAAK,YAAY;EAC1B,MAAM,IAAI,EAAE,OAAO,MAAM;EACzB,IAAI,OAAO,MAAM,UAAU,MAAM,IAAI,WAAW,8BAA8B,EAAE,GAAG,gCAAgC,MAAM,GAAG,GAAG;EAC/H,IAAI,CAAC,OAAO,SAAS,CAAC,GAAG,MAAM,IAAI,WAAW,8BAA8B,EAAE,GAAG,kBAAkB,EAAE,kBAAkB,MAAM,GAAG,GAAG;CACrI;CAEF,IAAI,QAAoC;CACxC,MAAM,OAA8B,CAAC;CACrC,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,MAAM,MAA+B,EAAE,OAAO,MAAM;EAC1D,IAAI,OAAO,GAAG,MAAM,EAAG;EACvB,KAAK,MAAM,KAAK,OAAO,OAAO,MAAM,KAAK,cAAc,UAAU,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC;EAC7G,QAAQ,MAAM,QAAQ,MAAM,eAAe,GAAG,CAAC,GAAG,MAAM,MAAM,IAAI,MAAM,OAAO;EAC/E,KAAK,KAAK,MAAM,KAAK,MAAM,EAAE,EAAE,CAAC;CAClC;CACA,OAAO;EAAE,QAAQ,MAAM,EAAE,CAAE;EAAI;CAAK;AACtC;;AAGA,SAAgB,UAAU,OAAyD;CACjF,OAAO,EAAE,MAAM,MAAM,SAAS,IAAI,EAAE;AACtC;;AAGA,SAAS,eAA6B;CACpC,MAAM,OAAQ,WAA4D;CAC1E,OAAO,aAAa,KAAK,IAAI,UAAU,KAAK,IAAI;AAClD;;AAGA,SAAS,UAAU,GAAoB;CACrC,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AAClD;;AAGA,SAAS,aAAa,IAAY,SAAoD;CACpF,IAAI,QAAQ,WAAW,GAAG,MAAM,IAAI,WAAW,kBAAkB,GAAG,kBAAkB;CACtF,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,MAAM,KAAK,SAAS;EACvB,IAAI,KAAK,IAAI,EAAE,EAAE,GAAG,MAAM,IAAI,WAAW,kBAAkB,GAAG,iCAAiC,EAAE,GAAG,GAAG;EACvG,KAAK,IAAI,EAAE,EAAE;CACf;AACF;;;;;;;;;;;;;AAiBA,SAAgB,UACd,IACA,SACA,KACA,UAA4B,CAAC,GACZ;CACjB,MAAM,2BAAW,IAAI,IAAY;CACjC,KAAK,MAAM,SAAS,IAAI,QAAQ;EAC9B,IAAI,MAAM,OAAO,QAAQ,MAAM,IAAI,WAAW,kBAAkB,GAAG,2CAA2C;EAC9G,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG,MAAM,IAAI,WAAW,kBAAkB,GAAG,gCAAgC,MAAM,GAAG,GAAG;EAClH,SAAS,IAAI,MAAM,EAAE;CACvB;CACA,MAAM,EAAE,UAAU,YAAY,SAAS,UAAU;CACjD,IAAI,aAAa,KAAA,KAAa,EAAE,YAAY,IAAI,MAAM,IAAI,WAAW,kBAAkB,GAAG,qBAAqB,SAAS,wBAAwB;CAChJ,IAAI,eAAe,KAAA,KAAa,EAAE,OAAO,UAAU,UAAU,KAAK,cAAc,IAC9E,MAAM,IAAI,WAAW,kBAAkB,GAAG,uBAAuB,WAAW,0CAA0C;CACxH,IAAI,WAAW,SAAS,WAAW,QAAQ,MAAM,IAAI,WAAW,kBAAkB,GAAG,mBAAmB,OAAO,MAAM,EAAE,8BAA8B;CACrJ,IAAI,OAAO,YAAY,YAAY,aAAa,IAAI,OAAO;CAC3D,MAAM,SAAiC,CAAC;EAAE,IAAI;EAAQ,MAAM;GAAE,WAAW;GAAS,WAAW;EAAE;CAAE,GAAG,GAAG,IAAI,OAAO,KAAK,OAAO;EAAE,IAAI,EAAE;EAAI,MAAM,EAAE;CAAK,EAAE,CAAC;CAC1J,MAAM,MAAM,QAAQ,OAAO,aAAa;;CAGxC,MAAM,UAAU,GAAiB,WAAsB;EACrD,IAAI;GACF,OAAO,IAAI,OAAO,IAAI,KAAK,MAAM,IAAI,WAAW,MAAM;EACxD,SAAS,GAAG;GACV,MAAM,IAAI,WAAW,2BAA2B,EAAE,GAAG,sBAAsB,GAAG,YAAY,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;EACxH;CACF;CAEA,MAAM,YAAY,GAAiB,OAAU,WAAsB;EACjE,MAAM,SAAiC,CAAC;EACxC,MAAM,WAAW,OAAe,MAA0B;GACxD,IAAI;GACJ,IAAI;IACF,IAAI,EAAE;GACR,SAAS,GAAG;IACV,MAAM,IAAI,WAAW,cAAc,MAAM,mBAAmB,EAAE,GAAG,sBAAsB,GAAG,YAAY,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;GACpI;GACA,IAAI,OAAO,MAAM,YAAY,CAAC,OAAO,SAAS,CAAC,GAC7C,MAAM,IAAI,WAAW,eAAe,EAAE,GAAG,sBAAsB,GAAG,kBAAkB,EAAE,kBAAkB,MAAM,GAAG;GACnH,OAAO,SAAS;EAClB;EACA,IAAI;GACF,QAAQ,cAAc,IAAI,KAAK,OAAO,MAAM,CAAC;GAC7C,KAAK,MAAM,SAAS,IAAI,QAAQ,QAAQ,MAAM,UAAU,MAAM,MAAM,OAAO,MAAM,CAAC;GAClF,IAAI,WAAW,QAAQ,OAAO;IAAE,IAAI;IAAM;IAAQ;GAAO;GACzD,OAAO;IAAE,IAAI;IAAM;IAAQ;IAAQ,MAAM,OAAO,GAAG,MAAM;GAAE;EAC7D,SAAS,GAAG;GACV,OAAO;IAAE,IAAI;IAAO,OAAO;GAAE;EAC/B;CACF;CAEA,MAAM,QAAQ,UAA+B;EAC3C,MAAM,OAAO,OAAO,YAAY,aAAa,QAAQ,KAAK,IAAI;EAC9D,IAAI,OAAO,YAAY,YAAY,aAAa,IAAI,IAAI;EACxD,MAAM,QAAQ,IAAI;EAClB,MAAM,SAAwB,CAAC;EAC/B,MAAM,0BAAU,IAAI,IAAe;EACnC,MAAM,MAAyB,CAAC;EAChC,IAAI;EACJ,IAAI,MAAM;EACV,IAAI,YAAY;EAChB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,IAAI,KAAK;GACf,IAAI,eAAe,KAAA,KAAa,KAAK,YAAY;IAC/C,OAAO,KAAK;KAAE,IAAI,EAAE;KAAI,QAAQ;IAAM,CAAC;IACvC;IACA;GACF;GACA,IAAI,IAAI,KAAK,aAAa,KAAA,MAAc,aAAa,IAAI,IAAI,SAAS,WAAW;IAC/E,YAAY;IACZ,OAAO,KAAK;KAAE,IAAI,EAAE;KAAI,QAAQ;IAAM,CAAC;IACvC;IACA;GACF;GACA,MAAM,KAAK,IAAI;GACf,IAAI;GACJ,IAAI;GACJ,IAAI;IACF,MAAM,SAAS,EAAE,IAAI,KAAK;IAC1B,KAAK,IAAI,IAAI;IACb,SAAS,SAAS,GAAG,OAAO,MAAM;GACpC,SAAS,GAAG;IACV,KAAK,IAAI,IAAI;IACb,SAAS;KAAE,IAAI;KAAO,OAAO;IAAE;GACjC;GACA,IAAI,OAAO,IAAI;IACb,OAAO,KACL,OAAO,SAAS,KAAA,IACZ;KAAE,IAAI,EAAE;KAAI,QAAQ;KAAO,QAAQ,OAAO;KAAQ;IAAG,IACrD;KAAE,IAAI,EAAE;KAAI,QAAQ;KAAO,QAAQ,OAAO;KAAQ;KAAI,YAAY,OAAO;IAAK,CACpF;IACA,QAAQ,IAAI,EAAE,IAAI,OAAO,MAAM;IAC/B,IAAI,KAAK;KAAE,IAAI,EAAE;KAAI,QAAQ,OAAO;IAAO,CAAC;GAC9C,OAAO;IACL,OAAO,KAAK;KAAE,IAAI,EAAE;KAAI,QAAQ;KAAS;KAAI,OAAO,UAAU,OAAO,KAAK;IAAE,CAAC;IAC7E,eAAe,EAAE,OAAO,OAAO,MAAM;GACvC;EACF;EACA,IAAI,IAAI,WAAW,GAAG,MAAM,WAAY;EACxC,MAAM,EAAE,QAAQ,SAAS,WAAW,KAAK,MAAM;EAC/C,MAAM,cAAc,OAAO,WAAW,MAAM,EAAE,OAAO,MAAM;EAC3D,IAAI,WAAW,UAAU,cAAc,KAAK,OAAO,EAAE,CAAE,WAAW,OAEhE,KAAK,MAAM,KAAK,CAAC,GAAG,WAAW,GAAG,OAAO,KAAK;GAAE,GAAG,OAAO;GAAK,YAAY,OAAO,KAAK,IAAK,QAAQ,IAAI,OAAO,EAAE,CAAE,EAAE,CAAE;EAAE;EAE3H,MAAM,OAAO,OAAO;EAEpB,MAAM,QAAwB;GAC5B,SAAS;GACT;GACA;GACA,QALa,cAAc,MAAM,KAAK,WAAW,SAAS,OAAO,YAAY,CAAE,eAAe,KAAK;GAMnG,SAAS,IAAI,IAAI;GACjB,GAAI,aAAa,KAAA,IAAY,EAAE,SAAS,IAAI,CAAC;GAC7C,GAAI,eAAe,KAAA,IAAY,EAAE,WAAW,IAAI,CAAC;GACjD;GACA,eAAe,CAAC;GAChB;EACF;EACA,OAAO;GAAE,QAAQ,QAAQ,IAAI,MAAM;GAAI;GAAQ;EAAM;CACvD;CAEA,OAAO;EAAE;EAAI;EAAM,MAAM,UAAgB,KAAK,KAAK,CAAC,CAAC;CAAO;AAC9D;;;ACzRA,MAAa,kBAAkB;;AAG/B,MAAM,aAAa;;AAMnB,SAASC,SAAO,OAAoC;CAClD,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,OAAO,OAAO,KAAK;AAElF;;AAGA,SAAS,YAAY,MAAkB,UAAiC;CACtE,IAAI;CACJ,IAAI;CACJ,MAAM,QAAkB,CAAC;CACzB,IAAI,MAAM,QAAQ,QAAQ,GACxB,OAAO;MACF;EACL,MAAM,MAAM;EACZ,OAAOA,SAAO,KAAK,OAAO;EAC1B,IAAI,SAAS,KAAA,GAAW,OAAO,EAAE,SAAS,4DAA4D;EACtG,MAAM,QAAQ,OAAO,OAAO,KAAK,IAAI,IAAI,IAAI,QAAQ,OAAO,OAAO,KAAA,GAAoB,IAAI,IAAA,OAAuB,KAAA;EAClH,IAAI,UAAU,KAAA,GAAW,OAAO,EAAE,SAAS,aAAa,KAAK,oDAAqE;EAClI,OAAO;EACP,MAAM,KAAK,IAAI;CACjB;CACA,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,OAAOA,SAAO,KAAK,IAAI;EAC7B,IAAI,SAAS,KAAA,GAAW,OAAO,EAAE,SAAS,SAAS,SAAS,KAAA,IAAY,KAAK,iBAAiB,KAAK,GAAG,0BAA0B,IAAI,eAAe;EACnJ,MAAM,KAAK,IAAI;CACjB;CACA,OAAO,EAAE,MAAM;AACjB;;;;;;AAOA,SAAgB,SAAS,MAAkB,UAA4B;CACrE,MAAM,QAAQ,YAAY,MAAM,QAAQ;CACxC,IAAI,aAAa,OAAO,MAAM,IAAI,WAAW,aAAa,MAAM,QAAQ,EAAE;CAC1E,OAAO,MAAM,MAAM,KAAK,UAAU;AACpC;;AAGA,SAAS,WAAW,OAAmC;CACrD,MAAM,UAAU,MAAwB,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,MAAM,OAAO,MAAM,QAAQ;CAChG,OAAO,OAAO,KAAK,KAAMC,WAAS,KAAK,KAAK,OAAO,OAAO,KAAK,CAAC,CAAC,MAAM,MAAM;AAC/E;;;;;AASA,SAAgB,eAAkB,QAAqB,UAAuB,MAAyB,CAAC,GAA2B;CACjI,MAAM,MAA8B,OAAO,YAAY,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;CAC/E,KAAK,MAAM,SAAS,QAAQ,KAAK,MAAM,MAAM,SAAS,KAAK,GAAG,IAAI,OAAO,IAAI,OAAO,KAAK;CACzF,OAAO;AACT;;AAGA,MAAMA,cAAY,UAAqD,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;;;;;AAM1I,SAAgB,gBAAgB,UAA6C;CAC3E,MAAM,SAAU,SAAqC;CACrD,IAAI,WAAW,KAAA,GAAW,OAAO,KAAA;CACjC,IAAI,CAACA,WAAS,MAAM,GAAG,MAAM,IAAI,MAAM,iDAAiD;CACxF,MAAM,WAAW,OAAO;CACxB,IAAI,aAAa,KAAA,GAAW,OAAO,KAAA;CACnC,IAAI,CAACA,WAAS,QAAQ,GAAG,MAAM,IAAI,MAAM,0DAA0D;CACnG,MAAM,EAAE,UAAU,MAAM,WAAW;CACnC,IAAI,CAAC,OAAO,UAAU,QAAQ,KAAM,WAAsB,GAAG,MAAM,IAAI,MAAM,oEAAoE;CACjJ,IAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,CAAC,KAAK,OAAO,OAAO,OAAO,OAAO,QAAQ,GAAG,MAAM,IAAI,MAAM,2DAA2D;CACpJ,IAAI,CAACA,WAAS,MAAM,KAAK,CAAC,OAAO,OAAO,MAAM,CAAC,CAAC,OAAO,MAAM,OAAO,UAAU,CAAC,KAAM,KAAgB,CAAC,GACpG,MAAM,IAAI,MAAM,4EAA4E;CAE9F,MAAM,EAAE,UAAU,cAAc;CAChC,IAAI,aAAa,KAAA,KAAa,CAAC,WAAW,QAAQ,GAAG,MAAM,IAAI,MAAM,2GAA2G;CAChL,IAAI,cAAc,KAAA,MAAc,CAAC,OAAO,UAAU,SAAS,KAAM,YAAuB,IAAI,MAAM,IAAI,MAAM,qEAAqE;CACjL,OAAO;EACK;EACV,MAAM,CAAC,GAAI,IAAiB;EAC5B,QAAQ,EAAE,GAAI,OAAkC;EAChD,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,MAAM,QAAQ,QAAQ,IAAI,CAAC,GAAG,QAAQ,IAAI,EAAE,GAAI,SAA+C,EAAE;EAC/I,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAa,UAAoB;CACtE;AACF;;;;;;;;;;;;;;;AAgBA,SAAgB,cACd,QACA,UACA,OACA,MAAyB,OAAO,KAAK,MAAM,MAAM,GACjD,SAA+C,WACjC;CACd,MAAM,OAAO,CAAC,GAAG,MAAM;CACvB,MAAM,WAAW,eAAe,MAAM,UAAU,GAAG;CACnD,MAAM,MAAgB,CAAC;CACvB,KAAK,MAAM,MAAM,KACf,IAAI,EAAE,MAAM,MAAM,SAAS,IAAI,KAAK,iBAAiB,GAAG,eAAe;MAClE,IAAI,MAAM,OAAO,QAAQ,SAAS,KAAK,IAAI,KAAK,iBAAiB,GAAG,kBAAkB,MAAM,OAAO,IAAI,wBAAwB,SAAS,KAAK;CAEpJ,KAAK,MAAM,MAAM,OAAO,KAAK,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,SAAS,EAAE,GAAG,IAAI,KAAK,IAAI,GAAG,6BAA6B;CAChH,KAAK,MAAM,MAAM,KAEf,KADc,SAAS,OAAO,KAAK,MAAM,YAC7B,CAAC,MAAM,KAAK,SAAS,EAAE,GAAG,IAAI,KAAK,iBAAiB,GAAG,QAAQ,SAAS,IAAI,0BAA0B,MAAM,SAAS,wBAAwB;CAE3J,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC,IAAI,SAAS,EAAE,GAAG,IAAI,KAAK,IAAI,GAAG,qCAAqC;CACzG,KAAK,MAAM,MAAM,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,SAAS,EAAE,GAAG,IAAI,KAAK,GAAG,SAAS,IAAI,mBAAmB,GAAG,oCAAoC;CAClJ,MAAM,SAAuB,IAAI,KAAK,YAAY;EAAE,OAAO;EAAY;EAAQ,QAAQ,CAAC;CAAE,EAAE;CAC5F,IAAI,MAAM,aAAa,KAAA,GAAW,OAAO,KAAK,GAAG,cAAc,MAAM,MAAM,UAAU,MAAM,WAAW,MAAM,CAAC;CAC7G,OAAO;AACT;;AAGA,SAAS,UAAU,OAAwC;CACzD,MAAM,OAAOA,WAAS,KAAK,IAAI,MAAM,UAAU,KAAA;CAC/C,OAAOA,WAAS,IAAI,IAAI,OAAO,KAAA;AACjC;;AAGA,SAAS,QAAQ,OAAgB,IAAoB;CACnD,MAAM,KAAKA,WAAS,KAAK,IAAI,MAAM,QAAQ,KAAA;CAC3C,OAAO,OAAO,OAAO,WAAW,KAAK,IAAI;AAC3C;;AAGA,SAAS,cAAiB,QAAsB,UAAoB,WAA+B,QAA4D;CAC7J,MAAM,2BAAW,IAAI,IAAsB;CAC3C,MAAM,0BAAU,IAAI,IAAgF;CACpG,OAAO,SAAS,OAAO,OAAO;EAC5B,MAAM,KAAK,QAAQ,OAAO,EAAE;EAC5B,MAAM,OAAO,OAAO,KAAK;EACzB,MAAM,QAAqB,SAAS,KAAA,IAAY,EAAE,SAAS,gCAAgC,IAAI,YAAY,MAAM,QAAQ;EACzH,IAAI,aAAa,OAAO;GACtB,SAAS,IAAI,MAAM,SAAS,CAAC,GAAI,SAAS,IAAI,MAAM,OAAO,KAAK,CAAC,GAAI,EAAE,CAAC;GACxE;EACF;EACA,MAAM,MAAM,MAAM,MAAM,KAAK,UAAU;EACvC,MAAM,SAAS,QAAQ,IAAI,GAAG,KAAK;GAAE,wBAAQ,IAAI,IAAsB;GAAG,KAAK,CAAC;EAAE;EAClF,MAAM,QAAQ,KAAK,UAAU,MAAM,KAAK;EACxC,OAAO,OAAO,IAAI,OAAO,CAAC,GAAI,OAAO,OAAO,IAAI,KAAK,KAAK,CAAC,GAAI,EAAE,CAAC;EAClE,OAAO,IAAI,KAAK,EAAE;EAClB,QAAQ,IAAI,KAAK,MAAM;CACzB,CAAC;CACD,MAAM,SAAuB,CAAC;CAC9B,MAAM,OAAO,QAAgB,QAAiC,KAAK,OAAO,KAAK;EAAE,OAAO;EAAY;EAAQ,QAAQ,CAAC,GAAG,GAAG;CAAE,CAAC;CAC9H,KAAK,MAAM,CAAC,SAAS,QAAQ,UAAU,IAAI,GAAG,IAAI,OAAO,eAAe,WAAW,GAAG;CACtF,KAAK,MAAM,CAAC,KAAK,WAAW,SAAS;EACnC,IAAI,OAAO,OAAO,OAAO,GAEvB,IAAI,eAAe,IAAI,2CADT,CAAC,GAAG,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,OACyB,KAAK,OAAO,GAAG;EAEvF,IAAI,cAAc,KAAA,KAAa,OAAO,IAAI,SAAS,WAAW,IAAI,eAAe,IAAI,QAAQ,OAAO,IAAI,OAAO,2BAA2B,aAAa,OAAO,GAAG;CACnK;CACA,OAAO;AACT;;;;;AAYA,SAAgB,aAAa,QAAgB,QAAwC;CACnF,OAAO,UAAU,cAAc;EAAE;EAAQ,QAAQ,OAAO,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE;AACpG;;AAGA,MAAa,eAAe;;AA0B5B,SAAgB,cAAc,QAAgB,MAAsB;CAClE,OAAO,GAAG,OAAO,GAAG,KAAK;AAC3B;;AAGA,MAAM,WAAW,UAAsC,MAAM,QAAQ,KAAK,KAAK,MAAM,OAAO,MAAM,OAAO,UAAU,CAAC,CAAC;;;;;;;;;AAUrH,SAAgB,WAAW,OAAgB,QAAqB,MAA6B;CAC3F,MAAM,MAAgB,CAAC;CACvB,MAAM,aAA2B,IAAI,KAAK,YAAY;EAAE,OAAO;EAAS;EAAQ,QAAQ,CAAC;CAAE,EAAE;CAC7F,MAAM,IAAI;CACV,IAAI,MAAM,QAAQ,OAAO,MAAM,UAAU;EACvC,IAAI,KAAK,iCAAiC;EAC1C,OAAO,KAAK;CACd;CACA,IAAI,EAAE,WAAA,kBAAyB,IAAI,KAAK,iBAAiB,OAAO,EAAE,MAAM,EAAE,QAAQ,cAAc;CAChG,IAAI,EAAE,WAAW,OAAO,QAAQ,IAAI,KAAK,iBAAiB,OAAO,EAAE,MAAM,EAAE,QAAQ,OAAO,QAAQ;CAClG,MAAM,OAAO,aAAa,OAAO,QAAQ,OAAO,MAAM;CACtD,IAAI,EAAE,eAAe,MAAM,IAAI,KAAK,qBAAqB,OAAO,EAAE,UAAU,EAAE,yBAAyB,MAAM;CAC7G,MAAM,QAAQ,IAAI,IAAI,OAAO,MAAM,SAAS,MAAM,EAAE,KAAK,CAAC;CAC1D,IAAI,EAAE,WAAW,QAAQ,OAAO,EAAE,WAAW,UAAU;EACrD,IAAI,KAAK,mCAAmC;EAC5C,OAAO,KAAK;CACd;CACA,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,EAAE,MAAM,GAAG;EACnD,MAAM,QAAS,OAAsC;EACrD,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;GAC/C,IAAI,KAAK,aAAa,IAAI,cAAc;GACxC;EACF;EACA,MAAM,SAAS,MAAiC,MAAM;GACpD,MAAM,KAAK,YAAY,EAAE,gBAAgB;GACzC,MAAM,EAAE,OAAO,YAAY,QAAQ,CAAC;GACpC,IAAI,CAAC,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG,IAAI,KAAK,GAAG,GAAG,oBAAoB;GAC9E,IAAI,CAAC,QAAQ,OAAO,KAAK,QAAQ,WAAW,GAAG,IAAI,KAAK,GAAG,GAAG,sBAAsB;GACpF,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,OAAO,GAAG;GAC1C,MAAM,SAAS,MAAM,QAAQ,MAAM,QAAQ,SAAS,CAAC,CAAC;GACtD,IAAI,OAAO,SAAS,GAAG,IAAI,KAAK,GAAG,GAAG,iBAAiB,OAAO,KAAK,IAAI,EAAE,yBAAyB;GAClG,MAAM,UAAU,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,QAAQ,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;GAClE,IAAI,QAAQ,SAAS,GAAG,IAAI,KAAK,GAAG,GAAG,iBAAiB,QAAQ,KAAK,IAAI,EAAE,8BAA8B;EAC3G,CAAC;CACH;CACA,IAAI,SAAS,KAAA,KAAa,CAAC,OAAO,OAAO,EAAE,QAAQ,IAAI,GAAG,IAAI,KAAK,+BAA+B,KAAK,mBAAmB,OAAO,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,GAAG;CAC5J,OAAO,KAAK;AACd;;;;;AAMA,SAAgB,WAAW,OAAgB,QAAqB,MAAc,QAAgB,kBAA+B;CAC3H,MAAM,SAAS,WAAW,OAAO,MAAM;CACvC,IAAI,OAAO,SAAS,GAAG,MAAM,IAAI,MAAM,GAAG,MAAM,gBAAgB,OAAO,KAAK,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE;CACzG,MAAM,SAAU,MAAsB;CACtC,MAAM,QAAQ,OAAO,OAAO,QAAQ,IAAI,IAAI,OAAO,QAAQ,KAAA;CAC3D,IAAI,UAAU,KAAA,GAAW,MAAM,IAAI,MAAM,GAAG,MAAM,gBAAgB,KAAK,mBAAmB,OAAO,KAAK,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE;CAC3H,OAAO,MAAM,MAAM,KAAK,OAAO;EAAE,OAAO,CAAC,GAAG,EAAE,KAAK;EAAG,SAAS,CAAC,GAAG,EAAE,OAAO;CAAE,EAAE;AAClF;;AAGA,SAAgB,gBAAgB,OAAuC;CACrE,MAAM,SAAS,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC;CACvD,OAAO,OAAO,KAAK,OAAO;EAAE,OAAO,OAAO,QAAQ,MAAM,MAAM,CAAC;EAAG,SAAS,CAAC,CAAC;CAAE,EAAE;AACnF;;;ACzUA,MAAa,wBAAwB;AAmKrC,MAAM,YAAY,UAAqD,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC1I,MAAM,QAAQ,UAA4B,OAAO,UAAU,WAAW,IAAI,MAAM,KAAK,OAAO,KAAK;AACjG,MAAM,aAAa,MAA2B,EAAE,SAAS,SAAS,EAAE,SAAS;AAC7E,MAAM,QAAQ,MAAuB,MAAM,IAAI,IAAI;;AAGnD,MAAM,YAAY,GAAW,SAAS,OAAe,KAAK,OAAO,EAAE,YAAY,MAAM,CAAC,CAAC;;AAGvF,SAAS,UAAU,GAAe,GAA2B;CAC3D,IAAI,OAAO,MAAM,UAAU,OAAO;CAClC,IAAI,EAAE,SAAS,QAAQ,OAAO,KAAK,CAAC;CACpC,OAAO,KAAK,IAAI,EAAE,OAAO,UAAU,KAAK,IAAI,EAAE,OAAO,WAAW,SAAS,CAAC,CAAC,CAAC;AAC9E;;AAGA,SAAS,OAAO,GAAe,GAAoB;CACjD,IAAI,EAAE,SAAS,KAAA,KAAa,EAAE,QAAQ,KAAA,GAAW,OAAO;CACxD,MAAM,KAAK,IAAI,EAAE,OAAO,EAAE;CAC1B,OAAO,KAAK,IAAI,IAAI,KAAK,MAAM,CAAC,CAAC,KAAK,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;AACtE;;AAGA,SAAS,aAAa,GAAe,GAAgC;CACnE,IAAI,EAAE,SAAS,QAAQ,OAAO,OAAO,MAAM,YAAY,KAAA,IAAY,GAAG,KAAK,CAAC,EAAE;CAC9E,IAAI,EAAE,SAAS,QAAQ,QAAQ,EAAE,UAAU,CAAC,EAAA,CAAG,MAAM,MAAM,MAAM,CAAC,IAAI,KAAA,IAAY,GAAG,KAAK,CAAC,EAAE,kBAAkB,EAAE,UAAU,CAAC,EAAA,CAAG,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI;CAClJ,IAAI,OAAO,MAAM,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC,EAAE;CACpE,IAAI,EAAE,SAAS,SAAS,CAAC,OAAO,UAAU,CAAC,GAAG,OAAO,GAAG,EAAE;CAC1D,IAAI,EAAE,QAAQ,KAAA,KAAa,IAAI,EAAE,KAAK,OAAO,GAAG,EAAE,wBAAwB,EAAE;CAC5E,IAAI,EAAE,QAAQ,KAAA,KAAa,IAAI,EAAE,KAAK,OAAO,GAAG,EAAE,wBAAwB,EAAE;CAC5E,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,OAAO,GAAG,EAAE,sBAAsB,EAAE,KAAK,QAAQ,EAAE;AAExE;;AAGA,SAAS,SAAS,GAAe,QAAyB;CACxD,IAAI,EAAE,SAAS,KAAA,GAAW,OAAO;CACjC,IAAI,CAAC,OAAO,OAAO,QAAQ,EAAE,KAAK,KAAK,GAAG,OAAO;CACjD,MAAM,IAAI,OAAO,EAAE,KAAK;CACxB,OAAO,EAAE,KAAK,GAAG,MAAM,MAAM,MAAM,CAAC;AACtC;;AAGA,SAAgB,aAAa,OAAmB,OAAoC;CAClF,OAAO,aAAa,OAAO,KAAK;AAClC;;AAGA,SAAgB,YAAY,OAAmB,QAAuD;CACpG,OAAO,SAAS,OAAO,MAAM;AAC/B;;AAGA,SAAgB,WAAW,OAAmB,OAA+B;CAC3E,OAAO,UAAU,OAAO,KAAK;AAC/B;;AAGA,SAAS,OAAO,OAAsB,OAA2E;CAC/G,KAAK,MAAM,QAAQ,MAAM,SAAS,CAAC,GAAG;EACpC,MAAM,OAAO,GAAG,KAAK,OAAO;EAC5B,IAAI,MAAM,WAAW,IAAI,GAAG;GAC1B,MAAM,QAAQ,OAAO,MAAM,MAAM,MAAM,KAAK,MAAM,CAAC;GACnD,OAAO;IAAE,OAAO,MAAM;IAAO,QAAQ,OAAO,MAAM;GAAO;EAC3D;CACF;CACA,OAAO;EAAE;EAAO,QAAQ;CAAG;AAC7B;;AAGA,MAAM,YAAY,UAA8C,IAAI,IAAI,MAAM,OAAO,KAAK,MAAM,CAAC,EAAE,MAAM,OAAO,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvI,MAAM,cAAc,KAAgB,aAA0D,QAAQ,IAAI,IAAI,KAAK,KAAK,UAAU,IAAI;;AAGtI,SAAS,MAAM,GAAoB,SAAsD;CACvF,IAAI,CAAC,WAAW,EAAE,IAAI,OAAO,GAAG,OAAO;CACvC,OAAO,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,KAAK,OAAO,IAAI,WAAW,EAAE,MAAM,OAAO;AACxF;AAEA,MAAM,YAAY,MAA+B;CAC/C,MAAM,OAAO,MAAyB,GAAG,EAAE,MAAM,GAAG,EAAE,UAAU;CAChE,OAAO,SAAS,EAAE,OAAO,MAAM,IAAI,EAAE,EAAE,EAAE,YAAY,IAAI,EAAE,KAAK,GAAG,MAAM,MAAM,IAAI,EAAE,EAAE,EAAE,QAAQ,IAAI,EAAE,IAAI;AAC7G;;AAGA,SAAS,cAAc,GAAe,IAAuB;CAC3D,MAAM,MAAiB,CAAC;CACxB,IAAI,UAAU,CAAC,GAAG;EAChB,MAAM,EAAE,KAAK,KAAK,SAAS;EAC3B,IAAI,OAAO,QAAQ,YAAY,OAAO,QAAQ,YAAY,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,GAAG,GAAG;GACxG,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,2BAA2B,CAAC;GACrD,OAAO;EACT;EACA,IAAI,MAAM,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,+BAA+B,IAAI,wBAAwB,KAAK,CAAC;EACzG,IAAI,EAAE,SAAS,UAAU,CAAC,OAAO,UAAU,GAAG,KAAK,CAAC,OAAO,UAAU,GAAG,IAAI,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,iDAAiD,CAAC;EACvJ,IAAI,SAAS,KAAA,MAAc,CAAC,OAAO,SAAS,IAAI,KAAK,QAAQ,KAAM,EAAE,SAAS,SAAS,CAAC,OAAO,UAAU,IAAI,IAC3G,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,gBAAgB,KAAK,mBAAmB,EAAE,SAAS,QAAQ,WAAW,GAAG,eAAe,CAAC;EACpH,IAAI,EAAE,UAAU,SAAS,OAAO,GAAG,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,kCAAkC,IAAI,uBAAuB,CAAC;CAC5H,OAAO;EACL,IAAI,EAAE,UAAU,KAAA,GAAW,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,QAAQ,EAAE,KAAK,oBAAoB,CAAC;EACxF,IAAI,EAAE,SAAS,QAAQ;GACrB,IAAI,CAAC,MAAM,QAAQ,EAAE,MAAM,KAAK,EAAE,OAAO,WAAW,GAAG,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,2BAA2B,CAAC;QACxG;IACH,MAAM,uBAAO,IAAI,IAAa;IAC9B,KAAK,MAAM,KAAK,EAAE,QAAQ;KACxB,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,aAAa,GAAG,GAAG,iBAAiB,KAAK,CAAC,EAAE,WAAW,CAAC;KACnF,KAAK,IAAI,CAAC;IACZ;GACF;EACF;CACF;CACA,IAAI,IAAI,WAAW,GAAG;EACpB,MAAM,UAAU,aAAa,GAAG,EAAE,OAAO;EACzC,IAAI,YAAY,KAAA,GAAW,IAAI,KAAK,CAAC,WAAW,kBAAkB,GAAG,wBAAwB,SAAS,CAAC;CACzG;CACA,OAAO;AACT;;AAGA,SAAS,eAAe,OAAmB,GAA2B;CACpE,MAAM,MAAiB,CAAC;CACxB,MAAM,KAAK,cAAc,MAAM,KAAK,GAAG,EAAE;CACzC,IAAI,CAAC,MAAM,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,UAAU,GAAG,GAAG,uBAAuB,CAAC;CAC/E,MAAM,QAAQ,EAAE,OAAO,KAAK,MAAM,EAAE,IAAI;CACxC,EAAE,OAAO,SAAS,GAAG,MAAM;EACzB,MAAM,MAAM,aAAa,MAAM,KAAK,GAAG,EAAE,GAAG,GAAG,EAAE;EACjD,IAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,GAAG,IAAI,KAAK,CAAC,aAAa,GAAG,GAAG,iBAAiB,EAAE,KAAK,WAAW,CAAC;EAClG,IAAI,KAAK,GAAG,cAAc,GAAG,GAAG,CAAC;EACjC,IAAI,EAAE,SAAS,KAAA,GAAW;EAC1B,MAAM,IAAI,MAAM,QAAQ,EAAE,KAAK,KAAK;EACpC,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,WAAW,GAAG,IAAI,qCAAqC,EAAE,KAAK,OAAO,CAAC;OACtF,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,GAAG,IAAI,6BAA6B,EAAE,KAAK,MAAM,gCAAgC,CAAC;OAChH,IAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,WAAW,GAAG,IAAI,KAAK,CAAC,QAAQ,GAAG,IAAI,2BAA2B,CAAC;OAC9G,KAAK,MAAM,KAAK,EAAE,KAAK,IAAI;GAC9B,MAAM,UAAU,aAAa,EAAE,OAAO,IAAK,CAAC;GAC5C,IAAI,YAAY,KAAA,GAAW,IAAI,KAAK,CAAC,QAAQ,GAAG,IAAI,2CAA2C,EAAE,KAAK,MAAM,IAAI,SAAS,CAAC;EAC5H;CACF,CAAC;CACD,IAAI,EAAE,aAAa,KAAA,GAAW,IAAI,KAAK,GAAG,iBAAiB,EAAE,UAAU,EAAE,CAAC;CAC1E,IAAI,EAAE,YAAY,KAAA,GAAW;EAC3B,MAAM,EAAE,KAAK,KAAK,YAAY,EAAE;EAChC,IAAI,CAAC,OAAO,UAAU,GAAG,KAAK,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,OAAO,OAAO,YAAY,WACjG,IAAI,KAAK,CAAC,WAAW,GAAG,GAAG,8EAA8E,CAAC;EAC5G,MAAM,OAAgB,EAAE,QAAQ;EAChC,IAAI,SAAS,KAAA,MAAc,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,KAAK,CAAC,KAAK,OAAO,UAAmB,MAAM,QAAQ,KAAK,CAAC,IAC1H,IAAI,KAAK,CAAC,QAAQ,GAAG,GAAG,2DAA2D,CAAC;CACxF;CACA,OAAO;AACT;;AAGA,SAAS,iBAAiB,UAAmB,IAAuB;CAClE,IAAI,CAAC,SAAS,QAAQ,GAAG,OAAO,CAAC,CAAC,SAAS,mBAAmB,GAAG,mBAAmB,CAAC;CACrF,MAAM,QAAQ,SAAS;CACvB,IAAI,UAAU,KAAA,GAAW,OAAO,CAAC;CACjC,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,SAAS,GAAG,GAAG,2DAA2D,CAAC;CACrI,MAAM,MAAiB,CAAC;CACxB,MAAM,SAAS,GAAY,MAAM;EAC/B,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,2BAA2B,KAAK,CAAC,EAAE,wBAAwB,eAAe,KAAK,IAAI,GAAG,CAAC;OAChI,IAAI,MAAM,QAAQ,CAAC,MAAM,GAAG,IAAI,KAAK,CAAC,aAAa,GAAG,GAAG,sBAAsB,EAAE,WAAW,CAAC;CACpG,CAAC;CACD,OAAO;AACT;;AAGA,MAAM,kBAAkB,GAAgB,WACtC,WAAW,KAAA,KAAa,EAAE,UAAU,UAAU,KAAA,KAAa,OAAO,OAAO,MAAM,EAAE,SAAU,MAAO,SAAS,CAAC,CAAC;;AAG/G,SAAS,oBAAoB,GAAgB,QAAiB,IAAuB;CACnF,IAAI,WAAW,KAAA,KAAa,CAAC,SAAS,MAAM,GAAG,OAAO,CAAC,CAAC,UAAU,iBAAiB,GAAG,mBAAmB,CAAC;CAC1G,MAAM,QAAS,UAAU,CAAC;CAC1B,MAAM,MAAiB,CAAC;CACxB,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GAAG,IAAI,CAAC,EAAE,OAAO,MAAM,MAAM,EAAE,SAAS,GAAG,GAAG,IAAI,KAAK,CAAC,WAAW,GAAG,GAAG,yBAAyB,KAAK,CAAC;CAC3I,MAAM,SAAiB,CAAC;CACxB,KAAK,MAAM,KAAK,EAAE,QAAQ;EACxB,MAAM,MAAM,OAAO,OAAO,OAAO,EAAE,IAAI;EACvC,IAAI,CAAC,SAAS,GAAG,MAAM,GAAG;GACxB,IAAI,KAAK,IAAI,KAAK,CAAC,YAAY,GAAG,GAAG,kBAAkB,EAAE,KAAK,sBAAsB,CAAC;GACrF;EACF;EACA,MAAM,IAAI,MAAM,MAAM,EAAE,QAAQ,EAAE;EAClC,MAAM,UAAU,aAAa,GAAG,CAAC;EACjC,IAAI,YAAY,KAAA,GAAW,IAAI,KAAK,CAAC,SAAS,aAAa,EAAE,KAAK,MAAM,GAAG,wBAAwB,SAAS,CAAC;OACxG,OAAO,EAAE,QAAQ,UAAU,GAAG,CAAe;CACpD;CACA,OAAO;AACT;;AAGA,SAAS,eAAe,OAAsB,QAAiB,QAAiB,QAA0C;CACxH,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,OAAO,SAAS,GAAG,OAAO,CAAC,CAAC,UAAU,yCAAyC,CAAC;CACnH,MAAM,MAAiB,CAAC;CACxB,MAAM,SAAS,OAAO;CACtB,IAAI,OAAO,aAAa,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,8BAA8B,KAAK,OAAO,QAAQ,EAAE,QAAQ,KAAK,MAAM,MAAM,GAAG,CAAC;CAC1I,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,OAAO,MAAM,MAAM,EAAE,SAAS,GAAG,GAAG,IAAI,KAAK,CAAC,WAAW,oCAAoC,KAAK,CAAC;CACrJ,MAAM,YAAY,MAA2C;EAC3D,MAAM,IAAI,OAAO,EAAE;EACnB,OAAO,SAAS,CAAC,IAAI,EAAE,QAAQ,MAAM,MAAM,EAAE,OAAO,EAAE,SAAS,IAAI,KAAA;CACrE;CACA,MAAM,SAAS,SAAS,KAAK;CAC7B,MAAM,4BAAY,IAAI,IAAoB;CAC1C,KAAK,MAAM,KAAK,MAAM,QAAQ;EAC5B,IAAI,SAAS,CAAC,CAAC,EAAE,YAAY,KAAA,GAAW;EACxC,MAAM,IAAI,OAAO,IAAI,EAAE,IAAI;EAC3B,IAAI,UAAU,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,QAAQ,cAAc,UAAU,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,yBAAyB,CAAC;OAC1G,UAAU,IAAI,GAAG,EAAE,IAAI;CAC9B;CACA,MAAM,yBAAS,IAAI,IAA2B;CAC9C,KAAK,MAAM,KAAK,MAAM,QAAQ;EAC5B,MAAM,IAAI,OAAO,OAAO,QAAQ,EAAE,IAAI,IAAI,OAAO,EAAE,QAAQ,KAAA;EAC3D,MAAM,OAAO,UAAU,IAAI,OAAO,IAAI,EAAE,IAAI,CAAE;EAC9C,OAAO,IAAI,EAAE,MAAM,IAAI;EACvB,IAAI,MAAM,KAAA,KAAa,MAAM,MAAM;GACjC,IAAI,CAAC,EAAE,YAAY,SAAS,KAAA,GAAW,IAAI,KAAK,CAAC,WAAW,0CAA0C,EAAE,MAAM,CAAC;GAC/G;EACF;EACA,IAAI,CAAC,SAAS,CAAC,KAAK,OAAO,EAAE,cAAc,UAAU;GACnD,IAAI,KAAK,CAAC,UAAU,2BAA2B,EAAE,KAAK,eAAe,CAAC;GACtE;EACF;EACA,MAAM,IAAI,EAAE,QAAQ,MAAM,MAAM,EAAE,OAAO,EAAE,SAAS;EACpD,IAAI,MAAM,KAAA,GAAW;GACnB,IAAI,KAAK,CAAC,WAAW,aAAa,EAAE,KAAK,iBAAiB,EAAE,WAAW,CAAC;GACxE;EACF;EACA,OAAO,IAAI,EAAE,MAAM,EAAE,EAAE;EACvB,MAAM,KAAK,cAAc,EAAE,KAAK,GAAG,EAAE;EACrC,IAAI,CAAC,eAAe,GAAG,MAAM,GAAG;GAC9B,MAAM,UAAU,OAAQ,QAAQ,MAAM,CAAC,EAAE,SAAU,MAAO,SAAS,CAAC,CAAC;GACrE,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,4BAA4B,EAAE,SAAU,MAAO,KAAK,IAAI,EAAE,QAAQ,QAAQ,KAAK,IAAI,GAAG,CAAC;EAClH;EACA,IAAI,SAAS,KAAA,KAAa,SAAS,EAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,aAAa,EAAE,KAAK,kCAAkC,KAAK,uCAAuC,CAAC;EAChK,IAAI,KAAK,GAAG,oBAAoB,GAAG,EAAE,WAAW,EAAE,CAAC;EACnD,IAAI,EAAE,YAAY,KAAA,GAAW;GAC3B,IAAI,EAAE,eAAe,KAAA,GAAW,IAAI,KAAK,CAAC,WAAW,GAAG,GAAG,oDAAoD,CAAC;GAChH;EACF;EACA,IAAI,QAAQ;GACV,IAAI,KAAK,CAAC,SAAS,gCAAgC,EAAE,KAAK,GAAG,EAAE,GAAG,kCAAkC,CAAC;GACrG;EACF;EACA,IAAI,KAAK,GAAG,eAAe,OAAO,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,IAAI,MAAM,CAAC;CAC9F;CACA,KAAK,MAAM,KAAK,MAAM,eAAe,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,KAAK,CAAC,cAAc,oCAAoC,SAAS,CAAC,GAAG,CAAC;CAC1I,OAAO;AACT;;AAGA,SAAS,eAAe,MAAqB,MAAkB,SAAkB,IAAY,QAA0C;CACrI,IAAI,CAAC,MAAM,QAAQ,OAAO,GAAG,OAAO,CAAC,CAAC,WAAW,GAAG,GAAG,4CAA4C,CAAC;CACpG,MAAM,MAAiB,CAAC;CACxB,IAAI,QAAQ,SAAS,KAAK,OAAO,QAAQ,SAAS,KAAK,KAAK,IAAI,KAAK,CAAC,WAAW,GAAG,GAAG,OAAO,QAAQ,OAAO,gBAAgB,KAAK,IAAI,MAAM,KAAK,KAAK,CAAC;CACvJ,MAAM,sBAAM,IAAI,IAAoB;CACpC,QAAQ,SAAS,GAAY,MAAM;EACjC,MAAM,QAAQ,eAAe,MAAM,GAAG,MAAM,MAAM;EAClD,KAAK,MAAM,CAAC,OAAO,WAAW,OAAO,IAAI,KAAK,CAAC,OAAO,cAAc,EAAE,MAAM,GAAG,IAAI,QAAQ,CAAC;EAC5F,IAAI,MAAM,SAAS,GAAG;EACtB,MAAM,KAAK,KAAK,YAAY,MAAM,GAAqB,IAAI,CAAC;EAC5D,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,aAAa,eAAe,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,uBAAuB,IAAI,CAAC;OAC5G,IAAI,IAAI,IAAI,CAAC;CACpB,CAAC;CACD,IAAI,KAAK,SAAS,KAAA,KAAa,IAAI,WAAW,GAAG;EAC/C,MAAM,MAAM,UAAU,MAAM,MAAM,OAAoC;EACtE,IAAI,CAAC,KAAK,KAAK,MAAM,UAAU,UAAU,MAAM,MAAM,KAAK,MAAM,GAAG,GACjE,IAAI,KAAK,CAAC,QAAQ,GAAG,GAAG,gDAAgD,KAAK,KAAK,OAAO,GAAG,KAAK,KAAK,WAAW,IAAI,SAAS,SAAS,CAAC;CAC5I;CACA,OAAO;AACT;;AAGA,SAAS,UAAU,MAAqB,MAAkB,SAA4C;CACpG,MAAM,MAAM,QAAQ,KAAK,MAAM,KAAK,YAAY,MAAM,GAAG,IAAI,CAAC,CAAC;CAC/D,IAAI,CAAC,KAAK,SAAS,IAAI,KAAK;CAC5B,OAAO,IAAI,KAAK,GAAG;AACrB;;AAGA,SAAS,aAAa,MAAqB,MAAkB,IAAuB;CAClF,MAAM,MAAiB,CAAC;CACxB,MAAM,uBAAO,IAAI,IAAoB;CACrC,MAAM,QAAoB;EAAE,KAAK,KAAK;EAAK,KAAK,KAAK;EAAK,SAAS,KAAK;CAAQ;CAChF,CAAC,KAAK,QAAQ,CAAC,EAAA,CAAG,SAAS,OAAO,MAAM;EACtC,MAAM,QAAQ,eAAe,MAAM,OAAO,OAAO,kBAAkB,EAAE,MAAM,IAAI;EAC/E,IAAI,KAAK,GAAG,KAAK;EACjB,IAAI,MAAM,SAAS,GAAG;EACtB,MAAM,MAAM,UAAU,MAAM,MAAM,KAAK;EACvC,IAAI,KAAK,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC,aAAa,oBAAoB,KAAK,IAAI,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,uBAAuB,CAAC;OACjH,KAAK,IAAI,KAAK,CAAC;CACtB,CAAC;CACD,OAAO;AACT;;AAGA,MAAM,QAAQ,MAAqB,UAA8C,MAAM,OAAO,MAAM,eAAe,MAAM,GAAG,IAAI,CAAC,CAAC,WAAW,CAAC;AAE9I,MAAM,YAAY,UAA8B,SAA4B,CAAC,MAAoB,SAAS,KAAK,CAAC,OAAO,aAAa;CAAE;CAAO;CAAQ;AAAO,EAAE;;;;;;;;AAS9J,SAAgB,YAAY,OAAsB,QAAwB,UAAuB,CAAC,GAAiB;CACjH,OAAO,SAAS,eAAe,OAAO,QAAQ,OAAO,QAAQ,MAAM,CAAC;AACtE;;;;;;;AAQA,SAAgB,WAAW,OAAoC;CAC7D,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,MAAM,QAAQ,MAAM,MAAM,GAAG,OAAO,SAAS,CAAC,CAAC,UAAU,wCAAwC,CAAC,CAAC;CAC5H,MAAM,MAAiB,CAAC;CACxB,IAAI,MAAM,WAAA,oBAAkC,IAAI,KAAK,CAAC,UAAU,iBAAiB,KAAK,MAAM,MAAM,EAAE,QAAQ,uBAAuB,CAAC;CACpI,IAAI,OAAO,MAAM,WAAW,YAAY,MAAM,WAAW,IAAI,IAAI,KAAK,CAAC,UAAU,8BAA8B,CAAC;CAChH,IAAI,OAAO,MAAM,YAAY,UAAU,IAAI,KAAK,CAAC,UAAU,0BAA0B,CAAC;CACtF,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,EAAE,IAAI;CAC5C,MAAM,OAAO,SAAS,GAAG,MAAM;EAC7B,IAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,GAAG,IAAI,KAAK,CAAC,aAAa,2BAA2B,EAAE,KAAK,WAAW,CAAC;EACtG,MAAM,UAAkC,MAAM,QAAQ,EAAE,OAAO,IAAI,EAAE,UAAU,CAAC;EAChF,IAAI,QAAQ,WAAW,GAAG;GACxB,IAAI,KAAK,CAAC,WAAW,aAAa,EAAE,KAAK,gBAAgB,CAAC;GAC1D;EACF;EACA,MAAM,MAAM,QAAQ,KAAK,MAAM,EAAE,EAAE;EACnC,QAAQ,SAAS,GAAG,MAAM;GACxB,IAAI,IAAI,QAAQ,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,CAAC,aAAa,aAAa,EAAE,KAAK,kBAAkB,EAAE,GAAG,WAAW,CAAC;GAC3G,IAAI,KAAK,GAAG,eAAe,GAAG,CAAC,CAAC;EAClC,CAAC;EACD,IAAI,CAAC,EAAE,YAAY,QAAQ,OAAO,MAAM,EAAE,YAAY,KAAA,CAAS,GAAG,IAAI,KAAK,CAAC,QAAQ,aAAa,EAAE,KAAK,qEAAqE,CAAC;CAChL,CAAC;CACD,MAAM,SAAS,KAAgB,OAAqB;EAClD,MAAM,IAAI,MAAM,OAAO,MAAM,MAAM,EAAE,SAAS,KAAK,KAAK;EACxD,IAAI,MAAM,KAAA,GAAW,IAAI,KAAK,CAAC,WAAW,GAAG,GAAG,yBAAyB,KAAK,OAAO,CAAC;OACjF,IAAI,IAAI,WAAW,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,QAAQ,MAAM,MAAM,EAAE,OAAO,IAAI,MAAM,GACrF,IAAI,KAAK,CAAC,WAAW,GAAG,GAAG,0BAA0B,EAAE,KAAK,GAAG,IAAI,UAAU,QAAQ,CAAC;CAC1F;CACA,CAAC,MAAM,eAAe,CAAC,EAAA,CAAG,SAAS,GAAG,MAAM;EAC1C,MAAM,EAAE,IAAI,kBAAkB,GAAG;EACjC,MAAM,SAAS,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,kBAAkB,GAAG;CACpE,CAAC;CACD,KAAK,MAAM,QAAQ,MAAM,SAAS,CAAC,GAAG,KAAK,MAAM,KAAK,WAAW,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,OAAO,YAAY,KAAK,OAAO,IAAI,EAAE,QAAQ,CAAC;CAClI,IAAI,MAAM,UAAU,KAAA,GACb;OAAA,MAAM,KAAK,MAAM,QAAQ,IAAI,OAAO,OAAO,EAAE,IAAI,CAAC,CAAC,WAAW,IAAI,IAAI,KAAK,CAAC,SAAS,aAAa,EAAE,KAAK,0BAA0B,CAAC;CAAA;CAC3I,MAAM,SAAS,SAAS,GAAG;CAC3B,IAAI,OAAO,SAAS,GAAG,OAAO;CAC9B,KAAK,MAAM,KAAK,MAAM,QACpB,KAAK,MAAM,KAAK,EAAE,SAAS,IAAI,EAAE,SAAS,SAAS,KAAA,GAAW,OAAO,KAAK,GAAG,SAAS,aAAa,OAAO,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,KAAK,GAAG,EAAE,IAAI,CAAC,CAAC;CAC7K,IAAI,OAAO,SAAS,GAAG,OAAO;CAC9B,KAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,MAAM,SAAS,CAAC,CAAC,GAC3D,OAAO,KAAK,GAAG,SAAS,eAAe,OAAO,QAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,oBAAoB,KAAK,IAAI,GAAG,CAAU,GAAG,CAAC,IAAI,CAAC,CAAC;CACvI,OAAO;AACT;;AAGA,SAAS,YAAY,OAAsB,QAAwB,QAAiC;CAClG,MAAM,SAA6C,CAAC;CACpD,KAAK,MAAM,KAAK,MAAM,QAAQ;EAC5B,MAAM,IAAI,OAAO,OAAO,OAAO,QAAQ,EAAE,IAAI,IAAI,OAAO,OAAO,EAAE,QAAQ,KAAA;EACzE,IAAI,MAAM,KAAA,KAAa,MAAM,MAAM;GACjC,OAAO,EAAE,QAAQ;GACjB;EACF;EACA,MAAM,IAAI,EAAE,QAAQ,MAAM,MAAM,EAAE,OAAO,EAAE,MAAM;EACjD,MAAM,QAAQ,EAAE,UAAU,CAAC;EAC3B,MAAM,SAAiB,CAAC;EACxB,KAAK,MAAM,KAAK,EAAE,QAAQ,IAAI,SAAS,GAAG,MAAM,GAAG,OAAO,EAAE,QAAQ,UAAU,GAAG,OAAO,OAAO,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,QAAS,EAAE,OAAO;EAC1I,IAAI,EAAE,YAAY,KAAA,KAAa,QAAQ;GACrC,OAAO,EAAE,QAAQ;IAAE,QAAQ,EAAE;IAAI;GAAO;GACxC;EACF;EACA,MAAM,OAAO,OAAO,OAAO,EAAE,IAAI,CAAC,CAAC;EACnC,MAAM,WAAW,EAAE,WAAW,CAAC,EAAA,CAAG,KAAK,MAAM,YAAY,MAAM,GAAG,IAAI,CAAC;EACvE,IAAI,CAAC,EAAE,QAAQ,SAAS,QAAQ,MAAM,GAAG,MAAO,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAE;EACnG,OAAO,EAAE,QAAQ;GAAE,QAAQ,EAAE;GAAI;GAAQ;EAAQ;CACnD;CACA,OAAO;EAAE,OAAO,MAAM;EAAQ;CAAO;AACvC;AAEA,MAAM,QAAQ,cAAsC,UAAU,cAAc,SAAS,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE;;;;;;AAOnG,SAAgB,gBAAgB,OAAsB,QAAwC;CAC5F,MAAM,WAAW,eAAe,OAAO,QAAQ,KAAK;CACpD,IAAI,SAAS,SAAS,GAAG,MAAM,IAAI,MAAM,2BAA2B,MAAM,OAAO,gBAAgB,SAAS,KAAK,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE;CACxI,OAAO,YAAY,OAAO,QAAQ,KAAK;AACzC;;;;;AAMA,SAAgB,SAAS,OAAsB,QAAgC;CAC7E,OAAO,KAAK,gBAAgB,OAAO,MAAM,CAAC;AAC5C;;AAGA,SAAS,YAAY,OAA4B;CAC/C,MAAM,SAAS,WAAW,KAAK;CAC/B,IAAI,OAAO,SAAS,GAAG,MAAM,IAAI,MAAM,aAAa,OAAO,OAAO,MAAM,EAAE,gBAAgB,OAAO,KAAK,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE;AACrI;;AAGA,SAAS,YAAY,OAAe,MAAc,KAAmB;CACnE,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,MAAM,IAAI,WAAW,cAAc,KAAK,MAAM,MAAM,0BAA0B,IAAI,UAAU;AAC3I;;AAGA,SAAS,UAAU,GAAuB;CACxC,MAAM,MAAM,EAAE;CACd,MAAM,OAAO,EAAE,SAAS,EAAE,SAAS,QAAQ,IAAI,KAAA;CAC/C,IAAI,SAAS,KAAA,GAAW,OAAO,EAAE;CACjC,OAAO,MAAM,KAAK,OAAO,EAAE,MAAO,OAAO,OAAO,IAAI,IAAI;AAC1D;;AAGA,SAAS,KAAK,GAAe,GAAW,QAAwB;CAC9D,MAAM,MAAM,EAAE;CACd,MAAM,OAAO,EAAE,SAAS,EAAE,SAAS,QAAQ,IAAI,KAAA;CAC/C,IAAI,IAAI,SAAS,KAAA,IAAY,IAAI,MAAM,KAAK,OAAO,IAAI,OAAO,IAAI,IAAI;CACtE,IAAI,KAAK,IAAI,UAAU,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC;CAC3C,OAAO,EAAE,SAAS,QAAQ,KAAK,KAAK,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,KAAM,KAAK,IAAI,KAAK,SAAS,GAAG,MAAM,CAAC,CAAC;AACrG;;AAGA,SAAS,KAAK,GAAe,GAAmB;CAC9C,MAAM,MAAM,EAAE;CACd,MAAM,MAAM,EAAE;CACd,IAAI,EAAE,UAAU,OAAO,OAAO,KAAK,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,EAAE;CAC1F,OAAO,MAAM,KAAK,MAAM;AAC1B;;;;;AAMA,SAAgB,YAAY,OAAmB,QAA8B;CAC3E,YAAY,QAAQ,UAAU,CAAC;CAC/B,IAAI,MAAM,SAAS,QAAQ,OAAO,CAAC,OAAO,IAAI;CAC9C,IAAI,MAAM,SAAS,QAAQ,OAAO,CAAC,GAAI,MAAM,UAAU,CAAC,CAAE;CAC1D,IAAI,WAAW,KAAK,MAAM,QAAQ,MAAM,KAAK,OAAO,CAAC,UAAU,OAAO,MAAM,OAAO,CAAC;CACpF,MAAM,MAAgB,CAAC;CACvB,MAAM,QAAQ,MAAM,SAAS,SAAS,MAAM,SAAS,KAAA,IAAY,KAAK,OAAO,UAAU,KAAK,IAAI,MAAM,QAAS,MAAM,QAAQ,EAAE,IAAI,IAAI;CACvI,IAAI,SAAS,UAAU,MAAM,UAAU,OACrC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,IAAI,KAAK,KAAK,OAAO,MAAM,MAAO,KAAK,MAAM,QAAQ,IAAI,EAAE,CAAC;MAE5F,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,IAAI,KAAK,KAAK,OAAO,KAAK,OAAO,KAAK,SAAS,EAAE,GAAG,EAAE,CAAC;CAE1F,OAAO,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC;AACzB;;AAGA,MAAM,aAAa,QAA+B,MAAuB,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,MAAM,UAAU,OAAO,EAAE,CAAE,IAAI;;AAG1I,SAAS,YAAY,QAA+B,QAAgB,IAAI,GAAG,SAAiB,CAAC,GAAW;CACtG,IAAI,MAAM,OAAO,QAAQ,OAAO;CAChC,MAAM,IAAI,OAAO;CACjB,IAAI,CAAC,SAAS,GAAG,MAAM,GAAG,OAAO,YAAY,QAAQ,QAAQ,IAAI,GAAG,MAAM;CAC1E,MAAM,KAAK,YAAY,GAAG,MAAM;CAChC,IAAI,CAAC,UAAU,QAAQ,CAAC,GAAG,OAAO,OAAO,GAAG,MAAM,IAAI,YAAY,QAAQ,QAAQ,IAAI,GAAG,MAAM;CAC/F,IAAI,MAAM;CACV,KAAK,MAAM,KAAK,IAAI,OAAO,YAAY,QAAQ,QAAQ,IAAI,GAAG;EAAE,GAAG;GAAS,EAAE,OAAO;CAAE,CAAC;CACxF,OAAO;AACT;;AAGA,UAAU,WAAW,QAA+B,QAAgB,IAAI,GAAG,SAAiB,CAAC,GAAsB;CACjH,IAAI,MAAM,OAAO,QAAQ;EACvB,MAAM,EAAE,GAAG,OAAO;EAClB;CACF;CACA,MAAM,IAAI,OAAO;CACjB,IAAI,CAAC,SAAS,GAAG,MAAM,GAAG;EACxB,OAAO,WAAW,QAAQ,QAAQ,IAAI,GAAG,MAAM;EAC/C;CACF;CACA,KAAK,MAAM,KAAK,YAAY,GAAG,MAAM,GAAG,OAAO,WAAW,QAAQ,QAAQ,IAAI,GAAG;EAAE,GAAG;GAAS,EAAE,OAAO;CAAE,CAAC;AAC7G;AAUA,MAAM,aAAa,YAAiD,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC,CAAC;AAC5H,MAAM,SAAS,OAAsB,aAA+B,MAAM,eAAe,CAAC,EAAA,CAAG,OAAO,MAAM,MAAM,GAAG,UAAU,OAAO,CAAC,CAAC;;AAGtI,SAAS,YAAY,MAAc,MAAkB,OAA8B;CACjF,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;EACzC,IAAI,IAAI;EACR,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;GAC1B,IAAK,KAAK,OAAO,OAAO,CAAC,MAAO,KAAK,UAAU,KAAK,OAAO,IAAI,CAAC;GAChE,IAAI,KAAK,IAAI;EACf;EACA,IAAI,KAAK,IAAI;EACb,OAAO;EACP,IAAI,MAAM,OAAO,OAAO;CAC1B;CACA,OAAO;AACT;;AAGA,MAAM,SAAS,GAAkB,GAAkB,UAAkC,MAAM,QAAQ,MAAM,OAAO,OAAO,IAAI,IAAI,QAAQ,OAAO,IAAI;;;;;AAMlJ,SAAS,OAAO,OAAsB,QAAgB,MAAe,OAAwB;CAC3F,IAAI,MAAM,UAAU,KAAA,KAAa,MAAM,MAAM,SAAS,GAAG;EACvD,IAAI,MAAe,CAAC;GAAE,yBAAS,IAAI,IAAI;GAAG,MAAM;GAAM,QAAQ;EAAG,CAAC;EAClE,KAAK,MAAM,QAAQ,MAAM,OAAO;GAC9B,MAAM,OAAO,GAAG,KAAK,OAAO;GAC5B,MAAM,MAAM,OAAO,MAAM,QAAQ,MAAM,KAAK;GAC5C,MAAM,OAAgB,CAAC;GACvB,KAAK,MAAM,KAAK,KACd,KAAK,MAAM,KAAK,KAAK;IACnB,MAAM,UAAU,IAAI,IAAI,EAAE,OAAO;IACjC,KAAK,MAAM,CAAC,GAAG,MAAM,EAAE,SAAS,QAAQ,IAAI,OAAO,GAAG,CAAC;IACvD,MAAM,OAAO,EAAE,QAAQ,EAAE;IACzB,KAAK,KAAK;KAAE;KAAS;KAAM,QAAQ,OAAO,EAAE,SAAU,EAAE,SAAU,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK;IAAE,CAAC;GACtG;GACF,MAAM;EACR;EACA,OAAO,IAAI,QAAQ,MAAM,MAAM,OAAO,EAAE,OAAO,CAAC;CAClD;CACA,MAAM,yBAAS,IAAI,IAAyB;CAC5C,MAAM,WAAW,MAA2B;EAC1C,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,OAAO,IAAI,GAAG,YAAY,EAAE,QAAQ,MAAM,CAAC;EAC/D,OAAO,OAAO,IAAI,CAAC;CACrB;CACA,MAAM,MAAe,CAAC;CACtB,MAAM,SAAS,MAAM;CACrB,MAAM,QAAQ,GAAW,SAA0C,WAAyB;EAC1F,IAAI,MAAM,OAAO,QAAQ;GACvB,IAAI,MAAM,OAAO,OAAO,GAAG,IAAI,KAAK;IAAE,SAAS,IAAI,IAAI,OAAO;IAAG,MAAM;IAAM;GAAO,CAAC;GACrF;EACF;EACA,MAAM,IAAI,OAAO;EACjB,MAAM,OAA+B,EAAE,QAAQ,QAAQ,MAAM,EAAE,YAAY,KAAA,CAAS;EACpF,IAAI,EAAE,UAAU,KAAK,KAAK,IAAI;EAC9B,KAAK,MAAM,KAAK,MAAM;GACpB,QAAQ,IAAI,EAAE,MAAM,CAAC;GACrB,KAAK,IAAI,GAAG,SAAS,MAAM,OAAO,SAAS,SAAS,QAAQ,CAAC,CAAC;EAChE;EACA,QAAQ,OAAO,EAAE,IAAI;CACvB;CACA,KAAK,mBAAG,IAAI,IAAI,GAAG,EAAE;CACrB,IAAI,CAAC,MAAM,OAAO;CAClB,MAAM,OAAO,IAAI,QAAQ,KAAK,MAAM,MAAM,EAAE,QAAS,EAAE;CACvD,KAAK,MAAM,KAAK,QACd,KAAK,MAAM,KAAK,EAAE,SAAS;EACzB,IAAI,EAAE,YAAY,KAAA,GAAW;EAC7B,MAAM,UAAU,IAAI,IAAgC,OAAO,KAAK,MAAM,CAAC,EAAE,MAAM,MAAM,IAAI,IAAI,IAAI,CAAC,CAAC;EACnG,MAAM,QAAQ,EAAE,QAAQ,SAAS,KAAA,IAAY,YAAY,MAAM,EAAE,SAAS,KAAK,IAAI,OAAO,EAAE,QAAQ,KAAK,MAAM;EAC/G,IAAI,MAAM,OAAO,OAAO,GAAG,IAAI,KAAK;GAAE;GAAS,MAAM;GAAO,QAAQ,MAAM,QAAQ,CAAC,GAAG,OAAO,KAAK;EAAE,CAAC;CACvG;CACF,OAAO;AACT;;;;;;;AAQA,SAAgB,UAAU,OAAsB,SAAsC;CACpF,YAAY,KAAK;CACjB,YAAY,QAAQ,QAAQ,UAAU,CAAC;CACvC,aAAa,QAAQ,MAAM;CAC3B,OAAO,OAAO,SAAS,OAAO,QAAQ,MAAM,GAAG,QAAQ,QAAQ,QAAQ,WAAW,OAAO,GAAG;AAC9F;;;;;;AAOA,SAAS,SAAS,OAAsB,QAAyD;CAC/F,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,MAAM,OAAsB;EAC1B,GAAG;EACH,QAAQ,MAAM,OAAO,KAAK,OAAO;GAAE,GAAG;GAAG,SAAS,EAAE,QAAQ,QAAQ,MAAM,eAAe,GAAG,MAAM,CAAC;EAAE,EAAE;EACvG,GAAI,MAAM,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM,KAAK,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE;CAC5F;CACA,MAAM,YAAY,GAAe,MAAkC;EACjE,IAAI,EAAE,SAAS,SAAS,KAAA,GAAW,OAAO,CAAC,CAAC;EAC5C,MAAM,OAAO,OAAO,MAAM,EAAE,IAAI,CAAC,CAAC;EAClC,MAAM,OAAO,EAAE,QAAQ,KAAK,QAAQ,UAAU,KAAK,MAAM,KAAK,CAAC;EAC/D,OAAO,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC;GAAE,GAAG;GAAG,SAAS;IAAE,GAAG,EAAE;IAAS;GAAK;EAAE,CAAC;CAC5E;CACA,OAAO;EAAE,GAAG;EAAM,QAAQ,KAAK,OAAO,KAAK,OAAO;GAAE,GAAG;GAAG,SAAS,EAAE,QAAQ,SAAS,MAAM,SAAS,GAAG,CAAC,CAAC;EAAE,EAAE;CAAE;AAClH;;AAGA,SAAS,aAAa,QAAgD;CACpE,IAAI,WAAW,KAAA,GAAW;CAC1B,IAAI,CAAC,MAAM,QAAQ,MAAM,GAAG,MAAM,IAAI,WAAW,iDAAiD;CAClG,KAAK,MAAM,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,GAAG,MAAM,IAAI,WAAW,kBAAkB,KAAK,CAAC,EAAE,iBAAiB,eAAe,KAAK,IAAI,EAAE,EAAE;AAC3I;;AAGA,SAAS,OAAO,OAAsB,QAAgB,OAA0B;CAC9E,IAAI,OAAO;CACX,IAAI,OAAsB;CAC1B,KAAK,MAAM,KAAK,OAAO,OAAO,QAAQ,MAAM,KAAK,GAC/C,IAAI,EAAE,MAAM,QAAQ,EAAE;MACjB,OAAO,SAAS,QAAQ,EAAE,WAAW,QAAQ,OAAO,EAAE,SAAS,QAAQ,OAAO,OAAO,EAAE;CAE9F,OAAO;EAAE;EAAM;CAAK;AACtB;;AAGA,UAAU,QAAW,OAAkC,IAAI,GAAG,MAAW,CAAC,GAAmB;CAC3F,IAAI,MAAM,MAAM,QAAQ;EACtB,MAAM,CAAC,GAAG,GAAG;EACb;CACF;CACA,KAAK,MAAM,KAAK,MAAM,IAAK;EACzB,IAAI,KAAK,CAAC;EACV,OAAO,QAAQ,OAAO,IAAI,GAAG,GAAG;EAChC,IAAI,IAAI;CACV;AACF;;AAGA,SAAS,YAAY,OAAsB,QAAgB,OAAe,QAA4D;CACpI,MAAM,OAAO,SAAS,OAAO,MAAM;CACnC,MAAM,OAAO,OAAO,MAAM,QAAQ,EAAE,CAAC,CAAC;CACtC,IAAI,OAAO,OAAO,KAAK,GAAG,MAAM,IAAI,WAAW,yBAAyB,MAAM,OAAO,OAAO,KAAK,gCAAgC,MAAM,EAAE;CACzI,MAAM,MAAwB,CAAC;CAC/B,KAAK,MAAM,KAAK,OAAO,MAAM,QAAQ,OAAO,EAAE,GAAG;EAC/C,MAAM,QAAQ,CAAC,GAAG,EAAE,QAAQ,KAAK,CAAC;EAClC,MAAM,QAAQ,MAAM,KAAK,MAAM;GAC7B,MAAM,IAAI,EAAE,QAAQ,IAAI,CAAC;GACzB,OAAO,MAAM,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,WAAW,EAAE,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAK,YAAyB;IAAE,QAAQ,EAAE;IAAI;GAAO,EAAE;EACxH,CAAC;EACD,KAAK,MAAM,OAAO,QAA4B,KAAK,GAAG,IAAI,KAAK,YAAY,OAAO;GAAE,OAAO,MAAM;GAAQ,QAAQ,OAAO,YAAY,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,EAAG,CAAC,CAAC;EAAE,GAAG,KAAK,CAAC;CAClL;CACA,OAAO;AACT;;AAGA,SAAS,YAAY,GAAW,GAA2B;CACzD,MAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAC;CACjD,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;EAC9B,MAAM,IAAI,KAAK,MAAM,EAAE,KAAK,IAAI,EAAE;EAClC,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,IAAK,IAAI,EAAG;CACtC;CACA,OAAO;AACT;;AAGA,SAAS,YAAY,GAAe,GAAuB;CACzD,IAAI,EAAE,SAAS,QAAQ,OAAO,KAAK;CACnC,IAAI,EAAE,SAAS,QAAQ;EACrB,MAAM,SAAS,EAAE;EACjB,OAAO,OAAO,KAAK,IAAI,OAAO,SAAS,GAAG,KAAK,MAAM,IAAI,OAAO,MAAM,CAAC;CACzE;CACA,IAAI,EAAE,QAAQ,EAAE,KAAK,OAAO,UAAU,GAAG,EAAE,GAAI;CAC/C,IAAI,EAAE,UAAU,UAAU,EAAE,SAAS,SAAS,EAAE,SAAS,KAAA,IAAY;EACnE,MAAM,QAAQ,KAAK,OAAO,UAAU,CAAC,IAAI,EAAE,QAAS,EAAE,QAAQ,EAAE,IAAI;EACpE,OAAO,KAAK,GAAG,EAAE,MAAO,KAAK,IAAI,QAAQ,GAAG,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,QAAQ,IAAI,CAAC;CACvF;CACA,OAAO,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC;AAC9B;;AAGA,MAAM,WAAW,MAAc,SAAyB,KAAK,MAAM,WAAW,MAAM,IAAI,CAAC,CAAC,IAAI,UAAU;;AAGxG,SAAS,cAAc,OAAsB,GAAW,MAAc,MAAe,UAAoC;CACvH,MAAM,SAAS,MAAM;CACrB,MAAM,SAAS,SAAS,KAAK;CAC7B,MAAM,QAAQ,OAAO,KAAK,MAAM;EAC9B,MAAM,OAA+B,EAAE,QAAQ,QAAQ,MAAM,QAAQ,EAAE,YAAY,KAAA,CAAS;EAC5F,IAAI,EAAE,UAAU,KAAK,KAAK,IAAI;EAC9B,IAAI,KAAK,WAAW,GAAG,MAAM,IAAI,MAAM,aAAa,EAAE,KAAK,gBAAgB,MAAM,OAAO,2EAA2E;EACnK,OAAO;CACT,CAAC;CACD,MAAM,SAA4C,CAAC;CACnD,IAAI,QAAQ;CACZ,KAAK,IAAI,QAAQ,GAAG,OAAO,SAAS,GAAG,SAAS;EAC9C,MAAM,IAAI,WAAW,MAAM,WAAW,OAAO;EAC7C,MAAM,UAAU,MAAM,KAAK,SAAS,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,KAAK,KAAK,MAAO,IAAI,KAAK,SAAU,CAAC,EAAG,CAAC;EAC1G,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,OAAO,SAAS,GAAG,KAAK;GAC/C,IAAI,SAAS,UAAU,MAAM,IAAI,MAAM,gCAAgC,MAAM,OAAO,2BAA2B,OAAO,OAAO,MAAM,EAAE,iBAAiB,MAAM,QAAQ;GACpK;GACA,MAAM,UAAU,IAAI,IAAgC,OAAO,KAAK,GAAG,MAAM,CAAC,EAAE,MAAM,QAAQ,EAAE,CAAE,EAAG,CAAC,CAAC;GACnG,MAAM,2BAAW,IAAI,IAAoB;GACzC,KAAK,MAAM,KAAK,QAEd,IADU,QAAQ,IAAI,EAAE,IACpB,CAAC,EAAE,YAAY,KAAA,KAAa,CAAC,SAAS,IAAI,OAAO,IAAI,EAAE,IAAI,CAAE,GAAG,SAAS,IAAI,OAAO,IAAI,EAAE,IAAI,GAAI,EAAE,IAAI;GAE9G,KAAK,MAAM,KAAK,QAAQ;IACtB,MAAM,IAAI,SAAS,IAAI,OAAO,IAAI,EAAE,IAAI,CAAE;IAC1C,IAAI,MAAM,KAAA,KAAa,MAAM,EAAE,MAAM,QAAQ,IAAI,EAAE,MAAM,IAAI;GAC/D;GACA,IAAI,MAAM,OAAO,OAAO,GAAG,OAAO,KAAK,OAAO;EAChD;CACF;CACA,MAAM,SAAqB,OAAO,UAAU,OAAO,WAAW,CAAC,EAAE,CAAC;CAClE,MAAM,UAAgC,OAAO,UAAU,OAAO,UAAU,CAAC,CAAC,CAAC;CAC3E,OAAO,SAAS,GAAG,MAAM;EACvB,KAAK,MAAM,KAAK,EAAE,SAAS;GACzB,MAAM,QAAQ,OAAO,SAAS,GAAG,MAAO,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAE;GACvE,IAAI,MAAM,WAAW,GAAG;GACxB,KAAK,MAAM,KAAK,EAAE,QAAQ;IACxB,MAAM,SAAS,MAAM,QAAQ,MAAM,SAAS,GAAG,OAAO,EAAE,CAAE,EAAG,CAAC;IAC9D,MAAM,IAAI,WAAW,MAAM,SAAS,EAAE,KAAK,GAAG,EAAE,GAAG,GAAG,EAAE,MAAM;IAC9D,YAAY,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,SAAS,MAAM;KACpD,OAAO,OAAO,GAAI,CAAE,EAAE,CAAE,EAAE,QAAQ,YAAY,IAAI,UAAU,EAAE,KAAK,OAAO,MAAM;IAClF,CAAC;GACH;GACA,IAAI,EAAE,YAAY,KAAA,GAAW;GAC7B,MAAM,QAAQ,EAAE,QAAQ;GACxB,IAAI,UAAU,KAAA,GAAW;IACvB,MAAM,IAAI,WAAW,MAAM,cAAc,EAAE,KAAK,GAAG,EAAE,IAAI;IACzD,YAAY,MAAM,QAAQ,CAAC,CAAC,CAAC,SAAS,SAAS,MAAM;KACnD,QAAQ,MAAM,GAAI,CAAE,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,MAAM,SAAS,GAAG,KAAK,OAAQ,UAAU,EAAE,KAAK,MAAM,SAAU,MAAM,MAAM,CAAC,EAAG;IAC9H,CAAC;IACD;GACF;GACA,MAAM,OAAO,OAAO,OAAO,EAAE,IAAI,CAAC,CAAC;GACnC,MAAM,WAAW,KAAK,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,CAAC;GACjD,MAAM,uBAAO,IAAI,IAAY;GAC7B,MAAM,OAAO,cAAc,MAAM,UAAU,QAAQ,MAAM,QAAQ,EAAE,KAAK,GAAG,EAAE,IAAI,GAAG,OAAO,KAAK,IAAI,KAAM,MAAM,QAAQ,CAAC,CAAC,CAAC,QAAQ,MAAM;IACvI,MAAM,KAAK,KAAK,CAAC;IACjB,OAAO,KAAK,IAAI,EAAE,IAAI,SAAS,KAAK,IAAI,EAAE,GAAG;GAC/C,CAAC;GACD,MAAM,IAAI,WAAW,MAAM,WAAW,EAAE,KAAK,GAAG,EAAE,IAAI;GACtD,MAAM,EAAE,KAAK,QAAQ,EAAE;GACvB,YAAY,MAAM,QAAQ,CAAC,CAAC,CAAC,SAAS,SAAS,MAAM;IACnD,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,KAAK,KAAK,OAAQ,UAAU,EAAE,KAAK,MAAM,UAAW,MAAM,MAAM,EAAE,CAAC;IACtG,IAAI,KAAK,SAAS,OAAO,MAAM,IAAI,MAAM,aAAa,KAAK,OAAO,YAAY,KAAK,OAAO,yCAAyC,MAAM,cAAc,EAAE,KAAK,GAAG,EAAE,GAAG,EAAE;IACxK,MAAM,SAAS,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK;IACzD,QAAQ,MAAM,GAAI,CAAE,KAAK,OAAO,KAAK,MAAM,KAAK,EAAG;GACrD,CAAC;EACH;CACF,CAAC;CACD,OAAO,OAAO,KAAK,SAAS,MAAM;EAChC,MAAM,MAA0C,CAAC;EACjD,OAAO,SAAS,GAAG,MAAM;GACvB,MAAM,IAAI,QAAQ,IAAI,EAAE,IAAI;GAC5B,IAAI,EAAE,QAAQ,MAAM,OAAO,OAAO,EAAE,YAAY,KAAA,IAAY;IAAE,QAAQ,EAAE;IAAI,QAAQ,OAAO,EAAE,CAAE;GAAI,IAAI;IAAE,QAAQ,EAAE;IAAI,QAAQ,OAAO,EAAE,CAAE;IAAK,SAAS,QAAQ,EAAE,CAAE;GAAI;EAC1K,CAAC;EACD,OAAO,gBAAgB,OAAO;GAAE,OAAO,MAAM;GAAQ,QAAQ;EAAI,CAAC;CACpE,CAAC;AACH;;;;;;;;;;AAWA,SAAgB,eAAe,OAAsB,SAA6C;CAChG,YAAY,KAAK;CACjB,aAAa,QAAQ,MAAM;CAC3B,IAAI,QAAQ,SAAS,QAAQ;EAC3B,YAAY,QAAQ,QAAQ,UAAU,CAAC;EACvC,OAAO,YAAY,OAAO,QAAQ,QAAQ,QAAQ,SAAS,KAAS,QAAQ,MAAM;CACpF;CACA,IAAI,QAAQ,SAAS,UAAU,MAAM,IAAI,WAAW,YAAY,OAAQ,QAA+B,IAAI,EAAE,wBAAwB;CACrI,YAAY,QAAQ,GAAG,KAAK,CAAC;CAC7B,IAAI,CAAC,OAAO,UAAU,QAAQ,IAAI,GAAG,MAAM,IAAI,WAAW,YAAY,QAAQ,KAAK,wBAAwB;CAC3G,MAAM,OAAO,QAAQ,QAAQ;CAC7B,IAAI,SAAS,UAAU,SAAS,UAAU,MAAM,IAAI,WAAW,sBAAsB,OAAO,IAAI,EAAE,sBAAsB;CACxH,IAAI,QAAQ,MAAM,GAAG,OAAO,CAAC;CAC7B,OAAO,cAAc,SAAS,OAAO,QAAQ,MAAM,GAAG,QAAQ,GAAG,QAAQ,MAAM,SAAS,UAAU,QAAQ,YAAY,KAAK,IAAI,KAAM,MAAM,QAAQ,CAAC,CAAC;AACvJ;;;;;AAMA,SAAgB,gBAAgB,OAAmC;CACjE,YAAY,KAAK;CACjB,OAAO,eAAe,QAAQ,MAAM,OAAO,SAAS,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;AACnF;;;;;AAMA,SAAgB,YAAY,OAAe,OAAkD;CAC3F,MAAM,SAA6C,CAAC;CACpD,KAAK,MAAM,QAAQ,OAAO,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,MAAM,GAAG,OAAO,GAAG,KAAK,MAAM,GAAG,OAAO;CAC3G,OAAO;EAAE;EAAO;CAAO;AACzB;;AAGA,SAAgB,YAAY,QAAwB,QAAgC;CAClF,MAAM,OAAO,GAAG,OAAO;CACvB,MAAM,UAAU,OAAO,QAAQ,OAAO,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,IAAI,CAAC;CAChF,IAAI,QAAQ,WAAW,GAAG,MAAM,IAAI,WAAW,2BAA2B,OAAO,MAAM,4BAA4B,OAAO,EAAE;CAC5H,OAAO;EAAE,OAAO;EAAQ,QAAQ,OAAO,YAAY,QAAQ,KAAK,CAAC,GAAG,OAAO,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC;CAAE;AACzG;;;;;AAMA,SAAgB,aAAa,GAAkB,GAAkB,MAA6B;CAC5F,IAAI,EAAE,WAAW,EAAE,QAAQ,MAAM,IAAI,WAAW,uCAAuC,EAAE,OAAO,EAAE;CAClG,IAAI,SAAS,IAAI,MAAM,IAAI,WAAW,gCAAgC;CACtE,MAAM,YAAY,MAAmC,EAAE,OAAO,KAAK,OAAO;EAAE,GAAG;EAAG,MAAM,GAAG,EAAE,OAAO,GAAG,EAAE;CAAO,EAAE;CAClH,MAAM,OAAO,GAAkB,OAA6B;EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE;EAAS,QAAQ,EAAE;CAAO;CAChH,MAAM,iBAAiB,OACpB,EAAE,eAAe,CAAC,EAAA,CAAG,KAAK,OAAO;EAAE,IAAI,IAAI,GAAG,EAAE,EAAE;EAAG,MAAM,SAAS,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI;CAAE,EAAE;CAC/H,MAAM,QAAwC,CAAC;CAC/C,KAAK,MAAM,CAAC,IAAI,OAAO,OAAO,QAAQ,EAAE,SAAS,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,IAAI,OAAO,OAAO,QAAQ,EAAE,SAAS,CAAC,CAAC,GAAG,MAAM,GAAG,GAAG,GAAG,QAAQ,YAAY,MAAM,CAAC,IAAI,EAAE,CAAC;CAC7J,MAAM,cAAc,CAAC,GAAG,cAAc,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC;CAC7D,OAAO;EACL,QAAQ;EACR,QAAQ;EACR,SAAS,GAAG,EAAE,OAAO,GAAG,EAAE,QAAQ,GAAG,EAAE,OAAO,GAAG,EAAE;EACnD,QAAQ,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;EACvC,GAAI,YAAY,SAAS,IAAI,EAAE,YAAY,IAAI,CAAC;EAChD,GAAI,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;EACjD,OAAO,CAAC,GAAG,CAAC;CACd;AACF;;;;;;AC1+BA,MAAa,oBAAoB;;AAGjC,MAAa,oBAAoB;;AAGjC,MAAa,eAAe;;AAG5B,MAAa,gBAAgB;;AAG7B,MAAa,eAAe;;AA+H5B,MAAM,UAAU,WAAsC,OAAO,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO;;AAGjG,SAAS,WAAW,QAA2B,GAAmB;CAChE,MAAM,MAAM,OAAO,SAAS,KAAK;CACjC,MAAM,KAAK,KAAK,MAAM,EAAE;CACxB,MAAM,KAAK,KAAK,KAAK,EAAE;CACvB,OAAO,OAAO,OAAQ,OAAO,MAAO,OAAO,QAAS,KAAK;AAC3D;;AAGA,SAAS,WAAW,MAAc,SAAmB,OAAgC;CACnF,QAAQ,MAAM,GAAG,MAAM,IAAI,CAAC;CAC5B,OAAO;EAAE;EAAM,IAAI,WAAW,SAAS,QAAQ,CAAC;EAAG,IAAI,WAAW,SAAS,IAAI,QAAQ,CAAC;CAAE;AAC5F;;AAGA,MAAM,WAAW,GAAoB,SAA2B,OAAO,IAAI,EAAE,KAAK,IAAI,OAAO,IAAI,EAAE,KAAK,IAAI;;AAG5G,SAAS,MAAM,MAAc,QAAwB;CACnD,MAAM,IAAI,OAAO;CACjB,IAAI,MAAM,GAAG,OAAO;CACpB,MAAM,IAAI,KAAK,IAAI,MAAM,MAAM;CAC/B,IAAI,OAAO;CACX,IAAI,IAAI;CACR,KAAK,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK;EAC3B,QAAQ;EACR,IAAK,KAAK,IAAI,MAAO,IAAI;CAC3B;CACA,OAAO,KAAK,IAAI,GAAI,IAAI,OAAQ,KAAK,CAAC;AACxC;;AAGA,SAAS,UAAU,UAAoC,MAA8B;CACnF,MAAM,OAAO,SAAS,QAAQ,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CAElD,OAAO;EAAE,SADO,SAAS,IAAI,IAAI,SAAS,QAAQ,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;EACxD,IAAI,SAAS;EAAQ;CAAK;AAC9C;;AAGA,SAAS,UAAU,OAAqB,MAAc,SAAiC;CACrF,MAAM,OAAO,QAAQ,SAAS,IAAI,KAAK,KAAK,QAAQ,KAAK,GAAG,QAAQ,SAAS,IAAI,QAAQ,OAAO;CAChG,MAAM,OAAO,OAAO,IAAI,WAAW;CACnC,MAAM,QAAQ,OAAO,IAAI,UAAU;CACnC,MAAM,QAAQ,QAAQ,YAAY,IAAI,SAAS,OAAO,QAAQ,OAAO;CACrE,IAAI,UAAU,YAAY,UAAU,SAAS,OAAO,GAAG,MAAM,sBAAsB,MAAM,MAAM,MAAM,MAAM,QAAQ,KAAK;CACxH,IAAI,SAAS,GAAG,OAAO,GAAG,MAAM,6BAA6B,QAAQ,GAAG,WAAW;CACnF,OAAO,GAAG,MAAM,IAAI,KAAK,uBAAuB,MAAM,MAAM,MAAM,MAAM,QAAQ,KAAK;AACvF;;AAGA,MAAM,WAAW,MAAuB,OAAO,UAAU,CAAC,KAAK,IAAI;;AAGnE,SAAS,SAAkC,MAA8C;CACvF,OAAO,OAAO,SAAS,YAAY,MAAM,EAAE,aAAa,OAAO;AACjE;;AAGA,SAAS,QAAiC,SAAsB,SAAkE;CAChI,MAAM,MAAM,SAAS,QAAQ,CAAC;CAC9B,MAAM,MAAM,SAAS,QAAQ,CAAC;CAC9B,MAAM,wBAAQ,IAAI,IAA8B;CAChD,KAAK,MAAM,KAAK,SAAS;EACvB,MAAM,MAAM,IAAI,CAAC;EACjB,MAAM,MAAM,IAAI,CAAC;EACjB,IAAI,OAAO,KAAK,MAAM,IAAI,WAAW,qCAAqC,EAAE,MAAM,sBAAsB;EACxG,IAAI,CAAC,OAAO,CAAC,KAAK;EAClB,MAAM,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE;EAC5B,MAAM,QAAQ,MAAM,IAAI,GAAG,KAAK,CAAC;EACjC,MAAM,OAAO,MAAM,MAAM;EACzB,IAAI,MAAM,UAAU,KAAA,GAAW,MAAM,IAAI,WAAW,qBAAqB,KAAK,iCAAiC,EAAE,MAAM,iBAAiB,EAAE,MAAM;EAChJ,MAAM,QAAQ;EACd,MAAM,IAAI,KAAK,KAAK;CACtB;CACA,MAAM,QAAgB,CAAC;CACvB,MAAM,UAAoB,CAAC;CAC3B,MAAM,KAAK,QAAQ,QAAQ;CAC3B,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,QAAQ,OAAO;EACnC,MAAM,KAAK,GAAG,YAAY,KAAA,IAAY,GAAG,SAAS,MAAM,KAAA;EACxD,MAAM,KAAK,GAAG,YAAY,KAAA,IAAY,GAAG,SAAS,MAAM,KAAA;EACxD,IAAI,MAAM,KAAA,KAAa,MAAM,KAAA,KAAa,OAAO,KAAA,KAAa,OAAO,KAAA,GAAW;GAC9E,QAAQ,KAAK,GAAG;GAChB;EACF;EACA,IAAI,CAAC,OAAO,SAAS,EAAE,KAAK,CAAC,OAAO,SAAS,EAAE,GAAG,MAAM,IAAI,WAAW,wBAAwB,GAAG,iBAAiB,EAAE,MAAM,gBAAgB;EAC3I,MAAM,SAAS,QAAQ,OAAO,CAAC;EAC/B,IAAI,QAAQ,OAAO,CAAC,MAAM,QAAQ,MAAM,IAAI,WAAW,0CAA0C,EAAE,MAAM,0BAA0B;EACnI,MAAM,KAAK;GAAE;GAAK;GAAQ,GAAG;GAAI,GAAG;GAAI,GAAG,QAAQ,QAAQ,cAAc,WAAW,KAAK,KAAK,KAAK;EAAG,CAAC;CACzG;CACA,MAAM,MAAM,GAAG,MAAO,EAAE,SAAS,EAAE,SAAS,KAAK,EAAE,SAAS,EAAE,SAAS,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,CAAE;CACtH,QAAQ,KAAK;CACb,OAAO;EAAE;EAAO;CAAQ;AAC1B;;;;;;;;;;;;AAaA,SAAgB,QAAiC,SAAsB,SAA2C;CAChH,MAAM,EAAE,KAAK,OAAO,YAAY;CAChC,IAAI,QAAQ,OAAO,UAAU,MAAM,IAAI,WAAW,uCAAuC,OAAO,QAAQ,EAAE,EAAE,EAAE;CAC9G,IAAI,QAAQ,KAAA,MAAc,OAAO,QAAQ,WAAW,EAAE,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,MAAM,IAAI,WAAW,yEAAyE;CAClL,IAAI,UAAU,KAAA,KAAa,EAAE,QAAQ,KAAK,QAAQ,IAAI,MAAM,IAAI,WAAW,qDAAqD;CAChI,MAAM,OAAO,QAAQ,QAAA;CACrB,MAAM,QAAQ,QAAQ,SAAA;CACtB,MAAM,OAAO,QAAQ,QAAA;CACrB,MAAM,WAAW,QAAQ,YAAA;CACzB,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,GAAG,MAAM,IAAI,WAAW,mDAAmD;CAC/G,IAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,WAAW,KAAK,WAAA,IAA8B,MAAM,IAAI,WAAW,kDAAoE;CAE1K,MAAM,EAAE,OAAO,YAAY,QAAQ,SAAS,OAAO;CACnD,MAAM,IAAI,MAAM;CAChB,IAAI,MAAM,GAAG,MAAM,IAAI,WAAW,oDAAoD,QAAQ,IAAI;CAElG,MAAM,yBAAS,IAAI,IAAoB;CACvC,KAAK,MAAM,KAAK,OAAO,OAAO,IAAI,EAAE,QAAQ,CAAC,GAAI,OAAO,IAAI,EAAE,MAAM,KAAK,CAAC,GAAI,CAAC,CAAC;CAChF,MAAM,QAAQ,CAAC,GAAG,OAAO,OAAO,CAAC;CACjC,MAAM,OAAO;EAAE,WAAW,QAAQ;EAAW,WAAW;CAAI;CAC5D,MAAM,WAA4B,MAAM,KAAK,SAAS;EACpD,MAAM,YAAY,eAAe,OAAO,KAAK,KAAK,MAAM,EAAE,CAAC,CAAC,GAAG,OAAO,KAAK,KAAK,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI;EACjG,OAAO;GAAE,QAAQ,KAAK,EAAE,CAAE;GAAQ,GAAG,KAAK;GAAQ,MAAM,OAAO,KAAK,KAAK,MAAM,EAAE,CAAC,CAAC;GAAG,MAAM,cAAc,WAAW,IAAI,cAAc,UAAU,KAAK;EAAE;CAC1J,CAAC;CAGD,MAAM,YAAY,OAAO,SAAS,KAAK,MAAM,EAAE,IAAI,CAAC;CACpD,MAAM,KAAK,WAAW,MAAM,oBAAoB;CAChD,MAAM,eAAyB,CAAC;CAChC,KAAK,IAAI,MAAM,GAAG,MAAM,MAAM,OAAO;EACnC,IAAI,MAAM;EACV,KAAK,MAAM,QAAQ,OAAO;GACxB,IAAI,IAAI;GACR,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,MAAM,GAAG,IAAI,KAAK,MAAM,EAAE,CAAE;GACjF,OAAO,IAAI,KAAK;EAClB;EACA,aAAa,KAAK,MAAM,MAAM,MAAM;CACtC;CACA,MAAM,aAAa,WAAW,WAAW,cAAc,KAAK;CAE5D,MAAM,aAAa,OAAO,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;CAC/C,MAAM,KAAK,WAAW,MAAM,gBAAgB;CAC5C,MAAM,gBAA0B,CAAC;CACjC,KAAK,IAAI,MAAM,GAAG,MAAM,MAAM,OAAO;EACnC,IAAI,IAAI;EACR,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,KAAK,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,CAAE;EAC9D,cAAc,KAAK,IAAI,CAAC;CAC1B;CACA,MAAM,SAAS,WAAW,YAAY,eAAe,KAAK;CAG1D,MAAM,QAAQ,MAAM,SAAS,SAAS,KAAK,KAAK,MAAM,EAAE,KAAK,MAAM,SAAS,KAAK,OAAO,CAAC;CACzF,MAAM,WAAW,KAAK,IAAI,MAAM,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC,CAAC;CAC1D,MAAM,QAAQ,QAAQ,MAAM,QAAQ,GAAG,MAAM,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC;CAC/D,MAAM,QAAQ,KAAK;CACnB,IAAI,OAAO;CACX,IAAI;CACJ,IAAI,OAAO;EACT,QAAQ,KAAK;EACb,KAAK,IAAI,OAAO,GAAG,OAAO,OAAO,QAAQ;GACvC,IAAI,IAAI;GACR,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,KAAK,OAAQ,KAAK,IAAK,CAAC,MAAM,KAAM,MAAM;GACtE,IAAI,KAAK,IAAI,CAAC,KAAK,WAAW,OAAO;EACvC;CACF,OAAO;EACL,QAAQ;EACR,MAAM,KAAK,WAAW,MAAM,qBAAqB;EACjD,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAC9B,IAAI,IAAI;GACR,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,KAAK,GAAG,IAAI,KAAM,CAAC,MAAM,KAAM,MAAM;GACjE,IAAI,KAAK,IAAI,CAAC,KAAK,WAAW,OAAO;EACvC;CACF;CAEA,MAAM,cAAkC;EAAE,GAAG,QAAQ,OAAO,SAAS,OAAO,MAAM,QAAQ;EAAI;EAAO,OAAO;EAAO;CAAK;CAExH,MAAM,OAAO,SAAS,QAAQ,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CAClD,MAAM,SAAS,SAAS,QAAQ,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;CACrD,MAAM,WAA4B;EAAE;EAAM;EAAQ,MAAM,SAAS,SAAS,OAAO;EAAQ,GAAG,MAAM,MAAM,MAAM;CAAE;CAEhH,MAAM,OAAO,KAAK,KAAK,WAAW,IAAI;CACtC,MAAM,QAAQ,SAAS,KAAK,SAAS,KAAK,KAAK,OAAO,IAAI,KAAK,QAAQ,YAAY,IAAI,KAAK,QAAQ,QAAQ,IAAI,KAAK,YAAY,IAAI;CACrI,MAAM,QAAsB,QAAS,OAAO,IAAI,WAAW,UAAW,OAAO,KAAK,KAAK,OAAO,IAAI,IAAI,IAAI,uBAAuB;CACjI,MAAM,UAAU,UAAU,UAAU,IAAI;CACxC,MAAM,UAAU,UAAU,OAAO,MAAM,OAAO;CAC9C,OAAO;EAAE,SAAS,QAAQ;EAAI;EAAG;EAAY;EAAQ;EAAa;EAAU;EAAU;EAAO;EAAO,OAAO;EAAkB;EAAS;EAAS;CAAQ;AACzJ;;;ACrSA,MAAa,oBAAoB;;AAejC,MAAa,cAA0B;;AAqEvC,SAAgB,WAAW,MAAc,SAAyB;CAChE,OAAO,GAAG,KAAK,GAAG;AACpB;;AAmCA,MAAa,oBAA8B,OAAO,OAAO,EAAE,KAAK,OAAO,OAAO,CAAC,CAAC,EAAuB,CAAC;;AAGxG,MAAM,UAAU,MAAc,QAA2B,OAAe,SAAiB,YACvF,OAAO,OAAO;CAAE;CAAM,MAAM;CAAQ,QAAQ,OAAO,OAAO,CAAC,GAAG,MAAM,CAAC;CAAG,SAAS;CAAO;CAAS,SAAS,OAAO,OAAO,CAAC,GAAG,OAAO,CAAC;AAAE,CAAC;;AAGzI,MAAM,SACJ,MACA,MACA,QACA,SACA,YAEA,OAAO,OAAO;CACZ;CACA;CACA,KAAK,OAAO;CACZ,KAAK,OAAO;CACZ,SAAS,OAAO;CAChB,OAAO,OAAO,SAAS;CACvB,GAAI,OAAO,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO,CAAC,GAAG,OAAO,MAAM,CAAC,EAAE;CACnF;CACA,SAAS,OAAO,OAAO,CAAC,GAAG,OAAO,CAAC;AACrC,CAAC;AAEH,MAAM,IAAI;AACV,MAAM,IAAI;AACV,MAAM,IAAI;;;;;AAMV,MAAa,oBAA+D,OAAO,OAAO;CACxF,OAAO,MAAM,SAAS,OAAO;EAAE,KAAK;EAAG,KAAK;EAAS,OAAO;EAAK,OAAO;EAAO,QAAQ;GAAC;GAAG;GAAI;GAAK;GAAM;EAAM;CAAE,GAAG,2CAA2C;EAAC;EAAG;EAAG;CAAC,CAAC;CACzK,OAAO,OAAO,SAAS;EAAC;EAAa;EAAiB;EAAW;EAAa;EAAW;CAAe,GAAG,WAAW,+CAA+C,CAAC,GAAG,CAAC,CAAC;CAC3K,QAAQ,MAAM,UAAU,QAAQ;EAAE,KAAK;EAAM,KAAK;EAAG,OAAO;EAAG,OAAO;CAAM,GAAG,gEAAgE,CAAC,CAAC,CAAC;CAClJ,SAAS,MAAM,WAAW,QAAQ;EAAE,KAAK;EAAM,KAAK;EAAG,OAAO;EAAK,OAAO;CAAS,GAAG,sEAAsE,CAAC,CAAC,CAAC;CAC/J,WAAW,OAAO,aAAa;EAAC;EAAQ;EAAU;EAAa;EAAQ;EAAa;EAAY;CAAM,GAAG,QAAQ,sCAAsC,CAAC,GAAG,CAAC,CAAC;CAC7J,eAAe,OAAO,iBAAiB;EAAC;EAAS;EAAc;EAAa;EAAc;CAAU,GAAG,SAAS,0DAA0D,CAAC,GAAG,CAAC,CAAC;CAChL,gBAAgB,OAAO,kBAAkB;EAAC;EAAQ;EAAU;EAAW;EAAU;EAAW;CAAO,GAAG,QAAQ,2CAA2C,CAAC,GAAG,CAAC,CAAC;CAC/J,OAAO,OAAO,SAAS,gBAAgB,QAAQ,8DAA8D,CAAC,CAAC,CAAC;CAChH,OAAO,OAAO,SAAS,CAAC,QAAQ,MAAM,GAAG,QAAQ,qEAAqE,CAAC,CAAC,CAAC;CACzH,QAAQ,OAAO,UAAU;EAAC;EAAQ;EAAQ;CAAQ,GAAG,QAAQ,uEAAuE,CAAC,GAAG,CAAC,CAAC;CAC1I,aAAa,OAAO,eAAe;EAAC;EAAU;EAAU;CAAO,GAAG,UAAU,4DAA4D,CAAC,GAAG,CAAC,CAAC;CAC9I,WAAW,OAAO,aAAa;EAAC;EAAU;EAAa;EAAY;EAAQ;EAAa;EAAQ;CAAS,GAAG,UAAU,8BAA8B,CAAC,GAAG,CAAC,CAAC;CAC1J,OAAO,OAAO,SAAS;EAAC;EAAQ;EAAS;CAAO,GAAG,QAAQ,sEAAsE,CAAC,GAAG,CAAC,CAAC;CACvI,OAAO,OAAO,OAAO;EACnB,GAAG,OAAO,SAAS,CAAC,QAAQ,QAAQ,GAAG,QAAQ,yFAAyF,CAAC,CAAC,CAAC;EAC3I,MAAM,OAAO,OAAO;GAAE,OAAO;GAAa,IAAI,OAAO,OAAO,CAAC,QAAQ,MAAM,CAAC;EAAE,CAAC;CACjF,CAAC;CACD,SAAS,OAAO,WAAW;EAAC;EAAU;EAAO;EAAU;CAAM,GAAG,QAAQ,2FAA2F,CAAC,CAAC,CAAC;CACtK,QAAQ,MAAM,UAAU,QAAQ;EAAE,KAAK;EAAG,KAAK;EAAI,OAAO;CAAE,GAAG,sCAAsC,CAAC,GAAG,CAAC,CAAC;CAC3G,KAAK,MAAM,OAAO,QAAQ;EAAE,KAAK;EAAG,KAAK;EAAI,OAAO;CAAE,GAAG,+CAA+C,CAAC,GAAG,CAAC,CAAC;AAChH,CAAC;;;;;AAMD,SAAgB,gBAAgB,MAAc,QAAkC,CAAC,GAAoB;CACnG,MAAM,OAAO,OAAO,OAAO,mBAAmB,IAAI,IAAI,kBAAkB,QAAQ,KAAA;CAChF,IAAI,SAAS,KAAA,GAAW,MAAM,IAAI,WAAW,gDAAgD,KAAK,GAAG;CACrG,MAAM,MAAuB,OAAO,OAAO;EAAE,GAAG;EAAM,GAAG;EAAO;CAAK,CAAC;CACtE,IAAI,MAAM,cAAc,KAAA,KAAa,MAAM,gBAAgB,KAAA,GAAW,cAAc,mCAAmC,KAAK,IAAI,YAAY,GAAG,CAAC;CAChJ,OAAO;AACT;;;;;;AAUA,SAAgB,eAAe,MAAc,MAA2C;CACtF,MAAM,QAAQ,kCAAkC,KAAK;CACrD,IAAI,OAAO,SAAS,YAAY,SAAS,IAAI,MAAM,IAAI,WAAW,sEAAsE;CACxI,IAAI,SAAS,QAAQ,MAAM,IAAI,WAAW,GAAG,MAAM,+FAA+F;CAClJ,IAAI,OAAO,OAAO,mBAAmB,IAAI,GAAG,MAAM,IAAI,WAAW,GAAG,MAAM,0DAA0D,KAAK,WAAW;CACpJ,MAAM,MAAuB,OAAO,OAAO;EAAE,GAAG;EAAM;CAAK,CAAC;CAC5D,cAAc,OAAO,YAAY,GAAG,CAAC;CACrC,OAAO;AACT;;AAGA,SAAS,cAAc,OAAe,UAAmC;CACvE,IAAI,SAAS,SAAS,GAAG,MAAM,IAAI,WAAW,GAAG,MAAM,gBAAgB,SAAS,KAAK,IAAI,EAAE,EAAE;AAC/F;;AAGA,SAAS,YAAY,KAAsB,OAA4B;CACrE,MAAM,IAAI,IAAI;CACd,IAAI,MAAM,KAAA,GAAW,OAAO;CAC5B,IAAI,gBAAgB,CAAC,GAAG,OAAO,EAAE,MAAM,MAAM,WAAW,KAAK,CAAC,MAAM,KAAK;CACzE,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,QAAQ,EAAE,QAAQ,KAAA,KAAa,SAAS,EAAE,SAAS,EAAE,QAAQ,KAAA,KAAa,SAAS,EAAE;AACvF;;AAGA,MAAM,mBAAmB,MAAmD,MAAM,QAAQ,CAAC;;;;;AAM3F,SAAgB,kBAAkB,KAAsB,OAAyB;CAC/E,IAAI,aAAa,KAAK,KAAK,MAAM,KAAA,GAAW,OAAO;CACnD,OAAO,YAAY,KAAK,WAAW,KAAK,KAAmB,CAAC;AAC9D;;AAGA,SAAS,cAAc,KAA8B;CACnD,MAAM,IAAI,IAAI;CACd,IAAI,MAAM,KAAA,GAAW,OAAO;CAC5B,IAAI,gBAAgB,CAAC,GAAG,OAAO,EAAE,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;CACxE,OAAO,mBAAmB,EAAE,OAAO,IAAI,IAAI,MAAM,EAAE,OAAO,IAAI;AAChE;;AAGA,SAAS,YAAY,GAA8B;CACjD,MAAM,MAAgB,CAAC;CACvB,MAAM,MAAM,aAAa,GAAG,EAAE,OAAO;CACrC,IAAI,QAAQ,KAAA,GAAW,IAAI,KAAK,mBAAmB,EAAE,KAAK,YAAY,KAAK;CAC3E,KAAK,MAAM,KAAK,EAAE,UAAU,CAAC,GAAG;EAC9B,MAAM,IAAI,aAAa,GAAG,CAAC;EAC3B,IAAI,MAAM,KAAA,GAAW,IAAI,KAAK,eAAe,EAAE,KAAK,YAAY,GAAG;CACrE;CACA,IAAI,KAAK,GAAG,gBAAgB,GAAG,QAAQ,KAAA,CAAS,CAAC;CACjD,IAAI,KAAK,GAAG,oBAAoB,CAAC,CAAC;CAClC,OAAO;AACT;;AAGA,SAAS,gBAAgB,GAAoB,aAAgC;CAC3E,MAAM,IAAI,EAAE;CACZ,IAAI,MAAM,KAAA,GAAW,OAAO,CAAC;CAC7B,MAAM,MAAgB,CAAC;CACvB,MAAM,UAAU,EAAE,SAAS,SAAS,EAAE,SAAS;CAC/C,IAAI,gBAAgB,CAAC,GAAG;EACtB,IAAI,SAAS,OAAO,CAAC,4BAA4B,EAAE,KAAK,iEAAiE;EACzH,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,4BAA4B,EAAE,KAAK,oBAAoB;EACnF,KAAK,MAAM,KAAK,GAAG;GACjB,MAAM,IAAI,aAAa,GAAG,CAAC;GAC3B,IAAI,MAAM,KAAA,GAAW,IAAI,KAAK,yBAAyB,EAAE,KAAK,YAAY,GAAG;EAC/E;EACA,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,IAAI,KAAK,4BAA4B,EAAE,KAAK,yBAAyB;CACzG,OAAO;EACL,IAAI,MAAM,QAAQ,OAAO,MAAM,UAAU,OAAO,CAAC,4BAA4B,EAAE,KAAK,wBAAwB;EAC5G,IAAI,CAAC,SAAS,OAAO,CAAC,4BAA4B,EAAE,KAAK,mDAAmD;EAC5G,KAAK,MAAM,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,GAAG;GAChC,IAAI,QAAQ,KAAA,GAAW;GACvB,MAAM,IAAI,aAAa,GAAG,GAAG;GAC7B,IAAI,MAAM,KAAA,GAAW,IAAI,KAAK,qCAAqC,EAAE,KAAK,YAAY,GAAG;EAC3F;EACA,IAAI,EAAE,QAAQ,KAAA,KAAa,EAAE,QAAQ,KAAA,KAAa,EAAE,MAAM,EAAE,KAAK,IAAI,KAAK,2BAA2B,EAAE,KAAK,0BAA0B;CACxI;CACA,IAAI,IAAI,SAAS,GAAG,OAAO;CAC3B,IAAI,eAAe,CAAC,YAAY,GAAG,WAAW,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK,mBAAmB,EAAE,KAAK,2BAA2B;CAC5H,KAAK,MAAM,KAAK,EAAE,UAAU,CAAC,GAAG,IAAI,aAAa,GAAG,CAAC,MAAM,KAAA,KAAa,CAAC,YAAY,GAAG,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,KAAK,aAAa,KAAK,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,2BAA2B;CAC5L,OAAO;AACT;;AAGA,SAAS,oBAAoB,GAA8B;CACzD,MAAM,OAAO,EAAE;CACf,IAAI,SAAS,KAAA,GAAW,OAAO,CAAC;CAChC,IAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,CAAC,KAAK,OAAO,MAAM,OAAO,MAAM,YAAY,MAAM,EAAE,GAAG,OAAO,CAAC,uBAAuB,EAAE,KAAK,+BAA+B;CACxJ,MAAM,MAAgB,CAAC;CACvB,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,uBAAuB,EAAE,KAAK,wBAAwB;CACvG,KAAK,MAAM,KAAK,CAAC,QAAQ,iBAAiB,GAAG,IAAI,KAAK,SAAS,CAAC,GAAG,IAAI,KAAK,uBAAuB,EAAE,KAAK,mBAAmB,EAAE,6BAA6B;CAC5J,OAAO;AACT;;AAGA,MAAM,YAAY,MAA2B,EAAE,UAAU,UAAU,EAAE,OAAO,MAAM;;;;;AAMlF,SAAgB,YAAY,KAAiB,GAAmB;CAC9D,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;CACpC,IAAI;CACJ,IAAI,IAAI,UAAU,OAAO,IAAI,MAAM,KAAK,MAAM;MACzC,IAAI,SAAS,GAAG,GAAG,IAAI,MAAM,KAAK,MAAM,IAAI,KAAK,MAAM,MAAM,GAAG,CAAC;MACjE,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,EAAE;CACrE,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC;CAClC,OAAO,IAAI,SAAS,QAAQ,KAAK,MAAM,CAAC,IAAK,WAAW,KAAK,CAAC;AAChE;;AAGA,SAAgB,cAAc,KAAiB,OAAuB;CACpE,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,MAAM,IAAI,OAAO;CACvB,IAAI,QAAQ,KAAK,OAAO;CACxB,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;CAC5C,IAAI,IAAI,UAAU,OAAO,QAAQ,IAAI,QAAQ,MAAM;CACnD,IAAI,SAAS,GAAG,GAAG,OAAO,KAAK,MAAM,IAAI,GAAG,IAAI,KAAK,MAAM,MAAM,GAAG;CACpE,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG,MAAM,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG;AACtE;;AAGA,SAAS,cAAc,KAA8F;CACnH,MAAM,IAAI,IAAI;CACd,MAAM,QAAQ,MAAM,KAAA,KAAa,gBAAgB,CAAC,IAAI,CAAC,IAAI;CAC3D,OAAO;EAAE,KAAK,MAAM,OAAO,IAAI;EAAK,KAAK,MAAM,OAAO,IAAI;CAAI;AAChE;;;;;;AAOA,SAAgB,SAAS,KAAsB,OAA8B;CAC3E,IAAI,IAAI,WAAW,KAAA,GAAW,OAAO,CAAC,GAAG,IAAI,MAAM;CACnD,IAAI,IAAI,SAAS,UAAU,IAAI,SAAS,QAAQ,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,MAAM,YAAY,KAAK,WAAW,KAAK,CAAC,CAAC,CAAC;CAC7H,IAAI,UAAU,KAAA,GAAW,OAAO,YAAY,KAAK,CAAC;CAClD,IAAI,IAAI,cAAc,KAAA,GAAW;EAC/B,MAAM,EAAE,WAAW,YAAY,GAAG,SAAS;EAC3C,MAAM,OAAO,cAAc,GAAG;EAC9B,OAAO,SAAS;GAAE,GAAG;GAAM,GAAI,KAAK,QAAQ,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI;GAAI,GAAI,KAAK,QAAQ,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI;EAAG,GAAG,KAAK;CAChJ;CACA,IAAI,CAAC,SAAS,GAAG,GAAG,OAAO,YAAY,KAAK,KAAK;CACjD,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG,MAAM,IAAI,WAAW,6DAA6D,MAAM,EAAE;CACrI,IAAI,UAAU,GAAG,OAAO,CAAC,WAAW,KAAK,IAAI,OAAO,CAAC;CACrD,OAAO,CAAC,GAAG,IAAI,IAAI,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,GAAG,MAAM,YAAY,KAAK,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;AAChG;;AAGA,SAAS,kBAAkB,MAA4C;CACrE,MAAM,MAAgB,CAAC;CACvB,MAAM,QAAQ,KAAK,KAAK,MAAM,EAAE,IAAI;CACpC,KAAK,SAAS,GAAG,MAAM;EACrB,IAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,GAAG,IAAI,KAAK,kBAAkB,EAAE,KAAK,2BAA2B;EAC9F,IAAI,KAAK,GAAG,YAAY,CAAC,CAAC;EAC1B,IAAI,EAAE,SAAS,KAAA,GAAW;EAC1B,MAAM,IAAI,MAAM,QAAQ,EAAE,KAAK,KAAK;EACpC,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,MAAM,qCAAqC;OAC7G,IAAI,EAAE,KAAK,GAAG,WAAW,GAAG,IAAI,KAAK,gBAAgB,EAAE,KAAK,gBAAgB;OAC5E,KAAK,MAAM,KAAK,EAAE,KAAK,IAAI,IAAI,aAAa,KAAK,IAAK,CAAC,MAAM,KAAA,GAAW,IAAI,KAAK,gBAAgB,EAAE,KAAK,sBAAsB,EAAE,KAAK,MAAM,gBAAgB;CAClK,CAAC;CACD,OAAO;AACT;;;;;;;;AASA,SAAgB,kBACd,YACA,OAA6C,CAAC,GAC9C,QAAgB,cAChB,KAAa,cACI;CACjB,MAAM,QAAQ,IAAI,IAAI,WAAW,KAAK,MAAM,EAAE,IAAI,CAAC;CACnD,KAAK,MAAM,OAAO,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,WAAW,GAAG,MAAM,qBAAqB,IAAI,GAAG;CACpH,MAAM,SAAqC,CAAC;CAC5C,MAAM,MAAkC,CAAC;CACzC,KAAK,MAAM,KAAK,YAAY;EAC1B,MAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,IAAI,IAAI,KAAK,EAAE,QAAQ,KAAA;EAC3D,IAAI,UAAU,KAAA,GAAW;GACvB,MAAM,MAAM,aAAa,GAAG,KAAK;GACjC,IAAI,QAAQ,KAAA,GAAW,MAAM,IAAI,WAAW,GAAG,MAAM,mBAAmB,EAAE,KAAK,YAAY,IAAI,EAAE;GACjG,IAAI,CAAC,YAAY,GAAG,WAAW,GAAG,KAAK,CAAC,GACtC,MAAM,IAAI,WAAW,GAAG,MAAM,cAAc,KAAK,UAAU,KAAK,EAAE,qBAAqB,EAAE,KAAK,wBAAwB,GAAG,6BAA6B,cAAc,CAAC,EAAE,EAAE;EAE7K;EACA,MAAM,KAAK,YAAY,GAAG,MAAM;EAChC,MAAM,QAAQ,WAAW,GAAG,MAAM,UAAU,KAAA,IAAY,QAAQ,EAAE,OAAO;EACzE,IAAI,IAAI,OAAO,EAAE,QAAQ;EACzB,IAAI,EAAE,QAAQ;CAChB;CACA,OAAO;AACT;;AAGA,SAAS,aAAa,YAAwC,MAAmD;CAC/G,MAAM,SAAqC,CAAC;CAC5C,KAAK,MAAM,KAAK,YAAY,IAAI,YAAY,GAAG,MAAM,GAAG,OAAO,EAAE,QAAQ,KAAK,EAAE;CAChF,OAAO;AACT;;AAGA,UAAU,QAAQ,YAAwC,QAAwD,IAAI,GAAG,SAAqC,CAAC,GAA0C;CACvM,IAAI,MAAM,WAAW,QAAQ;EAC3B,MAAM,EAAE,GAAG,OAAO;EAClB;CACF;CACA,MAAM,IAAI,WAAW;CACrB,MAAM,KAAK,OAAO;CAClB,IAAI,OAAO,KAAA,KAAa,CAAC,YAAY,GAAG,MAAM,GAAG;EAC/C,OAAO,QAAQ,YAAY,QAAQ,IAAI,GAAG,YAAY,GAAG,MAAM,IAAI;GAAE,GAAG;IAAS,EAAE,OAAO,WAAW,GAAG,EAAE,OAAO;EAAE,IAAI,MAAM;EAC7H;CACF;CACA,KAAK,MAAM,KAAK,IAAI,OAAO,QAAQ,YAAY,QAAQ,IAAI,GAAG;EAAE,GAAG;GAAS,EAAE,OAAO,WAAW,GAAG,CAAC;CAAE,CAAC;AACzG;;AAGA,SAAS,QAAQ,YAAwC,QAAwD,IAAI,GAAG,SAAqC,CAAC,GAAW;CACvK,IAAI,MAAM,WAAW,QAAQ,OAAO;CACpC,MAAM,IAAI,WAAW;CACrB,IAAI,CAAC,YAAY,GAAG,MAAM,GAAG,OAAO,QAAQ,YAAY,QAAQ,IAAI,GAAG,MAAM;CAC7E,MAAM,KAAK,OAAO,MAAM,CAAC,EAAE,OAAO;CAElC,IAAI,CADc,WAAW,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,MAAM,UAAU,EAAE,IAC7D,GAAG,OAAO,GAAG,SAAS,QAAQ,YAAY,QAAQ,IAAI,GAAG,MAAM;CAC5E,IAAI,MAAM;CACV,KAAK,MAAM,KAAK,IAAI,OAAO,QAAQ,YAAY,QAAQ,IAAI,GAAG;EAAE,GAAG;GAAS,EAAE,OAAO,WAAW,GAAG,CAAC;CAAE,CAAC;CACvG,OAAO;AACT;;AAGA,SAAS,YAAY,YAAwC,SAAuB,OAAe,IAAmD;CACpJ,MAAM,QAAQ,IAAI,IAAI,WAAW,KAAK,MAAM,EAAE,IAAI,CAAC;CACnD,KAAK,MAAM,QAAQ,CAAC,GAAI,QAAQ,SAAS,CAAC,GAAI,GAAG,OAAO,KAAK,QAAQ,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,GAAG,MAAM,IAAI,WAAW,GAAG,MAAM,qBAAqB,KAAK,GAAG;CACtK,OAAO,WAAW,KAAK,MAAM;EAC3B,IAAI,QAAQ,UAAU,KAAA,KAAa,CAAC,QAAQ,MAAM,SAAS,EAAE,IAAI,GAAG,OAAO,KAAA;EAC3E,MAAM,KAAK,QAAQ,WAAW,KAAA,KAAa,OAAO,OAAO,QAAQ,QAAQ,EAAE,IAAI,IAAI,QAAQ,OAAO,EAAE,QAAS,SAAS,CAAC;EACvH,KAAK,MAAM,KAAK,IAAI;GAClB,MAAM,MAAM,aAAa,GAAG,CAAC;GAC7B,IAAI,QAAQ,KAAA,GAAW,MAAM,IAAI,WAAW,GAAG,MAAM,gBAAgB,EAAE,KAAK,YAAY,IAAI,EAAE;GAC9F,IAAI,CAAC,YAAY,GAAG,WAAW,GAAG,CAAC,CAAC,GAAG,MAAM,IAAI,WAAW,GAAG,MAAM,cAAc,KAAK,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,wBAAwB,GAAG,EAAE;EAClJ;EACA,OAAO;CACT,CAAC;AACH;;AAGA,SAAS,cAAc,YAAwC,MAAiC;CAC9F,MAAM,sBAAM,IAAI,IAAY;CAC5B,KAAK,MAAM,KAAK,YAAY;EAC1B,IAAI,EAAE,gBAAgB,KAAA,KAAa,EAAE,YAAY,WAAW,GAAG;EAC/D,IAAI,KAAK,EAAE,UAAU,WAAW,GAAG,EAAE,OAAO,GAAG,KAAK,MAAM,KAAK,EAAE,aAAa,IAAI,IAAI,CAAC;CACzF;CACA,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,MAAM;AAC7B;;AAGA,MAAM,UAAU,GAAW,MAAuB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;;;;;AAM3E,SAAS,WAAc,QAAW,QAA2B,MAA6B,OAAkB;CAC1G,IAAI,OAAO,WAAW,GAAG,OAAO;CAChC,IAAI,WAAW,QAAQ,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG,MAAM,IAAI,WAAW,GAAG,MAAM,0BAA0B,OAAO,KAAK,IAAI,EAAE,mCAAmC;CACzL,MAAM,IAAI;CACV,MAAM,UAAU,OAAO,QAAQ,MAAM,OAAO,OAAO,GAAG,CAAC,CAAC;CACxD,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,MAAM,SAAS,EAAE;CACjB,MAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,OAAO,QAAQ,MAAmB,OAAO,MAAM,QAAQ,IAAI,CAAC;CAClG,MAAM,OAAgC,CAAC;CACvC,KAAK,MAAM,OAAO,OAAO,KAAK,CAAC,GAAG,IAAI,QAAQ,UAAU,QAAA,iBAA6B,CAAC,QAAQ,SAAS,GAAG,GAAG,KAAK,OAAO,EAAE;CAC3H,KAAK,qBAAqB,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM;CAC1E,IAAI,OAAO,EAAE,YAAY,UAAU,OAAQ,OAAO,OAAO,GAAG,MAAM,IAAI;EAAE,GAAG;EAAM,MAAM,EAAE;CAAQ,IAAI;CACrG,OAAO;EAAE,GAAG;EAAM,MAAM,KAAK,IAAS;CAAE;AAC1C;;AAGA,SAAS,WAAW,YAAwC,KAAkD;CAC5G,MAAM,MAAkC,CAAC;CACzC,IAAI,IAAiC;CACrC,OAAO,GAAG,SAAS,KAAA,GAAW;EAC5B,MAAM,QAAgB,EAAE,KAAK;EAC7B,IAAI,SAAS,EAAE,KAAK,GAAG;EACvB,IAAI,WAAW,MAAM,MAAM,EAAE,SAAS,KAAK;CAC7C;CACA,OAAO;AACT;;AAGA,SAAS,UAAU,MAAoB;CACrC,IAAI,CAAC,OAAO,cAAc,IAAI,KAAK,OAAO,GAAG,MAAM,IAAI,WAAW,gDAAgD,KAAK,EAAE;AAC3H;;AAGA,SAAgB,qBAAsC,WAAsC,CAAC,GAAsB;CACjH,MAAM,OAA0B,CAAC;CACjC,MAAM,SAAS,MAA+B,eAAe,EAAE,KAAK,YAAY,EAAE;CAClF,MAAM,QAAQ,MAAc,YAAsC;EAChE,MAAM,QAAQ,KAAK,QAAQ,MAAM,EAAE,SAAS,IAAI;EAChD,IAAI,MAAM,WAAW,GAAG,MAAM,IAAI,WAAW,+BAA+B,KAAK,GAAG;EACpF,IAAI,YAAY,KAAA,GAAW,OAAO,MAAM;EACxC,MAAM,QAAQ,MAAM,MAAM,MAAM,EAAE,YAAY,OAAO;EACrD,IAAI,UAAU,KAAA,GAAW,MAAM,IAAI,WAAW,eAAe,KAAK,qBAAqB,MAAM,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,QAAQ,QAAQ,EAAE;EAChJ,OAAO;CACT;;CAEA,MAAM,WAAW,GAAoB,SAA6G;EAChJ,IAAI,SAAS,KAAA,KAAa,CAAC,OAAO,OAAO,MAAM,MAAM,GAAG,OAAO;EAC/D,MAAM,OAAO,WAAW,EAAE,MAAM,EAAE,OAAO;EACzC,IAAI,KAAK,YAAY,MAAM,MAAM,IAAI,WAAW,GAAG,MAAM,CAAC,EAAE,iBAAiB,KAAK,kBAAkB,KAAK,UAAU,KAAK,OAAO,EAAE,cAAc;EAC/I,MAAM,EAAE,MAAM,OAAO,GAAG,SAAS;EACjC,OAAO;CACT;;CAEA,MAAM,aAAa,GAAoB,SACrC,kBAAkB,EAAE,YAAY,MAAM,MAAM,CAAC,GAAG,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC;CAC/E,MAAM,YAAY,GAAoB,MAAc,SAAuF;EACzI,MAAM,MAAM,EAAE,OAAO;EACrB,OAAO;GAAE;GAAK,QAAQ,IAAI,EAAE,YAAY,KAAA,IAAY,OAAO,EAAE,QAAQ,MAAM,IAAI,CAAC;EAAE;CACpF;CACA,MAAM,WAA8B;EAClC,SAAS,QAAQ;GACf,IAAI,CAAC,OAAO,UAAU,OAAO,OAAO,KAAK,OAAO,UAAU,GAAG,MAAM,IAAI,WAAW,GAAG,MAAM,MAAM,EAAE,wDAAwD;GAC3J,IAAI,KAAK,MAAM,MAAM,EAAE,SAAS,OAAO,QAAQ,EAAE,YAAY,OAAO,OAAO,GAAG,MAAM,IAAI,WAAW,GAAG,MAAM,MAAM,EAAE,6BAA6B;GACjJ,MAAM,WAAW,kBAAkB,OAAO,UAAU;GAEpD,IADc,OAAO,WAAW,KAAK,MAAM,EAAE,IACrC,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,KAAK,4GAA0G;GACpJ,KAAK,MAAM,OAAO,OAAO,YAAY,CAAC,GAAG;IACvC,MAAM,IAAI,OAAO,WAAW,MAAM,MAAM,EAAE,SAAS,GAAG;IACtD,IAAI,MAAM,KAAA,GAAW,SAAS,KAAK,2BAA2B,IAAI,mCAAmC;SAChG,IAAI,EAAE,SAAS,KAAA,GAAW,SAAS,KAAK,2BAA2B,IAAI,qDAAqD;GACnI;GACA,IAAI,SAAS,SAAS,GAAG,MAAM,IAAI,WAAW,GAAG,MAAM,MAAM,EAAE,gBAAgB,SAAS,KAAK,IAAI,EAAE,EAAE;GACrG,KAAK,KAAK,MAAM;GAChB,OAAO;EACT;EACA,QAAQ;EACR,gBAAgB,CAAC,GAAG,IAAI;EACxB,QAAQ,MAAM,MAAM,SAAS;GAC3B,MAAM,IAAI,KAAK,MAAM,OAAO;GAC5B,OAAO,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC;EACtC;EACA,SAAS,MAAM,MAAM,MAAM,UAAU,CAAC,GAAG;GACvC,UAAU,IAAI;GACd,MAAM,IAAI,KAAK,MAAM,QAAQ,OAAO;GACpC,MAAM,OAAO,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC;GAC1C,MAAM,UAA2B;IAAE,GAAG,SAAS,GAAG,MAAM,IAAI;IAAG,GAAI,QAAQ,QAAQ,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK,QAAQ,IAAI;GAAG;GAC1H,MAAM,SAAS,EAAE,SAAS,MAAM,MAAM,OAAO;GAC7C,MAAM,OAAQ,EAAE,QAAQ;GACxB,OAAO,WAAW,QAAQ,cAAc,EAAE,YAAY,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC;EAC7E;EACA,OAAO,MAAM,MAAM,SAAS;GAC1B,MAAM,IAAI,KAAK,MAAM,OAAO;GAC5B,OAAO;IAAE,MAAM,WAAW,EAAE,MAAM,EAAE,OAAO;IAAG,GAAG,aAAa,EAAE,YAAY,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC;GAAE;EAC9G;EACA,CAAC,MAAM,MAAM,UAAU,CAAC,GAAG;GACzB,MAAM,IAAI,KAAK,MAAM,QAAQ,OAAO;GACpC,KAAK,MAAM,UAAU,QAAQ,EAAE,YAAY,YAAY,EAAE,YAAY,SAAS,MAAM,CAAC,GAAG,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,UAAU,GAAG,MAAM;EACpJ;EACA,UAAU,MAAM,UAAU,CAAC,GAAG;GAC5B,MAAM,IAAI,KAAK,MAAM,QAAQ,OAAO;GACpC,OAAO,QAAQ,EAAE,YAAY,YAAY,EAAE,YAAY,SAAS,MAAM,CAAC,GAAG,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;EAC1G;EACA,cAAc,MAAM,SAAS;GAC3B,MAAM,IAAI,KAAK,MAAM,OAAO;GAC5B,MAAM,OAAO,UAAU,GAAG,CAAC,CAAC;GAC5B,MAAM,MAAyB,CAAC,IAAI;GACpC,MAAM,uBAAO,IAAI,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,CAAC;GAC3C,KAAK,MAAM,KAAK,EAAE,YAAY;IAC5B,IAAI,EAAE,SAAS,SAAS,EAAE,SAAS,QAAQ;IAC3C,MAAM,OAAO,cAAc,CAAC;IAC5B,KAAK,MAAM,OAAO,CAAC,KAAK,KAAK,KAAK,GAAG,GAAG;KACtC,IAAI,QAAQ,KAAA,GAAW;KACvB,MAAM,OAAO,UAAU,GAAG;MAAE,GAAG,WAAW,EAAE,YAAY,CAAC;OAAI,EAAE,OAAO;KAAI,CAAC;KAC3E,MAAM,MAAM,KAAK,UAAU,IAAI;KAC/B,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG;MAClB,KAAK,IAAI,GAAG;MACZ,IAAI,KAAK,IAAI;KACf;IACF;GACF;GACA,OAAO;EACT;EACA,MAAM,MAAM,SAAS;GACnB,MAAM,IAAI,KAAK,MAAM,OAAO;GAC5B,QAAQ,MAAM,SAAS;IACrB,UAAU,IAAI;IACd,OAAO,SAAS,GAAG,MAAM,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;GAC3D;EACF;EACA,WAAW;GACT,MAAM,MAAyC,CAAC;GAChD,KAAK,MAAM,KAAK,MAAM,IAAI,WAAW,EAAE,MAAM,EAAE,OAAO,KAAK,CAAC,GAAI,EAAE,YAAY,CAAC,CAAE;GACjF,OAAO;EACT;CACF;CACA,KAAK,MAAM,KAAK,UAAU,SAAS,SAAS,CAAC;CAC7C,OAAO;AACT;;AAgCA,MAAM,QAAQ,MAAkC,SAA2C,OAAO,YAAY,KAAK,KAAK,MAAM,CAAC,EAAE,MAAM,KAAK,EAAE,KAAM,CAAC,CAAC;;;;;;AAOtJ,SAAgB,cAAc,MAAiC,OAA8B,UAA0B,CAAC,GAA8B;CACpJ,MAAM,aAAa,CAAC,GAAG,KAAK,YAAY,GAAG,MAAM,SAAS,MAAM,EAAE,UAAU,CAAC;CAC7E,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,MAAM,KAAK,YAAY;EAC1B,IAAI,KAAK,IAAI,EAAE,IAAI,GAAG,MAAM,IAAI,WAAW,iCAAiC,EAAE,KAAK,uDAAuD;EAC1I,KAAK,IAAI,EAAE,IAAI;CACjB;CACA,MAAM,OAAO,QAAQ,QAAQ;CAC7B,MAAM,OAAO,KAAK,gBAAgB,oBAAoB,MAAM,MAAM,MAAM,EAAE,gBAAgB,gBAAgB;CAC1G,OAAO,OAAO,OAAO;EACnB,MAAM,QAAQ,QAAQ,CAAC,KAAK,MAAM,GAAG,MAAM,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;EACvE,SAAS,KAAK;EACd,OAAO,QAAQ,SAAS,KAAK;EAC7B,SAAS,QAAQ,WAAW,GAAG,KAAK,QAAQ,kBAAkB,MAAM,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;EAClG;EACA,SAAS,CAAC,KAAK,SAAS,GAAG,MAAM,KAAK,MAAM,GAAG,EAAE,KAAK,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG;EAChF,aAAa,OAAO,mBAAmB;EACvC,GAAI,KAAK,QAAQ,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI;EAClD,GAAI,KAAK,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,MAAc,SAA0B,KAAK,QAAS,MAAM,KAAK,KAAK,YAAY,IAAI,CAAC,EAAE;EAC3I,GAAI,KAAK,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;EACjE,GAAI,QAAQ,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,KAAK;EAC3D,SAAS,MAAc,MAAuB,SAAuC;GACnF,IAAI,QAAQ,KAAK,SAAS,MAAM,KAAK,KAAK,YAAY,IAAI,GAAG,OAAO;GACpE,MAAM,QAAkB,CAAC;GACzB,KAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,SAAS,KAAK,KAAK,YAAY,IAAI;IACzC,QAAQ,KAAK,MAAM,OAAO,MAAM,MAAM;IACtC,IAAI,KAAK,eAAe,KAAA,GAAW,MAAM,KAAK,KAAK,WAAW,MAAM,CAAC;GACvE;GACA,MAAM,SAAS,CAAC,MAAM,UAAU,KAAK,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK,GAAG;GAC7D,MAAM,MAAM,MAAM,OAAO,QAAQ;GACjC,MAAM,KAAK,GAAG,QAAQ,KAAA,IAAY,KAAK,GAAG,IAAI,KAAK,OAAO,IAAI;GAC9D,MAAM,UAAuB;IAAE,GAAG;IAAO;IAAI;GAAO;GACpD,OAAO;IAAE,GAAG;IAAS,MAAM,KAAK,OAAO;GAAE;EAC3C;CACF,CAAC;AACH;;AAGA,MAAM,kBAA8C,OAAO,OAAO;CAAC;CAAe;CAAa;CAAU;CAAS;AAAO,CAAC,CAAC,KAAK,MAAM,kBAAkB,EAAG,CAAC;;AAG5J,SAAS,WAAW,GAAoC;CACtD,MAAM,QAAQ,SAAyB;EACrC,MAAM,MAAM,gBAAgB,MAAM,MAAM,EAAE,SAAS,IAAI;EACvD,MAAM,QAAQ,OAAO,OAAO,GAAG,IAAI,IAAI,EAAE,QAAQ,KAAA;EACjD,MAAM,MAAM,UAAU,KAAA,IAAY,yBAAyB,aAAa,KAAK,KAAK;EAClF,IAAI,QAAQ,KAAA,KAAa,OAAO,UAAU,UAAU,MAAM,IAAI,WAAW,8BAA8B,KAAK,YAAY,OAAO,iBAAiB,EAAE;EAClJ,OAAO;CACT;CACA,OAAO;EACL,aAAa,KAAK,aAAa;EAC/B,WAAW,KAAK,WAAW;EAC3B,QAAQ,KAAK,QAAQ;EACrB,OAAO,KAAK,OAAO;EACnB,OAAO,KAAK,OAAO;CACrB;AACF;;;;;AAMA,MAAa,aAAyB,OAAO,OAAO;CAClD,MAAM;CACN,SAAS;CACT,OAAO;CACP,SAAS;CACT,YAAY;CACZ,SAAS;CACT,aAAa;CACb,aAAa,MAAuB,KAAK,EAAE,eAAe,GAAG,EAAE,aAAa,GAAG,EAAE,UAAU,GAAG,EAAE,WAAW,EAAE,aAAa,WAAW,gBAAgB;CACrJ,QAAQ,OAAoB,MAAc,MAAuB,SAAS,OAAO,WAAW,CAAC,GAAG,IAAI;AACtG,CAAC;;AAGD,MAAM,aAAa;;;;;;AAOnB,MAAa,iBAA4C,OAAO,OAAO;CACrE,MAAM;CACN,SAAS;CACT,OAAO;CACP,SAAS;CACT,YAAY,OAAO,OAAO,CAAC,gBAAgB,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;CACrE,SAAS;CACT,aAAa;CACb,SAAS,MAAc,MAAuB,SAAuC;EACnF,MAAM,QAAQ,KAAK;EACnB,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG,MAAM,IAAI,WAAW,iEAAiE,OAAO,KAAK,EAAE,EAAE;EAC9K,MAAM,MAAM,QAAQ,OAAO;EAC3B,IAAI,IAAI,WAAW,MAAM,WAAW;EACpC,MAAM,IAAI,UAAU,GAAG,KAAK,GAAI;EAChC,MAAM,IAAI,UAAU,GAAG,KAAK,GAAG;EAC/B,IAAI,WAAW,MAAM,WAAW;EAChC,MAAM,IAAI,UAAU,GAAG,GAAG,CAAC;EAC3B,MAAM,YAAwB,CAAC;EAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;GAC1B,MAAM,KAAK,UAAU,GAAG,IAAI,GAAG;GAC/B,MAAM,KAAK,UAAU,GAAG,IAAI,GAAG;GAC/B,MAAM,IAAI,UAAU,GAAG,GAAG,IAAI,EAAE;GAChC,MAAM,IAAI,UAAU,GAAG,GAAG,IAAI,EAAE;GAChC,UAAU,KAAK;IAAE,IAAI,IAAI;IAAK,QAAQ;KAAE,MAAM;KAAQ;KAAG;KAAG,GAAG;KAAI,GAAG;IAAG;GAAE,CAAC;EAC9E;EACA,IAAI,WAAW,MAAM,OAAO;EAC5B,MAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,GAAG,MAAM;GACpD,MAAM,KAAK,UAAU,GAAG,IAAI,GAAG;GAC/B,MAAM,KAAK,UAAU,GAAG,IAAI,EAAE;GAC9B,OAAO;IAAE,IAAI,IAAI;IAAK,GAAG;IAAI,GAAG;GAAG;EACrC,CAAC;EACD,MAAM,OAAoB;GACxB,QAAQ;GACR,IAAI,GAAG,IAAI,mBAAmB;GAC9B;GACA,QAAQ;GACR;GACA,QAAQ;GACR,WAAW;IAAE,MAAM;IAAkB,SAAS;IAAG,QAAQ,EAAE,MAAM;IAAG;GAAK;GACzE,WAAW;IAAE;IAAG;IAAG,OAAO;GAAO;GACjC;GACA;GACA,OAAO,CAAC;EACV;EACA,OAAO;GAAE,GAAG;GAAM,MAAM,aAAa,IAAI;EAAE;CAC7C;AACF,CAAC"}
1
+ {"version":3,"file":"index.js","names":["byCode","partOf","isObject"],"sources":["../src/geometry.ts","../src/shapes.ts","../src/tolerance.ts","../src/input.ts","../src/turn.ts","../src/output.ts","../src/record.ts","../src/rules.ts","../src/measures.ts","../src/utf8.ts","../src/random.ts","../src/edges.ts","../src/hash.ts","../src/portfolio.ts","../src/corpus.ts","../src/strategy-space.ts","../src/verdict.ts","../src/families.ts"],"sourcesContent":["/** A side of a box. The y axis points down, so `top` has the smallest y. */\nexport type Side = \"top\" | \"right\" | \"bottom\" | \"left\";\n\n/** The sides in clockwise order, from the top. */\nexport const SIDES: readonly Side[] = [\"top\", \"right\", \"bottom\", \"left\"];\n\nexport interface Point {\n readonly x: number;\n readonly y: number;\n}\n\n/** A rectangle: its top-left corner and its size. */\nexport interface Rect {\n readonly x: number;\n readonly y: number;\n readonly w: number;\n readonly h: number;\n}\n\n/** A value for each side of a box. */\nexport interface Sides {\n readonly top: number;\n readonly right: number;\n readonly bottom: number;\n readonly left: number;\n}\n\n/**\n * A region. The forms and the rules are those of `docs/FORMAT.md` of `packing`.\n * A ring of a polygon closes without a copy of its first point.\n */\nexport type Region =\n | { readonly kind: \"rect\"; readonly x: number; readonly y: number; readonly w: number; readonly h: number }\n | {\n readonly kind: \"polygon\";\n readonly points: readonly (readonly [number, number])[];\n readonly holes?: readonly (readonly (readonly [number, number])[])[];\n }\n | { readonly kind: \"circle\"; readonly cx: number; readonly cy: number; readonly r: number }\n | { readonly kind: \"ellipse\"; readonly cx: number; readonly cy: number; readonly rx: number; readonly ry: number };\n\n/** A margin: one value for the four sides, or one value for each side. */\nexport type Margin = number | Sides;\n\n/** This function gives the value of each side of a margin. No margin gives 0 on each side. */\nexport function marginSides(margin: Margin | undefined): Sides {\n if (margin === undefined) return { top: 0, right: 0, bottom: 0, left: 0 };\n if (typeof margin === \"number\") return { top: margin, right: margin, bottom: margin, left: margin };\n return margin;\n}\n\n/** This function gives the rectangle made larger by the margin on each side. */\nexport function grow(rect: Rect, margin: Margin | undefined): Rect {\n const m = marginSides(margin);\n return { x: rect.x - m.left, y: rect.y - m.top, w: rect.w + m.left + m.right, h: rect.h + m.top + m.bottom };\n}\n\n/** This function gives the bounding box of a region. */\nexport function boundsOf(region: Region): Rect {\n switch (region.kind) {\n case \"rect\":\n return { x: region.x, y: region.y, w: region.w, h: region.h };\n case \"circle\":\n return { x: region.cx - region.r, y: region.cy - region.r, w: 2 * region.r, h: 2 * region.r };\n case \"ellipse\":\n return { x: region.cx - region.rx, y: region.cy - region.ry, w: 2 * region.rx, h: 2 * region.ry };\n case \"polygon\": {\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n for (const [x, y] of region.points) {\n x0 = Math.min(x0, x);\n y0 = Math.min(y0, y);\n x1 = Math.max(x1, x);\n y1 = Math.max(y1, y);\n }\n return { x: x0, y: y0, w: x1 - x0, h: y1 - y0 };\n }\n }\n}\n\n/**\n * This function gives the exact area of a region. A `rect` gives `w` by `h`, a circle gives `PI * r * r`, and an ellipse gives `PI * rx * ry`.\n * A polygon gives the absolute value of the shoelace formula, less the area of each hole. A ring with fewer than 3 points has the area 0.\n */\nexport function regionArea(region: Region): number {\n switch (region.kind) {\n case \"rect\":\n return region.w * region.h;\n case \"circle\":\n return Math.PI * region.r * region.r;\n case \"ellipse\":\n return Math.PI * region.rx * region.ry;\n case \"polygon\":\n return (region.holes ?? []).reduce((area, hole) => area - ringArea(hole), ringArea(region.points));\n }\n}\n\n/** This function gives the area of one ring of a polygon: the absolute value of the shoelace formula. */\nfunction ringArea(ring: readonly (readonly [number, number])[]): number {\n let twice = 0;\n for (let i = 0; i < ring.length; i++) {\n const [ax, ay] = ring[i]!;\n const [bx, by] = ring[(i + 1) % ring.length]!;\n twice += ax * by - bx * ay;\n }\n return Math.abs(twice) / 2;\n}\n\n/** This function gives the region moved by `dx` and `dy`. */\nexport function translate(region: Region, dx: number, dy: number): Region {\n switch (region.kind) {\n case \"rect\":\n return { ...region, x: region.x + dx, y: region.y + dy };\n case \"circle\":\n case \"ellipse\":\n return { ...region, cx: region.cx + dx, cy: region.cy + dy };\n case \"polygon\": {\n const move = (ring: readonly (readonly [number, number])[]): [number, number][] => ring.map(([x, y]) => [x + dx, y + dy]);\n return region.holes === undefined\n ? { kind: \"polygon\", points: move(region.points) }\n : { kind: \"polygon\", points: move(region.points), holes: region.holes.map(move) };\n }\n }\n}\n\n/**\n * This function gives the overlap of the insides of two rectangles on each axis.\n * A value of 0 or less on an axis is no overlap. Two rectangles with a common edge have an overlap of 0.\n */\nexport function overlapOf(a: Rect, b: Rect): { readonly x: number; readonly y: number } {\n return {\n x: Math.min(a.x + a.w, b.x + b.w) - Math.max(a.x, b.x),\n y: Math.min(a.y + a.h, b.y + b.h) - Math.max(a.y, b.y),\n };\n}\n","// The shape kinds of the items (`docs/SHAPES.md`): the declared set, the kind of a box and the check of the measures and rules on a run.\nimport type { ClaimBreak } from \"./corpus.ts\";\nimport { regionArea, type Region } from \"./geometry.ts\";\nimport type { LayoutBox, LayoutInput } from \"./input.ts\";\n\n/**\n * The kind of the shape of an item. A box without `shape` and without `shapeKind` is a `rect`.\n * The set is open: a later version can add a kind. A reader treats an unknown kind as a kind that it does not support.\n */\nexport type ShapeKind = \"rect\" | \"polygon\" | \"circle\" | \"free\";\n\n/** The geometry of a shape kind that this package gives. A `false` value tells that the kind declares the operation, but this package does not supply it. */\nexport interface ShapeGeometry {\n /** The bounding box: `boundsOf` and `placedRect`. */\n readonly bounds: boolean;\n /** The area of the shape: `regionArea` and `boxArea`. */\n readonly area: boolean;\n /** The test that the shape is inside a region: `rectInRegion` for a `rect`. */\n readonly contains: boolean;\n /** The test that two shapes overlap: `overlapOf` for two `rect` shapes. */\n readonly overlap: boolean;\n}\n\n/** The facts of one shape kind: its fields, the kinds of `Region` that give it, and its geometry. */\nexport interface ShapeKindSpec {\n readonly id: ShapeKind;\n /** The fields of the outline, relative to the top-left corner of the box. A name with `?` is optional. */\n readonly fields: readonly string[];\n /** The kinds of `LayoutBox.shape` that agree with this kind. */\n readonly regions: readonly Region[\"kind\"][];\n readonly geometry: ShapeGeometry;\n}\n\n/**\n * The declared shape kinds, in their order. Only `rect` has all of its geometry.\n * `polygon` and `circle` have their bounding box and their exact area. `free` has its bounding box only.\n */\nexport const SHAPE_KINDS: readonly ShapeKindSpec[] = Object.freeze([\n { id: \"rect\", fields: [\"w\", \"h\"], regions: [\"rect\"], geometry: { bounds: true, area: true, contains: true, overlap: true } },\n { id: \"polygon\", fields: [\"points\", \"holes?\"], regions: [\"polygon\"], geometry: { bounds: true, area: true, contains: false, overlap: false } },\n { id: \"circle\", fields: [\"cx\", \"cy\", \"r\"], regions: [\"circle\"], geometry: { bounds: true, area: true, contains: false, overlap: false } },\n { id: \"free\", fields: [\"w\", \"h\", \"shape?\"], regions: [\"rect\", \"polygon\", \"circle\", \"ellipse\"], geometry: { bounds: true, area: false, contains: false, overlap: false } },\n] as const);\n\n/** The ids of `SHAPE_KINDS`, in their order. */\nexport const SHAPE_KIND_IDS: readonly ShapeKind[] = Object.freeze(SHAPE_KINDS.map((k) => k.id));\n\n/** The shape kinds of a measure or a rule without `shapes`. The contract measured only rectangles before L46. */\nexport const DEFAULT_SHAPES: readonly ShapeKind[] = Object.freeze([\"rect\"] as const);\n\n/** A measure or a rule, with the shape kinds that it supports. Without `shapes`, it supports `DEFAULT_SHAPES`. */\nexport interface ShapeSupport<Id extends string = string> {\n readonly id: Id;\n /** The kinds with an exact count or value. */\n readonly shapes?: readonly ShapeKind[];\n /**\n * The kinds with a safe count: the rule can count a break that is not real, but it does not miss a real break.\n * Thus a safe count of 0 tells that the rule has no break. A kind is in `shapes` or in `safe`, not in the two lists.\n */\n readonly safe?: readonly ShapeKind[];\n /**\n * The kinds where the value of a measure is a bound of the true value, not the exact value. `ShapeBound` tells the side.\n * A kind is in one list only: `shapes`, `safe` or `bound.shapes`. `docs/SHAPES.md` tells what a bound value proves.\n */\n readonly bound?: ShapeBound;\n}\n\n/**\n * The kinds where a measure gives a bound of the true value, and the side of the bound.\n * With `upper`, the value is the true value or more. With `lower`, the value is the true value or less.\n */\nexport interface ShapeBound {\n readonly shapes: readonly ShapeKind[];\n readonly side: \"upper\" | \"lower\";\n}\n\n/** The level of a rule on a shape kind: an exact count, a safe count (an upper bound), or no support. */\nexport type RuleLevel = \"exact\" | \"safe\" | \"none\";\n\n/** This function gives the level of a rule on a shape kind. A kind of `shapesOf` is `exact`, a kind of `safe` is `safe`, and another kind is `none`. It does not read `bound`. */\nexport function ruleLevel(rule: Pick<ShapeSupport, \"shapes\" | \"safe\">, kind: ShapeKind): RuleLevel {\n if (shapesOf(rule).includes(kind)) return \"exact\";\n return rule.safe?.includes(kind) === true ? \"safe\" : \"none\";\n}\n\n/** The level of a measure or a rule on a shape kind. The level `bound` is a value on one side of the true value (`ShapeBound`). */\nexport type ShapeLevel = RuleLevel | \"bound\";\n\n/**\n * This function gives the level of a measure or a rule on a shape kind. It joins the lists `shapes`, `safe` and `bound.shapes`.\n * A kind of `shapesOf` is `exact`, a kind of `safe` is `safe`, a kind of `bound.shapes` is `bound`, and another kind is `none`.\n */\nexport function shapeLevel(use: Pick<ShapeSupport, \"shapes\" | \"safe\" | \"bound\">, kind: ShapeKind): ShapeLevel {\n const level = ruleLevel(use, kind);\n if (level !== \"none\") return level;\n return use.bound?.shapes.includes(kind) === true ? \"bound\" : \"none\";\n}\n\n/**\n * This function gives the problems of a list of measures and rules. An empty list tells that the list is good.\n * It refuses an unknown kind, a kind two times in one list, and a kind in more than one of `shapesOf`, `safe` and `bound.shapes`.\n * It also refuses a `bound` without a list of kinds, and a `side` that is not `upper` or `lower`.\n */\nexport function shapeSupportProblems(uses: readonly ShapeSupport[]): string[] {\n const out: string[] = [];\n for (const use of uses) {\n const bound: unknown = use.bound;\n const isBound = typeof bound === \"object\" && bound !== null && !Array.isArray(bound);\n if (bound !== undefined && !isBound) out.push(`${use.id}: the bound value is not an object with shapes and a side`);\n const boundShapes = isBound ? (bound as { readonly shapes?: unknown }).shapes : undefined;\n for (const [name, list] of [[\"shapes\", use.shapes], [\"safe\", use.safe], [\"bound\", boundShapes]] as const) {\n if (list === undefined && (name !== \"bound\" || !isBound)) continue;\n if (!Array.isArray(list)) {\n out.push(`${use.id}: the ${name === \"bound\" ? \"bound shapes\" : name} value is not a list of shape kinds`);\n continue;\n }\n list.forEach((k: unknown, i) => {\n if (!isShapeKind(k)) out.push(`${use.id}: the ${name} kind ${String(k)} is not a declared kind`);\n else if (list.indexOf(k) !== i) out.push(`${use.id}: the ${name} list has the kind ${k} two times`);\n });\n }\n const exact: readonly unknown[] = use.shapes === undefined ? DEFAULT_SHAPES : Array.isArray(use.shapes) ? use.shapes : [];\n if (Array.isArray(use.safe)) for (const k of new Set<unknown>(use.safe)) if (exact.includes(k)) out.push(`${use.id}: the kind ${String(k)} is in shapes and in safe`);\n if (!isBound) continue;\n const side: unknown = (bound as { readonly side?: unknown }).side;\n if (side !== \"upper\" && side !== \"lower\") out.push(`${use.id}: the bound side ${String(side)} is not upper or lower`);\n if (!Array.isArray(boundShapes)) continue;\n const safe: readonly unknown[] = Array.isArray(use.safe) ? use.safe : [];\n for (const k of new Set<unknown>(boundShapes)) {\n if (exact.includes(k)) out.push(`${use.id}: the kind ${String(k)} is in shapes and in bound`);\n if (safe.includes(k)) out.push(`${use.id}: the kind ${String(k)} is in safe and in bound`);\n }\n }\n return out;\n}\n\nconst REGION_KIND: Readonly<Record<Region[\"kind\"], ShapeKind>> = { rect: \"rect\", polygon: \"polygon\", circle: \"circle\", ellipse: \"free\" };\n\n/** This function tells if a value is a declared shape kind. */\nexport function isShapeKind(value: unknown): value is ShapeKind {\n return typeof value === \"string\" && (SHAPE_KIND_IDS as readonly string[]).includes(value);\n}\n\n/**\n * This function gives the shape kind of a box. A box with `shapeKind` has that kind.\n * Without it, the kind comes from `shape`: no shape is a `rect`, and an ellipse is `free`.\n */\nexport function shapeKindOf(box: LayoutBox): ShapeKind {\n if (box.shapeKind !== undefined) return box.shapeKind;\n return box.shape === undefined ? \"rect\" : REGION_KIND[box.shape.kind];\n}\n\n/**\n * This function gives the exact area of a box, or `undefined` when the contract knows only its bounding box.\n * A box with `shape` gives `regionArea` of the shape. A `rect` box without `shape` gives `w` by `h`.\n * A box of the kind `free` gives `undefined`, also with a shape. Thus a box with an ellipse shape gives `undefined`, because `shapeKindOf` makes an ellipse `free`.\n * A box of another kind without `shape` is a bad input, and gives `undefined`.\n */\nexport function boxArea(box: LayoutBox): number | undefined {\n const kind = shapeKindOf(box);\n if (kind === \"free\") return undefined;\n if (box.shape !== undefined) return regionArea(box.shape);\n return kind === \"rect\" ? box.w * box.h : undefined;\n}\n\n/** This function gives the shape kinds of the boxes of an input, in the order of `SHAPE_KINDS`. An input without boxes gives an empty list. */\nexport function shapeKindsOf(input: Pick<LayoutInput, \"boxes\">): ShapeKind[] {\n const seen = new Set(input.boxes.map(shapeKindOf));\n return SHAPE_KIND_IDS.filter((k) => seen.has(k));\n}\n\n/** This function gives the value of the cell dimension `itemShape` of an input: its one kind, `mixed` for more kinds, or `rect` without boxes. */\nexport function itemShapeOf(input: Pick<LayoutInput, \"boxes\">): ShapeKind | \"mixed\" {\n const kinds = shapeKindsOf(input);\n return kinds.length === 0 ? \"rect\" : kinds.length === 1 ? kinds[0]! : \"mixed\";\n}\n\n/** This function gives the problem of the shape kind of a box, or `undefined` when `shapeKind` and `shape` agree. */\nexport function shapeKindProblem(box: LayoutBox): string | undefined {\n const k: unknown = box.shapeKind;\n if (k === undefined) return undefined;\n const spec = SHAPE_KINDS.find((s) => s.id === k);\n if (spec === undefined) return `box ${box.id}: the shape kind ${String(k)} is not a declared kind`;\n if (box.shape === undefined) return k === \"rect\" || k === \"free\" ? undefined : `box ${box.id}: the shape kind ${k} has no shape`;\n if (!spec.regions.includes(box.shape.kind)) return `box ${box.id}: the shape kind ${k} does not agree with a shape of the kind ${box.shape.kind}`;\n return undefined;\n}\n\n/** This function gives the shape kinds that a measure or a rule supports. */\nexport function shapesOf(use: Pick<ShapeSupport, \"shapes\">): readonly ShapeKind[] {\n return use.shapes ?? DEFAULT_SHAPES;\n}\n\n/** The options of `checkShapes`. */\nexport interface ShapeCheck {\n /**\n * The lowest level that `checkShapes` accepts. The default `exact` refuses a kind with only a safe count or a bound value.\n * The value `safe` also accepts a kind of `safe`, as in 0.2.16. Use it only when the run claims that a rule has no break.\n * The value `bound` also accepts a kind of `safe` and a kind of `bound.shapes`. Use it only when the run reads each bound value for the proofs of its side (`docs/SHAPES.md`).\n */\n readonly level?: \"exact\" | \"safe\" | \"bound\";\n}\n\n/**\n * This function checks that each measure and each rule of a run supports each shape kind of the input. An empty list tells that the run is good.\n * Each break has the claim `shape`, the id of the input, and the first 5 ids of the boxes of the kind.\n * By default, a kind of `safe` or of `bound.shapes` is a break, because the result is not exact.\n * With the level `safe`, a kind of `safe` is not a break. With the level `bound`, a kind of `safe` and a kind of `bound.shapes` are not a break.\n */\nexport function checkShapes(input: Pick<LayoutInput, \"id\" | \"boxes\">, uses: readonly ShapeSupport[], options: ShapeCheck = {}): ClaimBreak[] {\n const kinds = shapeKindsOf(input);\n const out: ClaimBreak[] = [];\n for (const use of uses) {\n const shapes = shapesOf(use);\n for (const kind of kinds) {\n const level = shapeLevel(use, kind);\n const accepts = level === \"exact\" || (level === \"safe\" && (options.level === \"safe\" || options.level === \"bound\")) || (level === \"bound\" && options.level === \"bound\");\n if (accepts) continue;\n const ids = input.boxes.filter((b) => shapeKindOf(b) === kind).map((b) => b.id);\n const shown = ids.slice(0, 5).join(\", \") + (ids.length > 5 ? `, and ${ids.length - 5} more` : \"\");\n const safe =\n level === \"safe\" ? `. The count of ${use.id} on ${kind} is only safe` : level === \"bound\" ? `. The value of ${use.id} is only ${use.bound!.side === \"upper\" ? \"an upper\" : \"a lower\"} bound for ${kind}` : \"\";\n out.push({\n claim: \"shape\",\n detail: `${use.id} supports only the shape kinds ${shapes.join(\", \") || \"(none)\"}, but the input ${input.id} has ${kind} boxes: ${shown}${safe}`,\n inputs: [input.id],\n });\n }\n }\n return out;\n}\n","/** The epsilon for the float compares in an engine. */\nexport const EPS = 1e-6;\n\n/**\n * The count of grid steps in one unit of a written file. A file rounds each number `v` to `Math.round(v * RECORD_SCALE) / RECORD_SCALE`.\n * Use a multiplication by this value, not a division by `RECORD_EPS`. The two differ at some half steps.\n */\nexport const RECORD_SCALE = 1000;\n\n/**\n * The epsilon for the float compares on a written file. A file rounds each number to 3 decimals,\n * so a difference of two values can move by up to 0.001. It is `1 / RECORD_SCALE`.\n */\nexport const RECORD_EPS = 1e-3;\n\n/**\n * The tolerance of each hard rule, in layout units. A record writes the tolerance that its run used,\n * in its field `tolerance`, next to `hard`.\n */\nexport interface Tolerance {\n /** Two boxes with their margins break `no-overlap` when their insides overlap by more than this on each axis. */\n readonly overlap: number;\n /** A route breaks `no-pass-through` when a part longer than this is inside a box made this much smaller. */\n readonly through: number;\n}\n\n/**\n * The default tolerance of each rule. The packer is exact, so `overlap` is one unit of the rounding.\n * Routes are sampled curves that follow the margin line, so `through` is larger.\n */\nexport const DEFAULT_TOLERANCE: Tolerance = Object.freeze({ overlap: 0.001, through: 0.5 });\n","import type { Margin, Point, Region, Side } from \"./geometry.ts\";\nimport type { ShapeKind } from \"./shapes.ts\";\n\n/**\n * A port of a box: a place where edges go into the box.\n * With `x` and `y`, the port is fixed on the border of the box, relative to its top-left corner.\n * With `side` and `along`, the port is fixed at a fraction of its side.\n * With only a side, the router places the port on that side. Without a side, the router picks the side.\n */\nexport interface Port {\n readonly id: string;\n readonly side?: Side;\n readonly x?: number;\n readonly y?: number;\n /**\n * The place of the port on its `side`: a fraction from 0 to 1, from the start of the side.\n * The start of `left` and `right` is the top end. The start of `top` and `bottom` is the left end.\n * It needs a `side`. A port with `along` has no `x` and no `y`.\n */\n readonly along?: number;\n}\n\n/**\n * This function gives the point of a port on the border of its box, relative to the top-left corner of the box.\n * A port with `x` and `y` gives that point. A port with `side` and `along` gives the point at that fraction of the side.\n * Another port gives `undefined`, because the router picks its point.\n */\nexport function portPoint(box: Pick<LayoutBox, \"w\" | \"h\">, port: Port): Point | undefined {\n if (port.x !== undefined && port.y !== undefined) return { x: port.x, y: port.y };\n if (port.side === undefined || port.along === undefined) return undefined;\n switch (port.side) {\n case \"top\":\n return { x: port.along * box.w, y: 0 };\n case \"bottom\":\n return { x: port.along * box.w, y: box.h };\n case \"left\":\n return { x: 0, y: port.along * box.h };\n case \"right\":\n return { x: box.w, y: port.along * box.h };\n }\n}\n\n/** A box of an input. In the packer, its name is item. */\nexport interface LayoutBox {\n readonly id: string;\n readonly w: number;\n readonly h: number;\n /** The packer writes the position. The router reads it. */\n readonly x?: number;\n readonly y?: number;\n /** A locked box keeps `x` and `y`. The packer reads it as an obstacle. */\n readonly locked?: boolean;\n /** The reading order. Without it, the order of the array is the rank. */\n readonly rank?: number;\n readonly parent?: string;\n readonly group?: string;\n /** A region relative to the origin of the box. Without it, the box is the rectangle `w` by `h`. */\n readonly shape?: Region;\n /**\n * The shape kind of the box (`docs/SHAPES.md`). Without it, `shapeKindOf` gives the kind of `shape`, or `rect` without a shape.\n * The kind `free` tells that the contract knows only the bounding box `w` by `h`.\n */\n readonly shapeKind?: ShapeKind;\n readonly ports?: readonly Port[];\n /** A ring around the box. No other box enters it. Only a route from a port of the box enters it, at a right angle. */\n readonly margin?: Margin;\n /** The packer can turn the box by 90 degrees. The output has the turned box and ports. */\n readonly turnable?: boolean;\n /** The free data of the node. The grouping rule `keys` of `highways` reads `data.group`. */\n readonly data?: Readonly<Record<string, unknown>>;\n}\n\n/** The packer name of a box. It is the same type. */\nexport type Item = LayoutBox;\n\n/** An edge between two boxes, with optional ports. */\nexport interface LayoutEdge {\n readonly id: string;\n readonly source: string;\n readonly target: string;\n readonly sourcePort?: string;\n readonly targetPort?: string;\n readonly data?: Readonly<Record<string, unknown>>;\n}\n\n/** The container. `fixed` tells which sides of the size stay. */\nexport interface LayoutContainer {\n readonly w?: number;\n readonly h?: number;\n readonly fixed: \"size\" | \"width\" | \"height\" | \"none\";\n /** The target aspect: the width divided by the height. The default is 1. */\n readonly aspect?: number;\n /** The weight of the aspect error in the objective. 0 gives the least area. The default is 1. */\n readonly aspectWeight?: number;\n /** The shape. Without it, the container is the rectangle from 0, 0 to `w`, `h`. */\n readonly shape?: Region;\n /** The space between the border and the boxes with their margins. */\n readonly inset?: number;\n}\n\n/** An area that boxes and routes avoid. Without `move`, it stays. With `move`, the packer can move it for `cost` times the distance. */\nexport interface Obstacle {\n readonly id: string;\n readonly region: Region;\n readonly move?: { readonly cost: number };\n}\n\n/** The generator of an input. The same name, version, parameters and seed give the same file, byte for byte. */\nexport interface LayoutGenerator {\n readonly name: string;\n readonly version: number;\n readonly params: Readonly<Record<string, unknown>>;\n readonly seed: number;\n}\n\n/**\n * One minimum distance between two boxes (`a` and `b`). It replaces the two margins of the boxes for this pair, and the global `gap`.\n * The order of `a` and `b` has no meaning. A pair without an entry keeps the margins and the `gap`.\n */\nexport interface PairGap {\n readonly a: string;\n readonly b: string;\n /** The minimum distance between the two boxes, in units: a finite number of 0 or more. */\n readonly gap: number;\n /** The count of the channels that the gap has space for. It is information only: a whole number of 0 or more. */\n readonly lanes?: number;\n}\n\n/** The cell of an input in the taxonomy: one value for each dimension. The dimensions are in `docs/FORMAT.md` of `packing`. */\nexport interface LayoutCell {\n readonly containerSize?: \"fixed\" | \"freeHeight\" | \"freeWidth\" | \"freeAspect\" | \"freeArea\";\n readonly containerShape?: \"rect\" | \"convex\" | \"polygon\" | \"circle\" | \"ellipse\" | \"holes\";\n readonly obstacles?: \"none\" | \"center\" | \"scattered\" | \"wall\" | \"corridors\" | \"touching\" | \"edge\";\n readonly sizes?: \"identical\" | \"uniform\" | \"heavyTail\" | \"bimodal\" | \"extremeAspect\" | \"nearIdentical\";\n readonly count?: \"1\" | \"10\" | \"100\" | \"1k\" | \"10k\";\n readonly mode?: \"offline\" | \"online\" | \"incremental\";\n readonly edgeDensity?: \"sparse\" | \"medium\" | \"dense\";\n readonly edgeShape?: \"random\" | \"clustered\" | \"hubChain\" | \"longRange\" | \"tree\" | \"bundled\";\n readonly groups?: \"none\" | \"flat\" | \"nested\";\n readonly ports?: \"free\" | \"sides\" | \"fixed\";\n /** The shape kinds of the boxes: one kind, or `mixed` for more kinds. Without it, each box is a `rect`. `itemShapeOf` gives the value. */\n readonly itemShape?: ShapeKind | \"mixed\";\n}\n\n/** An input of the corpus: the format `layout-input/1`. */\nexport interface LayoutInput {\n readonly schema: \"layout-input/1\";\n readonly id: string;\n readonly set?: string;\n readonly family?: string;\n readonly seed?: number;\n /** The origin: `made-up`, `published:<set>` or `known-best:<construction>`. */\n readonly source?: string;\n /** The first 16 hex characters of the SHA-256 of the canonical file without this field. */\n readonly hash?: string;\n /** The generator of the input. `null` or no value tells that a person made the input. */\n readonly generator?: LayoutGenerator | null;\n /** The steps that changed the input after its generator, in their order. `edgeStep` adds one. */\n readonly steps?: readonly LayoutGenerator[];\n readonly cell?: LayoutCell;\n /** The place of the input in a sequence of changes. */\n readonly step?: number;\n /** A router input can have no container. */\n readonly container?: LayoutContainer;\n /** The free space between two boxes with their margins. Routes use it. */\n readonly gap?: number;\n /** The distances of some pairs of boxes. An entry replaces the margins and the `gap` for its pair. `canonicalInput` sorts the list. */\n readonly pairGaps?: readonly PairGap[];\n readonly boxes: readonly LayoutBox[];\n readonly edges?: readonly LayoutEdge[];\n readonly obstacles?: readonly Obstacle[];\n /**\n * A variant names its base input and its change.\n * With `packed`, the variant is the packed output of its base input: the router routes the positions of that pack.\n */\n readonly base?: string;\n readonly change?: \"add\" | \"remove\" | \"resize\" | \"reorder\" | \"packed\";\n /**\n * The fields that a corpus registry removed, because a dimension value made them wrong (`CorpusDimension.invalidates`).\n * The names are sorted. An input with no removed field has no `invalidated`.\n */\n readonly invalidated?: readonly string[];\n}\n\n/** The input of a packer: a `layout-input/1` file without the edges. */\nexport interface PackInput {\n readonly container: LayoutContainer;\n readonly items: readonly Item[];\n readonly obstacles?: readonly Obstacle[];\n readonly gap?: number;\n readonly pairGaps?: readonly PairGap[];\n}\n\n/** This function gives the packer input of a file. An input without a container gets `{ fixed: \"none\" }`, so the packer picks the size. */\nexport function toPackInput(input: LayoutInput): PackInput {\n return {\n container: input.container ?? { fixed: \"none\" },\n items: input.boxes,\n ...(input.obstacles === undefined ? {} : { obstacles: input.obstacles }),\n ...(input.gap === undefined ? {} : { gap: input.gap }),\n ...(input.pairGaps === undefined ? {} : { pairGaps: input.pairGaps }),\n };\n}\n\n/** This function compares two strings by their UTF-16 code units, as `Array.prototype.sort` does without a compare function. */\nconst byCode = (x: string, y: string): number => (x < y ? -1 : x > y ? 1 : 0);\n\n/**\n * This function gives the canonical form of an input. `documentHash` uses it for each `layout-input/1` document.\n * Each pair of `pairGaps` gets `a` before `b`, and the list is sorted by `a` and then by `b`.\n * An input without `pairGaps` is the same object, so its hash does not change.\n */\nexport function canonicalInput<T extends LayoutInput>(input: T): T {\n if (!Array.isArray(input.pairGaps)) return input;\n const pairGaps = input.pairGaps\n .map((p): PairGap => (byCode(p.a, p.b) > 0 ? { ...p, a: p.b, b: p.a } : p))\n .sort((x, y) => byCode(x.a, y.a) || byCode(x.b, y.b));\n return { ...input, pairGaps };\n}\n","import { SIDES, marginSides, type Margin, type Region, type Side } from \"./geometry.ts\";\nimport type { LayoutBox, Port } from \"./input.ts\";\n\n/*\n * The turn: 90 degrees clockwise, with the y axis down. The turned box has `w` and `h` swapped,\n * and its top-left corner stays at the position of the box. A point (px, py) of a box of height h\n * goes to (h - py, px). Thus the top-left corner goes to the top-right corner, and each side moves\n * one step clockwise: top to right, right to bottom, bottom to left, left to top.\n */\n\n/** This function gives the side after a turn of 90 degrees clockwise. */\nexport function turnSide(side: Side): Side {\n return SIDES[(SIDES.indexOf(side) + 1) % 4]!;\n}\n\n/** This function gives a point of a box of height `h` after the turn. */\nexport function turnPoint(x: number, y: number, h: number): [number, number] {\n return [h - y, x];\n}\n\n/**\n * This function gives a port of a box of height `h` after the turn. Each value of the port turns, also a port with only `x` or only `y`.\n * The start of a side is its top end or its left end. Thus `left` goes to `top` and `right` goes to `bottom` with `along` changed to `1 - along`.\n * `top` goes to `right` and `bottom` goes to `left` with the same `along`.\n */\nexport function turnPort(port: Port, h: number): Port {\n const { side, x, y, along, ...rest } = port;\n const flips = side === \"left\" || side === \"right\";\n return {\n ...rest,\n ...(side === undefined ? {} : { side: turnSide(side) }),\n ...(y === undefined ? {} : { x: h - y }),\n ...(x === undefined ? {} : { y: x }),\n ...(along === undefined ? {} : { along: flips ? 1 - along : along }),\n };\n}\n\n/** This function gives a margin after the turn: the value of each side moves one side clockwise. */\nexport function turnMargin(margin: Margin): Margin {\n if (typeof margin === \"number\") return margin;\n const m = marginSides(margin);\n return { top: m.left, right: m.top, bottom: m.right, left: m.bottom };\n}\n\n/** This function gives a region relative to the origin of a box of height `h` after the turn. */\nexport function turnRegion(region: Region, h: number): Region {\n switch (region.kind) {\n case \"rect\":\n return { kind: \"rect\", x: h - region.y - region.h, y: region.x, w: region.h, h: region.w };\n case \"circle\":\n return { ...region, cx: h - region.cy, cy: region.cx };\n case \"ellipse\":\n return { kind: \"ellipse\", cx: h - region.cy, cy: region.cx, rx: region.ry, ry: region.rx };\n case \"polygon\": {\n const turn = (ring: readonly (readonly [number, number])[]): [number, number][] => ring.map(([x, y]) => turnPoint(x, y, h));\n return region.holes === undefined\n ? { kind: \"polygon\", points: turn(region.points) }\n : { kind: \"polygon\", points: turn(region.points), holes: region.holes.map(turn) };\n }\n }\n}\n\n/** This function gives a box after the turn: the size, the ports, the margin and the shape turn. The position stays. */\nexport function turnBox(box: LayoutBox): LayoutBox {\n return {\n ...box,\n w: box.h,\n h: box.w,\n ...(box.ports === undefined ? {} : { ports: box.ports.map((p) => turnPort(p, box.h)) }),\n ...(box.margin === undefined ? {} : { margin: turnMargin(box.margin) }),\n ...(box.shape === undefined ? {} : { shape: turnRegion(box.shape, box.h) }),\n };\n}\n","import { boundsOf, translate } from \"./geometry.ts\";\nimport type { LayoutInput } from \"./input.ts\";\nimport { turnBox } from \"./turn.ts\";\n\n/** The position of one item. `turn` is 90 when the packer turned a turnable item. */\nexport interface Placement {\n readonly id: string;\n readonly x: number;\n readonly y: number;\n readonly turn?: 0 | 90;\n}\n\n/** The facts of one stage of a strategy, for the records and the site. */\nexport interface StageTrace {\n readonly id: string;\n readonly ms?: number;\n readonly measures?: Readonly<Record<string, number>>;\n}\n\n/** The output of a packer. It does not change the input. */\nexport interface PackOutput {\n readonly placements: readonly Placement[];\n /** The ids of the items that the packer did not place. */\n readonly overflow: readonly string[];\n /** The size of the container after the pack. For a free size, the size that the search found. */\n readonly size: { readonly w: number; readonly h: number };\n /** The new top-left corner of the bounding box of each obstacle that moved. */\n readonly moved: readonly { readonly id: string; readonly x: number; readonly y: number }[];\n readonly trace?: readonly StageTrace[];\n}\n\n/**\n * This function gives the input with the output of a packer applied. Each placed box gets its position.\n * A turned box gets its turned size, ports, margin and shape. Each moved obstacle moves.\n * The container gets the size of the output. The router reads this result. It does not read `turn`.\n */\nexport function applyPack(input: LayoutInput, output: PackOutput): LayoutInput {\n const at = new Map(output.placements.map((p) => [p.id, p]));\n const moved = new Map(output.moved.map((m) => [m.id, m]));\n const boxes = input.boxes.map((box) => {\n const p = at.get(box.id);\n if (p === undefined) return box;\n const turned = p.turn === 90 ? turnBox(box) : box;\n return { ...turned, x: p.x, y: p.y };\n });\n const obstacles = input.obstacles?.map((o) => {\n const m = moved.get(o.id);\n if (m === undefined) return o;\n const b = boundsOf(o.region);\n return { ...o, region: translate(o.region, m.x - b.x, m.y - b.y) };\n });\n return {\n ...input,\n container: { ...(input.container ?? { fixed: \"none\" }), w: output.size.w, h: output.size.h },\n boxes,\n ...(obstacles === undefined ? {} : { obstacles }),\n };\n}\n","import type { Tolerance } from \"./tolerance.ts\";\nimport type { LayoutInput } from \"./input.ts\";\nimport { shapeKindsOf, type ShapeKind } from \"./shapes.ts\";\n\n/** The stage of a record: the packer, the router, or both together. */\nexport type Stage = \"pack\" | \"route\" | \"joint\";\n\n/** One run of one strategy on one input and seed: the format `layout-record/1`. A run writes one line of JSON Lines. */\nexport interface LayoutRecord {\n readonly schema: \"layout-record/1\";\n readonly stage: Stage;\n readonly step: string;\n readonly strategy: string;\n /** The options in full, with the defaults. */\n readonly options: Readonly<Record<string, unknown>>;\n readonly corpus: string;\n /** The id of the input. */\n readonly input: string;\n /** The `hash` of the input file. */\n readonly inputHash: string;\n readonly set: string;\n readonly seed: number;\n readonly nodes: number;\n readonly edges: number;\n /** The shape kinds of the boxes of the input, in the order of `SHAPE_KINDS`. Without it, each box is a `rect`. */\n readonly shapes?: readonly ShapeKind[];\n /** The value of each measure, by its name: `pack.*`, `route.*` or `joint.*`. */\n readonly measures: Readonly<Record<string, number>>;\n /** The count of the breaks of each hard rule. A good run has 0 for each rule. */\n readonly hard: Readonly<Record<string, number>>;\n /** The tolerance of each hard rule of the run. */\n readonly tolerance?: Readonly<Partial<Tolerance>>;\n /** `true` when two runs with the same seed give the same positions. */\n readonly deterministic: boolean;\n /** The id of the prediction that was written before the run. */\n readonly prediction?: string;\n /** The median of `msRuns`, or the time of the one run. */\n readonly ms: number;\n /** The time of each timed repeat, in milliseconds. */\n readonly msRuns?: readonly number[];\n /**\n * The first 16 hex characters of the SHA-256 of the canonical output of the stage.\n * The packer hashes its placements by the order of the ids. The router hashes its routes by the order of the edge ids.\n */\n readonly outputHash?: string;\n /** The facts of the computer of the run. */\n readonly env?: RunEnv;\n /** The reason when the strategy did not run, for example an input over its `maxNodes`. Then the record has no measures. */\n readonly skipped?: string;\n readonly commit?: string;\n}\n\n/**\n * The values that a strategy supports, for each dimension of a taxonomy.\n * The dimension names are in `docs/FORMAT.md` of `packing` and `docs/LAYOUT-RECORDS.md` of `highways`.\n */\nexport type Supports = Readonly<Record<string, readonly string[]>>;\n\n/** The facts of the computer of a run. */\nexport interface RunEnv {\n readonly node: string;\n readonly os: string;\n readonly arch: string;\n /** The name of the runner, for example `ubuntu-latest` or `local`. */\n readonly runner: string;\n /** The model of the processor. */\n readonly cpu: string;\n /** The count of the logical processors. */\n readonly cpus: number;\n}\n\n/** The facts of a run that the input does not give. */\nexport type RunFacts = Omit<LayoutRecord, \"schema\" | \"input\" | \"inputHash\" | \"set\" | \"nodes\" | \"edges\" | \"shapes\">;\n\n/**\n * This function gives the record of a run. The input gives its id, its hash, its set and the counts of the nodes and the edges.\n * The input also gives `shapes`. An input with only `rect` boxes gets no `shapes`, so its record does not change.\n */\nexport function toLayoutRecord(input: LayoutInput, run: RunFacts): LayoutRecord {\n const shapes = shapeKindsOf(input);\n const onlyRect = shapes.length === 0 || (shapes.length === 1 && shapes[0] === \"rect\");\n return {\n schema: \"layout-record/1\",\n ...run,\n input: input.id,\n inputHash: input.hash ?? \"\",\n set: input.set ?? \"\",\n nodes: input.boxes.length,\n edges: input.edges?.length ?? 0,\n ...(onlyRect ? {} : { shapes }),\n };\n}\n","import { boundsOf, grow, overlapOf, type Rect, type Region } from \"./geometry.ts\";\nimport type { LayoutBox, LayoutInput, Obstacle, PairGap, Port } from \"./input.ts\";\nimport { applyPack, type PackOutput } from \"./output.ts\";\nimport { SHAPE_KIND_IDS, shapeKindProblem, type ShapeSupport } from \"./shapes.ts\";\nimport { DEFAULT_TOLERANCE, EPS, RECORD_EPS } from \"./tolerance.ts\";\n\n/** This function gives the area of a placed box: its shape or its rectangle, at its position. A box without a position gives `undefined`. */\nexport function placedRect(box: LayoutBox): Rect | undefined {\n if (box.x === undefined || box.y === undefined) return undefined;\n if (box.shape === undefined) return { x: box.x, y: box.y, w: box.w, h: box.h };\n const b = boundsOf(box.shape);\n return { x: box.x + b.x, y: box.y + b.y, w: b.w, h: b.h };\n}\n\n/**\n * This function counts the pairs of placed boxes whose insides, with their margins, overlap by more than `tolerance` on each axis.\n * A box with a shape counts as its bounding box. That area is larger, thus the count is safe.\n *\n * A pair of `pairGaps`, in either order, uses its `gap` in place of the two margins. One box grows by the gap, and the other box does not grow.\n * Thus the pair breaks the rule only when the boxes are nearer than the gap on each axis. The other pairs do not change.\n */\nexport function countOverlaps(boxes: readonly LayoutBox[], tolerance: number = DEFAULT_TOLERANCE.overlap, pairGaps?: readonly PairGap[]): number {\n if (pairGaps === undefined || pairGaps.length === 0) return marginOverlaps(boxes, tolerance, undefined);\n const gaps = new Map<string, number>();\n for (const p of pairGaps) {\n const key = pairKey(p.a, p.b);\n if (p.a !== p.b && !gaps.has(key)) gaps.set(key, p.gap);\n }\n const raw = new Map<string, Rect>();\n for (const box of boxes) {\n const r = placedRect(box);\n if (r !== undefined && !raw.has(box.id)) raw.set(box.id, r);\n }\n let count = marginOverlaps(boxes, tolerance, gaps);\n for (const [key, gap] of gaps) {\n const [a, b] = JSON.parse(key) as [string, string];\n const ra = raw.get(a);\n const rb = raw.get(b);\n if (ra === undefined || rb === undefined) continue;\n const o = overlapOf(grow(ra, gap), rb);\n if (o.x > tolerance && o.y > tolerance) count++;\n }\n return count;\n}\n\n/** This function gives the key of a pair of box ids, with the same key for each order. */\nconst pairKey = (a: string, b: string): string => JSON.stringify(a < b ? [a, b] : [b, a]);\n\n/** This function counts the overlaps of the boxes with their margins. It skips the pairs of `skip`. Without `skip`, it is the rule of 0.2.13. */\nfunction marginOverlaps(boxes: readonly LayoutBox[], tolerance: number, skip: ReadonlyMap<string, number> | undefined): number {\n const rects: { readonly id: string; readonly r: Rect }[] = [];\n for (const box of boxes) {\n const r = placedRect(box);\n if (r !== undefined) rects.push({ id: box.id, r: grow(r, box.margin) });\n }\n rects.sort((a, b) => a.r.x - b.r.x);\n let count = 0;\n for (let i = 0; i < rects.length; i++) {\n const a = rects[i]!.r;\n for (let j = i + 1; j < rects.length; j++) {\n const b = rects[j]!.r;\n if (b.x >= a.x + a.w - tolerance) break;\n if (skip !== undefined && skip.has(pairKey(rects[i]!.id, rects[j]!.id))) continue;\n const o = overlapOf(a, b);\n if (o.x > tolerance && o.y > tolerance) count++;\n }\n }\n return count;\n}\n\n/** The options of the container test of `countOutside` and `packHard`. */\nexport interface ContainerTest {\n /**\n * With `true`, a box of a shaped container with the size `fixed` must stay inside the shape, not only inside its bounding box.\n * The default is `false`. The default changes to `true` at the next breaking version.\n */\n readonly exactContainer?: boolean;\n}\n\n/**\n * This function counts the placed boxes that go out of the container.\n * Each box with its margin must stay inside the container made smaller by `inset`. Only the fixed sides of the size count. A shaped container counts as its bounding box.\n *\n * With `exactContainer`, a box of a shaped container with the size `fixed` also counts when `rectInRegion` tells that it is not inside the shape.\n * For that test, the box grows by `inset` and becomes smaller by `tolerance` on each side. A shaped container with a free side keeps the bounding test only.\n * An input without a container gives 0.\n */\nexport function countOutside(input: LayoutInput, tolerance: number = DEFAULT_TOLERANCE.overlap, options: ContainerTest = {}): number {\n const c = input.container;\n if (c === undefined) return 0;\n const shape = options.exactContainer === true && c.fixed === \"size\" ? c.shape : undefined;\n const area = c.shape === undefined ? { x: 0, y: 0, w: c.w ?? Infinity, h: c.h ?? Infinity } : boundsOf(c.shape);\n const inset = c.inset ?? 0;\n const fixW = c.fixed === \"size\" || c.fixed === \"width\";\n const fixH = c.fixed === \"size\" || c.fixed === \"height\";\n let count = 0;\n for (const box of input.boxes) {\n const r0 = placedRect(box);\n if (r0 === undefined) continue;\n const r = grow(r0, box.margin);\n const outX = r.x < area.x + inset - tolerance || r.x + r.w > area.x + area.w - inset + tolerance;\n const outY = r.y < area.y + inset - tolerance || r.y + r.h > area.y + area.h - inset + tolerance;\n if ((fixW && outX) || (fixH && outY)) count++;\n else if (shape !== undefined && !rectInRegion(shape, shrink(grow(r, inset), tolerance))) count++;\n }\n return count;\n}\n\n/** This function counts the fixed ports that are not on the border of their box, with the epsilon of a written file. A port without a side does not count. */\nexport function countPortsOffBorder(boxes: readonly LayoutBox[], eps: number = RECORD_EPS): number {\n let count = 0;\n for (const box of boxes) {\n for (const p of box.ports ?? []) {\n if (p.x === undefined || p.y === undefined || p.side === undefined) continue;\n const along = p.side === \"top\" || p.side === \"bottom\" ? p.x : p.y;\n const length = p.side === \"top\" || p.side === \"bottom\" ? box.w : box.h;\n const across = { top: p.y, bottom: p.y - box.h, left: p.x, right: p.x - box.w }[p.side];\n if (Math.abs(across) > eps || along < -eps || along > length + eps) count++;\n }\n }\n return count;\n}\n\n/** The count of the breaks of each hard rule of a pack. */\nexport interface PackHard {\n readonly \"no-overlap\": number;\n readonly \"in-container\": number;\n readonly \"locked-kept\": number;\n readonly complete: number;\n}\n\n/**\n * The hard rules of a pack, with the shape kinds that each rule supports.\n * `no-overlap` and `in-container` test the bounding box of a shape. That count is exact only for a `rect`.\n * For the other kinds, the count is safe: a shape is inside its bounding box, so the count is an upper bound. A count of 0 tells that the rule has no break.\n * `locked-kept` and `complete` read only the positions and the ids, so they support each kind.\n */\nexport const PACK_HARD_RULES: readonly ShapeSupport<keyof PackHard>[] = Object.freeze([\n { id: \"no-overlap\", shapes: [\"rect\"], safe: [\"polygon\", \"circle\", \"free\"] },\n { id: \"in-container\", shapes: [\"rect\"], safe: [\"polygon\", \"circle\", \"free\"] },\n { id: \"locked-kept\", shapes: SHAPE_KIND_IDS },\n { id: \"complete\", shapes: SHAPE_KIND_IDS },\n] as const);\n\n/** This function tells if the inside of `region` and the inside of `rect` have a common point. */\nexport function regionHitsRect(region: Region, rect: Rect): boolean {\n if (rect.w <= 0 || rect.h <= 0) return false;\n switch (region.kind) {\n case \"rect\": {\n const o = overlapOf(region, rect);\n return o.x > 0 && o.y > 0;\n }\n case \"circle\":\n return circleHitsRect(region.cx, region.cy, region.r, region.r, rect);\n case \"ellipse\":\n return circleHitsRect(region.cx, region.cy, region.rx, region.ry, rect);\n case \"polygon\": {\n const rings = [region.points, ...(region.holes ?? [])];\n const inside = (x: number, y: number): boolean => x > rect.x && x < rect.x + rect.w && y > rect.y && y < rect.y + rect.h;\n if (region.points.some(([x, y]) => inside(x, y))) return true;\n for (const ring of rings) {\n for (let i = 0; i < ring.length; i++) {\n const a = ring[i]!;\n const b = ring[(i + 1) % ring.length]!;\n const m = clipMid(a[0], a[1], b[0], b[1], rect);\n if (m !== undefined && inside(m[0], m[1])) return true;\n }\n }\n return pointInRings(rect.x + rect.w / 2, rect.y + rect.h / 2, rings);\n }\n }\n}\n\n/**\n * This function tells if all of `rect` is inside `region`. A point on the border counts as inside. No part of `rect` can overlap a hole.\n * The test of a circle, an ellipse or a polygon accepts an error of `EPS` on the border. A polygon can be concave.\n */\nexport function rectInRegion(region: Region, rect: Rect): boolean {\n const x1 = rect.x + rect.w;\n const y1 = rect.y + rect.h;\n const corners: readonly (readonly [number, number])[] = [\n [rect.x, rect.y],\n [x1, rect.y],\n [x1, y1],\n [rect.x, y1],\n ];\n switch (region.kind) {\n case \"rect\":\n return rect.x >= region.x && rect.y >= region.y && x1 <= region.x + region.w && y1 <= region.y + region.h;\n case \"circle\":\n return corners.every(([x, y]) => inEllipse(region.cx, region.cy, region.r, region.r, x, y));\n case \"ellipse\":\n return corners.every(([x, y]) => inEllipse(region.cx, region.cy, region.rx, region.ry, x, y));\n case \"polygon\": {\n const ring = region.points;\n if (ring.length < 3) return false;\n const points = [...corners, [rect.x + rect.w / 2, rect.y + rect.h / 2] as const];\n if (!points.every(([x, y]) => onRing(x, y, ring) || pointInRings(x, y, [ring]))) return false;\n const deep = (x: number, y: number): boolean => x > rect.x + EPS && x < x1 - EPS && y > rect.y + EPS && y < y1 - EPS;\n for (let i = 0; i < ring.length; i++) {\n const a = ring[i]!;\n const b = ring[(i + 1) % ring.length]!;\n const m = clipMid(a[0], a[1], b[0], b[1], rect);\n if (m !== undefined && deep(m[0], m[1])) return false;\n }\n return (region.holes ?? []).every((hole) => !regionHitsRect({ kind: \"polygon\", points: hole }, rect));\n }\n }\n}\n\n/** This function gives the rectangle made smaller by `d` on each side. A side does not become smaller than 0. */\nfunction shrink(r: Rect, d: number): Rect {\n const dx = Math.min(d, r.w / 2);\n const dy = Math.min(d, r.h / 2);\n return { x: r.x + dx, y: r.y + dy, w: r.w - 2 * dx, h: r.h - 2 * dy };\n}\n\n/** This function tells if a point is inside an ellipse or on its border, with an error of `EPS`. */\nfunction inEllipse(cx: number, cy: number, rx: number, ry: number, x: number, y: number): boolean {\n if (rx <= 0 || ry <= 0) return false;\n const u = (x - cx) / rx;\n const v = (y - cy) / ry;\n return u * u + v * v <= 1 + EPS;\n}\n\n/** This function tells if a point is on a ring of a polygon, with an error of `EPS`. */\nfunction onRing(x: number, y: number, ring: readonly (readonly [number, number])[]): boolean {\n for (let i = 0; i < ring.length; i++) {\n const [ax, ay] = ring[i]!;\n const [bx, by] = ring[(i + 1) % ring.length]!;\n const dx = bx - ax;\n const dy = by - ay;\n const len2 = dx * dx + dy * dy;\n const t = len2 === 0 ? 0 : Math.max(0, Math.min(1, ((x - ax) * dx + (y - ay) * dy) / len2));\n if (Math.hypot(x - (ax + t * dx), y - (ay + t * dy)) <= EPS) return true;\n }\n return false;\n}\n\n/** An ellipse with the radii `rx` and `ry` scales to a unit circle. The rectangle scales with it. */\nfunction circleHitsRect(cx: number, cy: number, rx: number, ry: number, rect: Rect): boolean {\n if (rx <= 0 || ry <= 0) return false;\n const x0 = (rect.x - cx) / rx;\n const x1 = (rect.x + rect.w - cx) / rx;\n const y0 = (rect.y - cy) / ry;\n const y1 = (rect.y + rect.h - cy) / ry;\n const dx = Math.max(x0, 0, -x1);\n const dy = Math.max(y0, 0, -y1);\n return dx * dx + dy * dy < 1;\n}\n\n/** This function gives the middle of the part of a segment inside a rectangle, or `undefined` when that part is a point or empty. */\nfunction clipMid(ax: number, ay: number, bx: number, by: number, r: Rect): readonly [number, number] | undefined {\n let t0 = 0;\n let t1 = 1;\n const dx = bx - ax;\n const dy = by - ay;\n const edges: readonly (readonly [number, number])[] = [\n [-dx, ax - r.x],\n [dx, r.x + r.w - ax],\n [-dy, ay - r.y],\n [dy, r.y + r.h - ay],\n ];\n for (const [p, q] of edges) {\n if (p === 0) {\n if (q < 0) return undefined;\n } else if (p < 0) {\n t0 = Math.max(t0, q / p);\n } else {\n t1 = Math.min(t1, q / p);\n }\n }\n if (t1 <= t0) return undefined;\n const t = (t0 + t1) / 2;\n return [ax + t * dx, ay + t * dy];\n}\n\n/** The even-odd rule over the outer ring and the holes. */\nfunction pointInRings(x: number, y: number, rings: readonly (readonly (readonly [number, number])[])[]): boolean {\n let inside = false;\n for (const ring of rings) {\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n const [xi, yi] = ring[i]!;\n const [xj, yj] = ring[j]!;\n if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) inside = !inside;\n }\n }\n return inside;\n}\n\n/**\n * This function counts the pairs of a placed box and an obstacle that overlap by more than `tolerance`.\n * The box counts with its margin. A box with a shape counts as its bounding box.\n */\nexport function countObstacleHits(\n boxes: readonly LayoutBox[],\n obstacles: readonly Obstacle[] | undefined,\n tolerance: number = DEFAULT_TOLERANCE.overlap,\n): number {\n if (obstacles === undefined || obstacles.length === 0) return 0;\n let count = 0;\n for (const box of boxes) {\n const r0 = placedRect(box);\n if (r0 === undefined) continue;\n const r = grow(r0, box.margin);\n const small = { x: r.x + tolerance, y: r.y + tolerance, w: r.w - 2 * tolerance, h: r.h - 2 * tolerance };\n for (const o of obstacles) if (regionHitsRect(o.region, small)) count++;\n }\n return count;\n}\n\n/**\n * This function gives the count of each hard rule of the output of a packer.\n * It applies the output with `applyPack`. Only the placed boxes and the locked boxes count for the overlaps and the container.\n * `no-overlap` counts the pairs of boxes and the pairs of a box and an obstacle. A pair of `pairGaps` uses its gap in place of the margins.\n *\n * A locked box without a placement, or with a move of more than `RECORD_EPS`, breaks `locked-kept`.\n * A locked box without a position in the input is a bad input, not a break. `checkInput` finds it.\n * Another box without a placement that is not in `overflow` breaks `complete`.\n *\n * `options` goes to `countOutside` for `in-container`.\n */\nexport function packHard(input: LayoutInput, output: PackOutput, tolerance: number = DEFAULT_TOLERANCE.overlap, options: ContainerTest = {}): PackHard {\n const after = applyPack(input, output);\n const placed = new Set(output.placements.map((p) => p.id));\n const out = new Set(output.overflow);\n const was = new Map(input.boxes.map((b) => [b.id, b]));\n let lockedMoved = 0;\n let incomplete = 0;\n const kept: LayoutBox[] = [];\n for (const box of after.boxes) {\n const old = was.get(box.id);\n if (old?.locked === true) {\n if (old.x === undefined || old.y === undefined) continue;\n const moved = Math.abs(old.x - (box.x ?? old.x)) > RECORD_EPS || Math.abs(old.y - (box.y ?? old.y)) > RECORD_EPS;\n if (!placed.has(box.id) || moved) lockedMoved++;\n kept.push(box);\n } else if (placed.has(box.id)) {\n kept.push(box);\n } else if (!out.has(box.id)) {\n incomplete++;\n }\n }\n return {\n \"no-overlap\": countOverlaps(kept, tolerance, input.pairGaps) + countObstacleHits(kept, after.obstacles, tolerance),\n \"in-container\": countOutside({ ...after, boxes: kept }, tolerance, options),\n \"locked-kept\": lockedMoved,\n complete: incomplete,\n };\n}\n\n/**\n * This function gives the problems of an input file. An empty list tells that the file is good.\n * A problem is a bad input, not a break of a hard rule. Thus an engine refuses the input.\n * In `pairGaps`, an unknown box, a pair of one box, a repeated pair in either order, a bad `gap` and bad `lanes` are problems.\n * A port with `along` and no `side`, with `x` or `y`, or with a value outside [0, 1] is a problem.\n */\nexport function checkInput(input: LayoutInput): readonly string[] {\n const problems: string[] = [];\n const ids = new Set<string>();\n for (const box of input.boxes) {\n if (ids.has(box.id)) problems.push(`box ${box.id}: the id is not unique`);\n ids.add(box.id);\n if (!(box.w > 0 && box.h > 0 && Number.isFinite(box.w) && Number.isFinite(box.h))) problems.push(`box ${box.id}: the size is not positive and finite`);\n if (box.locked === true && (box.x === undefined || box.y === undefined)) problems.push(`box ${box.id}: a locked box has no position`);\n const shape = shapeKindProblem(box);\n if (shape !== undefined) problems.push(shape);\n for (const port of box.ports ?? []) problems.push(...alongProblems(box.id, port));\n }\n if (countPortsOffBorder(input.boxes) > 0) problems.push(\"a fixed port is not on the border of its box\");\n for (const edge of input.edges ?? []) {\n if (!ids.has(edge.source) || !ids.has(edge.target)) problems.push(`edge ${edge.id}: a box of the edge is not in the input`);\n }\n problems.push(...pairGapProblems(input.pairGaps, ids));\n return problems;\n}\n\n/** This function gives the problems of the `along` of a port: no side, a value outside [0, 1], or `x` or `y` with it. A port without `along` has no problem. */\nfunction alongProblems(boxId: string, port: Port): string[] {\n if (port.along === undefined) return [];\n const at = `box ${boxId} port ${port.id}`;\n const problems: string[] = [];\n if (port.side === undefined) problems.push(`${at}: a port with along has no side`);\n if (typeof port.along !== \"number\" || !Number.isFinite(port.along) || port.along < 0 || port.along > 1)\n problems.push(`${at}: the along value ${String(port.along)} is not a finite number from 0 to 1`);\n if (port.x !== undefined || port.y !== undefined) problems.push(`${at}: a port with along also has x or y`);\n return problems;\n}\n\n/** This function gives the problems of the `pairGaps` of an input. `ids` has the ids of the boxes. */\nfunction pairGapProblems(pairGaps: LayoutInput[\"pairGaps\"], ids: ReadonlySet<string>): string[] {\n if (pairGaps === undefined) return [];\n if (!Array.isArray(pairGaps)) return [\"pairGaps: the value is not a list\"];\n const problems: string[] = [];\n const seen = new Map<string, number>();\n pairGaps.forEach((p: PairGap, i) => {\n const at = `pair gap ${i} (${String(p?.a)}, ${String(p?.b)})`;\n if (typeof p !== \"object\" || p === null || typeof p.a !== \"string\" || typeof p.b !== \"string\") {\n problems.push(`pair gap ${i}: the entry has no string ids a and b`);\n return;\n }\n for (const id of [p.a, p.b]) if (!ids.has(id)) problems.push(`${at}: the box ${id} is not in the input`);\n if (p.a === p.b) problems.push(`${at}: the two ids are the same box`);\n if (typeof p.gap !== \"number\" || !Number.isFinite(p.gap) || p.gap < 0) problems.push(`${at}: the gap ${String(p.gap)} is not a finite number of 0 or more`);\n if (p.lanes !== undefined && (typeof p.lanes !== \"number\" || !Number.isInteger(p.lanes) || p.lanes < 0))\n problems.push(`${at}: the lanes value ${String(p.lanes)} is not a whole number of 0 or more`);\n const key = JSON.stringify(p.a < p.b ? [p.a, p.b] : [p.b, p.a]);\n const first = seen.get(key);\n if (first !== undefined) problems.push(`${at}: the pair is also pair gap ${first}`);\n else seen.set(key, i);\n });\n return problems;\n}\n","import { SHAPE_KIND_IDS, type ShapeBound, type ShapeKind } from \"./shapes.ts\";\nimport { RECORD_EPS, RECORD_SCALE } from \"./tolerance.ts\";\n\n/** The direction of a measure: the side of the better values. */\nexport type Direction = \"lower\" | \"higher\";\n\n/**\n * The facts of one measure: its unit, its direction and its range.\n * `floor` and `tol` are the parameters of the floor rule of the promotion rule (`docs/PROMOTION.md` of `highways`).\n * Each engine exports the specs of its own measures. This package exports the specs of the `joint.*` measures.\n */\nexport interface MeasureSpec<Id extends string = string> {\n readonly id: Id;\n readonly unit: string;\n readonly direction: Direction;\n /** The lowest value. */\n readonly min: number;\n /** The highest value. The value `Infinity` tells that the measure has no upper limit. */\n readonly max: number;\n /** The family of the measure in the measure note of its engine. */\n readonly family?: string;\n /** The best value. Without it, the measure has no floor. */\n readonly floor?: number;\n /** The absolute tolerance at the floor. */\n readonly tol?: number;\n /**\n * The smallest change that counts as better or worse. A number is an absolute change. `{ rel }` is a share of the larger of the two values.\n * `docs/JOINT-MEASURES.md` gives the reason of each joint value.\n */\n readonly minEffect?: number | { readonly rel: number };\n /** The role of the measure in the joint selector. */\n readonly role?: \"guard\" | \"change-guard\" | \"diagnostic\" | \"time\";\n /** The shape kinds of the boxes that the measure supports. Without it, the measure supports only `rect`. `checkShapes` refuses the other kinds. */\n readonly shapes?: readonly ShapeKind[];\n /**\n * The kinds where the value is a bound of the true value, and its side. A kind is in `shapes` or in `bound.shapes`, not in the two lists.\n * `checkShapes` refuses a bound kind by default and with `{ level: \"safe\" }`. With `{ level: \"bound\" }`, it accepts it. `docs/SHAPES.md` tells what a bound value proves for each `direction`.\n */\n readonly bound?: ShapeBound;\n}\n\n/** The id of a joint measure. `docs/JOINT-MEASURES.md` gives the definitions. */\nexport type JointMeasureId =\n | \"joint.fill\"\n | \"joint.aspectError\"\n | \"joint.spill\"\n | \"joint.straight.crossings\"\n | \"joint.straight.length\"\n | \"joint.stability.mean\"\n | \"joint.stability.moved\"\n | \"joint.proxy.rank\"\n | \"joint.ms\";\n\n/** The shape kinds of a joint measure that reads only the bounding boxes, the centers and the positions of the boxes. */\nconst BOUNDS_ONLY = SHAPE_KIND_IDS;\n/** The shape kinds of a joint measure that reads the area `w` by `h` of each box. */\nconst AREA: readonly ShapeKind[] = [\"rect\"];\n\n/**\n * The specs of the joint measures, in the order of `docs/JOINT-MEASURES.md`.\n * `joint.fill` and `joint.straight.length` read the area of each box, so they support only `rect`. `docs/SHAPES.md` tells the reasons.\n */\nexport const JOINT_MEASURES: readonly MeasureSpec<JointMeasureId>[] = Object.freeze([\n { id: \"joint.fill\", minEffect: 0.001, unit: \"0 to 1\", direction: \"higher\", min: 0, max: 1, floor: 1, role: \"guard\", shapes: AREA },\n { id: \"joint.aspectError\", minEffect: 0.01, unit: \"natural log\", direction: \"lower\", min: 0, max: Infinity, floor: 0, tol: 0.01, role: \"guard\", shapes: BOUNDS_ONLY },\n { id: \"joint.spill\", minEffect: 0.001, unit: \"0 to 1\", direction: \"lower\", min: 0, max: 1, floor: 0, tol: 0.001, role: \"guard\", shapes: BOUNDS_ONLY },\n { id: \"joint.straight.crossings\", minEffect: 0, unit: \"count\", direction: \"lower\", min: 0, max: Infinity, floor: 0, tol: 0, role: \"guard\", shapes: BOUNDS_ONLY },\n { id: \"joint.straight.length\", minEffect: 0.01, unit: \"S for each edge\", direction: \"lower\", min: 0, max: Infinity, floor: 0, tol: 0.01, role: \"guard\", shapes: AREA },\n { id: \"joint.stability.mean\", minEffect: 0.005, unit: \"W\", direction: \"lower\", min: 0, max: Infinity, floor: 0, tol: 0.005, role: \"change-guard\", shapes: BOUNDS_ONLY },\n { id: \"joint.stability.moved\", minEffect: 0.02, unit: \"0 to 1\", direction: \"lower\", min: 0, max: 1, floor: 0, tol: 0.02, role: \"change-guard\", shapes: BOUNDS_ONLY },\n { id: \"joint.proxy.rank\", unit: \"-1 to 1\", direction: \"higher\", min: -1, max: 1, role: \"diagnostic\", shapes: BOUNDS_ONLY },\n { id: \"joint.ms\", unit: \"milliseconds\", direction: \"lower\", min: 0, max: Infinity, role: \"time\", shapes: BOUNDS_ONLY },\n] as const);\n\n/** The threshold of `joint.stability.moved`, in widths `W` of the base. */\nexport const JOINT_MOVED_MIN = 0.01;\n\n/** The result of a compare of a candidate with a baseline on one measure. A tie is not better. */\nexport type Verdict = \"better\" | \"worse\" | \"tie\";\n\n/**\n * This function gives the smallest change of a measure that counts between the values `a` and `b`.\n * The value is `max(RECORD_EPS, minEffect)`, or `max(RECORD_EPS, rel * max(|a|, |b|))` for a relative `minEffect`.\n * The larger value makes the threshold the same after a swap of `a` and `b`.\n */\nexport function minEffectOf(spec: Pick<MeasureSpec, \"minEffect\">, a = 0, b = 0): number {\n const m = spec.minEffect ?? 0;\n const t = typeof m === \"number\" ? m : m.rel * Math.max(Math.abs(a), Math.abs(b));\n return Math.max(RECORD_EPS, Number.isFinite(t) ? t : 0);\n}\n\n/** The slack of the threshold in grid steps. It absorbs only the float noise of the threshold, because the change is a whole number. */\nconst STEP_NOISE = 1e-6;\n\n/**\n * This function compares the value `candidate` with the value `baseline` of one measure on one input.\n * The compare uses whole grid steps of `RECORD_EPS`. Thus a live value and its rounded record give the same verdict.\n * A change of at most the threshold of `minEffectOf` in grid steps is a tie. A swap of the two values swaps better and worse.\n * Two equal values are a tie, also two infinite values. A value `NaN` is an error.\n */\nexport function compareMeasure(candidate: number, baseline: number, spec: Pick<MeasureSpec, \"direction\" | \"minEffect\">): Verdict {\n if (Number.isNaN(candidate) || Number.isNaN(baseline)) throw new RangeError(\"compareMeasure: a value is NaN\");\n if (candidate === baseline) return \"tie\";\n const a = Math.round(candidate * RECORD_SCALE);\n const b = Math.round(baseline * RECORD_SCALE);\n let delta: number;\n if (Number.isSafeInteger(a) && Number.isSafeInteger(b)) {\n delta = a - b;\n const m = spec.minEffect ?? 0;\n const t = typeof m === \"number\" ? m * RECORD_SCALE : m.rel * Math.max(Math.abs(a), Math.abs(b));\n if (Math.abs(delta) <= Math.max(1, Number.isFinite(t) ? t : 0) + STEP_NOISE) return \"tie\";\n } else {\n delta = candidate - baseline;\n if (!(Math.abs(delta) > minEffectOf(spec, candidate, baseline))) return \"tie\";\n }\n const better = spec.direction === \"lower\" ? delta < 0 : delta > 0;\n return better ? \"better\" : \"worse\";\n}\n","/** This function gives the UTF-8 bytes of a string. The package has no runtime dependencies, thus it does not use `TextEncoder`. */\nexport function utf8(text: string): number[] {\n const bytes: number[] = [];\n for (const ch of text) {\n const c = ch.codePointAt(0)!;\n if (c < 0x80) bytes.push(c);\n else if (c < 0x800) bytes.push(0xc0 | (c >> 6), 0x80 | (c & 63));\n else if (c < 0x10000) bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 63), 0x80 | (c & 63));\n else bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 63), 0x80 | ((c >> 6) & 63), 0x80 | (c & 63));\n }\n return bytes;\n}\n","import { utf8 } from \"./utf8.ts\";\n\n/** This function gives a generator of random numbers in [0, 1). It is `mulberry32`, as in `docs/FORMAT.md` of `packing`. */\nexport function mulberry32(seed: number): () => number {\n let s = seed >>> 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/** This function gives the FNV-1a hash of 32 bits of the UTF-8 bytes of a string. */\nexport function fnv1a32(text: string): number {\n let h = 0x811c9dc5;\n for (const b of utf8(text)) h = Math.imul(h ^ b, 0x01000193) >>> 0;\n return h;\n}\n\n/** This function gives the generator of one step of a seeded generator: `mulberry32(fnv1a32(\"<seed>:<step>\"))`. */\nexport function stepRandom(seed: number, step: string): () => number {\n return mulberry32(fnv1a32(`${seed}:${step}`));\n}\n\n/** This function gives a whole number from `lo` to `hi`, both included. */\nexport function randomInt(r: () => number, lo: number, hi: number): number {\n return lo + Math.floor(r() * (hi - lo + 1));\n}\n","import { SIDES, type Side } from \"./geometry.ts\";\nimport type { LayoutBox, LayoutEdge, LayoutGenerator, LayoutInput, Port } from \"./input.ts\";\nimport { randomInt, stepRandom } from \"./random.ts\";\n\n/**\n * The shape of the edges of `edgeStep`. The values are the cells of `edgeShape`, and `hubs`.\n * `hubs` waits for the next breaking change to become a value of `LayoutCell.edgeShape`.\n */\nexport type EdgeShape = \"random\" | \"clustered\" | \"hubChain\" | \"hubs\" | \"longRange\" | \"tree\" | \"bundled\";\n\n/** The parameters of `edgeStep`. */\nexport interface EdgeStepParams {\n readonly edgeDensity: \"sparse\" | \"medium\" | \"dense\";\n readonly edgeShape: EdgeShape;\n /** The default is `none`. */\n readonly groups?: \"none\" | \"flat\" | \"nested\";\n /** The default is `free`. */\n readonly ports?: \"free\" | \"sides\" | \"fixed\";\n /** The order of the hubs of `hubs` and `tree`: the largest box first, or a random order. The default is `area`. */\n readonly hubBy?: \"area\" | \"random\";\n}\n\n/** The mean count of the edges of each box for each value of `edgeDensity`. */\nexport const EDGE_DENSITY: Readonly<Record<EdgeStepParams[\"edgeDensity\"], number>> = Object.freeze({ sparse: 0.5, medium: 1.5, dense: 4 });\n\n/** The version of `edgeStep`. A change of its output gives a new version. */\nexport const EDGE_STEP_VERSION = 1;\n\nconst CLUSTER = 8;\nconst CHAIN = 32;\nconst INSIDE = 0.85;\nconst FAN_SHARE = 0.6;\nconst FIXED_SHARE = 0.2;\nconst COLLECTIONS = [\"users\", \"orders\", \"items\", \"events\"] as const;\n\nconst round3 = (x: number): number => Math.round(x * 1000) / 1000;\n\n/**\n * This function gives the input with edges, groups and ports from its topology alone: a joint input has no positions before the pack.\n * The random numbers come from the steps `edges` and `ports` of `seed`. The function appends its stamp to `steps`, and removes the old `hash`.\n * The rules of each shape are in `docs/JOINT-CORPUS.md`.\n */\nexport function edgeStep(input: LayoutInput, params: EdgeStepParams, seed: number = input.seed ?? 0): LayoutInput {\n if ((input.edges?.length ?? 0) > 0) throw new RangeError(\"edgeStep: the input has edges already\");\n const full: Required<EdgeStepParams> = { groups: \"none\", ports: \"free\", hubBy: \"area\", ...params };\n const n = input.boxes.length;\n const r = stepRandom(seed, \"edges\");\n\n const perm = input.boxes.map((_, i) => i);\n for (let i = n - 1; i > 0; i--) {\n const j = randomInt(r, 0, i);\n [perm[i], perm[j]] = [perm[j]!, perm[i]!];\n }\n const clusterOf: number[] = new Array<number>(n);\n perm.forEach((box, p) => (clusterOf[box] = Math.floor(p / CLUSTER)));\n const clusters = Math.ceil(n / CLUSTER);\n const members = (c: number): readonly number[] => perm.slice(c * CLUSTER, (c + 1) * CLUSTER);\n const collectionOf =\n full.edgeShape === \"bundled\"\n ? clusterOf.map((c) => `${COLLECTIONS[c % COLLECTIONS.length]!}-${c}`)\n : input.boxes.map(() => COLLECTIONS[randomInt(r, 0, COLLECTIONS.length - 1)]!);\n const area = (i: number): number => input.boxes[i]!.w * input.boxes[i]!.h;\n const rank = full.hubBy === \"area\" ? input.boxes.map((_, i) => i).sort((a, b) => area(b) - area(a) || a - b) : perm;\n\n const pairs: [number, number][] = [];\n const seen = new Set<string>();\n const add = (u: number, v: number): void => {\n const key = u < v ? `${u}-${v}` : `${v}-${u}`;\n if (u === v || seen.has(key)) return;\n seen.add(key);\n pairs.push([u, v]);\n };\n const anyBox = (): number => randomInt(r, 0, n - 1);\n const inCluster = (c: number): number => {\n const m = members(c);\n return m[randomInt(r, 0, m.length - 1)]!;\n };\n const otherCluster = (c: number): number => {\n const o = randomInt(r, 0, clusters - 2);\n return o >= c ? o + 1 : o;\n };\n const target = Math.min(Math.round(n * EDGE_DENSITY[full.edgeDensity]), (n * (n - 1)) / 2);\n const fill = (pick: () => [number, number]): void => {\n for (let tries = 0; pairs.length < target && tries < target * 30; tries++) add(...pick());\n };\n const clustered = (): [number, number] => {\n const u = anyBox();\n return [u, r() < INSIDE ? inCluster(clusterOf[u]!) : anyBox()];\n };\n\n if (n >= 2) {\n switch (full.edgeShape) {\n case \"random\":\n fill(() => [anyBox(), anyBox()]);\n break;\n case \"clustered\":\n fill(clustered);\n break;\n case \"longRange\":\n fill(() => {\n const u = anyBox();\n return [u, clusters > 1 ? inCluster(otherCluster(clusterOf[u]!)) : anyBox()];\n });\n break;\n case \"hubs\":\n fill(() => [anyBox(), rank[Math.floor(n * r() ** 3)]!]);\n break;\n case \"tree\":\n for (let i = 1; i < n; i++) add(rank[randomInt(r, 0, i - 1)]!, rank[i]!);\n break;\n case \"hubChain\": {\n const k = Math.ceil(n / CHAIN);\n const length = Math.ceil(n / k);\n const chains = Array.from({ length: k }, (_, c) => perm.slice(c * length, (c + 1) * length));\n for (const chain of chains) for (let i = 0; i + 1 < chain.length; i++) add(chain[i]!, chain[i + 1]!);\n const skips = Math.max(0, target - pairs.length);\n for (let s = 0; s < skips; s++) {\n const c = k > 1 ? randomInt(r, 0, k - 2) : 0;\n const from = chains[c]!;\n const to = chains[k > 1 ? c + 1 : 0]!;\n const i = randomInt(r, 0, from.length - 1);\n const j = i + Math.floor(from.length / 8) + randomInt(r, 0, Math.floor(from.length / 2));\n if (j < to.length) add(from[i]!, to[j]!);\n }\n break;\n }\n case \"bundled\":\n for (let rounds = 0; pairs.length < target * FAN_SHARE && clusters > 1 && rounds < target; rounds++) {\n const u = anyBox();\n const c = otherCluster(clusterOf[u]!);\n const fan = randomInt(r, 4, 15);\n for (let f = 0; f < fan && pairs.length < target; f++) add(u, inCluster(c));\n }\n fill(clustered);\n break;\n }\n }\n\n const rp = stepRandom(seed, \"ports\");\n const ports: Port[][] = input.boxes.map((b) => [...(b.ports ?? [])]);\n const portOn = (box: LayoutBox, id: string, side: Side, fixed: boolean): Port => {\n if (!fixed) return { id, side };\n const along = round3(rp() * (side === \"top\" || side === \"bottom\" ? box.w : box.h));\n const at = { top: [along, 0], bottom: [along, box.h], left: [0, along], right: [box.w, along] }[side];\n return { id, side, x: at[0]!, y: at[1]! };\n };\n const out = new Set<number>();\n if (full.ports === \"fixed\") {\n input.boxes.forEach((box, i) => {\n if (rp() >= FIXED_SHARE) return;\n const side = SIDES[randomInt(rp, 0, 3)]!;\n ports[i]!.push(portOn(box, \"out\", side, true));\n out.add(i);\n });\n }\n const edges: LayoutEdge[] = pairs.map(([u, v], k) => {\n const id = `e${k}`;\n const s = input.boxes[u]!;\n const t = input.boxes[v]!;\n let ends: { sourcePort?: string; targetPort?: string } = {};\n if (full.ports === \"sides\") {\n ports[u]!.push(portOn(s, `${id}.s`, SIDES[randomInt(rp, 0, 3)]!, false));\n ports[v]!.push(portOn(t, `${id}.t`, SIDES[randomInt(rp, 0, 3)]!, false));\n ends = { sourcePort: `${id}.s`, targetPort: `${id}.t` };\n } else if (out.has(u)) {\n ends = { sourcePort: \"out\" };\n }\n return { id, source: s.id, target: t.id, ...ends, data: { collection: collectionOf[v]! } };\n });\n\n const boxes = input.boxes.map((box, i): LayoutBox => {\n const c = clusterOf[i]!;\n const group = full.groups === \"none\" ? undefined : `g${c}`;\n const path = full.groups === \"nested\" ? `G${Math.floor(c / 4)}/g${c}` : group;\n return {\n ...box,\n ...(group === undefined ? {} : { group, data: { ...box.data, group: path } }),\n ...(ports[i]!.length === 0 ? {} : { ports: ports[i]! }),\n };\n });\n const stamp: LayoutGenerator = { name: \"edges\", version: EDGE_STEP_VERSION, params: { ...full }, seed };\n const { hash: _old, ...rest } = input;\n return { ...rest, boxes, edges, steps: [...(input.steps ?? []), stamp] };\n}\n","import { canonicalInput, type LayoutInput } from \"./input.ts\";\nimport { RECORD_EPS } from \"./tolerance.ts\";\nimport { utf8 } from \"./utf8.ts\";\n\n/** The round constants of SHA-256. */\nconst K: readonly number[] = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe,\n 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n];\n\n/**\n * This function gives the SHA-256 digest of the UTF-8 bytes of a string, as 64 lowercase hex characters.\n * It uses no API of Node or of the browser.\n */\nexport function sha256Hex(text: string): string {\n const bytes = utf8(text);\n const bits = bytes.length * 8;\n const total = Math.ceil((bytes.length + 9) / 64) * 64;\n const data = new Uint8Array(total);\n data.set(bytes);\n data[bytes.length] = 0x80;\n const view = new DataView(data.buffer);\n view.setUint32(total - 8, Math.floor(bits / 0x100000000));\n view.setUint32(total - 4, bits >>> 0);\n const h = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19];\n const w = new Uint32Array(64);\n const rotr = (x: number, n: number): number => (x >>> n) | (x << (32 - n));\n for (let off = 0; off < total; off += 64) {\n for (let i = 0; i < 16; i++) w[i] = view.getUint32(off + 4 * i);\n for (let i = 16; i < 64; i++) {\n const a = w[i - 15]!;\n const b = w[i - 2]!;\n const s0 = rotr(a, 7) ^ rotr(a, 18) ^ (a >>> 3);\n const s1 = rotr(b, 17) ^ rotr(b, 19) ^ (b >>> 10);\n w[i] = (w[i - 16]! + s0 + w[i - 7]! + s1) >>> 0;\n }\n let [a, b, c, d, e, f, g, k] = h as [number, number, number, number, number, number, number, number];\n for (let i = 0; i < 64; i++) {\n const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);\n const ch = (e & f) ^ (~e & g);\n const t1 = (k + s1 + ch + K[i]! + w[i]!) >>> 0;\n const s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const t2 = (s0 + maj) >>> 0;\n k = g;\n g = f;\n f = e;\n e = (d + t1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) >>> 0;\n }\n h[0] = (h[0]! + a) >>> 0;\n h[1] = (h[1]! + b) >>> 0;\n h[2] = (h[2]! + c) >>> 0;\n h[3] = (h[3]! + d) >>> 0;\n h[4] = (h[4]! + e) >>> 0;\n h[5] = (h[5]! + f) >>> 0;\n h[6] = (h[6]! + g) >>> 0;\n h[7] = (h[7]! + k) >>> 0;\n }\n return h.map((x) => x.toString(16).padStart(8, \"0\")).join(\"\");\n}\n\n/**\n * This function gives the canonical form of a value: sorted keys and no whitespace, with the numbers of `JSON.stringify`.\n * A key with the value `undefined` is not in the form. An `undefined` in an array becomes `null`.\n */\nexport function canonicalJson(value: unknown): string {\n if (value === null || typeof value !== \"object\") return JSON.stringify(value) ?? \"null\";\n if (Array.isArray(value)) return `[${value.map((v: unknown) => (v === undefined ? \"null\" : canonicalJson(v))).join(\",\")}]`;\n const o = value as Record<string, unknown>;\n const keys = Object.keys(o)\n .filter((k) => o[k] !== undefined)\n .sort();\n return `{${keys.map((k) => `${JSON.stringify(k)}:${canonicalJson(o[k])}`).join(\",\")}}`;\n}\n\n/** The options of `outputHash` and `documentHash`. */\nexport interface HashOptions {\n /**\n * The step of the grid of the numbers. The default is `RECORD_EPS`, so a number keeps 3 decimals.\n * The value `0` keeps the exact numbers. A negative value or a value that is not finite causes a `RangeError`.\n */\n readonly grid?: number;\n}\n\n/** This function gives the factor of a grid: `1 / grid`, or `undefined` for the exact numbers. */\nfunction gridFactor(options: HashOptions): number | undefined {\n const grid = options.grid ?? RECORD_EPS;\n if (!Number.isFinite(grid) || grid < 0) throw new RangeError(`The grid ${grid} is not a finite number of 0 or more.`);\n return grid === 0 ? undefined : 1 / grid;\n}\n\n/**\n * This function gives a copy of a value with each number on the grid. The value `-0` becomes `0`.\n * It throws a `RangeError` for a number that is not finite.\n */\nfunction onGrid(value: unknown, path: string, k: number | undefined): unknown {\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new RangeError(`The value has the number ${value} at ${path}. JSON has no form for it.`);\n if (k === undefined) return value;\n const r = Math.round(value * k) / k;\n if (!Number.isFinite(r)) throw new RangeError(`The number at ${path} is too large for the grid.`);\n return r === 0 ? 0 : r;\n }\n if (value === null || typeof value !== \"object\") return value;\n if (Array.isArray(value)) return value.map((v: unknown, i) => onGrid(v, `${path}[${i}]`, k));\n const o = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(o)) out[key] = onGrid(o[key], `${path}.${key}`, k);\n return out;\n}\n\n/**\n * This function gives the hash of an output: the first 16 hex characters of the SHA-256 of its canonical form.\n * Before the canonical form, each number goes to the nearest point of the grid, and `-0` becomes `0`.\n * With the default grid, the rounding is `round3` of `packing`: `Math.round(x * 1000) / 1000`.\n * The function throws a `RangeError` for `NaN` and for an infinite number.\n *\n * The grid can split two outputs. Two numbers near a rounding boundary can go to two different points.\n * The grid can also merge two outputs whose numbers go to the same points. This merge is intentional: it removes the noise of floating-point numbers.\n */\nexport function outputHash(value: unknown, options: HashOptions = {}): string {\n return sha256Hex(canonicalJson(onGrid(value, \"$\", gridFactor(options)))).slice(0, 16);\n}\n\n/**\n * This function gives the hash of a document. It uses the rule of `outputHash`, but the form does not include the field `hash` of the document.\n * With the default grid, it is the input hash of `docs/FORMAT.md` of `packing`.\n * A document with the schema `layout-input/1` goes through `canonicalInput` first. Thus the order of its `pairGaps` does not change the hash.\n */\nexport function documentHash(doc: object, options: HashOptions = {}): string {\n const { hash: _hash, ...rest } = doc as { readonly hash?: unknown; readonly schema?: unknown };\n return outputHash(rest.schema === \"layout-input/1\" ? canonicalInput(rest as unknown as LayoutInput) : rest, options);\n}\n\n/** One output group: the candidates with the same output hash on each decision input. */\nexport interface OutputGroup {\n /** The id of the group: its first member. */\n readonly id: string;\n /** The ids of the candidates of the group, in sorted order. */\n readonly members: readonly string[];\n}\n\n/**\n * This function gives the output groups of the candidates. The key of `hashes` is the id of a candidate.\n * Its value is the list of the output hashes of the candidate, in the order of the decision inputs.\n * Candidates with equal lists make one group. The groups are in the order of their ids.\n * The function throws a `RangeError` when two lists have different lengths.\n */\nexport function outputGroups(hashes: Readonly<Record<string, readonly string[]>>): OutputGroup[] {\n const byList = new Map<string, string[]>();\n let first: string | undefined;\n for (const id of Object.keys(hashes)) {\n const list = hashes[id]!;\n if (first === undefined) first = id;\n else if (list.length !== hashes[first]!.length)\n throw new RangeError(`The candidate \"${id}\" has ${list.length} hashes, but \"${first}\" has ${hashes[first]!.length}.`);\n const key = JSON.stringify(list);\n const members = byList.get(key);\n if (members) members.push(id);\n else byList.set(key, [id]);\n }\n const groups = [...byList.values()].map((members): OutputGroup => {\n const sorted = [...members].sort();\n return { id: sorted[0]!, members: sorted };\n });\n return groups.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n}\n\n/** The evidence that a candidate is exercised on its decision inputs. */\nexport interface ExerciseEvidence {\n /** The move counts of the candidate, by name. A record keeps each one as the trace measure `move.<name>`. */\n readonly moves?: Readonly<Record<string, number>>;\n /** The output hashes of the candidate, in the order of the decision inputs. */\n readonly hashes?: readonly string[];\n /** The output hashes of the base of the candidate, in the same order. */\n readonly baseHashes?: readonly string[];\n}\n\n/**\n * This function tells if a candidate is exercised. It gives `true` when a move count is more than 0.\n * It also gives `true` when `hashes` and `baseHashes` are different at one place or more.\n * Without evidence, it gives `false`.\n * The function throws a `RangeError` when only one of the two lists is given, or when their lengths are different.\n */\nexport function exercised(evidence: ExerciseEvidence): boolean {\n const { moves, hashes, baseHashes } = evidence;\n if ((hashes === undefined) !== (baseHashes === undefined)) throw new RangeError(\"The evidence must have both hashes and baseHashes, or neither of them.\");\n if (hashes && baseHashes && hashes.length !== baseHashes.length)\n throw new RangeError(`The candidate has ${hashes.length} hashes, but its base has ${baseHashes.length}.`);\n if (moves && Object.values(moves).some((n) => n > 0)) return true;\n if (hashes && baseHashes) return hashes.some((h, i) => h !== baseHashes[i]);\n return false;\n}\n","import { outputHash } from \"./hash.ts\";\nimport { compareMeasure, type MeasureSpec } from \"./measures.ts\";\n\n/** The part of a `MeasureSpec` that a pick uses: the direction and the `minEffect`. */\nexport type PickSpec = Pick<MeasureSpec, \"direction\" | \"minEffect\">;\n\n/** A member of a portfolio: a function with an id. A portfolio is also a member. */\nexport interface Member<I, O> {\n readonly id: string;\n /** This function gives the output of the member for an input. */\n run(input: I): O;\n}\n\n/** One level of the key of a portfolio: a measure of an output. */\nexport interface PortfolioLevel<I, O> {\n /** The id of the level. The id `hard` is reserved. */\n readonly id: string;\n readonly spec: PickSpec;\n /** This function gives the value of the measure for the output of a member. The value must be finite. */\n value(input: I, output: O): number;\n}\n\n/** The key of a portfolio: the hard level, then the other levels in order. */\nexport interface PortfolioKey<I, O> {\n /** This function gives the count of hard breaks. It is level 0, with the direction `lower` and the `minEffect` 0. */\n hard(input: I, output: O): number;\n /** The levels after the hard level, in the order of the pick. */\n readonly levels: readonly PortfolioLevel<I, O>[];\n /** This function gives the hash of an output. The default is `outputHash` with the default grid. */\n hash?(output: O): string;\n}\n\n/** The options of a portfolio. */\nexport interface PortfolioOptions {\n /** The time limit in milliseconds, 0 or more. The first member always starts. A member that starts always finishes. */\n readonly budgetMs?: number;\n /** The largest count of members that run, a whole number of 1 or more. The other members are cut. */\n readonly maxMembers?: number;\n /** The clock in milliseconds. The default is `performance.now`, or `Date.now` without `performance`. */\n readonly now?: () => number;\n /**\n * The members that get an output hash. The default `all` hashes each member with the status `ran`. A hash that throws then gives the status `error`.\n * With `pick`, only member 0 and the winner get a hash, and only when the winner is not member 0. Then a hash that throws makes `pick` throw.\n */\n readonly hashes?: \"all\" | \"pick\";\n}\n\n/** The status of a member in a pick. */\nexport type MemberStatus = \"ran\" | \"cut\" | \"error\";\n\n/** The trace of one member in a pick. */\nexport interface MemberTrace {\n readonly id: string;\n readonly status: MemberStatus;\n /** The value of each level, with the key `hard` for the hard level. Only a member with the status `ran` has values. */\n readonly values?: Readonly<Record<string, number>>;\n /** The time of the run of the member, in milliseconds. */\n readonly ms?: number;\n /**\n * The hash of the output of the member. Under the option `hashes` \"all\" (the default), each member with the status `ran` has it.\n * Under `hashes` \"pick\", it is absent, except for member 0 and the winner when the winner is not member 0.\n */\n readonly outputHash?: string;\n /** The message of the error of a member with the status `error`. */\n readonly error?: string;\n}\n\n/** The trace of one pick of a portfolio. */\nexport interface PortfolioTrace {\n /** One entry for each member, in the order of the members. A cut member is also in the list. */\n readonly members: readonly MemberTrace[];\n readonly winner: string;\n /** The index of the winner in the list of the members. */\n readonly winnerIndex: number;\n /** The value `true` tells that the winner is not member 0 and has a different output hash. */\n readonly picked: boolean;\n /** The time of the full pick, in milliseconds. */\n readonly totalMs: number;\n readonly budgetMs?: number;\n readonly maxMembers?: number;\n /** The count of the cut members. */\n readonly cut: number;\n /** The value `false` tells that the time limit cut one member or more. Then a run on a different computer can give a different pick. */\n readonly deterministic: boolean;\n /** The ids of the members that stay in after each level of `selectBest`. The first list is for the hard level. */\n readonly kept: readonly (readonly string[])[];\n}\n\n/** The result of one pick of a portfolio: the output of the winner, its id and the trace. */\nexport interface PortfolioPick<O> {\n readonly output: O;\n readonly winner: string;\n readonly trace: PortfolioTrace;\n}\n\n/** A portfolio: a member that runs its members and gives the output of the best member. */\nexport interface Portfolio<I, O> extends Member<I, O> {\n /** This function starts the members on an input and gives the output of the winner with the trace. */\n pick(input: I): PortfolioPick<O>;\n}\n\n/** A candidate of `selectBest`: an id and the value of each level. */\nexport interface SelectCandidate {\n readonly id: string;\n readonly values: Readonly<Record<string, number>>;\n}\n\n/** A level of `selectBest`: the id of a value and its spec. */\nexport interface SelectLevel {\n readonly id: string;\n readonly spec: PickSpec;\n}\n\n/** The result of `selectBest`. */\nexport interface Selection {\n readonly winner: string;\n /** The ids of the candidates that stay in after each level, in the given order. */\n readonly kept: readonly (readonly string[])[];\n}\n\n/**\n * This function picks the best candidate. For each level, it finds the best value of the candidates that stay in.\n * It keeps each candidate that is not worse than that best value by `compareMeasure`.\n * The winner is the first candidate, in the given order, that stays in after the last level.\n * Without levels, the winner is the first candidate and `kept` is empty.\n *\n * The reason for the rule: a scan that compares each candidate with the current winner is not transitive, because of the `minEffect` ties.\n * Such a scan can drift away from the best value. An example: \"a\" is lower with the `minEffect` 0.005, and \"b\" is higher.\n * The candidates A (0, 1), B (0.004, 2) and C (0.008, 3) give the winner B.\n * The scan picks C, but A is better than C on \"a\".\n *\n * The function throws a `RangeError` for an empty list of candidates, for a missing value, and for a value that is not finite.\n */\nexport function selectBest(candidates: readonly SelectCandidate[], levels: readonly SelectLevel[]): Selection {\n if (candidates.length === 0) throw new RangeError(\"selectBest: the list of candidates is empty.\");\n for (const level of levels) {\n for (const c of candidates) {\n const v = c.values[level.id];\n if (typeof v !== \"number\") throw new RangeError(`selectBest: the candidate \"${c.id}\" has no value for the level \"${level.id}\".`);\n if (!Number.isFinite(v)) throw new RangeError(`selectBest: the candidate \"${c.id}\" has the value ${v} for the level \"${level.id}\".`);\n }\n }\n let alive: readonly SelectCandidate[] = candidates;\n const kept: (readonly string[])[] = [];\n for (const level of levels) {\n const at = (c: SelectCandidate): number => c.values[level.id]!;\n let best = at(alive[0]!);\n for (const c of alive) best = level.spec.direction === \"lower\" ? Math.min(best, at(c)) : Math.max(best, at(c));\n alive = alive.filter((c) => compareMeasure(at(c), best, level.spec) !== \"worse\");\n kept.push(alive.map((c) => c.id));\n }\n return { winner: alive[0]!.id, kept };\n}\n\n/** This function gives the move `pick` of a pick: 1 when `picked` is true, else 0. A record keeps it as the trace measure `move.pick`. */\nexport function pickMoves(trace: Pick<PortfolioTrace, \"picked\">): { pick: number } {\n return { pick: trace.picked ? 1 : 0 };\n}\n\n/** This function gives the default clock: `performance.now`, or `Date.now` without `performance`. */\nfunction defaultClock(): () => number {\n const perf = (globalThis as { readonly performance?: { now(): number } }).performance;\n return perf ? () => perf.now() : () => Date.now();\n}\n\n/** This function gives the message of an error value. */\nfunction messageOf(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n\n/** This function throws a `RangeError` for an empty list of members or for two members with the same id. */\nfunction checkMembers(id: string, members: readonly Member<unknown, unknown>[]): void {\n if (members.length === 0) throw new RangeError(`The portfolio \"${id}\" has no members.`);\n const seen = new Set<string>();\n for (const m of members) {\n if (seen.has(m.id)) throw new RangeError(`The portfolio \"${id}\" has two members with the id \"${m.id}\".`);\n seen.add(m.id);\n }\n}\n\n/** The result of the run of one member. */\ntype Ran<O> = { readonly ok: true; readonly output: O; readonly values: Record<string, number>; readonly hash?: string } | { readonly ok: false; readonly error: unknown };\n\n/**\n * This function makes a portfolio. Its `pick` starts the members in their order. `selectBest` picks the winner of the members with the status `ran`.\n * The first level is the hard level, then the levels of the key follow.\n * `members` is a list, or a function of the input that gives the list.\n *\n * A member that throws, or that gives a value that is not finite, gets the status `error`. It does not win.\n * When each member has an error, `pick` throws the error of the first member.\n * `docs/PORTFOLIO.md` tells the rules of the time limit, the trace and `picked`.\n *\n * The function throws a `RangeError` for a level with the id `hard`, for two levels with the same id and for a bad option.\n * It also throws a `RangeError` for an empty list of members, or for two members with the same id.\n */\nexport function portfolio<I, O>(\n id: string,\n members: readonly Member<I, O>[] | ((input: I) => readonly Member<I, O>[]),\n key: PortfolioKey<I, O>,\n options: PortfolioOptions = {},\n): Portfolio<I, O> {\n const levelIds = new Set<string>();\n for (const level of key.levels) {\n if (level.id === \"hard\") throw new RangeError(`The portfolio \"${id}\" has a level with the reserved id \"hard\".`);\n if (levelIds.has(level.id)) throw new RangeError(`The portfolio \"${id}\" has two levels with the id \"${level.id}\".`);\n levelIds.add(level.id);\n }\n const { budgetMs, maxMembers, hashes = \"all\" } = options;\n if (budgetMs !== undefined && !(budgetMs >= 0)) throw new RangeError(`The portfolio \"${id}\" has the budgetMs ${budgetMs}. It must be 0 or more.`);\n if (maxMembers !== undefined && !(Number.isInteger(maxMembers) && maxMembers >= 1))\n throw new RangeError(`The portfolio \"${id}\" has the maxMembers ${maxMembers}. It must be a whole number of 1 or more.`);\n if (hashes !== \"all\" && hashes !== \"pick\") throw new RangeError(`The portfolio \"${id}\" has the hashes ${String(hashes)}. It must be \"all\" or \"pick\".`);\n if (typeof members !== \"function\") checkMembers(id, members);\n const levels: readonly SelectLevel[] = [{ id: \"hard\", spec: { direction: \"lower\", minEffect: 0 } }, ...key.levels.map((l) => ({ id: l.id, spec: l.spec }))];\n const now = options.now ?? defaultClock();\n\n /** This function gives the hash of the output of a member. A hash that throws causes a `RangeError`. */\n const hashOf = (m: Member<I, O>, output: O): string => {\n try {\n return key.hash ? key.hash(output) : outputHash(output);\n } catch (e) {\n throw new RangeError(`The hash of the member \"${m.id}\" of the portfolio \"${id}\" throws: ${messageOf(e)}`, { cause: e });\n }\n };\n\n const evaluate = (m: Member<I, O>, input: I, output: O): Ran<O> => {\n const values: Record<string, number> = {};\n const measure = (level: string, f: () => number): void => {\n let v: number;\n try {\n v = f();\n } catch (e) {\n throw new RangeError(`The level \"${level}\" of the member \"${m.id}\" of the portfolio \"${id}\" throws: ${messageOf(e)}`, { cause: e });\n }\n if (typeof v !== \"number\" || !Number.isFinite(v))\n throw new RangeError(`The member \"${m.id}\" of the portfolio \"${id}\" has the value ${v} for the level \"${level}\".`);\n values[level] = v;\n };\n try {\n measure(\"hard\", () => key.hard(input, output));\n for (const level of key.levels) measure(level.id, () => level.value(input, output));\n if (hashes === \"pick\") return { ok: true, output, values };\n return { ok: true, output, values, hash: hashOf(m, output) };\n } catch (e) {\n return { ok: false, error: e };\n }\n };\n\n const pick = (input: I): PortfolioPick<O> => {\n const list = typeof members === \"function\" ? members(input) : members;\n if (typeof members === \"function\") checkMembers(id, list);\n const start = now();\n const traces: MemberTrace[] = [];\n const outputs = new Map<string, O>();\n const ran: SelectCandidate[] = [];\n let firstError: { readonly error: unknown } | undefined;\n let cut = 0;\n let outOfTime = false;\n for (let i = 0; i < list.length; i++) {\n const m = list[i]!;\n if (maxMembers !== undefined && i >= maxMembers) {\n traces.push({ id: m.id, status: \"cut\" });\n cut++;\n continue;\n }\n if (i > 0 && budgetMs !== undefined && (outOfTime || now() - start >= budgetMs)) {\n outOfTime = true;\n traces.push({ id: m.id, status: \"cut\" });\n cut++;\n continue;\n }\n const t0 = now();\n let result: Ran<O>;\n let ms: number;\n try {\n const output = m.run(input);\n ms = now() - t0;\n result = evaluate(m, input, output);\n } catch (e) {\n ms = now() - t0;\n result = { ok: false, error: e };\n }\n if (result.ok) {\n traces.push(\n result.hash === undefined\n ? { id: m.id, status: \"ran\", values: result.values, ms }\n : { id: m.id, status: \"ran\", values: result.values, ms, outputHash: result.hash },\n );\n outputs.set(m.id, result.output);\n ran.push({ id: m.id, values: result.values });\n } else {\n traces.push({ id: m.id, status: \"error\", ms, error: messageOf(result.error) });\n firstError ??= { error: result.error };\n }\n }\n if (ran.length === 0) throw firstError!.error;\n const { winner, kept } = selectBest(ran, levels);\n const winnerIndex = traces.findIndex((t) => t.id === winner);\n if (hashes === \"pick\" && winnerIndex > 0 && traces[0]!.status === \"ran\") {\n // Only member 0 and the winner get a hash. Their two trace entries are new objects with the hash.\n for (const i of [0, winnerIndex]) traces[i] = { ...traces[i]!, outputHash: hashOf(list[i]!, outputs.get(traces[i]!.id)!) };\n }\n const base = traces[0]!;\n const picked = winnerIndex > 0 && (base.status !== \"ran\" || traces[winnerIndex]!.outputHash !== base.outputHash);\n const trace: PortfolioTrace = {\n members: traces,\n winner,\n winnerIndex,\n picked,\n totalMs: now() - start,\n ...(budgetMs !== undefined ? { budgetMs } : {}),\n ...(maxMembers !== undefined ? { maxMembers } : {}),\n cut,\n deterministic: !outOfTime,\n kept,\n };\n return { output: outputs.get(winner)!, winner, trace };\n };\n\n return { id, pick, run: (input: I): O => pick(input).output };\n}\n","// The checks of the claims of a corpus (`docs/CORPUS-CHECKS.md`). The joint corpus, `packing` and `highways` use the same checks.\nimport { canonicalJson, sha256Hex } from \"./hash.ts\";\n\n/** One broken claim of a corpus, with the ids of the inputs that break it. */\nexport interface ClaimBreak {\n /** The name of the claim, for example `declared`, `split` or `index`. */\n readonly claim: string;\n /** The text of the break. */\n readonly detail: string;\n /** The ids of the inputs that break the claim. The list is empty when the break has no input. */\n readonly inputs: readonly string[];\n}\n\n/** The claim `claims.declared` of a manifest: the count of the inputs for each declared property. */\nexport interface DeclaredClaim {\n /** A property with fewer inputs than this count is thin. */\n readonly minCount: number;\n /** The ids of the properties with a count below `minCount`. */\n readonly thin: readonly string[];\n /** The count of the inputs for each property id. */\n readonly counts: Readonly<Record<string, number>>;\n /** The key of the family of an input. `familyOf` gives the key of one cell. The family is the unit of a verdict. */\n readonly familyBy?: FamilyBy;\n /** The minimum count of the inputs of each family. Without it, `checkDeclared` does not count the families. */\n readonly familyMin?: number;\n}\n\n/**\n * The key of the family of a cell (`docs/CORPUS-CHECKS.md`).\n *\n * - The flat form is a list of dimensions. The key is the values of these dimensions of the cell, in order, with `/` between them.\n * - The map form chooses an entry by the field `kind` of the cell, or the entry `\"*\"`. The key is the kind, then the values of the dimensions of the entry.\n */\nexport type FamilyBy = readonly string[] | { readonly [kind: string]: readonly string[] };\n\n/** A cell of an input: one value for each dimension. The map form of `FamilyBy` also reads the field `kind`. */\nexport type FamilyCell = Readonly<Record<string, unknown>>;\n\n/** The entry of the map form of `FamilyBy` for each kind without its own entry. */\nexport const FAMILY_ANY_KIND = \"*\";\n\n/** The separator of the parts of a family key. */\nconst FAMILY_SEP = \"/\";\n\n/** The parts of the key of one cell, or the text of the problem. */\ntype FamilyParts = { readonly parts: readonly string[] } | { readonly problem: string };\n\n/** This function gives the text of a dimension value. A missing value, or a value that is not a string, a number or a boolean, gives `undefined`. */\nfunction partOf(value: unknown): string | undefined {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return undefined;\n}\n\n/** This function gives the parts of the family key of a cell. A missing dimension, a missing kind or a kind without an entry gives a problem. */\nfunction familyParts(cell: FamilyCell, familyBy: FamilyBy): FamilyParts {\n let dims: readonly string[];\n let kind: string | undefined;\n const parts: string[] = [];\n if (Array.isArray(familyBy)) {\n dims = familyBy as readonly string[];\n } else {\n const map = familyBy as Readonly<Record<string, readonly string[]>>;\n kind = partOf(cell[\"kind\"]);\n if (kind === undefined) return { problem: \"a cell without kind, which the map form of familyBy needs\" };\n const entry = Object.hasOwn(map, kind) ? map[kind] : Object.hasOwn(map, FAMILY_ANY_KIND) ? map[FAMILY_ANY_KIND] : undefined;\n if (entry === undefined) return { problem: `the kind \"${kind}\", which has no entry in familyBy and no entry \"${FAMILY_ANY_KIND}\"` };\n dims = entry;\n parts.push(kind);\n }\n for (const dim of dims) {\n const part = partOf(cell[dim]);\n if (part === undefined) return { problem: `a cell${kind === undefined ? \"\" : ` of the kind \"${kind}\"`} without the dimension \"${dim}\" of familyBy` };\n parts.push(part);\n }\n return { parts };\n}\n\n/**\n * This function gives the family key of a cell. It throws a `RangeError` when the cell does not have a dimension of the key.\n * In the map form, it also throws for a cell without `kind`, and for a kind with no entry and no entry `\"*\"`.\n * For example, `{ \"rect-grid\": [\"obstacles\"], \"*\": [] }` gives `rect-grid/wall` for a `rect-grid` cell and `gallery` for a `gallery` cell.\n */\nexport function familyOf(cell: FamilyCell, familyBy: FamilyBy): string {\n const found = familyParts(cell, familyBy);\n if (\"problem\" in found) throw new RangeError(`familyOf: ${found.problem}.`);\n return found.parts.join(FAMILY_SEP);\n}\n\n/** This function tells if a value is a `FamilyBy`: a list of dimensions, or a map from a kind to a list of dimensions. */\nfunction isFamilyBy(value: unknown): value is FamilyBy {\n const isDims = (v: unknown): boolean => Array.isArray(v) && v.every((d) => typeof d === \"string\");\n return isDims(value) || (isObject(value) && Object.values(value).every(isDims));\n}\n\n/** The hook that gives the ids of the properties that one input declares. */\nexport type Declares<I> = (input: I) => readonly string[];\n\n/**\n * This function gives the count of the inputs for each property id. Each id of `ids` has a count, also when the count is 0.\n * An id from `declares` that is not in `ids` comes after the ids of `ids`, in the order of the first input that declares it.\n */\nexport function declaredCounts<I>(inputs: Iterable<I>, declares: Declares<I>, ids: readonly string[] = []): Record<string, number> {\n const out: Record<string, number> = Object.fromEntries(ids.map((id) => [id, 0]));\n for (const input of inputs) for (const id of declares(input)) out[id] = (out[id] ?? 0) + 1;\n return out;\n}\n\n/** This function tells if a value is a plain object. */\nconst isObject = (value: unknown): value is Record<string, unknown> => value !== null && typeof value === \"object\" && !Array.isArray(value);\n\n/**\n * This function reads the field `claims.declared` of a manifest. A manifest without it gives `undefined`.\n * It throws an `Error` for a claim without a whole `minCount`, a list `thin` of ids and a whole count for each id.\n */\nexport function declaredClaimOf(manifest: object): DeclaredClaim | undefined {\n const claims = (manifest as Record<string, unknown>)[\"claims\"];\n if (claims === undefined) return undefined;\n if (!isObject(claims)) throw new Error(\"The field claims of a corpus file is an object.\");\n const declared = claims[\"declared\"];\n if (declared === undefined) return undefined;\n if (!isObject(declared)) throw new Error(\"The field claims.declared of a corpus file is an object.\");\n const { minCount, thin, counts } = declared;\n if (!Number.isInteger(minCount) || (minCount as number) < 0) throw new Error(\"The field claims.declared.minCount is a whole number of 0 or more.\");\n if (!Array.isArray(thin) || !thin.every((id) => typeof id === \"string\")) throw new Error(\"The field claims.declared.thin is a list of property ids.\");\n if (!isObject(counts) || !Object.values(counts).every((n) => Number.isInteger(n) && (n as number) >= 0)) {\n throw new Error(\"The field claims.declared.counts gives a whole count for each property id.\");\n }\n const { familyBy, familyMin } = declared;\n if (familyBy !== undefined && !isFamilyBy(familyBy)) throw new Error(\"The field claims.declared.familyBy is a list of dimensions, or a map from a kind to a list of dimensions.\");\n if (familyMin !== undefined && (!Number.isInteger(familyMin) || (familyMin as number) < 0)) throw new Error(\"The field claims.declared.familyMin is a whole number of 0 or more.\");\n return {\n minCount: minCount as number,\n thin: [...(thin as string[])],\n counts: { ...(counts as Record<string, number>) },\n ...(familyBy === undefined ? {} : { familyBy: Array.isArray(familyBy) ? [...familyBy] : { ...(familyBy as Record<string, readonly string[]>) } }),\n ...(familyMin === undefined ? {} : { familyMin: familyMin as number }),\n };\n}\n\n/**\n * This function checks the claim `claims.declared` against the inputs. It gives one break `declared` for each problem. An empty list tells that the claim is true.\n *\n * - `ids` are the property ids. The default is the ids of `claim.counts`.\n * - Each id of `ids` has a count in `claim.counts`, and `claim.counts` has no other id. Each count is the count of the inputs.\n * - An id with a count below `minCount` is in `thin`. Each id of `thin` is an id of `ids`.\n * - Each id that `declares` gives is an id of `ids`.\n *\n * With `claim.familyBy`, the hook `cellOf` gives the cell of each input. The default reads the field `cell` of the input.\n *\n * - Each cell has each dimension of its key. In the map form, each cell has a `kind`, and the kind has an entry or the entry `\"*\"` is there.\n * - Two cells with different dimension values do not give the same key.\n * - With `claim.familyMin`, each family has `familyMin` inputs or more.\n */\nexport function checkDeclared<I>(\n inputs: Iterable<I>,\n declares: Declares<I>,\n claim: DeclaredClaim,\n ids: readonly string[] = Object.keys(claim.counts),\n cellOf: (input: I) => FamilyCell | undefined = cellField,\n): ClaimBreak[] {\n const list = [...inputs];\n const computed = declaredCounts(list, declares, ids);\n const out: string[] = [];\n for (const id of ids) {\n if (!(id in claim.counts)) out.push(`the property \"${id}\" has no count`);\n else if (claim.counts[id] !== computed[id]) out.push(`the property \"${id}\" has the count ${claim.counts[id]}, but the inputs give ${computed[id]}`);\n }\n for (const id of Object.keys(claim.counts)) if (!ids.includes(id)) out.push(`\"${id}\" is not a declared property`);\n for (const id of ids) {\n const thin = (computed[id] ?? 0) < claim.minCount;\n if (thin && !claim.thin.includes(id)) out.push(`the property \"${id}\" has ${computed[id]} inputs, below minCount ${claim.minCount}, and it is not in thin`);\n }\n for (const id of claim.thin) if (!ids.includes(id)) out.push(`\"${id}\" of thin is not a declared property`);\n for (const id of Object.keys(computed)) if (!ids.includes(id)) out.push(`${computed[id]} inputs declare \"${id}\", which is not a declared property`);\n const breaks: ClaimBreak[] = out.map((detail) => ({ claim: \"declared\", detail, inputs: [] }));\n if (claim.familyBy !== undefined) breaks.push(...checkFamilies(list, claim.familyBy, claim.familyMin, cellOf));\n return breaks;\n}\n\n/** This function gives the field `cell` of an input, when it is an object. */\nfunction cellField(input: unknown): FamilyCell | undefined {\n const cell = isObject(input) ? input[\"cell\"] : undefined;\n return isObject(cell) ? cell : undefined;\n}\n\n/** This function gives the field `id` of an input, or its place in the list. */\nfunction inputId(input: unknown, at: number): string {\n const id = isObject(input) ? input[\"id\"] : undefined;\n return typeof id === \"string\" ? id : `#${at}`;\n}\n\n/** This function gives the breaks of the family keys of the inputs: the problems of each key, the collisions and the thin families. */\nfunction checkFamilies<I>(inputs: readonly I[], familyBy: FamilyBy, familyMin: number | undefined, cellOf: (input: I) => FamilyCell | undefined): ClaimBreak[] {\n const problems = new Map<string, string[]>();\n const members = new Map<string, { readonly tuples: Map<string, string[]>; readonly ids: string[] }>();\n inputs.forEach((input, at) => {\n const id = inputId(input, at);\n const cell = cellOf(input);\n const found: FamilyParts = cell === undefined ? { problem: \"no cell, which familyBy needs\" } : familyParts(cell, familyBy);\n if (\"problem\" in found) {\n problems.set(found.problem, [...(problems.get(found.problem) ?? []), id]);\n return;\n }\n const key = found.parts.join(FAMILY_SEP);\n const family = members.get(key) ?? { tuples: new Map<string, string[]>(), ids: [] };\n const tuple = JSON.stringify(found.parts);\n family.tuples.set(tuple, [...(family.tuples.get(tuple) ?? []), id]);\n family.ids.push(id);\n members.set(key, family);\n });\n const breaks: ClaimBreak[] = [];\n const add = (detail: string, ids: readonly string[]): void => void breaks.push({ claim: \"declared\", detail, inputs: [...ids] });\n for (const [problem, ids] of problems) add(`${ids.length} inputs have ${problem}`, ids);\n for (const [key, family] of members) {\n if (family.tuples.size > 1) {\n const forms = [...family.tuples.keys()].join(\" and \");\n add(`the family \"${key}\" comes from different dimension values: ${forms}`, family.ids);\n }\n if (familyMin !== undefined && family.ids.length < familyMin) add(`the family \"${key}\" has ${family.ids.length} inputs, below familyMin ${familyMin}`, family.ids);\n }\n return breaks;\n}\n\n/** The id and the hash of one input of a corpus. */\nexport interface CorpusEntry {\n readonly id: string;\n readonly hash: string;\n}\n\n/**\n * This function gives the hash of a corpus: the first 16 hex characters of a SHA-256. The text of the SHA-256 is `canonicalJson`\n * of the corpus id and the `[id, hash]` of each input, in the order of the manifest. A change of one input changes the hash.\n */\nexport function corpusHashOf(corpus: string, inputs: readonly CorpusEntry[]): string {\n return sha256Hex(canonicalJson({ corpus, inputs: inputs.map((i) => [i.id, i.hash]) })).slice(0, 16);\n}\n\n/** The schema of a split file. */\nexport const SPLIT_SCHEMA = \"corpus-split/1\";\n\n/** One fold of a split: the seeds that fit a selector and the seeds that score it. */\nexport interface SplitFold {\n readonly train: readonly number[];\n readonly heldOut: readonly number[];\n}\n\n/** A split file `corpus-split/1`. Its name is `<corpus id>.<corpus hash>.json`. It is beside the corpus, so the corpus does not change. */\nexport interface CorpusSplit {\n readonly schema: typeof SPLIT_SCHEMA;\n readonly corpus: string;\n /** The hash of the corpus: `corpusHashOf` of its manifest. */\n readonly corpusHash: string;\n /** The splits by name. Each split has one fold or more. */\n readonly splits: Readonly<Record<string, { readonly folds: readonly SplitFold[] }>>;\n}\n\n/** The fields of a manifest that the split check reads. */\nexport interface SplitCorpus {\n readonly corpus: string;\n readonly specs: readonly { readonly seeds: readonly number[] }[];\n readonly inputs: readonly CorpusEntry[];\n}\n\n/** This function gives the name of the split file of a corpus. */\nexport function splitFileName(corpus: string, hash: string): string {\n return `${corpus}.${hash}.json`;\n}\n\n/** This function tells if a value is a list of whole numbers. */\nconst isSeeds = (value: unknown): value is number[] => Array.isArray(value) && value.every((s) => Number.isInteger(s));\n\n/**\n * This function checks a split file against a manifest. It gives one break `split` for each problem. An empty list tells that the file is good.\n *\n * - The schema is `corpus-split/1`, the corpus is the id of the manifest and `corpusHash` is `corpusHashOf` of the manifest.\n * - Each split has one fold or more. In each fold, `train` and `heldOut` are lists of seeds, not empty and with no common seed.\n * - Each seed is a seed of a spec of the manifest.\n * - With `name`, the file has the split `name`.\n */\nexport function checkSplit(split: unknown, corpus: SplitCorpus, name?: string): ClaimBreak[] {\n const out: string[] = [];\n const done = (): ClaimBreak[] => out.map((detail) => ({ claim: \"split\", detail, inputs: [] }));\n const f = split as Partial<CorpusSplit> | null;\n if (f === null || typeof f !== \"object\") {\n out.push(\"the split file is not an object\");\n return done();\n }\n if (f.schema !== SPLIT_SCHEMA) out.push(`the schema is ${String(f.schema)}, not ${SPLIT_SCHEMA}`);\n if (f.corpus !== corpus.corpus) out.push(`the corpus is ${String(f.corpus)}, not ${corpus.corpus}`);\n const hash = corpusHashOf(corpus.corpus, corpus.inputs);\n if (f.corpusHash !== hash) out.push(`the corpusHash is ${String(f.corpusHash)}, but the corpus gives ${hash}`);\n const seeds = new Set(corpus.specs.flatMap((s) => s.seeds));\n if (f.splits === null || typeof f.splits !== \"object\") {\n out.push(\"the field splits is not an object\");\n return done();\n }\n for (const [key, value] of Object.entries(f.splits)) {\n const folds = (value as { folds?: unknown } | null)?.folds;\n if (!Array.isArray(folds) || folds.length === 0) {\n out.push(`the split ${key} has no folds`);\n continue;\n }\n folds.forEach((fold: Partial<SplitFold> | null, k) => {\n const at = `the fold ${k} of the split ${key}`;\n const { train, heldOut } = fold ?? {};\n if (!isSeeds(train) || train.length === 0) out.push(`${at} has no train seeds`);\n if (!isSeeds(heldOut) || heldOut.length === 0) out.push(`${at} has no heldOut seeds`);\n if (!isSeeds(train) || !isSeeds(heldOut)) return;\n const common = train.filter((s) => heldOut.includes(s));\n if (common.length > 0) out.push(`${at} has the seeds ${common.join(\", \")} in train and in heldOut`);\n const unknown = [...train, ...heldOut].filter((s) => !seeds.has(s));\n if (unknown.length > 0) out.push(`${at} has the seeds ${unknown.join(\", \")}, which are not in the corpus`);\n });\n }\n if (name !== undefined && !Object.hasOwn(f.splits, name)) out.push(`the split file has no split ${name}. Its splits are ${Object.keys(f.splits).join(\", \")}`);\n return done();\n}\n\n/**\n * This function gives a copy of the folds of the split `name` of a split file. `where` names the file in the text of an error.\n * It throws an `Error` for each problem of `checkSplit`, and then for an unknown split name.\n */\nexport function splitFolds(split: unknown, corpus: SplitCorpus, name: string, where: string = \"The split file\"): SplitFold[] {\n const breaks = checkSplit(split, corpus);\n if (breaks.length > 0) throw new Error(`${where} is not good: ${breaks.map((b) => b.detail).join(\"; \")}.`);\n const splits = (split as CorpusSplit).splits;\n const found = Object.hasOwn(splits, name) ? splits[name] : undefined;\n if (found === undefined) throw new Error(`${where} has no split ${name}. Its splits are ${Object.keys(splits).join(\", \")}.`);\n return found.folds.map((f) => ({ train: [...f.train], heldOut: [...f.heldOut] }));\n}\n\n/** This function gives the folds that hold out one seed each, in the order of the seeds. Each fold trains on the other seeds. */\nexport function leaveOneSeedOut(seeds: readonly number[]): SplitFold[] {\n const sorted = [...new Set(seeds)].sort((a, b) => a - b);\n return sorted.map((s) => ({ train: sorted.filter((t) => t !== s), heldOut: [s] }));\n}\n","// The strategy space of an engine (`docs/STRATEGY-SPACE.md`): its stages, their options and the ranges of their params, as data.\nimport type { ClaimBreak } from \"./corpus.ts\";\nimport { canonicalJson, sha256Hex } from \"./hash.ts\";\nimport { stepRandom } from \"./random.ts\";\nimport { isShapeKind, SHAPE_KIND_IDS, type ShapeKind } from \"./shapes.ts\";\n\n/** The schema of a strategy space. */\nexport const STRATEGY_SPACE_SCHEMA = \"strategy-space/1\";\n\n/** The kind of a param: a whole number, a real number, one value of a list, or `true` and `false`. */\nexport type ParamKind = \"int\" | \"real\" | \"enum\" | \"bool\";\n\n/** The value of one param in a config. */\nexport type ParamValue = number | string | boolean;\n\n/** The condition of a conditional param: the param is active only when an earlier param of the same option has one of the values `in`. */\nexport interface ParamWhen {\n /** The name of an earlier param of the same option. */\n readonly param: string;\n /** The values of that param that make this param active. */\n readonly in: readonly ParamValue[];\n}\n\n/** One param of a stage option, with its range. */\nexport interface SpaceParam {\n readonly name: string;\n readonly kind: ParamKind;\n /** The smallest value of an `int` or `real` param. */\n readonly min?: number;\n /** The largest value of an `int` or `real` param. */\n readonly max?: number;\n /** The step of the values from `min`. An `int` param has the step 1 by default. */\n readonly step?: number;\n /** The scale of the grid and of the samples. The scale `log` needs a `min` above 0. The default is `linear`. */\n readonly scale?: \"linear\" | \"log\";\n /** The values of an `enum` param. */\n readonly values?: readonly (string | number)[];\n /** The value that a config gets when it does not set the param. */\n readonly default: ParamValue;\n /** Without `when`, the param is active each time its option is chosen. */\n readonly when?: ParamWhen;\n}\n\n/** The rule of the members of a meta option: a count from `min` to `max`. Members with `ordered: false` are sorted by their `configId`. */\nexport interface MemberRule {\n readonly min: number;\n readonly max: number;\n readonly ordered: boolean;\n /**\n * The member lists that the option permits. Each entry is a list of whole configs of the space of the members.\n * Without `pool`, each list of base configs with a good count is a member list.\n * With `pool`, a config of the option has the members of one entry, and `spaceSize` counts each entry one time.\n */\n readonly pool?: readonly (readonly StrategyConfig[])[];\n /**\n * The view of the items that the members get. With `bounds`, the option gives its members the bounding box of each item.\n * Then a shape filter checks the members with the kind `rect`, and the option itself with the kinds of the input. Without `view`, the members get the kinds of the input.\n */\n readonly view?: \"bounds\";\n}\n\n/** The inputs that an option supports. A missing field supports each value. */\nexport interface OptionSupports {\n /** The shape kinds of the boxes (`docs/SHAPES.md`). Without it, the option supports each kind. */\n readonly shape?: readonly ShapeKind[];\n}\n\n/** One implementation of a stage. An option with `members` is a meta option: it chooses between whole configs, or wraps them. */\nexport interface StageOption {\n readonly id: string;\n readonly params: readonly SpaceParam[];\n readonly members?: MemberRule;\n /** The inputs that the option supports. It describes the option, so it is not part of a config or of its id. */\n readonly supports?: OptionSupports;\n}\n\n/** The shape kinds of the inputs of a check, a count or an enumeration. Without `shapes`, each option counts. */\nexport interface ShapeFilter {\n /** The shape kinds of the input. Only the options that support each of these kinds count. */\n readonly shapes?: readonly ShapeKind[];\n}\n\n/** One stage of the pipeline of an engine. A config of an `optional` stage can have no option. */\nexport interface SpaceStage {\n readonly name: string;\n readonly options: readonly StageOption[];\n readonly optional?: boolean;\n}\n\n/** A reference to one option of a stage. The option `null` refers to an optional stage that a config does not use. */\nexport interface OptionRef {\n readonly stage: string;\n readonly option: string | null;\n}\n\n/** A rule that keeps out invalid combinations. A config with the option `if` also has the option `then`, or does not have the option `then.not`. */\nexport interface SpaceConstraint {\n readonly if: OptionRef;\n readonly then: OptionRef | { readonly not: OptionRef };\n}\n\n/** The strategy space of an engine: the stages, the constraints and the named configs. `docs/STRATEGY-SPACE.md` tells the rules. */\nexport interface StrategySpace {\n readonly schema: typeof STRATEGY_SPACE_SCHEMA;\n /** The name of the space. A config names the space with this value. */\n readonly engine: string;\n /** The version of the space. It is not part of a config or of its id. A record writes it. */\n readonly version: string;\n readonly stages: readonly SpaceStage[];\n readonly constraints?: readonly SpaceConstraint[];\n /** The named strategies of the engine, as points of the space. Old records stay comparable through them. */\n readonly named?: Readonly<Record<string, StrategyConfig>>;\n /** The spaces of a product space, from `productSpace`. A meta option of a part takes members of that part. */\n readonly parts?: readonly StrategySpace[];\n}\n\n/** The choice of one stage in a config: an option, its params and, for a meta option, its members. */\nexport interface StageChoice {\n readonly option: string;\n /** The values of the active params. A param that is not set gets its default. */\n readonly params?: Readonly<Record<string, ParamValue>>;\n /** The members of a meta option: configs of the same space, with no meta option. */\n readonly members?: readonly StrategyConfig[];\n}\n\n/** One point of a strategy space. The value `null` of a stage tells that the config does not use the optional stage. */\nexport interface StrategyConfig {\n /** The `engine` of the space, without its version. */\n readonly space: string;\n readonly stages: Readonly<Record<string, StageChoice | null>>;\n}\n\n/** The count of the grid points of a space. */\nexport interface SpaceSize {\n /** The count of the configs without a meta option. */\n readonly base: bigint;\n /** The count of the configs with a meta option. The value is `null` when the count is more than `maxMeta`. */\n readonly meta: bigint | null;\n}\n\n/** The options of `spaceSize`. */\nexport interface SpaceSizeOptions extends ShapeFilter {\n /** The count of the levels of each numeric param, a whole number of 1 or more. */\n readonly levels: number;\n /** The largest meta count that `spaceSize` gives. The default is `10n ** 18n`. */\n readonly maxMeta?: bigint;\n}\n\n/** The options of a grid. The grid gives only the configs without a meta option. */\nexport interface GridOptions extends ShapeFilter {\n readonly mode: \"grid\";\n readonly levels: number;\n /** The largest count of configs. A larger grid causes a `RangeError`. The default is 100000. */\n readonly limit?: number;\n}\n\n/** The options of a sample. */\nexport interface SampleOptions extends ShapeFilter {\n readonly mode: \"sample\";\n /** The count of the configs, a whole number of 0 or more. */\n readonly n: number;\n readonly seed: number;\n /** With `skip` (the default), the sample has no meta option. With `sample`, a meta option draws its members from base samples, or one entry of its `pool`. */\n readonly meta?: \"skip\" | \"sample\";\n /** The largest count of option draws. The default is the larger value of 1000 and `100 * n`. */\n readonly maxTries?: number;\n}\n\n/** The options of `enumerateSpace`. */\nexport type EnumerateOptions = GridOptions | SampleOptions;\n\ntype Problem = readonly [claim: string, detail: string];\ntype Choices = ReadonlyMap<string, StageOption | null>;\ntype Values = Record<string, ParamValue>;\n\nconst isObject = (value: unknown): value is Record<string, unknown> => value !== null && typeof value === \"object\" && !Array.isArray(value);\nconst show = (value: unknown): string => (typeof value === \"string\" ? `\"${value}\"` : String(value));\nconst isNumeric = (p: SpaceParam): boolean => p.kind === \"int\" || p.kind === \"real\";\nconst zero = (v: number): number => (v === 0 ? 0 : v);\n\n/** This function gives the stable form of a real number: 12 significant digits, with `-0` as `0`. */\nconst realForm = (v: number, digits = 12): number => zero(Number(v.toPrecision(digits)));\n\n/** This function gives the stable form of a value of a param. */\nfunction normalize(p: SpaceParam, v: ParamValue): ParamValue {\n if (typeof v !== \"number\") return v;\n if (p.kind !== \"real\") return zero(v);\n return Math.min(p.max ?? Infinity, Math.max(p.min ?? -Infinity, realForm(v)));\n}\n\n/** This function tells if a value is on the step of a param. */\nfunction onStep(p: SpaceParam, v: number): boolean {\n if (p.step === undefined || p.min === undefined) return true;\n const q = (v - p.min) / p.step;\n return Math.abs(q - Math.round(q)) <= 1e-9 * Math.max(1, Math.abs(q));\n}\n\n/** This function gives the problem of a value of a param, or `undefined` for a value in the range. */\nfunction valueProblem(p: SpaceParam, v: unknown): string | undefined {\n if (p.kind === \"bool\") return typeof v === \"boolean\" ? undefined : `${show(v)} is not true or false`;\n if (p.kind === \"enum\") return (p.values ?? []).some((x) => x === v) ? undefined : `${show(v)} is not one of ${(p.values ?? []).map(show).join(\", \")}`;\n if (typeof v !== \"number\" || !Number.isFinite(v)) return `${show(v)} is not a finite number`;\n if (p.kind === \"int\" && !Number.isInteger(v)) return `${v} is not a whole number`;\n if (p.min !== undefined && v < p.min) return `${v} is less than the min ${p.min}`;\n if (p.max !== undefined && v > p.max) return `${v} is more than the max ${p.max}`;\n if (!onStep(p, v)) return `${v} is not on the step ${p.step} from ${p.min}`;\n return undefined;\n}\n\n/** This function tells if a param is active for the values of the earlier params. */\nfunction isActive(p: SpaceParam, values: Values): boolean {\n if (p.when === undefined) return true;\n if (!Object.hasOwn(values, p.when.param)) return false;\n const v = values[p.when.param];\n return p.when.in.some((x) => x === v);\n}\n\n/** This function gives the problem of a value of a param, or `undefined` for a value in its range. The corpus dimensions of `families.ts` use it. */\nexport function paramProblem(param: SpaceParam, value: unknown): string | undefined {\n return valueProblem(param, value);\n}\n\n/** This function tells if a param is active for the values of the earlier params. A param without `when` is always active. */\nexport function paramActive(param: SpaceParam, values: Readonly<Record<string, ParamValue>>): boolean {\n return isActive(param, values);\n}\n\n/** This function gives the stable form of a value of a param: a real number gets 12 significant digits, and `-0` becomes `0`. */\nexport function paramValue(param: SpaceParam, value: ParamValue): ParamValue {\n return normalize(param, value);\n}\n\n/** This function gives the part of a space that has a stage, and the prefix of the names of its stages. */\nfunction partOf(space: StrategySpace, stage: string): { readonly space: StrategySpace; readonly prefix: string } {\n for (const part of space.parts ?? []) {\n const head = `${part.engine}.`;\n if (stage.startsWith(head)) {\n const inner = partOf(part, stage.slice(head.length));\n return { space: inner.space, prefix: head + inner.prefix };\n }\n }\n return { space, prefix: \"\" };\n}\n\n/** This function gives the prefix of the innermost part of each stage. */\nconst prefixes = (space: StrategySpace): Map<string, string> => new Map(space.stages.map((s) => [s.name, partOf(space, s.name).prefix]));\n\nconst refMatches = (ref: OptionRef, choices: ReadonlyMap<string, string | null>): boolean => (choices.get(ref.stage) ?? null) === ref.option;\n\n/** This function tells if the option choices keep a constraint. */\nfunction holds(c: SpaceConstraint, choices: ReadonlyMap<string, string | null>): boolean {\n if (!refMatches(c.if, choices)) return true;\n return \"not\" in c.then ? !refMatches(c.then.not, choices) : refMatches(c.then, choices);\n}\n\nconst describe = (c: SpaceConstraint): string => {\n const ref = (r: OptionRef): string => `${r.stage}=${r.option ?? \"null\"}`;\n return \"not\" in c.then ? `if ${ref(c.if)} then not ${ref(c.then.not)}` : `if ${ref(c.if)} then ${ref(c.then)}`;\n};\n\n/** This function gives the problems of the range and the default of one param. */\nfunction paramProblems(p: SpaceParam, at: string): Problem[] {\n const out: Problem[] = [];\n if (isNumeric(p)) {\n const { min, max, step } = p;\n if (typeof min !== \"number\" || typeof max !== \"number\" || !Number.isFinite(min) || !Number.isFinite(max)) {\n out.push([\"range\", `${at} has no finite min and max`]);\n return out;\n }\n if (min > max) out.push([\"range\", `${at} has an empty range: the min ${min} is more than the max ${max}`]);\n if (p.kind === \"int\" && (!Number.isInteger(min) || !Number.isInteger(max))) out.push([\"range\", `${at} is an int with a min or a max that is not whole`]);\n if (step !== undefined && (!Number.isFinite(step) || step <= 0 || (p.kind === \"int\" && !Number.isInteger(step))))\n out.push([\"range\", `${at} has the step ${step}, which is not a ${p.kind === \"int\" ? \"whole \" : \"\"}number above 0`]);\n if (p.scale === \"log\" && min <= 0) out.push([\"scale\", `${at} has the scale log with the min ${min}, which is not above 0`]);\n } else {\n if (p.scale !== undefined) out.push([\"scale\", `${at} is a ${p.kind} param with a scale`]);\n if (p.kind === \"enum\") {\n if (!Array.isArray(p.values) || p.values.length === 0) out.push([\"values\", `${at} is an enum without values`]);\n else {\n const seen = new Set<unknown>();\n for (const v of p.values) {\n if (seen.has(v)) out.push([\"duplicate\", `${at} has the value ${show(v)} two times`]);\n seen.add(v);\n }\n }\n }\n }\n if (out.length === 0) {\n const problem = valueProblem(p, p.default);\n if (problem !== undefined) out.push([\"default\", `the default of ${at} is not in its range: ${problem}`]);\n }\n return out;\n}\n\n/** This function gives the problems of one stage option. */\nfunction optionProblems(stage: SpaceStage, o: StageOption): Problem[] {\n const out: Problem[] = [];\n const at = `the option ${stage.name}.${o.id}`;\n if (!Array.isArray(o.params)) return [[\"config\", `${at} has no list of params`]];\n const names = o.params.map((p) => p.name);\n o.params.forEach((p, i) => {\n const pat = `the param ${stage.name}.${o.id}.${p.name}`;\n if (names.indexOf(p.name) !== i) out.push([\"duplicate\", `${at} has the param ${p.name} two times`]);\n out.push(...paramProblems(p, pat));\n if (p.when === undefined) return;\n const j = names.indexOf(p.when.param);\n if (j < 0) out.push([\"unknown\", `${pat} has a when with the unknown param ${p.when.param}`]);\n else if (j >= i) out.push([\"when\", `${pat} has a when with the param ${p.when.param}, which does not come before it`]);\n else if (!Array.isArray(p.when.in) || p.when.in.length === 0) out.push([\"when\", `${pat} has a when with no values`]);\n else for (const v of p.when.in) {\n const problem = valueProblem(o.params[j]!, v);\n if (problem !== undefined) out.push([\"when\", `${pat} has a when value that is not a value of ${p.when.param}: ${problem}`]);\n }\n });\n if (o.supports !== undefined) out.push(...supportsProblems(o.supports, at));\n if (o.members !== undefined) {\n const { min, max, ordered } = o.members;\n if (!Number.isInteger(min) || !Number.isInteger(max) || min < 1 || min > max || typeof ordered !== \"boolean\")\n out.push([\"members\", `${at} has a member rule without whole counts 1 <= min <= max and a boolean ordered`]);\n const pool: unknown = o.members.pool;\n if (pool !== undefined && (!Array.isArray(pool) || pool.length === 0 || !pool.every((entry: unknown) => Array.isArray(entry))))\n out.push([\"pool\", `${at} has a pool that is not a list of one or more member lists`]);\n const view: unknown = o.members.view;\n if (view !== undefined && view !== \"bounds\") out.push([\"view\", `${at} has the member view ${show(view)}, not \"bounds\"`]);\n }\n return out;\n}\n\n/** This function gives the problems of the `supports` of an option. */\nfunction supportsProblems(supports: unknown, at: string): Problem[] {\n if (!isObject(supports)) return [[\"shape\", `the supports of ${at} are not an object`]];\n const shape = supports[\"shape\"];\n if (shape === undefined) return [];\n if (!Array.isArray(shape) || shape.length === 0) return [[\"shape\", `${at} supports no shape kind. Remove shape to support each kind`]];\n const out: Problem[] = [];\n shape.forEach((k: unknown, i) => {\n if (!isShapeKind(k)) out.push([\"shape\", `${at} supports the shape kind ${show(k)}, which is not one of ${SHAPE_KIND_IDS.join(\", \")}`]);\n else if (shape.indexOf(k) !== i) out.push([\"duplicate\", `${at} has the shape kind ${k} two times`]);\n });\n return out;\n}\n\n/** This function tells if an option supports each shape kind of the list. */\nconst supportsShapes = (o: StageOption, shapes: readonly ShapeKind[] | undefined): boolean =>\n shapes === undefined || o.supports?.shape === undefined || shapes.every((k) => o.supports!.shape!.includes(k));\n\n/** The shape kinds that the members of an option with `view: \"bounds\"` see: a bounding box is a `rect`. */\nconst BOUNDS_VIEW: readonly ShapeKind[] = Object.freeze([\"rect\"] as const);\n\n/**\n * This function gives the shape kinds of the members of a meta option. With `view: \"bounds\"`, a list with a kind becomes `BOUNDS_VIEW`.\n * Without a list, or with an empty list, the value does not change.\n */\nconst memberShapes = (rule: MemberRule, shapes: readonly ShapeKind[] | undefined): readonly ShapeKind[] | undefined =>\n rule.view === \"bounds\" && shapes !== undefined && shapes.length > 0 ? BOUNDS_VIEW : shapes;\n\n/** This function tells if two lists have the same shape kinds. */\nconst sameKinds = (a: readonly ShapeKind[], b: readonly ShapeKind[]): boolean => a.every((k) => b.includes(k)) && b.every((k) => a.includes(k));\n\n/** This function gives the problems of the params of one stage choice. */\nfunction choiceParamProblems(o: StageOption, params: unknown, at: string): Problem[] {\n if (params !== undefined && !isObject(params)) return [[\"config\", `the params of ${at} are not an object`]];\n const given = (params ?? {}) as Values;\n const out: Problem[] = [];\n for (const key of Object.keys(given)) if (!o.params.some((p) => p.name === key)) out.push([\"unknown\", `${at} has the unknown param ${key}`]);\n const values: Values = {};\n for (const p of o.params) {\n const has = Object.hasOwn(given, p.name);\n if (!isActive(p, values)) {\n if (has) out.push([\"inactive\", `${at} sets the param ${p.name}, which is not active`]);\n continue;\n }\n const v = has ? given[p.name] : p.default;\n const problem = valueProblem(p, v);\n if (problem !== undefined) out.push([\"param\", `the param ${p.name} of ${at} is not in its range: ${problem}`]);\n else values[p.name] = normalize(p, v as ParamValue);\n }\n return out;\n}\n\n/** This function gives the problems of a config of a space. A member of a meta option has `member: true`. */\nfunction configProblems(space: StrategySpace, config: unknown, member: boolean, shapes?: readonly ShapeKind[]): Problem[] {\n if (!isObject(config) || !isObject(config[\"stages\"])) return [[\"config\", \"the config is not an object with stages\"]];\n const out: Problem[] = [];\n const stages = config[\"stages\"];\n if (config[\"space\"] !== space.engine) out.push([\"space\", `the space of the config is ${show(config[\"space\"])}, not ${show(space.engine)}`]);\n for (const key of Object.keys(stages)) if (!space.stages.some((s) => s.name === key)) out.push([\"unknown\", `the config has the unknown stage ${key}`]);\n const optionOf = (s: SpaceStage): StageOption | undefined => {\n const c = stages[s.name];\n return isObject(c) ? s.options.find((o) => o.id === c[\"option\"]) : undefined;\n };\n const prefix = prefixes(space);\n const metaStage = new Map<string, string>();\n for (const s of space.stages) {\n if (optionOf(s)?.members === undefined) continue;\n const p = prefix.get(s.name)!;\n if (metaStage.has(p)) out.push([\"meta\", `the stages ${metaStage.get(p)} and ${s.name} both have a meta option`]);\n else metaStage.set(p, s.name);\n }\n const chosen = new Map<string, string | null>();\n for (const s of space.stages) {\n const c = Object.hasOwn(stages, s.name) ? stages[s.name] : undefined;\n const meta = metaStage.get(prefix.get(s.name)!);\n chosen.set(s.name, null);\n if (c === undefined || c === null) {\n if (!s.optional && meta === undefined) out.push([\"missing\", `the config has no option for the stage ${s.name}`]);\n continue;\n }\n if (!isObject(c) || typeof c[\"option\"] !== \"string\") {\n out.push([\"config\", `the choice of the stage ${s.name} has no option`]);\n continue;\n }\n const o = s.options.find((x) => x.id === c[\"option\"]);\n if (o === undefined) {\n out.push([\"unknown\", `the stage ${s.name} has no option ${c[\"option\"]}`]);\n continue;\n }\n chosen.set(s.name, o.id);\n const at = `the option ${s.name}.${o.id}`;\n if (!supportsShapes(o, shapes)) {\n const missing = shapes!.filter((k) => !o.supports!.shape!.includes(k));\n out.push([\"shape\", `${at} supports the shape kinds ${o.supports!.shape!.join(\", \")}, not ${missing.join(\", \")}`]);\n }\n if (meta !== undefined && meta !== s.name) out.push([\"meta\", `the stage ${s.name} is set, but the meta option of ${meta} replaces the other stages of its part`]);\n out.push(...choiceParamProblems(o, c[\"params\"], at));\n if (o.members === undefined) {\n if (c[\"members\"] !== undefined) out.push([\"members\", `${at} is not a meta option, but the config gives members`]);\n continue;\n }\n if (member) {\n out.push([\"depth\", `a member has the meta option ${s.name}.${o.id}. The depth of a meta config is 1`]);\n continue;\n }\n out.push(...memberProblems(partOf(space, s.name).space, o.members, c[\"members\"], at, memberShapes(o.members, shapes)));\n }\n for (const c of space.constraints ?? []) if (!holds(c, chosen)) out.push([\"constraint\", `the config breaks the constraint ${describe(c)}`]);\n return out;\n}\n\n/** This function gives the problems of the members of a meta option. `part` is the space of the members. */\nfunction memberProblems(part: StrategySpace, rule: MemberRule, members: unknown, at: string, shapes?: readonly ShapeKind[]): Problem[] {\n if (!Array.isArray(members)) return [[\"members\", `${at} is a meta option without a list of members`]];\n const out: Problem[] = [];\n if (members.length < rule.min || members.length > rule.max) out.push([\"members\", `${at} has ${members.length} members, not ${rule.min} to ${rule.max}`]);\n const ids = new Map<string, number>();\n members.forEach((m: unknown, k) => {\n const inner = configProblems(part, m, true, shapes);\n for (const [claim, detail] of inner) out.push([claim, `the member ${k} of ${at}: ${detail}`]);\n if (inner.length > 0) return;\n const id = idOf(canonicalOf(part, m as StrategyConfig, true));\n if (ids.has(id)) out.push([\"duplicate\", `the members ${ids.get(id)} and ${k} of ${at} are the same config ${id}`]);\n else ids.set(id, k);\n });\n if (rule.pool !== undefined && out.length === 0) {\n const key = memberKey(part, rule, members as readonly StrategyConfig[]);\n if (!rule.pool.some((entry) => memberKey(part, rule, entry) === key))\n out.push([\"pool\", `${at} has a member list that is not in its pool of ${rule.pool.length} ${rule.pool.length === 1 ? \"list\" : \"lists\"}`]);\n }\n return out;\n}\n\n/** This function gives the key of a good member list: the `configId` of each member, sorted when the rule is not ordered. */\nfunction memberKey(part: StrategySpace, rule: MemberRule, members: readonly StrategyConfig[]): string {\n const ids = members.map((m) => idOf(canonicalOf(part, m, true)));\n if (!rule.ordered) ids.sort();\n return ids.join(\",\");\n}\n\n/** This function gives the problems of the pool of a meta option of a good space. `part` is the space of the members. */\nfunction poolProblems(part: StrategySpace, rule: MemberRule, at: string): Problem[] {\n const out: Problem[] = [];\n const keys = new Map<string, number>();\n const plain: MemberRule = { min: rule.min, max: rule.max, ordered: rule.ordered };\n (rule.pool ?? []).forEach((entry, j) => {\n const inner = memberProblems(part, plain, entry, `the pool entry ${j} of ${at}`);\n out.push(...inner);\n if (inner.length > 0) return;\n const key = memberKey(part, rule, entry);\n if (keys.has(key)) out.push([\"duplicate\", `the pool entries ${keys.get(key)} and ${j} of ${at} have the same members`]);\n else keys.set(key, j);\n });\n return out;\n}\n\n/** This function tells if a member list fits a space: each member is a good config of the space. A shape filter removes options from the space. */\nconst fits = (part: StrategySpace, entry: readonly StrategyConfig[]): boolean => entry.every((m) => configProblems(part, m, true).length === 0);\n\nconst toBreaks = (problems: readonly Problem[], inputs: readonly string[] = []): ClaimBreak[] => problems.map(([claim, detail]) => ({ claim, detail, inputs }));\n\n/**\n * This function checks one config of a space. It gives one break for each problem. An empty list tells that the config is good.\n * The `claim` of a break is the kind of the problem, for example `missing`, `unknown`, `inactive`, `param`, `constraint`, `members` or `depth`.\n *\n * A member list that is not an entry of the `pool` of its option gives the claim `pool`.\n * With `shapes`, an option that does not support a kind of the list gives the claim `shape`. A member of a meta option gets the same check.\n * A member of an option with `view: \"bounds\"` gets the check with the kind `rect`.\n */\nexport function checkConfig(space: StrategySpace, config: StrategyConfig, options: ShapeFilter = {}): ClaimBreak[] {\n return toBreaks(configProblems(space, config, false, options.shapes));\n}\n\n/**\n * This function checks a space. It gives one break for each problem. An empty list tells that the space is good.\n * It finds duplicate names, empty ranges, defaults out of range, enums without values, bad log scales, unknown names and bad named configs.\n * It also checks each entry of a `pool`: the count of its members, each member and a repeated entry.\n * The `inputs` of a break of a named config have the name of the config.\n */\nexport function checkSpace(space: StrategySpace): ClaimBreak[] {\n if (!isObject(space) || !Array.isArray(space.stages)) return toBreaks([[\"schema\", \"the space is not an object with stages\"]]);\n const out: Problem[] = [];\n if (space.schema !== STRATEGY_SPACE_SCHEMA) out.push([\"schema\", `the schema is ${show(space.schema)}, not ${STRATEGY_SPACE_SCHEMA}`]);\n if (typeof space.engine !== \"string\" || space.engine === \"\") out.push([\"schema\", \"the space has no engine name\"]);\n if (typeof space.version !== \"string\") out.push([\"schema\", \"the space has no version\"]);\n const names = space.stages.map((s) => s.name);\n space.stages.forEach((s, i) => {\n if (names.indexOf(s.name) !== i) out.push([\"duplicate\", `the space has the stage ${s.name} two times`]);\n const options: readonly StageOption[] = Array.isArray(s.options) ? s.options : [];\n if (options.length === 0) {\n out.push([\"options\", `the stage ${s.name} has no options`]);\n return;\n }\n const ids = options.map((o) => o.id);\n options.forEach((o, j) => {\n if (ids.indexOf(o.id) !== j) out.push([\"duplicate\", `the stage ${s.name} has the option ${o.id} two times`]);\n out.push(...optionProblems(s, o));\n });\n if (!s.optional && options.every((o) => o.members !== undefined)) out.push([\"meta\", `the stage ${s.name} is not optional and has only meta options, so no base config exists`]);\n });\n const known = (ref: OptionRef, at: string): void => {\n const s = space.stages.find((x) => x.name === ref?.stage);\n if (s === undefined) out.push([\"unknown\", `${at} has the unknown stage ${ref?.stage}`]);\n else if (ref.option === null ? !s.optional : !s.options.some((o) => o.id === ref.option))\n out.push([\"unknown\", `${at} has the unknown option ${s.name}=${ref.option ?? \"null\"}`]);\n };\n (space.constraints ?? []).forEach((c, k) => {\n known(c.if, `the constraint ${k}`);\n known(\"not\" in c.then ? c.then.not : c.then, `the constraint ${k}`);\n });\n for (const part of space.parts ?? []) for (const b of checkSpace(part)) out.push([b.claim, `the part ${part.engine}: ${b.detail}`]);\n if (space.parts !== undefined)\n for (const s of space.stages) if (partOf(space, s.name).prefix === \"\") out.push([\"parts\", `the stage ${s.name} is not a stage of a part`]);\n const breaks = toBreaks(out);\n if (breaks.length > 0) return breaks;\n for (const s of space.stages)\n for (const o of s.options) if (o.members?.pool !== undefined) breaks.push(...toBreaks(poolProblems(partOf(space, s.name).space, o.members, `the option ${s.name}.${o.id}`)));\n if (breaks.length > 0) return breaks;\n for (const [name, config] of Object.entries(space.named ?? {}))\n breaks.push(...toBreaks(configProblems(space, config, false).map(([c, d]) => [c, `the named config ${name}: ${d}`] as const), [name]));\n return breaks;\n}\n\n/** This function gives the canonical form of a config that is known to be good. */\nfunction canonicalOf(space: StrategySpace, config: StrategyConfig, member: boolean): StrategyConfig {\n const stages: Record<string, StageChoice | null> = {};\n for (const s of space.stages) {\n const c = Object.hasOwn(config.stages, s.name) ? config.stages[s.name] : undefined;\n if (c === undefined || c === null) {\n stages[s.name] = null;\n continue;\n }\n const o = s.options.find((x) => x.id === c.option)!;\n const given = c.params ?? {};\n const params: Values = {};\n for (const p of o.params) if (isActive(p, params)) params[p.name] = normalize(p, Object.hasOwn(given, p.name) ? given[p.name]! : p.default);\n if (o.members === undefined || member) {\n stages[s.name] = { option: o.id, params };\n continue;\n }\n const part = partOf(space, s.name).space;\n const members = (c.members ?? []).map((m) => canonicalOf(part, m, true));\n if (!o.members.ordered) members.sort((a, b) => (idOf(a) < idOf(b) ? -1 : idOf(a) > idOf(b) ? 1 : 0));\n stages[s.name] = { option: o.id, params, members };\n }\n return { space: space.engine, stages };\n}\n\nconst idOf = (canonical: StrategyConfig): string => sha256Hex(canonicalJson(canonical)).slice(0, 16);\n\n/**\n * This function gives the canonical form of a config: each stage of the space, the active params only, the defaults, and stable numbers.\n * An unused optional stage is `null`. The members of an unordered meta option are sorted by their `configId`.\n * It throws an `Error` for a config with a break of `checkConfig`.\n */\nexport function canonicalConfig(space: StrategySpace, config: StrategyConfig): StrategyConfig {\n const problems = configProblems(space, config, false);\n if (problems.length > 0) throw new Error(`The config of the space ${space.engine} is not good: ${problems.map((p) => p[1]).join(\"; \")}.`);\n return canonicalOf(space, config, false);\n}\n\n/**\n * This function gives the id of a config: the first 16 hex characters of the SHA-256 of `canonicalJson` of `canonicalConfig`.\n * Two spellings of one config get one id. The version of the space is not part of the id.\n */\nexport function configId(space: StrategySpace, config: StrategyConfig): string {\n return idOf(canonicalConfig(space, config));\n}\n\n/** This function throws an `Error` for a space with a break of `checkSpace`. */\nfunction assertSpace(space: StrategySpace): void {\n const breaks = checkSpace(space);\n if (breaks.length > 0) throw new Error(`The space ${String(space?.engine)} is not good: ${breaks.map((b) => b.detail).join(\"; \")}.`);\n}\n\n/** This function throws a `RangeError` when a value is not a whole number of `min` or more. */\nfunction assertWhole(value: number, name: string, min: number): void {\n if (!Number.isInteger(value) || value < min) throw new RangeError(`The option ${name} is ${value}, not a whole number of ${min} or more.`);\n}\n\n/** This function gives the last point of the step grid of a numeric param. */\nfunction lastPoint(p: SpaceParam): number {\n const min = p.min!;\n const step = p.step ?? (p.kind === \"int\" ? 1 : undefined);\n if (step === undefined) return p.max!;\n return min + Math.floor((p.max! - min) / step + 1e-9) * step;\n}\n\n/** This function moves a value of a numeric param onto its step and into its range. */\nfunction snap(p: SpaceParam, x: number, digits: number): number {\n const min = p.min!;\n const step = p.step ?? (p.kind === \"int\" ? 1 : undefined);\n let v = step === undefined ? x : min + Math.round((x - min) / step) * step;\n v = Math.min(lastPoint(p), Math.max(min, v));\n return p.kind === \"int\" ? zero(Math.round(v)) : Math.min(p.max!, Math.max(min, realForm(v, digits)));\n}\n\n/** This function gives the point at the fraction `t` of the range of a numeric param, on its scale. */\nfunction at01(p: SpaceParam, t: number): number {\n const min = p.min!;\n const max = p.max!;\n if (p.scale === \"log\") return Math.exp(Math.log(min) + t * (Math.log(max) - Math.log(min)));\n return min + t * (max - min);\n}\n\n/**\n * This function gives the grid values of one param, in increasing order. An `enum` gives its values, and a `bool` gives `false` and `true`.\n * With 1 level, a numeric param gives its default. With k levels, it gives k points from `min` to `max` on its scale and step, without repeats.\n */\nexport function paramLevels(param: SpaceParam, levels: number): ParamValue[] {\n assertWhole(levels, \"levels\", 1);\n if (param.kind === \"bool\") return [false, true];\n if (param.kind === \"enum\") return [...(param.values ?? [])];\n if (levels === 1 || param.min === param.max) return [normalize(param, param.default)];\n const out: number[] = [];\n const steps = param.kind === \"int\" || param.step !== undefined ? Math.round((lastPoint(param) - param.min!) / (param.step ?? 1)) + 1 : Infinity;\n if (steps <= levels && param.scale !== \"log\") {\n for (let j = 0; j < steps; j++) out.push(snap(param, param.min! + j * (param.step ?? 1), 12));\n } else {\n for (let j = 0; j < levels; j++) out.push(snap(param, at01(param, j / (levels - 1)), 12));\n }\n return [...new Set(out)];\n}\n\n/** This function tells if a later param of the list reads a param in its `when`. */\nconst readLater = (params: readonly SpaceParam[], i: number): boolean => params.slice(i + 1).some((q) => q.when?.param === params[i]!.name);\n\n/** This function gives the count of the grid assignments of the params of an option, with only the active params. */\nfunction countParams(params: readonly SpaceParam[], levels: number, i = 0, values: Values = {}): bigint {\n if (i === params.length) return 1n;\n const p = params[i]!;\n if (!isActive(p, values)) return countParams(params, levels, i + 1, values);\n const lv = paramLevels(p, levels);\n if (!readLater(params, i)) return BigInt(lv.length) * countParams(params, levels, i + 1, values);\n let sum = 0n;\n for (const v of lv) sum += countParams(params, levels, i + 1, { ...values, [p.name]: v });\n return sum;\n}\n\n/** This function gives the grid assignments of the params of an option, in a stable order. */\nfunction* gridParams(params: readonly SpaceParam[], levels: number, i = 0, values: Values = {}): Generator<Values> {\n if (i === params.length) {\n yield { ...values };\n return;\n }\n const p = params[i]!;\n if (!isActive(p, values)) {\n yield* gridParams(params, levels, i + 1, values);\n return;\n }\n for (const v of paramLevels(p, levels)) yield* gridParams(params, levels, i + 1, { ...values, [p.name]: v });\n}\n\n/** One combination of options of a space, with its count of grid points. */\ninterface Combo {\n readonly choices: Choices;\n readonly base: boolean;\n /** The count of the grid points, or `null` when the count is more than the limit. */\n readonly weight: bigint | null;\n}\n\nconst optionIds = (choices: Choices): Map<string, string | null> => new Map([...choices].map(([k, o]) => [k, o?.id ?? null]));\nconst keeps = (space: StrategySpace, choices: Choices): boolean => (space.constraints ?? []).every((c) => holds(c, optionIds(choices)));\n\n/** This function gives the count of the member lists of a meta option without a pool from `base` base configs, or `null` above `limit`. */\nfunction memberLists(base: bigint, rule: MemberRule, limit: bigint): bigint | null {\n let sum = 0n;\n for (let m = rule.min; m <= rule.max; m++) {\n let n = 1n;\n for (let k = 0; k < m; k++) {\n n = (n * (base - BigInt(k))) / (rule.ordered ? 1n : BigInt(k + 1));\n if (n <= 0n) break;\n }\n if (n <= 0n) break;\n sum += n;\n if (sum > limit) return null;\n }\n return sum;\n}\n\n/** This function multiplies two counts. A `null` count or a product above `limit` gives `null`. */\nconst times = (a: bigint | null, b: bigint | null, limit: bigint): bigint | null => (a === null || b === null ? null : a * b > limit ? null : a * b);\n\n/**\n * This function gives the combinations of options of a space and their grid counts.\n * A product space joins the combinations of its parts. Each combination keeps the constraints.\n */\nfunction combos(space: StrategySpace, levels: number, meta: boolean, limit: bigint): Combo[] {\n if (space.parts !== undefined && space.parts.length > 0) {\n let acc: Combo[] = [{ choices: new Map(), base: true, weight: 1n }];\n for (const part of space.parts) {\n const head = `${part.engine}.`;\n const own = combos(part, levels, meta, limit);\n const next: Combo[] = [];\n for (const a of acc)\n for (const b of own) {\n const choices = new Map(a.choices);\n for (const [k, o] of b.choices) choices.set(head + k, o);\n const base = a.base && b.base;\n next.push({ choices, base, weight: base ? a.weight! * b.weight! : times(a.weight, b.weight, limit) });\n }\n acc = next;\n }\n return acc.filter((c) => keeps(space, c.choices));\n }\n const counts = new Map<StageOption, bigint>();\n const countOf = (o: StageOption): bigint => {\n if (!counts.has(o)) counts.set(o, countParams(o.params, levels));\n return counts.get(o)!;\n };\n const out: Combo[] = [];\n const stages = space.stages;\n const walk = (i: number, choices: Map<string, StageOption | null>, weight: bigint): void => {\n if (i === stages.length) {\n if (keeps(space, choices)) out.push({ choices: new Map(choices), base: true, weight });\n return;\n }\n const s = stages[i]!;\n const list: (StageOption | null)[] = s.options.filter((o) => o.members === undefined);\n if (s.optional) list.push(null);\n for (const o of list) {\n choices.set(s.name, o);\n walk(i + 1, choices, o === null ? weight : weight * countOf(o));\n }\n choices.delete(s.name);\n };\n walk(0, new Map(), 1n);\n if (!meta) return out;\n const base = out.reduce((sum, c) => sum + c.weight!, 0n);\n for (const s of stages)\n for (const o of s.options) {\n if (o.members === undefined) continue;\n const choices = new Map<string, StageOption | null>(stages.map((x) => [x.name, x === s ? o : null]));\n const own = memberSpaces.get(o);\n const from = own === undefined ? base : baseCount(own, levels, limit);\n const lists = o.members.pool === undefined ? memberLists(from, o.members, limit) : BigInt(o.members.pool.length);\n if (keeps(space, choices)) out.push({ choices, base: false, weight: times(countOf(o), lists, limit) });\n }\n return out;\n}\n\n/**\n * This function gives the count of the grid points of a space, with `levels` levels for each numeric param.\n * It counts only the active params and the combinations that keep the constraints. It gives the meta configs apart.\n * A meta option with a `pool` counts each entry of the pool one time.\n * With `shapes`, it counts only the options that support each kind of the list.\n */\nexport function spaceSize(space: StrategySpace, options: SpaceSizeOptions): SpaceSize {\n assertSpace(space);\n assertWhole(options.levels, \"levels\", 1);\n assertShapes(options.shapes);\n return sizeOf(restrict(space, options.shapes), options.levels, options.maxMeta ?? 10n ** 18n);\n}\n\n/**\n * This function gives the space with only the options that support each shape kind of `shapes`. Without `shapes`, it gives the same space.\n * A stage can lose all of its options. Then the space has no config with that stage.\n * A pool keeps only the entries whose members fit the smaller space. A meta option without such an entry goes out.\n *\n * The members of an option with `view: \"bounds\"` come from the space for the kinds of `memberShapes`. `memberSpaces` keeps that space.\n */\nfunction restrict(space: StrategySpace, shapes: readonly ShapeKind[] | undefined): StrategySpace {\n if (shapes === undefined) return space;\n const kept: StrategySpace = {\n ...space,\n stages: space.stages.map((s) => ({ ...s, options: s.options.filter((o) => supportsShapes(o, shapes)) })),\n ...(space.parts === undefined ? {} : { parts: space.parts.map((p) => restrict(p, shapes)) }),\n };\n const withPool = (s: SpaceStage, o: StageOption): StageOption[] => {\n if (o.members === undefined) return [o];\n const inner = memberShapes(o.members, shapes)!;\n const own = sameKinds(inner, shapes) ? undefined : restrict(partOf(space, s.name).space, inner);\n const mark = (option: StageOption): StageOption[] => {\n if (own !== undefined) memberSpaces.set(option, own);\n return [option];\n };\n if (o.members.pool === undefined) return own === undefined ? [o] : mark({ ...o });\n const part = own ?? partOf(kept, s.name).space;\n const pool = o.members.pool.filter((entry) => fits(part, entry));\n return pool.length === 0 ? [] : mark({ ...o, members: { ...o.members, pool } });\n };\n return { ...kept, stages: kept.stages.map((s) => ({ ...s, options: s.options.flatMap((o) => withPool(s, o)) })) };\n}\n\n/** The space of the members of a meta option of a restricted space, when it is not the part of the option. Only `view: \"bounds\"` makes such a space. */\nconst memberSpaces = new WeakMap<StageOption, StrategySpace>();\n\n/**\n * This function tells if an option of a restricted space has a member list. A base option and a meta option with a `pool` have one.\n * A different meta option has one when its members have a base config. `restrict` keeps only the pool entries that fit.\n */\nconst hasMembers = (space: StrategySpace, stage: string, o: StageOption): boolean =>\n o.members === undefined || o.members.pool !== undefined || combos(memberSpaces.get(o) ?? partOf(space, stage).space, 1, false, 0n).length > 0;\n\n/** This function tells if a restricted space has a config. A base config counts. With `meta`, a meta config counts when each of its meta options has a member list. */\nconst hasConfig = (space: StrategySpace, meta: boolean): boolean =>\n combos(space, 1, meta, 0n).some((c) => c.base || [...c.choices].every(([stage, o]) => o === null || hasMembers(space, stage, o)));\n\n/** This function gives the error of a sample of a space that has no config for the shape kinds `shapes`. `kept` is the restricted space. */\nfunction noSample(space: StrategySpace, kept: StrategySpace, shapes: readonly ShapeKind[], meta: boolean): RangeError {\n const list = (names: readonly string[], one: string, more: string): string => (names.length === 1 ? `${one} ${names[0]}` : `${more} ${names.join(\", \")}`);\n const empty = kept.stages.filter((s) => !s.optional && !s.options.some((o) => meta || o.members === undefined)).map((s) => s.name);\n const removed = !meta\n ? []\n : space.stages.flatMap((s) =>\n s.options\n .filter((o) => o.members !== undefined && o.members.view !== \"bounds\" && supportsShapes(o, shapes))\n .filter((o) => {\n const own = kept.stages.find((x) => x.name === s.name)?.options.find((x) => x.id === o.id);\n return own === undefined || !hasMembers(kept, s.name, own);\n })\n .map((o) => `${s.name}.${o.id}`),\n );\n let text = `The space ${space.engine} has no config for a sample with the shape kinds ${shapes.join(\", \")}.`;\n if (empty.length > 0) text += ` ${list(empty, \"The stage\", \"The stages\")} ${empty.length === 1 ? \"has\" : \"have\"} no option for these kinds.`;\n if (removed.length > 0)\n text += ` ${list(removed, \"The meta option\", \"The meta options\")} ${removed.length === 1 ? \"has\" : \"have\"} no member config for these kinds. Set members.view to \"bounds\" when the members see only the bounding boxes.`;\n if (empty.length === 0 && removed.length === 0) text += \" The constraints remove each config.\";\n return new RangeError(text);\n}\n\n/** This function gives the count of the base configs of a space that is known to be good. */\nconst baseCount = (space: StrategySpace, levels: number, limit: bigint): bigint => combos(space, levels, false, limit).reduce((sum, c) => sum + c.weight!, 0n);\n\n/** This function throws a `RangeError` for a list of shape kinds with a kind that is not declared. */\nfunction assertShapes(shapes: readonly ShapeKind[] | undefined): void {\n if (shapes === undefined) return;\n if (!Array.isArray(shapes)) throw new RangeError(\"The option shapes is not a list of shape kinds.\");\n for (const k of shapes) if (!isShapeKind(k)) throw new RangeError(`The shape kind ${show(k)} is not one of ${SHAPE_KIND_IDS.join(\", \")}.`);\n}\n\n/** This function gives the count of the grid points of a space that is known to be good. */\nfunction sizeOf(space: StrategySpace, levels: number, limit: bigint): SpaceSize {\n let base = 0n;\n let meta: bigint | null = 0n;\n for (const c of combos(space, levels, true, limit)) {\n if (c.base) base += c.weight!;\n else meta = meta === null || c.weight === null || meta + c.weight > limit ? null : meta + c.weight;\n }\n return { base, meta };\n}\n\n/** This function gives the cartesian product of lists, with the last list as the fastest. */\nfunction* product<T>(lists: readonly (readonly T[])[], i = 0, acc: T[] = []): Generator<T[]> {\n if (i === lists.length) {\n yield [...acc];\n return;\n }\n for (const x of lists[i]!) {\n acc.push(x);\n yield* product(lists, i + 1, acc);\n acc.pop();\n }\n}\n\n/** This function gives the configs of the grid of a space, without meta options. */\nfunction gridConfigs(space: StrategySpace, levels: number, limit: number, shapes: readonly ShapeKind[] | undefined): StrategyConfig[] {\n const kept = restrict(space, shapes);\n const size = sizeOf(kept, levels, 0n).base;\n if (size > BigInt(limit)) throw new RangeError(`The grid of the space ${space.engine} has ${size} configs, more than the limit ${limit}.`);\n const out: StrategyConfig[] = [];\n for (const c of combos(kept, levels, false, 0n)) {\n const names = [...c.choices.keys()];\n const lists = names.map((k) => {\n const o = c.choices.get(k)!;\n return o === null ? [null] : [...gridParams(o.params, levels)].map((params): StageChoice => ({ option: o.id, params }));\n });\n for (const row of product<StageChoice | null>(lists)) out.push(canonicalOf(space, { space: space.engine, stages: Object.fromEntries(names.map((k, i) => [k, row[i]!])) }, false));\n }\n return out;\n}\n\n/** This function gives a random order of the numbers from 0 to `n - 1`. */\nfunction permutation(n: number, r: () => number): number[] {\n const out = Array.from({ length: n }, (_, i) => i);\n for (let i = n - 1; i > 0; i--) {\n const j = Math.floor(r() * (i + 1));\n [out[i], out[j]] = [out[j]!, out[i]!];\n }\n return out;\n}\n\n/** This function gives the value of a param at the fraction `u` of its range. A sampled real number has 6 significant digits. */\nfunction sampleValue(p: SpaceParam, u: number): ParamValue {\n if (p.kind === \"bool\") return u >= 0.5;\n if (p.kind === \"enum\") {\n const values = p.values!;\n return values[Math.min(values.length - 1, Math.floor(u * values.length))]!;\n }\n if (p.min === p.max) return normalize(p, p.min!);\n if (p.scale !== \"log\" && (p.kind === \"int\" || p.step !== undefined)) {\n const steps = Math.round((lastPoint(p) - p.min!) / (p.step ?? 1)) + 1;\n return snap(p, p.min! + Math.min(steps - 1, Math.floor(u * steps)) * (p.step ?? 1), 6);\n }\n return snap(p, at01(p, u), 6);\n}\n\n/** This function gives a seed of 32 bits from a seed and a step name. */\nconst subSeed = (seed: number, step: string): number => Math.floor(stepRandom(seed, step)() * 4294967296);\n\n/**\n * This function gives a sample of a space: Latin hypercube strata over the options, the params and the member counts.\n * `canon` is the space of `canonicalConfig`: the space before a shape filter. A member of an option with `view: \"bounds\"` can have an option that the filter removed.\n */\nfunction sampleConfigs(space: StrategySpace, n: number, seed: number, meta: boolean, maxTries: number, canon: StrategySpace = space): StrategyConfig[] {\n const stages = space.stages;\n const prefix = prefixes(space);\n // A stage without options can stay empty in a part with a meta option of `view: \"bounds\"`, because that option replaces the stage.\n const bounded = new Set(stages.filter((s) => meta && s.options.some((o) => memberSpaces.has(o))).map((s) => prefix.get(s.name)!));\n const lists = stages.map((s) => {\n const list: (StageOption | null)[] = s.options.filter((o) => meta || o.members === undefined);\n if (s.optional) list.push(null);\n if (list.length === 0 && bounded.has(prefix.get(s.name)!)) list.push(null);\n if (list.length === 0) throw new Error(`The stage ${s.name} of the space ${space.engine} has no option for a sample. A shape filter can remove all of its options.`);\n return list;\n });\n // A meta option without a member list stays in its list, so the strata of 0.2.16 do not change. A point that chooses it draws again.\n const usable = new Map<StageOption, boolean>();\n const withMembers = (s: SpaceStage, o: StageOption | null | undefined): boolean => {\n if (o === null || o === undefined || o.members === undefined) return true;\n if (!usable.has(o)) usable.set(o, hasMembers(space, s.name, o));\n return usable.get(o)!;\n };\n const points: Map<string, StageOption | null>[] = [];\n let tries = 0;\n for (let round = 0; points.length < n; round++) {\n const r = stepRandom(seed, `options:${round}`);\n const columns = lists.map((list) => permutation(n, r).map((p) => list[Math.floor((p * list.length) / n)]!));\n for (let i = 0; i < n && points.length < n; i++) {\n if (tries >= maxTries) throw new Error(`The constraints of the space ${space.engine} remove too many points: ${points.length} of ${n} configs after ${tries} tries.`);\n tries++;\n const choices = new Map<string, StageOption | null>(stages.map((s, k) => [s.name, columns[k]![i]!]));\n const metaPart = new Map<string, string>();\n for (const s of stages) {\n const o = choices.get(s.name);\n if (o?.members !== undefined && !metaPart.has(prefix.get(s.name)!)) metaPart.set(prefix.get(s.name)!, s.name);\n }\n for (const s of stages) {\n const m = metaPart.get(prefix.get(s.name)!);\n if (m !== undefined && m !== s.name) choices.set(s.name, null);\n }\n const filled = stages.every((s) => s.optional === true || choices.get(s.name) !== null || metaPart.has(prefix.get(s.name)!));\n if (filled && keeps(space, choices) && stages.every((s) => withMembers(s, choices.get(s.name)))) points.push(choices);\n }\n }\n const values: Values[][] = points.map(() => stages.map(() => ({})));\n const members: StrategyConfig[][][] = points.map(() => stages.map(() => []));\n stages.forEach((s, k) => {\n for (const o of s.options) {\n const users = points.flatMap((c, i) => (c.get(s.name) === o ? [i] : []));\n if (users.length === 0) continue;\n for (const p of o.params) {\n const active = users.filter((i) => isActive(p, values[i]![k]!));\n const r = stepRandom(seed, `param:${s.name}:${o.id}:${p.name}`);\n permutation(active.length, r).forEach((stratum, j) => {\n values[active[j]!]![k]![p.name] = sampleValue(p, (stratum + r()) / active.length);\n });\n }\n if (o.members === undefined) continue;\n const fixed = o.members.pool;\n if (fixed !== undefined) {\n const r = stepRandom(seed, `pool-entry:${s.name}:${o.id}`);\n permutation(users.length, r).forEach((stratum, j) => {\n members[users[j]!]![k] = [...fixed[Math.min(fixed.length - 1, Math.floor(((stratum + r()) / users.length) * fixed.length))]!];\n });\n continue;\n }\n const part = memberSpaces.get(o) ?? partOf(space, s.name).space;\n const poolSize = Math.max(n, 4 * o.members.max, 8);\n const seen = new Set<string>();\n const pool = sampleConfigs(part, poolSize, subSeed(seed, `pool:${s.name}:${o.id}`), false, Math.max(1000, 100 * poolSize)).filter((c) => {\n const id = idOf(c);\n return seen.has(id) ? false : (seen.add(id), true);\n });\n const r = stepRandom(seed, `members:${s.name}:${o.id}`);\n const { min, max } = o.members;\n permutation(users.length, r).forEach((stratum, j) => {\n const count = min + Math.min(max - min, Math.floor(((stratum + r()) / users.length) * (max - min + 1)));\n if (pool.length < count) throw new Error(`The space ${part.engine} has only ${pool.length} distinct base samples, fewer than the ${count} members of ${s.name}.${o.id}.`);\n const picked = permutation(pool.length, r).slice(0, count);\n members[users[j]!]![k] = picked.map((x) => pool[x]!);\n });\n }\n });\n return points.map((choices, i) => {\n const out: Record<string, StageChoice | null> = {};\n stages.forEach((s, k) => {\n const o = choices.get(s.name)!;\n out[s.name] = o === null ? null : o.members === undefined ? { option: o.id, params: values[i]![k]! } : { option: o.id, params: values[i]![k]!, members: members[i]![k]! };\n });\n return canonicalConfig(canon, { space: space.engine, stages: out });\n });\n}\n\n/**\n * This function gives configs of a space, in their canonical form. Each config keeps the constraints. The result is deterministic.\n *\n * - The mode `grid` gives each grid point without a meta option, in a stable order. Stages, options and values go in the order of the space.\n * - The mode `sample` gives `n` configs of a seeded Latin hypercube. The options of a stage get equal strata, and each active param gets its own strata.\n * - A sample draws again when a point breaks a constraint. After `maxTries` draws, it throws an `Error`. Two sampled configs can be equal.\n * - With `shapes`, only the options that support each kind of the list count. Without `shapes`, the result does not change.\n * - A meta option with a `pool` gives only the entries of its pool. With `shapes`, only the entries whose members support each kind count.\n * - A sample draws again when a point chooses a meta option without a member list. `spaceSize` gives such an option 0.\n * - With `shapes`, a sample throws a `RangeError` when the space has no config for the kinds. The error names the stages without an option and the meta options without members.\n */\nexport function enumerateSpace(space: StrategySpace, options: EnumerateOptions): StrategyConfig[] {\n assertSpace(space);\n assertShapes(options.shapes);\n if (options.mode === \"grid\") {\n assertWhole(options.levels, \"levels\", 1);\n return gridConfigs(space, options.levels, options.limit ?? 100_000, options.shapes);\n }\n if (options.mode !== \"sample\") throw new RangeError(`The mode ${String((options as { mode?: unknown }).mode)} is not grid or sample.`);\n assertWhole(options.n, \"n\", 0);\n if (!Number.isInteger(options.seed)) throw new RangeError(`The seed ${options.seed} is not a whole number.`);\n const meta = options.meta ?? \"skip\";\n if (meta !== \"skip\" && meta !== \"sample\") throw new RangeError(`The option meta is ${String(meta)}, not skip or sample.`);\n if (options.n === 0) return [];\n const kept = restrict(space, options.shapes);\n try {\n return sampleConfigs(kept, options.n, options.seed, meta === \"sample\", options.maxTries ?? Math.max(1000, 100 * options.n), space);\n } catch (error) {\n // Only a space without a config for the shape kinds gives the RangeError. A different failure keeps its own error.\n if (options.shapes !== undefined && !hasConfig(kept, meta === \"sample\")) throw noSample(space, kept, options.shapes, meta === \"sample\");\n throw error;\n }\n}\n\n/**\n * This function gives the shape kinds that a space accepts, in the order of `SHAPE_KINDS`. The value comes from the `supports` of the options.\n * A space accepts a kind when it has at least one config without a meta option on that kind.\n */\nexport function spaceShapeKinds(space: StrategySpace): ShapeKind[] {\n assertSpace(space);\n return SHAPE_KIND_IDS.filter((k) => sizeOf(restrict(space, [k]), 1, 0n).base > 0n);\n}\n\n/**\n * This function joins configs of the parts of a product space into one config of the space `space`.\n * The name of each stage gets the prefix `<space of the part>.`. The members of a meta option do not change.\n */\nexport function joinConfigs(space: string, parts: readonly StrategyConfig[]): StrategyConfig {\n const stages: Record<string, StageChoice | null> = {};\n for (const part of parts) for (const [k, c] of Object.entries(part.stages)) stages[`${part.space}.${k}`] = c;\n return { space, stages };\n}\n\n/** This function gives the config of the part `engine` of a joint config. It throws a `RangeError` when no stage has the prefix `<engine>.`. */\nexport function splitConfig(config: StrategyConfig, engine: string): StrategyConfig {\n const head = `${engine}.`;\n const entries = Object.entries(config.stages).filter(([k]) => k.startsWith(head));\n if (entries.length === 0) throw new RangeError(`The config of the space ${config.space} has no stage of the part ${engine}.`);\n return { space: engine, stages: Object.fromEntries(entries.map(([k, c]) => [k.slice(head.length), c])) };\n}\n\n/**\n * This function joins two spaces, for example a packer and a router, into the space `name`. The stages of `a` and `b` get the prefixes `<a.engine>.` and `<b.engine>.`.\n * The constraints get the same prefixes. The named configs are the pairs `<name of a>+<name of b>`. It throws a `RangeError` when the two engines have the same name.\n */\nexport function productSpace(a: StrategySpace, b: StrategySpace, name: string): StrategySpace {\n if (a.engine === b.engine) throw new RangeError(`The two spaces have the same engine ${a.engine}.`);\n if (name === \"\") throw new RangeError(\"The product space has no name.\");\n const stagesOf = (s: StrategySpace): SpaceStage[] => s.stages.map((x) => ({ ...x, name: `${s.engine}.${x.name}` }));\n const ref = (s: StrategySpace, r: OptionRef): OptionRef => ({ stage: `${s.engine}.${r.stage}`, option: r.option });\n const constraintsOf = (s: StrategySpace): SpaceConstraint[] =>\n (s.constraints ?? []).map((c) => ({ if: ref(s, c.if), then: \"not\" in c.then ? { not: ref(s, c.then.not) } : ref(s, c.then) }));\n const named: Record<string, StrategyConfig> = {};\n for (const [ka, ca] of Object.entries(a.named ?? {})) for (const [kb, cb] of Object.entries(b.named ?? {})) named[`${ka}+${kb}`] = joinConfigs(name, [ca, cb]);\n const constraints = [...constraintsOf(a), ...constraintsOf(b)];\n return {\n schema: STRATEGY_SPACE_SCHEMA,\n engine: name,\n version: `${a.engine}@${a.version}+${b.engine}@${b.version}`,\n stages: [...stagesOf(a), ...stagesOf(b)],\n ...(constraints.length > 0 ? { constraints } : {}),\n ...(Object.keys(named).length > 0 ? { named } : {}),\n parts: [a, b],\n };\n}\n","// The verdict over families (`docs/VERDICT.md`). highways, packing and the joint bench use the same rule, so they give the same verdict.\nimport { compareMeasure, type MeasureSpec } from \"./measures.ts\";\nimport { stepRandom } from \"./random.ts\";\nimport type { LayoutRecord } from \"./record.ts\";\n\n/**\n * The largest count of inputs for the exact permutation test. Up to this count, the test enumerates all `2^n` sign sets.\n * At 16 inputs, that is 65 536 sign sets, approximately 3 times the default draws. Above it, the cost doubles with each input, so the test uses seeded draws.\n */\nexport const VERDICT_EXACT_MAX = 16;\n\n/** The largest value of the option `exactMax`. At 20 inputs, the exact test has approximately 1 million sign sets. */\nexport const VERDICT_EXACT_CAP = 20;\n\n/** The default count of the samples of each bootstrap. It is the parameter `bootstrapRuns` of `docs/PROMOTION.md`. */\nexport const VERDICT_RUNS = 10000;\n\n/** The default count of the random sign sets of the permutation test above `VERDICT_EXACT_MAX` inputs. */\nexport const VERDICT_DRAWS = 20000;\n\n/** The default seed of the bootstraps and of the random sign sets. */\nexport const VERDICT_SEED = 1;\n\n/** The fields of a record that the verdict reads. */\nexport type VerdictRecord = Pick<LayoutRecord, \"strategy\" | \"input\" | \"seed\" | \"measures\"> & { readonly skipped?: string };\n\n/** One side of a verdict: a strategy id, or a test that selects the records of the side. */\nexport type VerdictSide<R extends VerdictRecord = VerdictRecord> = string | ((record: R) => boolean);\n\n/** The arguments of `verdict`. `tie` and `level` have no default. */\nexport interface VerdictOptions<R extends VerdictRecord = VerdictRecord> {\n /** The unit of the verdict. The family is the only unit. */\n readonly by: \"family\";\n /** The hook that gives the family of a record, for example `familyOf` of the cell of its input. */\n readonly family: (record: R) => string;\n /** The measure. Its direction tells which side is better. */\n readonly measure: Pick<MeasureSpec, \"id\" | \"direction\">;\n /** The baseline side. */\n readonly a: VerdictSide<R>;\n /** The candidate side. A positive difference tells that `b` is better than `a`. */\n readonly b: VerdictSide<R>;\n /**\n * The minimum effect of the sign of a family, as `minEffect` of `MeasureSpec`. A smaller change of the family mean is a tie.\n * `compareMeasure` compares the two family means, so the smallest tie is one grid step of `RECORD_EPS`.\n */\n readonly tie: number | { readonly rel: number };\n /** The significance level, from 0 to 1. The permutation p must be below it. The intervals have the level `1 - level`. */\n readonly level: number;\n /** The count of the samples of each bootstrap. The default is `VERDICT_RUNS`. */\n readonly runs?: number;\n /** The count of the random sign sets above the exact limit. The default is `VERDICT_DRAWS`. */\n readonly draws?: number;\n /** The seed of the bootstraps and of the random sign sets. The default is `VERDICT_SEED`. */\n readonly seed?: number;\n /** The largest count of inputs for the exact test. The default is `VERDICT_EXACT_MAX`. The value 0 always uses draws. */\n readonly exactMax?: number;\n}\n\n/** A mean with its bootstrap interval. The interval is clear of 0 when `lo > 0` or `hi < 0`. */\nexport interface VerdictInterval {\n readonly mean: number;\n readonly lo: number;\n readonly hi: number;\n}\n\n/** The difference of one family: the count of its inputs, the mean of their differences and its sign. */\nexport interface FamilyVerdict {\n readonly family: string;\n readonly n: number;\n readonly mean: number;\n /** The value 1 tells that `b` is better, -1 that `b` is worse, and 0 a tie by `tie`. */\n readonly sign: -1 | 0 | 1;\n}\n\n/** The stratified paired permutation test. With `exact`, `draws` is the count of all the sign sets. */\nexport interface VerdictPermutation {\n readonly p: number;\n readonly exact: boolean;\n readonly draws: number;\n readonly seed: number;\n}\n\n/** The two-sided exact sign test of the family signs. It is a report only. Ties do not count. */\nexport interface VerdictSignTest {\n readonly wins: number;\n readonly losses: number;\n readonly ties: number;\n readonly p: number;\n}\n\n/** The label of a verdict. `better` and `worse` tell the side of `b`. */\nexport type VerdictLabel = \"better\" | \"worse\" | \"depends on the mix\" | \"no verdict\";\n\n/**\n * The scope of a verdict. The test keeps the families of the corpus as fixed, so its claim is about these families only.\n * It is not a claim about a new kind of input.\n */\nexport type VerdictScope = \"these families\";\n\n/**\n * The breadth of a verdict: the count of the families against its side.\n * The side is the side of the label. For `depends on the mix` and `no verdict`, it is the sign of the stratified mean.\n */\nexport interface VerdictBreadth {\n /** The count of the families with a sign against the side. A stratified mean of exactly 0 has no side, so this count is 0. */\n readonly against: number;\n /** The count of the families. */\n readonly of: number;\n /** The count of the families with the sign 0. */\n readonly ties: number;\n}\n\n/** The result of `verdict`. */\nexport interface VerdictResult {\n readonly measure: string;\n /** The count of the paired inputs. */\n readonly n: number;\n /** The mean of the family means, with a bootstrap of the seeds inside each family. */\n readonly stratified: VerdictInterval;\n /** The mean of the inputs, with a bootstrap of the inputs. */\n readonly pooled: VerdictInterval;\n readonly permutation: VerdictPermutation;\n /** The families, in sort order. */\n readonly families: readonly FamilyVerdict[];\n readonly signTest: VerdictSignTest;\n /** `true` only when the two means have the same sign, the two intervals are clear of 0 and the permutation p is below `level`. */\n readonly agree: boolean;\n readonly label: VerdictLabel;\n /** The scope of the claim: the families of the corpus, not a new kind of input. */\n readonly scope: VerdictScope;\n /** The count of the families against the side of the verdict, of all the families and of the ties. */\n readonly breadth: VerdictBreadth;\n /** The label, the scope and the breadth in one line, for example `better on these families, worse on 2 of 6 (1 tie)`. */\n readonly summary: string;\n /** The inputs without a pair: one side has no record, a skipped record or no value of the measure. */\n readonly dropped: readonly string[];\n}\n\n/** One paired input: its key, its family, the two values and the difference in the direction of the measure. */\ninterface Pair {\n readonly key: string;\n readonly family: string;\n readonly a: number;\n readonly b: number;\n readonly d: number;\n}\n\n/** This function gives the mean of a list that is not empty. */\nconst meanOf = (values: readonly number[]): number => values.reduce((s, v) => s + v, 0) / values.length;\n\n/** This function gives the `q` quantile of sorted values, with linear interpolation. */\nfunction quantileOf(sorted: readonly number[], q: number): number {\n const at = (sorted.length - 1) * q;\n const lo = Math.floor(at);\n const hi = Math.ceil(at);\n return sorted[lo]! + (sorted[hi]! - sorted[lo]!) * (at - lo);\n}\n\n/** This function gives the interval of the samples of a bootstrap at the level `1 - level`. */\nfunction intervalOf(mean: number, samples: number[], level: number): VerdictInterval {\n samples.sort((x, y) => x - y);\n return { mean, lo: quantileOf(samples, level / 2), hi: quantileOf(samples, 1 - level / 2) };\n}\n\n/** This function tells if an interval is clear of 0 on the side of the sign `sign`. */\nconst clearOn = (i: VerdictInterval, sign: number): boolean => (sign > 0 ? i.lo > 0 : sign < 0 ? i.hi < 0 : false);\n\n/** This function gives the two-sided p of the exact binomial sign test, with `p = 0.5`. No count gives 1. */\nfunction signP(wins: number, losses: number): number {\n const n = wins + losses;\n if (n === 0) return 1;\n const k = Math.min(wins, losses);\n let tail = 0;\n let c = 1;\n for (let i = 0; i <= k; i++) {\n tail += c;\n c = (c * (n - i)) / (i + 1);\n }\n return Math.min(1, (2 * tail) / 2 ** n);\n}\n\n/** This function gives the breadth of a verdict with the side `side`: 1, -1, or 0 for no side. */\nfunction breadthOf(families: readonly FamilyVerdict[], side: number): VerdictBreadth {\n const ties = families.filter((f) => f.sign === 0).length;\n const against = side === 0 ? 0 : families.filter((f) => f.sign === -side).length;\n return { against, of: families.length, ties };\n}\n\n/** This function gives the line of a verdict: its label, its scope and its breadth (`docs/VERDICT.md`). */\nfunction summaryOf(label: VerdictLabel, side: number, breadth: VerdictBreadth): string {\n const ties = breadth.ties === 0 ? \"\" : ` (${breadth.ties} ${breadth.ties === 1 ? \"tie\" : \"ties\"})`;\n const word = side > 0 ? \"better\" : \"worse\";\n const other = side > 0 ? \"worse\" : \"better\";\n const count = breadth.against === 0 ? \"none\" : String(breadth.against);\n if (label === \"better\" || label === \"worse\") return `${label} on these families, ${other} on ${count} of ${breadth.of}${ties}`;\n if (side === 0) return `${label}: the family mean is 0, on ${breadth.of} families${ties}`;\n return `${label}: ${word} on the family mean, ${other} on ${count} of ${breadth.of}${ties}`;\n}\n\n/** This function tells if a value is a positive whole number. */\nconst isCount = (v: number): boolean => Number.isInteger(v) && v > 0;\n\n/** This function gives the test of one side. */\nfunction sideTest<R extends VerdictRecord>(side: VerdictSide<R>): (record: R) => boolean {\n return typeof side === \"string\" ? (r) => r.strategy === side : side;\n}\n\n/** This function pairs the records of `a` and `b` by input and seed, and gives the pairs in the order of family and key. */\nfunction pairsOf<R extends VerdictRecord>(records: Iterable<R>, options: VerdictOptions<R>): { pairs: Pair[]; dropped: string[] } {\n const isA = sideTest(options.a);\n const isB = sideTest(options.b);\n const sides = new Map<string, { a?: R; b?: R }>();\n for (const r of records) {\n const inA = isA(r);\n const inB = isB(r);\n if (inA && inB) throw new RangeError(`verdict: the record of the input \"${r.input}\" is in the two sides`);\n if (!inA && !inB) continue;\n const key = `${r.input}#${r.seed}`;\n const entry = sides.get(key) ?? {};\n const side = inA ? \"a\" : \"b\";\n if (entry[side] !== undefined) throw new RangeError(`verdict: the side ${side} has two records of the input \"${r.input}\" and the seed ${r.seed}`);\n entry[side] = r;\n sides.set(key, entry);\n }\n const pairs: Pair[] = [];\n const dropped: string[] = [];\n const id = options.measure.id;\n for (const [key, { a, b }] of sides) {\n const va = a?.skipped === undefined ? a?.measures[id] : undefined;\n const vb = b?.skipped === undefined ? b?.measures[id] : undefined;\n if (a === undefined || b === undefined || va === undefined || vb === undefined) {\n dropped.push(key);\n continue;\n }\n if (!Number.isFinite(va) || !Number.isFinite(vb)) throw new RangeError(`verdict: the measure ${id} of the input \"${a.input}\" is not finite`);\n const family = options.family(a);\n if (options.family(b) !== family) throw new RangeError(`verdict: the two records of the input \"${a.input}\" have different families`);\n pairs.push({ key, family, a: va, b: vb, d: options.measure.direction === \"higher\" ? vb - va : va - vb });\n }\n pairs.sort((x, y) => (x.family < y.family ? -1 : x.family > y.family ? 1 : x.key < y.key ? -1 : x.key > y.key ? 1 : 0));\n dropped.sort();\n return { pairs, dropped };\n}\n\n/**\n * This function gives the verdict of the candidate `b` against the baseline `a` on one measure, with the family as the unit (`docs/VERDICT.md`).\n *\n * - It pairs the records by input and seed. The difference of a pair is `b - a` for a measure where more is better, else `a - b`.\n * - `stratified` is the mean of the family means. Its bootstrap draws the seeds inside each family. `pooled` is the mean of the inputs.\n * - The permutation test changes the sign of each difference inside its family. Its statistic is the mean of the family means.\n * - The label is `better` or `worse` only when `agree` is `true`. Opposite signs of the two means give `depends on the mix`.\n * - `scope`, `breadth` and `summary` tell that the claim is about these families, and how many families are against it.\n *\n * It throws a `RangeError` for a missing `tie` or `level`, and for no pair. Two records of one side and input, or a value that is not finite, also cause a `RangeError`.\n */\nexport function verdict<R extends VerdictRecord>(records: Iterable<R>, options: VerdictOptions<R>): VerdictResult {\n const { tie, level, measure } = options;\n if (options.by !== \"family\") throw new RangeError(`verdict: the unit is \"family\", not \"${String(options.by)}\"`);\n if (tie === undefined || (typeof tie === \"number\" ? !(tie >= 0) : !(tie.rel >= 0))) throw new RangeError(\"verdict: tie is a required number of 0 or more, or { rel } of 0 or more\");\n if (level === undefined || !(level > 0 && level < 1)) throw new RangeError(\"verdict: level is a required number between 0 and 1\");\n const runs = options.runs ?? VERDICT_RUNS;\n const draws = options.draws ?? VERDICT_DRAWS;\n const seed = options.seed ?? VERDICT_SEED;\n const exactMax = options.exactMax ?? VERDICT_EXACT_MAX;\n if (!isCount(runs) || !isCount(draws)) throw new RangeError(\"verdict: runs and draws are whole numbers above 0\");\n if (!Number.isInteger(exactMax) || exactMax < 0 || exactMax > VERDICT_EXACT_CAP) throw new RangeError(`verdict: exactMax is a whole number from 0 to ${VERDICT_EXACT_CAP}`);\n\n const { pairs, dropped } = pairsOf(records, options);\n const n = pairs.length;\n if (n === 0) throw new RangeError(`verdict: the records give no pair of the measure ${measure.id}`);\n\n const groups = new Map<string, Pair[]>();\n for (const p of pairs) groups.set(p.family, [...(groups.get(p.family) ?? []), p]);\n const lists = [...groups.values()];\n const spec = { direction: measure.direction, minEffect: tie };\n const families: FamilyVerdict[] = lists.map((list) => {\n const verdictOf = compareMeasure(meanOf(list.map((p) => p.b)), meanOf(list.map((p) => p.a)), spec);\n return { family: list[0]!.family, n: list.length, mean: meanOf(list.map((p) => p.d)), sign: verdictOf === \"better\" ? 1 : verdictOf === \"worse\" ? -1 : 0 };\n });\n\n // The stratified bootstrap draws the seeds of each family with replacement. The pooled bootstrap draws all the inputs.\n const stratMean = meanOf(families.map((f) => f.mean));\n const rs = stepRandom(seed, \"verdict.stratified\");\n const stratSamples: number[] = [];\n for (let run = 0; run < runs; run++) {\n let sum = 0;\n for (const list of lists) {\n let s = 0;\n for (let j = 0; j < list.length; j++) s += list[Math.floor(rs() * list.length)]!.d;\n sum += s / list.length;\n }\n stratSamples.push(sum / lists.length);\n }\n const stratified = intervalOf(stratMean, stratSamples, level);\n\n const pooledMean = meanOf(pairs.map((p) => p.d));\n const rp = stepRandom(seed, \"verdict.pooled\");\n const pooledSamples: number[] = [];\n for (let run = 0; run < runs; run++) {\n let s = 0;\n for (let j = 0; j < n; j++) s += pairs[Math.floor(rp() * n)]!.d;\n pooledSamples.push(s / n);\n }\n const pooled = intervalOf(pooledMean, pooledSamples, level);\n\n // The statistic is a weighted sum: the weight of an input is 1 / (the count of families × the count of its family).\n const terms = lists.flatMap((list) => list.map((p) => p.d / (lists.length * list.length)));\n const observed = Math.abs(terms.reduce((s, t) => s + t, 0));\n const slack = 1e-12 * terms.reduce((s, t) => s + Math.abs(t), 0);\n const exact = n <= exactMax;\n let hits = 0;\n let total: number;\n if (exact) {\n total = 2 ** n;\n for (let mask = 0; mask < total; mask++) {\n let t = 0;\n for (let i = 0; i < n; i++) t += mask & (1 << i) ? -terms[i]! : terms[i]!;\n if (Math.abs(t) >= observed - slack) hits++;\n }\n } else {\n total = draws;\n const rf = stepRandom(seed, \"verdict.permutation\");\n for (let k = 0; k < draws; k++) {\n let t = 0;\n for (let i = 0; i < n; i++) t += rf() < 0.5 ? -terms[i]! : terms[i]!;\n if (Math.abs(t) >= observed - slack) hits++;\n }\n }\n // A drawn p counts the observed sign set as one draw, so it is always above 0.\n const permutation: VerdictPermutation = { p: exact ? hits / total : (hits + 1) / (total + 1), exact, draws: total, seed };\n\n const wins = families.filter((f) => f.sign === 1).length;\n const losses = families.filter((f) => f.sign === -1).length;\n const signTest: VerdictSignTest = { wins, losses, ties: families.length - wins - losses, p: signP(wins, losses) };\n\n const sign = Math.sign(stratified.mean);\n const agree = sign !== 0 && sign === Math.sign(pooled.mean) && clearOn(stratified, sign) && clearOn(pooled, sign) && permutation.p < level;\n const label: VerdictLabel = agree ? (sign > 0 ? \"better\" : \"worse\") : sign * Math.sign(pooled.mean) < 0 ? \"depends on the mix\" : \"no verdict\";\n const breadth = breadthOf(families, sign);\n const summary = summaryOf(label, sign, breadth);\n return { measure: measure.id, n, stratified, pooled, permutation, families, signTest, agree, label, scope: \"these families\", breadth, summary, dropped };\n}\n","// The shared corpus generator (`docs/CORPUS.md`): the dimension schema, the family registry and the seeded random numbers.\n// An engine owns its families and gives them to a registry. This file imports no engine and no API of Node, so a browser can run it.\nimport type { FamilyBy } from \"./corpus.ts\";\nimport { edgeStep, type EdgeStepParams } from \"./edges.ts\";\nimport { documentHash } from \"./hash.ts\";\nimport type { LayoutInput, Obstacle } from \"./input.ts\";\nimport { mulberry32, randomInt, stepRandom } from \"./random.ts\";\nimport { SHAPE_KIND_IDS } from \"./shapes.ts\";\nimport { paramActive, paramLevels, paramProblem, paramValue, type ParamValue, type SpaceParam } from \"./strategy-space.ts\";\n\n/**\n * One dimension of a corpus: a param of `strategy-space.ts` with its meaning and the engines that use it.\n * The field `when` has the form of `SpaceParam.when`: the dimension is active only for some values of an earlier dimension.\n */\nexport interface CorpusDimension extends SpaceParam {\n /** The meaning of the dimension, in one sentence. */\n readonly meaning: string;\n /** The engines that read the dimension, for example `packing`, `highways` and `joint`. */\n readonly engines: readonly string[];\n /** The values of a sweep. Without them, a sweep uses the values of an `enum`, `false` and `true` of a `bool`, or the default. */\n readonly levels?: readonly ParamValue[];\n /**\n * The values that the family accepts. Without it, the family accepts each value of the dimension.\n * A list is for an `enum` or a `bool`. A sub-range is for an `int` or a `real`.\n * The default and each level are supported values. `resolve` and `generate` refuse a value that is not supported.\n */\n readonly supported?: SupportedValues;\n /**\n * The output fields that a value other than the default makes wrong, for example `known`.\n * Then `generate` of a registry removes these fields from the output, and lists them in `invalidated`.\n */\n readonly invalidates?: readonly string[];\n /**\n * The count of decimal places that the family uses for a value of a numeric dimension: a whole number of 0 or more.\n * Only the `invalidates` compare reads it. The registry rounds the value and the default to it before the compare.\n * The cells, the cell keys, `rngOf` and the value that `generate` gets do not change.\n */\n readonly precision?: number;\n}\n\n/**\n * The supported values of a dimension (`CorpusDimension.supported`).\n * The list form gives the values of an `enum` or a `bool`. The range form gives a sub-range of an `int` or a `real`.\n * A range without `min` or `max` keeps that end of the dimension.\n */\nexport type SupportedValues = readonly ParamValue[] | SupportedRange;\n\n/** The range form of `SupportedValues`: the least and the largest supported value of a numeric dimension. */\nexport interface SupportedRange {\n readonly min?: number;\n readonly max?: number;\n}\n\n/** The name of the output field that lists the fields that `generate` of a registry removed. */\nexport const INVALIDATED_FIELD = \"invalidated\";\n\n/** The values of the dimensions of one input: one value for each name. */\nexport type DimensionValues = Readonly<Record<string, ParamValue>>;\n\n/** A factory of seeded random numbers: it gives a source of numbers in [0, 1) for a seed. */\nexport type RngFactory = (seed: number) => () => number;\n\n/**\n * The cross-engine note of a family. `exact` tells that each JavaScript engine gives the same output.\n * `libm-dependent` tells that the family uses a function that is not correctly rounded in each engine, for example `Math.log`, `Math.cos` or `**`.\n */\nexport type CrossEngine = \"exact\" | \"libm-dependent\";\n\n/** The random numbers of the default factory: `mulberry32` of `random.ts`. Its stream is pinned in `families.test.ts`. */\nexport const DEFAULT_RNG: RngFactory = mulberry32;\n\n/** The context that a registry gives to `generate`. */\nexport interface GenerateContext {\n /** The random factory of the family: its own `rng`, or `DEFAULT_RNG`. */\n readonly rng: RngFactory;\n /** The source of random numbers of the input: `rng(rngSeed(seed, dims))`. A family that does not use it takes no numbers from it. */\n readonly random: () => number;\n /** The name of the corpus of the input, when the caller gives one. */\n readonly set?: string;\n}\n\n/**\n * A family of a corpus: a seeded generator with declared dimensions. The engine that owns it gives it to a registry.\n * The registry gives `generate` the raw seed and the full dimension values.\n * The registry changes the output only for a dimension with `invalidates` at a value other than its default.\n */\nexport interface CorpusFamily<O = LayoutInput> {\n /** The name of the family, for example `rect-grid`. */\n readonly name: string;\n /** The version. A change of the output of the family needs a new version. A dimension of only some versions is in the list of those versions only. */\n readonly version: number;\n /** The engine that owns the definition of the family, for example `packing`. */\n readonly owner: string;\n /** The meaning of the family, in one sentence. */\n readonly meaning: string;\n /** The dimensions of the family, in their order. A dimension with `when` comes after the dimension that its `when` names. The name `kind` is reserved. */\n readonly dimensions: readonly CorpusDimension[];\n /** The text of the rule that gives the random numbers of an input from its seed and its dimensions. */\n readonly seeding: string;\n /** The cross-engine note of the family. */\n readonly crossEngine: CrossEngine;\n /** The random factory of the family. The default is `DEFAULT_RNG`. */\n readonly rng?: RngFactory;\n /** This function gives the seed of `context.random` from the input seed and the full dimension values. The default gives the input seed. */\n readonly rngSeed?: (seed: number, dims: DimensionValues) => number;\n /** The dimensions of the family key of `familyBy`, after the kind of the cell. A dimension with `when` is not permitted. The default is no dimension. */\n readonly familyBy?: readonly string[];\n /**\n * This function gives the hash of an output after the registry removes the fields of `invalidates`. The default is `documentHash` of `hash.ts`.\n * The registry uses it only for an output with a `hash` field of text. The registry gives it an output of the family.\n * Its parameter has the type `never`, so a family of each output type can be a `CorpusFamily<unknown>`.\n */\n readonly hash?: (output: never) => string;\n /** This function gives the input of a seed. `dims` has a value for each dimension, also for an inactive dimension. */\n generate(seed: number, dims: DimensionValues, context: GenerateContext): O;\n}\n\n/** The options of `generate` of a registry. */\nexport interface GenerateOptions {\n /** The version of the family. The default is the first version that the registry got. */\n readonly version?: number;\n /** The name of the corpus. The registry gives it to the family in `context.set`. */\n readonly set?: string;\n}\n\n/** The options of `cells` and `cellCount` of a registry. */\nexport interface CellsOptions {\n readonly version?: number;\n /** The dimensions of the sweep. The other dimensions keep their defaults. The default is each dimension of the family. */\n readonly sweep?: readonly string[];\n /** The values of a sweep for some dimensions, in place of the levels of the dimensions. */\n readonly levels?: Readonly<Record<string, readonly ParamValue[]>>;\n}\n\n/** The cell of an input of a registry: `<name>@<version>` of its family in `kind` (`familyKind`), and the value of each active dimension. */\nexport type RegistryCell = Readonly<Record<string, ParamValue>> & { readonly kind: string };\n\n/** This function gives the `kind` of the cells of a version of a family: `<name>@<version>`, for example `rect-grid@2`. Thus two versions do not share a family key. */\nexport function familyKind(name: string, version: number): string {\n return `${name}@${version}`;\n}\n\n/** A registry of families. An import registers nothing: a host makes a registry from the lists of families of the engines. */\nexport interface FamilyRegistry<O = LayoutInput> {\n /** This method adds a family. It throws a `RangeError` for a second family with the same name and version, or for a bad dimension. */\n register(family: CorpusFamily<O>): FamilyRegistry<O>;\n /** This method gives a family. Without a version, it gives the first version that the registry got. It throws a `RangeError` for an unknown family. */\n family(name: string, version?: number): CorpusFamily<O>;\n /** This method gives each family, in the order of registration. */\n families(): readonly CorpusFamily<O>[];\n /**\n * This method gives the full dimension values of an input. It throws a `RangeError` for an unknown dimension, a bad value or a value that is not supported.\n * The methods with `dims` accept a cell of `cellOf`: they ignore a `kind` that is the `familyKind` of the family, and refuse another `kind`.\n */\n resolve(name: string, dims?: Readonly<Record<string, ParamValue>>, version?: number): DimensionValues;\n /**\n * This method gives the input of a seed: the output of the family. A dimension with `invalidates` at a value other than its default changes it.\n * Then the method removes those fields, adds their names to `invalidated` and calculates the `hash` again. Another output has no change.\n */\n generate(name: string, seed: number, dims?: Readonly<Record<string, ParamValue>>, options?: GenerateOptions): O;\n /** This method gives the cell of an input: the `familyKind` of the family version and the value of each active dimension. */\n cellOf(name: string, dims?: Readonly<Record<string, ParamValue>>, version?: number): RegistryCell;\n /** This method gives the full dimension values of each cell of a sweep, without the dead combinations of `when`. */\n cells(name: string, options?: CellsOptions): Generator<DimensionValues>;\n /** This method gives the count of the cells of `cells`. It makes no input. */\n cellCount(name: string, options?: CellsOptions): number;\n /** This method gives the defaults, and each end of each numeric range. The dimensions that a `when` needs get its first value. The other dimensions keep their defaults. */\n boundaryCells(name: string, version?: number): DimensionValues[];\n /** This method gives the random source of an input: the stream that `generate` gets in `context.random`. */\n rngOf(name: string, version?: number): (seed: number, dims?: Readonly<Record<string, ParamValue>>) => () => number;\n /** This method gives the map form of `FamilyBy` for the cells of `cellOf`: the `familyKind` of each family version, with its own `familyBy`. */\n familyBy(): FamilyBy;\n}\n\n/** The default key of a family in a manifest: the kind of the cell alone. It is the map form of `FamilyBy` with the entry `\"*\"`. */\nexport const DEFAULT_FAMILY_BY: FamilyBy = Object.freeze({ \"*\": Object.freeze([]) as readonly string[] });\n\n/** This function gives an `enum` dimension. */\nconst choice = (name: string, values: readonly string[], value: string, meaning: string, engines: readonly string[]): CorpusDimension =>\n Object.freeze({ name, kind: \"enum\", values: Object.freeze([...values]), default: value, meaning, engines: Object.freeze([...engines]) });\n\n/** This function gives an `int` or a `real` dimension. */\nconst range = (\n name: string,\n kind: \"int\" | \"real\",\n limits: { readonly min: number; readonly max: number; readonly value: number; readonly scale?: \"linear\" | \"log\"; readonly levels?: readonly number[] },\n meaning: string,\n engines: readonly string[],\n): CorpusDimension =>\n Object.freeze({\n name,\n kind,\n min: limits.min,\n max: limits.max,\n default: limits.value,\n scale: limits.scale ?? \"linear\",\n ...(limits.levels === undefined ? {} : { levels: Object.freeze([...limits.levels]) }),\n meaning,\n engines: Object.freeze([...engines]),\n });\n\nconst P = \"packing\";\nconst H = \"highways\";\nconst J = \"joint\";\n\n/**\n * The shared dimension table. A family takes a dimension of it with `sharedDimension`, or declares its own dimension.\n * The coverage table of each dimension and each engine is in `docs/CORPUS.md`.\n */\nexport const CORPUS_DIMENSIONS: Readonly<Record<string, CorpusDimension>> = Object.freeze({\n count: range(\"count\", \"int\", { min: 0, max: 100_000, value: 100, scale: \"log\", levels: [1, 10, 100, 1000, 10_000] }, \"The count of the items (n) of an input.\", [P, H, J]),\n sizes: choice(\"sizes\", [\"identical\", \"nearIdentical\", \"uniform\", \"heavyTail\", \"bimodal\", \"extremeAspect\"], \"uniform\", \"The distribution of the sizes of the items.\", [P, J]),\n aspect: range(\"aspect\", \"real\", { min: 0.25, max: 4, value: 1, scale: \"log\" }, \"The width over the height of a container with no fixed size.\", [P]),\n density: range(\"density\", \"real\", { min: 0.05, max: 1, value: 0.4, scale: \"linear\" }, \"The area of the items over the area of the frame of the container.\", [P]),\n obstacles: choice(\"obstacles\", [\"none\", \"center\", \"scattered\", \"wall\", \"corridors\", \"touching\", \"edge\"], \"none\", \"The layout of the fixed obstacles.\", [P, J]),\n containerSize: choice(\"containerSize\", [\"fixed\", \"freeHeight\", \"freeWidth\", \"freeAspect\", \"freeArea\"], \"fixed\", \"The sides of the container that the engine can change.\", [P, J]),\n containerShape: choice(\"containerShape\", [\"rect\", \"convex\", \"polygon\", \"circle\", \"ellipse\", \"holes\"], \"rect\", \"The kind of the shape of the container.\", [P, J]),\n shape: choice(\"shape\", SHAPE_KIND_IDS, \"rect\", \"The shape kind of each item: a `ShapeKind` of `shapes.ts`.\", [P]),\n order: choice(\"order\", [\"free\", \"soft\"], \"free\", \"The reading order of the items: no order, or a rank on each item.\", [P]),\n groups: choice(\"groups\", [\"none\", \"flat\", \"nested\"], \"none\", \"The groups of the items: no groups, one level, or groups in groups.\", [H, J]),\n edgeDensity: choice(\"edgeDensity\", [\"sparse\", \"medium\", \"dense\"], \"medium\", \"The mean count of the edges of each item: 0.5, 1.5 or 4.\", [H, J]),\n edgeShape: choice(\"edgeShape\", [\"random\", \"clustered\", \"hubChain\", \"hubs\", \"longRange\", \"tree\", \"bundled\"], \"random\", \"The topology of the edges.\", [H, J]),\n ports: choice(\"ports\", [\"free\", \"sides\", \"fixed\"], \"free\", \"The ports of the edges: free, a side for each end, or fixed ports.\", [H, J]),\n hubBy: Object.freeze({\n ...choice(\"hubBy\", [\"area\", \"random\"], \"area\", \"The order of the hubs of the shapes hubs and tree: the largest item first, or random.\", [J]),\n when: Object.freeze({ param: \"edgeShape\", in: Object.freeze([\"hubs\", \"tree\"]) }),\n }),\n spacing: choice(\"spacing\", [\"stress\", \"gap\", \"margin\", \"both\"], \"both\", \"The split of the route clearance between the margins and the gap. `stress` has neither.\", [J]),\n margin: range(\"margin\", \"real\", { min: 0, max: 32, value: 0 }, \"The margin of each item, in units.\", [P, J]),\n gap: range(\"gap\", \"real\", { min: 0, max: 32, value: 0 }, \"The free space between two items, in units.\", [P, J]),\n});\n\n/**\n * This function gives a dimension of `CORPUS_DIMENSIONS`, with the fields of `patch` over it. It throws a `RangeError` for an unknown name.\n * With `supported`, `invalidates` or `precision` in the patch, it also throws a `RangeError` for a bad dimension, as `ownerDimension` does.\n */\nexport function sharedDimension(name: string, patch: Partial<CorpusDimension> = {}): CorpusDimension {\n const base = Object.hasOwn(CORPUS_DIMENSIONS, name) ? CORPUS_DIMENSIONS[name] : undefined;\n if (base === undefined) throw new RangeError(`The shared dimension table has no dimension \"${name}\".`);\n const dim: CorpusDimension = Object.freeze({ ...base, ...patch, name });\n if (patch.supported !== undefined || patch.invalidates !== undefined || patch.precision !== undefined)\n throwProblems(`sharedDimension: the dimension \"${name}\"`, ownProblems(dim));\n return dim;\n}\n\n/** The fields of a dimension that the owner declares: each field of `CorpusDimension` but the name. */\nexport type OwnerDimensionSpec = Omit<CorpusDimension, \"name\">;\n\n/**\n * This function gives a dimension that only its owner declares, for example `cut` of a family of `packing`.\n * It throws a `RangeError` for a name of `CORPUS_DIMENSIONS`, the reserved name `kind`, or a bad default, level, `supported`, `invalidates` or `precision`.\n * The registry examines the `when` of the dimension, because it needs the earlier dimensions.\n */\nexport function ownerDimension(name: string, spec: OwnerDimensionSpec): CorpusDimension {\n const where = `ownerDimension: the dimension \"${name}\"`;\n if (typeof name !== \"string\" || name === \"\") throw new RangeError(\"ownerDimension: the name of a dimension is a text that is not empty.\");\n if (name === \"kind\") throw new RangeError(`${where} has a reserved name: the cell of \\`cellOf\\` has the \\`familyKind\\` of the family in \\`kind\\`.`);\n if (Object.hasOwn(CORPUS_DIMENSIONS, name)) throw new RangeError(`${where} is in the shared dimension table. Use sharedDimension(\"${name}\") for it.`);\n const dim: CorpusDimension = Object.freeze({ ...spec, name });\n throwProblems(where, ownProblems(dim));\n return dim;\n}\n\n/** This function throws a `RangeError` with each problem of a list. An empty list throws nothing. */\nfunction throwProblems(where: string, problems: readonly string[]): void {\n if (problems.length > 0) throw new RangeError(`${where} is not good: ${problems.join(\"; \")}.`);\n}\n\n/** This function tells if a value of the stable form of a dimension is in its `supported` values. Without `supported`, each value is in them. */\nfunction inSupported(dim: CorpusDimension, value: ParamValue): boolean {\n const s = dim.supported;\n if (s === undefined) return true;\n if (isSupportedList(s)) return s.some((v) => paramValue(dim, v) === value);\n if (typeof value !== \"number\") return false;\n return (s.min === undefined || value >= s.min) && (s.max === undefined || value <= s.max);\n}\n\n/** This function tells if `SupportedValues` has the list form. */\nconst isSupportedList = (s: SupportedValues): s is readonly ParamValue[] => Array.isArray(s);\n\n/**\n * This function tells if a family accepts a value of a dimension. A site uses it to show the values that a family does not support.\n * It gives `false` for a bad value, and for a value outside `supported`. Without `supported`, it gives `true` for each good value.\n */\nexport function dimensionSupports(dim: CorpusDimension, value: unknown): boolean {\n if (paramProblem(dim, value) !== undefined) return false;\n return inSupported(dim, paramValue(dim, value as ParamValue));\n}\n\n/** This function gives the text of the supported values of a dimension, for a message. */\nfunction supportedText(dim: CorpusDimension): string {\n const s = dim.supported;\n if (s === undefined) return \"each value\";\n if (isSupportedList(s)) return s.map((v) => JSON.stringify(v)).join(\", \");\n return `the values from ${s.min ?? dim.min} to ${s.max ?? dim.max}`;\n}\n\n/** This function gives the problems of one dimension that need no other dimension: the default, the levels, `supported`, `invalidates` and `precision`. */\nfunction ownProblems(d: CorpusDimension): string[] {\n const out: string[] = [];\n const bad = paramProblem(d, d.default);\n if (bad !== undefined) out.push(`the default of \"${d.name}\" is bad: ${bad}`);\n for (const v of d.levels ?? []) {\n const p = paramProblem(d, v);\n if (p !== undefined) out.push(`a level of \"${d.name}\" is bad: ${p}`);\n }\n out.push(...supportProblems(d, bad === undefined));\n out.push(...invalidatesProblems(d));\n out.push(...precisionProblems(d));\n return out;\n}\n\n/** This function gives the problems of the `supported` values of a dimension. `goodDefault` tells that the default is a good value. */\nfunction supportProblems(d: CorpusDimension, goodDefault: boolean): string[] {\n const s = d.supported;\n if (s === undefined) return [];\n const out: string[] = [];\n const numeric = d.kind === \"int\" || d.kind === \"real\";\n if (isSupportedList(s)) {\n if (numeric) return [`the supported values of \"${d.name}\" are a range with min and max, because the dimension is numeric`];\n if (s.length === 0) return [`the supported values of \"${d.name}\" are an empty list`];\n for (const v of s) {\n const p = paramProblem(d, v);\n if (p !== undefined) out.push(`a supported value of \"${d.name}\" is bad: ${p}`);\n }\n if (new Set(s).size !== s.length) out.push(`the supported values of \"${d.name}\" have a value two times`);\n } else {\n if (s === null || typeof s !== \"object\") return [`the supported values of \"${d.name}\" are a list or a range`];\n if (!numeric) return [`the supported values of \"${d.name}\" are a list, because the dimension is not numeric`];\n for (const end of [s.min, s.max]) {\n if (end === undefined) continue;\n const p = paramProblem(d, end);\n if (p !== undefined) out.push(`an end of the supported range of \"${d.name}\" is bad: ${p}`);\n }\n if (s.min !== undefined && s.max !== undefined && s.min > s.max) out.push(`the supported range of \"${d.name}\" has a min above its max`);\n }\n if (out.length > 0) return out;\n if (goodDefault && !inSupported(d, paramValue(d, d.default))) out.push(`the default of \"${d.name}\" is not a supported value`);\n for (const v of d.levels ?? []) if (paramProblem(d, v) === undefined && !inSupported(d, paramValue(d, v))) out.push(`the level ${JSON.stringify(v)} of \"${d.name}\" is not a supported value`);\n return out;\n}\n\n/** This function gives the problems of the `invalidates` fields of a dimension. */\nfunction invalidatesProblems(d: CorpusDimension): string[] {\n const list = d.invalidates;\n if (list === undefined) return [];\n if (!Array.isArray(list) || !list.every((f) => typeof f === \"string\" && f !== \"\")) return [`the invalidates of \"${d.name}\" is not a list of field names`];\n const out: string[] = [];\n if (new Set(list).size !== list.length) out.push(`the invalidates of \"${d.name}\" has a field two times`);\n for (const f of [\"hash\", INVALIDATED_FIELD]) if (list.includes(f)) out.push(`the invalidates of \"${d.name}\" has the field \"${f}\", which the registry writes`);\n return out;\n}\n\n/** This function gives the problems of the `precision` of a dimension. A bad value and a dimension that is not numeric are problems. */\nfunction precisionProblems(d: CorpusDimension): string[] {\n const p: unknown = d.precision;\n if (p === undefined) return [];\n if (typeof p !== \"number\" || !Number.isInteger(p) || p < 0) return [`the precision of \"${d.name}\" is ${JSON.stringify(p)}, not a whole number of 0 or more`];\n if (d.kind !== \"int\" && d.kind !== \"real\") return [`the precision of \"${d.name}\" is for a numeric dimension, but the dimension is a ${d.kind}`];\n return [];\n}\n\n/** This function rounds a number to `places` decimal places: `Math.round(v * 10 ** places) / 10 ** places`. */\nconst roundTo = (v: number, places: number): number => Math.round(v * 10 ** places) / 10 ** places;\n\n/** This function tells if a value is the default of a dimension. With `precision`, it compares the two numbers after it rounds them. */\nfunction isDefault(d: CorpusDimension, value: ParamValue | undefined): boolean {\n const def = paramValue(d, d.default);\n if (d.precision === undefined || typeof value !== \"number\" || typeof def !== \"number\") return value === def;\n return roundTo(value, d.precision) === roundTo(def, d.precision);\n}\n\n/** This function tells if a log scale of a range starts at 0. Then the scale is the log of `1 + x - min`. */\nconst fromZero = (d: SpaceParam): boolean => d.scale === \"log\" && (d.min ?? 0) <= 0;\n\n/**\n * This function gives the value at the fraction `t` of the range of a numeric dimension, on its scale. A slider of a site uses it.\n * A log scale with a `min` of 0 or less is the log of `1 + x - min`. An `int` dimension gives a whole number.\n */\nexport function dimensionAt(dim: SpaceParam, t: number): number {\n const min = dim.min ?? 0;\n const max = dim.max ?? min;\n const u = Math.min(1, Math.max(0, t));\n let v: number;\n if (dim.scale !== \"log\") v = min + u * (max - min);\n else if (fromZero(dim)) v = min + Math.expm1(u * Math.log1p(max - min));\n else v = Math.exp(Math.log(min) + u * (Math.log(max) - Math.log(min)));\n v = Math.min(max, Math.max(min, v));\n return dim.kind === \"int\" ? Math.round(v) : (paramValue(dim, v) as number);\n}\n\n/** This function gives the fraction of the range of a numeric dimension at a value, on its scale. It is the inverse of `dimensionAt`. */\nexport function dimensionUnit(dim: SpaceParam, value: number): number {\n const min = dim.min ?? 0;\n const max = dim.max ?? min;\n if (max === min) return 0;\n const v = Math.min(max, Math.max(min, value));\n if (dim.scale !== \"log\") return (v - min) / (max - min);\n if (fromZero(dim)) return Math.log1p(v - min) / Math.log1p(max - min);\n return (Math.log(v) - Math.log(min)) / (Math.log(max) - Math.log(min));\n}\n\n/** This function gives the range of the supported values of a numeric dimension: its own `min` and `max` in place of the ends of `supported`. */\nfunction supportedSpan(dim: CorpusDimension): { readonly min: number | undefined; readonly max: number | undefined } {\n const s = dim.supported;\n const range = s === undefined || isSupportedList(s) ? {} : s;\n return { min: range.min ?? dim.min, max: range.max ?? dim.max };\n}\n\n/**\n * This function gives the values of a sweep of a dimension. `levels` of the dimension come first. Then an `enum` gives its values, and a `bool` gives `false` and `true`.\n * With `steps`, a numeric dimension gives `steps` points from `min` to `max` on its scale. Else it gives its default.\n * With `supported`, an `enum` and a `bool` give only the supported values, and the points of a numeric dimension stay in the supported range.\n */\nexport function levelsOf(dim: CorpusDimension, steps?: number): ParamValue[] {\n if (dim.levels !== undefined) return [...dim.levels];\n if (dim.kind === \"enum\" || dim.kind === \"bool\") return paramLevels(dim, 1).filter((v) => inSupported(dim, paramValue(dim, v)));\n if (steps === undefined) return paramLevels(dim, 1);\n if (dim.supported !== undefined) {\n const { supported: _supported, ...rest } = dim;\n const span = supportedSpan(dim);\n return levelsOf({ ...rest, ...(span.min === undefined ? {} : { min: span.min }), ...(span.max === undefined ? {} : { max: span.max }) }, steps);\n }\n if (!fromZero(dim)) return paramLevels(dim, steps);\n if (!Number.isInteger(steps) || steps < 1) throw new RangeError(`The steps of a sweep are a whole number of 1 or more, not ${steps}.`);\n if (steps === 1) return [paramValue(dim, dim.default)];\n return [...new Set(Array.from({ length: steps }, (_, j) => dimensionAt(dim, j / (steps - 1))))];\n}\n\n/** This function gives the problems of the dimensions of a family: a repeated name, a bad default, level, `supported`, `invalidates` or `when`. */\nfunction dimensionProblems(dims: readonly CorpusDimension[]): string[] {\n const out: string[] = [];\n const names = dims.map((d) => d.name);\n dims.forEach((d, i) => {\n if (names.indexOf(d.name) !== i) out.push(`the dimension \"${d.name}\" is in the list two times`);\n out.push(...ownProblems(d));\n if (d.when === undefined) return;\n const j = names.indexOf(d.when.param);\n if (j < 0 || j >= i) out.push(`the when of \"${d.name}\" names \"${d.when.param}\", which is not an earlier dimension`);\n else if (d.when.in.length === 0) out.push(`the when of \"${d.name}\" has no values`);\n else for (const v of d.when.in) if (paramProblem(dims[j]!, v) !== undefined) out.push(`the when of \"${d.name}\" has a value that \"${d.when.param}\" does not have`);\n });\n return out;\n}\n\n/**\n * This function gives the full dimension values of an input. A missing dimension gets its default. An inactive dimension of `when` also gets its default.\n * Thus a default that the caller gives, a missing value and an inactive value give the same values. A real number gets its stable form.\n *\n * The function throws a `RangeError` for an unknown dimension or a bad value, also for a bad value of an inactive dimension.\n * It also throws a `RangeError` for a value outside `supported`, with the text \"not supported by\" and `by`.\n */\nexport function resolveDimensions(\n dimensions: readonly CorpusDimension[],\n dims: Readonly<Record<string, ParamValue>> = {},\n where: string = \"The family\",\n by: string = \"the family\",\n): DimensionValues {\n const known = new Set(dimensions.map((d) => d.name));\n for (const key of Object.keys(dims)) if (!known.has(key)) throw new RangeError(`${where} has no dimension \"${key}\".`);\n const active: Record<string, ParamValue> = {};\n const out: Record<string, ParamValue> = {};\n for (const d of dimensions) {\n const given = Object.hasOwn(dims, d.name) ? dims[d.name] : undefined;\n if (given !== undefined) {\n const bad = paramProblem(d, given);\n if (bad !== undefined) throw new RangeError(`${where}: the dimension \"${d.name}\" is bad: ${bad}.`);\n if (!inSupported(d, paramValue(d, given))) {\n throw new RangeError(`${where}: the value ${JSON.stringify(given)} of the dimension \"${d.name}\" is not supported by ${by}. The supported values are ${supportedText(d)}.`);\n }\n }\n const on = paramActive(d, active);\n const value = paramValue(d, on && given !== undefined ? given : d.default);\n if (on) active[d.name] = value;\n out[d.name] = value;\n }\n return out;\n}\n\n/** This function gives the values of the active dimensions only. */\nfunction activeValues(dimensions: readonly CorpusDimension[], full: DimensionValues): Record<string, ParamValue> {\n const active: Record<string, ParamValue> = {};\n for (const d of dimensions) if (paramActive(d, active)) active[d.name] = full[d.name]!;\n return active;\n}\n\n/** This function gives the active values of each cell of a sweep, in the order of the dimensions. The last dimension changes first. */\nfunction* sweepOf(dimensions: readonly CorpusDimension[], levels: readonly (readonly ParamValue[] | undefined)[], i = 0, values: Record<string, ParamValue> = {}): Generator<Record<string, ParamValue>> {\n if (i === dimensions.length) {\n yield { ...values };\n return;\n }\n const d = dimensions[i]!;\n const lv = levels[i];\n if (lv === undefined || !paramActive(d, values)) {\n yield* sweepOf(dimensions, levels, i + 1, paramActive(d, values) ? { ...values, [d.name]: paramValue(d, d.default) } : values);\n return;\n }\n for (const v of lv) yield* sweepOf(dimensions, levels, i + 1, { ...values, [d.name]: paramValue(d, v) });\n}\n\n/** This function counts the cells of a sweep with no list of the cells. A dimension that a later `when` reads splits the count. */\nfunction countOf(dimensions: readonly CorpusDimension[], levels: readonly (readonly ParamValue[] | undefined)[], i = 0, values: Record<string, ParamValue> = {}): number {\n if (i === dimensions.length) return 1;\n const d = dimensions[i]!;\n if (!paramActive(d, values)) return countOf(dimensions, levels, i + 1, values);\n const lv = levels[i] ?? [d.default];\n const readLater = dimensions.slice(i + 1).some((q) => q.when?.param === d.name);\n if (!readLater) return lv.length * countOf(dimensions, levels, i + 1, values);\n let sum = 0;\n for (const v of lv) sum += countOf(dimensions, levels, i + 1, { ...values, [d.name]: paramValue(d, v) });\n return sum;\n}\n\n/** This function gives the levels of each dimension of a sweep. A dimension outside the sweep has `undefined`, so it keeps its default. */\nfunction sweepLevels(dimensions: readonly CorpusDimension[], options: CellsOptions, where: string, by: string): (readonly ParamValue[] | undefined)[] {\n const names = new Set(dimensions.map((d) => d.name));\n for (const name of [...(options.sweep ?? []), ...Object.keys(options.levels ?? {})]) if (!names.has(name)) throw new RangeError(`${where} has no dimension \"${name}\".`);\n return dimensions.map((d) => {\n if (options.sweep !== undefined && !options.sweep.includes(d.name)) return undefined;\n const lv = options.levels !== undefined && Object.hasOwn(options.levels, d.name) ? options.levels[d.name]! : levelsOf(d);\n for (const v of lv) {\n const bad = paramProblem(d, v);\n if (bad !== undefined) throw new RangeError(`${where}: a level of \"${d.name}\" is bad: ${bad}.`);\n if (!inSupported(d, paramValue(d, v))) throw new RangeError(`${where}: the level ${JSON.stringify(v)} of \"${d.name}\" is not supported by ${by}.`);\n }\n return lv;\n });\n}\n\n/**\n * This function gives the output fields that the values make wrong: the `invalidates` of each dimension with a value other than its default, sorted.\n * A dimension with `precision` compares the rounded value with the rounded default.\n */\nfunction invalidFields(dimensions: readonly CorpusDimension[], full: DimensionValues): string[] {\n const out = new Set<string>();\n for (const d of dimensions) {\n if (d.invalidates === undefined || d.invalidates.length === 0) continue;\n if (!isDefault(d, full[d.name])) for (const f of d.invalidates) out.add(f);\n }\n return [...out].sort(byCode);\n}\n\n/** This function compares two strings by their UTF-16 code units. */\nconst byCode = (x: string, y: string): number => (x < y ? -1 : x > y ? 1 : 0);\n\n/**\n * This function removes the fields of `fields` from an output, and adds their names to its field `invalidated`, sorted.\n * Only a field of the output counts. The `hash` of text gets the value of `hash` again. An output with none of the fields is the same object.\n */\nfunction dropFields<O>(output: O, fields: readonly string[], hash: (output: O) => string, where: string): O {\n if (fields.length === 0) return output;\n if (output === null || typeof output !== \"object\" || Array.isArray(output)) throw new RangeError(`${where} invalidates the fields ${fields.join(\", \")}, but its output is not an object.`);\n const o = output as Record<string, unknown>;\n const dropped = fields.filter((f) => Object.hasOwn(o, f));\n if (dropped.length === 0) return output;\n const before = o[INVALIDATED_FIELD];\n const prior = Array.isArray(before) ? before.filter((f): f is string => typeof f === \"string\") : [];\n const body: Record<string, unknown> = {};\n for (const key of Object.keys(o)) if (key !== \"hash\" && key !== INVALIDATED_FIELD && !dropped.includes(key)) body[key] = o[key];\n body[INVALIDATED_FIELD] = [...new Set([...prior, ...dropped])].sort(byCode);\n if (typeof o[\"hash\"] !== \"string\") return (Object.hasOwn(o, \"hash\") ? { ...body, hash: o[\"hash\"] } : body) as O;\n return { ...body, hash: hash(body as O) } as O;\n}\n\n/** This function gives the values that make a dimension active: the first value of its `when`, and the values that make that dimension active. */\nfunction activation(dimensions: readonly CorpusDimension[], dim: CorpusDimension): Record<string, ParamValue> {\n const out: Record<string, ParamValue> = {};\n let d: CorpusDimension | undefined = dim;\n while (d?.when !== undefined) {\n const param: string = d.when.param;\n out[param] = d.when.in[0]!;\n d = dimensions.find((q) => q.name === param);\n }\n return out;\n}\n\n/** This function throws a `RangeError` when a seed is not a whole number of 0 or more. */\nfunction checkSeed(seed: number): void {\n if (!Number.isSafeInteger(seed) || seed < 0) throw new RangeError(`The seed is a whole number of 0 or more, not ${seed}.`);\n}\n\n/** This function gives a new registry with the families of the list. Each engine gives the list of its families. An import registers nothing. */\nexport function createFamilyRegistry<O = LayoutInput>(families: Iterable<CorpusFamily<O>> = []): FamilyRegistry<O> {\n const list: CorpusFamily<O>[] = [];\n const label = (f: CorpusFamily<O>): string => `The family \"${f.name}\" version ${f.version}`;\n const find = (name: string, version?: number): CorpusFamily<O> => {\n const named = list.filter((f) => f.name === name);\n if (named.length === 0) throw new RangeError(`The registry has no family \"${name}\".`);\n if (version === undefined) return named[0]!;\n const found = named.find((f) => f.version === version);\n if (found === undefined) throw new RangeError(`The family \"${name}\" has the versions ${named.map((f) => f.version).join(\", \")}, not ${version}.`);\n return found;\n };\n /** This function removes the `kind` of a cell of `cellOf` when it is the `familyKind` of `f`. It throws a `RangeError` for another kind. */\n const ownDims = (f: CorpusFamily<O>, dims: Readonly<Record<string, ParamValue>> | undefined): Readonly<Record<string, ParamValue>> | undefined => {\n if (dims === undefined || !Object.hasOwn(dims, \"kind\")) return dims;\n const kind = familyKind(f.name, f.version);\n if (dims[\"kind\"] !== kind) throw new RangeError(`${label(f)} has the kind \"${kind}\", not the kind ${JSON.stringify(dims[\"kind\"])} of the cell.`);\n const { kind: _kind, ...rest } = dims;\n return rest;\n };\n /** This function gives the full dimension values of an input of `f`. A message names the family as `familyKind` gives it. */\n const resolveIn = (f: CorpusFamily<O>, dims: Readonly<Record<string, ParamValue>> | undefined): DimensionValues =>\n resolveDimensions(f.dimensions, dims, label(f), familyKind(f.name, f.version));\n const streamOf = (f: CorpusFamily<O>, seed: number, full: DimensionValues): { readonly rng: RngFactory; readonly random: () => number } => {\n const rng = f.rng ?? DEFAULT_RNG;\n return { rng, random: rng(f.rngSeed === undefined ? seed : f.rngSeed(seed, full)) };\n };\n const registry: FamilyRegistry<O> = {\n register(family) {\n if (!Number.isInteger(family.version) || family.version < 1) throw new RangeError(`${label(family)} has a version that is not a whole number of 1 or more.`);\n if (list.some((f) => f.name === family.name && f.version === family.version)) throw new RangeError(`${label(family)} is in the registry already.`);\n const problems = dimensionProblems(family.dimensions);\n const names = family.dimensions.map((d) => d.name);\n if (names.includes(\"kind\")) problems.push('the dimension name \"kind\" is reserved: the cell of `cellOf` has the `familyKind` of the family in `kind`');\n for (const key of family.familyBy ?? []) {\n const d = family.dimensions.find((q) => q.name === key);\n if (d === undefined) problems.push(`the familyBy dimension \"${key}\" is not a dimension of the family`);\n else if (d.when !== undefined) problems.push(`the familyBy dimension \"${key}\" has a when, so a cell without it has no family key`);\n }\n if (problems.length > 0) throw new RangeError(`${label(family)} is not good: ${problems.join(\"; \")}.`);\n list.push(family);\n return registry;\n },\n family: find,\n families: () => [...list],\n resolve(name, dims, version) {\n const f = find(name, version);\n return resolveIn(f, ownDims(f, dims));\n },\n generate(name, seed, dims, options = {}) {\n checkSeed(seed);\n const f = find(name, options.version);\n const full = resolveIn(f, ownDims(f, dims));\n const context: GenerateContext = { ...streamOf(f, seed, full), ...(options.set === undefined ? {} : { set: options.set }) };\n const output = f.generate(seed, full, context);\n const hash = (f.hash ?? documentHash) as (o: O) => string;\n return dropFields(output, invalidFields(f.dimensions, full), hash, label(f));\n },\n cellOf(name, dims, version) {\n const f = find(name, version);\n return { kind: familyKind(f.name, f.version), ...activeValues(f.dimensions, resolveIn(f, ownDims(f, dims))) };\n },\n *cells(name, options = {}) {\n const f = find(name, options.version);\n for (const values of sweepOf(f.dimensions, sweepLevels(f.dimensions, options, label(f), familyKind(f.name, f.version)))) yield resolveIn(f, values);\n },\n cellCount(name, options = {}) {\n const f = find(name, options.version);\n return countOf(f.dimensions, sweepLevels(f.dimensions, options, label(f), familyKind(f.name, f.version)));\n },\n boundaryCells(name, version) {\n const f = find(name, version);\n const base = resolveIn(f, {});\n const out: DimensionValues[] = [base];\n const seen = new Set([JSON.stringify(base)]);\n for (const d of f.dimensions) {\n if (d.kind !== \"int\" && d.kind !== \"real\") continue;\n const span = supportedSpan(d);\n for (const end of [span.min, span.max]) {\n if (end === undefined) continue;\n const cell = resolveIn(f, { ...activation(f.dimensions, d), [d.name]: end });\n const key = JSON.stringify(cell);\n if (!seen.has(key)) {\n seen.add(key);\n out.push(cell);\n }\n }\n }\n return out;\n },\n rngOf(name, version) {\n const f = find(name, version);\n return (seed, dims) => {\n checkSeed(seed);\n return streamOf(f, seed, resolveIn(f, ownDims(f, dims))).random;\n };\n },\n familyBy() {\n const out: Record<string, readonly string[]> = {};\n for (const f of list) out[familyKind(f.name, f.version)] = [...(f.familyBy ?? [])];\n return out;\n },\n };\n for (const f of families) registry.register(f);\n return registry;\n}\n\n/** A step of a composed family: a pure function that changes an input after its base family, as `edgeStep` does. */\nexport interface CorpusStep {\n readonly name: string;\n readonly version: number;\n /** The engine that owns the definition of the step. */\n readonly owner: string;\n readonly meaning: string;\n /** The dimensions of the step. Their names are not names of the dimensions of the base family. */\n readonly dimensions: readonly CorpusDimension[];\n /** The text of the rule that gives the random numbers of the step from the seed. */\n readonly seeding: string;\n readonly crossEngine: CrossEngine;\n /** This function gives the part of the family of the input that tells the values of the step. Without it, the family does not change. */\n readonly familyPart?: (dims: DimensionValues) => string;\n /** This function gives the changed input. It removes the old `hash` of the input. */\n apply(input: LayoutInput, seed: number, dims: DimensionValues): LayoutInput;\n}\n\n/** The options of `composeFamily`. */\nexport interface ComposeOptions {\n /** The default is the name of the base family and the names of the steps, with `+` between them. */\n readonly name?: string;\n /** The default is the owner of the base family. */\n readonly owner?: string;\n readonly meaning?: string;\n /** The hash of the composed input. The default is `documentHash` of `hash.ts`. The composed family also gives it to the registry in `hash`. */\n readonly hash?: (input: LayoutInput) => string;\n}\n\n/** This function gives the values of a list of dimensions from the full values. */\nconst pick = (dims: readonly CorpusDimension[], full: DimensionValues): DimensionValues => Object.fromEntries(dims.map((d) => [d.name, full[d.name]!]));\n\n/**\n * This function gives a family that runs the base family and then each step, with the same seed.\n * The family of the input gets the part of each step after a dot. The id becomes `<set>/<family>/s<seed>`, and the input gets the hash of `options.hash`.\n * The function throws a `RangeError` when a step has a dimension with the name of an earlier dimension.\n */\nexport function composeFamily(base: CorpusFamily<LayoutInput>, steps: readonly CorpusStep[], options: ComposeOptions = {}): CorpusFamily<LayoutInput> {\n const dimensions = [...base.dimensions, ...steps.flatMap((s) => s.dimensions)];\n const seen = new Set<string>();\n for (const d of dimensions) {\n if (seen.has(d.name)) throw new RangeError(`composeFamily: the dimension \"${d.name}\" is in the base family or in an earlier step already.`);\n seen.add(d.name);\n }\n const hash = options.hash ?? documentHash;\n const libm = base.crossEngine === \"libm-dependent\" || steps.some((s) => s.crossEngine === \"libm-dependent\");\n return Object.freeze({\n name: options.name ?? [base.name, ...steps.map((s) => s.name)].join(\"+\"),\n version: base.version,\n owner: options.owner ?? base.owner,\n meaning: options.meaning ?? `${base.meaning} Then the steps ${steps.map((s) => s.name).join(\", \")}.`,\n dimensions,\n seeding: [base.seeding, ...steps.map((s) => `${s.name}: ${s.seeding}`)].join(\" \"),\n crossEngine: libm ? \"libm-dependent\" : \"exact\",\n ...(base.rng === undefined ? {} : { rng: base.rng }),\n ...(base.rngSeed === undefined ? {} : { rngSeed: (seed: number, full: DimensionValues) => base.rngSeed!(seed, pick(base.dimensions, full)) }),\n ...(base.familyBy === undefined ? {} : { familyBy: base.familyBy }),\n ...(options.hash === undefined ? {} : { hash: options.hash }),\n generate(seed: number, full: DimensionValues, context: GenerateContext): LayoutInput {\n let input = base.generate(seed, pick(base.dimensions, full), context);\n const parts: string[] = [];\n for (const step of steps) {\n const values = pick(step.dimensions, full);\n input = step.apply(input, seed, values);\n if (step.familyPart !== undefined) parts.push(step.familyPart(values));\n }\n const family = [input.family ?? base.name, ...parts].join(\".\");\n const set = input.set ?? context.set;\n const id = `${set === undefined ? \"\" : `${set}/`}${family}/s${seed}`;\n const stepped: LayoutInput = { ...input, id, family };\n return { ...stepped, hash: hash(stepped) };\n },\n });\n}\n\n/** The dimensions of `EDGES_STEP`: the parameters of `edgeStep`, from the shared table. */\nconst EDGE_DIMENSIONS: readonly CorpusDimension[] = Object.freeze([\"edgeDensity\", \"edgeShape\", \"groups\", \"ports\", \"hubBy\"].map((n) => CORPUS_DIMENSIONS[n]!));\n\n/** This function gives the parameters of `edgeStep` from the values of the dimensions. It throws a `RangeError` for a missing or a bad value. */\nfunction edgeParams(d: DimensionValues): EdgeStepParams {\n const text = (name: string): string => {\n const dim = EDGE_DIMENSIONS.find((q) => q.name === name)!;\n const value = Object.hasOwn(d, name) ? d[name] : undefined;\n const bad = value === undefined ? \"the value is missing\" : paramProblem(dim, value);\n if (bad !== undefined || typeof value !== \"string\") throw new RangeError(`EDGES_STEP: the dimension \"${name}\" is bad: ${bad ?? \"it is not text\"}.`);\n return value;\n };\n return {\n edgeDensity: text(\"edgeDensity\") as EdgeStepParams[\"edgeDensity\"],\n edgeShape: text(\"edgeShape\") as EdgeStepParams[\"edgeShape\"],\n groups: text(\"groups\") as NonNullable<EdgeStepParams[\"groups\"]>,\n ports: text(\"ports\") as NonNullable<EdgeStepParams[\"ports\"]>,\n hubBy: text(\"hubBy\") as NonNullable<EdgeStepParams[\"hubBy\"]>,\n };\n}\n\n/**\n * The step `edges` of `edgeStep` (version 1), as a corpus step. Its family part is `e-<edgeDensity>.<edgeShape>.<groups>.<ports>`.\n * The value `random` of `hubBy` adds the part `.hub-random`.\n */\nexport const EDGES_STEP: CorpusStep = Object.freeze({\n name: \"edges\",\n version: 1,\n owner: \"layout-contract\",\n meaning: \"The edges, the groups and the ports of an input, from its topology alone.\",\n dimensions: EDGE_DIMENSIONS,\n seeding: \"stepRandom(seed, step) for the steps edges and ports.\",\n crossEngine: \"libm-dependent\",\n familyPart: (d: DimensionValues) => `e-${d[\"edgeDensity\"]}.${d[\"edgeShape\"]}.${d[\"groups\"]}.${d[\"ports\"]}${d[\"hubBy\"] === \"random\" ? \".hub-random\" : \"\"}`,\n apply: (input: LayoutInput, seed: number, d: DimensionValues) => edgeStep(input, edgeParams(d), seed),\n});\n\n/** The set of `RECT_SCATTERED` when the caller gives no set. */\nconst XCHECK_SET = \"xcheck-v1\";\n\n/**\n * The shared family `rect-scattered`, version 1: a fixed rectangle container, rectangle obstacles at random places and boxes without positions.\n * It is the one copy of the generator of `docs/FORMAT.md` of `packing`. Its input is the input of `packing`, byte for byte.\n * The steps `container`, `obstacles` and `boxes` each have a stream of `stepRandom`. Each value is a whole number, so the family is `exact`.\n */\nexport const RECT_SCATTERED: CorpusFamily<LayoutInput> = Object.freeze({\n name: \"rect-scattered\",\n version: 1,\n owner: \"layout-contract\",\n meaning: \"Rectangle obstacles at random places in a fixed rectangle container, and boxes of random sizes.\",\n dimensions: Object.freeze([sharedDimension(\"count\", { default: 40 })]),\n seeding: \"stepRandom(seed, container) gives w and h. stepRandom(seed, obstacles) gives n, then ow, oh, x and y of each obstacle. stepRandom(seed, boxes) gives bw and bh of each box.\",\n crossEngine: \"exact\",\n generate(seed: number, dims: DimensionValues, context: GenerateContext): LayoutInput {\n const count = dims[\"count\"];\n if (typeof count !== \"number\" || !Number.isInteger(count) || count < 0) throw new RangeError(`rect-scattered: the count is a whole number of 0 or more, not ${String(count)}.`);\n const set = context.set ?? XCHECK_SET;\n let r = stepRandom(seed, \"container\");\n const w = randomInt(r, 600, 1000);\n const h = randomInt(r, 400, 800);\n r = stepRandom(seed, \"obstacles\");\n const n = randomInt(r, 3, 8);\n const obstacles: Obstacle[] = [];\n for (let i = 0; i < n; i++) {\n const ow = randomInt(r, 40, 160);\n const oh = randomInt(r, 40, 160);\n const x = randomInt(r, 0, w - ow);\n const y = randomInt(r, 0, h - oh);\n obstacles.push({ id: `o${i}`, region: { kind: \"rect\", x, y, w: ow, h: oh } });\n }\n r = stepRandom(seed, \"boxes\");\n const boxes = Array.from({ length: count }, (_, i) => {\n const bw = randomInt(r, 20, 120);\n const bh = randomInt(r, 20, 80);\n return { id: `b${i}`, w: bw, h: bh };\n });\n const body: LayoutInput = {\n schema: \"layout-input/1\",\n id: `${set}/rect-scattered/s${seed}`,\n set,\n family: \"rect-scattered\",\n seed,\n source: \"made-up\",\n generator: { name: \"rect-scattered\", version: 1, params: { count }, seed },\n container: { w, h, fixed: \"size\" },\n obstacles,\n boxes,\n edges: [],\n };\n return { ...body, hash: documentHash(body) };\n },\n});\n"],"mappings":"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"}