@cruba/crubal 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +69 -2
  3. package/dist/bin/crubal.d.ts +2 -0
  4. package/dist/bin/crubal.js +37 -0
  5. package/dist/bin/crubal.js.map +1 -0
  6. package/dist/src/browser.d.ts +10 -0
  7. package/dist/src/browser.js +13 -0
  8. package/dist/src/browser.js.map +1 -0
  9. package/dist/src/canonical.d.ts +6 -0
  10. package/dist/src/canonical.js +47 -0
  11. package/dist/src/canonical.js.map +1 -0
  12. package/dist/src/conditions.d.ts +22 -0
  13. package/dist/src/conditions.js +175 -0
  14. package/dist/src/conditions.js.map +1 -0
  15. package/dist/src/corpus.d.ts +8 -0
  16. package/dist/src/corpus.js +673 -0
  17. package/dist/src/corpus.js.map +1 -0
  18. package/dist/src/defs.d.ts +116 -0
  19. package/dist/src/defs.js +530 -0
  20. package/dist/src/defs.js.map +1 -0
  21. package/dist/src/dictionary.d.ts +50 -0
  22. package/dist/src/dictionary.js +498 -0
  23. package/dist/src/dictionary.js.map +1 -0
  24. package/dist/src/exchange.d.ts +45 -0
  25. package/dist/src/exchange.js +321 -0
  26. package/dist/src/exchange.js.map +1 -0
  27. package/dist/src/index.d.ts +15 -0
  28. package/dist/src/index.js +17 -0
  29. package/dist/src/index.js.map +1 -0
  30. package/dist/src/lex.d.ts +21 -0
  31. package/dist/src/lex.js +142 -0
  32. package/dist/src/lex.js.map +1 -0
  33. package/dist/src/migrate.d.ts +88 -0
  34. package/dist/src/migrate.js +191 -0
  35. package/dist/src/migrate.js.map +1 -0
  36. package/dist/src/model.d.ts +36 -0
  37. package/dist/src/model.js +32 -0
  38. package/dist/src/model.js.map +1 -0
  39. package/dist/src/packages.d.ts +25 -0
  40. package/dist/src/packages.js +98 -0
  41. package/dist/src/packages.js.map +1 -0
  42. package/dist/src/print-text.d.ts +7 -0
  43. package/dist/src/print-text.js +194 -0
  44. package/dist/src/print-text.js.map +1 -0
  45. package/dist/src/read-text.d.ts +8 -0
  46. package/dist/src/read-text.js +317 -0
  47. package/dist/src/read-text.js.map +1 -0
  48. package/dist/src/rules.d.ts +64 -0
  49. package/dist/src/rules.js +486 -0
  50. package/dist/src/rules.js.map +1 -0
  51. package/dist/src/store.d.ts +133 -0
  52. package/dist/src/store.js +396 -0
  53. package/dist/src/store.js.map +1 -0
  54. package/dist/src/tree.d.ts +32 -0
  55. package/dist/src/tree.js +123 -0
  56. package/dist/src/tree.js.map +1 -0
  57. package/dist/src/units.d.ts +4 -0
  58. package/dist/src/units.js +37 -0
  59. package/dist/src/units.js.map +1 -0
  60. package/dist/src/views.d.ts +114 -0
  61. package/dist/src/views.js +436 -0
  62. package/dist/src/views.js.map +1 -0
  63. package/package.json +58 -4
