solve-engine 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/dist/{EngineError-B61GS1jp.d.cts → EngineError-CNA_rHY-.d.cts} +6 -0
  2. package/dist/{EngineError-B61GS1jp.d.ts → EngineError-CNA_rHY-.d.ts} +6 -0
  3. package/dist/{Lexer-BOs7euZe.d.cts → Lexer-B4C1qHXu.d.cts} +1 -1
  4. package/dist/{Lexer-CSI_lwbW.d.ts → Lexer-DKMlj7Sy.d.ts} +1 -1
  5. package/dist/{PackageCompatibility-B-7rK1TD.d.cts → PackageCompatibility-B6NX9IaN.d.cts} +1 -1
  6. package/dist/{PackageCompatibility-Dh59eF-X.d.ts → PackageCompatibility-Ceg5XdAp.d.ts} +1 -1
  7. package/dist/{PackageRegistry-BHWJP83F.d.cts → PackageRegistry-DnJYVw9G.d.cts} +55 -8
  8. package/dist/{PackageRegistry-_8rDlvxI.d.ts → PackageRegistry-DrCPQNyy.d.ts} +55 -8
  9. package/dist/{Parselet-BBT8riYh.d.ts → Parselet-Bhf7d0_W.d.ts} +2 -2
  10. package/dist/{Parselet-BHcgK9S7.d.cts → Parselet-Cv7S7KRt.d.cts} +2 -2
  11. package/dist/{ScopeManager-CxA24W5n.d.ts → ScopeManager-Bzq87GfA.d.ts} +10 -3
  12. package/dist/{ScopeManager-8vf02dwj.d.cts → ScopeManager-DRDBVfan.d.cts} +10 -3
  13. package/dist/{Token-B1hdkedD.d.cts → Token-CbP_OutD.d.cts} +9 -0
  14. package/dist/{Token-B1hdkedD.d.ts → Token-CbP_OutD.d.ts} +9 -0
  15. package/dist/{TokenNormalizer-C6VzZgHa.d.ts → TokenNormalizer-DCWdZjGz.d.ts} +1 -1
  16. package/dist/{TokenNormalizer-DRc1Js1V.d.cts → TokenNormalizer-DnlL7_8c.d.cts} +1 -1
  17. package/dist/{VMCheckpoints-MK--EBH2.d.ts → VMCheckpoints-C6c17Hbo.d.ts} +2 -2
  18. package/dist/{VMCheckpoints-ELYqITdF.d.cts → VMCheckpoints-dZxSMGHG.d.cts} +2 -2
  19. package/dist/{Value-BUi1RA3S.d.cts → Value-DZNQ_PU7.d.cts} +32 -5
  20. package/dist/{Value-BUi1RA3S.d.ts → Value-DZNQ_PU7.d.ts} +32 -5
  21. package/dist/{WorkerError-_-RkoQ5P.d.ts → WorkerError-B7t7R2-m.d.ts} +1 -1
  22. package/dist/{WorkerError-gzmaopj2.d.cts → WorkerError-Djd7GGGa.d.cts} +1 -1
  23. package/dist/{chunk-SSV46KFA.cjs → chunk-4K5W7EH2.cjs} +6 -6
  24. package/dist/{chunk-SSV46KFA.cjs.map → chunk-4K5W7EH2.cjs.map} +1 -1
  25. package/dist/{chunk-267JPOTF.js → chunk-5EFKSKMA.js} +11 -4
  26. package/dist/chunk-5EFKSKMA.js.map +1 -0
  27. package/dist/{chunk-536WPM2V.cjs → chunk-7AXJNQMF.cjs} +17 -3
  28. package/dist/chunk-7AXJNQMF.cjs.map +1 -0
  29. package/dist/{chunk-LHZ6VOA7.js → chunk-7JM3F4KL.js} +39 -8
  30. package/dist/chunk-7JM3F4KL.js.map +1 -0
  31. package/dist/{chunk-N5NNW4VG.cjs → chunk-7USV76HV.cjs} +6 -6
  32. package/dist/{chunk-N5NNW4VG.cjs.map → chunk-7USV76HV.cjs.map} +1 -1
  33. package/dist/{chunk-HIQ5HSZL.cjs → chunk-A2DZ5BEJ.cjs} +53 -46
  34. package/dist/{chunk-HIQ5HSZL.cjs.map → chunk-A2DZ5BEJ.cjs.map} +1 -1
  35. package/dist/{chunk-CKQMXMHR.cjs → chunk-AKNGX4TZ.cjs} +28 -11
  36. package/dist/chunk-AKNGX4TZ.cjs.map +1 -0
  37. package/dist/{chunk-I4GAWIPW.js → chunk-AOH6UR2L.js} +6 -6
  38. package/dist/{chunk-I4GAWIPW.js.map → chunk-AOH6UR2L.js.map} +1 -1
  39. package/dist/{chunk-T6ZYQJ63.cjs → chunk-BESTLPRK.cjs} +326 -214
  40. package/dist/chunk-BESTLPRK.cjs.map +1 -0
  41. package/dist/{chunk-Z7XGGLI2.js → chunk-BSPXMGIS.js} +3 -3
  42. package/dist/{chunk-Z7XGGLI2.js.map → chunk-BSPXMGIS.js.map} +1 -1
  43. package/dist/{chunk-SRGQ72IR.cjs → chunk-C2OMO3WN.cjs} +376 -370
  44. package/dist/chunk-C2OMO3WN.cjs.map +1 -0
  45. package/dist/{chunk-GLA4JXBO.js → chunk-CSDQMDU2.js} +4 -4
  46. package/dist/{chunk-GLA4JXBO.js.map → chunk-CSDQMDU2.js.map} +1 -1
  47. package/dist/{chunk-7KYSUDQO.js → chunk-F4UB4XIL.js} +4 -4
  48. package/dist/{chunk-7KYSUDQO.js.map → chunk-F4UB4XIL.js.map} +1 -1
  49. package/dist/{chunk-WXEHD6TT.js → chunk-FE4RC37D.js} +15 -9
  50. package/dist/chunk-FE4RC37D.js.map +1 -0
  51. package/dist/{chunk-7ZX6B7SY.cjs → chunk-FR7RNOPT.cjs} +637 -556
  52. package/dist/chunk-FR7RNOPT.cjs.map +1 -0
  53. package/dist/{chunk-QFTDTX6K.cjs → chunk-G2YPPLGX.cjs} +29 -2
  54. package/dist/chunk-G2YPPLGX.cjs.map +1 -0
  55. package/dist/{chunk-HVRVSI2Z.cjs → chunk-GDEU72RG.cjs} +86 -86
  56. package/dist/{chunk-HVRVSI2Z.cjs.map → chunk-GDEU72RG.cjs.map} +1 -1
  57. package/dist/{chunk-MN3LHRGV.cjs → chunk-HKTQCQ4Z.cjs} +860 -489
  58. package/dist/chunk-HKTQCQ4Z.cjs.map +1 -0
  59. package/dist/{chunk-XA4CKRML.cjs → chunk-HWHU642X.cjs} +2 -2
  60. package/dist/{chunk-XA4CKRML.cjs.map → chunk-HWHU642X.cjs.map} +1 -1
  61. package/dist/{chunk-CUR2WLI4.cjs → chunk-ICEKS6YC.cjs} +11 -11
  62. package/dist/{chunk-CUR2WLI4.cjs.map → chunk-ICEKS6YC.cjs.map} +1 -1
  63. package/dist/{chunk-NNZAEUDW.js → chunk-IJGOFP2J.js} +138 -26
  64. package/dist/chunk-IJGOFP2J.js.map +1 -0
  65. package/dist/{chunk-ENKKJYD3.js → chunk-IQJGDZOP.js} +4 -4
  66. package/dist/{chunk-ENKKJYD3.js.map → chunk-IQJGDZOP.js.map} +1 -1
  67. package/dist/{chunk-2TZKENDH.cjs → chunk-IT74O4BE.cjs} +15 -7
  68. package/dist/chunk-IT74O4BE.cjs.map +1 -0
  69. package/dist/{chunk-ZVTWQLK4.cjs → chunk-KXDQKVNX.cjs} +10 -10
  70. package/dist/{chunk-ZVTWQLK4.cjs.map → chunk-KXDQKVNX.cjs.map} +1 -1
  71. package/dist/{chunk-BYJBUL7U.js → chunk-L5YHV6BQ.js} +5 -5
  72. package/dist/{chunk-BYJBUL7U.js.map → chunk-L5YHV6BQ.js.map} +1 -1
  73. package/dist/{chunk-E23GZEWL.cjs → chunk-LO7HU5WB.cjs} +8 -8
  74. package/dist/{chunk-E23GZEWL.cjs.map → chunk-LO7HU5WB.cjs.map} +1 -1
  75. package/dist/{chunk-UO6BUV6K.js → chunk-LSALB3IN.js} +17 -3
  76. package/dist/chunk-LSALB3IN.js.map +1 -0
  77. package/dist/{chunk-J45BCEZ4.cjs → chunk-MI7OTUHL.cjs} +27 -27
  78. package/dist/{chunk-J45BCEZ4.cjs.map → chunk-MI7OTUHL.cjs.map} +1 -1
  79. package/dist/{chunk-B4HBEFTB.cjs → chunk-MIGXCBXT.cjs} +8 -2
  80. package/dist/chunk-MIGXCBXT.cjs.map +1 -0
  81. package/dist/{chunk-ERCOHGXD.js → chunk-N7OA4WPJ.js} +8 -2
  82. package/dist/chunk-N7OA4WPJ.js.map +1 -0
  83. package/dist/{chunk-4D6NIHE2.js → chunk-NAWZATKT.js} +29 -2
  84. package/dist/chunk-NAWZATKT.js.map +1 -0
  85. package/dist/{chunk-JG6ZJ2WU.js → chunk-ORM7CHYZ.js} +23 -5
  86. package/dist/chunk-ORM7CHYZ.js.map +1 -0
  87. package/dist/{chunk-B7NLZMQ3.cjs → chunk-PCZVMMWU.cjs} +8 -8
  88. package/dist/{chunk-B7NLZMQ3.cjs.map → chunk-PCZVMMWU.cjs.map} +1 -1
  89. package/dist/{chunk-DLEBSLF4.js → chunk-RNKDIXDV.js} +4 -4
  90. package/dist/{chunk-DLEBSLF4.js.map → chunk-RNKDIXDV.js.map} +1 -1
  91. package/dist/{chunk-YRIKITGF.cjs → chunk-TC6BTUSU.cjs} +55 -24
  92. package/dist/chunk-TC6BTUSU.cjs.map +1 -0
  93. package/dist/{chunk-4HQKTMWG.js → chunk-TPOK3UNI.js} +387 -17
  94. package/dist/chunk-TPOK3UNI.js.map +1 -0
  95. package/dist/{chunk-CCBZZQAE.js → chunk-UF6JG5SG.js} +2 -2
  96. package/dist/{chunk-CCBZZQAE.js.map → chunk-UF6JG5SG.js.map} +1 -1
  97. package/dist/{chunk-NKW7LKYU.js → chunk-WMQRJTAO.js} +88 -7
  98. package/dist/chunk-WMQRJTAO.js.map +1 -0
  99. package/dist/{chunk-ZMW6NU2K.cjs → chunk-YJHY7CMN.cjs} +95 -77
  100. package/dist/chunk-YJHY7CMN.cjs.map +1 -0
  101. package/dist/{chunk-3OWCDIPN.js → chunk-YNIWOYW6.js} +21 -4
  102. package/dist/chunk-YNIWOYW6.js.map +1 -0
  103. package/dist/{chunk-WWQEY7BV.js → chunk-ZN6YYPIW.js} +3 -3
  104. package/dist/{chunk-WWQEY7BV.js.map → chunk-ZN6YYPIW.js.map} +1 -1
  105. package/dist/{chunk-NNQ2TYDF.js → chunk-ZNFFTYWH.js} +11 -5
  106. package/dist/chunk-ZNFFTYWH.js.map +1 -0
  107. package/dist/constants.cjs +5 -5
  108. package/dist/constants.js +2 -2
  109. package/dist/engine.cjs +33 -33
  110. package/dist/engine.d.cts +27 -11
  111. package/dist/engine.d.ts +27 -11
  112. package/dist/engine.js +20 -20
  113. package/dist/errors.cjs +26 -26
  114. package/dist/errors.d.cts +3 -3
  115. package/dist/errors.d.ts +3 -3
  116. package/dist/errors.js +2 -2
  117. package/dist/format.cjs +7 -7
  118. package/dist/format.d.cts +1 -1
  119. package/dist/format.d.ts +1 -1
  120. package/dist/format.js +4 -4
  121. package/dist/index.cjs +48 -48
  122. package/dist/index.d.cts +11 -11
  123. package/dist/index.d.ts +11 -11
  124. package/dist/index.js +21 -21
  125. package/dist/language.cjs +7 -7
  126. package/dist/language.d.cts +10 -10
  127. package/dist/language.d.ts +10 -10
  128. package/dist/language.js +2 -2
  129. package/dist/lexer.cjs +16 -16
  130. package/dist/lexer.d.cts +3 -3
  131. package/dist/lexer.d.ts +3 -3
  132. package/dist/lexer.js +5 -5
  133. package/dist/normalizer.cjs +10 -10
  134. package/dist/normalizer.d.cts +3 -3
  135. package/dist/normalizer.d.ts +3 -3
  136. package/dist/normalizer.js +4 -4
  137. package/dist/packages.cjs +40 -36
  138. package/dist/packages.d.cts +37 -11
  139. package/dist/packages.d.ts +37 -11
  140. package/dist/packages.js +11 -11
  141. package/dist/parser.cjs +13 -13
  142. package/dist/parser.d.cts +4 -4
  143. package/dist/parser.d.ts +4 -4
  144. package/dist/parser.js +5 -5
  145. package/dist/{pipeline-DCd5M6Gk.d.ts → pipeline-D-PS9gVw.d.ts} +3 -3
  146. package/dist/{pipeline-CtfJtPQc.d.cts → pipeline-DtSBJ8TS.d.cts} +3 -3
  147. package/dist/resolvers.d.cts +2 -2
  148. package/dist/resolvers.d.ts +2 -2
  149. package/dist/testing.cjs +26 -26
  150. package/dist/testing.d.cts +10 -10
  151. package/dist/testing.d.ts +10 -10
  152. package/dist/testing.js +19 -19
  153. package/dist/uom.cjs +8 -8
  154. package/dist/uom.d.cts +2 -2
  155. package/dist/uom.d.ts +2 -2
  156. package/dist/uom.js +4 -4
  157. package/dist/vm.cjs +32 -32
  158. package/dist/vm.d.cts +7 -7
  159. package/dist/vm.d.ts +7 -7
  160. package/dist/vm.js +7 -7
  161. package/dist/worker.cjs +38 -38
  162. package/dist/worker.d.cts +10 -10
  163. package/dist/worker.d.ts +10 -10
  164. package/dist/worker.js +20 -20
  165. package/package.json +1 -1
  166. package/dist/chunk-267JPOTF.js.map +0 -1
  167. package/dist/chunk-2TZKENDH.cjs.map +0 -1
  168. package/dist/chunk-3OWCDIPN.js.map +0 -1
  169. package/dist/chunk-4D6NIHE2.js.map +0 -1
  170. package/dist/chunk-4HQKTMWG.js.map +0 -1
  171. package/dist/chunk-536WPM2V.cjs.map +0 -1
  172. package/dist/chunk-7ZX6B7SY.cjs.map +0 -1
  173. package/dist/chunk-B4HBEFTB.cjs.map +0 -1
  174. package/dist/chunk-CKQMXMHR.cjs.map +0 -1
  175. package/dist/chunk-ERCOHGXD.js.map +0 -1
  176. package/dist/chunk-JG6ZJ2WU.js.map +0 -1
  177. package/dist/chunk-LHZ6VOA7.js.map +0 -1
  178. package/dist/chunk-MN3LHRGV.cjs.map +0 -1
  179. package/dist/chunk-NKW7LKYU.js.map +0 -1
  180. package/dist/chunk-NNQ2TYDF.js.map +0 -1
  181. package/dist/chunk-NNZAEUDW.js.map +0 -1
  182. package/dist/chunk-QFTDTX6K.cjs.map +0 -1
  183. package/dist/chunk-SRGQ72IR.cjs.map +0 -1
  184. package/dist/chunk-T6ZYQJ63.cjs.map +0 -1
  185. package/dist/chunk-UO6BUV6K.js.map +0 -1
  186. package/dist/chunk-WXEHD6TT.js.map +0 -1
  187. package/dist/chunk-YRIKITGF.cjs.map +0 -1
  188. package/dist/chunk-ZMW6NU2K.cjs.map +0 -1
@@ -1,23 +1,23 @@
1
1
  'use strict';
2
2
 
3
- var chunkJ45BCEZ4_cjs = require('./chunk-J45BCEZ4.cjs');
4
- var chunkCUR2WLI4_cjs = require('./chunk-CUR2WLI4.cjs');
3
+ var chunkMI7OTUHL_cjs = require('./chunk-MI7OTUHL.cjs');
4
+ var chunkICEKS6YC_cjs = require('./chunk-ICEKS6YC.cjs');
5
5
  var chunkADBA3XBE_cjs = require('./chunk-ADBA3XBE.cjs');
6
- var chunkSSV46KFA_cjs = require('./chunk-SSV46KFA.cjs');
6
+ var chunk4K5W7EH2_cjs = require('./chunk-4K5W7EH2.cjs');
7
7
  var chunkZ2XP767T_cjs = require('./chunk-Z2XP767T.cjs');
8
- var chunk7ZX6B7SY_cjs = require('./chunk-7ZX6B7SY.cjs');
9
- var chunkZVTWQLK4_cjs = require('./chunk-ZVTWQLK4.cjs');
8
+ var chunkFR7RNOPT_cjs = require('./chunk-FR7RNOPT.cjs');
9
+ var chunkKXDQKVNX_cjs = require('./chunk-KXDQKVNX.cjs');
10
10
  var chunkVEKIWQ3F_cjs = require('./chunk-VEKIWQ3F.cjs');
11
11
  var chunkALYRJ72W_cjs = require('./chunk-ALYRJ72W.cjs');
12
- var chunkHIQ5HSZL_cjs = require('./chunk-HIQ5HSZL.cjs');
13
- var chunk2TZKENDH_cjs = require('./chunk-2TZKENDH.cjs');
12
+ var chunkA2DZ5BEJ_cjs = require('./chunk-A2DZ5BEJ.cjs');
13
+ var chunkIT74O4BE_cjs = require('./chunk-IT74O4BE.cjs');
14
14
  var chunkEJ3ILXX6_cjs = require('./chunk-EJ3ILXX6.cjs');
15
- var chunkZMW6NU2K_cjs = require('./chunk-ZMW6NU2K.cjs');
16
- var chunkQFTDTX6K_cjs = require('./chunk-QFTDTX6K.cjs');
15
+ var chunkYJHY7CMN_cjs = require('./chunk-YJHY7CMN.cjs');
16
+ var chunkG2YPPLGX_cjs = require('./chunk-G2YPPLGX.cjs');
17
17
  var chunkOUHT5Z36_cjs = require('./chunk-OUHT5Z36.cjs');
18
18
  var chunkAQNHHJMJ_cjs = require('./chunk-AQNHHJMJ.cjs');
19
19
  var chunkAMOJYLG2_cjs = require('./chunk-AMOJYLG2.cjs');
20
- var chunkB4HBEFTB_cjs = require('./chunk-B4HBEFTB.cjs');
20
+ var chunkMIGXCBXT_cjs = require('./chunk-MIGXCBXT.cjs');
21
21
 
22
22
  // src/packages/arithmetic/parselets/NumberParselet.ts
23
23
  var CHAINED_DOT_THOUSANDS_GROUPS = /^\d{1,3}(\.\d{3}){2,}$/;
@@ -33,17 +33,17 @@ var NumberParselet = class {
33
33
  if (raw.startsWith("0x") || raw.startsWith("0X")) {
34
34
  v = parseInt(raw, 16);
35
35
  if (Number.isNaN(v)) {
36
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing("INVALID_NUMBER_LITERAL", `Invalid hex literal: "${raw}"`, { raw });
36
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing("INVALID_NUMBER_LITERAL", `Invalid hex literal: "${raw}"`, { raw });
37
37
  }
38
38
  } else if (raw.startsWith("0b") || raw.startsWith("0B")) {
39
39
  v = parseInt(raw.slice(2), 2);
40
40
  if (Number.isNaN(v)) {
41
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing("INVALID_NUMBER_LITERAL", `Invalid binary literal: "${raw}"`, { raw });
41
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing("INVALID_NUMBER_LITERAL", `Invalid binary literal: "${raw}"`, { raw });
42
42
  }
43
43
  } else if (raw.startsWith("0o") || raw.startsWith("0O")) {
44
44
  v = parseInt(raw.slice(2), 8);
45
45
  if (Number.isNaN(v)) {
46
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing("INVALID_NUMBER_LITERAL", `Invalid octal literal: "${raw}"`, { raw });
46
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing("INVALID_NUMBER_LITERAL", `Invalid octal literal: "${raw}"`, { raw });
47
47
  }
48
48
  } else if (CHAINED_DOT_THOUSANDS_GROUPS.test(raw)) {
49
49
  v = parseFloat(raw.split(".").join(""));
@@ -181,7 +181,7 @@ function largeNumberSuffixNormalizerRule(priority = 65) {
181
181
  const scaled = scaleDecimalString(numberToken.text, magnitude);
182
182
  return {
183
183
  consumed: 2,
184
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("NUMBER", scaled, tokens.slice(pos, pos + 2))],
184
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("NUMBER", scaled, tokens.slice(pos, pos + 2))],
185
185
  ruleName: "arithmetic:large-number-suffix"
186
186
  };
187
187
  }
@@ -204,35 +204,35 @@ var ARITHMETIC_PACKAGE = {
204
204
  { tokenType: "BIT_NOT", parselet: new PrefixOpParselet(36 /* BIT_NOT */) }
205
205
  ],
206
206
  infixParselets: [
207
- { tokenType: "PLUS", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.Sum, 20 /* ADD */) },
207
+ { tokenType: "PLUS", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Sum, 20 /* ADD */) },
208
208
  // The word "and", which adds exactly like "+" but at a looser binding
209
209
  // power so a phrase parselet can use it as a list separator. See
210
210
  // Token.ts's AND_CONJ comment for why it is not simply mapped to PLUS.
211
- { tokenType: "AND_CONJ", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.Conjunction, 20 /* ADD */) },
212
- { tokenType: "MINUS", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.Sum, 21 /* SUB */) },
213
- { tokenType: "STAR", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.Product, 22 /* MUL */) },
214
- { tokenType: "SLASH", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.Product, 23 /* DIV */) },
215
- { tokenType: "MOD", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.Product, 24 /* MOD */) },
211
+ { tokenType: "AND_CONJ", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Conjunction, 20 /* ADD */) },
212
+ { tokenType: "MINUS", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Sum, 21 /* SUB */) },
213
+ { tokenType: "STAR", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Product, 22 /* MUL */) },
214
+ { tokenType: "SLASH", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Product, 23 /* DIV */) },
215
+ { tokenType: "MOD", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Product, 24 /* MOD */) },
216
216
  // `^` is right-associative, so "2 ^ 3 ^ 2" is 2^(3^2) = 512. The Tier 1
217
217
  // fast path in PrecedenceParser is what actually runs for `^`; this
218
218
  // registration has to agree with it or the two tiers describe different
219
219
  // languages.
220
- { tokenType: "CARET", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.Exponent, 25 /* EXP */, true) },
221
- { tokenType: "TIMES_BY", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.Product, 22 /* MUL */) },
222
- { tokenType: "MULTIPLY_BY", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.Product, 22 /* MUL */) },
223
- { tokenType: "DIVIDE_BY", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.Product, 23 /* DIV */) },
220
+ { tokenType: "CARET", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Exponent, 25 /* EXP */, true) },
221
+ { tokenType: "TIMES_BY", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Product, 22 /* MUL */) },
222
+ { tokenType: "MULTIPLY_BY", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Product, 22 /* MUL */) },
223
+ { tokenType: "DIVIDE_BY", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Product, 23 /* DIV */) },
224
224
  // The shifts and the bitwise trio, at the levels BindingPower gives them
225
225
  // and therefore at C and JavaScript precedence. These six are declared
226
226
  // twice, here and in BUILTIN_INFIX_BP, and only the Tier 1 numbers are
227
227
  // ever read, so the levels must be the SAME names in both places. When
228
228
  // they were not, the four that had a fast-path entry ran at one level
229
229
  // while `>>>`, which had none, ran at another.
230
- { tokenType: "LSHIFT", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.Shift, 30 /* LSHIFT */) },
231
- { tokenType: "RSHIFT", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.Shift, 31 /* RSHIFT */) },
232
- { tokenType: "URSHIFT", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.Shift, 32 /* URSHIFT */) },
233
- { tokenType: "BIT_AND", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.BitwiseAnd, 33 /* BIT_AND */) },
234
- { tokenType: "BIT_OR", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.BitwiseOr, 34 /* BIT_OR */) },
235
- { tokenType: "BIT_XOR", parselet: new BinaryOpParselet(chunkJ45BCEZ4_cjs.BindingPower.BitwiseXor, 35 /* BIT_XOR */) }
230
+ { tokenType: "LSHIFT", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Shift, 30 /* LSHIFT */) },
231
+ { tokenType: "RSHIFT", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Shift, 31 /* RSHIFT */) },
232
+ { tokenType: "URSHIFT", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Shift, 32 /* URSHIFT */) },
233
+ { tokenType: "BIT_AND", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.BitwiseAnd, 33 /* BIT_AND */) },
234
+ { tokenType: "BIT_OR", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.BitwiseOr, 34 /* BIT_OR */) },
235
+ { tokenType: "BIT_XOR", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.BitwiseXor, 35 /* BIT_XOR */) }
236
236
  ],
237
237
  normalizerRules: [largeNumberSuffixNormalizerRule()]
238
238
  };
