simple-graph-query 2.8.1 → 3.0.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.
@@ -48438,6 +48438,7 @@ module.exports = function whichTypedArray(value) {
48438
48438
  Object.defineProperty(exports, "__esModule", ({ value: true }));
48439
48439
  exports.NameNotFoundError = exports.ForgeExprEvaluator = exports.SUPPORTED_BUILTINS = void 0;
48440
48440
  exports.areTupleArraysEqual = areTupleArraysEqual;
48441
+ exports.unquoteStringLiteral = unquoteStringLiteral;
48441
48442
  const AbstractParseTreeVisitor_1 = __webpack_require__(/*! antlr4ts/tree/AbstractParseTreeVisitor */ "./node_modules/antlr4ts/tree/AbstractParseTreeVisitor.js");
48442
48443
  const utils_1 = __webpack_require__(/*! ./forge-antlr/utils */ "./src/forge-antlr/utils.ts");
48443
48444
  const lodash_1 = __webpack_require__(/*! lodash */ "./node_modules/lodash/lodash.js");
@@ -48475,17 +48476,72 @@ function extractNumber(val) {
48475
48476
  function isString(value) {
48476
48477
  return typeof value === "string";
48477
48478
  }
48478
- // Helper to create a string key from a tuple for fast lookup
48479
+ // Helper to create a string key from a tuple for fast lookup.
48480
+ //
48481
+ // The key is JSON.stringify because it is type-preserving: the atom 1 and the
48482
+ // atom "1" must not collide (buildRelationCache coerces numeric-looking atoms
48483
+ // to numbers). Measurement also showed V8's stringify outruns hand-rolled
48484
+ // delimiter keys, so there is nothing to gain from a custom key function.
48479
48485
  function tupleToKey(tuple) {
48480
48486
  return JSON.stringify(tuple);
48481
48487
  }
48488
+ // Canonical-key side-channel: relationKeys maps a RELATION VALUE (an outer
48489
+ // Tuple[] array) to its tuples' canonical keys, index-aligned. Keys are
48490
+ // computed at most once per relation value; set operations (union,
48491
+ // intersection, difference, dedup, subset) then reuse them instead of
48492
+ // re-serializing every tuple on every operation.
48493
+ //
48494
+ // This is keyed on the outer array -- NOT per tuple -- deliberately:
48495
+ // * Relation values are immutable-after-creation in this evaluator (every
48496
+ // operator returns a fresh array; nothing splices/pushes into a result it
48497
+ // has handed out), so an array's keys can never go stale.
48498
+ // * Live entries number in the dozens (base relations + recent
48499
+ // intermediates), so GC ephemeron processing stays trivially cheap. A
48500
+ // per-TUPLE WeakMap memo was measured to be catastrophically slower
48501
+ // (100k+ high-churn entries make major GCs ~10x more expensive).
48502
+ // * The WeakMap drops entries automatically when intermediate results die,
48503
+ // so this adds no leak, and nothing user-visible is attached to tuples.
48504
+ const relationKeys = new WeakMap();
48505
+ // Only relation values at least this large get registered in relationKeys.
48506
+ // Tiny relations (e.g. the singleton sets compared thousands of times inside
48507
+ // quantifier loops) are cheaper to re-serialize than to churn through
48508
+ // WeakMap.set; the side-channel exists to amortize keying of BULK relations.
48509
+ const KEY_REGISTER_MIN = 16;
48510
+ // Get the canonical keys for a relation value, computing (and, for bulk
48511
+ // relations, registering) them on first use. First use costs one stringify
48512
+ // per tuple (exactly what a single set operation used to cost); every later
48513
+ // operation on the same registered relation value gets its keys for free.
48514
+ function ensureKeys(tuples) {
48515
+ let keys = relationKeys.get(tuples);
48516
+ if (keys === undefined) {
48517
+ keys = tuples.map((t) => JSON.stringify(t));
48518
+ if (tuples.length >= KEY_REGISTER_MIN) {
48519
+ relationKeys.set(tuples, keys);
48520
+ }
48521
+ }
48522
+ return keys;
48523
+ }
48482
48524
  function areTuplesEqual(a, b) {
48483
48525
  return a.length === b.length && a.every((val, i) => val === b[i]);
48484
48526
  }
48485
48527
  function isTupleArraySubset(a, b) {
48528
+ // Tiny operands (e.g. the singleton comparisons quantifier loops make
48529
+ // thousands of times) can never be registered in relationKeys, so the key
48530
+ // side-channel is pure overhead for them -- compare directly, with the
48531
+ // short-circuit the direct path allows.
48532
+ if (a.length < KEY_REGISTER_MIN && b.length < KEY_REGISTER_MIN) {
48533
+ const bSet = new Set(b.map(tupleToKey));
48534
+ return a.every((tupleA) => bSet.has(tupleToKey(tupleA)));
48535
+ }
48486
48536
  // Optimize using Set for O(n) lookup instead of O(n²)
48487
- const bSet = new Set(b.map(tupleToKey));
48488
- return a.every((tupleA) => bSet.has(tupleToKey(tupleA)));
48537
+ const bSet = new Set(ensureKeys(b));
48538
+ const aKeys = ensureKeys(a);
48539
+ for (let i = 0; i < a.length; i++) {
48540
+ if (!bSet.has(aKeys[i])) {
48541
+ return false;
48542
+ }
48543
+ }
48544
+ return true;
48489
48545
  }
48490
48546
  function areTupleArraysEqual(a, b) {
48491
48547
  if (a.length !== b.length) {
@@ -48493,19 +48549,38 @@ function areTupleArraysEqual(a, b) {
48493
48549
  }
48494
48550
  return isTupleArraySubset(a, b) && isTupleArraySubset(b, a);
48495
48551
  }
48496
- function deduplicateTuples(tuples) {
48497
- // Optimize using Set for O(n) deduplication instead of O(n²)
48552
+ // Deduplicate the concatenation of several tuple arrays (set semantics),
48553
+ // reusing each part's registered keys when available and registering the
48554
+ // result's keys so downstream operations get them for free.
48555
+ function deduplicateConcat(parts) {
48498
48556
  const seen = new Set();
48499
48557
  const result = [];
48500
- for (const tuple of tuples) {
48501
- const key = tupleToKey(tuple);
48502
- if (!seen.has(key)) {
48503
- seen.add(key);
48504
- result.push(tuple);
48505
- }
48558
+ const resultKeys = [];
48559
+ for (const part of parts) {
48560
+ // Bulk parts go through ensureKeys so their keys are REGISTERED, not just
48561
+ // consumed -- otherwise a relation reaching dedup via union would be
48562
+ // re-serialized on every union until some other op registered it.
48563
+ // Arrays below KEY_REGISTER_MIN are never registered, so skip the WeakMap
48564
+ // machinery for them entirely -- this helper is called once per join
48565
+ // inside quantifier loops, where even the probe is measurable overhead.
48566
+ const partKeys = part.length >= KEY_REGISTER_MIN ? ensureKeys(part) : undefined;
48567
+ for (let i = 0; i < part.length; i++) {
48568
+ const key = partKeys !== undefined ? partKeys[i] : JSON.stringify(part[i]);
48569
+ if (!seen.has(key)) {
48570
+ seen.add(key);
48571
+ result.push(part[i]);
48572
+ resultKeys.push(key);
48573
+ }
48574
+ }
48575
+ }
48576
+ if (result.length >= KEY_REGISTER_MIN) {
48577
+ relationKeys.set(result, resultKeys);
48506
48578
  }
48507
48579
  return result;
48508
48580
  }
48581
+ function deduplicateTuples(tuples) {
48582
+ return deduplicateConcat([tuples]);
48583
+ }
48509
48584
  function getCombinations(arrays) {
48510
48585
  // first, turn each string[][] into a string[] by flattening
48511
48586
  const valueSets = arrays.map((tuple) => tuple.flat());
@@ -48545,10 +48620,11 @@ function transitiveClosure(pairs) {
48545
48620
  graph.get(from).add(to);
48546
48621
  }
48547
48622
  // Use more efficient BFS with index-based queue to avoid O(n) shift() operations
48548
- // NOTE: we use Set<string> instead of Set<[SingleValue, SingleValue]> since
48549
- // TS would compute equality over the object's reference instead of the value
48550
- // when the value is an array
48551
- const transitiveClosureSet = new Set();
48623
+ // NOTE: no dedup set is needed here -- within one `start`, the `visited`
48624
+ // check guarantees each `current` is emitted at most once, and pairs from
48625
+ // different starts differ in their first element. So we can emit real
48626
+ // tuples directly instead of round-tripping through JSON.stringify/parse.
48627
+ const result = [];
48552
48628
  for (const start of graph.keys()) {
48553
48629
  const visited = new Set();
48554
48630
  const queue = [...(graph.get(start) ?? [])];
@@ -48558,7 +48634,7 @@ function transitiveClosure(pairs) {
48558
48634
  if (visited.has(current))
48559
48635
  continue;
48560
48636
  visited.add(current);
48561
- transitiveClosureSet.add(JSON.stringify([start, current]));
48637
+ result.push([start, current]);
48562
48638
  const neighbors = graph.get(current);
48563
48639
  if (neighbors) {
48564
48640
  for (const neighbor of neighbors) {
@@ -48569,8 +48645,7 @@ function transitiveClosure(pairs) {
48569
48645
  }
48570
48646
  }
48571
48647
  }
48572
- // convert the result back to a Tuple[] and return
48573
- return Array.from(transitiveClosureSet).map((pair) => JSON.parse(pair));
48648
+ return result;
48574
48649
  }
48575
48650
  function bitwidthWraparound(value, bitwidth) {
48576
48651
  const modulus = Math.pow(2, bitwidth); // total number of Int values
@@ -48593,6 +48668,74 @@ const SUPPORTED_BINARY_BUILTINS = ["add", "subtract", "multiply", "divide", "rem
48593
48668
  const SUPPORTED_UNARY_BUILTINS = ["abs", "sign", "floor", "ceil"];
48594
48669
  const SUPPORTED_SET_BUILTINS = ["min", "max"];
48595
48670
  exports.SUPPORTED_BUILTINS = SUPPORTED_BINARY_BUILTINS.concat(SUPPORTED_UNARY_BUILTINS, SUPPORTED_SET_BUILTINS);
48671
+ /**
48672
+ * Levenshtein distance, abandoned early once it provably exceeds `limit`.
48673
+ * Returns `limit + 1` in that case, which callers treat as "too far".
48674
+ */
48675
+ function editDistance(a, b, limit) {
48676
+ if (Math.abs(a.length - b.length) > limit) {
48677
+ return limit + 1;
48678
+ }
48679
+ let previous = Array.from({ length: b.length + 1 }, (_, i) => i);
48680
+ for (let i = 1; i <= a.length; i++) {
48681
+ const current = [i];
48682
+ let rowMin = i;
48683
+ for (let j = 1; j <= b.length; j++) {
48684
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
48685
+ const value = Math.min(previous[j] + 1, // deletion
48686
+ current[j - 1] + 1, // insertion
48687
+ previous[j - 1] + cost // substitution
48688
+ );
48689
+ current.push(value);
48690
+ rowMin = Math.min(rowMin, value);
48691
+ }
48692
+ if (rowMin > limit) {
48693
+ return limit + 1; // no completion of this row can come back under the limit
48694
+ }
48695
+ previous = current;
48696
+ }
48697
+ return previous[b.length];
48698
+ }
48699
+ /**
48700
+ * Strip the surrounding double quotes from a STRING_TOK and resolve its escape
48701
+ * sequences. The lexer rule is `'"' (~["\\] | '\\' .)* '"'`, so a backslash
48702
+ * always consumes exactly one following character.
48703
+ */
48704
+ function unquoteStringLiteral(text) {
48705
+ const body = text.slice(1, -1);
48706
+ // Overwhelmingly the common case, and the only one worth optimizing: with no
48707
+ // backslash there is nothing to resolve, so skip the scan entirely.
48708
+ if (body.indexOf("\\") === -1) {
48709
+ return body;
48710
+ }
48711
+ let out = "";
48712
+ for (let i = 0; i < body.length; i++) {
48713
+ if (body[i] !== "\\") {
48714
+ out += body[i];
48715
+ continue;
48716
+ }
48717
+ const escaped = body[++i];
48718
+ switch (escaped) {
48719
+ case "n":
48720
+ out += "\n";
48721
+ break;
48722
+ case "t":
48723
+ out += "\t";
48724
+ break;
48725
+ case "r":
48726
+ out += "\r";
48727
+ break;
48728
+ case "0":
48729
+ out += "\0";
48730
+ break;
48731
+ // `\"`, `\\`, and anything else stand for the character itself.
48732
+ default:
48733
+ out += escaped;
48734
+ break;
48735
+ }
48736
+ }
48737
+ return out;
48738
+ }
48596
48739
  /**
48597
48740
  * A recursive evaluator for Forge expressions.
48598
48741
  * This visitor walks the parse tree and prints the type of operation encountered.
@@ -48608,11 +48751,77 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
48608
48751
  // Index for relations: Map<relationName, Map<firstElement, Tuple[]>>
48609
48752
  // This allows O(1) lookup for patterns like atom.field
48610
48753
  this.relationIndexCache = null;
48754
+ // Diagnostics accumulated during the current evaluation, keyed by name so a
48755
+ // name referenced many times (e.g. inside a comprehension body) reports once.
48756
+ this.diagnostics = new Map();
48611
48757
  this.instanceData = datum;
48612
48758
  this.environmentStack = [];
48613
48759
  this.freeVariableFinder = new ForgeExprFreeVariableFinder_1.ForgeExprFreeVariableFinder(datum);
48614
48760
  this.freeVariables = new Map();
48615
48761
  }
48762
+ /** Diagnostics recorded since the last `resetDiagnostics()`. */
48763
+ getDiagnostics() {
48764
+ return Array.from(this.diagnostics.values());
48765
+ }
48766
+ /** Clear diagnostics. Callers that reuse an evaluator must call this per evaluation. */
48767
+ resetDiagnostics() {
48768
+ this.diagnostics.clear();
48769
+ }
48770
+ /**
48771
+ * Record a name that could not be resolved against this instance.
48772
+ *
48773
+ * This is deliberately a warning rather than an error. The instance format
48774
+ * carries only populated types and relations, so a sig with no atoms in this
48775
+ * instance is indistinguishable from a typo — and a sig can empty out between
48776
+ * frames of the same trace. Failing hard would break working selectors at
48777
+ * exactly the frames where a set happens to be empty.
48778
+ */
48779
+ reportUnresolvedName(name) {
48780
+ if (this.diagnostics.has(name)) {
48781
+ return;
48782
+ }
48783
+ const suggestion = this.suggestName(name);
48784
+ this.diagnostics.set(name, {
48785
+ kind: "unresolved-name",
48786
+ severity: "warning",
48787
+ name,
48788
+ message: `'${name}' does not name a type, relation, or atom in this instance; ` +
48789
+ `it evaluates to the empty set.` +
48790
+ (suggestion ? ` Did you mean '${suggestion}'?` : "") +
48791
+ ` If you meant the string "${name}", write it in double quotes.`,
48792
+ ...(suggestion !== undefined ? { suggestion } : {}),
48793
+ });
48794
+ }
48795
+ /** Closest name in this instance within a small edit distance, if any. */
48796
+ suggestName(name) {
48797
+ this.buildRelationCache();
48798
+ const candidates = new Set();
48799
+ for (const t of this.instanceData.getTypes()) {
48800
+ candidates.add(t.id);
48801
+ }
48802
+ for (const relationName of this.relationCache.keys()) {
48803
+ candidates.add(relationName);
48804
+ }
48805
+ for (const atom of this.instanceData.getAtoms()) {
48806
+ candidates.add(atom.id);
48807
+ }
48808
+ // Allow one edit for short names, two for longer ones. Without this bound
48809
+ // every unresolved name would get a nonsense suggestion.
48810
+ const maxDistance = name.length <= 4 ? 1 : 2;
48811
+ let best;
48812
+ let bestDistance = maxDistance + 1;
48813
+ for (const candidate of candidates) {
48814
+ if (Math.abs(candidate.length - name.length) >= bestDistance) {
48815
+ continue; // length alone rules it out
48816
+ }
48817
+ const distance = editDistance(name, candidate, bestDistance);
48818
+ if (distance < bestDistance) {
48819
+ bestDistance = distance;
48820
+ best = candidate;
48821
+ }
48822
+ }
48823
+ return best;
48824
+ }
48616
48825
  // helper function to build relation cache and indexes
48617
48826
  buildRelationCache() {
48618
48827
  if (this.relationCache !== null) {
@@ -48622,10 +48831,18 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
48622
48831
  this.relationIndexCache = new Map();
48623
48832
  const relations = this.instanceData.getRelations();
48624
48833
  for (const relation of relations) {
48625
- let relationAtoms = relation.tuples.map((tuple) => tuple.atoms);
48626
- // Convert numeric and boolean strings to their actual types
48627
- relationAtoms = relationAtoms.map((tuple) => tuple.map((value) => this.isConvertibleToNumber(value) ? Number(value) : value));
48628
- relationAtoms = relationAtoms.map((tuple) => tuple.map((value) => this.isConvertibleToBoolean(value) ? this.convertToBoolean(value) : value));
48834
+ // Convert numeric and boolean strings to their actual types, in a
48835
+ // single pass (one fresh tuple array per tuple, not one per coercion).
48836
+ // Numeric-vs-boolean order matches the old two-pass behavior: the two
48837
+ // predicates are disjoint (Number("true") is NaN), so checking numeric
48838
+ // first is equivalent.
48839
+ const relationAtoms = relation.tuples.map((tuple) => tuple.atoms.map((value) => {
48840
+ if (this.isConvertibleToNumber(value))
48841
+ return Number(value);
48842
+ if (this.isConvertibleToBoolean(value))
48843
+ return this.convertToBoolean(value);
48844
+ return value;
48845
+ }));
48629
48846
  // Relation NAMES are not unique — only the qualified id (`Sig<:label`) is.
48630
48847
  // e.g. `open util/ordering[A]` and `open util/ordering[B]` both expose a field
48631
48848
  // named `Next` (`A/Ord<:Next` and `B/Ord<:Next`). A bare-name reference must
@@ -48694,8 +48911,8 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
48694
48911
  return atom.label !== undefined ? atom.label : atom.id;
48695
48912
  }
48696
48913
  }
48697
- // Fallback: return the value itself
48698
- console.error(`No atom found for value: ${value}`);
48914
+ // Not an atom id. This is the normal case for a string literal — the label
48915
+ // of `"Black"` is just `Black` so it is not worth reporting.
48699
48916
  return value;
48700
48917
  }
48701
48918
  // helper function to get the label as string (used for @: and @str: operators)
@@ -48818,11 +49035,16 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
48818
49035
  return deduplicateTuples(result);
48819
49036
  }
48820
49037
  // helper function
48821
- cacheResult(ctx, freeVarsKey, result) {
49038
+ cacheResult(ctx, freeVarsKey, result, diagnosticsBefore) {
48822
49039
  if (!this.cachedResults.has(ctx)) {
48823
49040
  this.cachedResults.set(ctx, new Map());
48824
49041
  }
48825
- this.cachedResults.get(ctx).set(freeVarsKey, result);
49042
+ // Diagnostics raised while evaluating this subtree are cached with the
49043
+ // result. Without this, evaluating the same expression twice would report
49044
+ // an unresolved name only the first time, because the second call is a
49045
+ // cache hit and never reaches visitName.
49046
+ const diagnostics = Array.from(this.diagnostics.values()).filter((d) => !diagnosticsBefore.has(d.name));
49047
+ this.cachedResults.get(ctx).set(freeVarsKey, { result, diagnostics });
48826
49048
  }
48827
49049
  // helper function
48828
49050
  getIden() {
@@ -48945,11 +49167,20 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
48945
49167
  const freeVarsKey = this.constructFreeVariableKey(freeVarValues);
48946
49168
  // check in the cache
48947
49169
  if (foundAllVars && this.cachedResults.has(ctx)) {
48948
- if (this.cachedResults.get(ctx).has(freeVarsKey)) {
48949
- // cache hit!
48950
- return this.cachedResults.get(ctx).get(freeVarsKey);
49170
+ const cached = this.cachedResults.get(ctx).get(freeVarsKey);
49171
+ if (cached !== undefined) {
49172
+ // cache hit! Replay the diagnostics this subtree produced, so a repeat
49173
+ // evaluation reports the same warnings as the first one.
49174
+ for (const diagnostic of cached.diagnostics) {
49175
+ if (!this.diagnostics.has(diagnostic.name)) {
49176
+ this.diagnostics.set(diagnostic.name, diagnostic);
49177
+ }
49178
+ }
49179
+ return cached.result;
48951
49180
  }
48952
49181
  }
49182
+ // Snapshot so we can attribute newly-raised diagnostics to this subtree.
49183
+ const diagnosticsBefore = new Set(this.diagnostics.keys());
48953
49184
  // cache miss! compute results and store the result in the cache before
48954
49185
  // returning. Store the result only for this context node (not for the
48955
49186
  // children) to manage the cache size
@@ -49024,13 +49255,22 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49024
49255
  total += bodyNumber;
49025
49256
  }
49026
49257
  this.environmentStack.pop();
49027
- this.cacheResult(ctx, freeVarsKey, total);
49258
+ this.cacheResult(ctx, freeVarsKey, total, diagnosticsBefore);
49028
49259
  return total;
49029
49260
  }
49030
- // Try to optimize numeric comparisons
49261
+ // Try to optimize numeric comparisons.
49262
+ //
49263
+ // The optimizer generates ONLY the bindings that satisfy the comparison
49264
+ // and marks each as true (skipping body evaluation). That is sound for
49265
+ // quantifiers whose result depends on the *satisfying* bindings --
49266
+ // `some`/`no`/`one`/`two`/`lone` (which count them) -- but NOT for `all`,
49267
+ // whose result depends on the existence of a *falsifying* binding. If we
49268
+ // discard the falsifying bindings, `all` never sees a counterexample and
49269
+ // returns `!foundFalse === true` unconditionally. So exclude `all`.
49031
49270
  let product;
49032
49271
  let useOptimizedPath = false;
49033
- if (!isDisjoint && varNames.length >= 2 && (0, NumericConstraintOptimizer_1.areAllNumericSets)(quantifiedSets)) {
49272
+ const isAllQuantifier = ctx.quant().ALL_TOK() !== undefined;
49273
+ if (!isDisjoint && !isAllQuantifier && varNames.length >= 2 && (0, NumericConstraintOptimizer_1.areAllNumericSets)(quantifiedSets)) {
49034
49274
  // Try to detect and optimize numeric comparison patterns
49035
49275
  const pattern = (0, NumericConstraintOptimizer_1.detectNumericComparisonPattern)(barExpr, varNames);
49036
49276
  if (pattern && pattern.type !== 'none') {
@@ -49102,13 +49342,13 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49102
49342
  if (ctx.quant().ALL_TOK() && foundFalse) {
49103
49343
  this.environmentStack.pop();
49104
49344
  const value = false;
49105
- this.cacheResult(ctx, freeVarsKey, value);
49345
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49106
49346
  return value;
49107
49347
  }
49108
49348
  if (ctx.quant().NO_TOK() && foundTrue) {
49109
49349
  this.environmentStack.pop();
49110
49350
  const value = false;
49111
- this.cacheResult(ctx, freeVarsKey, value);
49351
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49112
49352
  return value;
49113
49353
  }
49114
49354
  if (ctx.quant().mult()) {
@@ -49116,25 +49356,25 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49116
49356
  if (multExpr.LONE_TOK() && result.length > 1) {
49117
49357
  this.environmentStack.pop();
49118
49358
  const value = false;
49119
- this.cacheResult(ctx, freeVarsKey, value);
49359
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49120
49360
  return value;
49121
49361
  }
49122
49362
  if (multExpr.SOME_TOK() && foundTrue) {
49123
49363
  this.environmentStack.pop();
49124
49364
  const value = true;
49125
- this.cacheResult(ctx, freeVarsKey, value);
49365
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49126
49366
  return value;
49127
49367
  }
49128
49368
  if (multExpr.ONE_TOK() && result.length > 1) {
49129
49369
  this.environmentStack.pop();
49130
49370
  const value = false;
49131
- this.cacheResult(ctx, freeVarsKey, value);
49371
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49132
49372
  return value;
49133
49373
  }
49134
49374
  if (multExpr.TWO_TOK() && result.length > 2) {
49135
49375
  this.environmentStack.pop();
49136
49376
  const value = false;
49137
- this.cacheResult(ctx, freeVarsKey, value);
49377
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49138
49378
  return value;
49139
49379
  }
49140
49380
  }
@@ -49142,34 +49382,34 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49142
49382
  this.environmentStack.pop();
49143
49383
  if (ctx.quant().ALL_TOK()) {
49144
49384
  const value = !foundFalse;
49145
- this.cacheResult(ctx, freeVarsKey, value);
49385
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49146
49386
  return value;
49147
49387
  }
49148
49388
  else if (ctx.quant().NO_TOK()) {
49149
49389
  const value = !foundTrue;
49150
- this.cacheResult(ctx, freeVarsKey, value);
49390
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49151
49391
  return value;
49152
49392
  }
49153
49393
  else if (ctx.quant().mult()) {
49154
49394
  const multExpr = ctx.quant().mult();
49155
49395
  if (multExpr.LONE_TOK()) {
49156
49396
  const value = result.length <= 1;
49157
- this.cacheResult(ctx, freeVarsKey, value);
49397
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49158
49398
  return value;
49159
49399
  }
49160
49400
  else if (multExpr.SOME_TOK()) {
49161
49401
  const value = foundTrue;
49162
- this.cacheResult(ctx, freeVarsKey, value);
49402
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49163
49403
  return value;
49164
49404
  }
49165
49405
  else if (multExpr.ONE_TOK()) {
49166
49406
  const value = result.length === 1;
49167
- this.cacheResult(ctx, freeVarsKey, value);
49407
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49168
49408
  return value;
49169
49409
  }
49170
49410
  else if (multExpr.TWO_TOK()) {
49171
49411
  const value = result.length === 2;
49172
- this.cacheResult(ctx, freeVarsKey, value);
49412
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49173
49413
  return value;
49174
49414
  }
49175
49415
  }
@@ -49181,7 +49421,7 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49181
49421
  //console.log('childrenResults in expr:', childrenResults);
49182
49422
  if (results === undefined) {
49183
49423
  //console.log('returning childrenResults in expr:', childrenResults);
49184
- this.cacheResult(ctx, freeVarsKey, childrenResults);
49424
+ this.cacheResult(ctx, freeVarsKey, childrenResults, diagnosticsBefore);
49185
49425
  return childrenResults;
49186
49426
  }
49187
49427
  if (isSingleValue(results)) {
@@ -49194,7 +49434,7 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49194
49434
  results = results.concat(childrenResults);
49195
49435
  }
49196
49436
  //console.log('results being returned in expr:', results);
49197
- this.cacheResult(ctx, freeVarsKey, results);
49437
+ this.cacheResult(ctx, freeVarsKey, results, diagnosticsBefore);
49198
49438
  return results;
49199
49439
  }
49200
49440
  visitExpr1(ctx) {
@@ -49502,25 +49742,21 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49502
49742
  break;
49503
49743
  case "in":
49504
49744
  case "ni": {
49505
- let membershipResult;
49506
- // this should be true if the left value is equal to the right value,
49507
- // or a subset of it
49508
- if (isTupleArray(leftChildValue) && isTupleArray(rightChildValue)) {
49509
- if (areTupleArraysEqual(leftChildValue, rightChildValue)) {
49510
- membershipResult = true;
49511
- }
49512
- else {
49513
- // check if left is subset of right
49514
- membershipResult = isTupleArraySubset(leftChildValue, rightChildValue);
49515
- }
49516
- }
49517
- else if (isTupleArray(rightChildValue)) {
49518
- membershipResult = rightChildValue.some((tuple) => tuple.length === 1 && tuple[0] === leftChildValue);
49519
- }
49520
- else {
49521
- // left is a tuple array but right is a single value, so false
49522
- membershipResult = false;
49523
- }
49745
+ // In Alloy/Forge everything is a relation, and a scalar is just a
49746
+ // singleton set. Lift any scalar operand to a singleton tuple so `in`
49747
+ // is uniformly subset:
49748
+ // a in b ({a} {b}) -> equality when both are scalars
49749
+ // a in {..} ({a} ⊆ set) -> membership
49750
+ // {..} in b (set ⊆ {b}) -> subset of a singleton
49751
+ // isTupleArraySubset already returns true for equal sets and for an
49752
+ // empty left-hand set, so a single subset check covers every case.
49753
+ const leftSet = isSingleValue(leftChildValue)
49754
+ ? [[leftChildValue]]
49755
+ : leftChildValue;
49756
+ const rightSet = isSingleValue(rightChildValue)
49757
+ ? [[rightChildValue]]
49758
+ : rightChildValue;
49759
+ const membershipResult = isTupleArraySubset(leftSet, rightSet);
49524
49760
  results = ctx.compareOp()?.text === "ni" ? !membershipResult : membershipResult;
49525
49761
  break;
49526
49762
  }
@@ -49550,20 +49786,34 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49550
49786
  if (ctx.SET_TOK()) {
49551
49787
  return childrenResults;
49552
49788
  }
49553
- if (ctx.ONE_TOK()) {
49554
- return isTupleArray(childrenResults) && childrenResults.length === 1;
49555
- }
49556
- if (ctx.TWO_TOK()) {
49557
- return isTupleArray(childrenResults) && childrenResults.length === 2;
49558
- }
49559
- if (ctx.NO_TOK()) {
49560
- return isTupleArray(childrenResults) && childrenResults.length === 0;
49561
- }
49562
- if (ctx.SOME_TOK()) {
49563
- return isTupleArray(childrenResults) && childrenResults.length > 0;
49564
- }
49565
- if (ctx.LONE_TOK()) {
49566
- return isTupleArray(childrenResults) && childrenResults.length <= 1;
49789
+ // For the multiplicity checks, a bare scalar (atom or int) is a singleton
49790
+ // set of size 1. A boolean is not a set, so it gets size -1 and every
49791
+ // multiplicity below is false (matching the previous behavior).
49792
+ if (ctx.ONE_TOK() ||
49793
+ ctx.TWO_TOK() ||
49794
+ ctx.NO_TOK() ||
49795
+ ctx.SOME_TOK() ||
49796
+ ctx.LONE_TOK()) {
49797
+ const setSize = isTupleArray(childrenResults)
49798
+ ? childrenResults.length
49799
+ : isString(childrenResults) || isNumber(childrenResults)
49800
+ ? 1
49801
+ : -1;
49802
+ if (ctx.ONE_TOK()) {
49803
+ return setSize === 1;
49804
+ }
49805
+ if (ctx.TWO_TOK()) {
49806
+ return setSize === 2;
49807
+ }
49808
+ if (ctx.NO_TOK()) {
49809
+ return setSize === 0;
49810
+ }
49811
+ if (ctx.SOME_TOK()) {
49812
+ return setSize > 0;
49813
+ }
49814
+ if (ctx.LONE_TOK()) {
49815
+ return setSize === 0 || setSize === 1;
49816
+ }
49567
49817
  }
49568
49818
  return childrenResults;
49569
49819
  }
@@ -49574,6 +49824,10 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49574
49824
  const rightChildValue = this.visit(ctx.expr10());
49575
49825
  // should only work if arities are the same
49576
49826
  if (isSingleValue(leftChildValue) && isSingleValue(rightChildValue)) {
49827
+ // Union has set semantics: two equal scalars collapse to one element.
49828
+ if (leftChildValue === rightChildValue) {
49829
+ return [[leftChildValue]];
49830
+ }
49577
49831
  return [[leftChildValue], [rightChildValue]];
49578
49832
  }
49579
49833
  else if (isSingleValue(leftChildValue) && isTupleArray(rightChildValue)) {
@@ -49581,7 +49835,7 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49581
49835
  return leftChildValue;
49582
49836
  }
49583
49837
  if (rightChildValue[0].length === 1) {
49584
- return deduplicateTuples([[leftChildValue], ...rightChildValue]);
49838
+ return deduplicateConcat([[[leftChildValue]], rightChildValue]);
49585
49839
  }
49586
49840
  throw new Error("arity mismatch in set union!");
49587
49841
  }
@@ -49590,7 +49844,7 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49590
49844
  return rightChildValue;
49591
49845
  }
49592
49846
  if (leftChildValue[0].length === 1) {
49593
- return deduplicateTuples([...leftChildValue, [rightChildValue]]);
49847
+ return deduplicateConcat([leftChildValue, [[rightChildValue]]]);
49594
49848
  }
49595
49849
  throw new Error("arity mismatch in set union!");
49596
49850
  }
@@ -49605,7 +49859,7 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49605
49859
  return leftChildValue;
49606
49860
  }
49607
49861
  if (leftChildValue[0].length === rightChildValue[0].length) {
49608
- return deduplicateTuples([...leftChildValue, ...rightChildValue]);
49862
+ return deduplicateConcat([leftChildValue, rightChildValue]);
49609
49863
  }
49610
49864
  }
49611
49865
  else {
@@ -49651,9 +49905,22 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49651
49905
  return leftChildValue;
49652
49906
  }
49653
49907
  if (leftChildValue[0].length === rightChildValue[0].length) {
49654
- // Optimize set difference using Set for O(n+m) instead of O(n*m)
49655
- const rightSet = new Set(rightChildValue.map(tupleToKey));
49656
- return leftChildValue.filter(tuple => !rightSet.has(tupleToKey(tuple)));
49908
+ // Optimize set difference using Set for O(n+m) instead of O(n*m),
49909
+ // reusing canonical keys instead of re-serializing each side.
49910
+ const rightSet = new Set(ensureKeys(rightChildValue));
49911
+ const leftKeys = ensureKeys(leftChildValue);
49912
+ const result = [];
49913
+ const resultKeys = [];
49914
+ for (let i = 0; i < leftChildValue.length; i++) {
49915
+ if (!rightSet.has(leftKeys[i])) {
49916
+ result.push(leftChildValue[i]);
49917
+ resultKeys.push(leftKeys[i]);
49918
+ }
49919
+ }
49920
+ if (result.length >= KEY_REGISTER_MIN) {
49921
+ relationKeys.set(result, resultKeys);
49922
+ }
49923
+ return result;
49657
49924
  }
49658
49925
  }
49659
49926
  else {
@@ -49667,10 +49934,15 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49667
49934
  const childrenResults = this.visitChildren(ctx);
49668
49935
  //console.log('childrenResults in expr9:', childrenResults);
49669
49936
  if (ctx.CARD_TOK()) {
49670
- if (!isTupleArray(childrenResults)) {
49671
- throw new Error("The cardinal operator must be applied to a set of tuples!");
49937
+ if (isTupleArray(childrenResults)) {
49938
+ return childrenResults.length;
49939
+ }
49940
+ // A scalar atom or int is a singleton set (cardinality 1). Booleans are
49941
+ // formulas, not sets, so they remain an error.
49942
+ if (isString(childrenResults) || isNumber(childrenResults)) {
49943
+ return 1;
49672
49944
  }
49673
- return childrenResults.length;
49945
+ throw new Error("The cardinal operator must be applied to a set of tuples!");
49674
49946
  }
49675
49947
  return childrenResults;
49676
49948
  }
@@ -49726,9 +49998,22 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49726
49998
  return [];
49727
49999
  }
49728
50000
  if (leftChildValue[0].length === rightChildValue[0].length) {
49729
- // Optimize set intersection using Set for O(n+m) instead of O(n*m)
49730
- const rightSet = new Set(rightChildValue.map(tupleToKey));
49731
- return leftChildValue.filter(tuple => rightSet.has(tupleToKey(tuple)));
50001
+ // Optimize set intersection using Set for O(n+m) instead of O(n*m),
50002
+ // reusing canonical keys instead of re-serializing each side.
50003
+ const rightSet = new Set(ensureKeys(rightChildValue));
50004
+ const leftKeys = ensureKeys(leftChildValue);
50005
+ const result = [];
50006
+ const resultKeys = [];
50007
+ for (let i = 0; i < leftChildValue.length; i++) {
50008
+ if (rightSet.has(leftKeys[i])) {
50009
+ result.push(leftChildValue[i]);
50010
+ resultKeys.push(leftKeys[i]);
50011
+ }
50012
+ }
50013
+ if (result.length >= KEY_REGISTER_MIN) {
50014
+ relationKeys.set(result, resultKeys);
50015
+ }
50016
+ return result;
49732
50017
  }
49733
50018
  }
49734
50019
  else {
@@ -49889,63 +50174,36 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49889
50174
  else {
49890
50175
  throw new Error("Unknown label operator");
49891
50176
  }
49892
- try {
49893
- const innerResult = this.visit(innerExpr);
49894
- // Special case: if result is empty array, it means unknown identifier, so use the text
49895
- if (isTupleArray(innerResult) && innerResult.length === 0) {
49896
- // For unknown identifiers, try to convert the text directly
49897
- let text = innerExpr.text;
49898
- // Remove parentheses if present
49899
- if (text.startsWith('(') && text.endsWith(')')) {
49900
- text = text.slice(1, -1);
49901
- }
49902
- try {
49903
- return convertFunction(text);
49904
- }
49905
- catch (error) {
49906
- // If conversion fails, fall back to string for unknown identifiers
49907
- return text;
49908
- }
49909
- }
49910
- if (isSingleValue(innerResult)) {
49911
- return convertFunction(innerResult);
49912
- }
49913
- else if (isTupleArray(innerResult)) {
49914
- // For single-element tuple arrays, return the converted label of the element
49915
- if (innerResult.length === 1 && innerResult[0].length === 1) {
49916
- return convertFunction(innerResult[0][0]);
49917
- }
49918
- // For multi-element cases, apply conversion to each tuple element
49919
- return innerResult.map((tuple) => tuple.map((value) => convertFunction(value)));
49920
- }
49921
- throw new Error(`${operatorName} operator can only be applied to single values or tuple arrays`);
49922
- }
49923
- catch (error) {
49924
- // If evaluation fails due to unknown identifier, use the text as the label
49925
- if (error instanceof NameNotFoundError) {
49926
- // Extract the identifier from the inner expression
49927
- let identifierText = innerExpr.text;
49928
- if (identifierText.startsWith('(') && identifierText.endsWith(')')) {
49929
- identifierText = identifierText.slice(1, -1);
49930
- }
49931
- try {
49932
- return convertFunction(identifierText);
49933
- }
49934
- catch (conversionError) {
49935
- // If conversion fails, fall back to string for unknown identifiers
49936
- return identifierText;
49937
- }
50177
+ const innerResult = this.visit(innerExpr);
50178
+ if (isSingleValue(innerResult)) {
50179
+ return convertFunction(innerResult);
50180
+ }
50181
+ else if (isTupleArray(innerResult)) {
50182
+ // For single-element tuple arrays, return the converted label of the element
50183
+ if (innerResult.length === 1 && innerResult[0].length === 1) {
50184
+ return convertFunction(innerResult[0][0]);
49938
50185
  }
49939
- throw error;
50186
+ // Otherwise convert elementwise. An empty operand yields an empty
50187
+ // result — the operand evaluated fine, it just denotes nothing.
50188
+ return innerResult.map((tuple) => tuple.map((value) => convertFunction(value)));
49940
50189
  }
50190
+ throw new Error(`${operatorName} operator can only be applied to single values or tuple arrays`);
49941
50191
  }
49942
50192
  const childrenResults = this.visitChildren(ctx);
49943
50193
  //console.log('visitChildren result for', ctx.text, ':', childrenResults);
49944
50194
  if (ctx.TILDE_TOK()) {
49945
50195
  // this flips the order of the elements in the tuples of a relation if
49946
50196
  // the relation has arity 2
49947
- if (isTupleArray(childrenResults) && childrenResults.length > 0 && childrenResults[0].length === 2) {
49948
- return childrenResults.map((tuple) => [tuple[1], tuple[0]]);
50197
+ if (isTupleArray(childrenResults)) {
50198
+ // The transpose of the empty relation is the empty relation. Guarding
50199
+ // only on `length > 0` made `~<empty>` throw (e.g. `~(left - left)`),
50200
+ // even though `^`/`*` handle the empty relation fine.
50201
+ if (childrenResults.length === 0) {
50202
+ return [];
50203
+ }
50204
+ if (childrenResults[0].length === 2) {
50205
+ return childrenResults.map((tuple) => [tuple[1], tuple[0]]);
50206
+ }
49949
50207
  }
49950
50208
  throw new Error("expected the expression provided to ~ to have arity 2; bad arity received!");
49951
50209
  }
@@ -49959,15 +50217,9 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49959
50217
  if (isTupleArray(childrenResults)) {
49960
50218
  const transitiveClosureResult = transitiveClosure(childrenResults);
49961
50219
  const idenResult = this.getIden();
49962
- // Optimize: Use Set for efficient deduplication instead of deduplicateTuples
49963
- const resultSet = new Set();
49964
- for (const tuple of idenResult) {
49965
- resultSet.add(tupleToKey(tuple));
49966
- }
49967
- for (const tuple of transitiveClosureResult) {
49968
- resultSet.add(tupleToKey(tuple));
49969
- }
49970
- return Array.from(resultSet).map(key => JSON.parse(key));
50220
+ // Dedup while preserving the original tuple objects (and their
50221
+ // memoized keys) -- avoids re-materializing every tuple via JSON.parse.
50222
+ return deduplicateTuples(idenResult.concat(transitiveClosureResult));
49971
50223
  }
49972
50224
  }
49973
50225
  return childrenResults;
@@ -50041,6 +50293,14 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
50041
50293
  // }
50042
50294
  return value;
50043
50295
  }
50296
+ // Handle none (the empty relation). Without this, `none` falls through to
50297
+ // the string-literal branch below and evaluates to the string "none",
50298
+ // which then pollutes every set operation it touches (e.g.
50299
+ // `S + none` gains a spurious `["none"]` element and `#none` throws).
50300
+ // The static analyzer already treats `none` as the empty set.
50301
+ if (constant.NONE_TOK() !== undefined) {
50302
+ return [];
50303
+ }
50044
50304
  // Handle iden (identity relation)
50045
50305
  if (constant.IDEN_TOK() !== undefined) {
50046
50306
  // The identity relation contains tuples (x, x) for every atom x in the universe
@@ -50077,6 +50337,12 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
50077
50337
  }
50078
50338
  return univRelation;
50079
50339
  }
50340
+ // A double-quoted string literal. This is the ONLY way to write a string,
50341
+ // so `"Black"` is a string regardless of whether the instance happens to
50342
+ // contain a sig or atom named Black.
50343
+ if (constant.STRING_TOK() !== undefined) {
50344
+ return unquoteStringLiteral(constant.STRING_TOK().text);
50345
+ }
50080
50346
  // Handle boolean constants
50081
50347
  if (constant.text === 'true') {
50082
50348
  return true;
@@ -50323,15 +50589,15 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
50323
50589
  if (exports.SUPPORTED_BUILTINS.includes(identifier)) {
50324
50590
  return identifier;
50325
50591
  }
50326
- // Check if this looks like a label identifier (for label comparison).
50327
- // Labels can be any alphanumeric string with underscores.
50328
- // This allows identifiers like "Black", "red", "my_label", "Color_123", etc.
50329
- // to be treated as string literals in label comparisons (e.g., @:y = Black).
50330
- const labelLikePattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
50331
- if (labelLikePattern.test(identifier)) {
50332
- return identifier;
50333
- }
50334
- throw new NameNotFoundError(`bad name ${identifier} referenced!`);
50592
+ // Nothing in this instance answers to this name. Report it and evaluate to
50593
+ // the empty relation rather than throwing: a selector is authored against a
50594
+ // model but run against instances that vary, and a sig that is empty in this
50595
+ // instance is absent from the instance data entirely. See
50596
+ // `reportUnresolvedName`.
50597
+ //
50598
+ // Note this is NOT how string literals are written — use `"..."`.
50599
+ this.reportUnresolvedName(identifier);
50600
+ return [];
50335
50601
  }
50336
50602
  visitQualName(ctx) {
50337
50603
  // NOTE: this currently only supports Int; doesn't support other branches
@@ -50872,6 +51138,7 @@ exports.ForgeExprStaticAnalyzer = void 0;
50872
51138
  const AbstractParseTreeVisitor_1 = __webpack_require__(/*! antlr4ts/tree/AbstractParseTreeVisitor */ "./node_modules/antlr4ts/tree/AbstractParseTreeVisitor.js");
50873
51139
  const ForgeParser_1 = __webpack_require__(/*! ./forge-antlr/ForgeParser */ "./src/forge-antlr/ForgeParser.ts");
50874
51140
  const utils_1 = __webpack_require__(/*! ./forge-antlr/utils */ "./src/forge-antlr/utils.ts");
51141
+ const ForgeExprEvaluator_1 = __webpack_require__(/*! ./ForgeExprEvaluator */ "./src/ForgeExprEvaluator.ts");
50875
51142
  const UNKNOWN = { kind: "unknown" };
50876
51143
  // Helper that wraps the schema with O(1) lookups and lattice queries.
50877
51144
  class SchemaInfo {
@@ -51004,9 +51271,28 @@ function negationOperandText(ctx) {
51004
51271
  class ForgeExprStaticAnalyzer extends AbstractParseTreeVisitor_1.AbstractParseTreeVisitor {
51005
51272
  constructor(schema) {
51006
51273
  super();
51274
+ // Variables bound by enclosing quantifiers / comprehensions. Consulted only
51275
+ // for unresolved-name reporting, so a binder variable is not mistaken for a
51276
+ // missing schema entity.
51277
+ this.boundScopes = [];
51278
+ // Names that resolve to nothing in the schema, in first-seen order.
51279
+ this.unresolved = new Set();
51007
51280
  if (schema)
51008
51281
  this.schema = new SchemaInfo(schema);
51009
51282
  }
51283
+ isBound(name) {
51284
+ return this.boundScopes.some((scope) => scope.has(name));
51285
+ }
51286
+ /** Run `body` with `names` treated as bound. */
51287
+ withBoundScope(names, body) {
51288
+ this.boundScopes.push(names);
51289
+ try {
51290
+ return body();
51291
+ }
51292
+ finally {
51293
+ this.boundScopes.pop();
51294
+ }
51295
+ }
51010
51296
  // Walk a nameList (`a, b, c`) and accumulate identifiers into `out`.
51011
51297
  collectNamesFromList(ctx, out) {
51012
51298
  out.add((0, utils_1.getIdentifierName)(ctx.name()));
@@ -51040,19 +51326,28 @@ class ForgeExprStaticAnalyzer extends AbstractParseTreeVisitor_1.AbstractParseTr
51040
51326
  }
51041
51327
  // Public entry: convert internal lattice value to a verdict + reason.
51042
51328
  analyze(ctx) {
51329
+ this.unresolved.clear();
51330
+ this.boundScopes.length = 0;
51043
51331
  const v = this.visit(ctx);
51332
+ // Collected separately from the fold, which short-circuits. See
51333
+ // `collectUnresolvedNames`.
51334
+ this.boundScopes.length = 0;
51335
+ this.collectUnresolvedNames(ctx);
51336
+ const names = this.unresolved.size > 0
51337
+ ? { unresolvedNames: Array.from(this.unresolved) }
51338
+ : {};
51044
51339
  if (v.kind === "bool") {
51045
51340
  return v.value
51046
- ? { status: "tautology", reason: "expression folds to literal true" }
51047
- : { status: "unsat", reason: "expression folds to literal false" };
51341
+ ? { status: "tautology", reason: "expression folds to literal true", ...names }
51342
+ : { status: "unsat", reason: "expression folds to literal false", ...names };
51048
51343
  }
51049
51344
  if (v.kind === "empty") {
51050
- return { status: "empty", reason: "expression is provably the empty set" };
51345
+ return { status: "empty", reason: "expression is provably the empty set", ...names };
51051
51346
  }
51052
51347
  if (v.kind === "ill-typed") {
51053
- return { status: "ill-typed", reason: v.reason };
51348
+ return { status: "ill-typed", reason: v.reason, ...names };
51054
51349
  }
51055
- return { status: "unknown" };
51350
+ return { status: "unknown", ...names };
51056
51351
  }
51057
51352
  // Arity of an Abstract when known; -1 means "not determinable".
51058
51353
  static arityOf(v) {
@@ -51110,8 +51405,8 @@ class ForgeExprStaticAnalyzer extends AbstractParseTreeVisitor_1.AbstractParseTr
51110
51405
  // Reserved-name check at the binder: under a schema, type/relation names
51111
51406
  // cannot be reused as quantified variables.
51112
51407
  const declListTop = ctx.quantDeclList();
51408
+ const boundHere = new Set();
51113
51409
  if (declListTop) {
51114
- const boundHere = new Set();
51115
51410
  this.collectBoundNames(declListTop, boundHere);
51116
51411
  const reservedError = this.illTypedIfBindsReservedName(boundHere);
51117
51412
  if (reservedError)
@@ -51138,7 +51433,7 @@ class ForgeExprStaticAnalyzer extends AbstractParseTreeVisitor_1.AbstractParseTr
51138
51433
  // and would need the binding to be meaningful).
51139
51434
  let body = UNKNOWN;
51140
51435
  if (blockOrBar.BAR_TOK() && blockOrBar.expr()) {
51141
- body = this.visit(blockOrBar.expr());
51436
+ body = this.withBoundScope(boundHere, () => this.visit(blockOrBar.expr()));
51142
51437
  }
51143
51438
  const mult = quant.mult();
51144
51439
  const isAll = quant.ALL_TOK() !== undefined;
@@ -51781,7 +52076,7 @@ class ForgeExprStaticAnalyzer extends AbstractParseTreeVisitor_1.AbstractParseTr
51781
52076
  return reservedError;
51782
52077
  const blockOrBar = ctx.blockOrBar();
51783
52078
  if (blockOrBar && blockOrBar.BAR_TOK() && blockOrBar.expr()) {
51784
- const body = this.visit(blockOrBar.expr());
52079
+ const body = this.withBoundScope(boundHere, () => this.visit(blockOrBar.expr()));
51785
52080
  if (body.kind === "ill-typed")
51786
52081
  return body;
51787
52082
  if (body.kind === "bool" && !body.value)
@@ -51828,10 +52123,75 @@ class ForgeExprStaticAnalyzer extends AbstractParseTreeVisitor_1.AbstractParseTr
51828
52123
  ? { kind: "typed", arity, columnTypes: cols }
51829
52124
  : { kind: "typed", arity };
51830
52125
  }
52126
+ return UNKNOWN;
51831
52127
  }
51832
52128
  }
51833
52129
  return UNKNOWN;
51834
52130
  }
52131
+ // ---------------------------------------------------------------------
52132
+ // Unresolved-name collection
52133
+ //
52134
+ // This is a separate traversal rather than a side effect of the folding
52135
+ // visitor above. Folding short-circuits — it returns as soon as one child
52136
+ // settles the verdict — so names in the subtrees it skipped would never be
52137
+ // seen. `{x : none, y : Playr | Foo = Foo}` folds to `empty` at the first
52138
+ // decl and never looks at `Playr` or `Foo`. Reporting has to be complete
52139
+ // regardless of how quickly the verdict is decided.
52140
+ // ---------------------------------------------------------------------
52141
+ /** Walk the whole tree, recording every name the schema does not declare. */
52142
+ collectUnresolvedNames(node) {
52143
+ if (!this.schema)
52144
+ return;
52145
+ if (node instanceof ForgeParser_1.NameContext) {
52146
+ this.recordIfUnresolved((0, utils_1.getIdentifierName)(node));
52147
+ return;
52148
+ }
52149
+ // A binder scopes its variables over the body but not over the domains it
52150
+ // binds them from, and its declared names are binding occurrences rather
52151
+ // than references — so neither is walked generically.
52152
+ const binder = this.asBinder(node);
52153
+ if (binder) {
52154
+ const bound = new Set();
52155
+ let decl = binder.declList;
52156
+ while (decl) {
52157
+ this.collectUnresolvedNames(decl.quantDecl().expr());
52158
+ this.collectNamesFromList(decl.quantDecl().nameList(), bound);
52159
+ decl = decl.quantDeclList();
52160
+ }
52161
+ if (binder.body) {
52162
+ this.withBoundScope(bound, () => this.collectUnresolvedNames(binder.body));
52163
+ }
52164
+ return;
52165
+ }
52166
+ for (let i = 0; i < node.childCount; i++) {
52167
+ this.collectUnresolvedNames(node.getChild(i));
52168
+ }
52169
+ }
52170
+ /** The binder parts of a quantifier or set comprehension, if this node is one. */
52171
+ asBinder(node) {
52172
+ const isQuantifier = node instanceof ForgeParser_1.ExprContext && node.quant() !== undefined;
52173
+ const isComprehension = node instanceof ForgeParser_1.Expr18Context && node.LEFT_CURLY_TOK() !== undefined;
52174
+ if (!isQuantifier && !isComprehension)
52175
+ return undefined;
52176
+ const ctx = node;
52177
+ const declList = ctx.quantDeclList();
52178
+ if (!declList)
52179
+ return undefined;
52180
+ return { declList, body: ctx.blockOrBar() };
52181
+ }
52182
+ recordIfUnresolved(id) {
52183
+ if (id === "true" || id === "false")
52184
+ return;
52185
+ if (this.isBound(id) || ForgeExprEvaluator_1.SUPPORTED_BUILTINS.includes(id))
52186
+ return;
52187
+ // Nothing in the schema answers to this name. Unlike the evaluator — which
52188
+ // sees one instance and cannot tell a typo from a sig that is empty in this
52189
+ // frame — a schema lists every declared entity, so this really is a name
52190
+ // that does not exist.
52191
+ if (this.schema.getType(id) || this.schema.getRelations(id).length > 0)
52192
+ return;
52193
+ this.unresolved.add(id);
52194
+ }
51835
52195
  }
51836
52196
  exports.ForgeExprStaticAnalyzer = ForgeExprStaticAnalyzer;
51837
52197
 
@@ -52722,7 +53082,7 @@ ForgeLexer.OPEN_TOK = 1;
52722
53082
  ForgeLexer.LEFT_SQUARE_TOK = 2;
52723
53083
  ForgeLexer.RIGHT_SQUARE_TOK = 3;
52724
53084
  ForgeLexer.AS_TOK = 4;
52725
- ForgeLexer.FILE_PATH_TOK = 5;
53085
+ ForgeLexer.STRING_TOK = 5;
52726
53086
  ForgeLexer.VAR_TOK = 6;
52727
53087
  ForgeLexer.ABSTRACT_TOK = 7;
52728
53088
  ForgeLexer.SIG_TOK = 8;
@@ -52841,7 +53201,7 @@ ForgeLexer.modeNames = [
52841
53201
  "DEFAULT_MODE",
52842
53202
  ];
52843
53203
  ForgeLexer.ruleNames = [
52844
- "OPEN_TOK", "LEFT_SQUARE_TOK", "RIGHT_SQUARE_TOK", "AS_TOK", "FILE_PATH_TOK",
53204
+ "OPEN_TOK", "LEFT_SQUARE_TOK", "RIGHT_SQUARE_TOK", "AS_TOK", "STRING_TOK",
52845
53205
  "VAR_TOK", "ABSTRACT_TOK", "SIG_TOK", "LEFT_CURLY_TOK", "RIGHT_CURLY_TOK",
52846
53206
  "EXTENDS_TOK", "IN_TOK", "PLUS_TOK", "LONE_TOK", "SOME_TOK", "ONE_TOK",
52847
53207
  "TWO_TOK", "SET_TOK", "FUNC_TOK", "PFUNC_TOK", "DISJ_TOK", "COLON_TOK",
@@ -52881,7 +53241,7 @@ ForgeLexer._LITERAL_NAMES = [
52881
53241
  ];
52882
53242
  ForgeLexer._SYMBOLIC_NAMES = [
52883
53243
  undefined, "OPEN_TOK", "LEFT_SQUARE_TOK", "RIGHT_SQUARE_TOK", "AS_TOK",
52884
- "FILE_PATH_TOK", "VAR_TOK", "ABSTRACT_TOK", "SIG_TOK", "LEFT_CURLY_TOK",
53244
+ "STRING_TOK", "VAR_TOK", "ABSTRACT_TOK", "SIG_TOK", "LEFT_CURLY_TOK",
52885
53245
  "RIGHT_CURLY_TOK", "EXTENDS_TOK", "IN_TOK", "PLUS_TOK", "LONE_TOK", "SOME_TOK",
52886
53246
  "ONE_TOK", "TWO_TOK", "SET_TOK", "FUNC_TOK", "PFUNC_TOK", "DISJ_TOK",
52887
53247
  "COLON_TOK", "WHEAT_TOK", "PRED_TOK", "DOT_TOK", "FUN_TOK", "LEFT_PAREN_TOK",
@@ -53894,7 +54254,7 @@ class ForgeParser extends Parser_1.Parser {
53894
54254
  this.state = 220;
53895
54255
  this.match(ForgeParser.OPEN_TOK);
53896
54256
  this.state = 221;
53897
- this.match(ForgeParser.FILE_PATH_TOK);
54257
+ this.match(ForgeParser.STRING_TOK);
53898
54258
  this.state = 224;
53899
54259
  this._errHandler.sync(this);
53900
54260
  _la = this._input.LA(1);
@@ -55037,7 +55397,7 @@ class ForgeParser extends Parser_1.Parser {
55037
55397
  this.enterRule(_localctx, 46, ForgeParser.RULE_const);
55038
55398
  let _la;
55039
55399
  try {
55040
- this.state = 432;
55400
+ this.state = 433;
55041
55401
  this._errHandler.sync(this);
55042
55402
  switch (this._input.LA(1)) {
55043
55403
  case ForgeParser.NONE_TOK:
@@ -55078,6 +55438,13 @@ class ForgeParser extends Parser_1.Parser {
55078
55438
  this.number();
55079
55439
  }
55080
55440
  break;
55441
+ case ForgeParser.STRING_TOK:
55442
+ this.enterOuterAlt(_localctx, 5);
55443
+ {
55444
+ this.state = 432;
55445
+ this.match(ForgeParser.STRING_TOK);
55446
+ }
55447
+ break;
55081
55448
  default:
55082
55449
  throw new NoViableAltException_1.NoViableAltException(this);
55083
55450
  }
@@ -55105,13 +55472,13 @@ class ForgeParser extends Parser_1.Parser {
55105
55472
  try {
55106
55473
  this.enterOuterAlt(_localctx, 1);
55107
55474
  {
55108
- this.state = 434;
55109
- this.match(ForgeParser.ASSERT_TOK);
55110
55475
  this.state = 435;
55111
- this.expr();
55476
+ this.match(ForgeParser.ASSERT_TOK);
55112
55477
  this.state = 436;
55113
- this.match(ForgeParser.IS_TOK);
55478
+ this.expr();
55114
55479
  this.state = 437;
55480
+ this.match(ForgeParser.IS_TOK);
55481
+ this.state = 438;
55115
55482
  _la = this._input.LA(1);
55116
55483
  if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (ForgeParser.SAT_TOK - 40)) | (1 << (ForgeParser.UNSAT_TOK - 40)) | (1 << (ForgeParser.FORGE_ERROR_TOK - 40)))) !== 0))) {
55117
55484
  this._errHandler.recoverInline(this);
@@ -55123,24 +55490,24 @@ class ForgeParser extends Parser_1.Parser {
55123
55490
  this._errHandler.reportMatch(this);
55124
55491
  this.consume();
55125
55492
  }
55126
- this.state = 439;
55493
+ this.state = 440;
55127
55494
  this._errHandler.sync(this);
55128
55495
  switch (this.interpreter.adaptivePredict(this._input, 48, this._ctx)) {
55129
55496
  case 1:
55130
55497
  {
55131
- this.state = 438;
55498
+ this.state = 439;
55132
55499
  this.scope();
55133
55500
  }
55134
55501
  break;
55135
55502
  }
55136
- this.state = 443;
55503
+ this.state = 444;
55137
55504
  this._errHandler.sync(this);
55138
55505
  _la = this._input.LA(1);
55139
55506
  if (_la === ForgeParser.FOR_TOK) {
55140
55507
  {
55141
- this.state = 441;
55142
- this.match(ForgeParser.FOR_TOK);
55143
55508
  this.state = 442;
55509
+ this.match(ForgeParser.FOR_TOK);
55510
+ this.state = 443;
55144
55511
  this.bounds();
55145
55512
  }
55146
55513
  }
@@ -55169,29 +55536,29 @@ class ForgeParser extends Parser_1.Parser {
55169
55536
  try {
55170
55537
  this.enterOuterAlt(_localctx, 1);
55171
55538
  {
55172
- this.state = 445;
55173
- this.match(ForgeParser.ASSERT_TOK);
55174
55539
  this.state = 446;
55540
+ this.match(ForgeParser.ASSERT_TOK);
55541
+ this.state = 447;
55175
55542
  this.match(ForgeParser.ALL_TOK);
55176
- this.state = 448;
55543
+ this.state = 449;
55177
55544
  this._errHandler.sync(this);
55178
55545
  switch (this.interpreter.adaptivePredict(this._input, 50, this._ctx)) {
55179
55546
  case 1:
55180
55547
  {
55181
- this.state = 447;
55548
+ this.state = 448;
55182
55549
  this.match(ForgeParser.DISJ_TOK);
55183
55550
  }
55184
55551
  break;
55185
55552
  }
55186
- this.state = 450;
55187
- this.quantDeclList();
55188
55553
  this.state = 451;
55189
- this.match(ForgeParser.BAR_TOK);
55554
+ this.quantDeclList();
55190
55555
  this.state = 452;
55191
- this.expr();
55556
+ this.match(ForgeParser.BAR_TOK);
55192
55557
  this.state = 453;
55193
- this.match(ForgeParser.IS_TOK);
55558
+ this.expr();
55194
55559
  this.state = 454;
55560
+ this.match(ForgeParser.IS_TOK);
55561
+ this.state = 455;
55195
55562
  _la = this._input.LA(1);
55196
55563
  if (!(_la === ForgeParser.SUFFICIENT_TOK || _la === ForgeParser.NECESSARY_TOK)) {
55197
55564
  this._errHandler.recoverInline(this);
@@ -55203,41 +55570,41 @@ class ForgeParser extends Parser_1.Parser {
55203
55570
  this._errHandler.reportMatch(this);
55204
55571
  this.consume();
55205
55572
  }
55206
- this.state = 455;
55207
- this.match(ForgeParser.FOR_TOK);
55208
55573
  this.state = 456;
55574
+ this.match(ForgeParser.FOR_TOK);
55575
+ this.state = 457;
55209
55576
  this.name();
55210
- this.state = 461;
55577
+ this.state = 462;
55211
55578
  this._errHandler.sync(this);
55212
55579
  _la = this._input.LA(1);
55213
55580
  if (_la === ForgeParser.LEFT_SQUARE_TOK) {
55214
55581
  {
55215
- this.state = 457;
55216
- this.match(ForgeParser.LEFT_SQUARE_TOK);
55217
55582
  this.state = 458;
55218
- this.exprList();
55583
+ this.match(ForgeParser.LEFT_SQUARE_TOK);
55219
55584
  this.state = 459;
55585
+ this.exprList();
55586
+ this.state = 460;
55220
55587
  this.match(ForgeParser.RIGHT_SQUARE_TOK);
55221
55588
  }
55222
55589
  }
55223
- this.state = 464;
55590
+ this.state = 465;
55224
55591
  this._errHandler.sync(this);
55225
55592
  switch (this.interpreter.adaptivePredict(this._input, 52, this._ctx)) {
55226
55593
  case 1:
55227
55594
  {
55228
- this.state = 463;
55595
+ this.state = 464;
55229
55596
  this.scope();
55230
55597
  }
55231
55598
  break;
55232
55599
  }
55233
- this.state = 468;
55600
+ this.state = 469;
55234
55601
  this._errHandler.sync(this);
55235
55602
  _la = this._input.LA(1);
55236
55603
  if (_la === ForgeParser.FOR_TOK) {
55237
55604
  {
55238
- this.state = 466;
55239
- this.match(ForgeParser.FOR_TOK);
55240
55605
  this.state = 467;
55606
+ this.match(ForgeParser.FOR_TOK);
55607
+ this.state = 468;
55241
55608
  this.bounds();
55242
55609
  }
55243
55610
  }
@@ -55266,13 +55633,13 @@ class ForgeParser extends Parser_1.Parser {
55266
55633
  try {
55267
55634
  this.enterOuterAlt(_localctx, 1);
55268
55635
  {
55269
- this.state = 470;
55270
- this.match(ForgeParser.ASSERT_TOK);
55271
55636
  this.state = 471;
55272
- this.expr();
55637
+ this.match(ForgeParser.ASSERT_TOK);
55273
55638
  this.state = 472;
55274
- this.match(ForgeParser.IS_TOK);
55639
+ this.expr();
55275
55640
  this.state = 473;
55641
+ this.match(ForgeParser.IS_TOK);
55642
+ this.state = 474;
55276
55643
  _la = this._input.LA(1);
55277
55644
  if (!(_la === ForgeParser.SUFFICIENT_TOK || _la === ForgeParser.NECESSARY_TOK)) {
55278
55645
  this._errHandler.recoverInline(this);
@@ -55284,28 +55651,28 @@ class ForgeParser extends Parser_1.Parser {
55284
55651
  this._errHandler.reportMatch(this);
55285
55652
  this.consume();
55286
55653
  }
55287
- this.state = 474;
55288
- this.match(ForgeParser.FOR_TOK);
55289
55654
  this.state = 475;
55655
+ this.match(ForgeParser.FOR_TOK);
55656
+ this.state = 476;
55290
55657
  this.name();
55291
- this.state = 477;
55658
+ this.state = 478;
55292
55659
  this._errHandler.sync(this);
55293
55660
  switch (this.interpreter.adaptivePredict(this._input, 54, this._ctx)) {
55294
55661
  case 1:
55295
55662
  {
55296
- this.state = 476;
55663
+ this.state = 477;
55297
55664
  this.scope();
55298
55665
  }
55299
55666
  break;
55300
55667
  }
55301
- this.state = 481;
55668
+ this.state = 482;
55302
55669
  this._errHandler.sync(this);
55303
55670
  _la = this._input.LA(1);
55304
55671
  if (_la === ForgeParser.FOR_TOK) {
55305
55672
  {
55306
- this.state = 479;
55307
- this.match(ForgeParser.FOR_TOK);
55308
55673
  this.state = 480;
55674
+ this.match(ForgeParser.FOR_TOK);
55675
+ this.state = 481;
55309
55676
  this.bounds();
55310
55677
  }
55311
55678
  }
@@ -55334,13 +55701,13 @@ class ForgeParser extends Parser_1.Parser {
55334
55701
  try {
55335
55702
  this.enterOuterAlt(_localctx, 1);
55336
55703
  {
55337
- this.state = 483;
55338
- this.match(ForgeParser.ASSERT_TOK);
55339
55704
  this.state = 484;
55340
- this.expr();
55705
+ this.match(ForgeParser.ASSERT_TOK);
55341
55706
  this.state = 485;
55342
- this.match(ForgeParser.IS_TOK);
55707
+ this.expr();
55343
55708
  this.state = 486;
55709
+ this.match(ForgeParser.IS_TOK);
55710
+ this.state = 487;
55344
55711
  _la = this._input.LA(1);
55345
55712
  if (!(_la === ForgeParser.CONSISTENT_TOK || _la === ForgeParser.INCONSISTENT_TOK)) {
55346
55713
  this._errHandler.recoverInline(this);
@@ -55352,28 +55719,28 @@ class ForgeParser extends Parser_1.Parser {
55352
55719
  this._errHandler.reportMatch(this);
55353
55720
  this.consume();
55354
55721
  }
55355
- this.state = 487;
55356
- this.match(ForgeParser.WITH_TOK);
55357
55722
  this.state = 488;
55723
+ this.match(ForgeParser.WITH_TOK);
55724
+ this.state = 489;
55358
55725
  this.name();
55359
- this.state = 490;
55726
+ this.state = 491;
55360
55727
  this._errHandler.sync(this);
55361
55728
  switch (this.interpreter.adaptivePredict(this._input, 56, this._ctx)) {
55362
55729
  case 1:
55363
55730
  {
55364
- this.state = 489;
55731
+ this.state = 490;
55365
55732
  this.scope();
55366
55733
  }
55367
55734
  break;
55368
55735
  }
55369
- this.state = 494;
55736
+ this.state = 495;
55370
55737
  this._errHandler.sync(this);
55371
55738
  _la = this._input.LA(1);
55372
55739
  if (_la === ForgeParser.FOR_TOK) {
55373
55740
  {
55374
- this.state = 492;
55375
- this.match(ForgeParser.FOR_TOK);
55376
55741
  this.state = 493;
55742
+ this.match(ForgeParser.FOR_TOK);
55743
+ this.state = 494;
55377
55744
  this.bounds();
55378
55745
  }
55379
55746
  }
@@ -55402,31 +55769,31 @@ class ForgeParser extends Parser_1.Parser {
55402
55769
  try {
55403
55770
  this.enterOuterAlt(_localctx, 1);
55404
55771
  {
55405
- this.state = 496;
55406
- this.match(ForgeParser.TEST_TOK);
55407
55772
  this.state = 497;
55408
- this.match(ForgeParser.SUITE_TOK);
55773
+ this.match(ForgeParser.TEST_TOK);
55409
55774
  this.state = 498;
55410
- this.match(ForgeParser.FOR_TOK);
55775
+ this.match(ForgeParser.SUITE_TOK);
55411
55776
  this.state = 499;
55412
- this.name();
55777
+ this.match(ForgeParser.FOR_TOK);
55413
55778
  this.state = 500;
55779
+ this.name();
55780
+ this.state = 501;
55414
55781
  this.match(ForgeParser.LEFT_CURLY_TOK);
55415
- this.state = 504;
55782
+ this.state = 505;
55416
55783
  this._errHandler.sync(this);
55417
55784
  _la = this._input.LA(1);
55418
55785
  while (((((_la - 29)) & ~0x1F) === 0 && ((1 << (_la - 29)) & ((1 << (ForgeParser.ASSERT_TOK - 29)) | (1 << (ForgeParser.TEST_TOK - 29)) | (1 << (ForgeParser.EXPECT_TOK - 29)))) !== 0) || _la === ForgeParser.EXAMPLE_TOK) {
55419
55786
  {
55420
55787
  {
55421
- this.state = 501;
55788
+ this.state = 502;
55422
55789
  this.testConstruct();
55423
55790
  }
55424
55791
  }
55425
- this.state = 506;
55792
+ this.state = 507;
55426
55793
  this._errHandler.sync(this);
55427
55794
  _la = this._input.LA(1);
55428
55795
  }
55429
- this.state = 507;
55796
+ this.state = 508;
55430
55797
  this.match(ForgeParser.RIGHT_CURLY_TOK);
55431
55798
  }
55432
55799
  }
@@ -55450,48 +55817,48 @@ class ForgeParser extends Parser_1.Parser {
55450
55817
  let _localctx = new TestConstructContext(this._ctx, this.state);
55451
55818
  this.enterRule(_localctx, 58, ForgeParser.RULE_testConstruct);
55452
55819
  try {
55453
- this.state = 515;
55820
+ this.state = 516;
55454
55821
  this._errHandler.sync(this);
55455
55822
  switch (this.interpreter.adaptivePredict(this._input, 59, this._ctx)) {
55456
55823
  case 1:
55457
55824
  this.enterOuterAlt(_localctx, 1);
55458
55825
  {
55459
- this.state = 509;
55826
+ this.state = 510;
55460
55827
  this.exampleDecl();
55461
55828
  }
55462
55829
  break;
55463
55830
  case 2:
55464
55831
  this.enterOuterAlt(_localctx, 2);
55465
55832
  {
55466
- this.state = 510;
55833
+ this.state = 511;
55467
55834
  this.testExpectDecl();
55468
55835
  }
55469
55836
  break;
55470
55837
  case 3:
55471
55838
  this.enterOuterAlt(_localctx, 3);
55472
55839
  {
55473
- this.state = 511;
55840
+ this.state = 512;
55474
55841
  this.quantifiedPropertyDecl();
55475
55842
  }
55476
55843
  break;
55477
55844
  case 4:
55478
55845
  this.enterOuterAlt(_localctx, 4);
55479
55846
  {
55480
- this.state = 512;
55847
+ this.state = 513;
55481
55848
  this.propertyDecl();
55482
55849
  }
55483
55850
  break;
55484
55851
  case 5:
55485
55852
  this.enterOuterAlt(_localctx, 5);
55486
55853
  {
55487
- this.state = 513;
55854
+ this.state = 514;
55488
55855
  this.satisfiabilityDecl();
55489
55856
  }
55490
55857
  break;
55491
55858
  case 6:
55492
55859
  this.enterOuterAlt(_localctx, 6);
55493
55860
  {
55494
- this.state = 514;
55861
+ this.state = 515;
55495
55862
  this.consistencyDecl();
55496
55863
  }
55497
55864
  break;
@@ -55519,7 +55886,7 @@ class ForgeParser extends Parser_1.Parser {
55519
55886
  try {
55520
55887
  this.enterOuterAlt(_localctx, 1);
55521
55888
  {
55522
- this.state = 519;
55889
+ this.state = 520;
55523
55890
  this._errHandler.sync(this);
55524
55891
  switch (this._input.LA(1)) {
55525
55892
  case ForgeParser.LONE_TOK:
@@ -55527,13 +55894,13 @@ class ForgeParser extends Parser_1.Parser {
55527
55894
  case ForgeParser.ONE_TOK:
55528
55895
  case ForgeParser.TWO_TOK:
55529
55896
  {
55530
- this.state = 517;
55897
+ this.state = 518;
55531
55898
  this.mult();
55532
55899
  }
55533
55900
  break;
55534
55901
  case ForgeParser.SET_TOK:
55535
55902
  {
55536
- this.state = 518;
55903
+ this.state = 519;
55537
55904
  this.match(ForgeParser.SET_TOK);
55538
55905
  }
55539
55906
  break;
@@ -55542,9 +55909,9 @@ class ForgeParser extends Parser_1.Parser {
55542
55909
  default:
55543
55910
  break;
55544
55911
  }
55545
- this.state = 521;
55912
+ this.state = 522;
55546
55913
  this.match(ForgeParser.ARROW_TOK);
55547
- this.state = 524;
55914
+ this.state = 525;
55548
55915
  this._errHandler.sync(this);
55549
55916
  switch (this._input.LA(1)) {
55550
55917
  case ForgeParser.LONE_TOK:
@@ -55552,16 +55919,17 @@ class ForgeParser extends Parser_1.Parser {
55552
55919
  case ForgeParser.ONE_TOK:
55553
55920
  case ForgeParser.TWO_TOK:
55554
55921
  {
55555
- this.state = 522;
55922
+ this.state = 523;
55556
55923
  this.mult();
55557
55924
  }
55558
55925
  break;
55559
55926
  case ForgeParser.SET_TOK:
55560
55927
  {
55561
- this.state = 523;
55928
+ this.state = 524;
55562
55929
  this.match(ForgeParser.SET_TOK);
55563
55930
  }
55564
55931
  break;
55932
+ case ForgeParser.STRING_TOK:
55565
55933
  case ForgeParser.LEFT_CURLY_TOK:
55566
55934
  case ForgeParser.LEFT_PAREN_TOK:
55567
55935
  case ForgeParser.NONE_TOK:
@@ -55613,7 +55981,7 @@ class ForgeParser extends Parser_1.Parser {
55613
55981
  try {
55614
55982
  this.enterOuterAlt(_localctx, 1);
55615
55983
  {
55616
- this.state = 526;
55984
+ this.state = 527;
55617
55985
  _la = this._input.LA(1);
55618
55986
  if (!(_la === ForgeParser.IN_TOK || _la === ForgeParser.IS_TOK || ((((_la - 95)) & ~0x1F) === 0 && ((1 << (_la - 95)) & ((1 << (ForgeParser.EQ_TOK - 95)) | (1 << (ForgeParser.LT_TOK - 95)) | (1 << (ForgeParser.GT_TOK - 95)) | (1 << (ForgeParser.LEQ_TOK - 95)) | (1 << (ForgeParser.GEQ_TOK - 95)) | (1 << (ForgeParser.NI_TOK - 95)))) !== 0))) {
55619
55987
  this._errHandler.recoverInline(this);
@@ -55649,11 +56017,11 @@ class ForgeParser extends Parser_1.Parser {
55649
56017
  try {
55650
56018
  this.enterOuterAlt(_localctx, 1);
55651
56019
  {
55652
- this.state = 528;
55653
- this.name();
55654
56020
  this.state = 529;
55655
- this.match(ForgeParser.EQ_TOK);
56021
+ this.name();
55656
56022
  this.state = 530;
56023
+ this.match(ForgeParser.EQ_TOK);
56024
+ this.state = 531;
55657
56025
  this.expr();
55658
56026
  }
55659
56027
  }
@@ -55680,23 +56048,23 @@ class ForgeParser extends Parser_1.Parser {
55680
56048
  try {
55681
56049
  this.enterOuterAlt(_localctx, 1);
55682
56050
  {
55683
- this.state = 532;
56051
+ this.state = 533;
55684
56052
  this.match(ForgeParser.LEFT_CURLY_TOK);
55685
- this.state = 536;
56053
+ this.state = 537;
55686
56054
  this._errHandler.sync(this);
55687
56055
  _la = this._input.LA(1);
55688
- while (((((_la - 9)) & ~0x1F) === 0 && ((1 << (_la - 9)) & ((1 << (ForgeParser.LEFT_CURLY_TOK - 9)) | (1 << (ForgeParser.LONE_TOK - 9)) | (1 << (ForgeParser.SOME_TOK - 9)) | (1 << (ForgeParser.ONE_TOK - 9)) | (1 << (ForgeParser.TWO_TOK - 9)) | (1 << (ForgeParser.SET_TOK - 9)) | (1 << (ForgeParser.LEFT_PAREN_TOK - 9)) | (1 << (ForgeParser.NONE_TOK - 9)) | (1 << (ForgeParser.UNIV_TOK - 9)) | (1 << (ForgeParser.IDEN_TOK - 9)) | (1 << (ForgeParser.MINUS_TOK - 9)))) !== 0) || ((((_la - 49)) & ~0x1F) === 0 && ((1 << (_la - 49)) & ((1 << (ForgeParser.ALL_TOK - 49)) | (1 << (ForgeParser.LET_TOK - 49)) | (1 << (ForgeParser.BIND_TOK - 49)) | (1 << (ForgeParser.NEG_TOK - 49)) | (1 << (ForgeParser.ALWAYS_TOK - 49)) | (1 << (ForgeParser.EVENTUALLY_TOK - 49)) | (1 << (ForgeParser.AFTER_TOK - 49)) | (1 << (ForgeParser.BEFORE_TOK - 49)) | (1 << (ForgeParser.ONCE_TOK - 49)) | (1 << (ForgeParser.HISTORICALLY_TOK - 49)) | (1 << (ForgeParser.CARD_TOK - 49)) | (1 << (ForgeParser.TILDE_TOK - 49)))) !== 0) || ((((_la - 81)) & ~0x1F) === 0 && ((1 << (_la - 81)) & ((1 << (ForgeParser.EXP_TOK - 81)) | (1 << (ForgeParser.STAR_TOK - 81)) | (1 << (ForgeParser.AT_TOK - 81)) | (1 << (ForgeParser.BACKQUOTE_TOK - 81)) | (1 << (ForgeParser.THIS_TOK - 81)) | (1 << (ForgeParser.SEXPR_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_STR_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_BOOL_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_NUM_TOK - 81)) | (1 << (ForgeParser.NO_TOK - 81)) | (1 << (ForgeParser.SUM_TOK - 81)) | (1 << (ForgeParser.INT_TOK - 81)) | (1 << (ForgeParser.NUM_CONST_TOK - 81)) | (1 << (ForgeParser.QUOTED_IDENTIFIER_TOK - 81)) | (1 << (ForgeParser.IDENTIFIER_TOK - 81)))) !== 0)) {
56056
+ while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ForgeParser.STRING_TOK) | (1 << ForgeParser.LEFT_CURLY_TOK) | (1 << ForgeParser.LONE_TOK) | (1 << ForgeParser.SOME_TOK) | (1 << ForgeParser.ONE_TOK) | (1 << ForgeParser.TWO_TOK) | (1 << ForgeParser.SET_TOK) | (1 << ForgeParser.LEFT_PAREN_TOK))) !== 0) || ((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & ((1 << (ForgeParser.NONE_TOK - 35)) | (1 << (ForgeParser.UNIV_TOK - 35)) | (1 << (ForgeParser.IDEN_TOK - 35)) | (1 << (ForgeParser.MINUS_TOK - 35)) | (1 << (ForgeParser.ALL_TOK - 35)) | (1 << (ForgeParser.LET_TOK - 35)) | (1 << (ForgeParser.BIND_TOK - 35)))) !== 0) || ((((_la - 67)) & ~0x1F) === 0 && ((1 << (_la - 67)) & ((1 << (ForgeParser.NEG_TOK - 67)) | (1 << (ForgeParser.ALWAYS_TOK - 67)) | (1 << (ForgeParser.EVENTUALLY_TOK - 67)) | (1 << (ForgeParser.AFTER_TOK - 67)) | (1 << (ForgeParser.BEFORE_TOK - 67)) | (1 << (ForgeParser.ONCE_TOK - 67)) | (1 << (ForgeParser.HISTORICALLY_TOK - 67)) | (1 << (ForgeParser.CARD_TOK - 67)) | (1 << (ForgeParser.TILDE_TOK - 67)) | (1 << (ForgeParser.EXP_TOK - 67)) | (1 << (ForgeParser.STAR_TOK - 67)) | (1 << (ForgeParser.AT_TOK - 67)) | (1 << (ForgeParser.BACKQUOTE_TOK - 67)) | (1 << (ForgeParser.THIS_TOK - 67)) | (1 << (ForgeParser.SEXPR_TOK - 67)) | (1 << (ForgeParser.GET_LABEL_TOK - 67)) | (1 << (ForgeParser.GET_LABEL_STR_TOK - 67)) | (1 << (ForgeParser.GET_LABEL_BOOL_TOK - 67)) | (1 << (ForgeParser.GET_LABEL_NUM_TOK - 67)))) !== 0) || ((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & ((1 << (ForgeParser.NO_TOK - 101)) | (1 << (ForgeParser.SUM_TOK - 101)) | (1 << (ForgeParser.INT_TOK - 101)) | (1 << (ForgeParser.NUM_CONST_TOK - 101)) | (1 << (ForgeParser.QUOTED_IDENTIFIER_TOK - 101)) | (1 << (ForgeParser.IDENTIFIER_TOK - 101)))) !== 0)) {
55689
56057
  {
55690
56058
  {
55691
- this.state = 533;
56059
+ this.state = 534;
55692
56060
  this.expr();
55693
56061
  }
55694
56062
  }
55695
- this.state = 538;
56063
+ this.state = 539;
55696
56064
  this._errHandler.sync(this);
55697
56065
  _la = this._input.LA(1);
55698
56066
  }
55699
- this.state = 539;
56067
+ this.state = 540;
55700
56068
  this.match(ForgeParser.RIGHT_CURLY_TOK);
55701
56069
  }
55702
56070
  }
@@ -55720,22 +56088,22 @@ class ForgeParser extends Parser_1.Parser {
55720
56088
  let _localctx = new BlockOrBarContext(this._ctx, this.state);
55721
56089
  this.enterRule(_localctx, 68, ForgeParser.RULE_blockOrBar);
55722
56090
  try {
55723
- this.state = 544;
56091
+ this.state = 545;
55724
56092
  this._errHandler.sync(this);
55725
56093
  switch (this._input.LA(1)) {
55726
56094
  case ForgeParser.LEFT_CURLY_TOK:
55727
56095
  this.enterOuterAlt(_localctx, 1);
55728
56096
  {
55729
- this.state = 541;
56097
+ this.state = 542;
55730
56098
  this.block();
55731
56099
  }
55732
56100
  break;
55733
56101
  case ForgeParser.BAR_TOK:
55734
56102
  this.enterOuterAlt(_localctx, 2);
55735
56103
  {
55736
- this.state = 542;
55737
- this.match(ForgeParser.BAR_TOK);
55738
56104
  this.state = 543;
56105
+ this.match(ForgeParser.BAR_TOK);
56106
+ this.state = 544;
55739
56107
  this.expr();
55740
56108
  }
55741
56109
  break;
@@ -55763,27 +56131,27 @@ class ForgeParser extends Parser_1.Parser {
55763
56131
  let _localctx = new QuantContext(this._ctx, this.state);
55764
56132
  this.enterRule(_localctx, 70, ForgeParser.RULE_quant);
55765
56133
  try {
55766
- this.state = 550;
56134
+ this.state = 551;
55767
56135
  this._errHandler.sync(this);
55768
56136
  switch (this._input.LA(1)) {
55769
56137
  case ForgeParser.ALL_TOK:
55770
56138
  this.enterOuterAlt(_localctx, 1);
55771
56139
  {
55772
- this.state = 546;
56140
+ this.state = 547;
55773
56141
  this.match(ForgeParser.ALL_TOK);
55774
56142
  }
55775
56143
  break;
55776
56144
  case ForgeParser.NO_TOK:
55777
56145
  this.enterOuterAlt(_localctx, 2);
55778
56146
  {
55779
- this.state = 547;
56147
+ this.state = 548;
55780
56148
  this.match(ForgeParser.NO_TOK);
55781
56149
  }
55782
56150
  break;
55783
56151
  case ForgeParser.SUM_TOK:
55784
56152
  this.enterOuterAlt(_localctx, 3);
55785
56153
  {
55786
- this.state = 548;
56154
+ this.state = 549;
55787
56155
  this.match(ForgeParser.SUM_TOK);
55788
56156
  }
55789
56157
  break;
@@ -55793,7 +56161,7 @@ class ForgeParser extends Parser_1.Parser {
55793
56161
  case ForgeParser.TWO_TOK:
55794
56162
  this.enterOuterAlt(_localctx, 4);
55795
56163
  {
55796
- this.state = 549;
56164
+ this.state = 550;
55797
56165
  this.mult();
55798
56166
  }
55799
56167
  break;
@@ -55823,7 +56191,7 @@ class ForgeParser extends Parser_1.Parser {
55823
56191
  let _la;
55824
56192
  try {
55825
56193
  let _alt;
55826
- this.state = 567;
56194
+ this.state = 568;
55827
56195
  this._errHandler.sync(this);
55828
56196
  switch (this._input.LA(1)) {
55829
56197
  case ForgeParser.THIS_TOK:
@@ -55831,50 +56199,50 @@ class ForgeParser extends Parser_1.Parser {
55831
56199
  case ForgeParser.IDENTIFIER_TOK:
55832
56200
  this.enterOuterAlt(_localctx, 1);
55833
56201
  {
55834
- this.state = 554;
56202
+ this.state = 555;
55835
56203
  this._errHandler.sync(this);
55836
56204
  _la = this._input.LA(1);
55837
56205
  if (_la === ForgeParser.THIS_TOK) {
55838
56206
  {
55839
- this.state = 552;
55840
- this.match(ForgeParser.THIS_TOK);
55841
56207
  this.state = 553;
56208
+ this.match(ForgeParser.THIS_TOK);
56209
+ this.state = 554;
55842
56210
  this.match(ForgeParser.SLASH_TOK);
55843
56211
  }
55844
56212
  }
55845
- this.state = 561;
56213
+ this.state = 562;
55846
56214
  this._errHandler.sync(this);
55847
56215
  _alt = this.interpreter.adaptivePredict(this._input, 66, this._ctx);
55848
56216
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
55849
56217
  if (_alt === 1) {
55850
56218
  {
55851
56219
  {
55852
- this.state = 556;
55853
- this.name();
55854
56220
  this.state = 557;
56221
+ this.name();
56222
+ this.state = 558;
55855
56223
  this.match(ForgeParser.SLASH_TOK);
55856
56224
  }
55857
56225
  }
55858
56226
  }
55859
- this.state = 563;
56227
+ this.state = 564;
55860
56228
  this._errHandler.sync(this);
55861
56229
  _alt = this.interpreter.adaptivePredict(this._input, 66, this._ctx);
55862
56230
  }
55863
- this.state = 564;
56231
+ this.state = 565;
55864
56232
  this.name();
55865
56233
  }
55866
56234
  break;
55867
56235
  case ForgeParser.INT_TOK:
55868
56236
  this.enterOuterAlt(_localctx, 2);
55869
56237
  {
55870
- this.state = 565;
56238
+ this.state = 566;
55871
56239
  this.match(ForgeParser.INT_TOK);
55872
56240
  }
55873
56241
  break;
55874
56242
  case ForgeParser.SUM_TOK:
55875
56243
  this.enterOuterAlt(_localctx, 3);
55876
56244
  {
55877
- this.state = 566;
56245
+ this.state = 567;
55878
56246
  this.match(ForgeParser.SUM_TOK);
55879
56247
  }
55880
56248
  break;
@@ -55905,11 +56273,11 @@ class ForgeParser extends Parser_1.Parser {
55905
56273
  try {
55906
56274
  this.enterOuterAlt(_localctx, 1);
55907
56275
  {
55908
- this.state = 569;
55909
- this.match(ForgeParser.OPTION_TOK);
55910
56276
  this.state = 570;
56277
+ this.match(ForgeParser.OPTION_TOK);
56278
+ this.state = 571;
55911
56279
  this.qualName();
55912
- this.state = 577;
56280
+ this.state = 578;
55913
56281
  this._errHandler.sync(this);
55914
56282
  switch (this._input.LA(1)) {
55915
56283
  case ForgeParser.THIS_TOK:
@@ -55918,29 +56286,29 @@ class ForgeParser extends Parser_1.Parser {
55918
56286
  case ForgeParser.QUOTED_IDENTIFIER_TOK:
55919
56287
  case ForgeParser.IDENTIFIER_TOK:
55920
56288
  {
55921
- this.state = 571;
56289
+ this.state = 572;
55922
56290
  this.qualName();
55923
56291
  }
55924
56292
  break;
55925
- case ForgeParser.FILE_PATH_TOK:
56293
+ case ForgeParser.STRING_TOK:
55926
56294
  {
55927
- this.state = 572;
55928
- this.match(ForgeParser.FILE_PATH_TOK);
56295
+ this.state = 573;
56296
+ this.match(ForgeParser.STRING_TOK);
55929
56297
  }
55930
56298
  break;
55931
56299
  case ForgeParser.MINUS_TOK:
55932
56300
  case ForgeParser.NUM_CONST_TOK:
55933
56301
  {
55934
- this.state = 574;
56302
+ this.state = 575;
55935
56303
  this._errHandler.sync(this);
55936
56304
  _la = this._input.LA(1);
55937
56305
  if (_la === ForgeParser.MINUS_TOK) {
55938
56306
  {
55939
- this.state = 573;
56307
+ this.state = 574;
55940
56308
  this.match(ForgeParser.MINUS_TOK);
55941
56309
  }
55942
56310
  }
55943
- this.state = 576;
56311
+ this.state = 577;
55944
56312
  this.number();
55945
56313
  }
55946
56314
  break;
@@ -55972,7 +56340,7 @@ class ForgeParser extends Parser_1.Parser {
55972
56340
  try {
55973
56341
  this.enterOuterAlt(_localctx, 1);
55974
56342
  {
55975
- this.state = 579;
56343
+ this.state = 580;
55976
56344
  _la = this._input.LA(1);
55977
56345
  if (!(_la === ForgeParser.QUOTED_IDENTIFIER_TOK || _la === ForgeParser.IDENTIFIER_TOK)) {
55978
56346
  this._errHandler.recoverInline(this);
@@ -56006,24 +56374,24 @@ class ForgeParser extends Parser_1.Parser {
56006
56374
  let _localctx = new NameListContext(this._ctx, this.state);
56007
56375
  this.enterRule(_localctx, 78, ForgeParser.RULE_nameList);
56008
56376
  try {
56009
- this.state = 586;
56377
+ this.state = 587;
56010
56378
  this._errHandler.sync(this);
56011
56379
  switch (this.interpreter.adaptivePredict(this._input, 70, this._ctx)) {
56012
56380
  case 1:
56013
56381
  this.enterOuterAlt(_localctx, 1);
56014
56382
  {
56015
- this.state = 581;
56383
+ this.state = 582;
56016
56384
  this.name();
56017
56385
  }
56018
56386
  break;
56019
56387
  case 2:
56020
56388
  this.enterOuterAlt(_localctx, 2);
56021
56389
  {
56022
- this.state = 582;
56023
- this.name();
56024
56390
  this.state = 583;
56025
- this.match(ForgeParser.COMMA_TOK);
56391
+ this.name();
56026
56392
  this.state = 584;
56393
+ this.match(ForgeParser.COMMA_TOK);
56394
+ this.state = 585;
56027
56395
  this.nameList();
56028
56396
  }
56029
56397
  break;
@@ -56049,24 +56417,24 @@ class ForgeParser extends Parser_1.Parser {
56049
56417
  let _localctx = new QualNameListContext(this._ctx, this.state);
56050
56418
  this.enterRule(_localctx, 80, ForgeParser.RULE_qualNameList);
56051
56419
  try {
56052
- this.state = 593;
56420
+ this.state = 594;
56053
56421
  this._errHandler.sync(this);
56054
56422
  switch (this.interpreter.adaptivePredict(this._input, 71, this._ctx)) {
56055
56423
  case 1:
56056
56424
  this.enterOuterAlt(_localctx, 1);
56057
56425
  {
56058
- this.state = 588;
56426
+ this.state = 589;
56059
56427
  this.qualName();
56060
56428
  }
56061
56429
  break;
56062
56430
  case 2:
56063
56431
  this.enterOuterAlt(_localctx, 2);
56064
56432
  {
56065
- this.state = 589;
56066
- this.qualName();
56067
56433
  this.state = 590;
56068
- this.match(ForgeParser.COMMA_TOK);
56434
+ this.qualName();
56069
56435
  this.state = 591;
56436
+ this.match(ForgeParser.COMMA_TOK);
56437
+ this.state = 592;
56070
56438
  this.qualNameList();
56071
56439
  }
56072
56440
  break;
@@ -56092,24 +56460,24 @@ class ForgeParser extends Parser_1.Parser {
56092
56460
  let _localctx = new ParaDeclListContext(this._ctx, this.state);
56093
56461
  this.enterRule(_localctx, 82, ForgeParser.RULE_paraDeclList);
56094
56462
  try {
56095
- this.state = 600;
56463
+ this.state = 601;
56096
56464
  this._errHandler.sync(this);
56097
56465
  switch (this.interpreter.adaptivePredict(this._input, 72, this._ctx)) {
56098
56466
  case 1:
56099
56467
  this.enterOuterAlt(_localctx, 1);
56100
56468
  {
56101
- this.state = 595;
56469
+ this.state = 596;
56102
56470
  this.paraDecl();
56103
56471
  }
56104
56472
  break;
56105
56473
  case 2:
56106
56474
  this.enterOuterAlt(_localctx, 2);
56107
56475
  {
56108
- this.state = 596;
56109
- this.paraDecl();
56110
56476
  this.state = 597;
56111
- this.match(ForgeParser.COMMA_TOK);
56477
+ this.paraDecl();
56112
56478
  this.state = 598;
56479
+ this.match(ForgeParser.COMMA_TOK);
56480
+ this.state = 599;
56113
56481
  this.paraDeclList();
56114
56482
  }
56115
56483
  break;
@@ -56135,24 +56503,24 @@ class ForgeParser extends Parser_1.Parser {
56135
56503
  let _localctx = new QuantDeclListContext(this._ctx, this.state);
56136
56504
  this.enterRule(_localctx, 84, ForgeParser.RULE_quantDeclList);
56137
56505
  try {
56138
- this.state = 607;
56506
+ this.state = 608;
56139
56507
  this._errHandler.sync(this);
56140
56508
  switch (this.interpreter.adaptivePredict(this._input, 73, this._ctx)) {
56141
56509
  case 1:
56142
56510
  this.enterOuterAlt(_localctx, 1);
56143
56511
  {
56144
- this.state = 602;
56512
+ this.state = 603;
56145
56513
  this.quantDecl();
56146
56514
  }
56147
56515
  break;
56148
56516
  case 2:
56149
56517
  this.enterOuterAlt(_localctx, 2);
56150
56518
  {
56151
- this.state = 603;
56152
- this.quantDecl();
56153
56519
  this.state = 604;
56154
- this.match(ForgeParser.COMMA_TOK);
56520
+ this.quantDecl();
56155
56521
  this.state = 605;
56522
+ this.match(ForgeParser.COMMA_TOK);
56523
+ this.state = 606;
56156
56524
  this.quantDeclList();
56157
56525
  }
56158
56526
  break;
@@ -56178,24 +56546,24 @@ class ForgeParser extends Parser_1.Parser {
56178
56546
  let _localctx = new ArrowDeclListContext(this._ctx, this.state);
56179
56547
  this.enterRule(_localctx, 86, ForgeParser.RULE_arrowDeclList);
56180
56548
  try {
56181
- this.state = 614;
56549
+ this.state = 615;
56182
56550
  this._errHandler.sync(this);
56183
56551
  switch (this.interpreter.adaptivePredict(this._input, 74, this._ctx)) {
56184
56552
  case 1:
56185
56553
  this.enterOuterAlt(_localctx, 1);
56186
56554
  {
56187
- this.state = 609;
56555
+ this.state = 610;
56188
56556
  this.arrowDecl();
56189
56557
  }
56190
56558
  break;
56191
56559
  case 2:
56192
56560
  this.enterOuterAlt(_localctx, 2);
56193
56561
  {
56194
- this.state = 610;
56195
- this.arrowDecl();
56196
56562
  this.state = 611;
56197
- this.match(ForgeParser.COMMA_TOK);
56563
+ this.arrowDecl();
56198
56564
  this.state = 612;
56565
+ this.match(ForgeParser.COMMA_TOK);
56566
+ this.state = 613;
56199
56567
  this.arrowDeclList();
56200
56568
  }
56201
56569
  break;
@@ -56221,24 +56589,24 @@ class ForgeParser extends Parser_1.Parser {
56221
56589
  let _localctx = new LetDeclListContext(this._ctx, this.state);
56222
56590
  this.enterRule(_localctx, 88, ForgeParser.RULE_letDeclList);
56223
56591
  try {
56224
- this.state = 621;
56592
+ this.state = 622;
56225
56593
  this._errHandler.sync(this);
56226
56594
  switch (this.interpreter.adaptivePredict(this._input, 75, this._ctx)) {
56227
56595
  case 1:
56228
56596
  this.enterOuterAlt(_localctx, 1);
56229
56597
  {
56230
- this.state = 616;
56598
+ this.state = 617;
56231
56599
  this.letDecl();
56232
56600
  }
56233
56601
  break;
56234
56602
  case 2:
56235
56603
  this.enterOuterAlt(_localctx, 2);
56236
56604
  {
56237
- this.state = 617;
56238
- this.letDecl();
56239
56605
  this.state = 618;
56240
- this.match(ForgeParser.COMMA_TOK);
56606
+ this.letDecl();
56241
56607
  this.state = 619;
56608
+ this.match(ForgeParser.COMMA_TOK);
56609
+ this.state = 620;
56242
56610
  this.letDeclList();
56243
56611
  }
56244
56612
  break;
@@ -56264,24 +56632,24 @@ class ForgeParser extends Parser_1.Parser {
56264
56632
  let _localctx = new TypescopeListContext(this._ctx, this.state);
56265
56633
  this.enterRule(_localctx, 90, ForgeParser.RULE_typescopeList);
56266
56634
  try {
56267
- this.state = 628;
56635
+ this.state = 629;
56268
56636
  this._errHandler.sync(this);
56269
56637
  switch (this.interpreter.adaptivePredict(this._input, 76, this._ctx)) {
56270
56638
  case 1:
56271
56639
  this.enterOuterAlt(_localctx, 1);
56272
56640
  {
56273
- this.state = 623;
56641
+ this.state = 624;
56274
56642
  this.typescope();
56275
56643
  }
56276
56644
  break;
56277
56645
  case 2:
56278
56646
  this.enterOuterAlt(_localctx, 2);
56279
56647
  {
56280
- this.state = 624;
56281
- this.typescope();
56282
56648
  this.state = 625;
56283
- this.match(ForgeParser.COMMA_TOK);
56649
+ this.typescope();
56284
56650
  this.state = 626;
56651
+ this.match(ForgeParser.COMMA_TOK);
56652
+ this.state = 627;
56285
56653
  this.typescopeList();
56286
56654
  }
56287
56655
  break;
@@ -56307,24 +56675,24 @@ class ForgeParser extends Parser_1.Parser {
56307
56675
  let _localctx = new ExprListContext(this._ctx, this.state);
56308
56676
  this.enterRule(_localctx, 92, ForgeParser.RULE_exprList);
56309
56677
  try {
56310
- this.state = 635;
56678
+ this.state = 636;
56311
56679
  this._errHandler.sync(this);
56312
56680
  switch (this.interpreter.adaptivePredict(this._input, 77, this._ctx)) {
56313
56681
  case 1:
56314
56682
  this.enterOuterAlt(_localctx, 1);
56315
56683
  {
56316
- this.state = 630;
56684
+ this.state = 631;
56317
56685
  this.expr();
56318
56686
  }
56319
56687
  break;
56320
56688
  case 2:
56321
56689
  this.enterOuterAlt(_localctx, 2);
56322
56690
  {
56323
- this.state = 631;
56324
- this.expr();
56325
56691
  this.state = 632;
56326
- this.match(ForgeParser.COMMA_TOK);
56692
+ this.expr();
56327
56693
  this.state = 633;
56694
+ this.match(ForgeParser.COMMA_TOK);
56695
+ this.state = 634;
56328
56696
  this.exprList();
56329
56697
  }
56330
56698
  break;
@@ -56350,56 +56718,56 @@ class ForgeParser extends Parser_1.Parser {
56350
56718
  let _localctx = new ExprContext(this._ctx, this.state);
56351
56719
  this.enterRule(_localctx, 94, ForgeParser.RULE_expr);
56352
56720
  try {
56353
- this.state = 653;
56721
+ this.state = 654;
56354
56722
  this._errHandler.sync(this);
56355
56723
  switch (this.interpreter.adaptivePredict(this._input, 79, this._ctx)) {
56356
56724
  case 1:
56357
56725
  this.enterOuterAlt(_localctx, 1);
56358
56726
  {
56359
- this.state = 637;
56727
+ this.state = 638;
56360
56728
  this.expr1(0);
56361
56729
  }
56362
56730
  break;
56363
56731
  case 2:
56364
56732
  this.enterOuterAlt(_localctx, 2);
56365
56733
  {
56366
- this.state = 638;
56367
- this.match(ForgeParser.LET_TOK);
56368
56734
  this.state = 639;
56369
- this.letDeclList();
56735
+ this.match(ForgeParser.LET_TOK);
56370
56736
  this.state = 640;
56737
+ this.letDeclList();
56738
+ this.state = 641;
56371
56739
  this.blockOrBar();
56372
56740
  }
56373
56741
  break;
56374
56742
  case 3:
56375
56743
  this.enterOuterAlt(_localctx, 3);
56376
56744
  {
56377
- this.state = 642;
56378
- this.match(ForgeParser.BIND_TOK);
56379
56745
  this.state = 643;
56380
- this.letDeclList();
56746
+ this.match(ForgeParser.BIND_TOK);
56381
56747
  this.state = 644;
56748
+ this.letDeclList();
56749
+ this.state = 645;
56382
56750
  this.blockOrBar();
56383
56751
  }
56384
56752
  break;
56385
56753
  case 4:
56386
56754
  this.enterOuterAlt(_localctx, 4);
56387
56755
  {
56388
- this.state = 646;
56756
+ this.state = 647;
56389
56757
  this.quant();
56390
- this.state = 648;
56758
+ this.state = 649;
56391
56759
  this._errHandler.sync(this);
56392
56760
  switch (this.interpreter.adaptivePredict(this._input, 78, this._ctx)) {
56393
56761
  case 1:
56394
56762
  {
56395
- this.state = 647;
56763
+ this.state = 648;
56396
56764
  this.match(ForgeParser.DISJ_TOK);
56397
56765
  }
56398
56766
  break;
56399
56767
  }
56400
- this.state = 650;
56401
- this.quantDeclList();
56402
56768
  this.state = 651;
56769
+ this.quantDeclList();
56770
+ this.state = 652;
56403
56771
  this.blockOrBar();
56404
56772
  }
56405
56773
  break;
@@ -56436,11 +56804,11 @@ class ForgeParser extends Parser_1.Parser {
56436
56804
  this.enterOuterAlt(_localctx, 1);
56437
56805
  {
56438
56806
  {
56439
- this.state = 656;
56807
+ this.state = 657;
56440
56808
  this.expr1_5(0);
56441
56809
  }
56442
56810
  this._ctx._stop = this._input.tryLT(-1);
56443
- this.state = 663;
56811
+ this.state = 664;
56444
56812
  this._errHandler.sync(this);
56445
56813
  _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx);
56446
56814
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -56453,18 +56821,18 @@ class ForgeParser extends Parser_1.Parser {
56453
56821
  {
56454
56822
  _localctx = new Expr1Context(_parentctx, _parentState);
56455
56823
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr1);
56456
- this.state = 658;
56824
+ this.state = 659;
56457
56825
  if (!(this.precpred(this._ctx, 1))) {
56458
56826
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
56459
56827
  }
56460
- this.state = 659;
56461
- this.match(ForgeParser.OR_TOK);
56462
56828
  this.state = 660;
56829
+ this.match(ForgeParser.OR_TOK);
56830
+ this.state = 661;
56463
56831
  this.expr1_5(0);
56464
56832
  }
56465
56833
  }
56466
56834
  }
56467
- this.state = 665;
56835
+ this.state = 666;
56468
56836
  this._errHandler.sync(this);
56469
56837
  _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx);
56470
56838
  }
@@ -56501,11 +56869,11 @@ class ForgeParser extends Parser_1.Parser {
56501
56869
  this.enterOuterAlt(_localctx, 1);
56502
56870
  {
56503
56871
  {
56504
- this.state = 667;
56872
+ this.state = 668;
56505
56873
  this.expr2(0);
56506
56874
  }
56507
56875
  this._ctx._stop = this._input.tryLT(-1);
56508
- this.state = 674;
56876
+ this.state = 675;
56509
56877
  this._errHandler.sync(this);
56510
56878
  _alt = this.interpreter.adaptivePredict(this._input, 81, this._ctx);
56511
56879
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -56518,18 +56886,18 @@ class ForgeParser extends Parser_1.Parser {
56518
56886
  {
56519
56887
  _localctx = new Expr1_5Context(_parentctx, _parentState);
56520
56888
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr1_5);
56521
- this.state = 669;
56889
+ this.state = 670;
56522
56890
  if (!(this.precpred(this._ctx, 1))) {
56523
56891
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
56524
56892
  }
56525
- this.state = 670;
56526
- this.match(ForgeParser.XOR_TOK);
56527
56893
  this.state = 671;
56894
+ this.match(ForgeParser.XOR_TOK);
56895
+ this.state = 672;
56528
56896
  this.expr2(0);
56529
56897
  }
56530
56898
  }
56531
56899
  }
56532
- this.state = 676;
56900
+ this.state = 677;
56533
56901
  this._errHandler.sync(this);
56534
56902
  _alt = this.interpreter.adaptivePredict(this._input, 81, this._ctx);
56535
56903
  }
@@ -56566,11 +56934,11 @@ class ForgeParser extends Parser_1.Parser {
56566
56934
  this.enterOuterAlt(_localctx, 1);
56567
56935
  {
56568
56936
  {
56569
- this.state = 678;
56937
+ this.state = 679;
56570
56938
  this.expr3();
56571
56939
  }
56572
56940
  this._ctx._stop = this._input.tryLT(-1);
56573
- this.state = 685;
56941
+ this.state = 686;
56574
56942
  this._errHandler.sync(this);
56575
56943
  _alt = this.interpreter.adaptivePredict(this._input, 82, this._ctx);
56576
56944
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -56583,18 +56951,18 @@ class ForgeParser extends Parser_1.Parser {
56583
56951
  {
56584
56952
  _localctx = new Expr2Context(_parentctx, _parentState);
56585
56953
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr2);
56586
- this.state = 680;
56954
+ this.state = 681;
56587
56955
  if (!(this.precpred(this._ctx, 1))) {
56588
56956
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
56589
56957
  }
56590
- this.state = 681;
56591
- this.match(ForgeParser.IFF_TOK);
56592
56958
  this.state = 682;
56959
+ this.match(ForgeParser.IFF_TOK);
56960
+ this.state = 683;
56593
56961
  this.expr3();
56594
56962
  }
56595
56963
  }
56596
56964
  }
56597
- this.state = 687;
56965
+ this.state = 688;
56598
56966
  this._errHandler.sync(this);
56599
56967
  _alt = this.interpreter.adaptivePredict(this._input, 82, this._ctx);
56600
56968
  }
@@ -56620,33 +56988,33 @@ class ForgeParser extends Parser_1.Parser {
56620
56988
  let _localctx = new Expr3Context(this._ctx, this.state);
56621
56989
  this.enterRule(_localctx, 102, ForgeParser.RULE_expr3);
56622
56990
  try {
56623
- this.state = 696;
56991
+ this.state = 697;
56624
56992
  this._errHandler.sync(this);
56625
56993
  switch (this.interpreter.adaptivePredict(this._input, 84, this._ctx)) {
56626
56994
  case 1:
56627
56995
  this.enterOuterAlt(_localctx, 1);
56628
56996
  {
56629
- this.state = 688;
56997
+ this.state = 689;
56630
56998
  this.expr4(0);
56631
56999
  }
56632
57000
  break;
56633
57001
  case 2:
56634
57002
  this.enterOuterAlt(_localctx, 2);
56635
57003
  {
56636
- this.state = 689;
56637
- this.expr4(0);
56638
57004
  this.state = 690;
56639
- this.match(ForgeParser.IMP_TOK);
57005
+ this.expr4(0);
56640
57006
  this.state = 691;
57007
+ this.match(ForgeParser.IMP_TOK);
57008
+ this.state = 692;
56641
57009
  this.expr3();
56642
- this.state = 694;
57010
+ this.state = 695;
56643
57011
  this._errHandler.sync(this);
56644
57012
  switch (this.interpreter.adaptivePredict(this._input, 83, this._ctx)) {
56645
57013
  case 1:
56646
57014
  {
56647
- this.state = 692;
56648
- this.match(ForgeParser.ELSE_TOK);
56649
57015
  this.state = 693;
57016
+ this.match(ForgeParser.ELSE_TOK);
57017
+ this.state = 694;
56650
57018
  this.expr3();
56651
57019
  }
56652
57020
  break;
@@ -56686,11 +57054,11 @@ class ForgeParser extends Parser_1.Parser {
56686
57054
  this.enterOuterAlt(_localctx, 1);
56687
57055
  {
56688
57056
  {
56689
- this.state = 699;
57057
+ this.state = 700;
56690
57058
  this.expr4_5();
56691
57059
  }
56692
57060
  this._ctx._stop = this._input.tryLT(-1);
56693
- this.state = 706;
57061
+ this.state = 707;
56694
57062
  this._errHandler.sync(this);
56695
57063
  _alt = this.interpreter.adaptivePredict(this._input, 85, this._ctx);
56696
57064
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -56703,18 +57071,18 @@ class ForgeParser extends Parser_1.Parser {
56703
57071
  {
56704
57072
  _localctx = new Expr4Context(_parentctx, _parentState);
56705
57073
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr4);
56706
- this.state = 701;
57074
+ this.state = 702;
56707
57075
  if (!(this.precpred(this._ctx, 1))) {
56708
57076
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
56709
57077
  }
56710
- this.state = 702;
56711
- this.match(ForgeParser.AND_TOK);
56712
57078
  this.state = 703;
57079
+ this.match(ForgeParser.AND_TOK);
57080
+ this.state = 704;
56713
57081
  this.expr4_5();
56714
57082
  }
56715
57083
  }
56716
57084
  }
56717
- this.state = 708;
57085
+ this.state = 709;
56718
57086
  this._errHandler.sync(this);
56719
57087
  _alt = this.interpreter.adaptivePredict(this._input, 85, this._ctx);
56720
57088
  }
@@ -56740,57 +57108,57 @@ class ForgeParser extends Parser_1.Parser {
56740
57108
  let _localctx = new Expr4_5Context(this._ctx, this.state);
56741
57109
  this.enterRule(_localctx, 106, ForgeParser.RULE_expr4_5);
56742
57110
  try {
56743
- this.state = 726;
57111
+ this.state = 727;
56744
57112
  this._errHandler.sync(this);
56745
57113
  switch (this.interpreter.adaptivePredict(this._input, 86, this._ctx)) {
56746
57114
  case 1:
56747
57115
  this.enterOuterAlt(_localctx, 1);
56748
57116
  {
56749
- this.state = 709;
57117
+ this.state = 710;
56750
57118
  this.expr5();
56751
57119
  }
56752
57120
  break;
56753
57121
  case 2:
56754
57122
  this.enterOuterAlt(_localctx, 2);
56755
57123
  {
56756
- this.state = 710;
56757
- this.expr5();
56758
57124
  this.state = 711;
56759
- this.match(ForgeParser.UNTIL_TOK);
57125
+ this.expr5();
56760
57126
  this.state = 712;
57127
+ this.match(ForgeParser.UNTIL_TOK);
57128
+ this.state = 713;
56761
57129
  this.expr5();
56762
57130
  }
56763
57131
  break;
56764
57132
  case 3:
56765
57133
  this.enterOuterAlt(_localctx, 3);
56766
57134
  {
56767
- this.state = 714;
56768
- this.expr5();
56769
57135
  this.state = 715;
56770
- this.match(ForgeParser.RELEASE_TOK);
57136
+ this.expr5();
56771
57137
  this.state = 716;
57138
+ this.match(ForgeParser.RELEASE_TOK);
57139
+ this.state = 717;
56772
57140
  this.expr5();
56773
57141
  }
56774
57142
  break;
56775
57143
  case 4:
56776
57144
  this.enterOuterAlt(_localctx, 4);
56777
57145
  {
56778
- this.state = 718;
56779
- this.expr5();
56780
57146
  this.state = 719;
56781
- this.match(ForgeParser.SINCE_TOK);
57147
+ this.expr5();
56782
57148
  this.state = 720;
57149
+ this.match(ForgeParser.SINCE_TOK);
57150
+ this.state = 721;
56783
57151
  this.expr5();
56784
57152
  }
56785
57153
  break;
56786
57154
  case 5:
56787
57155
  this.enterOuterAlt(_localctx, 5);
56788
57156
  {
56789
- this.state = 722;
56790
- this.expr5();
56791
57157
  this.state = 723;
56792
- this.match(ForgeParser.TRIGGERED_TOK);
57158
+ this.expr5();
56793
57159
  this.state = 724;
57160
+ this.match(ForgeParser.TRIGGERED_TOK);
57161
+ this.state = 725;
56794
57162
  this.expr5();
56795
57163
  }
56796
57164
  break;
@@ -56816,9 +57184,10 @@ class ForgeParser extends Parser_1.Parser {
56816
57184
  let _localctx = new Expr5Context(this._ctx, this.state);
56817
57185
  this.enterRule(_localctx, 108, ForgeParser.RULE_expr5);
56818
57186
  try {
56819
- this.state = 743;
57187
+ this.state = 744;
56820
57188
  this._errHandler.sync(this);
56821
57189
  switch (this._input.LA(1)) {
57190
+ case ForgeParser.STRING_TOK:
56822
57191
  case ForgeParser.LEFT_CURLY_TOK:
56823
57192
  case ForgeParser.LONE_TOK:
56824
57193
  case ForgeParser.SOME_TOK:
@@ -56850,70 +57219,70 @@ class ForgeParser extends Parser_1.Parser {
56850
57219
  case ForgeParser.IDENTIFIER_TOK:
56851
57220
  this.enterOuterAlt(_localctx, 1);
56852
57221
  {
56853
- this.state = 728;
57222
+ this.state = 729;
56854
57223
  this.expr6(0);
56855
57224
  }
56856
57225
  break;
56857
57226
  case ForgeParser.NEG_TOK:
56858
57227
  this.enterOuterAlt(_localctx, 2);
56859
57228
  {
56860
- this.state = 729;
56861
- this.match(ForgeParser.NEG_TOK);
56862
57229
  this.state = 730;
57230
+ this.match(ForgeParser.NEG_TOK);
57231
+ this.state = 731;
56863
57232
  this.expr5();
56864
57233
  }
56865
57234
  break;
56866
57235
  case ForgeParser.ALWAYS_TOK:
56867
57236
  this.enterOuterAlt(_localctx, 3);
56868
57237
  {
56869
- this.state = 731;
56870
- this.match(ForgeParser.ALWAYS_TOK);
56871
57238
  this.state = 732;
57239
+ this.match(ForgeParser.ALWAYS_TOK);
57240
+ this.state = 733;
56872
57241
  this.expr5();
56873
57242
  }
56874
57243
  break;
56875
57244
  case ForgeParser.EVENTUALLY_TOK:
56876
57245
  this.enterOuterAlt(_localctx, 4);
56877
57246
  {
56878
- this.state = 733;
56879
- this.match(ForgeParser.EVENTUALLY_TOK);
56880
57247
  this.state = 734;
57248
+ this.match(ForgeParser.EVENTUALLY_TOK);
57249
+ this.state = 735;
56881
57250
  this.expr5();
56882
57251
  }
56883
57252
  break;
56884
57253
  case ForgeParser.AFTER_TOK:
56885
57254
  this.enterOuterAlt(_localctx, 5);
56886
57255
  {
56887
- this.state = 735;
56888
- this.match(ForgeParser.AFTER_TOK);
56889
57256
  this.state = 736;
57257
+ this.match(ForgeParser.AFTER_TOK);
57258
+ this.state = 737;
56890
57259
  this.expr5();
56891
57260
  }
56892
57261
  break;
56893
57262
  case ForgeParser.BEFORE_TOK:
56894
57263
  this.enterOuterAlt(_localctx, 6);
56895
57264
  {
56896
- this.state = 737;
56897
- this.match(ForgeParser.BEFORE_TOK);
56898
57265
  this.state = 738;
57266
+ this.match(ForgeParser.BEFORE_TOK);
57267
+ this.state = 739;
56899
57268
  this.expr5();
56900
57269
  }
56901
57270
  break;
56902
57271
  case ForgeParser.ONCE_TOK:
56903
57272
  this.enterOuterAlt(_localctx, 7);
56904
57273
  {
56905
- this.state = 739;
56906
- this.match(ForgeParser.ONCE_TOK);
56907
57274
  this.state = 740;
57275
+ this.match(ForgeParser.ONCE_TOK);
57276
+ this.state = 741;
56908
57277
  this.expr5();
56909
57278
  }
56910
57279
  break;
56911
57280
  case ForgeParser.HISTORICALLY_TOK:
56912
57281
  this.enterOuterAlt(_localctx, 8);
56913
57282
  {
56914
- this.state = 741;
56915
- this.match(ForgeParser.HISTORICALLY_TOK);
56916
57283
  this.state = 742;
57284
+ this.match(ForgeParser.HISTORICALLY_TOK);
57285
+ this.state = 743;
56917
57286
  this.expr5();
56918
57287
  }
56919
57288
  break;
@@ -56953,11 +57322,11 @@ class ForgeParser extends Parser_1.Parser {
56953
57322
  this.enterOuterAlt(_localctx, 1);
56954
57323
  {
56955
57324
  {
56956
- this.state = 746;
57325
+ this.state = 747;
56957
57326
  this.expr7();
56958
57327
  }
56959
57328
  this._ctx._stop = this._input.tryLT(-1);
56960
- this.state = 757;
57329
+ this.state = 758;
56961
57330
  this._errHandler.sync(this);
56962
57331
  _alt = this.interpreter.adaptivePredict(this._input, 89, this._ctx);
56963
57332
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -56970,27 +57339,27 @@ class ForgeParser extends Parser_1.Parser {
56970
57339
  {
56971
57340
  _localctx = new Expr6Context(_parentctx, _parentState);
56972
57341
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr6);
56973
- this.state = 748;
57342
+ this.state = 749;
56974
57343
  if (!(this.precpred(this._ctx, 1))) {
56975
57344
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
56976
57345
  }
56977
- this.state = 750;
57346
+ this.state = 751;
56978
57347
  this._errHandler.sync(this);
56979
57348
  _la = this._input.LA(1);
56980
57349
  if (_la === ForgeParser.NEG_TOK) {
56981
57350
  {
56982
- this.state = 749;
57351
+ this.state = 750;
56983
57352
  this.match(ForgeParser.NEG_TOK);
56984
57353
  }
56985
57354
  }
56986
- this.state = 752;
56987
- this.compareOp();
56988
57355
  this.state = 753;
57356
+ this.compareOp();
57357
+ this.state = 754;
56989
57358
  this.expr7();
56990
57359
  }
56991
57360
  }
56992
57361
  }
56993
- this.state = 759;
57362
+ this.state = 760;
56994
57363
  this._errHandler.sync(this);
56995
57364
  _alt = this.interpreter.adaptivePredict(this._input, 89, this._ctx);
56996
57365
  }
@@ -57017,9 +57386,10 @@ class ForgeParser extends Parser_1.Parser {
57017
57386
  this.enterRule(_localctx, 112, ForgeParser.RULE_expr7);
57018
57387
  let _la;
57019
57388
  try {
57020
- this.state = 763;
57389
+ this.state = 764;
57021
57390
  this._errHandler.sync(this);
57022
57391
  switch (this._input.LA(1)) {
57392
+ case ForgeParser.STRING_TOK:
57023
57393
  case ForgeParser.LEFT_CURLY_TOK:
57024
57394
  case ForgeParser.LEFT_PAREN_TOK:
57025
57395
  case ForgeParser.NONE_TOK:
@@ -57045,7 +57415,7 @@ class ForgeParser extends Parser_1.Parser {
57045
57415
  case ForgeParser.IDENTIFIER_TOK:
57046
57416
  this.enterOuterAlt(_localctx, 1);
57047
57417
  {
57048
- this.state = 760;
57418
+ this.state = 761;
57049
57419
  this.expr8(0);
57050
57420
  }
57051
57421
  break;
@@ -57057,7 +57427,7 @@ class ForgeParser extends Parser_1.Parser {
57057
57427
  case ForgeParser.NO_TOK:
57058
57428
  this.enterOuterAlt(_localctx, 2);
57059
57429
  {
57060
- this.state = 761;
57430
+ this.state = 762;
57061
57431
  _la = this._input.LA(1);
57062
57432
  if (!((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ForgeParser.LONE_TOK) | (1 << ForgeParser.SOME_TOK) | (1 << ForgeParser.ONE_TOK) | (1 << ForgeParser.TWO_TOK) | (1 << ForgeParser.SET_TOK))) !== 0) || _la === ForgeParser.NO_TOK)) {
57063
57433
  this._errHandler.recoverInline(this);
@@ -57069,7 +57439,7 @@ class ForgeParser extends Parser_1.Parser {
57069
57439
  this._errHandler.reportMatch(this);
57070
57440
  this.consume();
57071
57441
  }
57072
- this.state = 762;
57442
+ this.state = 763;
57073
57443
  this.expr8(0);
57074
57444
  }
57075
57445
  break;
@@ -57109,11 +57479,11 @@ class ForgeParser extends Parser_1.Parser {
57109
57479
  this.enterOuterAlt(_localctx, 1);
57110
57480
  {
57111
57481
  {
57112
- this.state = 766;
57482
+ this.state = 767;
57113
57483
  this.expr9();
57114
57484
  }
57115
57485
  this._ctx._stop = this._input.tryLT(-1);
57116
- this.state = 773;
57486
+ this.state = 774;
57117
57487
  this._errHandler.sync(this);
57118
57488
  _alt = this.interpreter.adaptivePredict(this._input, 91, this._ctx);
57119
57489
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57126,11 +57496,11 @@ class ForgeParser extends Parser_1.Parser {
57126
57496
  {
57127
57497
  _localctx = new Expr8Context(_parentctx, _parentState);
57128
57498
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr8);
57129
- this.state = 768;
57499
+ this.state = 769;
57130
57500
  if (!(this.precpred(this._ctx, 1))) {
57131
57501
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
57132
57502
  }
57133
- this.state = 769;
57503
+ this.state = 770;
57134
57504
  _la = this._input.LA(1);
57135
57505
  if (!(_la === ForgeParser.PLUS_TOK || _la === ForgeParser.MINUS_TOK)) {
57136
57506
  this._errHandler.recoverInline(this);
@@ -57142,12 +57512,12 @@ class ForgeParser extends Parser_1.Parser {
57142
57512
  this._errHandler.reportMatch(this);
57143
57513
  this.consume();
57144
57514
  }
57145
- this.state = 770;
57515
+ this.state = 771;
57146
57516
  this.expr10(0);
57147
57517
  }
57148
57518
  }
57149
57519
  }
57150
- this.state = 775;
57520
+ this.state = 776;
57151
57521
  this._errHandler.sync(this);
57152
57522
  _alt = this.interpreter.adaptivePredict(this._input, 91, this._ctx);
57153
57523
  }
@@ -57173,9 +57543,10 @@ class ForgeParser extends Parser_1.Parser {
57173
57543
  let _localctx = new Expr9Context(this._ctx, this.state);
57174
57544
  this.enterRule(_localctx, 116, ForgeParser.RULE_expr9);
57175
57545
  try {
57176
- this.state = 779;
57546
+ this.state = 780;
57177
57547
  this._errHandler.sync(this);
57178
57548
  switch (this._input.LA(1)) {
57549
+ case ForgeParser.STRING_TOK:
57179
57550
  case ForgeParser.LEFT_CURLY_TOK:
57180
57551
  case ForgeParser.LEFT_PAREN_TOK:
57181
57552
  case ForgeParser.NONE_TOK:
@@ -57200,16 +57571,16 @@ class ForgeParser extends Parser_1.Parser {
57200
57571
  case ForgeParser.IDENTIFIER_TOK:
57201
57572
  this.enterOuterAlt(_localctx, 1);
57202
57573
  {
57203
- this.state = 776;
57574
+ this.state = 777;
57204
57575
  this.expr10(0);
57205
57576
  }
57206
57577
  break;
57207
57578
  case ForgeParser.CARD_TOK:
57208
57579
  this.enterOuterAlt(_localctx, 2);
57209
57580
  {
57210
- this.state = 777;
57211
- this.match(ForgeParser.CARD_TOK);
57212
57581
  this.state = 778;
57582
+ this.match(ForgeParser.CARD_TOK);
57583
+ this.state = 779;
57213
57584
  this.expr9();
57214
57585
  }
57215
57586
  break;
@@ -57248,11 +57619,11 @@ class ForgeParser extends Parser_1.Parser {
57248
57619
  this.enterOuterAlt(_localctx, 1);
57249
57620
  {
57250
57621
  {
57251
- this.state = 782;
57622
+ this.state = 783;
57252
57623
  this.expr11(0);
57253
57624
  }
57254
57625
  this._ctx._stop = this._input.tryLT(-1);
57255
- this.state = 789;
57626
+ this.state = 790;
57256
57627
  this._errHandler.sync(this);
57257
57628
  _alt = this.interpreter.adaptivePredict(this._input, 93, this._ctx);
57258
57629
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57265,18 +57636,18 @@ class ForgeParser extends Parser_1.Parser {
57265
57636
  {
57266
57637
  _localctx = new Expr10Context(_parentctx, _parentState);
57267
57638
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr10);
57268
- this.state = 784;
57639
+ this.state = 785;
57269
57640
  if (!(this.precpred(this._ctx, 1))) {
57270
57641
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
57271
57642
  }
57272
- this.state = 785;
57273
- this.match(ForgeParser.PPLUS_TOK);
57274
57643
  this.state = 786;
57644
+ this.match(ForgeParser.PPLUS_TOK);
57645
+ this.state = 787;
57275
57646
  this.expr11(0);
57276
57647
  }
57277
57648
  }
57278
57649
  }
57279
- this.state = 791;
57650
+ this.state = 792;
57280
57651
  this._errHandler.sync(this);
57281
57652
  _alt = this.interpreter.adaptivePredict(this._input, 93, this._ctx);
57282
57653
  }
@@ -57313,11 +57684,11 @@ class ForgeParser extends Parser_1.Parser {
57313
57684
  this.enterOuterAlt(_localctx, 1);
57314
57685
  {
57315
57686
  {
57316
- this.state = 793;
57687
+ this.state = 794;
57317
57688
  this.expr12(0);
57318
57689
  }
57319
57690
  this._ctx._stop = this._input.tryLT(-1);
57320
- this.state = 800;
57691
+ this.state = 801;
57321
57692
  this._errHandler.sync(this);
57322
57693
  _alt = this.interpreter.adaptivePredict(this._input, 94, this._ctx);
57323
57694
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57330,18 +57701,18 @@ class ForgeParser extends Parser_1.Parser {
57330
57701
  {
57331
57702
  _localctx = new Expr11Context(_parentctx, _parentState);
57332
57703
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr11);
57333
- this.state = 795;
57704
+ this.state = 796;
57334
57705
  if (!(this.precpred(this._ctx, 1))) {
57335
57706
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
57336
57707
  }
57337
- this.state = 796;
57338
- this.match(ForgeParser.AMP_TOK);
57339
57708
  this.state = 797;
57709
+ this.match(ForgeParser.AMP_TOK);
57710
+ this.state = 798;
57340
57711
  this.expr12(0);
57341
57712
  }
57342
57713
  }
57343
57714
  }
57344
- this.state = 802;
57715
+ this.state = 803;
57345
57716
  this._errHandler.sync(this);
57346
57717
  _alt = this.interpreter.adaptivePredict(this._input, 94, this._ctx);
57347
57718
  }
@@ -57378,11 +57749,11 @@ class ForgeParser extends Parser_1.Parser {
57378
57749
  this.enterOuterAlt(_localctx, 1);
57379
57750
  {
57380
57751
  {
57381
- this.state = 804;
57752
+ this.state = 805;
57382
57753
  this.expr13(0);
57383
57754
  }
57384
57755
  this._ctx._stop = this._input.tryLT(-1);
57385
- this.state = 812;
57756
+ this.state = 813;
57386
57757
  this._errHandler.sync(this);
57387
57758
  _alt = this.interpreter.adaptivePredict(this._input, 95, this._ctx);
57388
57759
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57395,18 +57766,18 @@ class ForgeParser extends Parser_1.Parser {
57395
57766
  {
57396
57767
  _localctx = new Expr12Context(_parentctx, _parentState);
57397
57768
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr12);
57398
- this.state = 806;
57769
+ this.state = 807;
57399
57770
  if (!(this.precpred(this._ctx, 1))) {
57400
57771
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
57401
57772
  }
57402
- this.state = 807;
57403
- this.arrowOp();
57404
57773
  this.state = 808;
57774
+ this.arrowOp();
57775
+ this.state = 809;
57405
57776
  this.expr13(0);
57406
57777
  }
57407
57778
  }
57408
57779
  }
57409
- this.state = 814;
57780
+ this.state = 815;
57410
57781
  this._errHandler.sync(this);
57411
57782
  _alt = this.interpreter.adaptivePredict(this._input, 95, this._ctx);
57412
57783
  }
@@ -57444,11 +57815,11 @@ class ForgeParser extends Parser_1.Parser {
57444
57815
  this.enterOuterAlt(_localctx, 1);
57445
57816
  {
57446
57817
  {
57447
- this.state = 816;
57818
+ this.state = 817;
57448
57819
  this.expr14(0);
57449
57820
  }
57450
57821
  this._ctx._stop = this._input.tryLT(-1);
57451
- this.state = 823;
57822
+ this.state = 824;
57452
57823
  this._errHandler.sync(this);
57453
57824
  _alt = this.interpreter.adaptivePredict(this._input, 96, this._ctx);
57454
57825
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57461,11 +57832,11 @@ class ForgeParser extends Parser_1.Parser {
57461
57832
  {
57462
57833
  _localctx = new Expr13Context(_parentctx, _parentState);
57463
57834
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr13);
57464
- this.state = 818;
57835
+ this.state = 819;
57465
57836
  if (!(this.precpred(this._ctx, 1))) {
57466
57837
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
57467
57838
  }
57468
- this.state = 819;
57839
+ this.state = 820;
57469
57840
  _la = this._input.LA(1);
57470
57841
  if (!(_la === ForgeParser.SUBT_TOK || _la === ForgeParser.SUPT_TOK)) {
57471
57842
  this._errHandler.recoverInline(this);
@@ -57477,12 +57848,12 @@ class ForgeParser extends Parser_1.Parser {
57477
57848
  this._errHandler.reportMatch(this);
57478
57849
  this.consume();
57479
57850
  }
57480
- this.state = 820;
57851
+ this.state = 821;
57481
57852
  this.expr14(0);
57482
57853
  }
57483
57854
  }
57484
57855
  }
57485
- this.state = 825;
57856
+ this.state = 826;
57486
57857
  this._errHandler.sync(this);
57487
57858
  _alt = this.interpreter.adaptivePredict(this._input, 96, this._ctx);
57488
57859
  }
@@ -57519,11 +57890,11 @@ class ForgeParser extends Parser_1.Parser {
57519
57890
  this.enterOuterAlt(_localctx, 1);
57520
57891
  {
57521
57892
  {
57522
- this.state = 827;
57893
+ this.state = 828;
57523
57894
  this.expr15(0);
57524
57895
  }
57525
57896
  this._ctx._stop = this._input.tryLT(-1);
57526
- this.state = 836;
57897
+ this.state = 837;
57527
57898
  this._errHandler.sync(this);
57528
57899
  _alt = this.interpreter.adaptivePredict(this._input, 97, this._ctx);
57529
57900
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57536,20 +57907,20 @@ class ForgeParser extends Parser_1.Parser {
57536
57907
  {
57537
57908
  _localctx = new Expr14Context(_parentctx, _parentState);
57538
57909
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr14);
57539
- this.state = 829;
57910
+ this.state = 830;
57540
57911
  if (!(this.precpred(this._ctx, 1))) {
57541
57912
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
57542
57913
  }
57543
- this.state = 830;
57544
- this.match(ForgeParser.LEFT_SQUARE_TOK);
57545
57914
  this.state = 831;
57546
- this.exprList();
57915
+ this.match(ForgeParser.LEFT_SQUARE_TOK);
57547
57916
  this.state = 832;
57917
+ this.exprList();
57918
+ this.state = 833;
57548
57919
  this.match(ForgeParser.RIGHT_SQUARE_TOK);
57549
57920
  }
57550
57921
  }
57551
57922
  }
57552
- this.state = 838;
57923
+ this.state = 839;
57553
57924
  this._errHandler.sync(this);
57554
57925
  _alt = this.interpreter.adaptivePredict(this._input, 97, this._ctx);
57555
57926
  }
@@ -57585,30 +57956,30 @@ class ForgeParser extends Parser_1.Parser {
57585
57956
  let _alt;
57586
57957
  this.enterOuterAlt(_localctx, 1);
57587
57958
  {
57588
- this.state = 846;
57959
+ this.state = 847;
57589
57960
  this._errHandler.sync(this);
57590
57961
  switch (this.interpreter.adaptivePredict(this._input, 98, this._ctx)) {
57591
57962
  case 1:
57592
57963
  {
57593
- this.state = 840;
57964
+ this.state = 841;
57594
57965
  this.expr16(0);
57595
57966
  }
57596
57967
  break;
57597
57968
  case 2:
57598
57969
  {
57599
- this.state = 841;
57600
- this.name();
57601
57970
  this.state = 842;
57602
- this.match(ForgeParser.LEFT_SQUARE_TOK);
57971
+ this.name();
57603
57972
  this.state = 843;
57604
- this.exprList();
57973
+ this.match(ForgeParser.LEFT_SQUARE_TOK);
57605
57974
  this.state = 844;
57975
+ this.exprList();
57976
+ this.state = 845;
57606
57977
  this.match(ForgeParser.RIGHT_SQUARE_TOK);
57607
57978
  }
57608
57979
  break;
57609
57980
  }
57610
57981
  this._ctx._stop = this._input.tryLT(-1);
57611
- this.state = 853;
57982
+ this.state = 854;
57612
57983
  this._errHandler.sync(this);
57613
57984
  _alt = this.interpreter.adaptivePredict(this._input, 99, this._ctx);
57614
57985
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57621,18 +57992,18 @@ class ForgeParser extends Parser_1.Parser {
57621
57992
  {
57622
57993
  _localctx = new Expr15Context(_parentctx, _parentState);
57623
57994
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr15);
57624
- this.state = 848;
57995
+ this.state = 849;
57625
57996
  if (!(this.precpred(this._ctx, 2))) {
57626
57997
  throw this.createFailedPredicateException("this.precpred(this._ctx, 2)");
57627
57998
  }
57628
- this.state = 849;
57629
- this.match(ForgeParser.DOT_TOK);
57630
57999
  this.state = 850;
58000
+ this.match(ForgeParser.DOT_TOK);
58001
+ this.state = 851;
57631
58002
  this.expr16(0);
57632
58003
  }
57633
58004
  }
57634
58005
  }
57635
- this.state = 855;
58006
+ this.state = 856;
57636
58007
  this._errHandler.sync(this);
57637
58008
  _alt = this.interpreter.adaptivePredict(this._input, 99, this._ctx);
57638
58009
  }
@@ -57669,11 +58040,11 @@ class ForgeParser extends Parser_1.Parser {
57669
58040
  this.enterOuterAlt(_localctx, 1);
57670
58041
  {
57671
58042
  {
57672
- this.state = 857;
58043
+ this.state = 858;
57673
58044
  this.expr17();
57674
58045
  }
57675
58046
  this._ctx._stop = this._input.tryLT(-1);
57676
- this.state = 863;
58047
+ this.state = 864;
57677
58048
  this._errHandler.sync(this);
57678
58049
  _alt = this.interpreter.adaptivePredict(this._input, 100, this._ctx);
57679
58050
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57686,16 +58057,16 @@ class ForgeParser extends Parser_1.Parser {
57686
58057
  {
57687
58058
  _localctx = new Expr16Context(_parentctx, _parentState);
57688
58059
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr16);
57689
- this.state = 859;
58060
+ this.state = 860;
57690
58061
  if (!(this.precpred(this._ctx, 1))) {
57691
58062
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
57692
58063
  }
57693
- this.state = 860;
58064
+ this.state = 861;
57694
58065
  this.match(ForgeParser.PRIME_TOK);
57695
58066
  }
57696
58067
  }
57697
58068
  }
57698
- this.state = 865;
58069
+ this.state = 866;
57699
58070
  this._errHandler.sync(this);
57700
58071
  _alt = this.interpreter.adaptivePredict(this._input, 100, this._ctx);
57701
58072
  }
@@ -57722,9 +58093,10 @@ class ForgeParser extends Parser_1.Parser {
57722
58093
  this.enterRule(_localctx, 132, ForgeParser.RULE_expr17);
57723
58094
  let _la;
57724
58095
  try {
57725
- this.state = 869;
58096
+ this.state = 870;
57726
58097
  this._errHandler.sync(this);
57727
58098
  switch (this._input.LA(1)) {
58099
+ case ForgeParser.STRING_TOK:
57728
58100
  case ForgeParser.LEFT_CURLY_TOK:
57729
58101
  case ForgeParser.LEFT_PAREN_TOK:
57730
58102
  case ForgeParser.NONE_TOK:
@@ -57742,7 +58114,7 @@ class ForgeParser extends Parser_1.Parser {
57742
58114
  case ForgeParser.IDENTIFIER_TOK:
57743
58115
  this.enterOuterAlt(_localctx, 1);
57744
58116
  {
57745
- this.state = 866;
58117
+ this.state = 867;
57746
58118
  this.expr18();
57747
58119
  }
57748
58120
  break;
@@ -57755,7 +58127,7 @@ class ForgeParser extends Parser_1.Parser {
57755
58127
  case ForgeParser.GET_LABEL_NUM_TOK:
57756
58128
  this.enterOuterAlt(_localctx, 2);
57757
58129
  {
57758
- this.state = 867;
58130
+ this.state = 868;
57759
58131
  _la = this._input.LA(1);
57760
58132
  if (!(((((_la - 80)) & ~0x1F) === 0 && ((1 << (_la - 80)) & ((1 << (ForgeParser.TILDE_TOK - 80)) | (1 << (ForgeParser.EXP_TOK - 80)) | (1 << (ForgeParser.STAR_TOK - 80)) | (1 << (ForgeParser.GET_LABEL_TOK - 80)) | (1 << (ForgeParser.GET_LABEL_STR_TOK - 80)) | (1 << (ForgeParser.GET_LABEL_BOOL_TOK - 80)) | (1 << (ForgeParser.GET_LABEL_NUM_TOK - 80)))) !== 0))) {
57761
58133
  this._errHandler.recoverInline(this);
@@ -57767,7 +58139,7 @@ class ForgeParser extends Parser_1.Parser {
57767
58139
  this._errHandler.reportMatch(this);
57768
58140
  this.consume();
57769
58141
  }
57770
- this.state = 868;
58142
+ this.state = 869;
57771
58143
  this.expr17();
57772
58144
  }
57773
58145
  break;
@@ -57795,83 +58167,83 @@ class ForgeParser extends Parser_1.Parser {
57795
58167
  let _localctx = new Expr18Context(this._ctx, this.state);
57796
58168
  this.enterRule(_localctx, 134, ForgeParser.RULE_expr18);
57797
58169
  try {
57798
- this.state = 889;
58170
+ this.state = 890;
57799
58171
  this._errHandler.sync(this);
57800
58172
  switch (this.interpreter.adaptivePredict(this._input, 102, this._ctx)) {
57801
58173
  case 1:
57802
58174
  this.enterOuterAlt(_localctx, 1);
57803
58175
  {
57804
- this.state = 871;
58176
+ this.state = 872;
57805
58177
  this.const();
57806
58178
  }
57807
58179
  break;
57808
58180
  case 2:
57809
58181
  this.enterOuterAlt(_localctx, 2);
57810
58182
  {
57811
- this.state = 872;
58183
+ this.state = 873;
57812
58184
  this.qualName();
57813
58185
  }
57814
58186
  break;
57815
58187
  case 3:
57816
58188
  this.enterOuterAlt(_localctx, 3);
57817
58189
  {
57818
- this.state = 873;
57819
- this.match(ForgeParser.AT_TOK);
57820
58190
  this.state = 874;
58191
+ this.match(ForgeParser.AT_TOK);
58192
+ this.state = 875;
57821
58193
  this.name();
57822
58194
  }
57823
58195
  break;
57824
58196
  case 4:
57825
58197
  this.enterOuterAlt(_localctx, 4);
57826
58198
  {
57827
- this.state = 875;
57828
- this.match(ForgeParser.BACKQUOTE_TOK);
57829
58199
  this.state = 876;
58200
+ this.match(ForgeParser.BACKQUOTE_TOK);
58201
+ this.state = 877;
57830
58202
  this.name();
57831
58203
  }
57832
58204
  break;
57833
58205
  case 5:
57834
58206
  this.enterOuterAlt(_localctx, 5);
57835
58207
  {
57836
- this.state = 877;
58208
+ this.state = 878;
57837
58209
  this.match(ForgeParser.THIS_TOK);
57838
58210
  }
57839
58211
  break;
57840
58212
  case 6:
57841
58213
  this.enterOuterAlt(_localctx, 6);
57842
58214
  {
57843
- this.state = 878;
57844
- this.match(ForgeParser.LEFT_CURLY_TOK);
57845
58215
  this.state = 879;
57846
- this.quantDeclList();
58216
+ this.match(ForgeParser.LEFT_CURLY_TOK);
57847
58217
  this.state = 880;
57848
- this.blockOrBar();
58218
+ this.quantDeclList();
57849
58219
  this.state = 881;
58220
+ this.blockOrBar();
58221
+ this.state = 882;
57850
58222
  this.match(ForgeParser.RIGHT_CURLY_TOK);
57851
58223
  }
57852
58224
  break;
57853
58225
  case 7:
57854
58226
  this.enterOuterAlt(_localctx, 7);
57855
58227
  {
57856
- this.state = 883;
57857
- this.match(ForgeParser.LEFT_PAREN_TOK);
57858
58228
  this.state = 884;
57859
- this.expr();
58229
+ this.match(ForgeParser.LEFT_PAREN_TOK);
57860
58230
  this.state = 885;
58231
+ this.expr();
58232
+ this.state = 886;
57861
58233
  this.match(ForgeParser.RIGHT_PAREN_TOK);
57862
58234
  }
57863
58235
  break;
57864
58236
  case 8:
57865
58237
  this.enterOuterAlt(_localctx, 8);
57866
58238
  {
57867
- this.state = 887;
58239
+ this.state = 888;
57868
58240
  this.block();
57869
58241
  }
57870
58242
  break;
57871
58243
  case 9:
57872
58244
  this.enterOuterAlt(_localctx, 9);
57873
58245
  {
57874
- this.state = 888;
58246
+ this.state = 889;
57875
58247
  this.sexpr();
57876
58248
  }
57877
58249
  break;
@@ -57897,24 +58269,24 @@ class ForgeParser extends Parser_1.Parser {
57897
58269
  let _localctx = new ArrowExprContext(this._ctx, this.state);
57898
58270
  this.enterRule(_localctx, 136, ForgeParser.RULE_arrowExpr);
57899
58271
  try {
57900
- this.state = 896;
58272
+ this.state = 897;
57901
58273
  this._errHandler.sync(this);
57902
58274
  switch (this.interpreter.adaptivePredict(this._input, 103, this._ctx)) {
57903
58275
  case 1:
57904
58276
  this.enterOuterAlt(_localctx, 1);
57905
58277
  {
57906
- this.state = 891;
58278
+ this.state = 892;
57907
58279
  this.qualName();
57908
58280
  }
57909
58281
  break;
57910
58282
  case 2:
57911
58283
  this.enterOuterAlt(_localctx, 2);
57912
58284
  {
57913
- this.state = 892;
57914
- this.qualName();
57915
58285
  this.state = 893;
57916
- this.match(ForgeParser.ARROW_TOK);
58286
+ this.qualName();
57917
58287
  this.state = 894;
58288
+ this.match(ForgeParser.ARROW_TOK);
58289
+ this.state = 895;
57918
58290
  this.arrowExpr();
57919
58291
  }
57920
58292
  break;
@@ -57942,7 +58314,7 @@ class ForgeParser extends Parser_1.Parser {
57942
58314
  try {
57943
58315
  this.enterOuterAlt(_localctx, 1);
57944
58316
  {
57945
- this.state = 898;
58317
+ this.state = 899;
57946
58318
  this.sexpr();
57947
58319
  }
57948
58320
  }
@@ -57968,7 +58340,7 @@ class ForgeParser extends Parser_1.Parser {
57968
58340
  try {
57969
58341
  this.enterOuterAlt(_localctx, 1);
57970
58342
  {
57971
- this.state = 900;
58343
+ this.state = 901;
57972
58344
  this.match(ForgeParser.SEXPR_TOK);
57973
58345
  }
57974
58346
  }
@@ -57995,18 +58367,18 @@ class ForgeParser extends Parser_1.Parser {
57995
58367
  try {
57996
58368
  this.enterOuterAlt(_localctx, 1);
57997
58369
  {
57998
- this.state = 902;
57999
- this.match(ForgeParser.INST_TOK);
58000
58370
  this.state = 903;
58001
- this.name();
58371
+ this.match(ForgeParser.INST_TOK);
58002
58372
  this.state = 904;
58373
+ this.name();
58374
+ this.state = 905;
58003
58375
  this.bounds();
58004
- this.state = 906;
58376
+ this.state = 907;
58005
58377
  this._errHandler.sync(this);
58006
58378
  _la = this._input.LA(1);
58007
58379
  if (_la === ForgeParser.FOR_TOK) {
58008
58380
  {
58009
- this.state = 905;
58381
+ this.state = 906;
58010
58382
  this.scope();
58011
58383
  }
58012
58384
  }
@@ -58034,7 +58406,7 @@ class ForgeParser extends Parser_1.Parser {
58034
58406
  try {
58035
58407
  this.enterOuterAlt(_localctx, 1);
58036
58408
  {
58037
- this.state = 908;
58409
+ this.state = 909;
58038
58410
  this.arrowDecl();
58039
58411
  }
58040
58412
  }
@@ -58060,9 +58432,9 @@ class ForgeParser extends Parser_1.Parser {
58060
58432
  try {
58061
58433
  this.enterOuterAlt(_localctx, 1);
58062
58434
  {
58063
- this.state = 910;
58064
- this.match(ForgeParser.EVAL_TOK);
58065
58435
  this.state = 911;
58436
+ this.match(ForgeParser.EVAL_TOK);
58437
+ this.state = 912;
58066
58438
  this.expr();
58067
58439
  }
58068
58440
  }
@@ -58088,17 +58460,17 @@ class ForgeParser extends Parser_1.Parser {
58088
58460
  try {
58089
58461
  this.enterOuterAlt(_localctx, 1);
58090
58462
  {
58091
- this.state = 913;
58092
- this.match(ForgeParser.EXAMPLE_TOK);
58093
58463
  this.state = 914;
58094
- this.name();
58464
+ this.match(ForgeParser.EXAMPLE_TOK);
58095
58465
  this.state = 915;
58096
- this.match(ForgeParser.IS_TOK);
58466
+ this.name();
58097
58467
  this.state = 916;
58098
- this.expr();
58468
+ this.match(ForgeParser.IS_TOK);
58099
58469
  this.state = 917;
58100
- this.match(ForgeParser.FOR_TOK);
58470
+ this.expr();
58101
58471
  this.state = 918;
58472
+ this.match(ForgeParser.FOR_TOK);
58473
+ this.state = 919;
58102
58474
  this.bounds();
58103
58475
  }
58104
58476
  }
@@ -58124,15 +58496,15 @@ class ForgeParser extends Parser_1.Parser {
58124
58496
  try {
58125
58497
  this.enterOuterAlt(_localctx, 1);
58126
58498
  {
58127
- this.state = 920;
58128
- this.name();
58129
58499
  this.state = 921;
58130
- this.match(ForgeParser.COLON_TOK);
58500
+ this.name();
58131
58501
  this.state = 922;
58132
- this.arrowExpr();
58502
+ this.match(ForgeParser.COLON_TOK);
58133
58503
  this.state = 923;
58134
- this.match(ForgeParser.EQ_TOK);
58504
+ this.arrowExpr();
58135
58505
  this.state = 924;
58506
+ this.match(ForgeParser.EQ_TOK);
58507
+ this.state = 925;
58136
58508
  this.expr();
58137
58509
  }
58138
58510
  }
@@ -58156,24 +58528,24 @@ class ForgeParser extends Parser_1.Parser {
58156
58528
  let _localctx = new NumberListContext(this._ctx, this.state);
58157
58529
  this.enterRule(_localctx, 152, ForgeParser.RULE_numberList);
58158
58530
  try {
58159
- this.state = 931;
58531
+ this.state = 932;
58160
58532
  this._errHandler.sync(this);
58161
58533
  switch (this.interpreter.adaptivePredict(this._input, 105, this._ctx)) {
58162
58534
  case 1:
58163
58535
  this.enterOuterAlt(_localctx, 1);
58164
58536
  {
58165
- this.state = 926;
58537
+ this.state = 927;
58166
58538
  this.number();
58167
58539
  }
58168
58540
  break;
58169
58541
  case 2:
58170
58542
  this.enterOuterAlt(_localctx, 2);
58171
58543
  {
58172
- this.state = 927;
58173
- this.number();
58174
58544
  this.state = 928;
58175
- this.match(ForgeParser.COMMA_TOK);
58545
+ this.number();
58176
58546
  this.state = 929;
58547
+ this.match(ForgeParser.COMMA_TOK);
58548
+ this.state = 930;
58177
58549
  this.numberList();
58178
58550
  }
58179
58551
  break;
@@ -58201,7 +58573,7 @@ class ForgeParser extends Parser_1.Parser {
58201
58573
  try {
58202
58574
  this.enterOuterAlt(_localctx, 1);
58203
58575
  {
58204
- this.state = 933;
58576
+ this.state = 934;
58205
58577
  this.match(ForgeParser.NUM_CONST_TOK);
58206
58578
  }
58207
58579
  }
@@ -58226,29 +58598,29 @@ class ForgeParser extends Parser_1.Parser {
58226
58598
  this.enterRule(_localctx, 156, ForgeParser.RULE_bounds);
58227
58599
  let _la;
58228
58600
  try {
58229
- this.state = 947;
58601
+ this.state = 948;
58230
58602
  this._errHandler.sync(this);
58231
58603
  switch (this._input.LA(1)) {
58232
58604
  case ForgeParser.LEFT_CURLY_TOK:
58233
58605
  this.enterOuterAlt(_localctx, 1);
58234
58606
  {
58235
- this.state = 935;
58607
+ this.state = 936;
58236
58608
  this.match(ForgeParser.LEFT_CURLY_TOK);
58237
- this.state = 939;
58609
+ this.state = 940;
58238
58610
  this._errHandler.sync(this);
58239
58611
  _la = this._input.LA(1);
58240
58612
  while (_la === ForgeParser.MINUS_TOK || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & ((1 << (ForgeParser.CARD_TOK - 74)) | (1 << (ForgeParser.BACKQUOTE_TOK - 74)) | (1 << (ForgeParser.THIS_TOK - 74)) | (1 << (ForgeParser.NO_TOK - 74)) | (1 << (ForgeParser.SUM_TOK - 74)) | (1 << (ForgeParser.INT_TOK - 74)))) !== 0) || ((((_la - 107)) & ~0x1F) === 0 && ((1 << (_la - 107)) & ((1 << (ForgeParser.NUM_CONST_TOK - 107)) | (1 << (ForgeParser.QUOTED_IDENTIFIER_TOK - 107)) | (1 << (ForgeParser.IDENTIFIER_TOK - 107)))) !== 0)) {
58241
58613
  {
58242
58614
  {
58243
- this.state = 936;
58615
+ this.state = 937;
58244
58616
  this.bound();
58245
58617
  }
58246
58618
  }
58247
- this.state = 941;
58619
+ this.state = 942;
58248
58620
  this._errHandler.sync(this);
58249
58621
  _la = this._input.LA(1);
58250
58622
  }
58251
- this.state = 942;
58623
+ this.state = 943;
58252
58624
  this.match(ForgeParser.RIGHT_CURLY_TOK);
58253
58625
  }
58254
58626
  break;
@@ -58260,16 +58632,16 @@ class ForgeParser extends Parser_1.Parser {
58260
58632
  case ForgeParser.IDENTIFIER_TOK:
58261
58633
  this.enterOuterAlt(_localctx, 2);
58262
58634
  {
58263
- this.state = 944;
58635
+ this.state = 945;
58264
58636
  this._errHandler.sync(this);
58265
58637
  _la = this._input.LA(1);
58266
58638
  if (_la === ForgeParser.EXACTLY_TOK) {
58267
58639
  {
58268
- this.state = 943;
58640
+ this.state = 944;
58269
58641
  this.match(ForgeParser.EXACTLY_TOK);
58270
58642
  }
58271
58643
  }
58272
- this.state = 946;
58644
+ this.state = 947;
58273
58645
  this.qualName();
58274
58646
  }
58275
58647
  break;
@@ -58297,31 +58669,31 @@ class ForgeParser extends Parser_1.Parser {
58297
58669
  let _localctx = new AtomNameOrNumberContext(this._ctx, this.state);
58298
58670
  this.enterRule(_localctx, 158, ForgeParser.RULE_atomNameOrNumber);
58299
58671
  try {
58300
- this.state = 954;
58672
+ this.state = 955;
58301
58673
  this._errHandler.sync(this);
58302
58674
  switch (this._input.LA(1)) {
58303
58675
  case ForgeParser.BACKQUOTE_TOK:
58304
58676
  this.enterOuterAlt(_localctx, 1);
58305
58677
  {
58306
- this.state = 949;
58307
- this.match(ForgeParser.BACKQUOTE_TOK);
58308
58678
  this.state = 950;
58679
+ this.match(ForgeParser.BACKQUOTE_TOK);
58680
+ this.state = 951;
58309
58681
  this.name();
58310
58682
  }
58311
58683
  break;
58312
58684
  case ForgeParser.NUM_CONST_TOK:
58313
58685
  this.enterOuterAlt(_localctx, 2);
58314
58686
  {
58315
- this.state = 951;
58687
+ this.state = 952;
58316
58688
  this.number();
58317
58689
  }
58318
58690
  break;
58319
58691
  case ForgeParser.MINUS_TOK:
58320
58692
  this.enterOuterAlt(_localctx, 3);
58321
58693
  {
58322
- this.state = 952;
58323
- this.match(ForgeParser.MINUS_TOK);
58324
58694
  this.state = 953;
58695
+ this.match(ForgeParser.MINUS_TOK);
58696
+ this.state = 954;
58325
58697
  this.number();
58326
58698
  }
58327
58699
  break;
@@ -58349,33 +58721,33 @@ class ForgeParser extends Parser_1.Parser {
58349
58721
  let _localctx = new BoundContext(this._ctx, this.state);
58350
58722
  this.enterRule(_localctx, 160, ForgeParser.RULE_bound);
58351
58723
  try {
58352
- this.state = 963;
58724
+ this.state = 964;
58353
58725
  this._errHandler.sync(this);
58354
58726
  switch (this.interpreter.adaptivePredict(this._input, 110, this._ctx)) {
58355
58727
  case 1:
58356
58728
  this.enterOuterAlt(_localctx, 1);
58357
58729
  {
58358
- this.state = 956;
58359
- this.boundLHS();
58360
58730
  this.state = 957;
58361
- this.compareOp();
58731
+ this.boundLHS();
58362
58732
  this.state = 958;
58733
+ this.compareOp();
58734
+ this.state = 959;
58363
58735
  this.bindRHSUnion(0);
58364
58736
  }
58365
58737
  break;
58366
58738
  case 2:
58367
58739
  this.enterOuterAlt(_localctx, 2);
58368
58740
  {
58369
- this.state = 960;
58370
- this.match(ForgeParser.NO_TOK);
58371
58741
  this.state = 961;
58742
+ this.match(ForgeParser.NO_TOK);
58743
+ this.state = 962;
58372
58744
  this.boundLHS();
58373
58745
  }
58374
58746
  break;
58375
58747
  case 3:
58376
58748
  this.enterOuterAlt(_localctx, 3);
58377
58749
  {
58378
- this.state = 962;
58750
+ this.state = 963;
58379
58751
  this.qualName();
58380
58752
  }
58381
58753
  break;
@@ -58402,15 +58774,15 @@ class ForgeParser extends Parser_1.Parser {
58402
58774
  this.enterRule(_localctx, 162, ForgeParser.RULE_boundLHS);
58403
58775
  let _la;
58404
58776
  try {
58405
- this.state = 975;
58777
+ this.state = 976;
58406
58778
  this._errHandler.sync(this);
58407
58779
  switch (this._input.LA(1)) {
58408
58780
  case ForgeParser.CARD_TOK:
58409
58781
  this.enterOuterAlt(_localctx, 1);
58410
58782
  {
58411
- this.state = 965;
58412
- this.match(ForgeParser.CARD_TOK);
58413
58783
  this.state = 966;
58784
+ this.match(ForgeParser.CARD_TOK);
58785
+ this.state = 967;
58414
58786
  this.qualName();
58415
58787
  }
58416
58788
  break;
@@ -58421,7 +58793,7 @@ class ForgeParser extends Parser_1.Parser {
58421
58793
  case ForgeParser.IDENTIFIER_TOK:
58422
58794
  this.enterOuterAlt(_localctx, 2);
58423
58795
  {
58424
- this.state = 967;
58796
+ this.state = 968;
58425
58797
  this.qualName();
58426
58798
  }
58427
58799
  break;
@@ -58430,21 +58802,21 @@ class ForgeParser extends Parser_1.Parser {
58430
58802
  case ForgeParser.NUM_CONST_TOK:
58431
58803
  this.enterOuterAlt(_localctx, 3);
58432
58804
  {
58433
- this.state = 968;
58805
+ this.state = 969;
58434
58806
  this.atomNameOrNumber();
58435
- this.state = 971;
58807
+ this.state = 972;
58436
58808
  this._errHandler.sync(this);
58437
58809
  _la = this._input.LA(1);
58438
58810
  do {
58439
58811
  {
58440
58812
  {
58441
- this.state = 969;
58442
- this.match(ForgeParser.DOT_TOK);
58443
58813
  this.state = 970;
58814
+ this.match(ForgeParser.DOT_TOK);
58815
+ this.state = 971;
58444
58816
  this.qualName();
58445
58817
  }
58446
58818
  }
58447
- this.state = 973;
58819
+ this.state = 974;
58448
58820
  this._errHandler.sync(this);
58449
58821
  _la = this._input.LA(1);
58450
58822
  } while (_la === ForgeParser.DOT_TOK);
@@ -58484,28 +58856,28 @@ class ForgeParser extends Parser_1.Parser {
58484
58856
  let _alt;
58485
58857
  this.enterOuterAlt(_localctx, 1);
58486
58858
  {
58487
- this.state = 983;
58859
+ this.state = 984;
58488
58860
  this._errHandler.sync(this);
58489
58861
  switch (this.interpreter.adaptivePredict(this._input, 113, this._ctx)) {
58490
58862
  case 1:
58491
58863
  {
58492
- this.state = 978;
58864
+ this.state = 979;
58493
58865
  this.bindRHSProduct(0);
58494
58866
  }
58495
58867
  break;
58496
58868
  case 2:
58497
58869
  {
58498
- this.state = 979;
58499
- this.match(ForgeParser.LEFT_PAREN_TOK);
58500
58870
  this.state = 980;
58501
- this.bindRHSUnion(0);
58871
+ this.match(ForgeParser.LEFT_PAREN_TOK);
58502
58872
  this.state = 981;
58873
+ this.bindRHSUnion(0);
58874
+ this.state = 982;
58503
58875
  this.match(ForgeParser.RIGHT_PAREN_TOK);
58504
58876
  }
58505
58877
  break;
58506
58878
  }
58507
58879
  this._ctx._stop = this._input.tryLT(-1);
58508
- this.state = 990;
58880
+ this.state = 991;
58509
58881
  this._errHandler.sync(this);
58510
58882
  _alt = this.interpreter.adaptivePredict(this._input, 114, this._ctx);
58511
58883
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -58518,18 +58890,18 @@ class ForgeParser extends Parser_1.Parser {
58518
58890
  {
58519
58891
  _localctx = new BindRHSUnionContext(_parentctx, _parentState);
58520
58892
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_bindRHSUnion);
58521
- this.state = 985;
58893
+ this.state = 986;
58522
58894
  if (!(this.precpred(this._ctx, 2))) {
58523
58895
  throw this.createFailedPredicateException("this.precpred(this._ctx, 2)");
58524
58896
  }
58525
- this.state = 986;
58526
- this.match(ForgeParser.PLUS_TOK);
58527
58897
  this.state = 987;
58898
+ this.match(ForgeParser.PLUS_TOK);
58899
+ this.state = 988;
58528
58900
  this.bindRHSProduct(0);
58529
58901
  }
58530
58902
  }
58531
58903
  }
58532
- this.state = 992;
58904
+ this.state = 993;
58533
58905
  this._errHandler.sync(this);
58534
58906
  _alt = this.interpreter.adaptivePredict(this._input, 114, this._ctx);
58535
58907
  }
@@ -58566,28 +58938,28 @@ class ForgeParser extends Parser_1.Parser {
58566
58938
  let _alt;
58567
58939
  this.enterOuterAlt(_localctx, 1);
58568
58940
  {
58569
- this.state = 999;
58941
+ this.state = 1000;
58570
58942
  this._errHandler.sync(this);
58571
58943
  switch (this.interpreter.adaptivePredict(this._input, 115, this._ctx)) {
58572
58944
  case 1:
58573
58945
  {
58574
- this.state = 994;
58575
- this.match(ForgeParser.LEFT_PAREN_TOK);
58576
58946
  this.state = 995;
58577
- this.bindRHSProduct(0);
58947
+ this.match(ForgeParser.LEFT_PAREN_TOK);
58578
58948
  this.state = 996;
58949
+ this.bindRHSProduct(0);
58950
+ this.state = 997;
58579
58951
  this.match(ForgeParser.RIGHT_PAREN_TOK);
58580
58952
  }
58581
58953
  break;
58582
58954
  case 2:
58583
58955
  {
58584
- this.state = 998;
58956
+ this.state = 999;
58585
58957
  this.bindRHSProductBase();
58586
58958
  }
58587
58959
  break;
58588
58960
  }
58589
58961
  this._ctx._stop = this._input.tryLT(-1);
58590
- this.state = 1006;
58962
+ this.state = 1007;
58591
58963
  this._errHandler.sync(this);
58592
58964
  _alt = this.interpreter.adaptivePredict(this._input, 116, this._ctx);
58593
58965
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -58600,11 +58972,11 @@ class ForgeParser extends Parser_1.Parser {
58600
58972
  {
58601
58973
  _localctx = new BindRHSProductContext(_parentctx, _parentState);
58602
58974
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_bindRHSProduct);
58603
- this.state = 1001;
58975
+ this.state = 1002;
58604
58976
  if (!(this.precpred(this._ctx, 2))) {
58605
58977
  throw this.createFailedPredicateException("this.precpred(this._ctx, 2)");
58606
58978
  }
58607
- this.state = 1002;
58979
+ this.state = 1003;
58608
58980
  _la = this._input.LA(1);
58609
58981
  if (!(_la === ForgeParser.ARROW_TOK || _la === ForgeParser.COMMA_TOK)) {
58610
58982
  this._errHandler.recoverInline(this);
@@ -58616,12 +58988,12 @@ class ForgeParser extends Parser_1.Parser {
58616
58988
  this._errHandler.reportMatch(this);
58617
58989
  this.consume();
58618
58990
  }
58619
- this.state = 1003;
58991
+ this.state = 1004;
58620
58992
  this.bindRHSProductBase();
58621
58993
  }
58622
58994
  }
58623
58995
  }
58624
- this.state = 1008;
58996
+ this.state = 1009;
58625
58997
  this._errHandler.sync(this);
58626
58998
  _alt = this.interpreter.adaptivePredict(this._input, 116, this._ctx);
58627
58999
  }
@@ -58647,7 +59019,7 @@ class ForgeParser extends Parser_1.Parser {
58647
59019
  let _localctx = new BindRHSProductBaseContext(this._ctx, this.state);
58648
59020
  this.enterRule(_localctx, 168, ForgeParser.RULE_bindRHSProductBase);
58649
59021
  try {
58650
- this.state = 1015;
59022
+ this.state = 1016;
58651
59023
  this._errHandler.sync(this);
58652
59024
  switch (this._input.LA(1)) {
58653
59025
  case ForgeParser.MINUS_TOK:
@@ -58655,7 +59027,7 @@ class ForgeParser extends Parser_1.Parser {
58655
59027
  case ForgeParser.NUM_CONST_TOK:
58656
59028
  this.enterOuterAlt(_localctx, 1);
58657
59029
  {
58658
- this.state = 1009;
59030
+ this.state = 1010;
58659
59031
  this.atomNameOrNumber();
58660
59032
  }
58661
59033
  break;
@@ -58666,18 +59038,18 @@ class ForgeParser extends Parser_1.Parser {
58666
59038
  case ForgeParser.IDENTIFIER_TOK:
58667
59039
  this.enterOuterAlt(_localctx, 2);
58668
59040
  {
58669
- this.state = 1010;
59041
+ this.state = 1011;
58670
59042
  this.qualName();
58671
59043
  }
58672
59044
  break;
58673
59045
  case ForgeParser.LEFT_PAREN_TOK:
58674
59046
  this.enterOuterAlt(_localctx, 3);
58675
59047
  {
58676
- this.state = 1011;
58677
- this.match(ForgeParser.LEFT_PAREN_TOK);
58678
59048
  this.state = 1012;
58679
- this.bindRHSUnion(0);
59049
+ this.match(ForgeParser.LEFT_PAREN_TOK);
58680
59050
  this.state = 1013;
59051
+ this.bindRHSUnion(0);
59052
+ this.state = 1014;
58681
59053
  this.match(ForgeParser.RIGHT_PAREN_TOK);
58682
59054
  }
58683
59055
  break;
@@ -58852,7 +59224,7 @@ ForgeParser.OPEN_TOK = 1;
58852
59224
  ForgeParser.LEFT_SQUARE_TOK = 2;
58853
59225
  ForgeParser.RIGHT_SQUARE_TOK = 3;
58854
59226
  ForgeParser.AS_TOK = 4;
58855
- ForgeParser.FILE_PATH_TOK = 5;
59227
+ ForgeParser.STRING_TOK = 5;
58856
59228
  ForgeParser.VAR_TOK = 6;
58857
59229
  ForgeParser.ABSTRACT_TOK = 7;
58858
59230
  ForgeParser.SIG_TOK = 8;
@@ -59083,7 +59455,7 @@ ForgeParser._LITERAL_NAMES = [
59083
59455
  ];
59084
59456
  ForgeParser._SYMBOLIC_NAMES = [
59085
59457
  undefined, "OPEN_TOK", "LEFT_SQUARE_TOK", "RIGHT_SQUARE_TOK", "AS_TOK",
59086
- "FILE_PATH_TOK", "VAR_TOK", "ABSTRACT_TOK", "SIG_TOK", "LEFT_CURLY_TOK",
59458
+ "STRING_TOK", "VAR_TOK", "ABSTRACT_TOK", "SIG_TOK", "LEFT_CURLY_TOK",
59087
59459
  "RIGHT_CURLY_TOK", "EXTENDS_TOK", "IN_TOK", "PLUS_TOK", "LONE_TOK", "SOME_TOK",
59088
59460
  "ONE_TOK", "TWO_TOK", "SET_TOK", "FUNC_TOK", "PFUNC_TOK", "DISJ_TOK",
59089
59461
  "COLON_TOK", "WHEAT_TOK", "PRED_TOK", "DOT_TOK", "FUN_TOK", "LEFT_PAREN_TOK",
@@ -59105,7 +59477,7 @@ ForgeParser._SYMBOLIC_NAMES = [
59105
59477
  ];
59106
59478
  ForgeParser.VOCABULARY = new VocabularyImpl_1.VocabularyImpl(ForgeParser._LITERAL_NAMES, ForgeParser._SYMBOLIC_NAMES, []);
59107
59479
  ForgeParser._serializedATNSegments = 2;
59108
- ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03t\u03FC\x04\x02" +
59480
+ ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03t\u03FD\x04\x02" +
59109
59481
  "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" +
59110
59482
  "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" +
59111
59483
  "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" +
@@ -59148,57 +59520,57 @@ ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\u
59148
59520
  "\n\x16\f\x16\x0E\x16\u0198\v\x16\x03\x16\x03\x16\x03\x17\x03\x17\x03\x17" +
59149
59521
  "\x03\x17\x05\x17\u01A0\n\x17\x03\x17\x03\x17\x05\x17\u01A4\n\x17\x03\x18" +
59150
59522
  "\x05\x18\u01A7\n\x18\x03\x18\x03\x18\x03\x18\x03\x19\x03\x19\x03\x19\x03" +
59151
- "\x19\x05\x19\u01B0\n\x19\x03\x19\x05\x19\u01B3\n\x19\x03\x1A\x03\x1A\x03" +
59152
- "\x1A\x03\x1A\x03\x1A\x05\x1A\u01BA\n\x1A\x03\x1A\x03\x1A\x05\x1A\u01BE" +
59153
- "\n\x1A\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u01C3\n\x1B\x03\x1B\x03\x1B\x03" +
59154
- "\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05" +
59155
- "\x1B\u01D0\n\x1B\x03\x1B\x05\x1B\u01D3\n\x1B\x03\x1B\x03\x1B\x05\x1B\u01D7" +
59156
- "\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C" +
59157
- "\u01E0\n\x1C\x03\x1C\x03\x1C\x05\x1C\u01E4\n\x1C\x03\x1D\x03\x1D\x03\x1D" +
59158
- "\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x05\x1D\u01ED\n\x1D\x03\x1D\x03\x1D\x05" +
59159
- "\x1D\u01F1\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x07\x1E" +
59160
- "\u01F9\n\x1E\f\x1E\x0E\x1E\u01FC\v\x1E\x03\x1E\x03\x1E\x03\x1F\x03\x1F" +
59161
- "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x05\x1F\u0206\n\x1F\x03 \x03 \x05 \u020A" +
59162
- "\n \x03 \x03 \x03 \x05 \u020F\n \x03!\x03!\x03\"\x03\"\x03\"\x03\"\x03" +
59163
- "#\x03#\x07#\u0219\n#\f#\x0E#\u021C\v#\x03#\x03#\x03$\x03$\x03$\x05$\u0223" +
59164
- "\n$\x03%\x03%\x03%\x03%\x05%\u0229\n%\x03&\x03&\x05&\u022D\n&\x03&\x03" +
59165
- "&\x03&\x07&\u0232\n&\f&\x0E&\u0235\v&\x03&\x03&\x03&\x05&\u023A\n&\x03" +
59166
- "\'\x03\'\x03\'\x03\'\x03\'\x05\'\u0241\n\'\x03\'\x05\'\u0244\n\'\x03(" +
59167
- "\x03(\x03)\x03)\x03)\x03)\x03)\x05)\u024D\n)\x03*\x03*\x03*\x03*\x03*" +
59168
- "\x05*\u0254\n*\x03+\x03+\x03+\x03+\x03+\x05+\u025B\n+\x03,\x03,\x03,\x03" +
59169
- ",\x03,\x05,\u0262\n,\x03-\x03-\x03-\x03-\x03-\x05-\u0269\n-\x03.\x03." +
59170
- "\x03.\x03.\x03.\x05.\u0270\n.\x03/\x03/\x03/\x03/\x03/\x05/\u0277\n/\x03" +
59171
- "0\x030\x030\x030\x030\x050\u027E\n0\x031\x031\x031\x031\x031\x031\x03" +
59172
- "1\x031\x031\x031\x031\x051\u028B\n1\x031\x031\x031\x051\u0290\n1\x032" +
59173
- "\x032\x032\x032\x032\x032\x072\u0298\n2\f2\x0E2\u029B\v2\x033\x033\x03" +
59174
- "3\x033\x033\x033\x073\u02A3\n3\f3\x0E3\u02A6\v3\x034\x034\x034\x034\x03" +
59175
- "4\x034\x074\u02AE\n4\f4\x0E4\u02B1\v4\x035\x035\x035\x035\x035\x035\x05" +
59176
- "5\u02B9\n5\x055\u02BB\n5\x036\x036\x036\x036\x036\x036\x076\u02C3\n6\f" +
59177
- "6\x0E6\u02C6\v6\x037\x037\x037\x037\x037\x037\x037\x037\x037\x037\x03" +
59178
- "7\x037\x037\x037\x037\x037\x037\x057\u02D9\n7\x038\x038\x038\x038\x03" +
59179
- "8\x038\x038\x038\x038\x038\x038\x038\x038\x038\x038\x058\u02EA\n8\x03" +
59180
- "9\x039\x039\x039\x039\x059\u02F1\n9\x039\x039\x039\x079\u02F6\n9\f9\x0E" +
59181
- "9\u02F9\v9\x03:\x03:\x03:\x05:\u02FE\n:\x03;\x03;\x03;\x03;\x03;\x03;" +
59182
- "\x07;\u0306\n;\f;\x0E;\u0309\v;\x03<\x03<\x03<\x05<\u030E\n<\x03=\x03" +
59183
- "=\x03=\x03=\x03=\x03=\x07=\u0316\n=\f=\x0E=\u0319\v=\x03>\x03>\x03>\x03" +
59184
- ">\x03>\x03>\x07>\u0321\n>\f>\x0E>\u0324\v>\x03?\x03?\x03?\x03?\x03?\x03" +
59185
- "?\x03?\x07?\u032D\n?\f?\x0E?\u0330\v?\x03@\x03@\x03@\x03@\x03@\x03@\x07" +
59186
- "@\u0338\n@\f@\x0E@\u033B\v@\x03A\x03A\x03A\x03A\x03A\x03A\x03A\x03A\x07" +
59187
- "A\u0345\nA\fA\x0EA\u0348\vA\x03B\x03B\x03B\x03B\x03B\x03B\x03B\x05B\u0351" +
59188
- "\nB\x03B\x03B\x03B\x07B\u0356\nB\fB\x0EB\u0359\vB\x03C\x03C\x03C\x03C" +
59189
- "\x03C\x07C\u0360\nC\fC\x0EC\u0363\vC\x03D\x03D\x03D\x05D\u0368\nD\x03" +
59190
- "E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03" +
59191
- "E\x03E\x03E\x03E\x05E\u037C\nE\x03F\x03F\x03F\x03F\x03F\x05F\u0383\nF" +
59192
- "\x03G\x03G\x03H\x03H\x03I\x03I\x03I\x03I\x05I\u038D\nI\x03J\x03J\x03K" +
59193
- "\x03K\x03K\x03L\x03L\x03L\x03L\x03L\x03L\x03L\x03M\x03M\x03M\x03M\x03" +
59194
- "M\x03M\x03N\x03N\x03N\x03N\x03N\x05N\u03A6\nN\x03O\x03O\x03P\x03P\x07" +
59195
- "P\u03AC\nP\fP\x0EP\u03AF\vP\x03P\x03P\x05P\u03B3\nP\x03P\x05P\u03B6\n" +
59196
- "P\x03Q\x03Q\x03Q\x03Q\x03Q\x05Q\u03BD\nQ\x03R\x03R\x03R\x03R\x03R\x03" +
59197
- "R\x03R\x05R\u03C6\nR\x03S\x03S\x03S\x03S\x03S\x03S\x06S\u03CE\nS\rS\x0E" +
59198
- "S\u03CF\x05S\u03D2\nS\x03T\x03T\x03T\x03T\x03T\x03T\x05T\u03DA\nT\x03" +
59199
- "T\x03T\x03T\x07T\u03DF\nT\fT\x0ET\u03E2\vT\x03U\x03U\x03U\x03U\x03U\x03" +
59200
- "U\x05U\u03EA\nU\x03U\x03U\x03U\x07U\u03EF\nU\fU\x0EU\u03F2\vU\x03V\x03" +
59201
- "V\x03V\x03V\x03V\x03V\x05V\u03FA\nV\x03V\x02\x02\x11bdfjptxz|~\x80\x82" +
59523
+ "\x19\x05\x19\u01B0\n\x19\x03\x19\x03\x19\x05\x19\u01B4\n\x19\x03\x1A\x03" +
59524
+ "\x1A\x03\x1A\x03\x1A\x03\x1A\x05\x1A\u01BB\n\x1A\x03\x1A\x03\x1A\x05\x1A" +
59525
+ "\u01BF\n\x1A\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u01C4\n\x1B\x03\x1B\x03\x1B" +
59526
+ "\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B" +
59527
+ "\x05\x1B\u01D1\n\x1B\x03\x1B\x05\x1B\u01D4\n\x1B\x03\x1B\x03\x1B\x05\x1B" +
59528
+ "\u01D8\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05" +
59529
+ "\x1C\u01E1\n\x1C\x03\x1C\x03\x1C\x05\x1C\u01E5\n\x1C\x03\x1D\x03\x1D\x03" +
59530
+ "\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x05\x1D\u01EE\n\x1D\x03\x1D\x03\x1D" +
59531
+ "\x05\x1D\u01F2\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x07" +
59532
+ "\x1E\u01FA\n\x1E\f\x1E\x0E\x1E\u01FD\v\x1E\x03\x1E\x03\x1E\x03\x1F\x03" +
59533
+ "\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x05\x1F\u0207\n\x1F\x03 \x03 \x05" +
59534
+ " \u020B\n \x03 \x03 \x03 \x05 \u0210\n \x03!\x03!\x03\"\x03\"\x03\"\x03" +
59535
+ "\"\x03#\x03#\x07#\u021A\n#\f#\x0E#\u021D\v#\x03#\x03#\x03$\x03$\x03$\x05" +
59536
+ "$\u0224\n$\x03%\x03%\x03%\x03%\x05%\u022A\n%\x03&\x03&\x05&\u022E\n&\x03" +
59537
+ "&\x03&\x03&\x07&\u0233\n&\f&\x0E&\u0236\v&\x03&\x03&\x03&\x05&\u023B\n" +
59538
+ "&\x03\'\x03\'\x03\'\x03\'\x03\'\x05\'\u0242\n\'\x03\'\x05\'\u0245\n\'" +
59539
+ "\x03(\x03(\x03)\x03)\x03)\x03)\x03)\x05)\u024E\n)\x03*\x03*\x03*\x03*" +
59540
+ "\x03*\x05*\u0255\n*\x03+\x03+\x03+\x03+\x03+\x05+\u025C\n+\x03,\x03,\x03" +
59541
+ ",\x03,\x03,\x05,\u0263\n,\x03-\x03-\x03-\x03-\x03-\x05-\u026A\n-\x03." +
59542
+ "\x03.\x03.\x03.\x03.\x05.\u0271\n.\x03/\x03/\x03/\x03/\x03/\x05/\u0278" +
59543
+ "\n/\x030\x030\x030\x030\x030\x050\u027F\n0\x031\x031\x031\x031\x031\x03" +
59544
+ "1\x031\x031\x031\x031\x031\x051\u028C\n1\x031\x031\x031\x051\u0291\n1" +
59545
+ "\x032\x032\x032\x032\x032\x032\x072\u0299\n2\f2\x0E2\u029C\v2\x033\x03" +
59546
+ "3\x033\x033\x033\x033\x073\u02A4\n3\f3\x0E3\u02A7\v3\x034\x034\x034\x03" +
59547
+ "4\x034\x034\x074\u02AF\n4\f4\x0E4\u02B2\v4\x035\x035\x035\x035\x035\x03" +
59548
+ "5\x055\u02BA\n5\x055\u02BC\n5\x036\x036\x036\x036\x036\x036\x076\u02C4" +
59549
+ "\n6\f6\x0E6\u02C7\v6\x037\x037\x037\x037\x037\x037\x037\x037\x037\x03" +
59550
+ "7\x037\x037\x037\x037\x037\x037\x037\x057\u02DA\n7\x038\x038\x038\x03" +
59551
+ "8\x038\x038\x038\x038\x038\x038\x038\x038\x038\x038\x038\x058\u02EB\n" +
59552
+ "8\x039\x039\x039\x039\x039\x059\u02F2\n9\x039\x039\x039\x079\u02F7\n9" +
59553
+ "\f9\x0E9\u02FA\v9\x03:\x03:\x03:\x05:\u02FF\n:\x03;\x03;\x03;\x03;\x03" +
59554
+ ";\x03;\x07;\u0307\n;\f;\x0E;\u030A\v;\x03<\x03<\x03<\x05<\u030F\n<\x03" +
59555
+ "=\x03=\x03=\x03=\x03=\x03=\x07=\u0317\n=\f=\x0E=\u031A\v=\x03>\x03>\x03" +
59556
+ ">\x03>\x03>\x03>\x07>\u0322\n>\f>\x0E>\u0325\v>\x03?\x03?\x03?\x03?\x03" +
59557
+ "?\x03?\x03?\x07?\u032E\n?\f?\x0E?\u0331\v?\x03@\x03@\x03@\x03@\x03@\x03" +
59558
+ "@\x07@\u0339\n@\f@\x0E@\u033C\v@\x03A\x03A\x03A\x03A\x03A\x03A\x03A\x03" +
59559
+ "A\x07A\u0346\nA\fA\x0EA\u0349\vA\x03B\x03B\x03B\x03B\x03B\x03B\x03B\x05" +
59560
+ "B\u0352\nB\x03B\x03B\x03B\x07B\u0357\nB\fB\x0EB\u035A\vB\x03C\x03C\x03" +
59561
+ "C\x03C\x03C\x07C\u0361\nC\fC\x0EC\u0364\vC\x03D\x03D\x03D\x05D\u0369\n" +
59562
+ "D\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03" +
59563
+ "E\x03E\x03E\x03E\x03E\x05E\u037D\nE\x03F\x03F\x03F\x03F\x03F\x05F\u0384" +
59564
+ "\nF\x03G\x03G\x03H\x03H\x03I\x03I\x03I\x03I\x05I\u038E\nI\x03J\x03J\x03" +
59565
+ "K\x03K\x03K\x03L\x03L\x03L\x03L\x03L\x03L\x03L\x03M\x03M\x03M\x03M\x03" +
59566
+ "M\x03M\x03N\x03N\x03N\x03N\x03N\x05N\u03A7\nN\x03O\x03O\x03P\x03P\x07" +
59567
+ "P\u03AD\nP\fP\x0EP\u03B0\vP\x03P\x03P\x05P\u03B4\nP\x03P\x05P\u03B7\n" +
59568
+ "P\x03Q\x03Q\x03Q\x03Q\x03Q\x05Q\u03BE\nQ\x03R\x03R\x03R\x03R\x03R\x03" +
59569
+ "R\x03R\x05R\u03C7\nR\x03S\x03S\x03S\x03S\x03S\x03S\x06S\u03CF\nS\rS\x0E" +
59570
+ "S\u03D0\x05S\u03D3\nS\x03T\x03T\x03T\x03T\x03T\x03T\x05T\u03DB\nT\x03" +
59571
+ "T\x03T\x03T\x07T\u03E0\nT\fT\x0ET\u03E3\vT\x03U\x03U\x03U\x03U\x03U\x03" +
59572
+ "U\x05U\u03EB\nU\x03U\x03U\x03U\x07U\u03F0\nU\fU\x0EU\u03F3\vU\x03V\x03" +
59573
+ "V\x03V\x03V\x03V\x03V\x05V\u03FB\nV\x03V\x02\x02\x11bdfjptxz|~\x80\x82" +
59202
59574
  "\x84\xA6\xA8W\x02\x02\x04\x02\x06\x02\b\x02\n\x02\f\x02\x0E\x02\x10\x02" +
59203
59575
  "\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E\x02 \x02\"\x02$\x02" +
59204
59576
  "&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02" +
@@ -59210,7 +59582,7 @@ ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\u
59210
59582
  "\x04\x02\x10\x10\x12\x16\x05\x02\x10\x10\x12\x12\x14\x16\x03\x02 !\x03" +
59211
59583
  "\x02*.\x04\x02*+--\x03\x0245\x03\x0267\x05\x02\x0E\x0E))af\x03\x02no\x04" +
59212
59584
  "\x02\x10\x14gg\x04\x02\x0F\x0F((\x03\x02OP\x04\x02RT]`\x04\x02\\\\kk\x02" +
59213
- "\u044E\x02\xAC\x03\x02\x02\x02\x04\xBB\x03\x02\x02\x02\x06\xD0\x03\x02" +
59585
+ "\u0450\x02\xAC\x03\x02\x02\x02\x04\xBB\x03\x02\x02\x02\x06\xD0\x03\x02" +
59214
59586
  "\x02\x02\b\xE4\x03\x02\x02\x02\n\xF7\x03\x02\x02\x02\f\xFA\x03\x02\x02" +
59215
59587
  "\x02\x0E\u011A\x03\x02\x02\x02\x10\u011C\x03\x02\x02\x02\x12\u011E\x03" +
59216
59588
  "\x02\x02\x02\x14\u0120\x03\x02\x02\x02\x16\u0123\x03\x02\x02\x02\x18\u012D" +
@@ -59218,28 +59590,28 @@ ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\u
59218
59590
  "\u0140\x03\x02\x02\x02 \u015D\x03\x02\x02\x02\"\u015F\x03\x02\x02\x02" +
59219
59591
  "$\u0168\x03\x02\x02\x02&\u0179\x03\x02\x02\x02(\u018A\x03\x02\x02\x02" +
59220
59592
  "*\u0192\x03\x02\x02\x02,\u01A3\x03\x02\x02\x02.\u01A6\x03\x02\x02\x02" +
59221
- "0\u01B2\x03\x02\x02\x022\u01B4\x03\x02\x02\x024\u01BF\x03\x02\x02\x02" +
59222
- "6\u01D8\x03\x02\x02\x028\u01E5\x03\x02\x02\x02:\u01F2\x03\x02\x02\x02" +
59223
- "<\u0205\x03\x02\x02\x02>\u0209\x03\x02\x02\x02@\u0210\x03\x02\x02\x02" +
59224
- "B\u0212\x03\x02\x02\x02D\u0216\x03\x02\x02\x02F\u0222\x03\x02\x02\x02" +
59225
- "H\u0228\x03\x02\x02\x02J\u0239\x03\x02\x02\x02L\u023B\x03\x02\x02\x02" +
59226
- "N\u0245\x03\x02\x02\x02P\u024C\x03\x02\x02\x02R\u0253\x03\x02\x02\x02" +
59227
- "T\u025A\x03\x02\x02\x02V\u0261\x03\x02\x02\x02X\u0268\x03\x02\x02\x02" +
59228
- "Z\u026F\x03\x02\x02\x02\\\u0276\x03\x02\x02\x02^\u027D\x03\x02\x02\x02" +
59229
- "`\u028F\x03\x02\x02\x02b\u0291\x03\x02\x02\x02d\u029C\x03\x02\x02\x02" +
59230
- "f\u02A7\x03\x02\x02\x02h\u02BA\x03\x02\x02\x02j\u02BC\x03\x02\x02\x02" +
59231
- "l\u02D8\x03\x02\x02\x02n\u02E9\x03\x02\x02\x02p\u02EB\x03\x02\x02\x02" +
59232
- "r\u02FD\x03\x02\x02\x02t\u02FF\x03\x02\x02\x02v\u030D\x03\x02\x02\x02" +
59233
- "x\u030F\x03\x02\x02\x02z\u031A\x03\x02\x02\x02|\u0325\x03\x02\x02\x02" +
59234
- "~\u0331\x03\x02\x02\x02\x80\u033C\x03\x02\x02\x02\x82\u0350\x03\x02\x02" +
59235
- "\x02\x84\u035A\x03\x02\x02\x02\x86\u0367\x03\x02\x02\x02\x88\u037B\x03" +
59236
- "\x02\x02\x02\x8A\u0382\x03\x02\x02\x02\x8C\u0384\x03\x02\x02\x02\x8E\u0386" +
59237
- "\x03\x02\x02\x02\x90\u0388\x03\x02\x02\x02\x92\u038E\x03\x02\x02\x02\x94" +
59238
- "\u0390\x03\x02\x02\x02\x96\u0393\x03\x02\x02\x02\x98\u039A\x03\x02\x02" +
59239
- "\x02\x9A\u03A5\x03\x02\x02\x02\x9C\u03A7\x03\x02\x02\x02\x9E\u03B5\x03" +
59240
- "\x02\x02\x02\xA0\u03BC\x03\x02\x02\x02\xA2\u03C5\x03\x02\x02\x02\xA4\u03D1" +
59241
- "\x03\x02\x02\x02\xA6\u03D9\x03\x02\x02\x02\xA8\u03E9\x03\x02\x02\x02\xAA" +
59242
- "\u03F9\x03\x02\x02\x02\xAC\xAE\x07\x1A\x02\x02\xAD\xAF\x05\x1C\x0F\x02" +
59593
+ "0\u01B3\x03\x02\x02\x022\u01B5\x03\x02\x02\x024\u01C0\x03\x02\x02\x02" +
59594
+ "6\u01D9\x03\x02\x02\x028\u01E6\x03\x02\x02\x02:\u01F3\x03\x02\x02\x02" +
59595
+ "<\u0206\x03\x02\x02\x02>\u020A\x03\x02\x02\x02@\u0211\x03\x02\x02\x02" +
59596
+ "B\u0213\x03\x02\x02\x02D\u0217\x03\x02\x02\x02F\u0223\x03\x02\x02\x02" +
59597
+ "H\u0229\x03\x02\x02\x02J\u023A\x03\x02\x02\x02L\u023C\x03\x02\x02\x02" +
59598
+ "N\u0246\x03\x02\x02\x02P\u024D\x03\x02\x02\x02R\u0254\x03\x02\x02\x02" +
59599
+ "T\u025B\x03\x02\x02\x02V\u0262\x03\x02\x02\x02X\u0269\x03\x02\x02\x02" +
59600
+ "Z\u0270\x03\x02\x02\x02\\\u0277\x03\x02\x02\x02^\u027E\x03\x02\x02\x02" +
59601
+ "`\u0290\x03\x02\x02\x02b\u0292\x03\x02\x02\x02d\u029D\x03\x02\x02\x02" +
59602
+ "f\u02A8\x03\x02\x02\x02h\u02BB\x03\x02\x02\x02j\u02BD\x03\x02\x02\x02" +
59603
+ "l\u02D9\x03\x02\x02\x02n\u02EA\x03\x02\x02\x02p\u02EC\x03\x02\x02\x02" +
59604
+ "r\u02FE\x03\x02\x02\x02t\u0300\x03\x02\x02\x02v\u030E\x03\x02\x02\x02" +
59605
+ "x\u0310\x03\x02\x02\x02z\u031B\x03\x02\x02\x02|\u0326\x03\x02\x02\x02" +
59606
+ "~\u0332\x03\x02\x02\x02\x80\u033D\x03\x02\x02\x02\x82\u0351\x03\x02\x02" +
59607
+ "\x02\x84\u035B\x03\x02\x02\x02\x86\u0368\x03\x02\x02\x02\x88\u037C\x03" +
59608
+ "\x02\x02\x02\x8A\u0383\x03\x02\x02\x02\x8C\u0385\x03\x02\x02\x02\x8E\u0387" +
59609
+ "\x03\x02\x02\x02\x90\u0389\x03\x02\x02\x02\x92\u038F\x03\x02\x02\x02\x94" +
59610
+ "\u0391\x03\x02\x02\x02\x96\u0394\x03\x02\x02\x02\x98\u039B\x03\x02\x02" +
59611
+ "\x02\x9A\u03A6\x03\x02\x02\x02\x9C\u03A8\x03\x02\x02\x02\x9E\u03B6\x03" +
59612
+ "\x02\x02\x02\xA0\u03BD\x03\x02\x02\x02\xA2\u03C6\x03\x02\x02\x02\xA4\u03D2" +
59613
+ "\x03\x02\x02\x02\xA6\u03DA\x03\x02\x02\x02\xA8\u03EA\x03\x02\x02\x02\xAA" +
59614
+ "\u03FA\x03\x02\x02\x02\xAC\xAE\x07\x1A\x02\x02\xAD\xAF\x05\x1C\x0F\x02" +
59243
59615
  "\xAE\xAD\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB3\x03\x02\x02\x02" +
59244
59616
  "\xB0\xB1\x05J&\x02\xB1\xB2\x07\x1B\x02\x02\xB2\xB4\x03\x02\x02\x02\xB3" +
59245
59617
  "\xB0\x03\x02\x02\x02\xB3\xB4\x03\x02\x02\x02\xB4\xB5\x03\x02\x02\x02\xB5" +
@@ -59351,272 +59723,273 @@ ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\u
59351
59723
  "\x05\\/\x02\u01A3\u019B\x03\x02\x02\x02\u01A3\u01A1\x03\x02\x02\x02\u01A4" +
59352
59724
  "-\x03\x02\x02\x02\u01A5\u01A7\x07$\x02\x02\u01A6\u01A5\x03\x02\x02\x02" +
59353
59725
  "\u01A6\u01A7\x03\x02\x02\x02\u01A7\u01A8\x03\x02\x02\x02\u01A8\u01A9\x05" +
59354
- "\x9CO\x02\u01A9\u01AA\x05J&\x02\u01AA/\x03\x02\x02\x02\u01AB\u01B3\x07" +
59355
- "%\x02\x02\u01AC\u01B3\x07&\x02\x02\u01AD\u01B3\x07\'\x02\x02\u01AE\u01B0" +
59726
+ "\x9CO\x02\u01A9\u01AA\x05J&\x02\u01AA/\x03\x02\x02\x02\u01AB\u01B4\x07" +
59727
+ "%\x02\x02\u01AC\u01B4\x07&\x02\x02\u01AD\u01B4\x07\'\x02\x02\u01AE\u01B0" +
59356
59728
  "\x07(\x02\x02\u01AF\u01AE\x03\x02\x02\x02\u01AF\u01B0\x03\x02\x02\x02" +
59357
- "\u01B0\u01B1\x03\x02\x02\x02\u01B1\u01B3\x05\x9CO\x02\u01B2\u01AB\x03" +
59358
- "\x02\x02\x02\u01B2\u01AC\x03\x02\x02\x02\u01B2\u01AD\x03\x02\x02\x02\u01B2" +
59359
- "\u01AF\x03\x02\x02\x02\u01B31\x03\x02\x02\x02\u01B4\u01B5\x07\x1F\x02" +
59360
- "\x02\u01B5\u01B6\x05`1\x02\u01B6\u01B7\x07)\x02\x02\u01B7\u01B9\t\x07" +
59361
- "\x02\x02\u01B8\u01BA\x05,\x17\x02\u01B9\u01B8\x03\x02\x02\x02\u01B9\u01BA" +
59362
- "\x03\x02\x02\x02\u01BA\u01BD\x03\x02";
59363
- ForgeParser._serializedATNSegment1 = "\x02\x02\u01BB\u01BC\x07\"\x02\x02\u01BC\u01BE\x05\x9EP\x02\u01BD\u01BB" +
59364
- "\x03\x02\x02\x02\u01BD\u01BE\x03\x02\x02\x02\u01BE3\x03\x02\x02\x02\u01BF" +
59365
- "\u01C0\x07\x1F\x02\x02\u01C0\u01C2\x073\x02\x02\u01C1\u01C3\x07\x17\x02" +
59366
- "\x02\u01C2\u01C1\x03\x02\x02\x02\u01C2\u01C3\x03\x02\x02\x02\u01C3\u01C4" +
59367
- "\x03\x02\x02\x02\u01C4\u01C5\x05V,\x02\u01C5\u01C6\x072\x02\x02\u01C6" +
59368
- "\u01C7\x05`1\x02\u01C7\u01C8\x07)\x02\x02\u01C8\u01C9\t\b\x02\x02\u01C9" +
59369
- "\u01CA\x07\"\x02\x02\u01CA\u01CF\x05N(\x02\u01CB\u01CC\x07\x04\x02\x02" +
59370
- "\u01CC\u01CD\x05^0\x02\u01CD\u01CE\x07\x05\x02\x02\u01CE\u01D0\x03\x02" +
59371
- "\x02\x02\u01CF\u01CB\x03\x02\x02\x02\u01CF\u01D0\x03\x02\x02\x02\u01D0" +
59372
- "\u01D2\x03\x02\x02\x02\u01D1\u01D3\x05,\x17\x02\u01D2\u01D1\x03\x02\x02" +
59373
- "\x02\u01D2\u01D3\x03\x02\x02\x02\u01D3\u01D6\x03\x02\x02\x02\u01D4\u01D5" +
59374
- "\x07\"\x02\x02\u01D5\u01D7\x05\x9EP\x02\u01D6\u01D4\x03\x02\x02\x02\u01D6" +
59375
- "\u01D7\x03\x02\x02\x02\u01D75\x03\x02\x02\x02\u01D8\u01D9\x07\x1F\x02" +
59376
- "\x02\u01D9\u01DA\x05`1\x02\u01DA\u01DB\x07)\x02\x02\u01DB\u01DC\t\b\x02" +
59377
- "\x02\u01DC\u01DD\x07\"\x02\x02\u01DD\u01DF\x05N(\x02\u01DE\u01E0\x05," +
59378
- "\x17\x02\u01DF\u01DE\x03\x02\x02\x02\u01DF\u01E0\x03\x02\x02\x02\u01E0" +
59379
- "\u01E3\x03\x02\x02\x02\u01E1\u01E2\x07\"\x02\x02\u01E2\u01E4\x05\x9EP" +
59380
- "\x02\u01E3\u01E1\x03\x02\x02\x02\u01E3\u01E4\x03\x02\x02\x02\u01E47\x03" +
59381
- "\x02\x02\x02\u01E5\u01E6\x07\x1F\x02\x02\u01E6\u01E7\x05`1\x02\u01E7\u01E8" +
59382
- "\x07)\x02\x02\u01E8\u01E9\t\t\x02\x02\u01E9\u01EA\x078\x02\x02\u01EA\u01EC" +
59383
- "\x05N(\x02\u01EB\u01ED\x05,\x17\x02\u01EC\u01EB\x03\x02\x02\x02\u01EC" +
59384
- "\u01ED\x03\x02\x02\x02\u01ED\u01F0\x03\x02\x02\x02\u01EE\u01EF\x07\"\x02" +
59385
- "\x02\u01EF\u01F1\x05\x9EP\x02\u01F0\u01EE\x03\x02\x02\x02\u01F0\u01F1" +
59386
- "\x03\x02\x02\x02\u01F19\x03\x02\x02\x02\u01F2\u01F3\x07/\x02\x02\u01F3" +
59387
- "\u01F4\x071\x02\x02\u01F4\u01F5\x07\"\x02\x02\u01F5\u01F6\x05N(\x02\u01F6" +
59388
- "\u01FA\x07\v\x02\x02\u01F7\u01F9\x05<\x1F\x02\u01F8\u01F7\x03\x02\x02" +
59389
- "\x02\u01F9\u01FC\x03\x02\x02\x02\u01FA\u01F8\x03\x02\x02\x02\u01FA\u01FB" +
59390
- "\x03\x02\x02\x02\u01FB\u01FD\x03\x02\x02\x02\u01FC\u01FA\x03\x02\x02\x02" +
59391
- "\u01FD\u01FE\x07\f\x02\x02\u01FE;\x03\x02\x02\x02\u01FF\u0206\x05\x96" +
59392
- "L\x02\u0200\u0206\x05(\x15\x02\u0201\u0206\x054\x1B\x02\u0202\u0206\x05" +
59393
- "6\x1C\x02\u0203\u0206\x052\x1A\x02\u0204\u0206\x058\x1D\x02\u0205\u01FF" +
59394
- "\x03\x02\x02\x02\u0205\u0200\x03\x02\x02\x02\u0205\u0201\x03\x02\x02\x02" +
59395
- "\u0205\u0202\x03\x02\x02\x02\u0205\u0203\x03\x02\x02\x02\u0205\u0204\x03" +
59396
- "\x02\x02\x02\u0206=\x03\x02\x02\x02\u0207\u020A\x05\x10\t\x02\u0208\u020A" +
59397
- "\x07\x14\x02\x02\u0209\u0207\x03\x02\x02\x02\u0209\u0208\x03\x02\x02\x02" +
59398
- "\u0209\u020A\x03\x02\x02\x02\u020A\u020B\x03\x02\x02\x02\u020B\u020E\x07" +
59399
- "\\\x02\x02\u020C\u020F\x05\x10\t\x02\u020D\u020F\x07\x14\x02\x02\u020E" +
59400
- "\u020C\x03\x02\x02\x02\u020E\u020D\x03\x02\x02\x02\u020E\u020F\x03\x02" +
59401
- "\x02\x02\u020F?\x03\x02\x02\x02\u0210\u0211\t\n\x02\x02\u0211A\x03\x02" +
59402
- "\x02\x02\u0212\u0213\x05N(\x02\u0213\u0214\x07a\x02\x02\u0214\u0215\x05" +
59403
- "`1\x02\u0215C\x03\x02\x02\x02\u0216\u021A\x07\v\x02\x02\u0217\u0219\x05" +
59404
- "`1\x02\u0218\u0217\x03\x02\x02\x02\u0219\u021C\x03\x02\x02\x02\u021A\u0218" +
59405
- "\x03\x02\x02\x02\u021A\u021B\x03\x02\x02\x02\u021B\u021D\x03\x02\x02\x02" +
59406
- "\u021C\u021A\x03\x02\x02\x02\u021D\u021E\x07\f\x02\x02\u021EE\x03\x02" +
59407
- "\x02\x02\u021F\u0223\x05D#\x02\u0220\u0221\x072\x02\x02\u0221\u0223\x05" +
59408
- "`1\x02\u0222\u021F\x03\x02\x02\x02\u0222\u0220\x03\x02\x02\x02\u0223G" +
59409
- "\x03\x02\x02\x02\u0224\u0229\x073\x02\x02\u0225\u0229\x07g\x02\x02\u0226" +
59410
- "\u0229\x07h\x02\x02\u0227\u0229\x05\x10\t\x02\u0228\u0224\x03\x02\x02" +
59411
- "\x02\u0228\u0225\x03\x02\x02\x02\u0228\u0226\x03\x02\x02\x02\u0228\u0227" +
59412
- "\x03\x02\x02\x02\u0229I\x03\x02\x02\x02\u022A\u022B\x07W\x02\x02\u022B" +
59413
- "\u022D\x07l\x02\x02\u022C\u022A\x03\x02\x02\x02\u022C\u022D\x03\x02\x02" +
59414
- "\x02\u022D\u0233\x03\x02\x02\x02\u022E\u022F\x05N(\x02\u022F\u0230\x07" +
59415
- "l\x02\x02\u0230\u0232\x03\x02\x02\x02\u0231\u022E\x03\x02\x02\x02\u0232" +
59416
- "\u0235\x03\x02\x02\x02\u0233\u0231\x03\x02\x02\x02\u0233\u0234\x03\x02" +
59417
- "\x02\x02\u0234\u0236\x03\x02\x02\x02\u0235\u0233\x03\x02\x02\x02\u0236" +
59418
- "\u023A\x05N(\x02\u0237\u023A\x07i\x02\x02\u0238\u023A\x07h\x02\x02\u0239" +
59419
- "\u022C\x03\x02\x02\x02\u0239\u0237\x03\x02\x02\x02\u0239\u0238\x03\x02" +
59420
- "\x02\x02\u023AK\x03\x02\x02\x02\u023B\u023C\x07j\x02\x02\u023C\u0243\x05" +
59421
- "J&\x02\u023D\u0244\x05J&\x02\u023E\u0244\x07\x07\x02\x02\u023F\u0241\x07" +
59422
- "(\x02\x02\u0240\u023F\x03\x02\x02\x02\u0240\u0241\x03\x02\x02\x02\u0241" +
59423
- "\u0242\x03\x02\x02\x02\u0242\u0244\x05\x9CO\x02\u0243\u023D\x03\x02\x02" +
59424
- "\x02\u0243\u023E\x03\x02\x02\x02\u0243\u0240\x03\x02\x02\x02\u0244M\x03" +
59425
- "\x02\x02\x02\u0245\u0246\t\v\x02\x02\u0246O\x03\x02\x02\x02\u0247\u024D" +
59426
- "\x05N(\x02\u0248\u0249\x05N(\x02\u0249\u024A\x07k\x02\x02\u024A\u024B" +
59427
- "\x05P)\x02\u024B\u024D\x03\x02\x02\x02\u024C\u0247\x03\x02\x02\x02\u024C" +
59428
- "\u0248\x03\x02\x02\x02\u024DQ\x03\x02\x02\x02\u024E\u0254\x05J&\x02\u024F" +
59429
- "\u0250\x05J&\x02\u0250\u0251\x07k\x02\x02\u0251\u0252\x05R*\x02\u0252" +
59430
- "\u0254\x03\x02\x02\x02\u0253\u024E\x03\x02\x02\x02\u0253\u024F\x03\x02" +
59431
- "\x02\x02\u0254S\x03\x02\x02\x02\u0255\u025B\x05\x16\f\x02\u0256\u0257" +
59432
- "\x05\x16\f\x02\u0257\u0258\x07k\x02\x02\u0258\u0259\x05T+\x02\u0259\u025B" +
59433
- "\x03\x02\x02\x02\u025A\u0255\x03\x02\x02\x02\u025A\u0256\x03\x02\x02\x02" +
59434
- "\u025BU\x03\x02\x02\x02\u025C\u0262\x05\x18\r\x02\u025D\u025E\x05\x18" +
59435
- "\r\x02\u025E\u025F\x07k\x02\x02\u025F\u0260\x05V,\x02\u0260\u0262\x03" +
59436
- "\x02\x02\x02\u0261\u025C\x03\x02\x02\x02\u0261\u025D\x03\x02\x02\x02\u0262" +
59437
- "W\x03\x02\x02\x02\u0263\u0269\x05\x1A\x0E\x02\u0264\u0265\x05\x1A\x0E" +
59438
- "\x02\u0265\u0266\x07k\x02\x02\u0266\u0267\x05X-\x02\u0267\u0269\x03\x02" +
59439
- "\x02\x02\u0268\u0263\x03\x02\x02\x02\u0268\u0264\x03\x02\x02\x02\u0269" +
59440
- "Y\x03\x02\x02\x02\u026A\u0270\x05B\"\x02\u026B\u026C\x05B\"\x02\u026C" +
59441
- "\u026D\x07k\x02\x02\u026D\u026E\x05Z.\x02\u026E\u0270\x03\x02\x02\x02" +
59442
- "\u026F\u026A\x03\x02\x02\x02\u026F\u026B\x03\x02\x02\x02\u0270[\x03\x02" +
59443
- "\x02\x02\u0271\u0277\x05.\x18\x02\u0272\u0273\x05.\x18\x02\u0273\u0274" +
59444
- "\x07k\x02\x02\u0274\u0275\x05\\/\x02\u0275\u0277\x03\x02\x02\x02\u0276" +
59445
- "\u0271\x03\x02\x02\x02\u0276\u0272\x03\x02\x02\x02\u0277]\x03\x02\x02" +
59446
- "\x02\u0278\u027E\x05`1\x02\u0279\u027A\x05`1\x02\u027A\u027B\x07k\x02" +
59447
- "\x02\u027B\u027C\x05^0\x02\u027C\u027E\x03\x02\x02\x02\u027D\u0278\x03" +
59448
- "\x02\x02\x02\u027D\u0279\x03\x02\x02\x02\u027E_\x03\x02\x02\x02\u027F" +
59449
- "\u0290\x05b2\x02\u0280\u0281\x079\x02\x02\u0281\u0282\x05Z.\x02\u0282" +
59450
- "\u0283\x05F$\x02\u0283\u0290\x03\x02\x02\x02\u0284\u0285\x07:\x02\x02" +
59451
- "\u0285\u0286\x05Z.\x02\u0286\u0287\x05F$\x02\u0287\u0290\x03\x02\x02\x02" +
59452
- "\u0288\u028A\x05H%\x02\u0289\u028B\x07\x17\x02\x02\u028A\u0289\x03\x02" +
59453
- "\x02\x02\u028A\u028B\x03\x02\x02\x02\u028B\u028C\x03\x02\x02\x02\u028C" +
59454
- "\u028D\x05V,\x02\u028D\u028E\x05F$\x02\u028E\u0290\x03\x02\x02\x02\u028F" +
59455
- "\u027F\x03\x02\x02\x02\u028F\u0280\x03\x02\x02\x02\u028F\u0284\x03\x02" +
59456
- "\x02\x02\u028F\u0288\x03\x02\x02\x02\u0290a\x03\x02\x02\x02\u0291\u0292" +
59457
- "\b2\x01\x02\u0292\u0293\x05d3\x02\u0293\u0299\x03\x02\x02\x02\u0294\u0295" +
59458
- "\f\x03\x02\x02\u0295\u0296\x07;\x02\x02\u0296\u0298\x05d3\x02\u0297\u0294" +
59459
- "\x03\x02\x02\x02\u0298\u029B\x03\x02\x02\x02\u0299\u0297\x03\x02\x02\x02" +
59460
- "\u0299\u029A\x03\x02\x02\x02\u029Ac\x03\x02\x02\x02\u029B\u0299\x03\x02" +
59461
- "\x02\x02\u029C\u029D\b3\x01\x02\u029D\u029E\x05f4\x02\u029E\u02A4\x03" +
59462
- "\x02\x02\x02\u029F\u02A0\f\x03\x02\x02\u02A0\u02A1\x07<\x02\x02\u02A1" +
59463
- "\u02A3\x05f4\x02\u02A2\u029F\x03\x02\x02\x02\u02A3\u02A6\x03\x02\x02\x02" +
59464
- "\u02A4\u02A2\x03\x02\x02\x02\u02A4\u02A5\x03\x02\x02\x02\u02A5e\x03\x02" +
59465
- "\x02\x02\u02A6\u02A4\x03\x02\x02\x02\u02A7\u02A8\b4\x01\x02\u02A8\u02A9" +
59466
- "\x05h5\x02\u02A9\u02AF\x03\x02\x02\x02\u02AA\u02AB\f\x03\x02\x02\u02AB" +
59467
- "\u02AC\x07=\x02\x02\u02AC\u02AE\x05h5\x02\u02AD\u02AA\x03\x02\x02\x02" +
59468
- "\u02AE\u02B1\x03\x02\x02\x02\u02AF\u02AD\x03\x02\x02\x02\u02AF\u02B0\x03" +
59469
- "\x02\x02\x02\u02B0g\x03\x02\x02\x02\u02B1\u02AF\x03\x02\x02\x02\u02B2" +
59470
- "\u02BB\x05j6\x02\u02B3\u02B4\x05j6\x02\u02B4\u02B5\x07>\x02\x02\u02B5" +
59471
- "\u02B8\x05h5\x02\u02B6\u02B7\x07?\x02\x02\u02B7\u02B9\x05h5\x02\u02B8" +
59472
- "\u02B6\x03\x02\x02\x02\u02B8\u02B9\x03\x02\x02\x02\u02B9\u02BB\x03\x02" +
59473
- "\x02\x02\u02BA\u02B2\x03\x02\x02\x02\u02BA\u02B3\x03\x02\x02\x02\u02BB" +
59474
- "i\x03\x02\x02\x02\u02BC\u02BD\b6\x01\x02\u02BD\u02BE\x05l7\x02\u02BE\u02C4" +
59475
- "\x03\x02\x02\x02\u02BF\u02C0\f\x03\x02\x02\u02C0\u02C1\x07@\x02\x02\u02C1" +
59476
- "\u02C3\x05l7\x02\u02C2\u02BF\x03\x02\x02\x02\u02C3\u02C6\x03\x02\x02\x02" +
59477
- "\u02C4\u02C2\x03\x02\x02\x02\u02C4\u02C5\x03\x02\x02\x02\u02C5k\x03\x02" +
59478
- "\x02\x02\u02C6\u02C4\x03\x02\x02\x02\u02C7\u02D9\x05n8\x02\u02C8\u02C9" +
59479
- "\x05n8\x02\u02C9\u02CA\x07A\x02\x02\u02CA\u02CB\x05n8\x02\u02CB\u02D9" +
59480
- "\x03\x02\x02\x02\u02CC\u02CD\x05n8\x02\u02CD\u02CE\x07B\x02\x02\u02CE" +
59481
- "\u02CF\x05n8\x02\u02CF\u02D9\x03\x02\x02\x02\u02D0\u02D1\x05n8\x02\u02D1" +
59482
- "\u02D2\x07C\x02\x02\u02D2\u02D3\x05n8\x02\u02D3\u02D9\x03\x02\x02\x02" +
59483
- "\u02D4\u02D5\x05n8\x02\u02D5\u02D6\x07D\x02\x02\u02D6\u02D7\x05n8\x02" +
59484
- "\u02D7\u02D9\x03\x02\x02\x02\u02D8\u02C7\x03\x02\x02\x02\u02D8\u02C8\x03" +
59485
- "\x02\x02\x02\u02D8\u02CC\x03\x02\x02\x02\u02D8\u02D0\x03\x02\x02\x02\u02D8" +
59486
- "\u02D4\x03\x02\x02\x02\u02D9m\x03\x02\x02\x02\u02DA\u02EA\x05p9\x02\u02DB" +
59487
- "\u02DC\x07E\x02\x02\u02DC\u02EA\x05n8\x02\u02DD\u02DE\x07F\x02\x02\u02DE" +
59488
- "\u02EA\x05n8\x02\u02DF\u02E0\x07G\x02\x02\u02E0\u02EA\x05n8\x02\u02E1" +
59489
- "\u02E2\x07H\x02\x02\u02E2\u02EA\x05n8\x02\u02E3\u02E4\x07I\x02\x02\u02E4" +
59490
- "\u02EA\x05n8\x02\u02E5\u02E6\x07J\x02\x02\u02E6\u02EA\x05n8\x02\u02E7" +
59491
- "\u02E8\x07K\x02\x02\u02E8\u02EA\x05n8\x02\u02E9\u02DA\x03\x02\x02\x02" +
59492
- "\u02E9\u02DB\x03\x02\x02\x02\u02E9\u02DD\x03\x02\x02\x02\u02E9\u02DF\x03" +
59493
- "\x02\x02\x02\u02E9\u02E1\x03\x02\x02\x02\u02E9\u02E3\x03\x02\x02\x02\u02E9" +
59494
- "\u02E5\x03\x02\x02\x02\u02E9\u02E7\x03\x02\x02\x02\u02EAo\x03\x02\x02" +
59495
- "\x02\u02EB\u02EC\b9\x01\x02\u02EC\u02ED\x05r:\x02\u02ED\u02F7\x03\x02" +
59496
- "\x02\x02\u02EE\u02F0\f\x03\x02\x02\u02EF\u02F1\x07E\x02\x02\u02F0\u02EF" +
59497
- "\x03\x02\x02\x02\u02F0\u02F1\x03\x02\x02\x02\u02F1\u02F2\x03\x02\x02\x02" +
59498
- "\u02F2\u02F3\x05@!\x02\u02F3\u02F4\x05r:\x02\u02F4\u02F6\x03\x02\x02\x02" +
59499
- "\u02F5\u02EE\x03\x02\x02\x02\u02F6\u02F9\x03\x02\x02\x02\u02F7\u02F5\x03" +
59500
- "\x02\x02\x02\u02F7\u02F8\x03\x02\x02\x02\u02F8q\x03\x02\x02\x02\u02F9" +
59501
- "\u02F7\x03\x02\x02\x02\u02FA\u02FE\x05t;\x02\u02FB\u02FC\t\f\x02\x02\u02FC" +
59502
- "\u02FE\x05t;\x02\u02FD\u02FA\x03\x02\x02\x02\u02FD\u02FB\x03\x02\x02\x02" +
59503
- "\u02FEs\x03\x02\x02\x02\u02FF\u0300\b;\x01\x02\u0300\u0301\x05v<\x02\u0301" +
59504
- "\u0307\x03\x02\x02\x02\u0302\u0303\f\x03\x02\x02\u0303\u0304\t\r\x02\x02" +
59505
- "\u0304\u0306\x05x=\x02\u0305\u0302\x03\x02\x02\x02\u0306\u0309\x03\x02" +
59506
- "\x02\x02\u0307\u0305\x03\x02\x02\x02\u0307\u0308\x03\x02\x02\x02\u0308" +
59507
- "u\x03\x02\x02\x02\u0309\u0307\x03\x02\x02\x02\u030A\u030E\x05x=\x02\u030B" +
59508
- "\u030C\x07L\x02\x02\u030C\u030E\x05v<\x02\u030D\u030A\x03\x02\x02\x02" +
59509
- "\u030D\u030B\x03\x02\x02\x02\u030Ew\x03\x02\x02\x02\u030F\u0310\b=\x01" +
59510
- "\x02\u0310\u0311\x05z>\x02\u0311\u0317\x03\x02\x02\x02\u0312\u0313\f\x03" +
59511
- "\x02\x02\u0313\u0314\x07M\x02\x02\u0314\u0316\x05z>\x02\u0315\u0312\x03" +
59512
- "\x02\x02\x02\u0316\u0319\x03\x02\x02\x02\u0317\u0315\x03\x02\x02\x02\u0317" +
59513
- "\u0318\x03\x02\x02\x02\u0318y\x03\x02\x02\x02\u0319\u0317\x03\x02\x02" +
59514
- "\x02\u031A\u031B\b>\x01\x02\u031B\u031C\x05|?\x02\u031C\u0322\x03\x02" +
59515
- "\x02\x02\u031D\u031E\f\x03\x02\x02\u031E\u031F\x07N\x02\x02\u031F\u0321" +
59516
- "\x05|?\x02\u0320\u031D\x03\x02\x02\x02\u0321\u0324\x03\x02\x02\x02\u0322" +
59517
- "\u0320\x03\x02\x02\x02\u0322\u0323\x03\x02\x02\x02\u0323{\x03\x02\x02" +
59518
- "\x02\u0324\u0322\x03\x02\x02\x02\u0325\u0326\b?\x01\x02\u0326\u0327\x05" +
59519
- "~@\x02\u0327\u032E\x03\x02\x02\x02\u0328\u0329\f\x03\x02\x02\u0329\u032A" +
59520
- "\x05> \x02\u032A\u032B\x05~@\x02\u032B\u032D\x03\x02\x02\x02\u032C\u0328" +
59521
- "\x03\x02\x02\x02\u032D\u0330\x03\x02\x02\x02\u032E\u032C\x03\x02\x02\x02" +
59522
- "\u032E\u032F\x03\x02\x02\x02\u032F}\x03\x02\x02\x02\u0330\u032E\x03\x02" +
59523
- "\x02\x02\u0331\u0332\b@\x01\x02\u0332\u0333\x05\x80A\x02\u0333\u0339\x03" +
59524
- "\x02\x02\x02\u0334\u0335\f\x03\x02\x02\u0335\u0336\t\x0E\x02\x02\u0336" +
59525
- "\u0338\x05\x80A\x02\u0337\u0334\x03\x02\x02\x02\u0338\u033B\x03\x02\x02" +
59526
- "\x02\u0339\u0337\x03\x02\x02\x02\u0339\u033A\x03\x02\x02\x02\u033A\x7F" +
59527
- "\x03\x02\x02\x02\u033B\u0339\x03\x02\x02\x02\u033C\u033D\bA\x01\x02\u033D" +
59528
- "\u033E\x05\x82B\x02\u033E\u0346\x03\x02\x02\x02\u033F\u0340\f\x03\x02" +
59529
- "\x02\u0340\u0341\x07\x04\x02\x02\u0341\u0342\x05^0\x02\u0342\u0343\x07" +
59530
- "\x05\x02\x02\u0343\u0345\x03\x02\x02\x02\u0344\u033F\x03\x02\x02\x02\u0345" +
59531
- "\u0348\x03\x02\x02\x02\u0346\u0344\x03\x02\x02\x02\u0346\u0347\x03\x02" +
59532
- "\x02\x02\u0347\x81\x03\x02\x02\x02\u0348\u0346\x03\x02\x02\x02\u0349\u034A" +
59533
- "\bB\x01\x02\u034A\u0351\x05\x84C\x02\u034B\u034C\x05N(\x02\u034C\u034D" +
59534
- "\x07\x04\x02\x02\u034D\u034E\x05^0\x02\u034E\u034F\x07\x05\x02\x02\u034F" +
59535
- "\u0351\x03\x02\x02\x02\u0350\u0349\x03\x02\x02\x02\u0350\u034B\x03\x02" +
59536
- "\x02\x02\u0351\u0357\x03\x02\x02\x02\u0352\u0353\f\x04\x02\x02\u0353\u0354" +
59537
- "\x07\x1B\x02\x02\u0354\u0356\x05\x84C\x02\u0355\u0352\x03\x02\x02\x02" +
59538
- "\u0356\u0359\x03\x02\x02\x02\u0357\u0355\x03\x02\x02\x02\u0357\u0358\x03" +
59539
- "\x02\x02\x02\u0358\x83\x03\x02\x02\x02\u0359\u0357\x03\x02\x02\x02\u035A" +
59540
- "\u035B\bC\x01\x02\u035B\u035C\x05\x86D\x02\u035C\u0361\x03\x02\x02\x02" +
59541
- "\u035D\u035E\f\x03\x02\x02\u035E\u0360\x07Q\x02\x02\u035F\u035D\x03\x02" +
59542
- "\x02\x02\u0360\u0363\x03\x02\x02\x02\u0361\u035F\x03\x02\x02\x02\u0361" +
59543
- "\u0362\x03\x02\x02\x02\u0362\x85\x03\x02\x02\x02\u0363\u0361\x03\x02\x02" +
59544
- "\x02\u0364\u0368\x05\x88E\x02\u0365\u0366\t\x0F\x02\x02\u0366\u0368\x05" +
59545
- "\x86D\x02\u0367\u0364\x03\x02\x02\x02\u0367\u0365\x03\x02\x02\x02\u0368" +
59546
- "\x87\x03\x02\x02\x02\u0369\u037C\x050\x19\x02\u036A\u037C\x05J&\x02\u036B" +
59547
- "\u036C\x07U\x02\x02\u036C\u037C\x05N(\x02\u036D\u036E\x07V\x02\x02\u036E" +
59548
- "\u037C\x05N(\x02\u036F\u037C\x07W\x02\x02\u0370\u0371\x07\v\x02\x02\u0371" +
59549
- "\u0372\x05V,\x02\u0372\u0373\x05F$\x02\u0373\u0374\x07\f\x02\x02\u0374" +
59550
- "\u037C\x03\x02\x02\x02\u0375\u0376\x07\x1D\x02\x02\u0376\u0377\x05`1\x02" +
59551
- "\u0377\u0378\x07\x1E\x02\x02\u0378\u037C\x03\x02\x02\x02\u0379\u037C\x05" +
59552
- "D#\x02\u037A\u037C\x05\x8EH\x02\u037B\u0369\x03\x02\x02\x02\u037B\u036A" +
59553
- "\x03\x02\x02\x02\u037B\u036B\x03\x02\x02\x02\u037B\u036D\x03\x02\x02\x02" +
59554
- "\u037B\u036F\x03\x02\x02\x02\u037B\u0370\x03\x02\x02\x02\u037B\u0375\x03" +
59555
- "\x02\x02\x02\u037B\u0379\x03\x02\x02\x02\u037B\u037A\x03\x02\x02\x02\u037C" +
59556
- "\x89\x03\x02\x02\x02\u037D\u0383\x05J&\x02\u037E\u037F\x05J&\x02\u037F" +
59557
- "\u0380\x07\\\x02\x02\u0380\u0381\x05\x8AF\x02\u0381\u0383\x03\x02\x02" +
59558
- "\x02\u0382\u037D\x03\x02\x02\x02\u0382\u037E\x03\x02\x02\x02\u0383\x8B" +
59559
- "\x03\x02\x02\x02\u0384\u0385\x05\x8EH\x02\u0385\x8D\x03\x02\x02\x02\u0386" +
59560
- "\u0387\x07X\x02\x02\u0387\x8F\x03\x02\x02\x02\u0388\u0389\x07Y\x02\x02" +
59561
- "\u0389\u038A\x05N(\x02\u038A\u038C\x05\x9EP\x02\u038B\u038D\x05,\x17\x02" +
59562
- "\u038C\u038B\x03\x02\x02\x02\u038C\u038D\x03\x02\x02\x02\u038D\x91\x03" +
59563
- "\x02\x02\x02\u038E\u038F\x05\x1A\x0E\x02\u038F\x93\x03\x02\x02\x02\u0390" +
59564
- "\u0391\x07Z\x02\x02\u0391\u0392\x05`1\x02\u0392\x95\x03\x02\x02\x02\u0393" +
59565
- "\u0394\x07[\x02\x02\u0394\u0395\x05N(\x02\u0395\u0396\x07)\x02\x02\u0396" +
59566
- "\u0397\x05`1\x02\u0397\u0398\x07\"\x02\x02\u0398\u0399\x05\x9EP\x02\u0399" +
59567
- "\x97\x03\x02\x02\x02\u039A\u039B\x05N(\x02\u039B\u039C\x07\x18\x02\x02" +
59568
- "\u039C\u039D\x05\x8AF\x02\u039D\u039E\x07a\x02\x02\u039E\u039F\x05`1\x02" +
59569
- "\u039F\x99\x03\x02\x02\x02\u03A0\u03A6\x05\x9CO\x02\u03A1\u03A2\x05\x9C" +
59570
- "O\x02\u03A2\u03A3\x07k\x02\x02\u03A3\u03A4\x05\x9AN\x02\u03A4\u03A6\x03" +
59571
- "\x02\x02\x02\u03A5\u03A0\x03\x02\x02\x02\u03A5\u03A1\x03\x02\x02\x02\u03A6" +
59572
- "\x9B\x03\x02\x02\x02\u03A7\u03A8\x07m\x02\x02\u03A8\x9D\x03\x02\x02\x02" +
59573
- "\u03A9\u03AD\x07\v\x02\x02\u03AA\u03AC\x05\xA2R\x02\u03AB\u03AA\x03\x02" +
59574
- "\x02\x02\u03AC\u03AF\x03\x02\x02\x02\u03AD\u03AB\x03\x02\x02\x02\u03AD" +
59575
- "\u03AE\x03\x02\x02\x02\u03AE\u03B0\x03\x02\x02\x02\u03AF\u03AD\x03\x02" +
59576
- "\x02\x02\u03B0\u03B6\x07\f\x02\x02\u03B1\u03B3\x07$\x02\x02\u03B2\u03B1" +
59577
- "\x03\x02\x02\x02\u03B2\u03B3\x03\x02\x02\x02\u03B3\u03B4\x03\x02\x02\x02" +
59578
- "\u03B4\u03B6\x05J&\x02\u03B5\u03A9\x03\x02\x02\x02\u03B5\u03B2\x03\x02" +
59579
- "\x02\x02\u03B6\x9F\x03\x02\x02\x02\u03B7\u03B8\x07V\x02\x02\u03B8\u03BD" +
59580
- "\x05N(\x02\u03B9\u03BD\x05\x9CO\x02\u03BA\u03BB\x07(\x02\x02\u03BB\u03BD" +
59581
- "\x05\x9CO\x02\u03BC\u03B7\x03\x02\x02\x02\u03BC\u03B9\x03\x02\x02\x02" +
59582
- "\u03BC\u03BA\x03\x02\x02\x02\u03BD\xA1\x03\x02\x02\x02\u03BE\u03BF\x05" +
59583
- "\xA4S\x02\u03BF\u03C0\x05@!\x02\u03C0\u03C1\x05\xA6T\x02\u03C1\u03C6\x03" +
59584
- "\x02\x02\x02\u03C2\u03C3\x07g\x02\x02\u03C3\u03C6\x05\xA4S\x02\u03C4\u03C6" +
59585
- "\x05J&\x02\u03C5\u03BE\x03\x02\x02\x02\u03C5\u03C2\x03\x02\x02\x02\u03C5" +
59586
- "\u03C4\x03\x02\x02\x02\u03C6\xA3\x03\x02\x02\x02\u03C7\u03C8\x07L\x02" +
59587
- "\x02\u03C8\u03D2\x05J&\x02\u03C9\u03D2\x05J&\x02\u03CA\u03CD\x05\xA0Q" +
59588
- "\x02\u03CB\u03CC\x07\x1B\x02\x02\u03CC\u03CE\x05J&\x02\u03CD\u03CB\x03" +
59589
- "\x02\x02\x02\u03CE\u03CF\x03\x02\x02\x02\u03CF\u03CD\x03\x02\x02\x02\u03CF" +
59590
- "\u03D0\x03\x02\x02\x02\u03D0\u03D2\x03\x02\x02\x02\u03D1\u03C7\x03\x02" +
59591
- "\x02\x02\u03D1\u03C9\x03\x02\x02\x02\u03D1\u03CA\x03\x02\x02\x02\u03D2" +
59592
- "\xA5\x03\x02\x02\x02\u03D3\u03D4\bT\x01\x02\u03D4\u03DA\x05\xA8U\x02\u03D5" +
59593
- "\u03D6\x07\x1D\x02\x02\u03D6\u03D7\x05\xA6T\x02\u03D7\u03D8\x07\x1E\x02" +
59594
- "\x02\u03D8\u03DA\x03\x02\x02\x02\u03D9\u03D3\x03\x02\x02\x02\u03D9\u03D5" +
59595
- "\x03\x02\x02\x02\u03DA\u03E0\x03\x02\x02\x02\u03DB\u03DC\f\x04\x02\x02" +
59596
- "\u03DC\u03DD\x07\x0F\x02\x02\u03DD\u03DF\x05\xA8U\x02\u03DE\u03DB\x03" +
59597
- "\x02\x02\x02\u03DF\u03E2\x03\x02\x02\x02\u03E0\u03DE\x03\x02\x02\x02\u03E0" +
59598
- "\u03E1\x03\x02\x02\x02\u03E1\xA7\x03\x02\x02\x02\u03E2\u03E0\x03\x02\x02" +
59599
- "\x02\u03E3\u03E4\bU\x01\x02\u03E4\u03E5\x07\x1D\x02\x02\u03E5\u03E6\x05" +
59600
- "\xA8U\x02\u03E6\u03E7\x07\x1E\x02\x02\u03E7\u03EA\x03\x02\x02\x02\u03E8" +
59601
- "\u03EA\x05\xAAV\x02\u03E9\u03E3\x03\x02\x02\x02\u03E9\u03E8\x03\x02\x02" +
59602
- "\x02\u03EA\u03F0\x03\x02\x02\x02\u03EB\u03EC\f\x04\x02\x02\u03EC\u03ED" +
59603
- "\t\x10\x02\x02\u03ED\u03EF\x05\xAAV\x02\u03EE\u03EB\x03\x02\x02\x02\u03EF" +
59604
- "\u03F2\x03\x02\x02\x02\u03F0\u03EE\x03\x02\x02\x02\u03F0\u03F1\x03\x02" +
59605
- "\x02\x02\u03F1\xA9\x03\x02\x02\x02\u03F2\u03F0\x03\x02\x02\x02\u03F3\u03FA" +
59606
- "\x05\xA0Q\x02\u03F4\u03FA\x05J&\x02\u03F5\u03F6\x07\x1D\x02\x02\u03F6" +
59607
- "\u03F7\x05\xA6T\x02\u03F7\u03F8\x07\x1E\x02\x02\u03F8\u03FA\x03\x02\x02" +
59608
- "\x02\u03F9\u03F3\x03\x02\x02\x02\u03F9\u03F4\x03\x02\x02\x02\u03F9\u03F5" +
59609
- "\x03\x02\x02\x02\u03FA\xAB\x03\x02\x02\x02x\xAE\xB3\xB7\xC1\xC7\xCD\xD0" +
59729
+ "\u01B0\u01B1\x03\x02\x02\x02\u01B1\u01B4\x05\x9CO\x02\u01B2\u01B4\x07" +
59730
+ "\x07\x02\x02\u01B3\u01AB\x03\x02\x02\x02\u01B3\u01AC\x03\x02\x02\x02\u01B3" +
59731
+ "\u01AD\x03\x02\x02\x02\u01B3\u01AF\x03\x02\x02\x02\u01B3\u01B2\x03\x02" +
59732
+ "\x02\x02\u01B41\x03\x02\x02\x02\u01B5\u01B6\x07\x1F\x02\x02\u01B6\u01B7" +
59733
+ "\x05`1\x02\u01B7\u01B8\x07)\x02\x02\u01B8\u01BA\t\x07\x02\x02\u01B9\u01BB" +
59734
+ "\x05,\x17\x02\u01BA\u01B9";
59735
+ ForgeParser._serializedATNSegment1 = "\x03\x02\x02\x02\u01BA\u01BB\x03\x02\x02\x02\u01BB\u01BE\x03\x02\x02\x02" +
59736
+ "\u01BC\u01BD\x07\"\x02\x02\u01BD\u01BF\x05\x9EP\x02\u01BE\u01BC\x03\x02" +
59737
+ "\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF3\x03\x02\x02\x02\u01C0\u01C1" +
59738
+ "\x07\x1F\x02\x02\u01C1\u01C3\x073\x02\x02\u01C2\u01C4\x07\x17\x02\x02" +
59739
+ "\u01C3\u01C2\x03\x02\x02\x02\u01C3\u01C4\x03\x02\x02\x02\u01C4\u01C5\x03" +
59740
+ "\x02\x02\x02\u01C5\u01C6\x05V,\x02\u01C6\u01C7\x072\x02\x02\u01C7\u01C8" +
59741
+ "\x05`1\x02\u01C8\u01C9\x07)\x02\x02\u01C9\u01CA\t\b\x02\x02\u01CA\u01CB" +
59742
+ "\x07\"\x02\x02\u01CB\u01D0\x05N(\x02\u01CC\u01CD\x07\x04\x02\x02\u01CD" +
59743
+ "\u01CE\x05^0\x02\u01CE\u01CF\x07\x05\x02\x02\u01CF\u01D1\x03\x02\x02\x02" +
59744
+ "\u01D0\u01CC\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D3\x03" +
59745
+ "\x02\x02\x02\u01D2\u01D4\x05,\x17\x02\u01D3\u01D2\x03\x02\x02\x02\u01D3" +
59746
+ "\u01D4\x03\x02\x02\x02\u01D4\u01D7\x03\x02\x02\x02\u01D5\u01D6\x07\"\x02" +
59747
+ "\x02\u01D6\u01D8\x05\x9EP\x02\u01D7\u01D5\x03\x02\x02\x02\u01D7\u01D8" +
59748
+ "\x03\x02\x02\x02\u01D85\x03\x02\x02\x02\u01D9\u01DA\x07\x1F\x02\x02\u01DA" +
59749
+ "\u01DB\x05`1\x02\u01DB\u01DC\x07)\x02\x02\u01DC\u01DD\t\b\x02\x02\u01DD" +
59750
+ "\u01DE\x07\"\x02\x02\u01DE\u01E0\x05N(\x02\u01DF\u01E1\x05,\x17\x02\u01E0" +
59751
+ "\u01DF\x03\x02\x02\x02\u01E0\u01E1\x03\x02\x02\x02\u01E1\u01E4\x03\x02" +
59752
+ "\x02\x02\u01E2\u01E3\x07\"\x02\x02\u01E3\u01E5\x05\x9EP\x02\u01E4\u01E2" +
59753
+ "\x03\x02\x02\x02\u01E4\u01E5\x03\x02\x02\x02\u01E57\x03\x02\x02\x02\u01E6" +
59754
+ "\u01E7\x07\x1F\x02\x02\u01E7\u01E8\x05`1\x02\u01E8\u01E9\x07)\x02\x02" +
59755
+ "\u01E9\u01EA\t\t\x02\x02\u01EA\u01EB\x078\x02\x02\u01EB\u01ED\x05N(\x02" +
59756
+ "\u01EC\u01EE\x05,\x17\x02\u01ED\u01EC\x03\x02\x02\x02\u01ED\u01EE\x03" +
59757
+ "\x02\x02\x02\u01EE\u01F1\x03\x02\x02\x02\u01EF\u01F0\x07\"\x02\x02\u01F0" +
59758
+ "\u01F2\x05\x9EP\x02\u01F1\u01EF\x03\x02\x02\x02\u01F1\u01F2\x03\x02\x02" +
59759
+ "\x02\u01F29\x03\x02\x02\x02\u01F3\u01F4\x07/\x02\x02\u01F4\u01F5\x071" +
59760
+ "\x02\x02\u01F5\u01F6\x07\"\x02\x02\u01F6\u01F7\x05N(\x02\u01F7\u01FB\x07" +
59761
+ "\v\x02\x02\u01F8\u01FA\x05<\x1F\x02\u01F9\u01F8\x03\x02\x02\x02\u01FA" +
59762
+ "\u01FD\x03\x02\x02\x02\u01FB\u01F9\x03\x02\x02\x02\u01FB\u01FC\x03\x02" +
59763
+ "\x02\x02\u01FC\u01FE\x03\x02\x02\x02\u01FD\u01FB\x03\x02\x02\x02\u01FE" +
59764
+ "\u01FF\x07\f\x02\x02\u01FF;\x03\x02\x02\x02\u0200\u0207\x05\x96L\x02\u0201" +
59765
+ "\u0207\x05(\x15\x02\u0202\u0207\x054\x1B\x02\u0203\u0207\x056\x1C\x02" +
59766
+ "\u0204\u0207\x052\x1A\x02\u0205\u0207\x058\x1D\x02\u0206\u0200\x03\x02" +
59767
+ "\x02\x02\u0206\u0201\x03\x02\x02\x02\u0206\u0202\x03\x02\x02\x02\u0206" +
59768
+ "\u0203\x03\x02\x02\x02\u0206\u0204\x03\x02\x02\x02\u0206\u0205\x03\x02" +
59769
+ "\x02\x02\u0207=\x03\x02\x02\x02\u0208\u020B\x05\x10\t\x02\u0209\u020B" +
59770
+ "\x07\x14\x02\x02\u020A\u0208\x03\x02\x02\x02\u020A\u0209\x03\x02\x02\x02" +
59771
+ "\u020A\u020B\x03\x02\x02\x02\u020B\u020C\x03\x02\x02\x02\u020C\u020F\x07" +
59772
+ "\\\x02\x02\u020D\u0210\x05\x10\t\x02\u020E\u0210\x07\x14\x02\x02\u020F" +
59773
+ "\u020D\x03\x02\x02\x02\u020F\u020E\x03\x02\x02\x02\u020F\u0210\x03\x02" +
59774
+ "\x02\x02\u0210?\x03\x02\x02\x02\u0211\u0212\t\n\x02\x02\u0212A\x03\x02" +
59775
+ "\x02\x02\u0213\u0214\x05N(\x02\u0214\u0215\x07a\x02\x02\u0215\u0216\x05" +
59776
+ "`1\x02\u0216C\x03\x02\x02\x02\u0217\u021B\x07\v\x02\x02\u0218\u021A\x05" +
59777
+ "`1\x02\u0219\u0218\x03\x02\x02\x02\u021A\u021D\x03\x02\x02\x02\u021B\u0219" +
59778
+ "\x03\x02\x02\x02\u021B\u021C\x03\x02\x02\x02\u021C\u021E\x03\x02\x02\x02" +
59779
+ "\u021D\u021B\x03\x02\x02\x02\u021E\u021F\x07\f\x02\x02\u021FE\x03\x02" +
59780
+ "\x02\x02\u0220\u0224\x05D#\x02\u0221\u0222\x072\x02\x02\u0222\u0224\x05" +
59781
+ "`1\x02\u0223\u0220\x03\x02\x02\x02\u0223\u0221\x03\x02\x02\x02\u0224G" +
59782
+ "\x03\x02\x02\x02\u0225\u022A\x073\x02\x02\u0226\u022A\x07g\x02\x02\u0227" +
59783
+ "\u022A\x07h\x02\x02\u0228\u022A\x05\x10\t\x02\u0229\u0225\x03\x02\x02" +
59784
+ "\x02\u0229\u0226\x03\x02\x02\x02\u0229\u0227\x03\x02\x02\x02\u0229\u0228" +
59785
+ "\x03\x02\x02\x02\u022AI\x03\x02\x02\x02\u022B\u022C\x07W\x02\x02\u022C" +
59786
+ "\u022E\x07l\x02\x02\u022D\u022B\x03\x02\x02\x02\u022D\u022E\x03\x02\x02" +
59787
+ "\x02\u022E\u0234\x03\x02\x02\x02\u022F\u0230\x05N(\x02\u0230\u0231\x07" +
59788
+ "l\x02\x02\u0231\u0233\x03\x02\x02\x02\u0232\u022F\x03\x02\x02\x02\u0233" +
59789
+ "\u0236\x03\x02\x02\x02\u0234\u0232\x03\x02\x02\x02\u0234\u0235\x03\x02" +
59790
+ "\x02\x02\u0235\u0237\x03\x02\x02\x02\u0236\u0234\x03\x02\x02\x02\u0237" +
59791
+ "\u023B\x05N(\x02\u0238\u023B\x07i\x02\x02\u0239\u023B\x07h\x02\x02\u023A" +
59792
+ "\u022D\x03\x02\x02\x02\u023A\u0238\x03\x02\x02\x02\u023A\u0239\x03\x02" +
59793
+ "\x02\x02\u023BK\x03\x02\x02\x02\u023C\u023D\x07j\x02\x02\u023D\u0244\x05" +
59794
+ "J&\x02\u023E\u0245\x05J&\x02\u023F\u0245\x07\x07\x02\x02\u0240\u0242\x07" +
59795
+ "(\x02\x02\u0241\u0240\x03\x02\x02\x02\u0241\u0242\x03\x02\x02\x02\u0242" +
59796
+ "\u0243\x03\x02\x02\x02\u0243\u0245\x05\x9CO\x02\u0244\u023E\x03\x02\x02" +
59797
+ "\x02\u0244\u023F\x03\x02\x02\x02\u0244\u0241\x03\x02\x02\x02\u0245M\x03" +
59798
+ "\x02\x02\x02\u0246\u0247\t\v\x02\x02\u0247O\x03\x02\x02\x02\u0248\u024E" +
59799
+ "\x05N(\x02\u0249\u024A\x05N(\x02\u024A\u024B\x07k\x02\x02\u024B\u024C" +
59800
+ "\x05P)\x02\u024C\u024E\x03\x02\x02\x02\u024D\u0248\x03\x02\x02\x02\u024D" +
59801
+ "\u0249\x03\x02\x02\x02\u024EQ\x03\x02\x02\x02\u024F\u0255\x05J&\x02\u0250" +
59802
+ "\u0251\x05J&\x02\u0251\u0252\x07k\x02\x02\u0252\u0253\x05R*\x02\u0253" +
59803
+ "\u0255\x03\x02\x02\x02\u0254\u024F\x03\x02\x02\x02\u0254\u0250\x03\x02" +
59804
+ "\x02\x02\u0255S\x03\x02\x02\x02\u0256\u025C\x05\x16\f\x02\u0257\u0258" +
59805
+ "\x05\x16\f\x02\u0258\u0259\x07k\x02\x02\u0259\u025A\x05T+\x02\u025A\u025C" +
59806
+ "\x03\x02\x02\x02\u025B\u0256\x03\x02\x02\x02\u025B\u0257\x03\x02\x02\x02" +
59807
+ "\u025CU\x03\x02\x02\x02\u025D\u0263\x05\x18\r\x02\u025E\u025F\x05\x18" +
59808
+ "\r\x02\u025F\u0260\x07k\x02\x02\u0260\u0261\x05V,\x02\u0261\u0263\x03" +
59809
+ "\x02\x02\x02\u0262\u025D\x03\x02\x02\x02\u0262\u025E\x03\x02\x02\x02\u0263" +
59810
+ "W\x03\x02\x02\x02\u0264\u026A\x05\x1A\x0E\x02\u0265\u0266\x05\x1A\x0E" +
59811
+ "\x02\u0266\u0267\x07k\x02\x02\u0267\u0268\x05X-\x02\u0268\u026A\x03\x02" +
59812
+ "\x02\x02\u0269\u0264\x03\x02\x02\x02\u0269\u0265\x03\x02\x02\x02\u026A" +
59813
+ "Y\x03\x02\x02\x02\u026B\u0271\x05B\"\x02\u026C\u026D\x05B\"\x02\u026D" +
59814
+ "\u026E\x07k\x02\x02\u026E\u026F\x05Z.\x02\u026F\u0271\x03\x02\x02\x02" +
59815
+ "\u0270\u026B\x03\x02\x02\x02\u0270\u026C\x03\x02\x02\x02\u0271[\x03\x02" +
59816
+ "\x02\x02\u0272\u0278\x05.\x18\x02\u0273\u0274\x05.\x18\x02\u0274\u0275" +
59817
+ "\x07k\x02\x02\u0275\u0276\x05\\/\x02\u0276\u0278\x03\x02\x02\x02\u0277" +
59818
+ "\u0272\x03\x02\x02\x02\u0277\u0273\x03\x02\x02\x02\u0278]\x03\x02\x02" +
59819
+ "\x02\u0279\u027F\x05`1\x02\u027A\u027B\x05`1\x02\u027B\u027C\x07k\x02" +
59820
+ "\x02\u027C\u027D\x05^0\x02\u027D\u027F\x03\x02\x02\x02\u027E\u0279\x03" +
59821
+ "\x02\x02\x02\u027E\u027A\x03\x02\x02\x02\u027F_\x03\x02\x02\x02\u0280" +
59822
+ "\u0291\x05b2\x02\u0281\u0282\x079\x02\x02\u0282\u0283\x05Z.\x02\u0283" +
59823
+ "\u0284\x05F$\x02\u0284\u0291\x03\x02\x02\x02\u0285\u0286\x07:\x02\x02" +
59824
+ "\u0286\u0287\x05Z.\x02\u0287\u0288\x05F$\x02\u0288\u0291\x03\x02\x02\x02" +
59825
+ "\u0289\u028B\x05H%\x02\u028A\u028C\x07\x17\x02\x02\u028B\u028A\x03\x02" +
59826
+ "\x02\x02\u028B\u028C\x03\x02\x02\x02\u028C\u028D\x03\x02\x02\x02\u028D" +
59827
+ "\u028E\x05V,\x02\u028E\u028F\x05F$\x02\u028F\u0291\x03\x02\x02\x02\u0290" +
59828
+ "\u0280\x03\x02\x02\x02\u0290\u0281\x03\x02\x02\x02\u0290\u0285\x03\x02" +
59829
+ "\x02\x02\u0290\u0289\x03\x02\x02\x02\u0291a\x03\x02\x02\x02\u0292\u0293" +
59830
+ "\b2\x01\x02\u0293\u0294\x05d3\x02\u0294\u029A\x03\x02\x02\x02\u0295\u0296" +
59831
+ "\f\x03\x02\x02\u0296\u0297\x07;\x02\x02\u0297\u0299\x05d3\x02\u0298\u0295" +
59832
+ "\x03\x02\x02\x02\u0299\u029C\x03\x02\x02\x02\u029A\u0298\x03\x02\x02\x02" +
59833
+ "\u029A\u029B\x03\x02\x02\x02\u029Bc\x03\x02\x02\x02\u029C\u029A\x03\x02" +
59834
+ "\x02\x02\u029D\u029E\b3\x01\x02\u029E\u029F\x05f4\x02\u029F\u02A5\x03" +
59835
+ "\x02\x02\x02\u02A0\u02A1\f\x03\x02\x02\u02A1\u02A2\x07<\x02\x02\u02A2" +
59836
+ "\u02A4\x05f4\x02\u02A3\u02A0\x03\x02\x02\x02\u02A4\u02A7\x03\x02\x02\x02" +
59837
+ "\u02A5\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03\x02\x02\x02\u02A6e\x03\x02" +
59838
+ "\x02\x02\u02A7\u02A5\x03\x02\x02\x02\u02A8\u02A9\b4\x01\x02\u02A9\u02AA" +
59839
+ "\x05h5\x02\u02AA\u02B0\x03\x02\x02\x02\u02AB\u02AC\f\x03\x02\x02\u02AC" +
59840
+ "\u02AD\x07=\x02\x02\u02AD\u02AF\x05h5\x02\u02AE\u02AB\x03\x02\x02\x02" +
59841
+ "\u02AF\u02B2\x03\x02\x02\x02\u02B0\u02AE\x03\x02\x02\x02\u02B0\u02B1\x03" +
59842
+ "\x02\x02\x02\u02B1g\x03\x02\x02\x02\u02B2\u02B0\x03\x02\x02\x02\u02B3" +
59843
+ "\u02BC\x05j6\x02\u02B4\u02B5\x05j6\x02\u02B5\u02B6\x07>\x02\x02\u02B6" +
59844
+ "\u02B9\x05h5\x02\u02B7\u02B8\x07?\x02\x02\u02B8\u02BA\x05h5\x02\u02B9" +
59845
+ "\u02B7\x03\x02\x02\x02\u02B9\u02BA\x03\x02\x02\x02\u02BA\u02BC\x03\x02" +
59846
+ "\x02\x02\u02BB\u02B3\x03\x02\x02\x02\u02BB\u02B4\x03\x02\x02\x02\u02BC" +
59847
+ "i\x03\x02\x02\x02\u02BD\u02BE\b6\x01\x02\u02BE\u02BF\x05l7\x02\u02BF\u02C5" +
59848
+ "\x03\x02\x02\x02\u02C0\u02C1\f\x03\x02\x02\u02C1\u02C2\x07@\x02\x02\u02C2" +
59849
+ "\u02C4\x05l7\x02\u02C3\u02C0\x03\x02\x02\x02\u02C4\u02C7\x03\x02\x02\x02" +
59850
+ "\u02C5\u02C3\x03\x02\x02\x02\u02C5\u02C6\x03\x02\x02\x02\u02C6k\x03\x02" +
59851
+ "\x02\x02\u02C7\u02C5\x03\x02\x02\x02\u02C8\u02DA\x05n8\x02\u02C9\u02CA" +
59852
+ "\x05n8\x02\u02CA\u02CB\x07A\x02\x02\u02CB\u02CC\x05n8\x02\u02CC\u02DA" +
59853
+ "\x03\x02\x02\x02\u02CD\u02CE\x05n8\x02\u02CE\u02CF\x07B\x02\x02\u02CF" +
59854
+ "\u02D0\x05n8\x02\u02D0\u02DA\x03\x02\x02\x02\u02D1\u02D2\x05n8\x02\u02D2" +
59855
+ "\u02D3\x07C\x02\x02\u02D3\u02D4\x05n8\x02\u02D4\u02DA\x03\x02\x02\x02" +
59856
+ "\u02D5\u02D6\x05n8\x02\u02D6\u02D7\x07D\x02\x02\u02D7\u02D8\x05n8\x02" +
59857
+ "\u02D8\u02DA\x03\x02\x02\x02\u02D9\u02C8\x03\x02\x02\x02\u02D9\u02C9\x03" +
59858
+ "\x02\x02\x02\u02D9\u02CD\x03\x02\x02\x02\u02D9\u02D1\x03\x02\x02\x02\u02D9" +
59859
+ "\u02D5\x03\x02\x02\x02\u02DAm\x03\x02\x02\x02\u02DB\u02EB\x05p9\x02\u02DC" +
59860
+ "\u02DD\x07E\x02\x02\u02DD\u02EB\x05n8\x02\u02DE\u02DF\x07F\x02\x02\u02DF" +
59861
+ "\u02EB\x05n8\x02\u02E0\u02E1\x07G\x02\x02\u02E1\u02EB\x05n8\x02\u02E2" +
59862
+ "\u02E3\x07H\x02\x02\u02E3\u02EB\x05n8\x02\u02E4\u02E5\x07I\x02\x02\u02E5" +
59863
+ "\u02EB\x05n8\x02\u02E6\u02E7\x07J\x02\x02\u02E7\u02EB\x05n8\x02\u02E8" +
59864
+ "\u02E9\x07K\x02\x02\u02E9\u02EB\x05n8\x02\u02EA\u02DB\x03\x02\x02\x02" +
59865
+ "\u02EA\u02DC\x03\x02\x02\x02\u02EA\u02DE\x03\x02\x02\x02\u02EA\u02E0\x03" +
59866
+ "\x02\x02\x02\u02EA\u02E2\x03\x02\x02\x02\u02EA\u02E4\x03\x02\x02\x02\u02EA" +
59867
+ "\u02E6\x03\x02\x02\x02\u02EA\u02E8\x03\x02\x02\x02\u02EBo\x03\x02\x02" +
59868
+ "\x02\u02EC\u02ED\b9\x01\x02\u02ED\u02EE\x05r:\x02\u02EE\u02F8\x03\x02" +
59869
+ "\x02\x02\u02EF\u02F1\f\x03\x02\x02\u02F0\u02F2\x07E\x02\x02\u02F1\u02F0" +
59870
+ "\x03\x02\x02\x02\u02F1\u02F2\x03\x02\x02\x02\u02F2\u02F3\x03\x02\x02\x02" +
59871
+ "\u02F3\u02F4\x05@!\x02\u02F4\u02F5\x05r:\x02\u02F5\u02F7\x03\x02\x02\x02" +
59872
+ "\u02F6\u02EF\x03\x02\x02\x02\u02F7\u02FA\x03\x02\x02\x02\u02F8\u02F6\x03" +
59873
+ "\x02\x02\x02\u02F8\u02F9\x03\x02\x02\x02\u02F9q\x03\x02\x02\x02\u02FA" +
59874
+ "\u02F8\x03\x02\x02\x02\u02FB\u02FF\x05t;\x02\u02FC\u02FD\t\f\x02\x02\u02FD" +
59875
+ "\u02FF\x05t;\x02\u02FE\u02FB\x03\x02\x02\x02\u02FE\u02FC\x03\x02\x02\x02" +
59876
+ "\u02FFs\x03\x02\x02\x02\u0300\u0301\b;\x01\x02\u0301\u0302\x05v<\x02\u0302" +
59877
+ "\u0308\x03\x02\x02\x02\u0303\u0304\f\x03\x02\x02\u0304\u0305\t\r\x02\x02" +
59878
+ "\u0305\u0307\x05x=\x02\u0306\u0303\x03\x02\x02\x02\u0307\u030A\x03\x02" +
59879
+ "\x02\x02\u0308\u0306\x03\x02\x02\x02\u0308\u0309\x03\x02\x02\x02\u0309" +
59880
+ "u\x03\x02\x02\x02\u030A\u0308\x03\x02\x02\x02\u030B\u030F\x05x=\x02\u030C" +
59881
+ "\u030D\x07L\x02\x02\u030D\u030F\x05v<\x02\u030E\u030B\x03\x02\x02\x02" +
59882
+ "\u030E\u030C\x03\x02\x02\x02\u030Fw\x03\x02\x02\x02\u0310\u0311\b=\x01" +
59883
+ "\x02\u0311\u0312\x05z>\x02\u0312\u0318\x03\x02\x02\x02\u0313\u0314\f\x03" +
59884
+ "\x02\x02\u0314\u0315\x07M\x02\x02\u0315\u0317\x05z>\x02\u0316\u0313\x03" +
59885
+ "\x02\x02\x02\u0317\u031A\x03\x02\x02\x02\u0318\u0316\x03\x02\x02\x02\u0318" +
59886
+ "\u0319\x03\x02\x02\x02\u0319y\x03\x02\x02\x02\u031A\u0318\x03\x02\x02" +
59887
+ "\x02\u031B\u031C\b>\x01\x02\u031C\u031D\x05|?\x02\u031D\u0323\x03\x02" +
59888
+ "\x02\x02\u031E\u031F\f\x03\x02\x02\u031F\u0320\x07N\x02\x02\u0320\u0322" +
59889
+ "\x05|?\x02\u0321\u031E\x03\x02\x02\x02\u0322\u0325\x03\x02\x02\x02\u0323" +
59890
+ "\u0321\x03\x02\x02\x02\u0323\u0324\x03\x02\x02\x02\u0324{\x03\x02\x02" +
59891
+ "\x02\u0325\u0323\x03\x02\x02\x02\u0326\u0327\b?\x01\x02\u0327\u0328\x05" +
59892
+ "~@\x02\u0328\u032F\x03\x02\x02\x02\u0329\u032A\f\x03\x02\x02\u032A\u032B" +
59893
+ "\x05> \x02\u032B\u032C\x05~@\x02\u032C\u032E\x03\x02\x02\x02\u032D\u0329" +
59894
+ "\x03\x02\x02\x02\u032E\u0331\x03\x02\x02\x02\u032F\u032D\x03\x02\x02\x02" +
59895
+ "\u032F\u0330\x03\x02\x02\x02\u0330}\x03\x02\x02\x02\u0331\u032F\x03\x02" +
59896
+ "\x02\x02\u0332\u0333\b@\x01\x02\u0333\u0334\x05\x80A\x02\u0334\u033A\x03" +
59897
+ "\x02\x02\x02\u0335\u0336\f\x03\x02\x02\u0336\u0337\t\x0E\x02\x02\u0337" +
59898
+ "\u0339\x05\x80A\x02\u0338\u0335\x03\x02\x02\x02\u0339\u033C\x03\x02\x02" +
59899
+ "\x02\u033A\u0338\x03\x02\x02\x02\u033A\u033B\x03\x02\x02\x02\u033B\x7F" +
59900
+ "\x03\x02\x02\x02\u033C\u033A\x03\x02\x02\x02\u033D\u033E\bA\x01\x02\u033E" +
59901
+ "\u033F\x05\x82B\x02\u033F\u0347\x03\x02\x02\x02\u0340\u0341\f\x03\x02" +
59902
+ "\x02\u0341\u0342\x07\x04\x02\x02\u0342\u0343\x05^0\x02\u0343\u0344\x07" +
59903
+ "\x05\x02\x02\u0344\u0346\x03\x02\x02\x02\u0345\u0340\x03\x02\x02\x02\u0346" +
59904
+ "\u0349\x03\x02\x02\x02\u0347\u0345\x03\x02\x02\x02\u0347\u0348\x03\x02" +
59905
+ "\x02\x02\u0348\x81\x03\x02\x02\x02\u0349\u0347\x03\x02\x02\x02\u034A\u034B" +
59906
+ "\bB\x01\x02\u034B\u0352\x05\x84C\x02\u034C\u034D\x05N(\x02\u034D\u034E" +
59907
+ "\x07\x04\x02\x02\u034E\u034F\x05^0\x02\u034F\u0350\x07\x05\x02\x02\u0350" +
59908
+ "\u0352\x03\x02\x02\x02\u0351\u034A\x03\x02\x02\x02\u0351\u034C\x03\x02" +
59909
+ "\x02\x02\u0352\u0358\x03\x02\x02\x02\u0353\u0354\f\x04\x02\x02\u0354\u0355" +
59910
+ "\x07\x1B\x02\x02\u0355\u0357\x05\x84C\x02\u0356\u0353\x03\x02\x02\x02" +
59911
+ "\u0357\u035A\x03\x02\x02\x02\u0358\u0356\x03\x02\x02\x02\u0358\u0359\x03" +
59912
+ "\x02\x02\x02\u0359\x83\x03\x02\x02\x02\u035A\u0358\x03\x02\x02\x02\u035B" +
59913
+ "\u035C\bC\x01\x02\u035C\u035D\x05\x86D\x02\u035D\u0362\x03\x02\x02\x02" +
59914
+ "\u035E\u035F\f\x03\x02\x02\u035F\u0361\x07Q\x02\x02\u0360\u035E\x03\x02" +
59915
+ "\x02\x02\u0361\u0364\x03\x02\x02\x02\u0362\u0360\x03\x02\x02\x02\u0362" +
59916
+ "\u0363\x03\x02\x02\x02\u0363\x85\x03\x02\x02\x02\u0364\u0362\x03\x02\x02" +
59917
+ "\x02\u0365\u0369\x05\x88E\x02\u0366\u0367\t\x0F\x02\x02\u0367\u0369\x05" +
59918
+ "\x86D\x02\u0368\u0365\x03\x02\x02\x02\u0368\u0366\x03\x02\x02\x02\u0369" +
59919
+ "\x87\x03\x02\x02\x02\u036A\u037D\x050\x19\x02\u036B\u037D\x05J&\x02\u036C" +
59920
+ "\u036D\x07U\x02\x02\u036D\u037D\x05N(\x02\u036E\u036F\x07V\x02\x02\u036F" +
59921
+ "\u037D\x05N(\x02\u0370\u037D\x07W\x02\x02\u0371\u0372\x07\v\x02\x02\u0372" +
59922
+ "\u0373\x05V,\x02\u0373\u0374\x05F$\x02\u0374\u0375\x07\f\x02\x02\u0375" +
59923
+ "\u037D\x03\x02\x02\x02\u0376\u0377\x07\x1D\x02\x02\u0377\u0378\x05`1\x02" +
59924
+ "\u0378\u0379\x07\x1E\x02\x02\u0379\u037D\x03\x02\x02\x02\u037A\u037D\x05" +
59925
+ "D#\x02\u037B\u037D\x05\x8EH\x02\u037C\u036A\x03\x02\x02\x02\u037C\u036B" +
59926
+ "\x03\x02\x02\x02\u037C\u036C\x03\x02\x02\x02\u037C\u036E\x03\x02\x02\x02" +
59927
+ "\u037C\u0370\x03\x02\x02\x02\u037C\u0371\x03\x02\x02\x02\u037C\u0376\x03" +
59928
+ "\x02\x02\x02\u037C\u037A\x03\x02\x02\x02\u037C\u037B\x03\x02\x02\x02\u037D" +
59929
+ "\x89\x03\x02\x02\x02\u037E\u0384\x05J&\x02\u037F\u0380\x05J&\x02\u0380" +
59930
+ "\u0381\x07\\\x02\x02\u0381\u0382\x05\x8AF\x02\u0382\u0384\x03\x02\x02" +
59931
+ "\x02\u0383\u037E\x03\x02\x02\x02\u0383\u037F\x03\x02\x02\x02\u0384\x8B" +
59932
+ "\x03\x02\x02\x02\u0385\u0386\x05\x8EH\x02\u0386\x8D\x03\x02\x02\x02\u0387" +
59933
+ "\u0388\x07X\x02\x02\u0388\x8F\x03\x02\x02\x02\u0389\u038A\x07Y\x02\x02" +
59934
+ "\u038A\u038B\x05N(\x02\u038B\u038D\x05\x9EP\x02\u038C\u038E\x05,\x17\x02" +
59935
+ "\u038D\u038C\x03\x02\x02\x02\u038D\u038E\x03\x02\x02\x02\u038E\x91\x03" +
59936
+ "\x02\x02\x02\u038F\u0390\x05\x1A\x0E\x02\u0390\x93\x03\x02\x02\x02\u0391" +
59937
+ "\u0392\x07Z\x02\x02\u0392\u0393\x05`1\x02\u0393\x95\x03\x02\x02\x02\u0394" +
59938
+ "\u0395\x07[\x02\x02\u0395\u0396\x05N(\x02\u0396\u0397\x07)\x02\x02\u0397" +
59939
+ "\u0398\x05`1\x02\u0398\u0399\x07\"\x02\x02\u0399\u039A\x05\x9EP\x02\u039A" +
59940
+ "\x97\x03\x02\x02\x02\u039B\u039C\x05N(\x02\u039C\u039D\x07\x18\x02\x02" +
59941
+ "\u039D\u039E\x05\x8AF\x02\u039E\u039F\x07a\x02\x02\u039F\u03A0\x05`1\x02" +
59942
+ "\u03A0\x99\x03\x02\x02\x02\u03A1\u03A7\x05\x9CO\x02\u03A2\u03A3\x05\x9C" +
59943
+ "O\x02\u03A3\u03A4\x07k\x02\x02\u03A4\u03A5\x05\x9AN\x02\u03A5\u03A7\x03" +
59944
+ "\x02\x02\x02\u03A6\u03A1\x03\x02\x02\x02\u03A6\u03A2\x03\x02\x02\x02\u03A7" +
59945
+ "\x9B\x03\x02\x02\x02\u03A8\u03A9\x07m\x02\x02\u03A9\x9D\x03\x02\x02\x02" +
59946
+ "\u03AA\u03AE\x07\v\x02\x02\u03AB\u03AD\x05\xA2R\x02\u03AC\u03AB\x03\x02" +
59947
+ "\x02\x02\u03AD\u03B0\x03\x02\x02\x02\u03AE\u03AC\x03\x02\x02\x02\u03AE" +
59948
+ "\u03AF\x03\x02\x02\x02\u03AF\u03B1\x03\x02\x02\x02\u03B0\u03AE\x03\x02" +
59949
+ "\x02\x02\u03B1\u03B7\x07\f\x02\x02\u03B2\u03B4\x07$\x02\x02\u03B3\u03B2" +
59950
+ "\x03\x02\x02\x02\u03B3\u03B4\x03\x02\x02\x02\u03B4\u03B5\x03\x02\x02\x02" +
59951
+ "\u03B5\u03B7\x05J&\x02\u03B6\u03AA\x03\x02\x02\x02\u03B6\u03B3\x03\x02" +
59952
+ "\x02\x02\u03B7\x9F\x03\x02\x02\x02\u03B8\u03B9\x07V\x02\x02\u03B9\u03BE" +
59953
+ "\x05N(\x02\u03BA\u03BE\x05\x9CO\x02\u03BB\u03BC\x07(\x02\x02\u03BC\u03BE" +
59954
+ "\x05\x9CO\x02\u03BD\u03B8\x03\x02\x02\x02\u03BD\u03BA\x03\x02\x02\x02" +
59955
+ "\u03BD\u03BB\x03\x02\x02\x02\u03BE\xA1\x03\x02\x02\x02\u03BF\u03C0\x05" +
59956
+ "\xA4S\x02\u03C0\u03C1\x05@!\x02\u03C1\u03C2\x05\xA6T\x02\u03C2\u03C7\x03" +
59957
+ "\x02\x02\x02\u03C3\u03C4\x07g\x02\x02\u03C4\u03C7\x05\xA4S\x02\u03C5\u03C7" +
59958
+ "\x05J&\x02\u03C6\u03BF\x03\x02\x02\x02\u03C6\u03C3\x03\x02\x02\x02\u03C6" +
59959
+ "\u03C5\x03\x02\x02\x02\u03C7\xA3\x03\x02\x02\x02\u03C8\u03C9\x07L\x02" +
59960
+ "\x02\u03C9\u03D3\x05J&\x02\u03CA\u03D3\x05J&\x02\u03CB\u03CE\x05\xA0Q" +
59961
+ "\x02\u03CC\u03CD\x07\x1B\x02\x02\u03CD\u03CF\x05J&\x02\u03CE\u03CC\x03" +
59962
+ "\x02\x02\x02\u03CF\u03D0\x03\x02\x02\x02\u03D0\u03CE\x03\x02\x02\x02\u03D0" +
59963
+ "\u03D1\x03\x02\x02\x02\u03D1\u03D3\x03\x02\x02\x02\u03D2\u03C8\x03\x02" +
59964
+ "\x02\x02\u03D2\u03CA\x03\x02\x02\x02\u03D2\u03CB\x03\x02\x02\x02\u03D3" +
59965
+ "\xA5\x03\x02\x02\x02\u03D4\u03D5\bT\x01\x02\u03D5\u03DB\x05\xA8U\x02\u03D6" +
59966
+ "\u03D7\x07\x1D\x02\x02\u03D7\u03D8\x05\xA6T\x02\u03D8\u03D9\x07\x1E\x02" +
59967
+ "\x02\u03D9\u03DB\x03\x02\x02\x02\u03DA\u03D4\x03\x02\x02\x02\u03DA\u03D6" +
59968
+ "\x03\x02\x02\x02\u03DB\u03E1\x03\x02\x02\x02\u03DC\u03DD\f\x04\x02\x02" +
59969
+ "\u03DD\u03DE\x07\x0F\x02\x02\u03DE\u03E0\x05\xA8U\x02\u03DF\u03DC\x03" +
59970
+ "\x02\x02\x02\u03E0\u03E3\x03\x02\x02\x02\u03E1\u03DF\x03\x02\x02\x02\u03E1" +
59971
+ "\u03E2\x03\x02\x02\x02\u03E2\xA7\x03\x02\x02\x02\u03E3\u03E1\x03\x02\x02" +
59972
+ "\x02\u03E4\u03E5\bU\x01\x02\u03E5\u03E6\x07\x1D\x02\x02\u03E6\u03E7\x05" +
59973
+ "\xA8U\x02\u03E7\u03E8\x07\x1E\x02\x02\u03E8\u03EB\x03\x02\x02\x02\u03E9" +
59974
+ "\u03EB\x05\xAAV\x02\u03EA\u03E4\x03\x02\x02\x02\u03EA\u03E9\x03\x02\x02" +
59975
+ "\x02\u03EB\u03F1\x03\x02\x02\x02\u03EC\u03ED\f\x04\x02\x02\u03ED\u03EE" +
59976
+ "\t\x10\x02\x02\u03EE\u03F0\x05\xAAV\x02\u03EF\u03EC\x03\x02\x02\x02\u03F0" +
59977
+ "\u03F3\x03\x02\x02\x02\u03F1\u03EF\x03\x02\x02\x02\u03F1\u03F2\x03\x02" +
59978
+ "\x02\x02\u03F2\xA9\x03\x02\x02\x02\u03F3\u03F1\x03\x02\x02\x02\u03F4\u03FB" +
59979
+ "\x05\xA0Q\x02\u03F5\u03FB\x05J&\x02\u03F6\u03F7\x07\x1D\x02\x02\u03F7" +
59980
+ "\u03F8\x05\xA6T\x02\u03F8\u03F9\x07\x1E\x02\x02\u03F9\u03FB\x03\x02\x02" +
59981
+ "\x02\u03FA\u03F4\x03\x02\x02\x02\u03FA\u03F5\x03\x02\x02\x02\u03FA\u03F6" +
59982
+ "\x03\x02\x02\x02\u03FB\xAB\x03\x02\x02\x02x\xAE\xB3\xB7\xC1\xC7\xCD\xD0" +
59610
59983
  "\xD8\xDC\xE2\xE4\xF7\xFA\xFD\u0100\u0105\u0109\u010D\u0117\u011A\u0123" +
59611
59984
  "\u0128\u012D\u0132\u0137\u0144\u0148\u014C\u0155\u015A\u015D\u0161\u0168" +
59612
59985
  "\u016D\u0170\u0174\u0179\u017D\u0180\u0184\u018A\u018E\u0196\u019F\u01A3" +
59613
- "\u01A6\u01AF\u01B2\u01B9\u01BD\u01C2\u01CF\u01D2\u01D6\u01DF\u01E3\u01EC" +
59614
- "\u01F0\u01FA\u0205\u0209\u020E\u021A\u0222\u0228\u022C\u0233\u0239\u0240" +
59615
- "\u0243\u024C\u0253\u025A\u0261\u0268\u026F\u0276\u027D\u028A\u028F\u0299" +
59616
- "\u02A4\u02AF\u02B8\u02BA\u02C4\u02D8\u02E9\u02F0\u02F7\u02FD\u0307\u030D" +
59617
- "\u0317\u0322\u032E\u0339\u0346\u0350\u0357\u0361\u0367\u037B\u0382\u038C" +
59618
- "\u03A5\u03AD\u03B2\u03B5\u03BC\u03C5\u03CF\u03D1\u03D9\u03E0\u03E9\u03F0" +
59619
- "\u03F9";
59986
+ "\u01A6\u01AF\u01B3\u01BA\u01BE\u01C3\u01D0\u01D3\u01D7\u01E0\u01E4\u01ED" +
59987
+ "\u01F1\u01FB\u0206\u020A\u020F\u021B\u0223\u0229\u022D\u0234\u023A\u0241" +
59988
+ "\u0244\u024D\u0254\u025B\u0262\u0269\u0270\u0277\u027E\u028B\u0290\u029A" +
59989
+ "\u02A5\u02B0\u02B9\u02BB\u02C5\u02D9\u02EA\u02F1\u02F8\u02FE\u0308\u030E" +
59990
+ "\u0318\u0323\u032F\u033A\u0347\u0351\u0358\u0362\u0368\u037C\u0383\u038D" +
59991
+ "\u03A6\u03AE\u03B3\u03B6\u03BD\u03C6\u03D0\u03D2\u03DA\u03E1\u03EA\u03F1" +
59992
+ "\u03FA";
59620
59993
  ForgeParser._serializedATN = Utils.join([
59621
59994
  ForgeParser._serializedATNSegment0,
59622
59995
  ForgeParser._serializedATNSegment1,
@@ -59767,7 +60140,7 @@ class ImportDeclContext extends ParserRuleContext_1.ParserRuleContext {
59767
60140
  name() {
59768
60141
  return this.tryGetRuleContext(0, NameContext);
59769
60142
  }
59770
- FILE_PATH_TOK() { return this.tryGetToken(ForgeParser.FILE_PATH_TOK, 0); }
60143
+ STRING_TOK() { return this.tryGetToken(ForgeParser.STRING_TOK, 0); }
59771
60144
  constructor(parent, invokingState) {
59772
60145
  super(parent, invokingState);
59773
60146
  }
@@ -60605,6 +60978,7 @@ class ConstContext extends ParserRuleContext_1.ParserRuleContext {
60605
60978
  return this.tryGetRuleContext(0, NumberContext);
60606
60979
  }
60607
60980
  MINUS_TOK() { return this.tryGetToken(ForgeParser.MINUS_TOK, 0); }
60981
+ STRING_TOK() { return this.tryGetToken(ForgeParser.STRING_TOK, 0); }
60608
60982
  constructor(parent, invokingState) {
60609
60983
  super(parent, invokingState);
60610
60984
  }
@@ -61220,7 +61594,7 @@ class OptionDeclContext extends ParserRuleContext_1.ParserRuleContext {
61220
61594
  return this.getRuleContext(i, QualNameContext);
61221
61595
  }
61222
61596
  }
61223
- FILE_PATH_TOK() { return this.tryGetToken(ForgeParser.FILE_PATH_TOK, 0); }
61597
+ STRING_TOK() { return this.tryGetToken(ForgeParser.STRING_TOK, 0); }
61224
61598
  number() {
61225
61599
  return this.tryGetRuleContext(0, NumberContext);
61226
61600
  }
@@ -63337,6 +63711,11 @@ class SimpleGraphQueryEvaluator {
63337
63711
  // underlying IDataInstance -- callers must signal that themselves.
63338
63712
  this.cachedEvaluator = null;
63339
63713
  this.cachedEvaluatorDatum = null;
63714
+ // Diagnostics from the most recent evaluateExpression call. Kept here rather
63715
+ // than read back off the evaluator, because a failed evaluation discards the
63716
+ // evaluator — and a query that warns and *then* errors is exactly when the
63717
+ // warning is most worth keeping.
63718
+ this.lastDiagnostics = [];
63340
63719
  this.datum = datum;
63341
63720
  }
63342
63721
  /**
@@ -63362,6 +63741,24 @@ class SimpleGraphQueryEvaluator {
63362
63741
  //////// This is empty on parse error? //TODO//////
63363
63742
  return tree;
63364
63743
  }
63744
+ /**
63745
+ * Evaluate `forgeExpr` and return both its value and any diagnostics raised
63746
+ * along the way.
63747
+ *
63748
+ * Diagnostics are advisory and never change the value — today the only kind
63749
+ * is an unresolved name, which evaluates to the empty set. Consumers should
63750
+ * surface them to whoever authored the query; see {@link Diagnostic}.
63751
+ *
63752
+ * Note that an unresolved name is a warning rather than an error on purpose.
63753
+ * An instance carries only populated types and relations, so a sig that is
63754
+ * empty here looks exactly like a typo, and a sig can empty out between
63755
+ * frames of one trace. Deciding which it is needs context this library does
63756
+ * not have.
63757
+ */
63758
+ evaluateExpressionWithDiagnostics(forgeExpr) {
63759
+ const value = this.evaluateExpression(forgeExpr);
63760
+ return { value, diagnostics: this.lastDiagnostics };
63761
+ }
63365
63762
  evaluateExpression(forgeExpr) {
63366
63763
  // Check cache first
63367
63764
  let tree;
@@ -63377,6 +63774,7 @@ class SimpleGraphQueryEvaluator {
63377
63774
  }
63378
63775
  catch (e) {
63379
63776
  // if we can't parse the expression, we return an error
63777
+ this.lastDiagnostics = []; // nothing was evaluated
63380
63778
  return {
63381
63779
  error: new Error(`Error parsing expression "${forgeExpr}"`)
63382
63780
  };
@@ -63390,12 +63788,20 @@ class SimpleGraphQueryEvaluator {
63390
63788
  this.cachedEvaluatorDatum = this.datum;
63391
63789
  }
63392
63790
  const evaluator = this.cachedEvaluator;
63791
+ // Diagnostics describe this evaluation, not the whole life of the reused
63792
+ // evaluator, so clear whatever the previous call left behind.
63793
+ evaluator.resetDiagnostics();
63393
63794
  try {
63394
63795
  let result = evaluator.visit(tree);
63796
+ this.lastDiagnostics = evaluator.getDiagnostics();
63395
63797
  // ensure we're visiting an ExprContext
63396
63798
  return result;
63397
63799
  }
63398
63800
  catch (error) {
63801
+ // Capture diagnostics BEFORE discarding the evaluator. A query that
63802
+ // warns about an unresolved name and then fails for an unrelated reason
63803
+ // should still surface the warning.
63804
+ this.lastDiagnostics = evaluator.getDiagnostics();
63399
63805
  // The visit threw mid-traversal, so the evaluator's transient state
63400
63806
  // (environment stack) may be inconsistent. Discard the cached
63401
63807
  // evaluator so the next call rebuilds from a clean slate. The