@@ -0,0 +1,486 @@
1
+ // rules.ts: the Rules level (spec chapter 6). Rules are read from `rule:` blocks and from the facet
2
+ // shortcuts that expand to them (4.4); a rule set is checked at publish (6.8: layered, no contradictions,
3
+ // one spelling); and writes run through the rules in order (6.2, 6.4, 6.7, 6.9): refused, held, filled,
4
+ // derived, flagged, incomplete, complete and completeness.
5
+ import { evaluate, parseCondition, reads } from "./conditions.js";
6
+ import { resolve } from "./dictionary.js";
7
+ import { itemText } from "./print-text.js";
8
+ import { CrubalError, readTree } from "./tree.js";
9
+ const AGG = /^(join|sum|best|narrow|worst|deduct|replace|keep|count|least|most) of (\S+)$/;
10
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
11
+ function production(thenText, strength) {
12
+ const m = thenText.match(/^([A-Za-z_][\w:]*) is (.+)$/);
13
+ if (!m)
14
+ return undefined;
15
+ const key = m[1];
16
+ const right = m[2].trim();
17
+ if (right.startsWith('"'))
18
+ return { key, kind: "template", right };
19
+ if (AGG.test(right))
20
+ return { key, kind: "rollup", right };
21
+ if (right === "unique" || right === "_" || right === "-")
22
+ return undefined;
23
+ if (strength === "suggest")
24
+ return { key, kind: "fill", right };
25
+ return undefined;
26
+ }
27
+ function makeRule(r) {
28
+ const rule = { ...r, when: r.whenText ? parseCondition(r.whenText, r.line) : null, then: null };
29
+ rule.produces = production(r.thenText, r.strength);
30
+ if (!rule.produces || rule.produces.kind === "fill") {
31
+ rule.then = r.thenText.endsWith(" is unique") ? null : parseCondition(r.thenText, r.line);
32
+ }
33
+ return rule;
34
+ }
35
+ /** Read `rule:` blocks from definition text. */
36
+ export function readRules(source) {
37
+ const out = [];
38
+ for (const node of readTree(source)) {
39
+ if (node.kind !== "pair" || node.key !== "rule")
40
+ continue;
41
+ const get = (k) => node.children.find((c) => c.key === k);
42
+ const strength = get("strength")?.value;
43
+ if (!strength || !["must", "should", "suggest"].includes(strength)) {
44
+ throw new CrubalError(`the rule ${node.value} needs a strength: must, should or suggest`, node.line);
45
+ }
46
+ const thenNode = get("then");
47
+ if (!thenNode)
48
+ throw new CrubalError(`the rule ${node.value} needs a then`, node.line);
49
+ const because = get("because")?.value;
50
+ out.push(makeRule({
51
+ name: node.value.trim(),
52
+ line: node.line,
53
+ for: get("for")?.value ?? "everywhere",
54
+ whenText: get("when")?.value ?? "",
55
+ thenText: thenNode.value,
56
+ strength,
57
+ ...(because ? { because } : {}),
58
+ }));
59
+ }
60
+ return out;
61
+ }
62
+ /** The rules a facet's shortcut settings expand to (4.4). */
63
+ export function shortcutRules(dict) {
64
+ const out = [];
65
+ for (const f of dict.facets.values()) {
66
+ const line = f.line ?? 0;
67
+ const add = (name, thenText, strength, whenText = "") => out.push(makeRule({ name: `${f.key}: ${name}`, line, for: "everywhere", whenText, thenText, strength, shortcut: true }));
68
+ if (f.required)
69
+ add("required", `${f.key} has`, "must");
70
+ if (f.unique)
71
+ add("unique", `${f.key} is unique`, "must");
72
+ if (f.when)
73
+ add("when", `${f.key} is -`, "must", `not (${f.when})`);
74
+ if (f.length !== undefined)
75
+ add("length", `${f.key} under ${f.length + 1}`, "should", `${f.key} has`);
76
+ if (f.range)
77
+ add("range", `${f.key} in ${f.range.min}..${f.range.max}`, "should", `${f.key} has`);
78
+ if (f.combine)
79
+ add("combine", `${f.key} is ${f.combine} of parts[*].${f.key}`, "must");
80
+ }
81
+ return out;
82
+ }
83
+ // ─── Publish checks (6.8) ────────────────────────────────────────────────────
84
+ function readsOf(r) {
85
+ const keys = r.when ? reads(r.when) : [];
86
+ if (r.produces?.kind === "template") {
87
+ for (const m of r.produces.right.matchAll(/\{([^{}]+)\}/g)) {
88
+ for (const alt of m[1].split("??"))
89
+ keys.push(alt.trim().replace(/\?$/, ""));
90
+ }
91
+ }
92
+ // A rollup reads its parts' addresses (parts[*].condition), not the key it produces on the whole.
93
+ if (r.produces?.kind === "rollup")
94
+ keys.push(r.produces.right.match(AGG)?.[2] ?? "");
95
+ return keys.map((k) => k.replace(/^\w+::/, ""));
96
+ }
97
+ /** Top-level `and`-terms of a condition that pin a key to a set of values. */
98
+ function pins(e) {
99
+ const out = new Map();
100
+ const walk = (x) => {
101
+ if (x.op === "and") {
102
+ walk(x.a);
103
+ walk(x.b);
104
+ }
105
+ else if (x.op === "test" && (x.verb === "is" || x.verb === "in") && !/\.\./.test(x.arg)) {
106
+ out.set(x.path, new Set(x.arg.split(",").map((s) => s.trim().replace(/^"|"$/g, ""))));
107
+ }
108
+ };
109
+ if (e)
110
+ walk(e);
111
+ return out;
112
+ }
113
+ function disjoint(a, b) {
114
+ for (const x of a)
115
+ if (b.has(x))
116
+ return false;
117
+ return true;
118
+ }
119
+ /** Check a rule set (6.8). Throws the first problem. */
120
+ export function checkRules(rules, dict) {
121
+ const all = [...shortcutRules(dict), ...rules];
122
+ // One spelling: an explicit rule that says what a shortcut says.
123
+ for (const r of rules) {
124
+ const twin = all.find((s) => s.shortcut && s.thenText === r.thenText && s.whenText === r.whenText && s.strength === r.strength);
125
+ if (twin)
126
+ throw new CrubalError(`${r.name} says the same as ${twin.name.replace(": ", "'s ")} setting`, r.line);
127
+ }
128
+ // Layered: no cycle from what a rule reads to what it produces.
129
+ const producers = all.filter((r) => r.produces);
130
+ const edges = new Map();
131
+ for (const r of producers) {
132
+ for (const k of readsOf(r))
133
+ edges.set(k, [...(edges.get(k) ?? []), { to: r.produces?.key, rule: r }]);
134
+ }
135
+ for (const start of producers) {
136
+ const seen = new Set();
137
+ const stack = [{ key: start.produces?.key, path: [start] }];
138
+ while (stack.length) {
139
+ const { key, path } = stack.pop();
140
+ for (const e of edges.get(key) ?? []) {
141
+ if (e.rule === start) {
142
+ const names = [...new Set(path.map((p) => p.name))];
143
+ const first = [...path].sort((a, b) => a.line - b.line)[0];
144
+ throw new CrubalError(`the rules ${names.join(" and ")} depend on each other's effect`, first.line);
145
+ }
146
+ if (!seen.has(e.to)) {
147
+ seen.add(e.to);
148
+ stack.push({ key: e.to, path: [...path, e.rule] });
149
+ }
150
+ }
151
+ }
152
+ }
153
+ // No contradictions: two must rules pinning one key to disjoint values, with whens that can both hold.
154
+ const musts = all.filter((r) => r.strength === "must" && r.then && !r.produces);
155
+ for (let i = 0; i < musts.length; i++) {
156
+ for (let j = i + 1; j < musts.length; j++) {
157
+ const a = musts[i];
158
+ const b = musts[j];
159
+ if (a.for !== b.for && a.for !== "everywhere" && b.for !== "everywhere")
160
+ continue;
161
+ const pa = pins(a.then);
162
+ const pb = pins(b.then);
163
+ const wa = pins(a.when);
164
+ const wb = pins(b.when);
165
+ const whensClash = [...wa].some(([k, s]) => wb.has(k) && disjoint(s, wb.get(k)));
166
+ if (whensClash)
167
+ continue;
168
+ for (const [k, s] of pa) {
169
+ const t = pb.get(k);
170
+ if (t && disjoint(s, t)) {
171
+ const when = a.whenText && a.whenText === b.whenText ? ` when ${a.whenText.replace(/ has$/, " has a value")}` : "";
172
+ throw new CrubalError(`${a.name} and ${b.name} can't both hold${when}`, Math.min(a.line, b.line));
173
+ }
174
+ }
175
+ }
176
+ }
177
+ }
178
+ function emptyOf(v) {
179
+ return v === undefined || (isObj(v) && v.$empty === "unknown");
180
+ }
181
+ export class Engine {
182
+ dict;
183
+ rules;
184
+ store = new Map();
185
+ order = [];
186
+ constructor(dict, rules) {
187
+ this.dict = dict;
188
+ this.rules = [...shortcutRules(dict), ...rules];
189
+ }
190
+ /** The values a record reads: its own over everything above it (1.7). */
191
+ effective(rec) {
192
+ const up = rec.of ? this.store.get(rec.of)?.rec : undefined;
193
+ return { ...(up ? this.effective(up) : {}), ...rec.values };
194
+ }
195
+ applies(r, rec) {
196
+ if (r.for === "everywhere")
197
+ return true;
198
+ if (this.dict.classes.has(r.for))
199
+ return (rec.wears ?? []).some((w) => w === r.for || resolveUses(this.dict, w).includes(r.for));
200
+ if (this.dict.levels.has(r.for))
201
+ return rec.level === r.for;
202
+ return rec.kind === r.for;
203
+ }
204
+ /** Where a produced key may be stored: the top of its chain, or a level where it varies. */
205
+ storesAt(key, rec) {
206
+ return !rec.of || (this.dict.vary.get(rec.level)?.has(key) ?? false);
207
+ }
208
+ states(rec, held) {
209
+ return (path) => {
210
+ const s = new Set();
211
+ const alt = rec.alternatives?.[path];
212
+ if (alt?.length)
213
+ s.add("conflicted");
214
+ if (held.has(path))
215
+ s.add("held");
216
+ const f = this.dict.facets.get(path);
217
+ const v = rec.values[path];
218
+ if (f?.type === "choice" && typeof v === "string" && !(f.values ?? []).some((x) => x.value === v))
219
+ s.add("new");
220
+ if (rec.sources?.[path]?.adopted)
221
+ s.add("adopted");
222
+ return s;
223
+ };
224
+ }
225
+ /** A path a check tests, for reporting. */
226
+ pathOf(e) {
227
+ if (!e)
228
+ return undefined;
229
+ if (e.op === "test")
230
+ return e.path;
231
+ if (e.op === "not")
232
+ return this.pathOf(e.a);
233
+ return this.pathOf(e.a);
234
+ }
235
+ uniqueClash(r, rec) {
236
+ const key = r.thenText.replace(/ is unique$/, "");
237
+ const mine = rec.values[key];
238
+ if (emptyOf(mine) || (isObj(mine) && "$empty" in mine))
239
+ return false;
240
+ const want = JSON.stringify(mine);
241
+ for (const [id, s] of this.store)
242
+ if (id !== rec.id && JSON.stringify(s.rec.values[key]) === want)
243
+ return true;
244
+ return false;
245
+ }
246
+ /** Write a record (a create, or values merged onto one already stored). Returns its results. */
247
+ write(incoming) {
248
+ const before = this.store.get(incoming.id);
249
+ const rec = before
250
+ ? { ...before.rec, values: { ...before.rec.values, ...incoming.values }, parts: incoming.parts ?? before.rec.parts }
251
+ : { ...incoming, values: { ...incoming.values } };
252
+ const touched = new Set(Object.keys(incoming.values));
253
+ const produced = new Set(before?.produced ?? []);
254
+ const held = new Set();
255
+ const results = [];
256
+ // 1. Must checks against the write: refuse what the write broke; hold what a changed verdict broke.
257
+ for (const r of this.rules) {
258
+ if (r.strength !== "must" || r.produces || !this.applies(r, rec))
259
+ continue;
260
+ const vals = this.effective(rec);
261
+ if (r.when && evaluate(r.when, vals, this.states(rec, held)) !== true)
262
+ continue;
263
+ if (r.thenText.endsWith(" is unique")) {
264
+ const key = r.thenText.replace(/ is unique$/, "");
265
+ if (this.uniqueClash(r, rec)) {
266
+ if (touched.has(key))
267
+ return [{ record: rec.id, result: "refused", address: key, rule: r.name }];
268
+ held.add(key);
269
+ results.push({ record: rec.id, result: "held", address: key, rule: r.name });
270
+ }
271
+ continue;
272
+ }
273
+ const path = this.pathOf(r.then);
274
+ if (emptyOf(vals[path]))
275
+ continue; // an empty value is incompleteness, reported below
276
+ if (r.then && evaluate(r.then, vals, this.states(rec, held)) === false) {
277
+ if (touched.has(path))
278
+ return [{ record: rec.id, result: "refused", address: path, rule: r.name }];
279
+ held.add(path);
280
+ results.push({ record: rec.id, result: "held", address: path, rule: r.name });
281
+ }
282
+ }
283
+ const visible = () => {
284
+ const v = this.effective(rec);
285
+ for (const h of held)
286
+ delete v[h];
287
+ return v;
288
+ };
289
+ // 2a. A gate that fails produces "does not apply" when the value is empty (chapter 1.5).
290
+ for (const r of this.rules) {
291
+ if (r.strength !== "must" || !this.applies(r, rec))
292
+ continue;
293
+ const gate = r.thenText.match(/^([A-Za-z_][\w:]*) is -$/);
294
+ if (!gate)
295
+ continue;
296
+ const key = gate[1];
297
+ if (held.has(key) || rec.values[key] !== undefined || !this.storesAt(key, rec))
298
+ continue;
299
+ if (r.when && evaluate(r.when, visible(), this.states(rec, held)) !== true)
300
+ continue;
301
+ rec.values[key] = { $empty: "n/a" };
302
+ produced.add(key);
303
+ results.push({ record: rec.id, result: "filled", address: key, value: { $empty: "n/a" }, rule: r.name });
304
+ }
305
+ // 2. Productions, in layer order (a rule's inputs before its output).
306
+ for (const r of this.layered()) {
307
+ if (!r.produces || !this.applies(r, rec))
308
+ continue;
309
+ const { key, kind, right } = r.produces;
310
+ if (!this.storesAt(key, rec))
311
+ continue;
312
+ const vals = visible();
313
+ if (r.when && evaluate(r.when, vals, this.states(rec, held)) !== true)
314
+ continue;
315
+ const current = rec.values[key];
316
+ const mine = produced.has(key);
317
+ if (kind === "fill") {
318
+ if (!emptyOf(current))
319
+ continue;
320
+ const f = this.dict.facets.get(key);
321
+ const v = f?.type === "choice" || !f ? right.replace(/^"|"$/g, "") : right;
322
+ rec.values[key] = v;
323
+ produced.add(key);
324
+ results.push({ record: rec.id, result: "filled", address: key, value: v, rule: r.name });
325
+ continue;
326
+ }
327
+ if (!emptyOf(current) && !mine)
328
+ continue; // a person's value: adopted, not overwritten
329
+ const v = kind === "template" ? this.template(right, vals) : this.rollup(right, rec);
330
+ if (v === undefined)
331
+ continue;
332
+ rec.values[key] = v;
333
+ produced.add(key);
334
+ results.push({ record: rec.id, result: "derived", address: key, value: v, rule: r.name });
335
+ }
336
+ // 3. Results: incomplete, flagged, complete, completeness.
337
+ let complete = held.size === 0;
338
+ const vals = visible();
339
+ for (const r of this.rules) {
340
+ if (r.produces || !this.applies(r, rec))
341
+ continue;
342
+ if (r.when && evaluate(r.when, vals, this.states(rec, held)) !== true)
343
+ continue;
344
+ if (r.thenText.endsWith(" is unique"))
345
+ continue;
346
+ const truth = r.then ? evaluate(r.then, vals, this.states(rec, held)) : true;
347
+ const path = this.pathOf(r.then);
348
+ const needsValue = path !== undefined && emptyOf(vals[path]);
349
+ if (r.strength === "must" && (truth === "undetermined" || (truth === false && needsValue))) {
350
+ complete = false;
351
+ results.push({ record: rec.id, result: "incomplete", rule: r.name, ...(path ? { address: path } : {}) });
352
+ }
353
+ else if (r.strength === "should" && truth !== true) {
354
+ results.push({ record: rec.id, result: "flagged", rule: r.name, ...(path ? { address: path } : {}) });
355
+ }
356
+ }
357
+ if (complete)
358
+ results.unshift({ record: rec.id, result: "complete" });
359
+ results.push(...this.completeness(rec));
360
+ this.store.set(rec.id, { rec, produced, held });
361
+ if (!this.order.includes(rec.id))
362
+ this.order.push(rec.id);
363
+ return results;
364
+ }
365
+ layered() {
366
+ const prods = this.rules.filter((r) => r.produces);
367
+ const out = [];
368
+ const placed = new Set();
369
+ while (out.length < prods.length) {
370
+ const before = out.length;
371
+ for (const r of prods) {
372
+ if (placed.has(r))
373
+ continue;
374
+ const needs = readsOf(r);
375
+ const blocked = prods.some((p) => !placed.has(p) && p !== r && needs.includes(p.produces?.key));
376
+ if (!blocked) {
377
+ out.push(r);
378
+ placed.add(r);
379
+ }
380
+ }
381
+ if (out.length === before)
382
+ return [...out, ...prods.filter((p) => !placed.has(p))];
383
+ }
384
+ return out;
385
+ }
386
+ /** A value's plain text in a template: the value itself, never quoted, without detail. */
387
+ text(key, v) {
388
+ const c = isObj(v) && "$value" in v ? v.$value : v;
389
+ if (typeof c === "string")
390
+ return c;
391
+ const f = this.dict.facets.get(key);
392
+ return f ? itemText(f, c) : JSON.stringify(c);
393
+ }
394
+ /** A template (6.4.1): `{a}`, `{a ?? b}`, `{a?}`, `{{`, `}}`. Nothing when a needed value is empty. */
395
+ template(right, vals) {
396
+ const src = JSON.parse(right);
397
+ let out = "";
398
+ for (let i = 0; i < src.length; i++) {
399
+ const ch = src[i];
400
+ if (src.startsWith("{{", i) || src.startsWith("}}", i)) {
401
+ out += ch;
402
+ i++;
403
+ continue;
404
+ }
405
+ if (ch !== "{") {
406
+ out += ch;
407
+ continue;
408
+ }
409
+ const end = src.indexOf("}", i);
410
+ const inner = src.slice(i + 1, end).trim();
411
+ i = end;
412
+ const optional = inner.endsWith("?") && !inner.includes("??");
413
+ const alts = (optional ? inner.slice(0, -1) : inner).split("??").map((s) => s.trim());
414
+ const found = alts.find((a) => !emptyOf(vals[a]) && !(isObj(vals[a]) && "$empty" in vals[a]));
415
+ if (found === undefined) {
416
+ if (!optional)
417
+ return undefined;
418
+ out = out.replace(/[\s·,:-]+$/, "");
419
+ continue;
420
+ }
421
+ out += this.text(found, vals[found]);
422
+ }
423
+ return out;
424
+ }
425
+ /** A rollup over parts: `worst of parts[*].condition`. */
426
+ rollup(right, rec) {
427
+ const m = right.match(AGG);
428
+ if (!m)
429
+ return undefined;
430
+ const how = m[1];
431
+ const key = m[2].replace(/^parts\[\*\]\./, "");
432
+ const items = (rec.parts ?? [])
433
+ .map((p) => (isObj(p) && isObj(p.values) ? p.values[key] : undefined))
434
+ .filter((v) => v !== undefined && !(isObj(v) && "$empty" in v));
435
+ if (how === "count")
436
+ return String(items.length);
437
+ if (!items.length)
438
+ return undefined;
439
+ const f = this.dict.facets.get(key);
440
+ if ((how === "worst" || how === "best") && f?.values) {
441
+ const rank = (v) => (f.values ?? []).findIndex((x) => x.value === v);
442
+ const sorted = [...items].sort((a, b) => rank(a) - rank(b));
443
+ return (how === "best" ? sorted[0] : sorted.at(-1));
444
+ }
445
+ const nums = items.map((v) => Number(isObj(v) ? (v.$qty ?? v.$money) : v));
446
+ if (how === "sum")
447
+ return String(nums.reduce((a, b) => a + b, 0));
448
+ if (how === "least" || how === "worst")
449
+ return String(Math.min(...nums));
450
+ if (how === "most" || how === "best")
451
+ return String(Math.max(...nums));
452
+ if (how === "join")
453
+ return items;
454
+ return items.at(-1);
455
+ }
456
+ /** Completeness (6.9): asked facets with a value ÷ asked facets, per record and per part. */
457
+ completeness(rec) {
458
+ const out = [];
459
+ const measure = (worn, values) => {
460
+ const asked = resolve(this.dict, worn.filter((w) => this.dict.classes.has(w))).filter((l) => !l.when || evaluate(parseCondition(l.when), values) === true);
461
+ if (!asked.length)
462
+ return null;
463
+ const had = asked.filter((l) => !emptyOf(values[l.facet])).length;
464
+ return String(Number((had / asked.length).toFixed(4)));
465
+ };
466
+ const own = measure(rec.wears ?? [], this.effective(rec));
467
+ if (own !== null)
468
+ out.push({ record: rec.id, result: "completeness", value: own });
469
+ for (const p of rec.parts ?? []) {
470
+ if (!isObj(p))
471
+ continue;
472
+ const v = measure(Array.isArray(p.wears) ? p.wears.map(String) : [], isObj(p.values) ? p.values : {});
473
+ if (v !== null)
474
+ out.push({ record: rec.id, address: `parts[${p.$row}]`, result: "completeness", value: v });
475
+ }
476
+ return out;
477
+ }
478
+ }
479
+ function resolveUses(dict, name, seen = new Set()) {
480
+ if (seen.has(name))
481
+ return [];
482
+ seen.add(name);
483
+ const c = dict.classes.get(name);
484
+ return c ? c.uses.flatMap((u) => [u, ...resolveUses(dict, u, seen)]) : [];
485
+ }
486
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/rules.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,0GAA0G;AAC1G,wGAAwG;AACxG,2DAA2D;AAE3D,OAAO,EAAa,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAgB,MAAM,iBAAiB,CAAC;AAE3F,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAoBlD,MAAM,GAAG,GAAG,8EAA8E,CAAC;AAC3F,MAAM,KAAK,GAAG,CAAC,CAAmB,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEjH,SAAS,UAAU,CAAC,QAAgB,EAAE,QAAkB;IACtD,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACxD,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAW,CAAC;IAC3B,MAAM,KAAK,GAAI,CAAC,CAAC,CAAC,CAAY,CAAC,IAAI,EAAE,CAAC;IACtC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACnE,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC3D,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3E,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ,CAAC,CAA2C;IAC3D,MAAM,IAAI,GAAS,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACtG,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,MAAM,GAAG,GAAW,EAAE,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM;YAAE,SAAS;QAC1D,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,EAAE,KAA6B,CAAC;QAChE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,WAAW,CAAC,YAAY,IAAI,CAAC,KAAK,4CAA4C,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACvG,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,WAAW,CAAC,YAAY,IAAI,CAAC,KAAK,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACvF,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;QACtC,GAAG,CAAC,IAAI,CACN,QAAQ,CAAC;YACP,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,YAAY;YACtC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE;YAClC,QAAQ,EAAE,QAAQ,CAAC,KAAK;YACxB,QAAQ;YACR,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC5C,MAAM,GAAG,GAAW,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,QAAkB,EAAE,QAAQ,GAAG,EAAE,EAAE,EAAE,CAChF,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3H,IAAI,CAAC,CAAC,QAAQ;YAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,CAAC,MAAM;YAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,CAAC,IAAI;YAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;YAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QACtG,IAAI,CAAC,CAAC,KAAK;YAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAClG,IAAI,CAAC,CAAC,OAAO;YAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,OAAO,gBAAgB,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAEhF,SAAS,OAAO,CAAC,CAAO;IACtB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzC,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAC3D,KAAK,MAAM,GAAG,IAAK,CAAC,CAAC,CAAC,CAAY,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IACD,kGAAkG;IAClG,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI,KAAK,QAAQ;QAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACrF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,8EAA8E;AAC9E,SAAS,IAAI,CAAC,CAAc;IAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC3C,MAAM,IAAI,GAAG,CAAC,CAAO,EAAE,EAAE;QACvB,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACV,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC;aAAM,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1F,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC;QAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,QAAQ,CAAC,CAAc,EAAE,CAAc;IAC9C,KAAK,MAAM,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,IAAgB;IACxD,MAAM,GAAG,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;IAC/C,iEAAiE;IACjE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChI,IAAI,IAAI;YAAE,MAAM,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,qBAAqB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAClH,CAAC;IACD,gEAAgE;IAChE,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwC,CAAC;IAC9D,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAClH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,KAAK,GAAoC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAa,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvG,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,EAAmC,CAAC;YACnE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBACrB,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACpD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAS,CAAC;oBACnE,MAAM,IAAI,WAAW,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gCAAgC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACtG,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;oBACpB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACf,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,uGAAuG;IACvG,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAChF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAS,CAAC;YAC3B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAS,CAAC;YAC3B,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,YAAY,IAAI,CAAC,CAAC,GAAG,KAAK,YAAY;gBAAE,SAAS;YAClF,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAgB,CAAC,CAAC,CAAC;YAChG,IAAI,UAAU;gBAAE,SAAS;YACzB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACxB,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnH,MAAM,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,mBAAmB,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACpG,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAQD,SAAS,OAAO,CAAC,CAAmB;IAClC,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,OAAO,MAAM;IACR,IAAI,CAAa;IACjB,KAAK,CAAS;IACf,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClC,KAAK,GAAa,EAAE,CAAC;IAE7B,YAAY,IAAgB,EAAE,KAAa;QACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,yEAAyE;IACzE,SAAS,CAAC,GAAW;QACnB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5D,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;IAC9D,CAAC;IAEO,OAAO,CAAC,CAAO,EAAE,GAAW;QAClC,IAAI,CAAC,CAAC,GAAG,KAAK,YAAY;YAAE,OAAO,IAAI,CAAC;QACxC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC;QAC5D,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC;IAC5B,CAAC;IAED,4FAA4F;IACpF,QAAQ,CAAC,GAAW,EAAE,GAAW;QACvC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC;IACvE,CAAC;IAEO,MAAM,CAAC,GAAW,EAAE,IAAiB;QAC3C,OAAO,CAAC,IAAI,EAAE,EAAE;YACd,MAAM,CAAC,GAAG,IAAI,GAAG,EAAU,CAAC;YAC5B,MAAM,GAAG,GAAI,GAA6D,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;YAChG,IAAI,GAAG,EAAE,MAAM;gBAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,EAAE,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;gBAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChH,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO;gBAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACnD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC;IACJ,CAAC;IAED,2CAA2C;IACnC,MAAM,CAAC,CAAc;QAC3B,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACzB,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAEO,WAAW,CAAC,CAAO,EAAE,GAAW;QACtC,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,IAAI,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;QAC/G,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gGAAgG;IAChG,KAAK,CAAC,QAAgB;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAW,MAAM;YACxB,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;YACpH,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,oGAAoG;QACpG,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC;gBAAE,SAAS;YAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI;gBAAE,SAAS;YAChF,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACtC,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBAClD,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;oBAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;wBAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBACjG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACd,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC/E,CAAC;gBACD,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAW,CAAC;YAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAAE,SAAS,CAAC,mDAAmD;YACtF,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;gBACvE,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACnG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,GAAe,EAAE;YAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,IAAI;gBAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC;QAEF,yFAAyF;QACzF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC;gBAAE,SAAS;YAC7D,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC1D,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;YAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;gBAAE,SAAS;YACzF,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI;gBAAE,SAAS;YACrF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YACpC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3G,CAAC;QAED,sEAAsE;QACtE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/B,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC;gBAAE,SAAS;YACnD,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;gBAAE,SAAS;YACvC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI;gBAAE,SAAS;YAChF,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;oBAAE,SAAS;gBAChC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACpC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC3E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACpB,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzF,SAAS;YACX,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI;gBAAE,SAAS,CAAC,6CAA6C;YACvF,MAAM,CAAC,GAAG,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACrF,IAAI,CAAC,KAAK,SAAS;gBAAE,SAAS;YAC9B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,2DAA2D;QAC3D,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC;gBAAE,SAAS;YAClD,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI;gBAAE,SAAS;YAChF,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAAE,SAAS;YAChD,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,UAAU,GAAG,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,cAAc,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC;gBAC3F,QAAQ,GAAG,KAAK,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3G,CAAC;iBAAM,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACrD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACxG,CAAC;QACH,CAAC;QACD,IAAI,QAAQ;YAAE,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QAExC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,OAAO;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,GAAG,GAAW,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAQ,CAAC;QAC/B,OAAO,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAC1B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;oBAAE,SAAS;gBAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACzB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAa,CAAC,CAAC,CAAC;gBAC1G,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACZ,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,0FAA0F;IAClF,IAAI,CAAC,GAAW,EAAE,CAAO;QAC/B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,MAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,uGAAuG;IACvG,QAAQ,CAAC,KAAa,EAAE,IAAgB;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAW,CAAC;QACxC,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAW,CAAC;YAC5B,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACvD,GAAG,IAAI,EAAE,CAAC;gBACV,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACf,GAAG,IAAI,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YACD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAChC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,CAAC,GAAG,GAAG,CAAC;YACR,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACtF,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAK,IAAI,CAAC,CAAC,CAAgB,CAAC,CAAC,CAAC;YAC9G,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ;oBAAE,OAAO,SAAS,CAAC;gBAChC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBACpC,SAAS;YACX,CAAC;YACD,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAS,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,0DAA0D;IAC1D,MAAM,CAAC,KAAa,EAAE,GAAW;QAC/B,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAW,CAAC;QAC3B,MAAM,GAAG,GAAI,CAAC,CAAC,CAAC,CAAY,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;aAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;aACrE,MAAM,CAAC,CAAC,CAAC,EAAa,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7E,IAAI,GAAG,KAAK,OAAO;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;YAC3E,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAS,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,IAAI,GAAG,KAAK,KAAK;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACzE,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACvE,IAAI,GAAG,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QACjC,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,6FAA6F;IAC7F,YAAY,CAAC,GAAW;QACtB,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,CAAC,IAAc,EAAE,MAAkB,EAAiB,EAAE;YACpE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CACnF,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,CACpE,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAClE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC;QACF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,IAAI,GAAG,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACnF,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAAE,SAAS;YACxB,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtG,IAAI,CAAC,KAAK,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9G,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAED,SAAS,WAAW,CAAC,IAAgB,EAAE,IAAY,EAAE,OAAO,IAAI,GAAG,EAAU;IAC3E,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACf,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,133 @@
1
+ import { type ClassLine, type Dictionary } from "./defs.ts";
2
+ import type { Json, JsonObject, Record, Source } from "./model.ts";
3
+ export declare function sha256(text: string): string;
4
+ /** An entry's hash: SHA-256 of its canonical form without `sig`; a redacted entry's hash is what it carries. */
5
+ export declare function entryHash(entry: JsonObject): string;
6
+ /** Published keys by owner domain: `{ "test.example": { "alg": "Ed25519", "public": "<base64url>" } }`. */
7
+ export type Keys = {
8
+ [owner: string]: {
9
+ alg: string;
10
+ public: string;
11
+ };
12
+ };
13
+ /** Does `sig` (base64url) verify over the entry's hash bytes with the owner's Ed25519 key? */
14
+ export declare function verifySig(entry: JsonObject, owner: string, keys: Keys): boolean;
15
+ /** Check a chain's links, and, when the owner's key is known, every entry's signature (8.5). */
16
+ export declare function verifyChain(entries: JsonObject[], keys?: Keys): {
17
+ valid: boolean;
18
+ "breaks-at"?: string;
19
+ reason?: string;
20
+ };
21
+ export type MapLine = {
22
+ from: string;
23
+ to: string;
24
+ values: [string, string][];
25
+ line: number;
26
+ valueLines: number[];
27
+ };
28
+ export type Contract = {
29
+ name: string;
30
+ kind: string;
31
+ origin: string;
32
+ prefix?: string;
33
+ reads: MapLine[];
34
+ writes: MapLine[];
35
+ ignore: string[];
36
+ keepRaw: string[];
37
+ absorb: boolean;
38
+ lands: string;
39
+ line: number;
40
+ /** needs: an unnamed class (7.2) */
41
+ needs: ClassLine[];
42
+ gives: string[];
43
+ who?: string;
44
+ when?: string;
45
+ from?: string;
46
+ to?: string;
47
+ mode?: string;
48
+ undo?: string;
49
+ /** Every part as written, with its line, for the publish checks. */
50
+ parts: {
51
+ [k: string]: string;
52
+ };
53
+ partLines: {
54
+ [k: string]: number;
55
+ };
56
+ };
57
+ /** Read `contract:` blocks. */
58
+ export declare function readContracts(source: string): Contract[];
59
+ /** Split a field path into names: `aspects."Run Time"` → ["aspects", "Run Time"]. */
60
+ export declare function fieldPath(path: string): string[];
61
+ export type IntakeOutcome = {
62
+ from: string;
63
+ to?: string;
64
+ outcome: string;
65
+ value?: Json;
66
+ cites?: JsonObject;
67
+ };
68
+ export type IntakeRecord = {
69
+ intake: string;
70
+ contract: string;
71
+ for: string;
72
+ received?: string;
73
+ raw: {
74
+ type: string;
75
+ sha256: string;
76
+ body: string;
77
+ };
78
+ outcomes: IntakeOutcome[];
79
+ };
80
+ /** Keep a payload's exact bytes (3.8): as text when they are valid UTF-8, otherwise as base64. */
81
+ export declare function rawOf(bytes: Uint8Array, type: string): {
82
+ type: string;
83
+ sha256: string;
84
+ body?: string;
85
+ base64?: string;
86
+ };
87
+ /** Replay an intake record from its kept bytes under the current contract (9.6); earlier outcomes stay. */
88
+ export declare function replay(intake: IntakeRecord & {
89
+ replays?: JsonObject[];
90
+ }, c: Contract, dict: Dictionary): IntakeRecord & {
91
+ replays: JsonObject[];
92
+ };
93
+ /** Review by key across every intake record (9.5), and candidate facets proposed by recurrence. */
94
+ export declare function reviewByKey(intakes: {
95
+ for: string;
96
+ outcomes: IntakeOutcome[];
97
+ }[], recur?: number): {
98
+ "by-key": JsonObject[];
99
+ proposals: JsonObject[];
100
+ };
101
+ /** Receive a raw payload through a contract: every field gets exactly one outcome. The bytes are kept. */
102
+ export declare function receive(c: Contract, body: string, forRecord: string, dict: Dictionary, intakeId?: string): IntakeRecord;
103
+ /** Who a source is, for the trust order (11.3): a person, a contract, a party's domain, and its origin. */
104
+ export type Who = {
105
+ source: Source;
106
+ person?: boolean;
107
+ contract?: string;
108
+ };
109
+ /**
110
+ * Land an intake record's outcomes on a record. Absorbed and conflicting values go through the trust
111
+ * order: the winner is current, the loser is kept as an alternative. Equal values are agreement.
112
+ */
113
+ export declare function land(r: Record, intake: {
114
+ outcomes: IntakeOutcome[];
115
+ contract?: string;
116
+ }, source: Source, trust?: string[], facetTrust?: Map<string, string[]>): Record;
117
+ export type PartMatch = {
118
+ parts: JsonObject[];
119
+ review: JsonObject[];
120
+ };
121
+ /** Bind incoming parts to existing ones: by the slot's match child, else review, else a new row. */
122
+ export declare function matchParts(r: Record, incoming: {
123
+ slot: string;
124
+ [k: string]: Json;
125
+ }[], dict: Dictionary): PartMatch;
126
+ export type Observation = JsonObject & {
127
+ obs: string;
128
+ on: string;
129
+ address: string;
130
+ supports: string;
131
+ };
132
+ /** Validate a value from observations: independent witnesses for and against, vetoes, and the state. */
133
+ export declare function validate(r: Record, address: string, observations: Observation[], confirmAt?: number, splitAt?: number): JsonObject;