@@ -241,7 +241,7 @@ var ARITHMETIC_PACKAGE = {
241
241
  var PercentParselet = class {
242
242
  constructor() {
243
243
  this.category = "Percentage";
244
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Prefix;
244
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Prefix;
245
245
  }
246
246
  parse(parser, left, token, builder) {
247
247
  builder.emitOpcode(10 /* PUSH_NUMBER */);
@@ -257,7 +257,7 @@ var IsWhatParselet = class {
257
257
  this.category = "Percentage";
258
258
  // Below arithmetic, so the whole expression to the left is the value being
259
259
  // asked about: `10 + 10 is what % of 200` asks about 20.
260
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
260
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
261
261
  }
262
262
  parse(parser, _left, _token, builder) {
263
263
  if (nextWordIs(parser, "what")) {
@@ -272,7 +272,7 @@ var IsWhatParselet = class {
272
272
  */
273
273
  parseWhatRate(parser, builder) {
274
274
  if (!parser.match("PERCENT")) {
275
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
275
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
276
276
  "IS_WHAT_EXPECTED_PERCENT",
277
277
  'Expected "%" after "is what", as in "20 is what % of 200"'
278
278
  );
@@ -282,7 +282,7 @@ var IsWhatParselet = class {
282
282
  builder.emitOpcode(74 /* TO_PERCENTAGE */);
283
283
  return;
284
284
  }
285
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
285
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
286
286
  builder.emitOpcode(23 /* DIV */);
287
287
  if (preposition === "off") {
288
288
  builder.emitOpcode(10 /* PUSH_NUMBER */);
@@ -300,7 +300,7 @@ var IsWhatParselet = class {
300
300
  * `<part> is <rate> of|off|on what`, solving for the base.
301
301
  */
302
302
  parseWhatBase(parser, builder) {
303
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
303
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
304
304
  if (parser.match("TO")) {
305
305
  expectWord(parser, "what", '"81 is 9 to what power"');
306
306
  expectWord(parser, "power", '"81 is 9 to what power"');
@@ -317,7 +317,7 @@ var IsWhatParselet = class {
317
317
  }
318
318
  const preposition = parser.match("OF_WHAT") ? "of" : parser.match("OFF_WHAT") ? "off" : parser.match("ON_WHAT") ? "on" : null;
319
319
  if (preposition === null) {
320
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
320
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
321
321
  "IS_WHAT_EXPECTED_PREPOSITION",
322
322
  'Expected "of what", "off what" or "on what", as in "20 is 10% of what"'
323
323
  );
@@ -343,7 +343,7 @@ function nextWordIs(parser, word) {
343
343
  }
344
344
  function expectWord(parser, word, example) {
345
345
  if (!nextWordIs(parser, word)) {
346
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
346
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
347
347
  "IS_WHAT_EXPECTED_WORD",
348
348
  `Expected "${word}" here, as in ${example}`
349
349
  );
@@ -366,10 +366,10 @@ var OnOffBaseParselet = class {
366
366
  constructor(sign) {
367
367
  this.sign = sign;
368
368
  this.category = "Percentage";
369
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
369
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
370
370
  }
371
371
  parse(parser, _left, _token, builder) {
372
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
372
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
373
373
  builder.emitOpcode(2 /* SWAP */);
374
374
  builder.emitOpcode(10 /* PUSH_NUMBER */);
375
375
  builder.emitNumber(1);
@@ -400,7 +400,7 @@ function percentOnOffNormalizerRule(priority = 68) {
400
400
  consumed: 2,
401
401
  replacement: [
402
402
  tokens[pos],
403
- chunkCUR2WLI4_cjs.createFusedToken(text === "on" ? "PCT_ON" : "PCT_OFF", text, [word])
403
+ chunkICEKS6YC_cjs.createFusedToken(text === "on" ? "PCT_ON" : "PCT_OFF", text, [word])
404
404
  ],
405
405
  ruleName: "percentage:on-off"
406
406
  };
@@ -412,7 +412,7 @@ function percentOnOffNormalizerRule(priority = 68) {
412
412
  var OfParselet = class {
413
413
  constructor() {
414
414
  this.category = "Percentage";
415
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Product;
415
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Product;
416
416
  }
417
417
  parse(parser, left, token, builder) {
418
418
  parser.parseExpression(this.bindingPower, builder);
@@ -424,7 +424,7 @@ var OfParselet = class {
424
424
  var OfWhatIsParselet = class {
425
425
  constructor() {
426
426
  this.category = "Percentage";
427
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Product;
427
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Product;
428
428
  }
429
429
  parse(parser, left, token, builder) {
430
430
  parser.parseExpression(this.bindingPower, builder);
@@ -438,7 +438,7 @@ var OnOffWhatIsParselet = class {
438
438
  constructor(sign) {
439
439
  this.sign = sign;
440
440
  this.category = "Percentage";
441
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Product;
441
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Product;
442
442
  }
443
443
  parse(parser, left, token, builder) {
444
444
  builder.emitOpcode(10 /* PUSH_NUMBER */);
@@ -481,7 +481,7 @@ var IncreaseByParselet = class {
481
481
  constructor(multiplier) {
482
482
  this.multiplier = multiplier;
483
483
  this.category = "Percentage";
484
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
484
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
485
485
  }
486
486
  parse(parser, left, token, builder) {
487
487
  parser.parseExpression(this.bindingPower, builder);
@@ -497,7 +497,7 @@ var IncreaseByParselet = class {
497
497
  var PercentageChangeParselet = class {
498
498
  constructor() {
499
499
  this.category = "Percentage";
500
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
500
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
501
501
  }
502
502
  parse(parser, left, token, builder) {
503
503
  if (left.type === "UNIT") {
@@ -551,7 +551,7 @@ var UpDownParselet = class {
551
551
  constructor(sign) {
552
552
  this.sign = sign;
553
553
  this.category = "Percentage";
554
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
554
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
555
555
  }
556
556
  parse(parser, _left, _token, builder) {
557
557
  parser.parseExpression(this.bindingPower, builder);
@@ -603,7 +603,7 @@ function stepTokenAt(tokens, i) {
603
603
  if (text !== "up" && text !== "down") return null;
604
604
  if (tokens[i + 1]?.type !== "NUMBER") return null;
605
605
  if (tokens[i + 2]?.type !== "PERCENT") return null;
606
- return chunkCUR2WLI4_cjs.createFusedToken(text === "up" ? "PCT_UP" : "PCT_DOWN", text, [word]);
606
+ return chunkICEKS6YC_cjs.createFusedToken(text === "up" ? "PCT_UP" : "PCT_DOWN", text, [word]);
607
607
  }
608
608
  function percentUpDownNormalizerRule(priority = 68) {
609
609
  return {
@@ -783,7 +783,7 @@ var FunctionCallParselet = class {
783
783
  const fnName = token.value.toLowerCase();
784
784
  const fnIdx = builtinNameToIndex[fnName];
785
785
  if (fnIdx === void 0) {
786
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution(
786
+ throw chunkMIGXCBXT_cjs.ErrorFactory.execution(
787
787
  "UNKNOWN_FUNCTION",
788
788
  `Unknown function: ${fnName}`,
789
789
  { functionName: fnName }
@@ -792,10 +792,10 @@ var FunctionCallParselet = class {
792
792
  parser.consume("LPAREN");
793
793
  let argCount = 0;
794
794
  if (parser.peek()?.type !== "RPAREN") {
795
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
795
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
796
796
  argCount++;
797
797
  while (parser.match("COMMA")) {
798
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
798
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
799
799
  argCount++;
800
800
  }
801
801
  }
@@ -852,7 +852,7 @@ var NextLastParselet = class {
852
852
  const dayToken = parser.peek();
853
853
  const targetDay = dayToken ? WEEKDAY_TOKEN_INDEX[dayToken.type] : void 0;
854
854
  if (targetDay === void 0) {
855
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
855
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
856
856
  "MISSING_WEEKDAY",
857
857
  `"${token.value}" must be followed by a day of the week (e.g. "${token.value} Saturday")`,
858
858
  { keyword: token.value, actualType: dayToken?.type, actualValue: dayToken?.value }
@@ -921,22 +921,22 @@ function unixTimestampToEpochMs(n) {
921
921
  }
922
922
 
923
923
  // src/packages/datetime/parselets/DatetimeTimestampPluginFunctions.ts
924
- var WORKDAYS_IN_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
925
- var WEEKDAY_ON_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
926
- var TO_DATE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
927
- var TO_TIMESTAMP_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
928
- var MONTH_ON_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
929
- var WEEK_ON_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
930
- var IS_WEEKEND_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
931
- var IS_WORKDAY_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
932
- var SPAN_BETWEEN_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
924
+ var WORKDAYS_IN_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
925
+ var WEEKDAY_ON_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
926
+ var TO_DATE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
927
+ var TO_TIMESTAMP_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
928
+ var MONTH_ON_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
929
+ var WEEK_ON_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
930
+ var IS_WEEKEND_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
931
+ var IS_WORKDAY_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
932
+ var SPAN_BETWEEN_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
933
933
  function workdaysInDurationHandler(args) {
934
934
  const v = args[0];
935
935
  let totalDays;
936
936
  if (v.type === 6 /* Uom */ && v.unit) {
937
937
  const measure = chunkEJ3ILXX6_cjs.getMeasure(v.unit);
938
938
  if (measure !== "time") {
939
- return chunk2TZKENDH_cjs.errorValue(
939
+ return chunkIT74O4BE_cjs.errorValue(
940
940
  "WORKDAYS_IN_EXPECTED_DURATION",
941
941
  `"workdays in" expects a time duration, got unit "${v.unit}"`
942
942
  );
@@ -950,7 +950,7 @@ function workdaysInDurationHandler(args) {
950
950
  const fullWeeks = Math.floor(magnitudeDays / 7);
951
951
  const remainderDays = magnitudeDays - fullWeeks * 7;
952
952
  const workdays = sign * (fullWeeks * 5 + Math.min(remainderDays, 5));
953
- return chunk2TZKENDH_cjs.numberValue(workdays);
953
+ return chunkIT74O4BE_cjs.numberValue(workdays);
954
954
  }
955
955
  var WEEKDAY_NAMES = [
956
956
  "Sunday",
@@ -963,15 +963,15 @@ var WEEKDAY_NAMES = [
963
963
  ];
964
964
  function asEpochMs(value, fieldName) {
965
965
  if (value.type === 4 /* Datetime */) return value.toNumber();
966
- return chunk2TZKENDH_cjs.errorValue(
966
+ return chunkIT74O4BE_cjs.errorValue(
967
967
  "DATE_FIELD_EXPECTED_DATE",
968
- `"${fieldName}" expects a date, got ${chunk2TZKENDH_cjs.ValueType[value.type] ?? "an unsupported value"}`
968
+ `"${fieldName}" expects a date, got ${chunkIT74O4BE_cjs.ValueType[value.type] ?? "an unsupported value"}`
969
969
  );
970
970
  }
971
971
  function weekdayOnDateHandler(args) {
972
972
  const epochMs = asEpochMs(args[0], "weekday");
973
973
  if (typeof epochMs !== "number") return epochMs;
974
- return chunk2TZKENDH_cjs.stringValue(WEEKDAY_NAMES[new Date(epochMs).getDay()]);
974
+ return chunkIT74O4BE_cjs.stringValue(WEEKDAY_NAMES[new Date(epochMs).getDay()]);
975
975
  }
976
976
  var MONTH_NAMES = [
977
977
  "January",
@@ -990,7 +990,7 @@ var MONTH_NAMES = [
990
990
  function monthOnDateHandler(args) {
991
991
  const epochMs = asEpochMs(args[0], "month");
992
992
  if (typeof epochMs !== "number") return epochMs;
993
- return chunk2TZKENDH_cjs.stringValue(MONTH_NAMES[new Date(epochMs).getMonth()]);
993
+ return chunkIT74O4BE_cjs.stringValue(MONTH_NAMES[new Date(epochMs).getMonth()]);
994
994
  }
995
995
  function weekOnDateHandler(args) {
996
996
  const epochMs = asEpochMs(args[0], "week");
@@ -1001,7 +1001,7 @@ function weekOnDateHandler(args) {
1001
1001
  target.setUTCDate(target.getUTCDate() + 4 - isoDay);
1002
1002
  const yearStart = Date.UTC(target.getUTCFullYear(), 0, 1);
1003
1003
  const days = Math.floor((target.getTime() - yearStart) / 864e5);
1004
- return chunk2TZKENDH_cjs.numberValue(Math.floor(days / 7) + 1);
1004
+ return chunkIT74O4BE_cjs.numberValue(Math.floor(days / 7) + 1);
1005
1005
  }
1006
1006
  function isWeekendDate(epochMs) {
1007
1007
  const day = new Date(epochMs).getDay();
@@ -1010,15 +1010,15 @@ function isWeekendDate(epochMs) {
1010
1010
  function isWeekendOnDateHandler(args) {
1011
1011
  const epochMs = asEpochMs(args[0], "is a weekend");
1012
1012
  if (typeof epochMs !== "number") return epochMs;
1013
- return chunk2TZKENDH_cjs.boolValue(isWeekendDate(epochMs));
1013
+ return chunkIT74O4BE_cjs.boolValue(isWeekendDate(epochMs));
1014
1014
  }
1015
1015
  function isWorkdayOnDateHandler(args) {
1016
1016
  const epochMs = asEpochMs(args[0], "is a workday");
1017
1017
  if (typeof epochMs !== "number") return epochMs;
1018
- return chunk2TZKENDH_cjs.boolValue(!isWeekendDate(epochMs));
1018
+ return chunkIT74O4BE_cjs.boolValue(!isWeekendDate(epochMs));
1019
1019
  }
1020
1020
  function spanBetweenDatesHandler(args) {
1021
- return chunk2TZKENDH_cjs.uomValue(Math.abs(args[0].toNumber() - args[1].toNumber()), "ms");
1021
+ return chunkIT74O4BE_cjs.uomValue(Math.abs(args[0].toNumber() - args[1].toNumber()), "ms");
1022
1022
  }
1023
1023
  function toDateFromAnyHandler(args) {
1024
1024
  const v = args[0];
@@ -1028,28 +1028,28 @@ function toDateFromAnyHandler(args) {
1028
1028
  if (v.type === 3 /* String */) {
1029
1029
  const ms = parseIso8601(v.value);
1030
1030
  if (ms === null) {
1031
- return chunk2TZKENDH_cjs.errorValue(
1031
+ return chunkIT74O4BE_cjs.errorValue(
1032
1032
  "INVALID_ISO8601_STRING",
1033
1033
  `"${v.value}" is not a recognizable ISO8601 date/time string`
1034
1034
  );
1035
1035
  }
1036
- return chunk2TZKENDH_cjs.datetimeValue(ms);
1036
+ return chunkIT74O4BE_cjs.datetimeValue(ms);
1037
1037
  }
1038
- return chunk2TZKENDH_cjs.datetimeValue(unixTimestampToEpochMs(v.toNumber()));
1038
+ return chunkIT74O4BE_cjs.datetimeValue(unixTimestampToEpochMs(v.toNumber()));
1039
1039
  }
1040
1040
  function toTimestampFromAnyHandler(args) {
1041
1041
  const v = args[0];
1042
1042
  if (v.type === 3 /* String */) {
1043
1043
  const ms = parseIso8601(v.value);
1044
1044
  if (ms === null) {
1045
- return chunk2TZKENDH_cjs.errorValue(
1045
+ return chunkIT74O4BE_cjs.errorValue(
1046
1046
  "INVALID_ISO8601_STRING",
1047
1047
  `"${v.value}" is not a recognizable ISO8601 date/time string`
1048
1048
  );
1049
1049
  }
1050
- return chunk2TZKENDH_cjs.numberValue(Math.floor(ms / 1e3));
1050
+ return chunkIT74O4BE_cjs.numberValue(Math.floor(ms / 1e3));
1051
1051
  }
1052
- return chunk2TZKENDH_cjs.numberValue(Math.floor(v.toNumber() / 1e3));
1052
+ return chunkIT74O4BE_cjs.numberValue(Math.floor(v.toNumber() / 1e3));
1053
1053
  }
1054
1054
  var workdaysInDuration = workdaysInDurationHandler;
1055
1055
  var weekdayOnDate = weekdayOnDateHandler;
@@ -1080,10 +1080,10 @@ var WorkdayOffsetParselet = class {
1080
1080
  constructor(direction) {
1081
1081
  this.direction = direction;
1082
1082
  this.category = "Date/Time";
1083
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
1083
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
1084
1084
  }
1085
1085
  parse(parser, _left, _token, builder) {
1086
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Sum, builder);
1086
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Sum, builder);
1087
1087
  builder.emitOpcode(96 /* DATE_WORKDAY_OFFSET */);
1088
1088
  builder.emitByte(this.direction === "backward" ? 1 : 0);
1089
1089
  }
@@ -1095,9 +1095,9 @@ var WorkdaysBetweenParselet = class {
1095
1095
  this.category = "Date/Time";
1096
1096
  }
1097
1097
  parse(parser, _token, builder) {
1098
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Product, builder);
1098
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
1099
1099
  parser.consume("AND_CONJ");
1100
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
1100
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
1101
1101
  builder.emitOpcode(97 /* DATE_WORKDAYS_BETWEEN */);
1102
1102
  }
1103
1103
  };
@@ -1132,9 +1132,9 @@ var DurationBetweenParselet = class {
1132
1132
  }
1133
1133
  parse(parser, token, builder) {
1134
1134
  const unit = token.value;
1135
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Product, builder);
1135
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
1136
1136
  parser.consume("AND_CONJ");
1137
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
1137
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
1138
1138
  builder.emitOpcode(50 /* CALL_PLUGIN */);
1139
1139
  builder.emitIndex(SPAN_BETWEEN_FN_IDX);
1140
1140
  builder.emitIndex(2);
@@ -1149,7 +1149,7 @@ var DayTypePredicateParselet = class {
1149
1149
  constructor(functionIndex) {
1150
1150
  this.functionIndex = functionIndex;
1151
1151
  this.category = "Date/Time";
1152
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
1152
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
1153
1153
  }
1154
1154
  parse(parser, left, token, builder) {
1155
1155
  builder.emitOpcode(50 /* CALL_PLUGIN */);
@@ -1175,7 +1175,7 @@ var CurrentTimestampParselet = class {
1175
1175
  var ToDateParselet = class {
1176
1176
  constructor() {
1177
1177
  this.category = "Date/Time";
1178
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
1178
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
1179
1179
  }
1180
1180
  parse(parser, left, token, builder) {
1181
1181
  builder.emitOpcode(50 /* CALL_PLUGIN */);
@@ -1188,7 +1188,7 @@ var ToDateParselet = class {
1188
1188
  var ToTimestampParselet = class {
1189
1189
  constructor() {
1190
1190
  this.category = "Date/Time";
1191
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
1191
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
1192
1192
  }
1193
1193
  parse(parser, left, token, builder) {
1194
1194
  builder.emitOpcode(50 /* CALL_PLUGIN */);
@@ -1222,7 +1222,7 @@ function untilSinceNormalizerRule(priority = 60) {
1222
1222
  const fusedType = keywordToken.type === "UNTIL" ? "UNTIL_UNIT" : "SINCE_UNIT";
1223
1223
  return {
1224
1224
  consumed: 2,
1225
- replacement: [chunkCUR2WLI4_cjs.createFusedToken(fusedType, unitToken.value, [unitToken, keywordToken])],
1225
+ replacement: [chunkICEKS6YC_cjs.createFusedToken(fusedType, unitToken.value, [unitToken, keywordToken])],
1226
1226
  ruleName: `datetime:${keywordToken.type.toLowerCase()}`
1227
1227
  };
1228
1228
  }
@@ -1259,7 +1259,7 @@ function betweenUnitNormalizerRule(priority = 60) {
1259
1259
  }
1260
1260
  return {
1261
1261
  consumed: howManyLength + 2,
1262
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("BETWEEN_UNIT", unitToken.value, sources)],
1262
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("BETWEEN_UNIT", unitToken.value, sources)],
1263
1263
  ruleName: "datetime:between"
1264
1264
  };
1265
1265
  }
@@ -1280,7 +1280,7 @@ function workdayRateDenominatorNormalizerRule(priority = 70) {
1280
1280
  const syntheticOne = {
1281
1281
  ...unit,
1282
1282
  type: "NUMBER",
1283
- typeId: chunkQFTDTX6K_cjs.tokenTypeId("NUMBER"),
1283
+ typeId: chunkG2YPPLGX_cjs.tokenTypeId("NUMBER"),
1284
1284
  value: "1",
1285
1285
  text: "1"
1286
1286
  };
@@ -1295,7 +1295,7 @@ function workdayRateDenominatorNormalizerRule(priority = 70) {
1295
1295
 
1296
1296
  // src/packages/datetime/normalizer/DateLiteralNormalizerRule.ts
1297
1297
  var DATETIME_LITERAL_TYPE = "DATETIME_LITERAL";
1298
- var DATETIME_LITERAL_TYPE_ID = chunkQFTDTX6K_cjs.tokenTypeId(DATETIME_LITERAL_TYPE);
1298
+ var DATETIME_LITERAL_TYPE_ID = chunkG2YPPLGX_cjs.tokenTypeId(DATETIME_LITERAL_TYPE);
1299
1299
  var PLAIN_INTEGER = /^\d+$/;
1300
1300
  var DOT_DAY_MONTH = /^\d{1,2}\.\d{1,2}$/;
1301
1301
  var DOT_LEADING_YEAR = /^\.(\d{2}|\d{4})$/;
@@ -1324,7 +1324,7 @@ function buildDateToken(day, month, year, sourceTokens, ruleName) {
1324
1324
  }
1325
1325
  const first = sourceTokens[0];
1326
1326
  const text = sourceTokens.map((t) => t.value).join("");
1327
- const fusedToken = new chunkZMW6NU2K_cjs.LexerToken(
1327
+ const fusedToken = new chunkYJHY7CMN_cjs.LexerToken(
1328
1328
  DATETIME_LITERAL_TYPE,
1329
1329
  DATETIME_LITERAL_TYPE_ID,
1330
1330
  String(date.getTime()),
@@ -1365,7 +1365,7 @@ function fuseIsoTimestamp(tokens, pos, ruleName) {
1365
1365
  if (covered !== matched[0].length) return null;
1366
1366
  const epochMs = parseIso8601(matched[0]);
1367
1367
  if (epochMs === null) return null;
1368
- const fusedToken = new chunkZMW6NU2K_cjs.LexerToken(
1368
+ const fusedToken = new chunkYJHY7CMN_cjs.LexerToken(
1369
1369
  DATETIME_LITERAL_TYPE,
1370
1370
  DATETIME_LITERAL_TYPE_ID,
1371
1371
  String(epochMs),
@@ -1558,7 +1558,7 @@ var DaysInPeriodParselet = class {
1558
1558
  }
1559
1559
  const year = this.readOptionalYear(parser);
1560
1560
  if (year !== null) return daysInYear(year);
1561
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
1561
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
1562
1562
  "DAYS_IN_EXPECTED_PERIOD",
1563
1563
  'Expected a month, quarter or year, as in "days in February 2020" or "days in Q3"'
1564
1564
  );
@@ -1624,7 +1624,7 @@ function daysInPeriodNormalizerRule(priority = 60) {
1624
1624
  if (!startsPeriod(tokens[pos + 2])) return null;
1625
1625
  return {
1626
1626
  consumed: 2,
1627
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("DAYS_IN_PERIOD", "days in", [days, tokens[pos + 1]])],
1627
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("DAYS_IN_PERIOD", "days in", [days, tokens[pos + 1]])],
1628
1628
  ruleName: "datetime:days-in-period"
1629
1629
  };
1630
1630
  }
@@ -1766,7 +1766,7 @@ var DATETIME_PACKAGE = {
1766
1766
  { index: SPAN_BETWEEN_FN_IDX, handler: spanBetweenDates }
1767
1767
  ],
1768
1768
  asConverters: {
1769
- iso8601: (value) => chunk2TZKENDH_cjs.stringValue(formatIso8601Local(value.toNumber())),
1769
+ iso8601: (value) => chunkIT74O4BE_cjs.stringValue(formatIso8601Local(value.toNumber())),
1770
1770
  // The same three fields the "what X is it" questions answer, in the
1771
1771
  // composable form: `next friday + 2 weeks as weekday`. Question phrases
1772
1772
  // only ever take a bare date expression, whereas `as` binds after a
@@ -2090,10 +2090,10 @@ function tryConsumeZoneReference(parser) {
2090
2090
  }
2091
2091
 
2092
2092
  // src/packages/time/parselets/TimezonePluginFunctions.ts
2093
- var ZONE_CONVERT_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
2094
- var TIME_IN_ZONE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
2095
- var DATE_IN_ZONE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
2096
- var TIME_DIFFERENCE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
2093
+ var ZONE_CONVERT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
2094
+ var TIME_IN_ZONE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
2095
+ var DATE_IN_ZONE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
2096
+ var TIME_DIFFERENCE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
2097
2097
  function zoneConvertHandler(args) {
2098
2098
  const totalMinutes = args[0].toNumber();
2099
2099
  const sourceZoneRef = args[1].value;
@@ -2109,17 +2109,17 @@ function zoneConvertHandler(args) {
2109
2109
  );
2110
2110
  const time = formatTimeInZone(utcMs, targetZoneRef);
2111
2111
  const dayShift = dayShiftBetweenZones(utcMs, targetZoneRef, sourceZoneRef);
2112
- if (dayShift === 0) return chunk2TZKENDH_cjs.stringValue(time);
2112
+ if (dayShift === 0) return chunkIT74O4BE_cjs.stringValue(time);
2113
2113
  const sign = dayShift > 0 ? "+" : "";
2114
- return chunk2TZKENDH_cjs.stringValue(`${time} (${sign}${dayShift} day${Math.abs(dayShift) === 1 ? "" : "s"})`);
2114
+ return chunkIT74O4BE_cjs.stringValue(`${time} (${sign}${dayShift} day${Math.abs(dayShift) === 1 ? "" : "s"})`);
2115
2115
  }
2116
2116
  function timeInZoneHandler(args) {
2117
2117
  const zoneRef = args[0].value;
2118
- return chunk2TZKENDH_cjs.stringValue(formatTimeInZone(Date.now(), zoneRef));
2118
+ return chunkIT74O4BE_cjs.stringValue(formatTimeInZone(Date.now(), zoneRef));
2119
2119
  }
2120
2120
  function dateInZoneHandler(args) {
2121
2121
  const zoneRef = args[0].value;
2122
- return chunk2TZKENDH_cjs.stringValue(formatDateInZone(Date.now(), zoneRef));
2122
+ return chunkIT74O4BE_cjs.stringValue(formatDateInZone(Date.now(), zoneRef));
2123
2123
  }
2124
2124
  function timeDifferenceHandler(args) {
2125
2125
  const zoneRef1 = args[0].value;
@@ -2131,7 +2131,7 @@ function timeDifferenceHandler(args) {
2131
2131
  const offset2 = resolveOffsetMinutes(zoneRef2, now);
2132
2132
  const diff = offset2 - offset1;
2133
2133
  if (diff === 0) {
2134
- return chunk2TZKENDH_cjs.stringValue(`${label2} and ${label1} currently share the same UTC offset`);
2134
+ return chunkIT74O4BE_cjs.stringValue(`${label2} and ${label1} currently share the same UTC offset`);
2135
2135
  }
2136
2136
  const ahead = diff > 0 ? label2 : label1;
2137
2137
  const behind = diff > 0 ? label1 : label2;
@@ -2141,7 +2141,7 @@ function timeDifferenceHandler(args) {
2141
2141
  const parts = [];
2142
2142
  if (hours > 0) parts.push(`${hours} hour${hours === 1 ? "" : "s"}`);
2143
2143
  if (minutes > 0) parts.push(`${minutes} minute${minutes === 1 ? "" : "s"}`);
2144
- return chunk2TZKENDH_cjs.stringValue(`${ahead} is ${parts.join(" ")} ahead of ${behind}`);
2144
+ return chunkIT74O4BE_cjs.stringValue(`${ahead} is ${parts.join(" ")} ahead of ${behind}`);
2145
2145
  }
2146
2146
 
2147
2147
  // src/packages/time/parselets/ClockTimeParselet.ts
@@ -2154,7 +2154,7 @@ var ClockTimeParselet = class {
2154
2154
  const sourceZoneRef = tryConsumeZoneReference(parser);
2155
2155
  if (sourceZoneRef !== null) {
2156
2156
  if (parser.peek()?.type !== "IN") {
2157
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
2157
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
2158
2158
  "TIME_ZONE_EXPECTED_IN",
2159
2159
  `Expected "in <city>" after the zone name (e.g. "6pm Sydney in Chicago") but got ${parser.peek() ? `"${parser.peek().value}"` : "end of input"}`
2160
2160
  );
@@ -2162,7 +2162,7 @@ var ClockTimeParselet = class {
2162
2162
  parser.consume();
2163
2163
  const target = tryConsumeZoneReference(parser);
2164
2164
  if (target === null) {
2165
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
2165
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
2166
2166
  "TIME_ZONE_EXPECTED_TARGET",
2167
2167
  `Expected a city or zone name after "in" (e.g. "6pm Sydney in Chicago")`
2168
2168
  );
@@ -2237,7 +2237,7 @@ function timeOrDateInZoneParselet(pluginFnIdx) {
2237
2237
  parse(parser, token, builder) {
2238
2238
  const zone = tryConsumeZoneReference(parser);
2239
2239
  if (zone === null) {
2240
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
2240
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
2241
2241
  "TIME_ZONE_EXPECTED_CITY",
2242
2242
  `Expected a city or zone name after "${token.value}" (e.g. "time in Paris")`
2243
2243
  );
@@ -2259,7 +2259,7 @@ var TimeDifferenceParselet = class {
2259
2259
  parse(parser, token, builder) {
2260
2260
  const zone1 = tryConsumeZoneReference(parser);
2261
2261
  if (zone1 === null) {
2262
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
2262
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
2263
2263
  "TIME_DIFFERENCE_EXPECTED_CITY",
2264
2264
  `Expected a city or zone name after "time difference between" (e.g. "time difference between Seattle and Moscow")`
2265
2265
  );
@@ -2267,7 +2267,7 @@ var TimeDifferenceParselet = class {
2267
2267
  parser.consume("AND_CONJ");
2268
2268
  const zone2 = tryConsumeZoneReference(parser);
2269
2269
  if (zone2 === null) {
2270
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
2270
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
2271
2271
  "TIME_DIFFERENCE_EXPECTED_SECOND_CITY",
2272
2272
  `Expected a second city or zone name after "and" (e.g. "time difference between Seattle and Moscow")`
2273
2273
  );
@@ -2295,7 +2295,7 @@ var VideoTimecodeParselet = class {
2295
2295
  const [hours, minutes, seconds, frames] = token.value.split(",").map(Number);
2296
2296
  const separator = parser.peek();
2297
2297
  if (!separator || separator.type !== "RATE_AT" && separator.type !== "AT") {
2298
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
2298
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
2299
2299
  "TIMECODE_EXPECTED_FPS",
2300
2300
  `A video timecode must specify a frame rate, e.g. "${token.value.split(",").join(":")} at 30 fps" or "... @ 30 fps"`
2301
2301
  );
@@ -2303,7 +2303,7 @@ var VideoTimecodeParselet = class {
2303
2303
  parser.consume();
2304
2304
  const fpsToken = parser.peek();
2305
2305
  if (!fpsToken || fpsToken.type !== "FPS_RATE") {
2306
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
2306
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
2307
2307
  "TIMECODE_EXPECTED_FPS",
2308
2308
  `Expected "<number> fps" after "${separator.value}" (e.g. "at 30 fps")`
2309
2309
  );
@@ -2312,18 +2312,18 @@ var VideoTimecodeParselet = class {
2312
2312
  const fps = parseFloat(fpsToken.value);
2313
2313
  const fpsWhole = Math.round(fps);
2314
2314
  if (frames >= fpsWhole) {
2315
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
2315
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
2316
2316
  "TIMECODE_FRAME_OUT_OF_RANGE",
2317
2317
  `Frame number ${frames} is out of range for ${fps} fps (must be 0-${fpsWhole - 1})`
2318
2318
  );
2319
2319
  }
2320
2320
  const totalFrames = (hours * 3600 + minutes * 60 + seconds) * fpsWhole + frames;
2321
- let unit = chunk2TZKENDH_cjs.timecodeUnit(fps);
2321
+ let unit = chunkIT74O4BE_cjs.timecodeUnit(fps);
2322
2322
  if (parser.peek()?.type === "IN") {
2323
2323
  parser.consume();
2324
2324
  const framesWord = parser.peek();
2325
2325
  if (!framesWord || framesWord.type !== "IDENT" || framesWord.value.toLowerCase() !== "frames") {
2326
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
2326
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
2327
2327
  "TIMECODE_EXPECTED_FRAMES",
2328
2328
  `Expected "frames" after "in" (e.g. "... in frames") but got ${framesWord ? `"${framesWord.value}"` : "end of input"}`
2329
2329
  );
@@ -2364,7 +2364,7 @@ var FrameCountParselet = class {
2364
2364
  parser.consume();
2365
2365
  const fpsToken = parser.peek();
2366
2366
  if (!fpsToken || fpsToken.type !== "FPS_RATE") {
2367
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
2367
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
2368
2368
  "TIMECODE_EXPECTED_FPS",
2369
2369
  `Expected "<number> fps" after "${separator.value}" (e.g. "@ 30 fps")`
2370
2370
  );
@@ -2403,7 +2403,7 @@ function clockTimeNormalizerRule(priority = 65) {
2403
2403
  name: "time:clock-time",
2404
2404
  priority,
2405
2405
  match(tokens, pos) {
2406
- if (chunkCUR2WLI4_cjs.isInsideRangeContext(tokens, pos)) return null;
2406
+ if (chunkICEKS6YC_cjs.isInsideRangeContext(tokens, pos)) return null;
2407
2407
  const hourToken = tokens[pos];
2408
2408
  if (hourToken.type !== "NUMBER") return null;
2409
2409
  const hour = parseInt(hourToken.value, 10);
@@ -2419,7 +2419,7 @@ function clockTimeNormalizerRule(priority = 65) {
2419
2419
  const consumed = hasAmPm ? 4 : 3;
2420
2420
  return {
2421
2421
  consumed,
2422
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("CLOCK_TIME", String(totalMinutes), tokens.slice(pos, pos + consumed))],
2422
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("CLOCK_TIME", String(totalMinutes), tokens.slice(pos, pos + consumed))],
2423
2423
  ruleName: "time:clock-time"
2424
2424
  };
2425
2425
  }
@@ -2429,7 +2429,7 @@ function clockTimeNormalizerRule(priority = 65) {
2429
2429
  if (totalMinutes === null) return null;
2430
2430
  return {
2431
2431
  consumed: 2,
2432
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("CLOCK_TIME", String(totalMinutes), tokens.slice(pos, pos + 2))],
2432
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("CLOCK_TIME", String(totalMinutes), tokens.slice(pos, pos + 2))],
2433
2433
  ruleName: "time:clock-time"
2434
2434
  };
2435
2435
  }
@@ -2452,7 +2452,7 @@ function clockTimeIntervalNormalizerRule(priority = 66) {
2452
2452
  if (end?.type !== "CLOCK_TIME") return null;
2453
2453
  return {
2454
2454
  consumed: 3,
2455
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("CLOCK_TIME_INTERVAL", `${start.value}:${end.value}`, tokens.slice(pos, pos + 3))],
2455
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("CLOCK_TIME_INTERVAL", `${start.value}:${end.value}`, tokens.slice(pos, pos + 3))],
2456
2456
  ruleName: "time:clock-time-interval"
2457
2457
  };
2458
2458
  }
@@ -2471,7 +2471,7 @@ function fpsRateNormalizerRule(priority = 65) {
2471
2471
  if (fpsToken?.type !== "IDENT" || fpsToken.value.toLowerCase() !== "fps") return null;
2472
2472
  return {
2473
2473
  consumed: 2,
2474
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("FPS_RATE", numberToken.value, tokens.slice(pos, pos + 2))],
2474
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("FPS_RATE", numberToken.value, tokens.slice(pos, pos + 2))],
2475
2475
  ruleName: "time:fps-rate"
2476
2476
  };
2477
2477
  }
@@ -2484,7 +2484,7 @@ function laptimeNormalizerRule(priority = 70) {
2484
2484
  name: "time:laptime",
2485
2485
  priority,
2486
2486
  match(tokens, pos) {
2487
- if (chunkCUR2WLI4_cjs.isInsideRangeContext(tokens, pos)) return null;
2487
+ if (chunkICEKS6YC_cjs.isInsideRangeContext(tokens, pos)) return null;
2488
2488
  const h = tokens[pos];
2489
2489
  const c1 = tokens[pos + 1];
2490
2490
  const m = tokens[pos + 2];
@@ -2503,7 +2503,7 @@ function laptimeNormalizerRule(priority = 70) {
2503
2503
  const totalSeconds = hours * 3600 + minutes * 60 + seconds;
2504
2504
  return {
2505
2505
  consumed: 5,
2506
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("LAPTIME", String(totalSeconds), tokens.slice(pos, pos + 5))],
2506
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("LAPTIME", String(totalSeconds), tokens.slice(pos, pos + 5))],
2507
2507
  ruleName: "time:laptime"
2508
2508
  };
2509
2509
  }
@@ -2516,7 +2516,7 @@ function videoTimecodeNormalizerRule(priority = 75) {
2516
2516
  name: "time:video-timecode",
2517
2517
  priority,
2518
2518
  match(tokens, pos) {
2519
- if (chunkCUR2WLI4_cjs.isInsideRangeContext(tokens, pos)) return null;
2519
+ if (chunkICEKS6YC_cjs.isInsideRangeContext(tokens, pos)) return null;
2520
2520
  const h = tokens[pos];
2521
2521
  const c1 = tokens[pos + 1];
2522
2522
  const m = tokens[pos + 2];
@@ -2542,7 +2542,7 @@ function videoTimecodeNormalizerRule(priority = 75) {
2542
2542
  return {
2543
2543
  consumed: 7,
2544
2544
  replacement: [
2545
- chunkCUR2WLI4_cjs.createFusedToken("VIDEO_TIMECODE", `${hours},${minutes},${seconds},${frames}`, tokens.slice(pos, pos + 7))
2545
+ chunkICEKS6YC_cjs.createFusedToken("VIDEO_TIMECODE", `${hours},${minutes},${seconds},${frames}`, tokens.slice(pos, pos + 7))
2546
2546
  ],
2547
2547
  ruleName: "time:video-timecode"
2548
2548
  };
@@ -2562,7 +2562,7 @@ function frameCountNormalizerRule(priority = 65) {
2562
2562
  if (framesToken?.type !== "IDENT" || framesToken.value.toLowerCase() !== "frames") return null;
2563
2563
  return {
2564
2564
  consumed: 2,
2565
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("FRAME_COUNT", numberToken.value, tokens.slice(pos, pos + 2))],
2565
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("FRAME_COUNT", numberToken.value, tokens.slice(pos, pos + 2))],
2566
2566
  ruleName: "time:frame-count"
2567
2567
  };
2568
2568
  }
@@ -2588,7 +2588,7 @@ function durationSeconds(value) {
2588
2588
  function toTimespanString(value) {
2589
2589
  const total = durationSeconds(value);
2590
2590
  if (total === null) {
2591
- return chunk2TZKENDH_cjs.stringValue(`"as timespan" needs a duration, got ${value.unit ?? "a non-duration"}`);
2591
+ return chunkIT74O4BE_cjs.stringValue(`"as timespan" needs a duration, got ${value.unit ?? "a non-duration"}`);
2592
2592
  }
2593
2593
  const negative = total < 0;
2594
2594
  let remaining = Math.abs(total);
@@ -2605,12 +2605,12 @@ function toTimespanString(value) {
2605
2605
  if (secondsLeft > 0 || parts.length === 0) {
2606
2606
  parts.push(`${secondsLeft} ${secondsLeft === 1 ? "second" : "seconds"}`);
2607
2607
  }
2608
- return chunk2TZKENDH_cjs.stringValue((negative ? "-" : "") + parts.join(" "));
2608
+ return chunkIT74O4BE_cjs.stringValue((negative ? "-" : "") + parts.join(" "));
2609
2609
  }
2610
2610
  function toLaptimeString(value) {
2611
2611
  const total = durationSeconds(value);
2612
2612
  if (total === null) {
2613
- return chunk2TZKENDH_cjs.stringValue(`"as laptime" needs a duration, got ${value.unit ?? "a non-duration"}`);
2613
+ return chunkIT74O4BE_cjs.stringValue(`"as laptime" needs a duration, got ${value.unit ?? "a non-duration"}`);
2614
2614
  }
2615
2615
  const negative = total < 0;
2616
2616
  const rounded = Math.round(Math.abs(total) * 1e3) / 1e3;
@@ -2620,7 +2620,7 @@ function toLaptimeString(value) {
2620
2620
  const whole = Math.floor(seconds);
2621
2621
  const fraction = Math.round((seconds - whole) * 1e3);
2622
2622
  const base = `${pad(hours)}:${pad(minutes)}:${pad(whole)}`;
2623
- return chunk2TZKENDH_cjs.stringValue((negative ? "-" : "") + (fraction > 0 ? `${base}.${String(fraction).padStart(3, "0")}` : base));
2623
+ return chunkIT74O4BE_cjs.stringValue((negative ? "-" : "") + (fraction > 0 ? `${base}.${String(fraction).padStart(3, "0")}` : base));
2624
2624
  }
2625
2625
  function pad(n) {
2626
2626
  return n < 10 ? `0${n}` : String(n);
@@ -2673,7 +2673,7 @@ function definePhrasePattern(opts) {
2673
2673
  for (const alt of opts.alternatives) {
2674
2674
  const first = alt.slots[0];
2675
2675
  if (!first || first.kind !== "keyword") {
2676
- throw chunkB4HBEFTB_cjs.ErrorFactory.config(
2676
+ throw chunkMIGXCBXT_cjs.ErrorFactory.config(
2677
2677
  "INVALID_PHRASE_PATTERN",
2678
2678
  "Every PhraseAlternative's first slot must be a `keyword` slot \u2014 alternatives are chosen by peeking the next token, which only works if the choice is decidable from one leading keyword.",
2679
2679
  { category: opts.category }
@@ -2690,7 +2690,7 @@ function definePhrasePattern(opts) {
2690
2690
  });
2691
2691
  if (!alternative) {
2692
2692
  const expected = opts.alternatives.map((alt) => alt.slots[0].tokenTypes.join("|")).join(", ");
2693
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
2693
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
2694
2694
  "NO_MATCHING_PHRASE_ALTERNATIVE",
2695
2695
  `Expected one of [${expected}] but got "${next?.type ?? "end of input"}" ("${next?.value ?? ""}")`,
2696
2696
  { category: opts.category, expected, actualType: next?.type, actualValue: next?.value }
@@ -2701,7 +2701,7 @@ function definePhrasePattern(opts) {
2701
2701
  if (slot.kind === "keyword") {
2702
2702
  const token = parser.peek();
2703
2703
  if (!token || !slot.tokenTypes.includes(token.type)) {
2704
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
2704
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
2705
2705
  "PHRASE_KEYWORD_MISMATCH",
2706
2706
  `Expected one of [${slot.tokenTypes.join("|")}] but got "${token?.type ?? "end of input"}" ("${token?.value ?? ""}")`,
2707
2707
  { category: opts.category, expected: slot.tokenTypes, actualType: token?.type, actualValue: token?.value }
@@ -2731,7 +2731,7 @@ var keywordLedRollPattern = definePhrasePattern({
2731
2731
  {
2732
2732
  slots: [
2733
2733
  { kind: "keyword", tokenTypes: ["BETWEEN"] },
2734
- { kind: "expr", bindingPower: chunkJ45BCEZ4_cjs.BindingPower.Product },
2734
+ { kind: "expr", bindingPower: chunkMI7OTUHL_cjs.BindingPower.Product },
2735
2735
  // The word "and" lexes as PLUS, not a dedicated AND token, en.ts's
2736
2736
  // keywordMap maps `and: "PLUS"` (a synonym for arithmetic "+").
2737
2737
  // The original hand-written parselet never actually checked the
@@ -2746,7 +2746,7 @@ var keywordLedRollPattern = definePhrasePattern({
2746
2746
  {
2747
2747
  slots: [
2748
2748
  { kind: "keyword", tokenTypes: ["FROM"] },
2749
- { kind: "expr", bindingPower: chunkJ45BCEZ4_cjs.BindingPower.Product },
2749
+ { kind: "expr", bindingPower: chunkMI7OTUHL_cjs.BindingPower.Product },
2750
2750
  { kind: "keyword", tokenTypes: ["TO"] },
2751
2751
  { kind: "expr" }
2752
2752
  ],
@@ -2801,7 +2801,7 @@ var VariableParselet = class {
2801
2801
  parse(parser, _token, builder) {
2802
2802
  const nameToken = parser.consume();
2803
2803
  if (nameToken.type !== "IDENT" && nameToken.type !== "UNIT") {
2804
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
2804
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
2805
2805
  "EXPECTED_IDENTIFIER",
2806
2806
  `Expected identifier or unit after colon, got ${nameToken.type}`,
2807
2807
  { tokenType: nameToken.type }
@@ -2840,7 +2840,7 @@ var GlobalVariableParselet = class {
2840
2840
  parser.consume("COLON");
2841
2841
  const nameToken = parser.consume();
2842
2842
  if (nameToken.type !== "IDENT" && nameToken.type !== "UNIT") {
2843
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
2843
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
2844
2844
  "EXPECTED_IDENTIFIER",
2845
2845
  `Expected identifier after 'global :', got ${nameToken.type}`,
2846
2846
  { tokenType: nameToken.type }
@@ -2890,11 +2890,11 @@ var GlobalVariableAsyncResolver = class {
2890
2890
  const op = opcodes[i];
2891
2891
  if (op === 62 /* LOAD_GLOBAL_VAR */) {
2892
2892
  const varName = strings[opcodes[i + 1]];
2893
- if (!chunk7ZX6B7SY_cjs.sharedGlobalVariableStore.has(varName)) {
2893
+ if (!chunkFR7RNOPT_cjs.sharedGlobalVariableStore.has(varName)) {
2894
2894
  return this.pendingResultFor(varName, packageId, signal);
2895
2895
  }
2896
2896
  }
2897
- i = chunkSSV46KFA_cjs.nextInstruction(opcodes, i);
2897
+ i = chunk4K5W7EH2_cjs.nextInstruction(opcodes, i);
2898
2898
  }
2899
2899
  return null;
2900
2900
  }
@@ -2902,7 +2902,7 @@ var GlobalVariableAsyncResolver = class {
2902
2902
  let resolver = this.pending.get(varName);
2903
2903
  if (!resolver) {
2904
2904
  resolver = new Promise((resolve) => {
2905
- const unsubscribe = chunk7ZX6B7SY_cjs.sharedGlobalVariableStore.subscribe((name, value) => {
2905
+ const unsubscribe = chunkFR7RNOPT_cjs.sharedGlobalVariableStore.subscribe((name, value) => {
2906
2906
  if (name !== varName) return;
2907
2907
  unsubscribe();
2908
2908
  this.pending.delete(varName);
@@ -2949,7 +2949,7 @@ var VARIABLES_PACKAGE = {
2949
2949
 
2950
2950
  // src/uom/HistoricalCurrency.ts
2951
2951
  var HISTORICAL_CURRENCY_NS = "currency-historical";
2952
- var HISTORICAL_CURRENCY_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
2952
+ var HISTORICAL_CURRENCY_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
2953
2953
  var HistoricalCurrencyErrorCodes = {
2954
2954
  /** No {@link HistoricalRateProvider} was supplied, so `on <date>` conversions cannot be answered. NOT a fall back to today's rate. */
2955
2955
  NOT_CONFIGURED: "HISTORICAL_RATES_NOT_CONFIGURED",
@@ -2970,8 +2970,8 @@ function pad2(n) {
2970
2970
  return n < 10 ? `0${n}` : String(n);
2971
2971
  }
2972
2972
  function tryConsumeCurrencyOnDate(parser, to, from) {
2973
- if (!chunkZVTWQLK4_cjs.sharedCurrencyExchange.isCurrency(to)) return null;
2974
- if (from !== void 0 && !chunkZVTWQLK4_cjs.sharedCurrencyExchange.isCurrency(from)) return null;
2973
+ if (!chunkKXDQKVNX_cjs.sharedCurrencyExchange.isCurrency(to)) return null;
2974
+ if (from !== void 0 && !chunkKXDQKVNX_cjs.sharedCurrencyExchange.isCurrency(from)) return null;
2975
2975
  const onToken = parser.peek();
2976
2976
  if (!onToken || onToken.type !== "IDENT" || onToken.value.toLowerCase() !== "on") return null;
2977
2977
  const dateToken = parser.peekAt(1);
@@ -2985,7 +2985,7 @@ async function fetchHistoricalRate(provider, from, to, isoDate, signal, queryCli
2985
2985
  const fromUpper = from.toUpperCase();
2986
2986
  const toUpper = to.toUpperCase();
2987
2987
  if (!provider) {
2988
- return chunk2TZKENDH_cjs.errorValue(
2988
+ return chunkIT74O4BE_cjs.errorValue(
2989
2989
  HistoricalCurrencyErrorCodes.NOT_CONFIGURED,
2990
2990
  `Historical exchange rates are not configured. Supply historicalRateProvider via createCurrencyPackage({ ... }) to convert ${fromUpper} to ${toUpper} on ${isoDate}.`
2991
2991
  );
@@ -2993,9 +2993,9 @@ async function fetchHistoricalRate(provider, from, to, isoDate, signal, queryCli
2993
2993
  const { signal: fetchSignal, cleanup } = chunkVEKIWQ3F_cjs.createTimeoutSignal(signal, FETCH_TIMEOUT_MS, "Historical currency rate fetch");
2994
2994
  try {
2995
2995
  const rate = await provider(fromUpper, toUpper, isoDate, fetchSignal);
2996
- return chunk2TZKENDH_cjs.numberValue(rate);
2996
+ return chunkIT74O4BE_cjs.numberValue(rate);
2997
2997
  } catch (error) {
2998
- const failedValue = chunk2TZKENDH_cjs.errorValue(
2998
+ const failedValue = chunkIT74O4BE_cjs.errorValue(
2999
2999
  HistoricalCurrencyErrorCodes.QUERY_FAILED,
3000
3000
  `Failed to resolve the historical rate for ${fromUpper} to ${toUpper} on ${isoDate}: ${error instanceof Error ? error.message : String(error)}`
3001
3001
  );
@@ -3016,10 +3016,10 @@ function createHistoricalCurrencyPluginFunction(provider) {
3016
3016
  const amount = args[0];
3017
3017
  const toArg = args[1];
3018
3018
  const dateArg = args[2];
3019
- const fault = chunk2TZKENDH_cjs.faultedOperand(amount);
3019
+ const fault = chunkIT74O4BE_cjs.faultedOperand(amount);
3020
3020
  if (fault) return fault;
3021
- if (amount.type !== 6 /* Uom */ || amount.unit === void 0 || !chunkZVTWQLK4_cjs.sharedCurrencyExchange.isCurrency(amount.unit)) {
3022
- return chunk2TZKENDH_cjs.errorValue(
3021
+ if (amount.type !== 6 /* Uom */ || amount.unit === void 0 || !chunkKXDQKVNX_cjs.sharedCurrencyExchange.isCurrency(amount.unit)) {
3022
+ return chunkIT74O4BE_cjs.errorValue(
3023
3023
  HistoricalCurrencyErrorCodes.INVALID_OPERAND,
3024
3024
  `Historical conversion needs an amount in a currency, for example "100 USD in GBP on 2024-01-15".`
3025
3025
  );
@@ -3028,14 +3028,14 @@ function createHistoricalCurrencyPluginFunction(provider) {
3028
3028
  const to = String(toArg.value);
3029
3029
  const isoDate = String(dateArg.value);
3030
3030
  if (from.toUpperCase() === to.toUpperCase()) {
3031
- return chunk2TZKENDH_cjs.uomValue(amount.toNumber(), to);
3031
+ return chunkIT74O4BE_cjs.uomValue(amount.toNumber(), to);
3032
3032
  }
3033
3033
  const queryClient = chunkZ2XP767T_cjs.getActiveQueryClient();
3034
3034
  const key = historicalRateQueryKey(from, to, isoDate);
3035
3035
  const cached = queryClient?.getQueryData(key);
3036
3036
  if (cached === void 0) {
3037
3037
  if (!queryClient) {
3038
- return chunk2TZKENDH_cjs.errorValue(
3038
+ return chunkIT74O4BE_cjs.errorValue(
3039
3039
  HistoricalCurrencyErrorCodes.NOT_PREFLIGHTED,
3040
3040
  `No historical rate resolved for ${from.toUpperCase()} to ${to.toUpperCase()} on ${isoDate}.`
3041
3041
  );
@@ -3048,7 +3048,7 @@ function createHistoricalCurrencyPluginFunction(provider) {
3048
3048
  }
3049
3049
  if (cached.type === 13 /* Error */) return cached;
3050
3050
  const rate = cached.value;
3051
- return chunk2TZKENDH_cjs.uomValue(amount.toNumber() * rate, to);
3051
+ return chunkIT74O4BE_cjs.uomValue(amount.toNumber() * rate, to);
3052
3052
  };
3053
3053
  }
3054
3054
  function createHistoricalCurrencyResolver(provider) {
@@ -3072,7 +3072,7 @@ function createHistoricalCurrencyResolver(provider) {
3072
3072
  const sources = /* @__PURE__ */ new Set();
3073
3073
  for (let k = 0; k < stringIdxs.length - 2; k++) {
3074
3074
  const s = strings[stringIdxs[k]];
3075
- if (chunkZVTWQLK4_cjs.sharedCurrencyExchange.isCurrency(s)) sources.add(s.toUpperCase());
3075
+ if (chunkKXDQKVNX_cjs.sharedCurrencyExchange.isCurrency(s)) sources.add(s.toUpperCase());
3076
3076
  }
3077
3077
  if (sources.size === 1) {
3078
3078
  const from = sources.values().next().value;
@@ -3091,7 +3091,7 @@ function createHistoricalCurrencyResolver(provider) {
3091
3091
  }
3092
3092
  stringIdxs = [];
3093
3093
  }
3094
- i = chunkSSV46KFA_cjs.nextInstruction(opcodes, i);
3094
+ i = chunk4K5W7EH2_cjs.nextInstruction(opcodes, i);
3095
3095
  }
3096
3096
  return null;
3097
3097
  },
@@ -3102,18 +3102,18 @@ function createHistoricalCurrencyResolver(provider) {
3102
3102
 
3103
3103
  // src/packages/uom/parselets/UomLiteralParselet.ts
3104
3104
  function resolveUnitAlias(rawUnit) {
3105
- return chunkHIQ5HSZL_cjs.resolveCurrencyAlias(rawUnit) ?? rawUnit;
3105
+ return chunkA2DZ5BEJ_cjs.resolveCurrencyAlias(rawUnit) ?? rawUnit;
3106
3106
  }
3107
3107
  var UomLiteralParselet = class {
3108
3108
  constructor() {
3109
3109
  this.category = "UoM";
3110
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Postfix;
3110
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Postfix;
3111
3111
  }
3112
3112
  parse(parser, left, token, builder) {
3113
3113
  const unit = resolveUnitAlias(token.value);
3114
3114
  builder.emitOpcode(13 /* PUSH_STRING */);
3115
3115
  builder.emitString(unit);
3116
- const boundInsideProduct = parser.infixMinBindingPower >= chunkJ45BCEZ4_cjs.BindingPower.Product;
3116
+ const boundInsideProduct = parser.infixMinBindingPower >= chunkMI7OTUHL_cjs.BindingPower.Product;
3117
3117
  if (!boundInsideProduct && (parser.peek()?.type === "TO" || parser.peek()?.type === "IN")) {
3118
3118
  parser.consume();
3119
3119
  const targetToken = parser.peek();
@@ -3154,14 +3154,14 @@ var UomLiteralParselet = class {
3154
3154
 
3155
3155
  // src/packages/uom/parselets/ConvertParselet.ts
3156
3156
  function resolveUnitAlias2(rawUnit) {
3157
- return chunkHIQ5HSZL_cjs.resolveCurrencyAlias(rawUnit) ?? rawUnit;
3157
+ return chunkA2DZ5BEJ_cjs.resolveCurrencyAlias(rawUnit) ?? rawUnit;
3158
3158
  }
3159
3159
  var ConvertParselet = class {
3160
3160
  constructor() {
3161
3161
  this.category = "UoM";
3162
3162
  }
3163
3163
  parse(parser, token, builder) {
3164
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Postfix, builder);
3164
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Postfix, builder);
3165
3165
  const nextToken = parser.peek();
3166
3166
  if (nextToken && nextToken.type === "UNIT") {
3167
3167
  parser.consume();
@@ -3226,7 +3226,7 @@ function uomPossibilitiesNormalizerRule(priority = 60) {
3226
3226
  if (questionToken.type !== "QUESTION") return null;
3227
3227
  return {
3228
3228
  consumed: 3,
3229
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("UOM_POSSIBILITIES_QUERY", unitToken.value, [unitToken, toToken, questionToken])],
3229
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("UOM_POSSIBILITIES_QUERY", unitToken.value, [unitToken, toToken, questionToken])],
3230
3230
  ruleName: "uom:possibilities"
3231
3231
  };
3232
3232
  }
@@ -3278,8 +3278,8 @@ function compoundQuantityNormalizerRule(priority = 63) {
3278
3278
  return {
3279
3279
  consumed,
3280
3280
  replacement: [
3281
- chunkCUR2WLI4_cjs.createFusedToken("NUMBER", String(scaled), source),
3282
- chunkCUR2WLI4_cjs.createFusedToken("UNIT", smallestUnit, [smallestUnitToken])
3281
+ chunkICEKS6YC_cjs.createFusedToken("NUMBER", String(scaled), source),
3282
+ chunkICEKS6YC_cjs.createFusedToken("UNIT", smallestUnit, [smallestUnitToken])
3283
3283
  ],
3284
3284
  ruleName: "uom:compound-quantity"
3285
3285
  };
@@ -3307,7 +3307,7 @@ function twoUnitConversionNormalizerRule(priority = 59) {
3307
3307
  return {
3308
3308
  consumed: 4,
3309
3309
  replacement: [
3310
- chunkCUR2WLI4_cjs.createFusedToken("IN_TWO_UNITS", `${major} ${minor}`, tokens.slice(pos, pos + 4))
3310
+ chunkICEKS6YC_cjs.createFusedToken("IN_TWO_UNITS", `${major} ${minor}`, tokens.slice(pos, pos + 4))
3311
3311
  ],
3312
3312
  ruleName: "uom:two-unit-conversion"
3313
3313
  };
@@ -3328,7 +3328,7 @@ function degreeSymbolNormalizerRule(priority = 74) {
3328
3328
  if ((symbol.text ?? symbol.value ?? "") !== "\xB0") return null;
3329
3329
  return {
3330
3330
  consumed: 2,
3331
- replacement: [number, chunkCUR2WLI4_cjs.createFusedToken("UNIT", "degrees", [symbol])],
3331
+ replacement: [number, chunkICEKS6YC_cjs.createFusedToken("UNIT", "degrees", [symbol])],
3332
3332
  ruleName: "uom:degree-symbol"
3333
3333
  };
3334
3334
  }
@@ -3340,7 +3340,7 @@ var TwoUnitConversionParselet = class {
3340
3340
  constructor(builtinIndex) {
3341
3341
  this.builtinIndex = builtinIndex;
3342
3342
  this.category = "Uom";
3343
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
3343
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
3344
3344
  }
3345
3345
  parse(_parser, _left, token, builder) {
3346
3346
  const [major, minor] = String(token.value).split(" ");
@@ -3380,7 +3380,7 @@ function bareRateDenominatorNormalizerRule(priority = 75) {
3380
3380
  if (introduces && isUnit2(tokens[pos + 3])) {
3381
3381
  return {
3382
3382
  consumed: 2,
3383
- replacement: [head, chunkCUR2WLI4_cjs.createFusedToken("UNIT", label.value, [label])],
3383
+ replacement: [head, chunkICEKS6YC_cjs.createFusedToken("UNIT", label.value, [label])],
3384
3384
  ruleName: "uom:bare-rate-denominator"
3385
3385
  };
3386
3386
  }
@@ -3394,7 +3394,7 @@ function bareRateDenominatorNormalizerRule(priority = 75) {
3394
3394
  return {
3395
3395
  consumed: 2,
3396
3396
  replacement: [
3397
- chunkCUR2WLI4_cjs.createFusedToken("PER_UNIT", unitToken.value, [head, unitToken])
3397
+ chunkICEKS6YC_cjs.createFusedToken("PER_UNIT", unitToken.value, [head, unitToken])
3398
3398
  ],
3399
3399
  ruleName: "uom:bare-rate-denominator"
3400
3400
  };
@@ -3407,7 +3407,7 @@ var PerUnitParselet = class {
3407
3407
  constructor(builtinIndex) {
3408
3408
  this.builtinIndex = builtinIndex;
3409
3409
  this.category = "Uom";
3410
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Product;
3410
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Product;
3411
3411
  }
3412
3412
  parse(_parser, _left, token, builder) {
3413
3413
  builder.emitOpcode(13 /* PUSH_STRING */);
@@ -3423,10 +3423,10 @@ var AtRateParselet = class {
3423
3423
  constructor(builtinIndex) {
3424
3424
  this.builtinIndex = builtinIndex;
3425
3425
  this.category = "Uom";
3426
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Product;
3426
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Product;
3427
3427
  }
3428
3428
  parse(parser, _left, _token, builder) {
3429
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
3429
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
3430
3430
  builder.emitOpcode(51 /* CALL_BUILTIN */);
3431
3431
  builder.emitIndex(this.builtinIndex);
3432
3432
  builder.emitIndex(2);
@@ -3459,7 +3459,7 @@ function atRateNormalizerRule(priority = 73) {
3459
3459
  if (!hasRateAhead(tokens, pos + 1)) return null;
3460
3460
  return {
3461
3461
  consumed: 1,
3462
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("AT_RATE", "at", [tokens[pos]])],
3462
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("AT_RATE", "at", [tokens[pos]])],
3463
3463
  ruleName: "uom:at-rate"
3464
3464
  };
3465
3465
  }
@@ -3486,8 +3486,8 @@ function forDurationNormalizerRule(priority = 76) {
3486
3486
  return {
3487
3487
  consumed: 3,
3488
3488
  replacement: [
3489
- chunkCUR2WLI4_cjs.createFusedToken("STAR", "*", [head]),
3490
- chunkCUR2WLI4_cjs.createFusedToken("NUMBER", "1", [article]),
3489
+ chunkICEKS6YC_cjs.createFusedToken("STAR", "*", [head]),
3490
+ chunkICEKS6YC_cjs.createFusedToken("NUMBER", "1", [article]),
3491
3491
  tokens[pos + 2]
3492
3492
  ],
3493
3493
  ruleName: "uom:for-duration"
@@ -3524,7 +3524,7 @@ function reversedConversionNormalizerRule(priority = 61) {
3524
3524
  return {
3525
3525
  consumed: 4,
3526
3526
  replacement: [
3527
- chunkCUR2WLI4_cjs.createFusedToken("NUMBER", "1", [third]),
3527
+ chunkICEKS6YC_cjs.createFusedToken("NUMBER", "1", [third]),
3528
3528
  tokens[pos + 3],
3529
3529
  tokens[pos + 1],
3530
3530
  target
@@ -3633,13 +3633,13 @@ function getIngredientDensity(name) {
3633
3633
  }
3634
3634
 
3635
3635
  // src/packages/uom/parselets/CookingPluginFunctions.ts
3636
- var COOKING_CONVERT_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
3636
+ var COOKING_CONVERT_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
3637
3637
  function cookingConvertHandler(args) {
3638
3638
  const amountValue = args[0];
3639
3639
  const ingredientName = args[1].value;
3640
3640
  const targetUnitText = args[2].value;
3641
3641
  if (amountValue.type !== 6 /* Uom */ || !amountValue.unit) {
3642
- return chunk2TZKENDH_cjs.errorValue(
3642
+ return chunkIT74O4BE_cjs.errorValue(
3643
3643
  "COOKING_CONVERSION_REQUIRES_UNIT",
3644
3644
  `Expected a value with a mass or volume unit (e.g. "300g", "10 cups"), got a plain number`
3645
3645
  );
@@ -3650,23 +3650,23 @@ function cookingConvertHandler(args) {
3650
3650
  const targetMeasure = chunkEJ3ILXX6_cjs.getMeasure(targetUnitText);
3651
3651
  const isMassOrVolume = (m) => m === "mass" || m === "volume";
3652
3652
  if (!isMassOrVolume(sourceMeasure)) {
3653
- return chunk2TZKENDH_cjs.errorValue(
3653
+ return chunkIT74O4BE_cjs.errorValue(
3654
3654
  "COOKING_CONVERSION_UNSUPPORTED_UNIT",
3655
3655
  `"${sourceUnit}" is not a recognized mass or volume unit`
3656
3656
  );
3657
3657
  }
3658
3658
  if (!isMassOrVolume(targetMeasure)) {
3659
- return chunk2TZKENDH_cjs.errorValue(
3659
+ return chunkIT74O4BE_cjs.errorValue(
3660
3660
  "COOKING_CONVERSION_UNSUPPORTED_UNIT",
3661
3661
  `"${targetUnitText}" is not a recognized mass or volume unit`
3662
3662
  );
3663
3663
  }
3664
3664
  if (sourceMeasure === targetMeasure) {
3665
- return chunk2TZKENDH_cjs.uomValue(chunkEJ3ILXX6_cjs.convertUnit(amount, sourceUnit, targetUnitText), targetUnitText);
3665
+ return chunkIT74O4BE_cjs.uomValue(chunkEJ3ILXX6_cjs.convertUnit(amount, sourceUnit, targetUnitText), targetUnitText);
3666
3666
  }
3667
3667
  const density = getIngredientDensity(ingredientName);
3668
3668
  if (density === void 0) {
3669
- return chunk2TZKENDH_cjs.errorValue(
3669
+ return chunkIT74O4BE_cjs.errorValue(
3670
3670
  "COOKING_UNKNOWN_INGREDIENT",
3671
3671
  `No density data for "${ingredientName}" \u2014 cannot convert between mass and volume for this ingredient`
3672
3672
  );
@@ -3675,12 +3675,12 @@ function cookingConvertHandler(args) {
3675
3675
  const grams2 = chunkEJ3ILXX6_cjs.convertUnit(amount, sourceUnit, "g");
3676
3676
  const mL2 = grams2 / density;
3677
3677
  const result2 = chunkEJ3ILXX6_cjs.convertUnit(mL2, "ml", targetUnitText);
3678
- return chunk2TZKENDH_cjs.uomValue(result2, targetUnitText);
3678
+ return chunkIT74O4BE_cjs.uomValue(result2, targetUnitText);
3679
3679
  }
3680
3680
  const mL = chunkEJ3ILXX6_cjs.convertUnit(amount, sourceUnit, "ml");
3681
3681
  const grams = mL * density;
3682
3682
  const result = chunkEJ3ILXX6_cjs.convertUnit(grams, "g", targetUnitText);
3683
- return chunk2TZKENDH_cjs.uomValue(result, targetUnitText);
3683
+ return chunkIT74O4BE_cjs.uomValue(result, targetUnitText);
3684
3684
  }
3685
3685
 
3686
3686
  // src/packages/uom/parselets/CookingConversionParselet.ts
@@ -3723,7 +3723,7 @@ function ingredientNameNormalizerRule(priority = 68) {
3723
3723
  const candidate = candidateTokens.map((t) => t.value.toLowerCase()).join(" ");
3724
3724
  return {
3725
3725
  consumed: wordCount,
3726
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("INGREDIENT_NAME", candidate, candidateTokens)],
3726
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("INGREDIENT_NAME", candidate, candidateTokens)],
3727
3727
  ruleName: "uom-cooking:ingredient-name"
3728
3728
  };
3729
3729
  }
@@ -3746,7 +3746,7 @@ function multiWordUnitNormalizerRule(priority = 78) {
3746
3746
  if (chunkAMOJYLG2_cjs.UNIT_TABLE[spelling] === void 0) return null;
3747
3747
  return {
3748
3748
  consumed: 2,
3749
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("UNIT", spelling, tokens.slice(pos, pos + 2))],
3749
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("UNIT", spelling, tokens.slice(pos, pos + 2))],
3750
3750
  ruleName: "uom:multi-word-unit"
3751
3751
  };
3752
3752
  }
@@ -3768,7 +3768,7 @@ function compoundUnitNormalizerRule(priority = 77) {
3768
3768
  const spelling = `${numerator.value}/${denominator.value}`;
3769
3769
  return {
3770
3770
  consumed: 3,
3771
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("UNIT", spelling, [numerator, slash, denominator])],
3771
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("UNIT", spelling, [numerator, slash, denominator])],
3772
3772
  ruleName: "uom:compound-unit"
3773
3773
  };
3774
3774
  }
@@ -3817,8 +3817,8 @@ var CurrencySymbolParselet = class {
3817
3817
  this.category = "UoM";
3818
3818
  }
3819
3819
  parse(parser, token, builder) {
3820
- const currency = chunkHIQ5HSZL_cjs.resolveCurrencyAlias(token.value) ?? token.value.toUpperCase();
3821
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Prefix, builder);
3820
+ const currency = chunkA2DZ5BEJ_cjs.resolveCurrencyAlias(token.value) ?? token.value.toUpperCase();
3821
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Prefix, builder);
3822
3822
  if (parser.peek()?.type === "UNIT") {
3823
3823
  parser.consume();
3824
3824
  }
@@ -3838,7 +3838,7 @@ var InParselet = class {
3838
3838
  const targetToken = parser.peek();
3839
3839
  if (targetToken && (targetToken.type === "UNIT" || targetToken.type === "DOLLAR" || targetToken.type === "POUND" || targetToken.type === "EURO" || targetToken.type === "YEN" || targetToken.type === "RUBLE" || targetToken.type === "WON" || targetToken.type === "CURRENCY_SYMBOL" || targetToken.type === "IDENT" || targetToken.type === "IN")) {
3840
3840
  parser.consume();
3841
- const targetUnit = chunkHIQ5HSZL_cjs.resolveCurrencyAlias(targetToken.value) ?? targetToken.value;
3841
+ const targetUnit = chunkA2DZ5BEJ_cjs.resolveCurrencyAlias(targetToken.value) ?? targetToken.value;
3842
3842
  const isoDate = tryConsumeCurrencyOnDate(parser, targetUnit);
3843
3843
  if (isoDate !== null) {
3844
3844
  builder.emitOpcode(13 /* PUSH_STRING */);
@@ -3862,7 +3862,7 @@ function createCurrencyPackage(config = {}) {
3862
3862
  return {
3863
3863
  name: "solve-currency",
3864
3864
  asyncResolvers: [
3865
- new chunkSSV46KFA_cjs.CurrencyAsyncResolver(),
3865
+ new chunk4K5W7EH2_cjs.CurrencyAsyncResolver(),
3866
3866
  createHistoricalCurrencyResolver(config.historicalRateProvider)
3867
3867
  ],
3868
3868
  prefixParselets: [
@@ -3951,7 +3951,7 @@ var MatrixLiteralParselet = class {
3951
3951
  let rows = 0;
3952
3952
  let cols = -1;
3953
3953
  if (parser.peek()?.type === "RBRACKET") {
3954
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
3954
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
3955
3955
  "EMPTY_MATRIX_LITERAL",
3956
3956
  "A matrix literal cannot be empty \u2014 `[]` has no valid shape.",
3957
3957
  {}
@@ -3968,7 +3968,7 @@ var MatrixLiteralParselet = class {
3968
3968
  if (cols === -1) {
3969
3969
  cols = rowCols;
3970
3970
  } else if (rowCols !== cols) {
3971
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
3971
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
3972
3972
  "RAGGED_MATRIX_LITERAL",
3973
3973
  `Matrix literal rows must all have the same number of columns \u2014 row ${rows + 1} has ${rowCols}, but a previous row has ${cols}.`,
3974
3974
  { expectedCols: cols, actualCols: rowCols, row: rows + 1 }
@@ -3988,7 +3988,7 @@ var MatrixLiteralParselet = class {
3988
3988
  var MatrixIndexParselet = class {
3989
3989
  constructor() {
3990
3990
  this.category = "Matrix";
3991
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Postfix;
3991
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Postfix;
3992
3992
  }
3993
3993
  parse(parser, _left, _token, builder) {
3994
3994
  const isSlice = this.hasTopLevelColon(parser);
@@ -4008,7 +4008,7 @@ var MatrixIndexParselet = class {
4008
4008
  return;
4009
4009
  }
4010
4010
  if (argCount !== 2) {
4011
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
4011
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
4012
4012
  "INVALID_MATRIX_SLICE_ARITY",
4013
4013
  `Range-based matrix slicing needs exactly 2 arguments ("a[rowRange, colRange]"), got ${argCount}.`,
4014
4014
  { argCount }
@@ -4091,12 +4091,12 @@ function parseTransform(parser, builder) {
4091
4091
  }
4092
4092
  return { kind: 2, name };
4093
4093
  }
4094
- const transformBuilder = new chunkJ45BCEZ4_cjs.BytecodeBuilder();
4095
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, transformBuilder);
4094
+ const transformBuilder = new chunkMI7OTUHL_cjs.BytecodeBuilder();
4095
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, transformBuilder);
4096
4096
  parser.setBuilder(builder);
4097
4097
  const program = transformBuilder.build();
4098
4098
  if (program.hasAsync) {
4099
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
4099
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
4100
4100
  "MAP_REDUCE_TRANSFORM_MUST_BE_SYNCHRONOUS",
4101
4101
  `map/reduce transform expressions must be synchronous (no weather/stocks/currency calls).`
4102
4102
  );
@@ -4114,7 +4114,7 @@ function consumeCollectionName(parser) {
4114
4114
  parser.consume();
4115
4115
  return token.value;
4116
4116
  }
4117
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
4117
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
4118
4118
  "MAP_REDUCE_EXPECTED_COLLECTION_NAME",
4119
4119
  `Expected a collection name (e.g. "x" in "x=[1,2,3]") but got ${token ? `"${token.value}"` : "end of input"}.`
4120
4120
  );
@@ -4178,7 +4178,7 @@ var ReduceParselet = class {
4178
4178
  parseCollectionExpr(parser, builder);
4179
4179
  let hasInitial = 0;
4180
4180
  if (parser.match("COMMA")) {
4181
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
4181
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
4182
4182
  hasInitial = 1;
4183
4183
  }
4184
4184
  parser.consume("RPAREN");
@@ -4193,15 +4193,15 @@ var SumParselet = class {
4193
4193
  }
4194
4194
  parse(parser, _token, builder) {
4195
4195
  parser.consume("LPAREN");
4196
- const bodyBuilder = new chunkJ45BCEZ4_cjs.BytecodeBuilder();
4196
+ const bodyBuilder = new chunkMI7OTUHL_cjs.BytecodeBuilder();
4197
4197
  bodyBuilder.emitOpcode(60 /* LOAD_VAR */);
4198
4198
  bodyBuilder.emitString("acc");
4199
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, bodyBuilder);
4199
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, bodyBuilder);
4200
4200
  parser.setBuilder(builder);
4201
4201
  bodyBuilder.emitOpcode(20 /* ADD */);
4202
4202
  const bodyProgram = bodyBuilder.build();
4203
4203
  if (bodyProgram.hasAsync) {
4204
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
4204
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
4205
4205
  "MAP_REDUCE_TRANSFORM_MUST_BE_SYNCHRONOUS",
4206
4206
  `sum's element expression must be synchronous (no weather/stocks/currency calls).`
4207
4207
  );
@@ -4222,15 +4222,15 @@ var ProdParselet = class {
4222
4222
  }
4223
4223
  parse(parser, _token, builder) {
4224
4224
  parser.consume("LPAREN");
4225
- const bodyBuilder = new chunkJ45BCEZ4_cjs.BytecodeBuilder();
4225
+ const bodyBuilder = new chunkMI7OTUHL_cjs.BytecodeBuilder();
4226
4226
  bodyBuilder.emitOpcode(60 /* LOAD_VAR */);
4227
4227
  bodyBuilder.emitString("acc");
4228
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, bodyBuilder);
4228
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, bodyBuilder);
4229
4229
  parser.setBuilder(builder);
4230
4230
  bodyBuilder.emitOpcode(22 /* MUL */);
4231
4231
  const bodyProgram = bodyBuilder.build();
4232
4232
  if (bodyProgram.hasAsync) {
4233
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
4233
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
4234
4234
  "MAP_REDUCE_TRANSFORM_MUST_BE_SYNCHRONOUS",
4235
4235
  `prod's element expression must be synchronous (no weather/stocks/currency calls).`
4236
4236
  );
@@ -4275,7 +4275,7 @@ function mapReduceCallNormalizerRule(priority = 80) {
4275
4275
  return {
4276
4276
  consumed: 1,
4277
4277
  replacement: [
4278
- new chunkZMW6NU2K_cjs.LexerToken(tokenType, chunkQFTDTX6K_cjs.tokenTypeId(tokenType), token.value, token.value, token.offset, 0, token.line, token.col)
4278
+ new chunkYJHY7CMN_cjs.LexerToken(tokenType, chunkG2YPPLGX_cjs.tokenTypeId(tokenType), token.value, token.value, token.offset, 0, token.line, token.col)
4279
4279
  ],
4280
4280
  ruleName: "mapreduce:call"
4281
4281
  };
@@ -4317,7 +4317,7 @@ var ExpandParselet = class {
4317
4317
  }
4318
4318
  parse(parser, _token, builder) {
4319
4319
  parser.consume("LPAREN");
4320
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
4320
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
4321
4321
  parser.consume("RPAREN");
4322
4322
  builder.emitOpcode(51 /* CALL_BUILTIN */);
4323
4323
  builder.emitIndex(SYMBOLIC_BUILTIN_EXPAND);
@@ -4332,7 +4332,7 @@ var FactorParselet = class {
4332
4332
  }
4333
4333
  parse(parser, _token, builder) {
4334
4334
  parser.consume("LPAREN");
4335
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
4335
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
4336
4336
  parser.consume("RPAREN");
4337
4337
  builder.emitOpcode(51 /* CALL_BUILTIN */);
4338
4338
  builder.emitIndex(SYMBOLIC_BUILTIN_FACTOR);
@@ -4344,7 +4344,7 @@ var FactorParselet = class {
4344
4344
  function readVariableName(parser, verb) {
4345
4345
  const token = parser.peek();
4346
4346
  if (!token || token.type !== "IDENT" && token.type !== "UNIT") {
4347
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
4347
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
4348
4348
  "SYMBOLIC_REQUIRES_VARIABLE_NAME",
4349
4349
  `${verb} needs the name of an unknown here, as in ${verb}(x^2, x).`,
4350
4350
  { found: token?.type ?? "end of input" }
@@ -4358,12 +4358,12 @@ function emitVariableName(builder, name) {
4358
4358
  builder.emitString(name);
4359
4359
  }
4360
4360
  function parseBoundExpression(parser, builder, verb) {
4361
- const inner = new chunkJ45BCEZ4_cjs.BytecodeBuilder();
4362
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, inner);
4361
+ const inner = new chunkMI7OTUHL_cjs.BytecodeBuilder();
4362
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, inner);
4363
4363
  parser.setBuilder(builder);
4364
4364
  const program = inner.build();
4365
4365
  if (program.hasAsync) {
4366
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
4366
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
4367
4367
  "SYMBOLIC_ARGUMENT_MUST_BE_SYNCHRONOUS",
4368
4368
  `${verb}'s expression must be synchronous (no weather/stocks/currency calls).`
4369
4369
  );
@@ -4388,7 +4388,7 @@ var SolveParselet = class {
4388
4388
  parser.consume("COMMA");
4389
4389
  const variable = parser.peek();
4390
4390
  if (!variable || variable.type !== "IDENT" && variable.type !== "UNIT") {
4391
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
4391
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
4392
4392
  "SOLVE_REQUIRES_VARIABLE_NAME",
4393
4393
  `solve's second argument must be the name of the unknown to solve for, as in solve(x^2-4=0, x).`,
4394
4394
  { found: variable?.type ?? "end of input" }
@@ -4423,7 +4423,7 @@ var DerParselet = class {
4423
4423
  emitBoundExpression(builder, expression, variable);
4424
4424
  emitVariableName(builder, variable);
4425
4425
  if (parser.match("COMMA")) {
4426
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
4426
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
4427
4427
  } else {
4428
4428
  builder.emitOpcode(10 /* PUSH_NUMBER */);
4429
4429
  builder.emitNumber(1);
@@ -4467,9 +4467,9 @@ var TaylorParselet = class {
4467
4467
  emitBoundExpression(builder, expression, variable);
4468
4468
  emitVariableName(builder, variable);
4469
4469
  parser.consume("EQUALS");
4470
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
4470
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
4471
4471
  parser.consume("COMMA");
4472
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
4472
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
4473
4473
  parser.consume("RPAREN");
4474
4474
  builder.emitOpcode(51 /* CALL_BUILTIN */);
4475
4475
  builder.emitIndex(SYMBOLIC_BUILTIN_TAYLOR);
@@ -4486,7 +4486,7 @@ var JacobianParselet = class {
4486
4486
  parser.consume("LPAREN");
4487
4487
  let count = 0;
4488
4488
  do {
4489
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
4489
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
4490
4490
  count++;
4491
4491
  } while (parser.match("COMMA"));
4492
4492
  parser.consume("RPAREN");
@@ -4517,7 +4517,7 @@ var ConjParselet = class {
4517
4517
  }
4518
4518
  parse(parser, _token, builder) {
4519
4519
  parser.consume("LPAREN");
4520
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
4520
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
4521
4521
  parser.consume("RPAREN");
4522
4522
  builder.emitOpcode(51 /* CALL_BUILTIN */);
4523
4523
  builder.emitIndex(SYMBOLIC_BUILTIN_CONJ);
@@ -4532,7 +4532,7 @@ var ReParselet = class {
4532
4532
  }
4533
4533
  parse(parser, _token, builder) {
4534
4534
  parser.consume("LPAREN");
4535
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
4535
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
4536
4536
  parser.consume("RPAREN");
4537
4537
  builder.emitOpcode(51 /* CALL_BUILTIN */);
4538
4538
  builder.emitIndex(SYMBOLIC_BUILTIN_RE);
@@ -4547,7 +4547,7 @@ var ImParselet = class {
4547
4547
  }
4548
4548
  parse(parser, _token, builder) {
4549
4549
  parser.consume("LPAREN");
4550
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
4550
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
4551
4551
  parser.consume("RPAREN");
4552
4552
  builder.emitOpcode(51 /* CALL_BUILTIN */);
4553
4553
  builder.emitIndex(SYMBOLIC_BUILTIN_IM);
@@ -4562,7 +4562,7 @@ var CancelParselet = class {
4562
4562
  }
4563
4563
  parse(parser, _token, builder) {
4564
4564
  parser.consume("LPAREN");
4565
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
4565
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
4566
4566
  parser.consume("RPAREN");
4567
4567
  builder.emitOpcode(51 /* CALL_BUILTIN */);
4568
4568
  builder.emitIndex(SYMBOLIC_BUILTIN_CANCEL);
@@ -4577,7 +4577,7 @@ var ApartParselet = class {
4577
4577
  }
4578
4578
  parse(parser, _token, builder) {
4579
4579
  parser.consume("LPAREN");
4580
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
4580
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
4581
4581
  parser.consume("RPAREN");
4582
4582
  builder.emitOpcode(51 /* CALL_BUILTIN */);
4583
4583
  builder.emitIndex(SYMBOLIC_BUILTIN_APART);
@@ -4600,9 +4600,9 @@ function imaginaryLiteralNormalizerRule(priority = 75) {
4600
4600
  return {
4601
4601
  consumed: 2,
4602
4602
  replacement: [
4603
- new chunkZMW6NU2K_cjs.LexerToken(
4603
+ new chunkYJHY7CMN_cjs.LexerToken(
4604
4604
  "IMAGINARY",
4605
- chunkQFTDTX6K_cjs.tokenTypeId("IMAGINARY"),
4605
+ chunkG2YPPLGX_cjs.tokenTypeId("IMAGINARY"),
4606
4606
  number.value,
4607
4607
  number.value,
4608
4608
  number.offset,
@@ -4646,7 +4646,7 @@ function symbolicCallNormalizerRule(priority = 80) {
4646
4646
  return {
4647
4647
  consumed: 1,
4648
4648
  replacement: [
4649
- new chunkZMW6NU2K_cjs.LexerToken(tokenType, chunkQFTDTX6K_cjs.tokenTypeId(tokenType), token.value, token.value, token.offset, 0, token.line, token.col)
4649
+ new chunkYJHY7CMN_cjs.LexerToken(tokenType, chunkG2YPPLGX_cjs.tokenTypeId(tokenType), token.value, token.value, token.offset, 0, token.line, token.col)
4650
4650
  ],
4651
4651
  ruleName: "symbolic:call"
4652
4652
  };
@@ -4799,7 +4799,7 @@ var BigIntNumberParselet = class {
4799
4799
  }
4800
4800
  parse(parser, token, builder) {
4801
4801
  builder.emitOpcode(11 /* PUSH_BIGINT */);
4802
- builder.emitString(chunkJ45BCEZ4_cjs.bigIntLiteralDigits(token.value, parser.getLocaleCode()));
4802
+ builder.emitString(chunkMI7OTUHL_cjs.bigIntLiteralDigits(token.value, parser.getLocaleCode()));
4803
4803
  }
4804
4804
  };
4805
4805
 
@@ -4816,7 +4816,7 @@ var ComparisonParselet = class {
4816
4816
  constructor(opcode) {
4817
4817
  this.opcode = opcode;
4818
4818
  this.category = "Conditionals";
4819
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
4819
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
4820
4820
  }
4821
4821
  parse(parser, left, token, builder) {
4822
4822
  parser.parseExpression(this.bindingPower, builder);
@@ -4879,9 +4879,9 @@ var CONDITIONALS_PACKAGE = {
4879
4879
  { tokenType: "GT", parselet: new ComparisonParselet(44 /* GT */) },
4880
4880
  { tokenType: "LTE", parselet: new ComparisonParselet(43 /* LTE */) },
4881
4881
  { tokenType: "GTE", parselet: new ComparisonParselet(45 /* GTE */) },
4882
- { tokenType: "OR", parselet: new LogicalParselet(131 /* LOGICAL_OR */, chunkJ45BCEZ4_cjs.BindingPower.LogicalOr) },
4883
- { tokenType: "LOGICAL_AND", parselet: new LogicalParselet(130 /* LOGICAL_AND */, chunkJ45BCEZ4_cjs.BindingPower.LogicalAnd) },
4884
- { tokenType: "LOGICAL_OR", parselet: new LogicalParselet(131 /* LOGICAL_OR */, chunkJ45BCEZ4_cjs.BindingPower.LogicalOr) }
4882
+ { tokenType: "OR", parselet: new LogicalParselet(131 /* LOGICAL_OR */, chunkMI7OTUHL_cjs.BindingPower.LogicalOr) },
4883
+ { tokenType: "LOGICAL_AND", parselet: new LogicalParselet(130 /* LOGICAL_AND */, chunkMI7OTUHL_cjs.BindingPower.LogicalAnd) },
4884
+ { tokenType: "LOGICAL_OR", parselet: new LogicalParselet(131 /* LOGICAL_OR */, chunkMI7OTUHL_cjs.BindingPower.LogicalOr) }
4885
4885
  ]
4886
4886
  };
4887
4887
 
@@ -4913,7 +4913,7 @@ var BASE_CONVERTERS = {
4913
4913
  var AsConverterParselet = class {
4914
4914
  constructor() {
4915
4915
  this.category = "Converters";
4916
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
4916
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
4917
4917
  }
4918
4918
  parse(parser, left, token, builder) {
4919
4919
  const nextToken = parser.peek();
@@ -4923,7 +4923,7 @@ var AsConverterParselet = class {
4923
4923
  return;
4924
4924
  }
4925
4925
  if (!nextToken || nextToken.type !== "CONVERTER_NAME" && nextToken.type !== "IDENT" && nextToken.type !== "FUNC" && nextToken.type !== "UNIT") {
4926
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
4926
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
4927
4927
  "AS_CONVERTER_EXPECTED_NAME",
4928
4928
  `Expected a converter name after "as" (e.g. "as hex", "as decimal") but got ${nextToken ? `"${nextToken.value}"` : "end of input"}`
4929
4929
  );
@@ -4935,7 +4935,7 @@ var AsConverterParselet = class {
4935
4935
  const radix = radixToken?.type === "NUMBER" ? Number(radixToken.value) : NaN;
4936
4936
  const opcode = BASE_CONVERTERS[radix];
4937
4937
  if (opcode === void 0) {
4938
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
4938
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
4939
4939
  "AS_CONVERTER_UNSUPPORTED_BASE",
4940
4940
  `"as base ${radixToken?.value ?? "?"}": only bases ${Object.keys(BASE_CONVERTERS).join(", ")} can be written out`
4941
4941
  );
@@ -4947,7 +4947,7 @@ var AsConverterParselet = class {
4947
4947
  const builtinOp = BUILTIN_CONVERTERS[name];
4948
4948
  if (builtinOp !== void 0) {
4949
4949
  if (builtinOp === 141 /* TO_MULTIPLIER */ && parser.match("OF")) {
4950
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
4950
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
4951
4951
  builder.emitOpcode(23 /* DIV */);
4952
4952
  }
4953
4953
  builder.emitOpcode(builtinOp);
@@ -5002,7 +5002,7 @@ function readDirection(parser) {
5002
5002
  var RoundedParselet = class {
5003
5003
  constructor() {
5004
5004
  this.category = "Converters";
5005
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
5005
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
5006
5006
  }
5007
5007
  parse(parser, _left, _token, builder) {
5008
5008
  const direction = readDirection(parser);
@@ -5016,7 +5016,7 @@ var RoundedParselet = class {
5016
5016
  var ToNearestParselet = class {
5017
5017
  constructor() {
5018
5018
  this.category = "Converters";
5019
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
5019
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
5020
5020
  }
5021
5021
  parse(parser, _left, _token, builder) {
5022
5022
  emitRoundToIncrement(builder, readIncrement(parser), "nearest");
@@ -5035,7 +5035,7 @@ function readIncrement(parser) {
5035
5035
  const value = Number(next.value);
5036
5036
  if (Number.isFinite(value) && value > 0) return value;
5037
5037
  }
5038
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
5038
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
5039
5039
  "INVALID_ROUNDING_INCREMENT",
5040
5040
  `"to nearest ${next?.value ?? "?"}": expected a positive number or one of ${Object.keys(INCREMENT_WORDS).join(", ")}`
5041
5041
  );
@@ -5043,12 +5043,12 @@ function readIncrement(parser) {
5043
5043
  var DecimalPlacesParselet = class {
5044
5044
  constructor() {
5045
5045
  this.category = "Converters";
5046
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
5046
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
5047
5047
  }
5048
5048
  parse(_parser, _left, token, builder) {
5049
5049
  const places = Number(token.value);
5050
5050
  if (!Number.isFinite(places) || places < 0 || places > 100) {
5051
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
5051
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
5052
5052
  "INVALID_DECIMAL_PLACES",
5053
5053
  `"to ${token.value} dp": expected a place count between 0 and 100`
5054
5054
  );
@@ -5087,7 +5087,7 @@ function decimalPlacesNormalizerRule(priority = 66) {
5087
5087
  return {
5088
5088
  consumed,
5089
5089
  replacement: [
5090
- chunkCUR2WLI4_cjs.createFusedToken("DECIMAL_PLACES", count.value, tokens.slice(pos, pos + consumed))
5090
+ chunkICEKS6YC_cjs.createFusedToken("DECIMAL_PLACES", count.value, tokens.slice(pos, pos + consumed))
5091
5091
  ],
5092
5092
  ruleName: "converters:decimal-places"
5093
5093
  };
@@ -5109,7 +5109,7 @@ function converterPrepositionNormalizerRule(priority = 67) {
5109
5109
  if (!isConverterTarget) return null;
5110
5110
  return {
5111
5111
  consumed: 1,
5112
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("AS", "as", [preposition])],
5112
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("AS", "as", [preposition])],
5113
5113
  ruleName: "converters:preposition"
5114
5114
  };
5115
5115
  }
@@ -5146,10 +5146,10 @@ var VariadicAggregateParselet = class {
5146
5146
  }
5147
5147
  parse(parser, token, builder) {
5148
5148
  let argCount = 0;
5149
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conjunction, builder);
5149
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conjunction, builder);
5150
5150
  argCount++;
5151
5151
  while (parser.match("COMMA") || parser.match("AND_CONJ")) {
5152
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conjunction, builder);
5152
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conjunction, builder);
5153
5153
  argCount++;
5154
5154
  }
5155
5155
  builder.emitOpcode(51 /* CALL_BUILTIN */);
@@ -5163,7 +5163,7 @@ function unaryPhraseParselet(builtinIndex) {
5163
5163
  return {
5164
5164
  category: "MathPhrases",
5165
5165
  parse(parser, _token, builder) {
5166
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5166
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5167
5167
  builder.emitOpcode(51 /* CALL_BUILTIN */);
5168
5168
  builder.emitIndex(builtinIndex);
5169
5169
  builder.emitIndex(1);
@@ -5175,28 +5175,28 @@ function unaryPhraseParselet(builtinIndex) {
5175
5175
  var remainderOfParselet = {
5176
5176
  category: "MathPhrases",
5177
5177
  parse(parser, _token, builder) {
5178
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Product, builder);
5178
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
5179
5179
  if (!parser.match("DIVIDE_BY") && !parser.match("SLASH")) {
5180
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
5180
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
5181
5181
  "REMAINDER_EXPECTED_DIVIDED_BY",
5182
5182
  'Expected "divided by" or "/", as in "remainder of 21 divided by 5"'
5183
5183
  );
5184
5184
  }
5185
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Product, builder);
5185
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
5186
5186
  builder.emitOpcode(24 /* MOD */);
5187
5187
  }
5188
5188
  };
5189
5189
  var nthRootParselet = {
5190
5190
  category: "MathPhrases",
5191
5191
  parse(parser, _token, builder) {
5192
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Product, builder);
5192
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
5193
5193
  if (!parser.match("OF")) {
5194
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
5194
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
5195
5195
  "ROOT_EXPECTED_OF",
5196
5196
  'Expected "of", as in "root 5 of 100"'
5197
5197
  );
5198
5198
  }
5199
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
5199
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5200
5200
  builder.emitOpcode(2 /* SWAP */);
5201
5201
  builder.emitOpcode(10 /* PUSH_NUMBER */);
5202
5202
  builder.emitNumber(1);
@@ -5208,15 +5208,15 @@ var nthRootParselet = {
5208
5208
  var logBaseParselet = {
5209
5209
  category: "MathPhrases",
5210
5210
  parse(parser, _token, builder) {
5211
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
5211
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5212
5212
  emitNaturalLog(builder);
5213
5213
  if (!parser.match("LOG_BASE")) {
5214
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
5214
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
5215
5215
  "LOG_EXPECTED_BASE",
5216
5216
  'Expected "base", as in "log 20 base 4"'
5217
5217
  );
5218
5218
  }
5219
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
5219
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5220
5220
  emitNaturalLog(builder);
5221
5221
  builder.emitOpcode(23 /* DIV */);
5222
5222
  }
@@ -5242,15 +5242,15 @@ function functionPhraseNormalizerRule(priority = 69) {
5242
5242
  if (word === "root") {
5243
5243
  return {
5244
5244
  consumed: 1,
5245
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("NTH_ROOT", "root", [head])],
5245
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("NTH_ROOT", "root", [head])],
5246
5246
  ruleName: "mathphrases:function-phrase"
5247
5247
  };
5248
5248
  }
5249
5249
  const baseAt = findBase(tokens, pos + 1);
5250
5250
  if (baseAt === -1) return null;
5251
5251
  const replacement = tokens.slice(pos, baseAt + 1).map((token, index) => {
5252
- if (index === 0) return chunkCUR2WLI4_cjs.createFusedToken("LOG_PHRASE", "log", [token]);
5253
- if (index === baseAt - pos) return chunkCUR2WLI4_cjs.createFusedToken("LOG_BASE", "base", [token]);
5252
+ if (index === 0) return chunkICEKS6YC_cjs.createFusedToken("LOG_PHRASE", "log", [token]);
5253
+ if (index === baseAt - pos) return chunkICEKS6YC_cjs.createFusedToken("LOG_BASE", "base", [token]);
5254
5254
  return token;
5255
5255
  });
5256
5256
  return {
@@ -5275,9 +5275,9 @@ function largerSmallerParselet(builtinIndex) {
5275
5275
  return {
5276
5276
  category: "MathPhrases",
5277
5277
  parse(parser, token, builder) {
5278
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conjunction, builder);
5278
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conjunction, builder);
5279
5279
  parser.consume("AND_CONJ");
5280
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5280
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5281
5281
  builder.emitOpcode(51 /* CALL_BUILTIN */);
5282
5282
  builder.emitIndex(builtinIndex);
5283
5283
  builder.emitIndex(2);
@@ -5289,7 +5289,7 @@ function largerSmallerParselet(builtinIndex) {
5289
5289
  var halfParselet = {
5290
5290
  category: "MathPhrases",
5291
5291
  parse(parser, token, builder) {
5292
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5292
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5293
5293
  builder.emitOpcode(10 /* PUSH_NUMBER */);
5294
5294
  builder.emitNumber(2);
5295
5295
  builder.emitOpcode(23 /* DIV */);
@@ -5300,9 +5300,9 @@ var halfParselet = {
5300
5300
  var midpointParselet = {
5301
5301
  category: "MathPhrases",
5302
5302
  parse(parser, token, builder) {
5303
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conjunction, builder);
5303
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conjunction, builder);
5304
5304
  parser.consume("AND_CONJ");
5305
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5305
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5306
5306
  builder.emitOpcode(20 /* ADD */);
5307
5307
  builder.emitOpcode(10 /* PUSH_NUMBER */);
5308
5308
  builder.emitNumber(2);
@@ -5317,7 +5317,7 @@ var randomNumberParselet = definePhrasePattern({
5317
5317
  {
5318
5318
  slots: [
5319
5319
  { kind: "keyword", tokenTypes: ["BETWEEN"] },
5320
- { kind: "expr", bindingPower: chunkJ45BCEZ4_cjs.BindingPower.Product },
5320
+ { kind: "expr", bindingPower: chunkMI7OTUHL_cjs.BindingPower.Product },
5321
5321
  { kind: "keyword", tokenTypes: ["AND_CONJ"] },
5322
5322
  { kind: "expr" }
5323
5323
  ],
@@ -5337,20 +5337,20 @@ var ClampParselet = class {
5337
5337
  this.category = "MathPhrases";
5338
5338
  }
5339
5339
  parse(parser, token, builder) {
5340
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5340
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5341
5341
  const mid = parser.peek();
5342
5342
  if (mid?.type === "BETWEEN") {
5343
5343
  parser.consume();
5344
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Product, builder);
5344
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
5345
5345
  parser.consume("AND_CONJ");
5346
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5346
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5347
5347
  } else if (mid?.type === "FROM") {
5348
5348
  parser.consume();
5349
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5349
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5350
5350
  parser.consume("TO");
5351
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5351
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5352
5352
  } else {
5353
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
5353
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
5354
5354
  "CLAMP_EXPECTED_BETWEEN_OR_FROM",
5355
5355
  `Expected "between" or "from" after "clamp <value>" but got ${mid ? `"${mid.value}"` : "end of input"}`
5356
5356
  );
@@ -5366,7 +5366,7 @@ var PROPORTION_BUILTIN_INDEX = 46;
5366
5366
  var ProportionParselet = class {
5367
5367
  constructor() {
5368
5368
  this.category = "MathPhrases";
5369
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
5369
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
5370
5370
  }
5371
5371
  parse(parser, left, token, builder) {
5372
5372
  parser.parseExpression(this.bindingPower, builder);
@@ -5375,7 +5375,7 @@ var ProportionParselet = class {
5375
5375
  parser.consume("IS_TO");
5376
5376
  const whatToken = parser.consume();
5377
5377
  if (!whatToken || whatToken.value.toLowerCase() !== "what") {
5378
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
5378
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
5379
5379
  "PROPORTION_EXPECTED_WHAT",
5380
5380
  `Expected "what" but got ${whatToken ? `"${whatToken.value}"` : "end of input"}`
5381
5381
  );
@@ -5467,7 +5467,7 @@ function readCompoundingInterval(parser) {
5467
5467
  const name = (token?.text ?? token?.value ?? "").toLowerCase();
5468
5468
  const periods = PERIODS_PER_YEAR[name];
5469
5469
  if (periods === void 0) {
5470
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
5470
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
5471
5471
  "UNKNOWN_COMPOUNDING_INTERVAL",
5472
5472
  `compounding ${name || "?"}: expected one of ${Object.keys(PERIODS_PER_YEAR).join(", ")}`
5473
5473
  );
@@ -5485,12 +5485,12 @@ var InvestmentGrowthParselet = class {
5485
5485
  this.annualIndex = annualIndex;
5486
5486
  this.intervalIndex = intervalIndex;
5487
5487
  this.category = "Finance";
5488
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
5488
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
5489
5489
  }
5490
5490
  parse(parser, _left, _token, builder) {
5491
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
5491
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5492
5492
  if (!parser.match("RATE_AT")) parser.consume("AT");
5493
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
5493
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5494
5494
  const periods = readCompoundingInterval(parser);
5495
5495
  builder.emitOpcode(2 /* SWAP */);
5496
5496
  if (periods === 1) {
@@ -5512,13 +5512,13 @@ var PresentValueParselet = class {
5512
5512
  this.category = "Finance";
5513
5513
  }
5514
5514
  parse(parser, _token, builder) {
5515
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
5515
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5516
5516
  if (!parser.match("AFTER") && !parser.match("OVER") && !parser.match("IN")) {
5517
5517
  parser.consume("AFTER");
5518
5518
  }
5519
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
5519
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5520
5520
  if (!parser.match("RATE_AT")) parser.consume("AT");
5521
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
5521
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5522
5522
  builder.emitOpcode(2 /* SWAP */);
5523
5523
  builder.emitOpcode(51 /* CALL_BUILTIN */);
5524
5524
  builder.emitIndex(this.builtinIndex);
@@ -5529,10 +5529,10 @@ var ReturnOnInvestmentParselet = class {
5529
5529
  constructor(builtinIndex) {
5530
5530
  this.builtinIndex = builtinIndex;
5531
5531
  this.category = "Finance";
5532
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Conditional;
5532
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
5533
5533
  }
5534
5534
  parse(parser, _left, _token, builder) {
5535
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
5535
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5536
5536
  parser.consume("RETURNED");
5537
5537
  builder.emitOpcode(51 /* CALL_BUILTIN */);
5538
5538
  builder.emitIndex(this.builtinIndex);
@@ -5545,14 +5545,14 @@ var AnnualReturnParselet = class {
5545
5545
  this.category = "Finance";
5546
5546
  }
5547
5547
  parse(parser, _token, builder) {
5548
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
5548
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5549
5549
  parser.consume("INVESTED");
5550
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
5550
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5551
5551
  parser.consume("RETURNED");
5552
5552
  if (!parser.match("AFTER") && !parser.match("OVER") && !parser.match("IN")) {
5553
5553
  parser.consume("AFTER");
5554
5554
  }
5555
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
5555
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5556
5556
  builder.emitOpcode(51 /* CALL_BUILTIN */);
5557
5557
  builder.emitIndex(this.builtinIndex);
5558
5558
  builder.emitIndex(3);
@@ -5562,15 +5562,15 @@ var AnnualReturnParselet = class {
5562
5562
  // src/packages/finance/parselets/TermRateClauses.ts
5563
5563
  function parseTermAndRate(parser, builder, termWords) {
5564
5564
  if (matchTerm(parser, termWords)) {
5565
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5565
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5566
5566
  consumeRate(parser);
5567
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5567
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5568
5568
  return { swap: true };
5569
5569
  }
5570
5570
  consumeRate(parser);
5571
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5571
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5572
5572
  consumeTerm(parser, termWords);
5573
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5573
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5574
5574
  return { swap: false };
5575
5575
  }
5576
5576
  function matchTerm(parser, termWords) {
@@ -5600,7 +5600,7 @@ var CompoundInterestParselet = class {
5600
5600
  this.category = "Finance";
5601
5601
  }
5602
5602
  parse(parser, _token, builder) {
5603
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Conditional, builder);
5603
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5604
5604
  const { swap } = parseTermAndRate(parser, builder, ["AFTER", "FOR_DURATION", "OVER"]);
5605
5605
  const periods = readCompoundingInterval(parser);
5606
5606
  if (swap) builder.emitOpcode(2 /* SWAP */);
@@ -5626,7 +5626,7 @@ var LoanRepaymentParselet = class {
5626
5626
  this.category = "Finance";
5627
5627
  }
5628
5628
  parse(parser, _token, builder) {
5629
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5629
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5630
5630
  const { swap } = parseTermAndRate(parser, builder, ["OVER"]);
5631
5631
  if (swap) builder.emitOpcode(2 /* SWAP */);
5632
5632
  builder.emitOpcode(10 /* PUSH_NUMBER */);
@@ -5637,6 +5637,105 @@ var LoanRepaymentParselet = class {
5637
5637
  }
5638
5638
  };
5639
5639
 
5640
+ // src/packages/finance/parselets/BillSplitParselets.ts
5641
+ var SplitBetweenParselet = class {
5642
+ constructor(builtinIndex) {
5643
+ this.builtinIndex = builtinIndex;
5644
+ this.category = "Finance";
5645
+ }
5646
+ parse(parser, _token, builder) {
5647
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5648
+ parser.consume("BETWEEN");
5649
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5650
+ parser.match("PEOPLE");
5651
+ builder.emitOpcode(51 /* CALL_BUILTIN */);
5652
+ builder.emitIndex(this.builtinIndex);
5653
+ builder.emitIndex(2);
5654
+ }
5655
+ };
5656
+ var SplitWaysParselet = class {
5657
+ constructor(builtinIndex) {
5658
+ this.builtinIndex = builtinIndex;
5659
+ this.category = "Finance";
5660
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
5661
+ }
5662
+ parse(parser, _left, _token, builder) {
5663
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5664
+ parser.consume("WAYS");
5665
+ builder.emitOpcode(51 /* CALL_BUILTIN */);
5666
+ builder.emitIndex(this.builtinIndex);
5667
+ builder.emitIndex(2);
5668
+ }
5669
+ };
5670
+
5671
+ // src/packages/finance/parselets/SavingsGoalParselets.ts
5672
+ var SAVINGS_PERIODS = {
5673
+ daily: { perYear: 365, unit: "days" },
5674
+ weekly: { perYear: 52, unit: "weeks" },
5675
+ monthly: { perYear: 12, unit: "months" },
5676
+ yearly: { perYear: 1, unit: "years" },
5677
+ annually: { perYear: 1, unit: "years" }
5678
+ };
5679
+ function readSavingsPeriod(parser) {
5680
+ const token = parser.peek();
5681
+ const word = (token?.text ?? token?.value ?? "").toLowerCase();
5682
+ const period = SAVINGS_PERIODS[word];
5683
+ if (period === void 0) {
5684
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
5685
+ "UNKNOWN_SAVINGS_PERIOD",
5686
+ `savings goal: expected a contribution period, one of ${Object.keys(SAVINGS_PERIODS).join(", ")}, not "${word || "?"}".`
5687
+ );
5688
+ }
5689
+ parser.consume();
5690
+ return period;
5691
+ }
5692
+ var SavingsDurationParselet = class {
5693
+ constructor(builtinIndex) {
5694
+ this.builtinIndex = builtinIndex;
5695
+ this.category = "Finance";
5696
+ }
5697
+ parse(parser, _token, builder) {
5698
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5699
+ if (!parser.match("RATE_AT")) parser.consume("AT");
5700
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
5701
+ parser.match("STAR");
5702
+ const period = readSavingsPeriod(parser);
5703
+ builder.emitOpcode(10 /* PUSH_NUMBER */);
5704
+ builder.emitNumber(period.perYear);
5705
+ if (parser.match("RATE_AT") || parser.match("AT")) {
5706
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5707
+ } else {
5708
+ builder.emitOpcode(10 /* PUSH_NUMBER */);
5709
+ builder.emitNumber(0);
5710
+ }
5711
+ builder.emitOpcode(13 /* PUSH_STRING */);
5712
+ builder.emitString(period.unit);
5713
+ builder.emitOpcode(51 /* CALL_BUILTIN */);
5714
+ builder.emitIndex(this.builtinIndex);
5715
+ builder.emitIndex(5);
5716
+ }
5717
+ };
5718
+ var SavingsContributionParselet = class {
5719
+ constructor(builtinIndex) {
5720
+ this.builtinIndex = builtinIndex;
5721
+ this.category = "Finance";
5722
+ }
5723
+ parse(parser, _token, builder) {
5724
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
5725
+ parser.consume("IN");
5726
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5727
+ if (parser.match("RATE_AT") || parser.match("AT")) {
5728
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
5729
+ } else {
5730
+ builder.emitOpcode(10 /* PUSH_NUMBER */);
5731
+ builder.emitNumber(0);
5732
+ }
5733
+ builder.emitOpcode(51 /* CALL_BUILTIN */);
5734
+ builder.emitIndex(this.builtinIndex);
5735
+ builder.emitIndex(3);
5736
+ }
5737
+ };
5738
+
5640
5739
  // src/packages/finance/parselets/SalesTaxParselet.ts
5641
5740
  var SalesTaxParselet = class {
5642
5741
  constructor(builtinIndex) {
@@ -5644,9 +5743,9 @@ var SalesTaxParselet = class {
5644
5743
  this.category = "Finance";
5645
5744
  }
5646
5745
  parse(parser, _token, builder) {
5647
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5746
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5648
5747
  parser.consume("RATE_AT");
5649
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5748
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5650
5749
  builder.emitOpcode(51 /* CALL_BUILTIN */);
5651
5750
  builder.emitIndex(this.builtinIndex);
5652
5751
  builder.emitIndex(2);
@@ -5654,30 +5753,30 @@ var SalesTaxParselet = class {
5654
5753
  };
5655
5754
 
5656
5755
  // src/packages/finance/parselets/InflationPluginFunctions.ts
5657
- var INFLATION_FROM_YEAR_TO_PRESENT_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
5658
- var INFLATION_TO_YEAR_FROM_PRESENT_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
5659
- var INFLATION_FUTURE_VALUE_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
5756
+ var INFLATION_FROM_YEAR_TO_PRESENT_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
5757
+ var INFLATION_TO_YEAR_FROM_PRESENT_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
5758
+ var INFLATION_FUTURE_VALUE_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
5660
5759
  function yearRangeError(code, badYear) {
5661
- return chunk2TZKENDH_cjs.errorValue(
5760
+ return chunkIT74O4BE_cjs.errorValue(
5662
5761
  code,
5663
- `Year ${badYear} is outside the bundled CPI table's range (${chunk7ZX6B7SY_cjs.CPI_MIN_YEAR}-${chunk7ZX6B7SY_cjs.CPI_MAX_YEAR})`
5762
+ `Year ${badYear} is outside the bundled CPI table's range (${chunkFR7RNOPT_cjs.CPI_MIN_YEAR}-${chunkFR7RNOPT_cjs.CPI_MAX_YEAR})`
5664
5763
  );
5665
5764
  }
5666
5765
  function inflationFromYearToPresentHandler(args) {
5667
5766
  const amountValue = args[0];
5668
5767
  const fromYear = args[1].toNumber();
5669
5768
  const toYear = (/* @__PURE__ */ new Date()).getFullYear();
5670
- const result = chunk7ZX6B7SY_cjs.adjustForInflation(amountValue.toNumber(), fromYear, toYear);
5769
+ const result = chunkFR7RNOPT_cjs.adjustForInflation(amountValue.toNumber(), fromYear, toYear);
5671
5770
  if (result === void 0) return yearRangeError("INFLATION_YEAR_OUT_OF_RANGE", fromYear);
5672
- return amountValue.type === 6 /* Uom */ ? chunk2TZKENDH_cjs.uomValue(result, amountValue.unit) : chunk2TZKENDH_cjs.numberValue(result);
5771
+ return amountValue.type === 6 /* Uom */ ? chunkIT74O4BE_cjs.uomValue(result, amountValue.unit) : chunkIT74O4BE_cjs.numberValue(result);
5673
5772
  }
5674
5773
  function inflationToYearFromPresentHandler(args) {
5675
5774
  const amountValue = args[0];
5676
5775
  const fromYear = (/* @__PURE__ */ new Date()).getFullYear();
5677
5776
  const toYear = args[1].toNumber();
5678
- const result = chunk7ZX6B7SY_cjs.adjustForInflation(amountValue.toNumber(), fromYear, toYear);
5777
+ const result = chunkFR7RNOPT_cjs.adjustForInflation(amountValue.toNumber(), fromYear, toYear);
5679
5778
  if (result === void 0) return yearRangeError("INFLATION_YEAR_OUT_OF_RANGE", toYear);
5680
- return amountValue.type === 6 /* Uom */ ? chunk2TZKENDH_cjs.uomValue(result, amountValue.unit) : chunk2TZKENDH_cjs.numberValue(result);
5779
+ return amountValue.type === 6 /* Uom */ ? chunkIT74O4BE_cjs.uomValue(result, amountValue.unit) : chunkIT74O4BE_cjs.numberValue(result);
5681
5780
  }
5682
5781
  function inflationFutureValueHandler(args) {
5683
5782
  const amountValue = args[0];
@@ -5685,11 +5784,11 @@ function inflationFutureValueHandler(args) {
5685
5784
  const rate = args[2].toNumber();
5686
5785
  const years = futureYear - (/* @__PURE__ */ new Date()).getFullYear();
5687
5786
  if (1 + rate <= 0) {
5688
- return chunk2TZKENDH_cjs.errorValue("INVALID_RATE", `inflationFutureValue: rate ${rate} makes (1 + rate) non-positive`);
5787
+ return chunkIT74O4BE_cjs.errorValue("INVALID_RATE", `inflationFutureValue: rate ${rate} makes (1 + rate) non-positive`);
5689
5788
  }
5690
5789
  const amount = amountValue.toNumber();
5691
5790
  const worth = amount / Math.pow(1 + rate, years);
5692
- return amountValue.type === 6 /* Uom */ ? chunk2TZKENDH_cjs.uomValue(worth, amountValue.unit) : chunk2TZKENDH_cjs.numberValue(worth);
5791
+ return amountValue.type === 6 /* Uom */ ? chunkIT74O4BE_cjs.uomValue(worth, amountValue.unit) : chunkIT74O4BE_cjs.numberValue(worth);
5693
5792
  }
5694
5793
 
5695
5794
  // src/packages/finance/parselets/InflationQueryParselet.ts
@@ -5708,13 +5807,13 @@ var InflationQueryParselet = class {
5708
5807
  }
5709
5808
  parse(parser, _token, builder) {
5710
5809
  if (!hasInflationKeyword(parser)) {
5711
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5810
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5712
5811
  return;
5713
5812
  }
5714
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Product, builder);
5813
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
5715
5814
  if (this.variant === "what-was") {
5716
5815
  parser.consume("WORTH_IN");
5717
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5816
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5718
5817
  builder.emitOpcode(50 /* CALL_PLUGIN */);
5719
5818
  builder.emitIndex(INFLATION_TO_YEAR_FROM_PRESENT_IDX);
5720
5819
  builder.emitIndex(2);
@@ -5723,7 +5822,7 @@ var InflationQueryParselet = class {
5723
5822
  const next = parser.peek();
5724
5823
  if (next?.type === "FROM") {
5725
5824
  parser.consume();
5726
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5825
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5727
5826
  builder.emitOpcode(50 /* CALL_PLUGIN */);
5728
5827
  builder.emitIndex(INFLATION_FROM_YEAR_TO_PRESENT_IDX);
5729
5828
  builder.emitIndex(2);
@@ -5731,16 +5830,16 @@ var InflationQueryParselet = class {
5731
5830
  }
5732
5831
  if (next?.type === "IN") {
5733
5832
  parser.consume();
5734
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5833
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5735
5834
  parser.consume("WORTH_IN");
5736
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5835
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5737
5836
  builder.emitOpcode(51 /* CALL_BUILTIN */);
5738
5837
  builder.emitIndex(INFLATION_ADJUST_BUILTIN_IDX);
5739
5838
  builder.emitIndex(3);
5740
5839
  return;
5741
5840
  }
5742
5841
  const gotType = next ? next.type : "end of input";
5743
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
5842
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
5744
5843
  "INFLATION_EXPECTED_FROM_OR_IN",
5745
5844
  `Expected "from <year>" or "in <year> worth in <year>" after "what is <amount>", got ${gotType}`
5746
5845
  );
@@ -5753,16 +5852,16 @@ var InflationFutureValueParselet = class {
5753
5852
  this.category = "Finance";
5754
5853
  }
5755
5854
  parse(parser, _token, builder) {
5756
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Product, builder);
5855
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
5757
5856
  parser.consume("IN");
5758
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5857
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5759
5858
  parser.consume("ASSUMING");
5760
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
5859
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
5761
5860
  const inflationToken = parser.peek();
5762
5861
  const inflationWord = inflationToken && inflationToken.type === "IDENT" ? inflationToken.value.toLowerCase() : void 0;
5763
5862
  if (inflationWord !== "inflation") {
5764
5863
  const got = inflationToken ? inflationToken.value : "end of input";
5765
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
5864
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
5766
5865
  "INFLATION_EXPECTED_INFLATION_WORD",
5767
5866
  `Expected the word "inflation" after "assuming <rate>%", got "${got}"`
5768
5867
  );
@@ -5806,7 +5905,7 @@ function inYearDollarsNormalizerRule(priority = 70) {
5806
5905
  if (word !== "dollars" && word !== "dollar") return null;
5807
5906
  return {
5808
5907
  consumed: 3,
5809
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("IN_YEAR_DOLLARS", yearToken.value, tokens.slice(pos, pos + 3))],
5908
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("IN_YEAR_DOLLARS", yearToken.value, tokens.slice(pos, pos + 3))],
5810
5909
  ruleName: "finance:in-year-dollars"
5811
5910
  };
5812
5911
  }
@@ -5870,7 +5969,7 @@ function readPeriod(tokens, i) {
5870
5969
  if (per === void 0) return null;
5871
5970
  const n = Number((countToken.value ?? "").replace(/,/g, ""));
5872
5971
  if (!(n > 0)) {
5873
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing({
5972
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing({
5874
5973
  code: RecurringScheduleErrorCodes.RECURRING_INTERVAL_NOT_POSITIVE,
5875
5974
  message: `A recurring interval must be a positive number, not "${countToken.value}".`,
5876
5975
  expected: "a positive interval, e.g. every 2 weeks",
@@ -5928,8 +6027,8 @@ function recurringScheduleNormalizerRule(priority = 78) {
5928
6027
  // `pos` and pass through on their own.
5929
6028
  replacement: [
5930
6029
  amount,
5931
- chunkCUR2WLI4_cjs.createFusedToken("STAR", "*", source),
5932
- chunkCUR2WLI4_cjs.createFusedToken("NUMBER", String(count), source)
6030
+ chunkICEKS6YC_cjs.createFusedToken("STAR", "*", source),
6031
+ chunkICEKS6YC_cjs.createFusedToken("NUMBER", String(count), source)
5933
6032
  ],
5934
6033
  consumed,
5935
6034
  ruleName: "finance:recurring-schedule"
@@ -5938,6 +6037,77 @@ function recurringScheduleNormalizerRule(priority = 78) {
5938
6037
  };
5939
6038
  }
5940
6039
 
6040
+ // src/packages/finance/normalizer/BillSplitNormalizerRule.ts
6041
+ function wordOf2(token) {
6042
+ if (token === void 0) return "";
6043
+ return (token.text ?? token.value ?? "").toLowerCase();
6044
+ }
6045
+ var VALUE_ENDERS2 = /* @__PURE__ */ new Set([
6046
+ "NUMBER",
6047
+ "FLOAT",
6048
+ "HEX",
6049
+ "BIGINT",
6050
+ "RPAREN",
6051
+ "RBRACKET",
6052
+ "IDENT",
6053
+ "PERCENT",
6054
+ "STRING"
6055
+ ]);
6056
+ var NUMERIC = /* @__PURE__ */ new Set(["NUMBER", "FLOAT"]);
6057
+ function billSplitNormalizerRule(priority = 77) {
6058
+ return {
6059
+ name: "finance:bill-split",
6060
+ priority,
6061
+ match(tokens, pos) {
6062
+ const head = tokens[pos];
6063
+ if (head === void 0) return null;
6064
+ if (VALUE_ENDERS2.has(head.type)) {
6065
+ const split = tokens[pos + 1];
6066
+ const count2 = tokens[pos + 2];
6067
+ const ways = tokens[pos + 3];
6068
+ if (split?.type === "IDENT" && wordOf2(split) === "split" && count2 !== void 0 && NUMERIC.has(count2.type) && ways?.type === "IDENT" && wordOf2(ways) === "ways") {
6069
+ return {
6070
+ consumed: 4,
6071
+ replacement: [
6072
+ head,
6073
+ chunkICEKS6YC_cjs.createFusedToken("SPLIT_WAYS", "split", [split]),
6074
+ count2,
6075
+ chunkICEKS6YC_cjs.createFusedToken("WAYS", "ways", [ways])
6076
+ ],
6077
+ ruleName: "finance:bill-split"
6078
+ };
6079
+ }
6080
+ }
6081
+ if (head.type !== "IDENT" || wordOf2(head) !== "split") return null;
6082
+ const before = tokens[pos - 1];
6083
+ if (before !== void 0 && VALUE_ENDERS2.has(before.type)) return null;
6084
+ let betweenIndex = -1;
6085
+ for (let i = pos + 1; i < tokens.length; i++) {
6086
+ if (tokens[i].type === "BETWEEN") {
6087
+ betweenIndex = i;
6088
+ break;
6089
+ }
6090
+ }
6091
+ if (betweenIndex === -1) return null;
6092
+ const count = tokens[betweenIndex + 1];
6093
+ if (count === void 0 || !NUMERIC.has(count.type)) return null;
6094
+ const peopleIndex = betweenIndex + 2;
6095
+ const hasPeople = tokens[peopleIndex]?.type === "IDENT" && wordOf2(tokens[peopleIndex]) === "people";
6096
+ const lastIndex = hasPeople ? peopleIndex : betweenIndex + 1;
6097
+ const replacement = [
6098
+ chunkICEKS6YC_cjs.createFusedToken("SPLIT", "split", [head]),
6099
+ ...tokens.slice(pos + 1, betweenIndex + 2)
6100
+ ];
6101
+ if (hasPeople) replacement.push(chunkICEKS6YC_cjs.createFusedToken("PEOPLE", "people", [tokens[peopleIndex]]));
6102
+ return {
6103
+ consumed: lastIndex - pos + 1,
6104
+ replacement,
6105
+ ruleName: "finance:bill-split"
6106
+ };
6107
+ }
6108
+ };
6109
+ }
6110
+
5941
6111
  // src/packages/finance/FinancePackage.ts
5942
6112
  var COMPOUND_FV = 51;
5943
6113
  var COMPOUND_INTEREST = 52;
@@ -5951,6 +6121,9 @@ var ANNUAL_RETURN = 84;
5951
6121
  var TAX_REMOVE = 59;
5952
6122
  var TAX_IN = 85;
5953
6123
  var TAX_ON = 86;
6124
+ var SPLIT_EACH = 98;
6125
+ var SAVINGS_PAYMENT = 99;
6126
+ var SAVINGS_PERIODS2 = 100;
5954
6127
  var FINANCE_PACKAGE = {
5955
6128
  name: "solve-finance",
5956
6129
  phrases: {
@@ -5982,6 +6155,9 @@ var FINANCE_PACKAGE = {
5982
6155
  "annual return on": "ANNUAL_RETURN_ON",
5983
6156
  "value of": "VALUE_OF",
5984
6157
  "worth in": "WORTH_IN",
6158
+ "how long to save": "SAVINGS_HOW_LONG",
6159
+ "how much per month to save": "SAVINGS_HOW_MUCH",
6160
+ "how much per month to reach": "SAVINGS_HOW_MUCH",
5985
6161
  "assuming": "ASSUMING"
5986
6162
  },
5987
6163
  prefixParselets: [
@@ -6000,9 +6176,12 @@ var FINANCE_PACKAGE = {
6000
6176
  { tokenType: "TAX_ON", parselet: new SalesTaxParselet(TAX_ON) },
6001
6177
  { tokenType: "TAX_OFF", parselet: new SalesTaxParselet(TAX_REMOVE) },
6002
6178
  { tokenType: "TAX_IN_PHRASE", parselet: new SalesTaxParselet(TAX_IN) },
6179
+ { tokenType: "SPLIT", parselet: new SplitBetweenParselet(SPLIT_EACH) },
6003
6180
  { tokenType: "WHAT_IS", parselet: new InflationQueryParselet("what-is") },
6004
6181
  { tokenType: "WHAT_WAS", parselet: new InflationQueryParselet("what-was") },
6005
- { tokenType: "VALUE_OF", parselet: new InflationFutureValueParselet() }
6182
+ { tokenType: "VALUE_OF", parselet: new InflationFutureValueParselet() },
6183
+ { tokenType: "SAVINGS_HOW_LONG", parselet: new SavingsDurationParselet(SAVINGS_PERIODS2) },
6184
+ { tokenType: "SAVINGS_HOW_MUCH", parselet: new SavingsContributionParselet(SAVINGS_PAYMENT) }
6006
6185
  ],
6007
6186
  infixParselets: [
6008
6187
  // The documented bare forms: "$1,000 after 3 years at 7%" and the "for
@@ -6011,14 +6190,22 @@ var FINANCE_PACKAGE = {
6011
6190
  { tokenType: "AFTER", parselet: new InvestmentGrowthParselet(COMPOUND_FV, COMPOUND_FV_EVERY) },
6012
6191
  { tokenType: "FOR_DURATION", parselet: new InvestmentGrowthParselet(COMPOUND_FV, COMPOUND_FV_EVERY) },
6013
6192
  { tokenType: "INVESTED", parselet: new ReturnOnInvestmentParselet(ROI) },
6014
- { tokenType: "IN_YEAR_DOLLARS", parselet: new InYearDollarsParselet() }
6193
+ { tokenType: "IN_YEAR_DOLLARS", parselet: new InYearDollarsParselet() },
6194
+ // The amount-first split spelling, `<amount> split N ways`. Infix so the
6195
+ // amount (which may be `$120 + 18%`) is the left operand. See
6196
+ // BillSplitParselets.ts.
6197
+ { tokenType: "SPLIT_WAYS", parselet: new SplitWaysParselet(SPLIT_EACH) }
6015
6198
  ],
6016
6199
  normalizerRules: [
6017
6200
  inYearDollarsNormalizerRule(),
6018
6201
  // `450 monthly for 18 months` -> `450 * 18`. A recurring schedule totalled
6019
6202
  // as a plain multiplication, so a currency amount stays currency and an
6020
6203
  // exact one stays exact. See RecurringScheduleNormalizerRule.ts.
6021
- recurringScheduleNormalizerRule()
6204
+ recurringScheduleNormalizerRule(),
6205
+ // `split $180 between 4` / `$120 + 18% split 3 ways`. Retypes split/ways/
6206
+ // people contextually so those words stay ordinary names everywhere else.
6207
+ // See BillSplitNormalizerRule.ts.
6208
+ billSplitNormalizerRule()
6022
6209
  ],
6023
6210
  pluginFunctions: [
6024
6211
  { index: INFLATION_FROM_YEAR_TO_PRESENT_IDX, handler: inflationFromYearToPresentHandler },
@@ -6029,7 +6216,7 @@ var FINANCE_PACKAGE = {
6029
6216
 
6030
6217
  // src/resolvers/QueryResolver.ts
6031
6218
  function defaultOnError(namespace) {
6032
- return (query, error) => chunk2TZKENDH_cjs.errorValue(
6219
+ return (query, error) => chunkIT74O4BE_cjs.errorValue(
6033
6220
  `${namespace.toUpperCase()}_QUERY_FAILED`,
6034
6221
  `Failed to resolve "${query}": ${error instanceof Error ? error.message : String(error)}`
6035
6222
  );
@@ -6084,7 +6271,7 @@ function createQueryResolver(opts) {
6084
6271
  i += 3;
6085
6272
  continue;
6086
6273
  }
6087
- i = chunkSSV46KFA_cjs.nextInstruction(opcodes, i);
6274
+ i = chunk4K5W7EH2_cjs.nextInstruction(opcodes, i);
6088
6275
  }
6089
6276
  return null;
6090
6277
  },
@@ -6095,7 +6282,7 @@ function createQueryResolver(opts) {
6095
6282
  const query = args[0]?.value;
6096
6283
  const cached = chunkZ2XP767T_cjs.getActiveQueryClient()?.getQueryData(queryKeyFor(query));
6097
6284
  if (cached !== void 0) return cached;
6098
- return chunk2TZKENDH_cjs.errorValue(`${opts.namespace.toUpperCase()}_NOT_PREFLIGHTED`, `No cached result for "${query}"`);
6285
+ return chunkIT74O4BE_cjs.errorValue(`${opts.namespace.toUpperCase()}_NOT_PREFLIGHTED`, `No cached result for "${query}"`);
6099
6286
  };
6100
6287
  return { resolver, pluginFunction };
6101
6288
  }
@@ -6107,7 +6294,7 @@ function consumeCityName(parser, triggerText) {
6107
6294
  words.push(parser.consume().value);
6108
6295
  }
6109
6296
  if (words.length === 0) {
6110
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
6297
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
6111
6298
  "WEATHER_EXPECTED_CITY",
6112
6299
  `Expected a city name after "${triggerText}" (e.g. "${triggerText} London")`
6113
6300
  );
@@ -6183,7 +6370,7 @@ async function geocodeCity(city, signal) {
6183
6370
  const url = `${GEOCODING_API_URL}?name=${encodeURIComponent(city)}&count=1&language=en&format=json`;
6184
6371
  const response = await fetch(url, { signal });
6185
6372
  if (!response.ok) {
6186
- throw chunkB4HBEFTB_cjs.ErrorFactory.external(
6373
+ throw chunkMIGXCBXT_cjs.ErrorFactory.external(
6187
6374
  WeatherErrorCodes.GEOCODING_API_ERROR,
6188
6375
  `Open-Meteo geocoding API returned ${response.status} for "${city}"`,
6189
6376
  { city, status: response.status }
@@ -6192,7 +6379,7 @@ async function geocodeCity(city, signal) {
6192
6379
  const json = await response.json();
6193
6380
  const first = json?.results?.[0];
6194
6381
  if (!first) {
6195
- throw chunkB4HBEFTB_cjs.ErrorFactory.validation(
6382
+ throw chunkMIGXCBXT_cjs.ErrorFactory.validation(
6196
6383
  WeatherErrorCodes.CITY_NOT_FOUND,
6197
6384
  `No location found for "${city}"`,
6198
6385
  { city }
@@ -6211,7 +6398,7 @@ async function fetchForecast(lat, lon, signal) {
6211
6398
  });
6212
6399
  const response = await fetch(`${FORECAST_API_URL}?${params.toString()}`, { signal });
6213
6400
  if (!response.ok) {
6214
- throw chunkB4HBEFTB_cjs.ErrorFactory.external(
6401
+ throw chunkMIGXCBXT_cjs.ErrorFactory.external(
6215
6402
  WeatherErrorCodes.FORECAST_API_ERROR,
6216
6403
  `Open-Meteo forecast API returned ${response.status}`,
6217
6404
  { status: response.status }
@@ -6221,7 +6408,7 @@ async function fetchForecast(lat, lon, signal) {
6221
6408
  const current = json?.current;
6222
6409
  const daily = json?.daily;
6223
6410
  if (!current || !daily) {
6224
- throw chunkB4HBEFTB_cjs.ErrorFactory.external(
6411
+ throw chunkMIGXCBXT_cjs.ErrorFactory.external(
6225
6412
  WeatherErrorCodes.FORECAST_RESPONSE_MALFORMED,
6226
6413
  "Open-Meteo forecast response missing current/daily blocks"
6227
6414
  );
@@ -6272,7 +6459,7 @@ function fetchCityWeather(city, signal) {
6272
6459
  }
6273
6460
 
6274
6461
  // src/packages/weather/WeatherPackage.ts
6275
- var WEATHER_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
6462
+ var WEATHER_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
6276
6463
  var { resolver: weatherResolver, pluginFunction: weatherPluginFunction } = createQueryResolver({
6277
6464
  namespace: "weather",
6278
6465
  pluginFunctionIndex: WEATHER_FN_IDX,
@@ -6285,17 +6472,17 @@ var { resolver: weatherResolver, pluginFunction: weatherPluginFunction } = creat
6285
6472
  const data = await fetchCityWeather(city, signal);
6286
6473
  switch (kind) {
6287
6474
  case "current":
6288
- return chunk2TZKENDH_cjs.stringValue(`${Math.round(data.temperature)}\xB0C, ${data.description}`);
6475
+ return chunkIT74O4BE_cjs.stringValue(`${Math.round(data.temperature)}\xB0C, ${data.description}`);
6289
6476
  case "temperature":
6290
- return chunk2TZKENDH_cjs.uomValue(data.temperature, "C");
6477
+ return chunkIT74O4BE_cjs.uomValue(data.temperature, "C");
6291
6478
  case "feelslike":
6292
- return chunk2TZKENDH_cjs.uomValue(data.apparentTemperature, "C");
6479
+ return chunkIT74O4BE_cjs.uomValue(data.apparentTemperature, "C");
6293
6480
  case "high":
6294
- return chunk2TZKENDH_cjs.uomValue(data.high, "C");
6481
+ return chunkIT74O4BE_cjs.uomValue(data.high, "C");
6295
6482
  case "low":
6296
- return chunk2TZKENDH_cjs.uomValue(data.low, "C");
6483
+ return chunkIT74O4BE_cjs.uomValue(data.low, "C");
6297
6484
  default:
6298
- throw chunkB4HBEFTB_cjs.ErrorFactory.internal(
6485
+ throw chunkMIGXCBXT_cjs.ErrorFactory.internal(
6299
6486
  WeatherErrorCodes.UNKNOWN_QUERY_KIND,
6300
6487
  `Unknown weather query kind "${kind}"`,
6301
6488
  { kind }
@@ -6358,7 +6545,7 @@ function pad22(n) {
6358
6545
  function validateAndFormat(year, monthIndex, day, raw) {
6359
6546
  const d = new Date(year, monthIndex, day);
6360
6547
  if (d.getFullYear() !== year || d.getMonth() !== monthIndex || d.getDate() !== day) {
6361
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
6548
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
6362
6549
  "STOCKS_INVALID_DATE",
6363
6550
  `"${raw}" is not a valid calendar date`
6364
6551
  );
@@ -6367,7 +6554,7 @@ function validateAndFormat(year, monthIndex, day, raw) {
6367
6554
  }
6368
6555
  function requireYear(text, raw) {
6369
6556
  if (!/^\d{4}$/.test(text)) {
6370
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
6557
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
6371
6558
  "STOCKS_INVALID_DATE",
6372
6559
  `Expected a 4-digit year in "${raw}", got "${text}"`
6373
6560
  );
@@ -6424,7 +6611,7 @@ function tryParseDatePhrase(parser) {
6424
6611
  const year = requireYear(yearTok.value, raw);
6425
6612
  return validateAndFormat(year, monthIndex, parseInt(g1.value, 10), raw);
6426
6613
  }
6427
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
6614
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
6428
6615
  "STOCKS_INVALID_DATE",
6429
6616
  `Expected a date after "on" (e.g. "April 12, 2005" or "4/12/2005"), got "${g1.value}"`
6430
6617
  );
@@ -6511,7 +6698,7 @@ var MAJOR_TICKERS = /* @__PURE__ */ new Set([
6511
6698
 
6512
6699
  // src/packages/stocks/normalizer/StockTickerNormalizerRule.ts
6513
6700
  var STOCK_TICKER_TYPE = "STOCK_TICKER";
6514
- var STOCK_TICKER_TYPE_ID = chunkQFTDTX6K_cjs.tokenTypeId(STOCK_TICKER_TYPE);
6701
+ var STOCK_TICKER_TYPE_ID = chunkG2YPPLGX_cjs.tokenTypeId(STOCK_TICKER_TYPE);
6515
6702
  function stockTickerNormalizerRule() {
6516
6703
  return {
6517
6704
  name: "stocks:bare-ticker",
@@ -6521,7 +6708,7 @@ function stockTickerNormalizerRule() {
6521
6708
  if (!token || token.type !== "IDENT") return null;
6522
6709
  if (!MAJOR_TICKERS.has(token.value)) return null;
6523
6710
  if (pos > 0 && tokens[pos - 1].type === "COLON") return null;
6524
- const fusedToken = new chunkZMW6NU2K_cjs.LexerToken(
6711
+ const fusedToken = new chunkYJHY7CMN_cjs.LexerToken(
6525
6712
  STOCK_TICKER_TYPE,
6526
6713
  STOCK_TICKER_TYPE_ID,
6527
6714
  token.value,
@@ -6547,7 +6734,7 @@ function tryParseDateSuffix(parser) {
6547
6734
  parser.consume();
6548
6735
  const onTok = parser.peek();
6549
6736
  if (!onTok || onTok.type !== "IDENT" || onTok.value.toLowerCase() !== "on") {
6550
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
6737
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
6551
6738
  "STOCKS_EXPECTED_ON",
6552
6739
  `Expected "on <date>" after "${lower}" (e.g. "AAPL ${lower} on April 12, 2005")`
6553
6740
  );
@@ -6560,7 +6747,7 @@ function tryParseDateSuffix(parser) {
6560
6747
  }
6561
6748
  const date = tryParseDatePhrase(parser);
6562
6749
  if (!date) {
6563
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
6750
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
6564
6751
  "STOCKS_EXPECTED_DATE",
6565
6752
  `Expected a date after "on" (e.g. "April 12, 2005" or "4/12/2005")`
6566
6753
  );
@@ -6590,7 +6777,7 @@ function finishStockExpression(parser, builder, ticker, currentFnIdx, historical
6590
6777
  const suffix = tryParseDateSuffix(parser);
6591
6778
  if (sawStar && !suffix) {
6592
6779
  emitStockQuery(builder, ticker, null, currentFnIdx, historicalFnIdx);
6593
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Product, builder);
6780
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
6594
6781
  builder.emitOpcode(22 /* MUL */);
6595
6782
  return;
6596
6783
  }
@@ -6608,7 +6795,7 @@ function stockFnParselet(currentFnIdx, historicalFnIdx) {
6608
6795
  } else if (tickerToken.type === "IDENT" || tickerToken.type === STOCK_TICKER_TYPE) {
6609
6796
  ticker = tickerToken.value.toUpperCase();
6610
6797
  } else {
6611
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
6798
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
6612
6799
  "STOCKS_INVALID_TICKER",
6613
6800
  `Expected a ticker symbol inside stock(...), got "${tickerToken.value}" (${tickerToken.type})`
6614
6801
  );
@@ -6630,10 +6817,10 @@ function bareStockTickerParselet(currentFnIdx, historicalFnIdx) {
6630
6817
 
6631
6818
  // src/packages/stocks/StocksPackage.ts
6632
6819
  function createStocksPackage(config = {}) {
6633
- const currentFnIdx = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
6634
- const historicalFnIdx = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
6820
+ const currentFnIdx = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
6821
+ const historicalFnIdx = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
6635
6822
  function notConfigured(what) {
6636
- return chunk2TZKENDH_cjs.errorValue(
6823
+ return chunkIT74O4BE_cjs.errorValue(
6637
6824
  "STOCKS_NOT_CONFIGURED",
6638
6825
  `Stock data provider not configured. Supply ${what} via createStocksPackage({ ... }); see the StocksPackage doc comment.`
6639
6826
  );
@@ -6646,7 +6833,7 @@ function createStocksPackage(config = {}) {
6646
6833
  fetchQuery: async (ticker, signal) => {
6647
6834
  if (!config.fetchQuote) return notConfigured("fetchQuote");
6648
6835
  const quote = await config.fetchQuote(ticker, signal);
6649
- return chunk2TZKENDH_cjs.uomValue(quote.price, quote.currency ?? "USD");
6836
+ return chunkIT74O4BE_cjs.uomValue(quote.price, quote.currency ?? "USD");
6650
6837
  }
6651
6838
  });
6652
6839
  const { resolver: historicalResolver, pluginFunction: historicalPluginFunction } = createQueryResolver({
@@ -6658,8 +6845,8 @@ function createStocksPackage(config = {}) {
6658
6845
  const [field, ticker, isoDate] = query.split(":");
6659
6846
  if (!config.fetchHistoricalQuote) return notConfigured("fetchHistoricalQuote");
6660
6847
  const quote = await config.fetchHistoricalQuote(ticker, isoDate, signal);
6661
- if (field === "volume") return chunk2TZKENDH_cjs.numberValue(quote.volume ?? 0);
6662
- return chunk2TZKENDH_cjs.uomValue(quote.close, quote.currency ?? "USD");
6848
+ if (field === "volume") return chunkIT74O4BE_cjs.numberValue(quote.volume ?? 0);
6849
+ return chunkIT74O4BE_cjs.uomValue(quote.close, quote.currency ?? "USD");
6663
6850
  }
6664
6851
  });
6665
6852
  const pkg = {
@@ -6706,20 +6893,20 @@ function knowledgeQueryParselet(pluginFnIdx) {
6706
6893
 
6707
6894
  // src/packages/knowledge/KnowledgePackage.ts
6708
6895
  function createKnowledgePackage(config = {}) {
6709
- const fnIdx = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
6896
+ const fnIdx = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
6710
6897
  const { resolver, pluginFunction } = createQueryResolver({
6711
6898
  namespace: "knowledge",
6712
6899
  pluginFunctionIndex: fnIdx,
6713
6900
  staleTimeMs: config.staleTimeMs ?? 5 * 60 * 1e3,
6714
6901
  fetchQuery: async (query, signal) => {
6715
6902
  if (!config.answerQuery) {
6716
- return chunk2TZKENDH_cjs.errorValue(
6903
+ return chunkIT74O4BE_cjs.errorValue(
6717
6904
  "KNOWLEDGE_NOT_CONFIGURED",
6718
6905
  `Knowledge answer provider not configured. Supply answerQuery via createKnowledgePackage({ ... }); see the KnowledgePackage doc comment.`
6719
6906
  );
6720
6907
  }
6721
6908
  const answer = await config.answerQuery(query, signal);
6722
- return chunk2TZKENDH_cjs.stringValue(answer);
6909
+ return chunkIT74O4BE_cjs.stringValue(answer);
6723
6910
  }
6724
6911
  });
6725
6912
  return {
@@ -6746,23 +6933,23 @@ function createKnowledgePackage(config = {}) {
6746
6933
  // src/packages/lines/LinesPluginFunctions.ts
6747
6934
  function checkLineValue(v, lineNumber) {
6748
6935
  if (v === void 0) {
6749
- return chunk2TZKENDH_cjs.errorValue("LINE_NOT_YET_EVALUATED", `Line ${lineNumber} has not been evaluated yet (forward reference, or out of range)`);
6936
+ return chunkIT74O4BE_cjs.errorValue("LINE_NOT_YET_EVALUATED", `Line ${lineNumber} has not been evaluated yet (forward reference, or out of range)`);
6750
6937
  }
6751
6938
  if (v.type === 12 /* Pending */) {
6752
- return chunk2TZKENDH_cjs.errorValue("LINE_RESULT_PENDING", `Line ${lineNumber}'s result is still resolving`);
6939
+ return chunkIT74O4BE_cjs.errorValue("LINE_RESULT_PENDING", `Line ${lineNumber}'s result is still resolving`);
6753
6940
  }
6754
6941
  if (v.type === 13 /* Error */) {
6755
- return chunk2TZKENDH_cjs.errorValue("LINE_RESULT_ERROR", `Line ${lineNumber} has an error`);
6942
+ return chunkIT74O4BE_cjs.errorValue("LINE_RESULT_ERROR", `Line ${lineNumber} has an error`);
6756
6943
  }
6757
6944
  return null;
6758
6945
  }
6759
6946
  function requireContext(context) {
6760
6947
  if (!context?.getLineResult) {
6761
- return chunk2TZKENDH_cjs.errorValue("LINE_REF_NO_DOCUMENT", "Cross-line references require a real document \u2014 not available outside one (e.g. evaluateExpression()'s single-expression path)");
6948
+ return chunkIT74O4BE_cjs.errorValue("LINE_REF_NO_DOCUMENT", "Cross-line references require a real document \u2014 not available outside one (e.g. evaluateExpression()'s single-expression path)");
6762
6949
  }
6763
6950
  return null;
6764
6951
  }
6765
- var PREV_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
6952
+ var PREV_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
6766
6953
  function prevHandler(_args, context) {
6767
6954
  const ctxError = requireContext(context);
6768
6955
  if (ctxError) return ctxError;
@@ -6771,7 +6958,7 @@ function prevHandler(_args, context) {
6771
6958
  const err = checkLineValue(v, targetLine);
6772
6959
  return err ?? v;
6773
6960
  }
6774
- var LINE_REF_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
6961
+ var LINE_REF_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
6775
6962
  function lineRefHandler(args, context) {
6776
6963
  const ctxError = requireContext(context);
6777
6964
  if (ctxError) return ctxError;
@@ -6791,28 +6978,28 @@ function aggregateRange(from, to, context, isAverage) {
6791
6978
  const err = checkLineValue(v, n);
6792
6979
  if (err) return err;
6793
6980
  if (v.type !== 0 /* Number */ && v.type !== 6 /* Uom */) {
6794
- return chunk2TZKENDH_cjs.errorValue("LINE_RANGE_NON_NUMERIC", `Line ${n} is not a plain number or unit value \u2014 cannot include it in a sum/total/average range`);
6981
+ return chunkIT74O4BE_cjs.errorValue("LINE_RANGE_NON_NUMERIC", `Line ${n} is not a plain number or unit value \u2014 cannot include it in a sum/total/average range`);
6795
6982
  }
6796
6983
  if (v.type === 6 /* Uom */) {
6797
6984
  sawUom = true;
6798
6985
  if (commonUnit === void 0) commonUnit = v.unit;
6799
6986
  else if (v.unit !== commonUnit) {
6800
- return chunk2TZKENDH_cjs.errorValue("LINE_RANGE_MIXED_UNITS", `Line ${n}'s unit (${v.unit}) doesn't match the range's first unit (${commonUnit}) \u2014 aggregating mixed units would silently misrepresent the result`);
6987
+ return chunkIT74O4BE_cjs.errorValue("LINE_RANGE_MIXED_UNITS", `Line ${n}'s unit (${v.unit}) doesn't match the range's first unit (${commonUnit}) \u2014 aggregating mixed units would silently misrepresent the result`);
6801
6988
  }
6802
6989
  }
6803
6990
  total += v.toNumber();
6804
6991
  count++;
6805
6992
  }
6806
6993
  const result = isAverage ? total / count : total;
6807
- return sawUom ? chunk2TZKENDH_cjs.uomValue(result, commonUnit) : chunk2TZKENDH_cjs.numberValue(result);
6994
+ return sawUom ? chunkIT74O4BE_cjs.uomValue(result, commonUnit) : chunkIT74O4BE_cjs.numberValue(result);
6808
6995
  }
6809
- var SUM_RANGE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
6996
+ var SUM_RANGE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
6810
6997
  function sumRangeHandler(args, context) {
6811
6998
  const ctxError = requireContext(context);
6812
6999
  if (ctxError) return ctxError;
6813
7000
  return aggregateRange(args[0].toNumber(), args[1].toNumber(), context, false);
6814
7001
  }
6815
- var AVERAGE_RANGE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7002
+ var AVERAGE_RANGE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
6816
7003
  function averageRangeHandler(args, context) {
6817
7004
  const ctxError = requireContext(context);
6818
7005
  if (ctxError) return ctxError;
@@ -6821,7 +7008,7 @@ function averageRangeHandler(args, context) {
6821
7008
  function aggregateAbove(context, isAverage) {
6822
7009
  const boundaryCheck = context.isLineBoundary;
6823
7010
  if (!boundaryCheck) {
6824
- return chunk2TZKENDH_cjs.errorValue("LINE_REF_NO_DOCUMENT", '"above" aggregation requires a real document');
7011
+ return chunkIT74O4BE_cjs.errorValue("LINE_REF_NO_DOCUMENT", '"above" aggregation requires a real document');
6825
7012
  }
6826
7013
  let total = 0;
6827
7014
  let count = 0;
@@ -6833,29 +7020,29 @@ function aggregateAbove(context, isAverage) {
6833
7020
  const err = checkLineValue(v, n);
6834
7021
  if (err) return err;
6835
7022
  if (v.type !== 0 /* Number */ && v.type !== 6 /* Uom */) {
6836
- return chunk2TZKENDH_cjs.errorValue("LINE_RANGE_NON_NUMERIC", `Line ${n} is not a plain number or unit value \u2014 cannot include it in "above" aggregation`);
7023
+ return chunkIT74O4BE_cjs.errorValue("LINE_RANGE_NON_NUMERIC", `Line ${n} is not a plain number or unit value \u2014 cannot include it in "above" aggregation`);
6837
7024
  }
6838
7025
  if (v.type === 6 /* Uom */) {
6839
7026
  sawUom = true;
6840
7027
  if (commonUnit === void 0) commonUnit = v.unit;
6841
7028
  else if (v.unit !== commonUnit) {
6842
- return chunk2TZKENDH_cjs.errorValue("LINE_RANGE_MIXED_UNITS", `Line ${n}'s unit (${v.unit}) doesn't match the range's unit (${commonUnit})`);
7029
+ return chunkIT74O4BE_cjs.errorValue("LINE_RANGE_MIXED_UNITS", `Line ${n}'s unit (${v.unit}) doesn't match the range's unit (${commonUnit})`);
6843
7030
  }
6844
7031
  }
6845
7032
  total += v.toNumber();
6846
7033
  count++;
6847
7034
  }
6848
- if (count === 0) return chunk2TZKENDH_cjs.errorValue("LINE_RANGE_EMPTY", "No lines above to aggregate (hit the top of the document, a blank line, or a heading immediately)");
7035
+ if (count === 0) return chunkIT74O4BE_cjs.errorValue("LINE_RANGE_EMPTY", "No lines above to aggregate (hit the top of the document, a blank line, or a heading immediately)");
6849
7036
  const result = isAverage ? total / count : total;
6850
- return sawUom ? chunk2TZKENDH_cjs.uomValue(result, commonUnit) : chunk2TZKENDH_cjs.numberValue(result);
7037
+ return sawUom ? chunkIT74O4BE_cjs.uomValue(result, commonUnit) : chunkIT74O4BE_cjs.numberValue(result);
6851
7038
  }
6852
- var TOTAL_ABOVE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7039
+ var TOTAL_ABOVE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
6853
7040
  function totalAboveHandler(_args, context) {
6854
7041
  const ctxError = requireContext(context);
6855
7042
  if (ctxError) return ctxError;
6856
7043
  return aggregateAbove(context, false);
6857
7044
  }
6858
- var AVERAGE_ABOVE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7045
+ var AVERAGE_ABOVE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
6859
7046
  function averageAboveHandler(_args, context) {
6860
7047
  const ctxError = requireContext(context);
6861
7048
  if (ctxError) return ctxError;
@@ -6927,9 +7114,9 @@ var AboveAggregateParselet = class {
6927
7114
  };
6928
7115
 
6929
7116
  // src/packages/lines/normalizer/LineRefNormalizerRule.ts
6930
- var LINE_REF_TYPE_ID = chunkQFTDTX6K_cjs.tokenTypeId("LINE_REF");
6931
- var SUM_RANGE_CALL_TYPE_ID = chunkQFTDTX6K_cjs.tokenTypeId("SUM_RANGE_CALL");
6932
- var AVERAGE_RANGE_CALL_TYPE_ID = chunkQFTDTX6K_cjs.tokenTypeId("AVERAGE_RANGE_CALL");
7117
+ var LINE_REF_TYPE_ID = chunkG2YPPLGX_cjs.tokenTypeId("LINE_REF");
7118
+ var SUM_RANGE_CALL_TYPE_ID = chunkG2YPPLGX_cjs.tokenTypeId("SUM_RANGE_CALL");
7119
+ var AVERAGE_RANGE_CALL_TYPE_ID = chunkG2YPPLGX_cjs.tokenTypeId("AVERAGE_RANGE_CALL");
6933
7120
  function lineRefNormalizerRule() {
6934
7121
  return {
6935
7122
  name: "lines:line-ref",
@@ -6966,7 +7153,7 @@ function lineRefNormalizerRule() {
6966
7153
  };
6967
7154
  }
6968
7155
  function makeLineRefToken(lineNumberText, sourceToken) {
6969
- return new chunkZMW6NU2K_cjs.LexerToken(
7156
+ return new chunkYJHY7CMN_cjs.LexerToken(
6970
7157
  "LINE_REF",
6971
7158
  LINE_REF_TYPE_ID,
6972
7159
  lineNumberText,
@@ -6992,7 +7179,7 @@ function rangeCallNormalizerRule() {
6992
7179
  return {
6993
7180
  consumed: 1,
6994
7181
  replacement: [
6995
- new chunkZMW6NU2K_cjs.LexerToken(tokenType, typeId, token.value, token.value, token.offset, 0, token.line, token.col)
7182
+ new chunkYJHY7CMN_cjs.LexerToken(tokenType, typeId, token.value, token.value, token.offset, 0, token.line, token.col)
6996
7183
  ],
6997
7184
  ruleName: "lines:range-call"
6998
7185
  };
@@ -7040,7 +7227,7 @@ var ColumnAggregateParselet = class {
7040
7227
  parse(parser, _token, builder) {
7041
7228
  const next = parser.peek();
7042
7229
  if (!next || next.type !== "STRING") {
7043
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
7230
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
7044
7231
  "TABLE_COLUMN_NAME_EXPECTED",
7045
7232
  `Expected a quoted column name after "... of column" but got ${next ? `"${next.value}"` : "end of input"}`
7046
7233
  );
@@ -7191,14 +7378,14 @@ function reduce(op, cells) {
7191
7378
  function aggregateColumn(op, columnName2, context) {
7192
7379
  const getLineText = context?.getLineText;
7193
7380
  if (!getLineText || context.lineIndex < 1) {
7194
- return chunk2TZKENDH_cjs.errorValue(
7381
+ return chunkIT74O4BE_cjs.errorValue(
7195
7382
  TablesErrorCodes.TABLE_NO_DOCUMENT,
7196
7383
  "Reading a table column needs a real document, which the single-expression path (evaluateExpression) does not have"
7197
7384
  );
7198
7385
  }
7199
7386
  const table = findTableAbove(getLineText, context.lineIndex);
7200
7387
  if (!table) {
7201
- return chunk2TZKENDH_cjs.errorValue(
7388
+ return chunkIT74O4BE_cjs.errorValue(
7202
7389
  TablesErrorCodes.TABLE_NOT_FOUND,
7203
7390
  'No markdown table found above this line (a table row starts with "|", and needs a "|---|" separator under its header)'
7204
7391
  );
@@ -7206,20 +7393,20 @@ function aggregateColumn(op, columnName2, context) {
7206
7393
  const index = columnIndex(table.header, columnName2);
7207
7394
  if (index === -1) {
7208
7395
  const names = table.header.map((h) => `"${h}"`).join(", ");
7209
- return chunk2TZKENDH_cjs.errorValue(
7396
+ return chunkIT74O4BE_cjs.errorValue(
7210
7397
  TablesErrorCodes.TABLE_COLUMN_NOT_FOUND,
7211
7398
  `The table above has no column named "${columnName2}". Its columns are: ${names}`
7212
7399
  );
7213
7400
  }
7214
7401
  const cells = numericColumn(table, index);
7215
- if (op === "count") return chunk2TZKENDH_cjs.numberValue(cells.length);
7402
+ if (op === "count") return chunkIT74O4BE_cjs.numberValue(cells.length);
7216
7403
  if (cells.length === 0) {
7217
- return chunk2TZKENDH_cjs.errorValue(
7404
+ return chunkIT74O4BE_cjs.errorValue(
7218
7405
  TablesErrorCodes.TABLE_COLUMN_NO_NUMERIC_CELLS,
7219
7406
  `Column "${columnName2}" has no plain-number cells to aggregate (currency and unit cells are not read yet)`
7220
7407
  );
7221
7408
  }
7222
- return chunk2TZKENDH_cjs.numberValue(reduce(op, cells));
7409
+ return chunkIT74O4BE_cjs.numberValue(reduce(op, cells));
7223
7410
  }
7224
7411
  function columnName(args) {
7225
7412
  const value = args[0];
@@ -7228,27 +7415,27 @@ function columnName(args) {
7228
7415
  }
7229
7416
  return String(value?.value ?? "");
7230
7417
  }
7231
- var TABLE_COLUMN_SUM_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7418
+ var TABLE_COLUMN_SUM_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7232
7419
  function tableColumnSumHandler(args, context) {
7233
7420
  return aggregateColumn("sum", columnName(args), context);
7234
7421
  }
7235
- var TABLE_COLUMN_AVERAGE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7422
+ var TABLE_COLUMN_AVERAGE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7236
7423
  function tableColumnAverageHandler(args, context) {
7237
7424
  return aggregateColumn("average", columnName(args), context);
7238
7425
  }
7239
- var TABLE_COLUMN_MIN_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7426
+ var TABLE_COLUMN_MIN_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7240
7427
  function tableColumnMinHandler(args, context) {
7241
7428
  return aggregateColumn("min", columnName(args), context);
7242
7429
  }
7243
- var TABLE_COLUMN_MAX_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7430
+ var TABLE_COLUMN_MAX_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7244
7431
  function tableColumnMaxHandler(args, context) {
7245
7432
  return aggregateColumn("max", columnName(args), context);
7246
7433
  }
7247
- var TABLE_COLUMN_COUNT_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7434
+ var TABLE_COLUMN_COUNT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7248
7435
  function tableColumnCountHandler(args, context) {
7249
7436
  return aggregateColumn("count", columnName(args), context);
7250
7437
  }
7251
- var TABLE_COLUMN_MEDIAN_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7438
+ var TABLE_COLUMN_MEDIAN_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7252
7439
  function tableColumnMedianHandler(args, context) {
7253
7440
  return aggregateColumn("median", columnName(args), context);
7254
7441
  }
@@ -7286,11 +7473,190 @@ var TABLES_PACKAGE = {
7286
7473
  ]
7287
7474
  };
7288
7475
 
7476
+ // src/packages/tags/parselets/TagAggregateParselet.ts
7477
+ var TagAggregateParselet = class {
7478
+ constructor(pluginFnIndex) {
7479
+ this.pluginFnIndex = pluginFnIndex;
7480
+ this.category = "Tags";
7481
+ }
7482
+ parse(_parser, token, builder) {
7483
+ builder.emitOpcode(13 /* PUSH_STRING */);
7484
+ builder.emitString(token.value);
7485
+ builder.emitOpcode(50 /* CALL_PLUGIN */);
7486
+ builder.emitIndex(this.pluginFnIndex);
7487
+ builder.emitIndex(1);
7488
+ }
7489
+ };
7490
+
7491
+ // src/packages/tags/normalizer/TagAggregateNormalizerRule.ts
7492
+ function wordOf3(token) {
7493
+ if (token === void 0) return "";
7494
+ return (token.text ?? token.value ?? "").toLowerCase();
7495
+ }
7496
+ var AGGREGATE_TOKEN = {
7497
+ TOTAL_OF: "TAG_SUM",
7498
+ COUNT_OF: "TAG_COUNT",
7499
+ AVERAGE_OF: "TAG_AVERAGE"
7500
+ };
7501
+ var AGGREGATE_WORDS = /* @__PURE__ */ new Set(["total", "sum", "count", "average"]);
7502
+ function tagAggregateNormalizerRule(priority = 80) {
7503
+ return {
7504
+ name: "tags:aggregate",
7505
+ priority,
7506
+ match(tokens, pos) {
7507
+ const head = tokens[pos];
7508
+ if (head === void 0) return null;
7509
+ const fused = AGGREGATE_TOKEN[head.type];
7510
+ if (fused !== void 0) {
7511
+ const tag = tokens[pos + 1];
7512
+ if (tag?.type !== "TAG") return null;
7513
+ return {
7514
+ consumed: 2,
7515
+ replacement: [chunkICEKS6YC_cjs.createFusedToken(fused, tag.value ?? "", [head, tag])],
7516
+ ruleName: "tags:aggregate"
7517
+ };
7518
+ }
7519
+ if (head.type === "IDENT" && wordOf3(head) === "sum") {
7520
+ const of = tokens[pos + 1];
7521
+ const tag = tokens[pos + 2];
7522
+ if (wordOf3(of) !== "of") return null;
7523
+ if (tag?.type !== "TAG") return null;
7524
+ return {
7525
+ consumed: 3,
7526
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("TAG_SUM", tag.value ?? "", [head, of, tag])],
7527
+ ruleName: "tags:aggregate"
7528
+ };
7529
+ }
7530
+ return null;
7531
+ }
7532
+ };
7533
+ }
7534
+ function tagStripNormalizerRule(priority = 40) {
7535
+ return {
7536
+ name: "tags:strip",
7537
+ priority,
7538
+ match(tokens, pos) {
7539
+ if (tokens[pos]?.type !== "TAG") return null;
7540
+ const before = tokens[pos - 1];
7541
+ if (before !== void 0) {
7542
+ if (AGGREGATE_TOKEN[before.type] !== void 0) return null;
7543
+ if (wordOf3(before) === "of" && AGGREGATE_WORDS.has(wordOf3(tokens[pos - 2]))) return null;
7544
+ }
7545
+ return { consumed: 1, replacement: [], ruleName: "tags:strip" };
7546
+ }
7547
+ };
7548
+ }
7549
+
7550
+ // src/packages/tags/TagScanner.ts
7551
+ function escapeTag(name) {
7552
+ return name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
7553
+ }
7554
+ function lineCarriesTag(rawText, tag) {
7555
+ if (tag === "") return false;
7556
+ const re = new RegExp(`(?:^|[^0-9A-Za-z_])#${escapeTag(tag)}(?![0-9A-Za-z_-])`, "i");
7557
+ const m = re.exec(rawText);
7558
+ if (m === null) return false;
7559
+ const hashIndex = m.index + m[0].indexOf("#");
7560
+ return rawText.slice(0, hashIndex).trim().length > 0;
7561
+ }
7562
+
7563
+ // src/packages/tags/TagsPluginFunctions.ts
7564
+ function checkLineValue2(v, lineNumber) {
7565
+ if (v === void 0) {
7566
+ return chunkIT74O4BE_cjs.errorValue("LINE_NOT_YET_EVALUATED", `Line ${lineNumber} has not been evaluated yet`);
7567
+ }
7568
+ if (v.type === 12 /* Pending */) {
7569
+ return chunkIT74O4BE_cjs.errorValue("LINE_RESULT_PENDING", `Line ${lineNumber}'s result is still resolving`);
7570
+ }
7571
+ if (v.type === 13 /* Error */) {
7572
+ return chunkIT74O4BE_cjs.errorValue("LINE_RESULT_ERROR", `Line ${lineNumber} has an error`);
7573
+ }
7574
+ return null;
7575
+ }
7576
+ function requireContext2(context) {
7577
+ if (!context?.getLineResult || !context.getLineText) {
7578
+ return chunkIT74O4BE_cjs.errorValue("TAG_NO_DOCUMENT", "Category tag sums require a real document, not available outside one (e.g. evaluateExpression()'s single-expression path)");
7579
+ }
7580
+ return null;
7581
+ }
7582
+ function aggregateTagged(context, tag, mode) {
7583
+ const getText = context.getLineText;
7584
+ const getResult = context.getLineResult;
7585
+ const isBoundary = context.isLineBoundary;
7586
+ const needle = tag.toLowerCase();
7587
+ let total = 0;
7588
+ let count = 0;
7589
+ let commonUnit;
7590
+ let sawUom = false;
7591
+ for (let n = 1; ; n++) {
7592
+ const text = getText(n);
7593
+ if (text === void 0) break;
7594
+ if (n === context.lineIndex) continue;
7595
+ if (isBoundary && isBoundary(n)) continue;
7596
+ if (!lineCarriesTag(text, needle)) continue;
7597
+ const v = getResult(n);
7598
+ const err = checkLineValue2(v, n);
7599
+ if (err) return err;
7600
+ if (mode !== "count") {
7601
+ if (v.type !== 0 /* Number */ && v.type !== 6 /* Uom */) {
7602
+ return chunkIT74O4BE_cjs.errorValue("TAG_NON_NUMERIC", `Line ${n}, tagged #${tag}, is not a plain number or unit value.`);
7603
+ }
7604
+ if (v.type === 6 /* Uom */) {
7605
+ sawUom = true;
7606
+ if (commonUnit === void 0) commonUnit = v.unit;
7607
+ else if (v.unit !== commonUnit) {
7608
+ return chunkIT74O4BE_cjs.errorValue("TAG_MIXED_UNITS", `Line ${n}'s unit (${v.unit}) doesn't match #${tag}'s first unit (${commonUnit}), aggregating mixed units would misrepresent the result.`);
7609
+ }
7610
+ }
7611
+ total += v.toNumber();
7612
+ }
7613
+ count++;
7614
+ }
7615
+ if (mode === "count") return chunkIT74O4BE_cjs.numberValue(count);
7616
+ if (count === 0) return chunkIT74O4BE_cjs.errorValue("TAG_EMPTY", `No lines are tagged #${tag}.`);
7617
+ const result = mode === "average" ? total / count : total;
7618
+ return sawUom ? chunkIT74O4BE_cjs.uomValue(result, commonUnit) : chunkIT74O4BE_cjs.numberValue(result);
7619
+ }
7620
+ var TAG_SUM_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7621
+ function tagSumHandler(args, context) {
7622
+ const ctxError = requireContext2(context);
7623
+ if (ctxError) return ctxError;
7624
+ return aggregateTagged(context, String(args[0].value), "sum");
7625
+ }
7626
+ var TAG_AVERAGE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7627
+ function tagAverageHandler(args, context) {
7628
+ const ctxError = requireContext2(context);
7629
+ if (ctxError) return ctxError;
7630
+ return aggregateTagged(context, String(args[0].value), "average");
7631
+ }
7632
+ var TAG_COUNT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7633
+ function tagCountHandler(args, context) {
7634
+ const ctxError = requireContext2(context);
7635
+ if (ctxError) return ctxError;
7636
+ return aggregateTagged(context, String(args[0].value), "count");
7637
+ }
7638
+
7639
+ // src/packages/tags/TagsPackage.ts
7640
+ var TAGS_PACKAGE = {
7641
+ name: "solve-tags",
7642
+ normalizerRules: [tagAggregateNormalizerRule(), tagStripNormalizerRule()],
7643
+ prefixParselets: [
7644
+ { tokenType: "TAG_SUM", parselet: new TagAggregateParselet(TAG_SUM_FN_IDX) },
7645
+ { tokenType: "TAG_AVERAGE", parselet: new TagAggregateParselet(TAG_AVERAGE_FN_IDX) },
7646
+ { tokenType: "TAG_COUNT", parselet: new TagAggregateParselet(TAG_COUNT_FN_IDX) }
7647
+ ],
7648
+ pluginFunctions: [
7649
+ { index: TAG_SUM_FN_IDX, handler: tagSumHandler },
7650
+ { index: TAG_AVERAGE_FN_IDX, handler: tagAverageHandler },
7651
+ { index: TAG_COUNT_FN_IDX, handler: tagCountHandler }
7652
+ ]
7653
+ };
7654
+
7289
7655
  // src/packages/uncertainty/parselets/UncertaintyParselet.ts
7290
7656
  var UncertaintyParselet = class {
7291
7657
  constructor() {
7292
7658
  this.category = "operator";
7293
- this.bindingPower = chunkJ45BCEZ4_cjs.BindingPower.Uncertainty;
7659
+ this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Uncertainty;
7294
7660
  }
7295
7661
  parse(parser, _left, _token, builder) {
7296
7662
  parser.parseExpression(this.bindingPower, builder);
@@ -7312,7 +7678,7 @@ function asciiPlusMinusNormalizerRule(priority = 90) {
7312
7678
  if (minus?.type !== "MINUS") return null;
7313
7679
  return {
7314
7680
  consumed: 3,
7315
- replacement: [chunkCUR2WLI4_cjs.createFusedToken("PLUS_MINUS", "\xB1", [plus, slash, minus])],
7681
+ replacement: [chunkICEKS6YC_cjs.createFusedToken("PLUS_MINUS", "\xB1", [plus, slash, minus])],
7316
7682
  ruleName: "uncertainty:ascii-plus-minus"
7317
7683
  };
7318
7684
  }
@@ -7338,12 +7704,12 @@ var ABSOLUTE_VALUE_TOLERANCE = 1e-9;
7338
7704
  var RELATIVE_VALUE_TOLERANCE = 1e-9;
7339
7705
  var INTERVAL_COLLAPSE_WIDTH = 1e-12;
7340
7706
  var REAL_ROOT_IMAGINARY_TOLERANCE = 1e-9;
7341
- var GOAL_SEEK_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7707
+ var GOAL_SEEK_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7342
7708
  function goalSeekHandler(args, context) {
7343
7709
  const probe = context?.evaluateLineWithBinding;
7344
7710
  const getLineReads = context?.getLineReads;
7345
7711
  if (!probe || !getLineReads) {
7346
- return chunk2TZKENDH_cjs.errorValue(
7712
+ return chunkIT74O4BE_cjs.errorValue(
7347
7713
  "GOAL_SEEK_NO_DOCUMENT",
7348
7714
  "Goal seek only works inside a document, since it re-runs another line. The single-expression entry point has no document to solve against."
7349
7715
  );
@@ -7352,41 +7718,41 @@ function goalSeekHandler(args, context) {
7352
7718
  const varName = typeof args[1].value === "string" ? args[1].value : String(args[1].value);
7353
7719
  const targetArg = args[2];
7354
7720
  if (targetArg.type !== 0 /* Number */ && targetArg.type !== 6 /* Uom */) {
7355
- return chunk2TZKENDH_cjs.errorValue("GOAL_SEEK_TARGET_NOT_NUMERIC", `Goal seek's target must be a number, as in "solve line ${targetLine} for ${varName} = 900".`);
7721
+ return chunkIT74O4BE_cjs.errorValue("GOAL_SEEK_TARGET_NOT_NUMERIC", `Goal seek's target must be a number, as in "solve line ${targetLine} for ${varName} = 900".`);
7356
7722
  }
7357
7723
  const target = targetArg.toNumber();
7358
7724
  if (!Number.isFinite(target)) {
7359
- return chunk2TZKENDH_cjs.errorValue("GOAL_SEEK_TARGET_NOT_NUMERIC", "Goal seek's target is not a finite number.");
7725
+ return chunkIT74O4BE_cjs.errorValue("GOAL_SEEK_TARGET_NOT_NUMERIC", "Goal seek's target is not a finite number.");
7360
7726
  }
7361
7727
  const reads = getLineReads(targetLine);
7362
7728
  if (reads === void 0) {
7363
- return chunk2TZKENDH_cjs.errorValue("GOAL_SEEK_LINE_NOT_READY", `Line ${targetLine} has no evaluated expression to solve (forward reference, out of range, or not an expression).`);
7729
+ return chunkIT74O4BE_cjs.errorValue("GOAL_SEEK_LINE_NOT_READY", `Line ${targetLine} has no evaluated expression to solve (forward reference, out of range, or not an expression).`);
7364
7730
  }
7365
7731
  if (!reads.includes(varName)) {
7366
- return chunk2TZKENDH_cjs.errorValue("GOAL_SEEK_VARIABLE_NOT_USED", `Line ${targetLine} does not use ${varName}, so changing ${varName} cannot move its result toward ${target}.`);
7732
+ return chunkIT74O4BE_cjs.errorValue("GOAL_SEEK_VARIABLE_NOT_USED", `Line ${targetLine} does not use ${varName}, so changing ${varName} cannot move its result toward ${target}.`);
7367
7733
  }
7368
- const symbolic = probe(targetLine, varName, chunk2TZKENDH_cjs.symbolicValue(chunkHIQ5HSZL_cjs.varNode(varName)), true);
7734
+ const symbolic = probe(targetLine, varName, chunkIT74O4BE_cjs.symbolicValue(chunkA2DZ5BEJ_cjs.varNode(varName)), true);
7369
7735
  if (symbolic.type === 9 /* Symbolic */) {
7370
7736
  const exact = solveClosedForm(symbolic.value, target, varName);
7371
- if (exact !== null) return chunk2TZKENDH_cjs.numberValue(exact);
7737
+ if (exact !== null) return chunkIT74O4BE_cjs.numberValue(exact);
7372
7738
  }
7373
7739
  const maxIterations = context.goalSeekMaxIterations ?? FALLBACK_MAX_ITERATIONS;
7374
7740
  return bisect(probe, targetLine, varName, target, maxIterations);
7375
7741
  }
7376
7742
  function solveClosedForm(lhs, target, variable) {
7377
- const rhs = chunkHIQ5HSZL_cjs.constNode(chunkHIQ5HSZL_cjs.rationalFromNumber(target));
7743
+ const rhs = chunkA2DZ5BEJ_cjs.constNode(chunkA2DZ5BEJ_cjs.rationalFromNumber(target));
7378
7744
  let outcome;
7379
7745
  try {
7380
- outcome = chunk7ZX6B7SY_cjs.solveForVariable(lhs, rhs, variable);
7746
+ outcome = chunkFR7RNOPT_cjs.solveForVariable(lhs, rhs, variable);
7381
7747
  } catch {
7382
7748
  return null;
7383
7749
  }
7384
7750
  if (outcome.kind !== "roots") return null;
7385
7751
  const candidates = [];
7386
7752
  for (const node of outcome.exact) {
7387
- const simplified = chunkHIQ5HSZL_cjs.simplifySymbolic(node);
7753
+ const simplified = chunkA2DZ5BEJ_cjs.simplifySymbolic(node);
7388
7754
  if (simplified.kind === "const") {
7389
- const value = chunkHIQ5HSZL_cjs.rationalToNumber(simplified.value);
7755
+ const value = chunkA2DZ5BEJ_cjs.rationalToNumber(simplified.value);
7390
7756
  if (Number.isFinite(value)) candidates.push(value);
7391
7757
  }
7392
7758
  }
@@ -7401,13 +7767,13 @@ function solveClosedForm(lhs, target, variable) {
7401
7767
  }
7402
7768
  function bisect(probe, targetLine, variable, target, maxIterations) {
7403
7769
  const sample = (candidate) => {
7404
- const result = probe(targetLine, variable, chunk2TZKENDH_cjs.numberValue(candidate), false);
7770
+ const result = probe(targetLine, variable, chunkIT74O4BE_cjs.numberValue(candidate), false);
7405
7771
  if (result.type === 13 /* Error */) return { error: result };
7406
7772
  if (result.type !== 0 /* Number */ && result.type !== 6 /* Uom */) {
7407
- return { error: chunk2TZKENDH_cjs.errorValue("GOAL_SEEK_TARGET_NOT_NUMERIC", `Line ${targetLine} did not produce a number when ${variable} was set to ${candidate}, so goal seek cannot compare it to the target.`) };
7773
+ return { error: chunkIT74O4BE_cjs.errorValue("GOAL_SEEK_TARGET_NOT_NUMERIC", `Line ${targetLine} did not produce a number when ${variable} was set to ${candidate}, so goal seek cannot compare it to the target.`) };
7408
7774
  }
7409
7775
  const numeric = result.toNumber();
7410
- if (!Number.isFinite(numeric)) return { error: chunk2TZKENDH_cjs.errorValue("GOAL_SEEK_NON_FINITE", `Line ${targetLine}'s result is not finite when ${variable} is ${candidate}.`) };
7776
+ if (!Number.isFinite(numeric)) return { error: chunkIT74O4BE_cjs.errorValue("GOAL_SEEK_NON_FINITE", `Line ${targetLine}'s result is not finite when ${variable} is ${candidate}.`) };
7411
7777
  return { value: numeric };
7412
7778
  };
7413
7779
  let lo = SEARCH_LOWER_BOUND;
@@ -7419,10 +7785,10 @@ function bisect(probe, targetLine, variable, target, maxIterations) {
7419
7785
  const tolerance = Math.max(ABSOLUTE_VALUE_TOLERANCE, Math.abs(target) * RELATIVE_VALUE_TOLERANCE);
7420
7786
  let flo = loSample.value - target;
7421
7787
  const fhi = hiSample.value - target;
7422
- if (Math.abs(flo) <= tolerance) return chunk2TZKENDH_cjs.numberValue(lo);
7423
- if (Math.abs(fhi) <= tolerance) return chunk2TZKENDH_cjs.numberValue(hi);
7788
+ if (Math.abs(flo) <= tolerance) return chunkIT74O4BE_cjs.numberValue(lo);
7789
+ if (Math.abs(fhi) <= tolerance) return chunkIT74O4BE_cjs.numberValue(hi);
7424
7790
  if (Math.sign(flo) === Math.sign(fhi)) {
7425
- return chunk2TZKENDH_cjs.errorValue(
7791
+ return chunkIT74O4BE_cjs.errorValue(
7426
7792
  "GOAL_SEEK_NO_SOLUTION",
7427
7793
  `No value of ${variable} between ${lo} and ${hi} makes line ${targetLine} equal ${target}: across that whole range its result stays on one side of the target.`
7428
7794
  );
@@ -7432,9 +7798,9 @@ function bisect(probe, targetLine, variable, target, maxIterations) {
7432
7798
  const midSample = sample(mid);
7433
7799
  if ("error" in midSample) return midSample.error;
7434
7800
  const fmid = midSample.value - target;
7435
- if (Math.abs(fmid) <= tolerance) return chunk2TZKENDH_cjs.numberValue(mid);
7801
+ if (Math.abs(fmid) <= tolerance) return chunkIT74O4BE_cjs.numberValue(mid);
7436
7802
  if (hi - lo <= INTERVAL_COLLAPSE_WIDTH) {
7437
- return chunk2TZKENDH_cjs.errorValue(
7803
+ return chunkIT74O4BE_cjs.errorValue(
7438
7804
  "GOAL_SEEK_DID_NOT_CONVERGE",
7439
7805
  `Goal seek narrowed ${variable} to a single point near ${mid} without line ${targetLine} reaching ${target}: the relationship jumps across the target rather than passing through it.`
7440
7806
  );
@@ -7446,7 +7812,7 @@ function bisect(probe, targetLine, variable, target, maxIterations) {
7446
7812
  hi = mid;
7447
7813
  }
7448
7814
  }
7449
- return chunk2TZKENDH_cjs.errorValue(
7815
+ return chunkIT74O4BE_cjs.errorValue(
7450
7816
  "GOAL_SEEK_DID_NOT_CONVERGE",
7451
7817
  `Goal seek did not bring line ${targetLine} within tolerance of ${target} by varying ${variable} in ${maxIterations} steps.`
7452
7818
  );
@@ -7460,7 +7826,7 @@ var GoalSeekParselet = class {
7460
7826
  parse(parser, _token, builder) {
7461
7827
  const lineRef = parser.peek();
7462
7828
  if (!lineRef || lineRef.type !== "LINE_REF") {
7463
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
7829
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
7464
7830
  "GOAL_SEEK_SYNTAX",
7465
7831
  `Goal seek reads "solve line N for <var> = <target>", for example "solve line 4 for rate = 900".`,
7466
7832
  { found: lineRef?.type ?? "end of input" }
@@ -7471,7 +7837,7 @@ var GoalSeekParselet = class {
7471
7837
  const connective = parser.peek();
7472
7838
  const isFor = !!connective && (connective.type === "FOR_DURATION" || connective.type === "IDENT" && connective.value.toLowerCase() === "for");
7473
7839
  if (!isFor) {
7474
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
7840
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
7475
7841
  "GOAL_SEEK_SYNTAX",
7476
7842
  `Goal seek reads "solve line N for <var> = <target>". Expected "for" after the line reference.`,
7477
7843
  { found: connective?.type ?? "end of input" }
@@ -7480,7 +7846,7 @@ var GoalSeekParselet = class {
7480
7846
  parser.consume();
7481
7847
  const variable = parser.peek();
7482
7848
  if (!variable || variable.type !== "IDENT" && variable.type !== "UNIT") {
7483
- throw chunkB4HBEFTB_cjs.ErrorFactory.parsing(
7849
+ throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
7484
7850
  "GOAL_SEEK_REQUIRES_VARIABLE_NAME",
7485
7851
  `Goal seek needs the name of the variable to vary here, as in "solve line 4 for rate = 900".`,
7486
7852
  { found: variable?.type ?? "end of input" }
@@ -7492,7 +7858,7 @@ var GoalSeekParselet = class {
7492
7858
  builder.emitNumber(targetLine);
7493
7859
  builder.emitOpcode(13 /* PUSH_STRING */);
7494
7860
  builder.emitString(variable.value);
7495
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
7861
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
7496
7862
  builder.emitOpcode(50 /* CALL_PLUGIN */);
7497
7863
  builder.emitIndex(GOAL_SEEK_FN_IDX);
7498
7864
  builder.emitIndex(3);
@@ -7500,7 +7866,7 @@ var GoalSeekParselet = class {
7500
7866
  };
7501
7867
 
7502
7868
  // src/packages/goalseek/normalizer/GoalSeekNormalizerRule.ts
7503
- var GOAL_SEEK_TYPE_ID = chunkQFTDTX6K_cjs.tokenTypeId("GOAL_SEEK");
7869
+ var GOAL_SEEK_TYPE_ID = chunkG2YPPLGX_cjs.tokenTypeId("GOAL_SEEK");
7504
7870
  function goalSeekNormalizerRule(priority = 75) {
7505
7871
  return {
7506
7872
  name: "goalseek:solve-line",
@@ -7513,7 +7879,7 @@ function goalSeekNormalizerRule(priority = 75) {
7513
7879
  return {
7514
7880
  consumed: 1,
7515
7881
  replacement: [
7516
- new chunkZMW6NU2K_cjs.LexerToken("GOAL_SEEK", GOAL_SEEK_TYPE_ID, token.value, token.value, token.offset, 0, token.line, token.col)
7882
+ new chunkYJHY7CMN_cjs.LexerToken("GOAL_SEEK", GOAL_SEEK_TYPE_ID, token.value, token.value, token.offset, 0, token.line, token.col)
7517
7883
  ],
7518
7884
  ruleName: "goalseek:solve-line"
7519
7885
  };
@@ -7552,12 +7918,12 @@ function readAmount(v) {
7552
7918
  return n > 1 ? n / 100 : n;
7553
7919
  }
7554
7920
  function badArgs(fn, expected) {
7555
- return chunk2TZKENDH_cjs.errorValue(ColourErrorCodes.COLOUR_BAD_ARGUMENTS, `${fn}(...) expects ${expected}`);
7921
+ return chunkIT74O4BE_cjs.errorValue(ColourErrorCodes.COLOUR_BAD_ARGUMENTS, `${fn}(...) expects ${expected}`);
7556
7922
  }
7557
7923
  function notAColour(fn) {
7558
- return chunk2TZKENDH_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, `${fn}(...) expects a colour as its first argument`);
7924
+ return chunkIT74O4BE_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, `${fn}(...) expects a colour as its first argument`);
7559
7925
  }
7560
- var COLOUR_PARSE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7926
+ var COLOUR_PARSE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7561
7927
  function colourParseHandler(args) {
7562
7928
  const arg = args[0];
7563
7929
  if (!arg || arg.type !== 3 /* String */ || typeof arg.value !== "string") {
@@ -7565,17 +7931,17 @@ function colourParseHandler(args) {
7565
7931
  }
7566
7932
  const parsed = chunkALYRJ72W_cjs.parseColour(arg.value);
7567
7933
  if (!parsed) {
7568
- return chunk2TZKENDH_cjs.errorValue(
7934
+ return chunkIT74O4BE_cjs.errorValue(
7569
7935
  ColourErrorCodes.COLOUR_INVALID,
7570
7936
  `"${arg.value}" is not a hex colour (#rgb, #rgba, #rrggbb, #rrggbbaa) or a CSS colour name`
7571
7937
  );
7572
7938
  }
7573
- return chunk2TZKENDH_cjs.colourValue(parsed);
7939
+ return chunkIT74O4BE_cjs.colourValue(parsed);
7574
7940
  }
7575
- var COLOUR_RGB_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7941
+ var COLOUR_RGB_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7576
7942
  function rgbHandler(args) {
7577
7943
  if (args.length !== 3) return badArgs("rgb", "three numbers: rgb(red, green, blue)");
7578
- return chunk2TZKENDH_cjs.colourValue({
7944
+ return chunkIT74O4BE_cjs.colourValue({
7579
7945
  r: chunkALYRJ72W_cjs.clamp255(args[0].toNumber()),
7580
7946
  g: chunkALYRJ72W_cjs.clamp255(args[1].toNumber()),
7581
7947
  b: chunkALYRJ72W_cjs.clamp255(args[2].toNumber()),
@@ -7583,10 +7949,10 @@ function rgbHandler(args) {
7583
7949
  format: "rgb"
7584
7950
  });
7585
7951
  }
7586
- var COLOUR_RGBA_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7952
+ var COLOUR_RGBA_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7587
7953
  function rgbaHandler(args) {
7588
7954
  if (args.length !== 4) return badArgs("rgba", "four numbers: rgba(red, green, blue, alpha)");
7589
- return chunk2TZKENDH_cjs.colourValue({
7955
+ return chunkIT74O4BE_cjs.colourValue({
7590
7956
  r: chunkALYRJ72W_cjs.clamp255(args[0].toNumber()),
7591
7957
  g: chunkALYRJ72W_cjs.clamp255(args[1].toNumber()),
7592
7958
  b: chunkALYRJ72W_cjs.clamp255(args[2].toNumber()),
@@ -7594,146 +7960,146 @@ function rgbaHandler(args) {
7594
7960
  format: "rgba"
7595
7961
  });
7596
7962
  }
7597
- var COLOUR_HSL_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7963
+ var COLOUR_HSL_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7598
7964
  function hslHandler(args) {
7599
7965
  if (args.length !== 3) return badArgs("hsl", "three values: hsl(hue, saturation%, lightness%)");
7600
7966
  const { r, g, b } = chunkALYRJ72W_cjs.hslToRgb(args[0].toNumber(), readAmount(args[1]), readAmount(args[2]));
7601
- return chunk2TZKENDH_cjs.colourValue({ r, g, b, a: 1, format: "hsl" });
7967
+ return chunkIT74O4BE_cjs.colourValue({ r, g, b, a: 1, format: "hsl" });
7602
7968
  }
7603
- var COLOUR_HSLA_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7969
+ var COLOUR_HSLA_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7604
7970
  function hslaHandler(args) {
7605
7971
  if (args.length !== 4) return badArgs("hsla", "four values: hsla(hue, saturation%, lightness%, alpha)");
7606
7972
  const { r, g, b } = chunkALYRJ72W_cjs.hslToRgb(args[0].toNumber(), readAmount(args[1]), readAmount(args[2]));
7607
- return chunk2TZKENDH_cjs.colourValue({ r, g, b, a: chunkALYRJ72W_cjs.clamp01(readAmount(args[3])), format: "hsla" });
7973
+ return chunkIT74O4BE_cjs.colourValue({ r, g, b, a: chunkALYRJ72W_cjs.clamp01(readAmount(args[3])), format: "hsla" });
7608
7974
  }
7609
7975
  function adjuster(name, op) {
7610
7976
  return (args) => {
7611
7977
  const c = colourOf(args[0]);
7612
7978
  if (!c) return notAColour(name);
7613
7979
  if (args.length < 2) return badArgs(name, `a colour and an amount, e.g. ${name}(#3366cc, 20%)`);
7614
- return chunk2TZKENDH_cjs.colourValue(op(c, readAmount(args[1])));
7980
+ return chunkIT74O4BE_cjs.colourValue(op(c, readAmount(args[1])));
7615
7981
  };
7616
7982
  }
7617
- var COLOUR_LIGHTEN_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7983
+ var COLOUR_LIGHTEN_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7618
7984
  var lightenHandler = adjuster("lighten", chunkALYRJ72W_cjs.lighten);
7619
- var COLOUR_DARKEN_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7985
+ var COLOUR_DARKEN_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7620
7986
  var darkenHandler = adjuster("darken", chunkALYRJ72W_cjs.darken);
7621
- var COLOUR_SATURATE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7987
+ var COLOUR_SATURATE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7622
7988
  var saturateHandler = adjuster("saturate", chunkALYRJ72W_cjs.saturate);
7623
- var COLOUR_DESATURATE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7989
+ var COLOUR_DESATURATE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7624
7990
  var desaturateHandler = adjuster("desaturate", chunkALYRJ72W_cjs.desaturate);
7625
- var COLOUR_ROTATE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7991
+ var COLOUR_ROTATE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7626
7992
  function rotateHandler(args) {
7627
7993
  const c = colourOf(args[0]);
7628
7994
  if (!c) return notAColour("rotate");
7629
7995
  if (args.length < 2) return badArgs("rotate", "a colour and a hue angle in degrees, e.g. rotate(#ff0000, 90)");
7630
- return chunk2TZKENDH_cjs.colourValue(chunkALYRJ72W_cjs.rotateHue(c, args[1].toNumber()));
7996
+ return chunkIT74O4BE_cjs.colourValue(chunkALYRJ72W_cjs.rotateHue(c, args[1].toNumber()));
7631
7997
  }
7632
- var COLOUR_COMPLEMENT_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
7998
+ var COLOUR_COMPLEMENT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7633
7999
  function complementHandler(args) {
7634
8000
  const c = colourOf(args[0]);
7635
8001
  if (!c) return notAColour("complement");
7636
- return chunk2TZKENDH_cjs.colourValue(chunkALYRJ72W_cjs.complement(c));
8002
+ return chunkIT74O4BE_cjs.colourValue(chunkALYRJ72W_cjs.complement(c));
7637
8003
  }
7638
- var COLOUR_GRAYSCALE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8004
+ var COLOUR_GRAYSCALE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7639
8005
  function grayscaleHandler(args) {
7640
8006
  const c = colourOf(args[0]);
7641
8007
  if (!c) return notAColour("grayscale");
7642
- return chunk2TZKENDH_cjs.colourValue(chunkALYRJ72W_cjs.grayscale(c));
8008
+ return chunkIT74O4BE_cjs.colourValue(chunkALYRJ72W_cjs.grayscale(c));
7643
8009
  }
7644
- var COLOUR_INVERT_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8010
+ var COLOUR_INVERT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7645
8011
  function invertHandler(args) {
7646
8012
  const c = colourOf(args[0]);
7647
8013
  if (!c) return notAColour("invert");
7648
- return chunk2TZKENDH_cjs.colourValue(chunkALYRJ72W_cjs.invert(c, args.length > 1 ? readAmount(args[1]) : 1));
8014
+ return chunkIT74O4BE_cjs.colourValue(chunkALYRJ72W_cjs.invert(c, args.length > 1 ? readAmount(args[1]) : 1));
7649
8015
  }
7650
- var COLOUR_MIX_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8016
+ var COLOUR_MIX_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7651
8017
  function mixHandler(args) {
7652
8018
  const a = colourOf(args[0]);
7653
8019
  const b = colourOf(args[1]);
7654
- if (!a || !b) return chunk2TZKENDH_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, "mix(...) expects two colours to blend");
7655
- return chunk2TZKENDH_cjs.colourValue(chunkALYRJ72W_cjs.mix(a, b, args.length > 2 ? readAmount(args[2]) : 0.5));
8020
+ if (!a || !b) return chunkIT74O4BE_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, "mix(...) expects two colours to blend");
8021
+ return chunkIT74O4BE_cjs.colourValue(chunkALYRJ72W_cjs.mix(a, b, args.length > 2 ? readAmount(args[2]) : 0.5));
7656
8022
  }
7657
- var COLOUR_ALPHA_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8023
+ var COLOUR_ALPHA_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7658
8024
  function alphaHandler(args) {
7659
8025
  const c = colourOf(args[0]);
7660
8026
  if (!c) return notAColour("alpha");
7661
- if (args.length < 2) return chunk2TZKENDH_cjs.numberValue(c.a);
7662
- return chunk2TZKENDH_cjs.colourValue(chunkALYRJ72W_cjs.withAlpha(c, readAmount(args[1])));
8027
+ if (args.length < 2) return chunkIT74O4BE_cjs.numberValue(c.a);
8028
+ return chunkIT74O4BE_cjs.colourValue(chunkALYRJ72W_cjs.withAlpha(c, readAmount(args[1])));
7663
8029
  }
7664
- var COLOUR_CONTRAST_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8030
+ var COLOUR_CONTRAST_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7665
8031
  function contrastHandler(args) {
7666
8032
  const a = colourOf(args[0]);
7667
8033
  const b = colourOf(args[1]);
7668
- if (!a || !b) return chunk2TZKENDH_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, "contrast(...) expects two colours");
7669
- return chunk2TZKENDH_cjs.numberValue(chunkALYRJ72W_cjs.contrastRatio(a, b));
8034
+ if (!a || !b) return chunkIT74O4BE_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, "contrast(...) expects two colours");
8035
+ return chunkIT74O4BE_cjs.numberValue(chunkALYRJ72W_cjs.contrastRatio(a, b));
7670
8036
  }
7671
- var COLOUR_LUMINANCE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8037
+ var COLOUR_LUMINANCE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7672
8038
  function luminanceHandler(args) {
7673
8039
  const c = colourOf(args[0]);
7674
8040
  if (!c) return notAColour("luminance");
7675
- return chunk2TZKENDH_cjs.numberValue(chunkALYRJ72W_cjs.relativeLuminance(c));
8041
+ return chunkIT74O4BE_cjs.numberValue(chunkALYRJ72W_cjs.relativeLuminance(c));
7676
8042
  }
7677
8043
  function extractor(name, get) {
7678
8044
  return (args) => {
7679
8045
  const c = colourOf(args[0]);
7680
8046
  if (!c) return notAColour(name);
7681
- return chunk2TZKENDH_cjs.numberValue(get(c));
8047
+ return chunkIT74O4BE_cjs.numberValue(get(c));
7682
8048
  };
7683
8049
  }
7684
- var COLOUR_RED_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8050
+ var COLOUR_RED_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7685
8051
  var redHandler = extractor("red", (c) => c.r);
7686
- var COLOUR_GREEN_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8052
+ var COLOUR_GREEN_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7687
8053
  var greenHandler = extractor("green", (c) => c.g);
7688
- var COLOUR_BLUE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8054
+ var COLOUR_BLUE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7689
8055
  var blueHandler = extractor("blue", (c) => c.b);
7690
- var COLOUR_HUE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8056
+ var COLOUR_HUE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7691
8057
  var hueHandler = extractor("hue", (c) => chunkALYRJ72W_cjs.rgbToHsl(c.r, c.g, c.b).h);
7692
- var COLOUR_SATURATION_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8058
+ var COLOUR_SATURATION_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7693
8059
  var saturationHandler = extractor("saturation", (c) => chunkALYRJ72W_cjs.rgbToHsl(c.r, c.g, c.b).s * 100);
7694
- var COLOUR_LIGHTNESS_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8060
+ var COLOUR_LIGHTNESS_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7695
8061
  var lightnessHandler = extractor("lightness", (c) => chunkALYRJ72W_cjs.rgbToHsl(c.r, c.g, c.b).l * 100);
7696
- var COLOUR_HSV_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8062
+ var COLOUR_HSV_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7697
8063
  function hsvHandler(args) {
7698
8064
  if (args.length !== 3) return badArgs("hsv", "three values: hsv(hue, saturation%, value%)");
7699
8065
  const { r, g, b } = chunkALYRJ72W_cjs.hsvToRgb(args[0].toNumber(), readAmount(args[1]), readAmount(args[2]));
7700
- return chunk2TZKENDH_cjs.colourValue({ r, g, b, a: 1, format: "hex" });
8066
+ return chunkIT74O4BE_cjs.colourValue({ r, g, b, a: 1, format: "hex" });
7701
8067
  }
7702
- var COLOUR_HSVA_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8068
+ var COLOUR_HSVA_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7703
8069
  function hsvaHandler(args) {
7704
8070
  if (args.length !== 4) return badArgs("hsva", "four values: hsva(hue, saturation%, value%, alpha)");
7705
8071
  const { r, g, b } = chunkALYRJ72W_cjs.hsvToRgb(args[0].toNumber(), readAmount(args[1]), readAmount(args[2]));
7706
- return chunk2TZKENDH_cjs.colourValue({ r, g, b, a: chunkALYRJ72W_cjs.clamp01(readAmount(args[3])), format: "hex" });
8072
+ return chunkIT74O4BE_cjs.colourValue({ r, g, b, a: chunkALYRJ72W_cjs.clamp01(readAmount(args[3])), format: "hex" });
7707
8073
  }
7708
- var COLOUR_HWB_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8074
+ var COLOUR_HWB_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7709
8075
  function hwbHandler(args) {
7710
8076
  if (args.length !== 3) return badArgs("hwb", "three values: hwb(hue, whiteness%, blackness%)");
7711
8077
  const { r, g, b } = chunkALYRJ72W_cjs.hwbToRgb(args[0].toNumber(), readAmount(args[1]), readAmount(args[2]));
7712
- return chunk2TZKENDH_cjs.colourValue({ r, g, b, a: 1, format: "hex" });
8078
+ return chunkIT74O4BE_cjs.colourValue({ r, g, b, a: 1, format: "hex" });
7713
8079
  }
7714
- var COLOUR_TINT_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8080
+ var COLOUR_TINT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7715
8081
  var tintHandler = adjuster("tint", chunkALYRJ72W_cjs.tint);
7716
- var COLOUR_SHADE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8082
+ var COLOUR_SHADE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7717
8083
  var shadeHandler = adjuster("shade", chunkALYRJ72W_cjs.shade);
7718
- var COLOUR_TONE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8084
+ var COLOUR_TONE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7719
8085
  var toneHandler = adjuster("tone", chunkALYRJ72W_cjs.tone);
7720
- var COLOUR_ISDARK_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8086
+ var COLOUR_ISDARK_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7721
8087
  function isdarkHandler(args) {
7722
8088
  const c = colourOf(args[0]);
7723
8089
  if (!c) return notAColour("isdark");
7724
- return chunk2TZKENDH_cjs.boolValue(chunkALYRJ72W_cjs.isDark(c));
8090
+ return chunkIT74O4BE_cjs.boolValue(chunkALYRJ72W_cjs.isDark(c));
7725
8091
  }
7726
- var COLOUR_ISLIGHT_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8092
+ var COLOUR_ISLIGHT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7727
8093
  function islightHandler(args) {
7728
8094
  const c = colourOf(args[0]);
7729
8095
  if (!c) return notAColour("islight");
7730
- return chunk2TZKENDH_cjs.boolValue(!chunkALYRJ72W_cjs.isDark(c));
8096
+ return chunkIT74O4BE_cjs.boolValue(!chunkALYRJ72W_cjs.isDark(c));
7731
8097
  }
7732
- var COLOUR_READABLE_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8098
+ var COLOUR_READABLE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7733
8099
  function readableHandler(args) {
7734
8100
  const c = colourOf(args[0]);
7735
8101
  if (!c) return notAColour("readable");
7736
- return chunk2TZKENDH_cjs.colourValue(chunkALYRJ72W_cjs.readableColour(c));
8102
+ return chunkIT74O4BE_cjs.colourValue(chunkALYRJ72W_cjs.readableColour(c));
7737
8103
  }
7738
8104
  function readWcagThreshold(v) {
7739
8105
  if (!v) return chunkALYRJ72W_cjs.WCAG_THRESHOLDS.aa;
@@ -7746,21 +8112,21 @@ function readWcagThreshold(v) {
7746
8112
  }
7747
8113
  return chunkALYRJ72W_cjs.WCAG_THRESHOLDS.aa;
7748
8114
  }
7749
- var COLOUR_CONTRAST_COMPLIANT_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8115
+ var COLOUR_CONTRAST_COMPLIANT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7750
8116
  function contrastCompliantHandler(args) {
7751
8117
  const a = colourOf(args[0]);
7752
8118
  const b = colourOf(args[1]);
7753
8119
  if (!a || !b) {
7754
- return chunk2TZKENDH_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, "iscontrastcompliant(...) expects two colours");
8120
+ return chunkIT74O4BE_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, "iscontrastcompliant(...) expects two colours");
7755
8121
  }
7756
- return chunk2TZKENDH_cjs.boolValue(chunkALYRJ72W_cjs.contrastRatio(a, b) >= readWcagThreshold(args[2]));
8122
+ return chunkIT74O4BE_cjs.boolValue(chunkALYRJ72W_cjs.contrastRatio(a, b) >= readWcagThreshold(args[2]));
7757
8123
  }
7758
- var COLOUR_WCAG_LEVEL_FN_IDX = chunk7ZX6B7SY_cjs.allocatePluginFunctionIndex();
8124
+ var COLOUR_WCAG_LEVEL_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
7759
8125
  function wcagLevelHandler(args) {
7760
8126
  const a = colourOf(args[0]);
7761
8127
  const b = colourOf(args[1]);
7762
- if (!a || !b) return chunk2TZKENDH_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, "wcaglevel(...) expects two colours");
7763
- return chunk2TZKENDH_cjs.stringValue(chunkALYRJ72W_cjs.wcagLevel(a, b));
8128
+ if (!a || !b) return chunkIT74O4BE_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, "wcaglevel(...) expects two colours");
8129
+ return chunkIT74O4BE_cjs.stringValue(chunkALYRJ72W_cjs.wcagLevel(a, b));
7764
8130
  }
7765
8131
  var COLOUR_FUNCTION_INDEX = {
7766
8132
  color: COLOUR_PARSE_FN_IDX,
@@ -7870,17 +8236,17 @@ var ColourCallParselet = class {
7870
8236
  const name = token.value.toLowerCase();
7871
8237
  const fnIdx = COLOUR_FUNCTION_INDEX[name];
7872
8238
  if (fnIdx === void 0) {
7873
- throw chunkB4HBEFTB_cjs.ErrorFactory.execution("UNKNOWN_COLOUR_FUNCTION", `Unknown colour function: ${name}`, {
8239
+ throw chunkMIGXCBXT_cjs.ErrorFactory.execution("UNKNOWN_COLOUR_FUNCTION", `Unknown colour function: ${name}`, {
7874
8240
  functionName: name
7875
8241
  });
7876
8242
  }
7877
8243
  parser.consume("LPAREN");
7878
8244
  let argCount = 0;
7879
8245
  if (parser.peek()?.type !== "RPAREN") {
7880
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
8246
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
7881
8247
  argCount++;
7882
8248
  while (parser.match("COMMA")) {
7883
- parser.parseExpression(chunkJ45BCEZ4_cjs.BindingPower.Lowest, builder);
8249
+ parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
7884
8250
  argCount++;
7885
8251
  }
7886
8252
  }
@@ -7905,9 +8271,9 @@ function colourCallNormalizerRule(priority = 80) {
7905
8271
  return {
7906
8272
  consumed: 1,
7907
8273
  replacement: [
7908
- new chunkZMW6NU2K_cjs.LexerToken(
8274
+ new chunkYJHY7CMN_cjs.LexerToken(
7909
8275
  "COLOUR_CALL",
7910
- chunkQFTDTX6K_cjs.tokenTypeId("COLOUR_CALL"),
8276
+ chunkG2YPPLGX_cjs.tokenTypeId("COLOUR_CALL"),
7911
8277
  token.value,
7912
8278
  token.value,
7913
8279
  token.offset,
@@ -7926,7 +8292,7 @@ function colourCallNormalizerRule(priority = 80) {
7926
8292
  var retag = (format) => (v) => {
7927
8293
  if (v.type !== 14 /* Colour */) return v;
7928
8294
  const c = v.value;
7929
- return chunk2TZKENDH_cjs.colourValue({ r: c.r, g: c.g, b: c.b, a: c.a, format });
8295
+ return chunkIT74O4BE_cjs.colourValue({ r: c.r, g: c.g, b: c.b, a: c.a, format });
7930
8296
  };
7931
8297
  var completionItems = Object.keys(COLOUR_FUNCTION_INDEX).map((label) => ({
7932
8298
  label,
@@ -7979,7 +8345,11 @@ var BUILTIN_PACKAGES = [
7979
8345
  // rule mints, and its parselet targets a line reference.
7980
8346
  GOALSEEK_PACKAGE,
7981
8347
  TABLES_PACKAGE,
7982
- COLOUR_PACKAGE
8348
+ COLOUR_PACKAGE,
8349
+ // After MATHPHRASES_PACKAGE and LINES_PACKAGE: tag aggregates reuse the
8350
+ // `total of`/`count of`/`average of` fusions and walk the document the same
8351
+ // way the lines cross-line reads do.
8352
+ TAGS_PACKAGE
7983
8353
  ];
7984
8354
 
7985
8355
  exports.ARITHMETIC_PACKAGE = ARITHMETIC_PACKAGE;
@@ -7999,6 +8369,7 @@ exports.MATRIX_PACKAGE = MATRIX_PACKAGE;
7999
8369
  exports.PERCENTAGE_PACKAGE = PERCENTAGE_PACKAGE;
8000
8370
  exports.SYMBOLIC_PACKAGE = SYMBOLIC_PACKAGE;
8001
8371
  exports.TABLES_PACKAGE = TABLES_PACKAGE;
8372
+ exports.TAGS_PACKAGE = TAGS_PACKAGE;
8002
8373
  exports.TIME_PACKAGE = TIME_PACKAGE;
8003
8374
  exports.UOM_PACKAGE = UOM_PACKAGE;
8004
8375
  exports.VARIABLES_PACKAGE = VARIABLES_PACKAGE;
@@ -8008,5 +8379,5 @@ exports.containsSymbolicCall = containsSymbolicCall;
8008
8379
  exports.createCurrencyPackage = createCurrencyPackage;
8009
8380
  exports.createKnowledgePackage = createKnowledgePackage;
8010
8381
  exports.createStocksPackage = createStocksPackage;
8011
- //# sourceMappingURL=chunk-MN3LHRGV.cjs.map
8012
- //# sourceMappingURL=chunk-MN3LHRGV.cjs.map
8382
+ //# sourceMappingURL=chunk-HKTQCQ4Z.cjs.map
8383
+ //# sourceMappingURL=chunk-HKTQCQ4Z.cjs.map