@sqg/sqg 0.17.3 → 0.18.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.
- package/dist/index.mjs +145 -31
- package/dist/sqg.mjs +149 -35
- package/dist/templates/better-sqlite3.hbs +3 -1
- package/dist/templates/libsql.hbs +4 -2
- package/dist/templates/node-sqlite.hbs +4 -2
- package/dist/templates/turso.hbs +4 -2
- package/dist/templates/typescript-duckdb.hbs +2 -0
- package/dist/ui-public/assets/{index-Bt3dXI_J.js → index-BIikjK2O.js} +6 -6
- package/dist/ui-public/index.html +1 -1
- package/dist/ui-server.mjs +53 -5
- package/package.json +1 -1
package/dist/sqg.mjs
CHANGED
|
@@ -18,11 +18,11 @@ import Handlebars from "handlebars";
|
|
|
18
18
|
import { z } from "zod";
|
|
19
19
|
import { DuckDBEnumType, DuckDBInstance, DuckDBListType, DuckDBMapType, DuckDBStructType } from "@duckdb/node-api";
|
|
20
20
|
import { LRParser } from "@lezer/lr";
|
|
21
|
-
import { isNotNil, sortBy } from "es-toolkit";
|
|
22
21
|
import { PostgreSqlContainer } from "@testcontainers/postgresql";
|
|
23
22
|
import { Client } from "pg";
|
|
24
23
|
import types from "pg-types";
|
|
25
24
|
import BetterSqlite3 from "better-sqlite3";
|
|
25
|
+
import { isNotNil } from "es-toolkit";
|
|
26
26
|
import prettier from "prettier/standalone";
|
|
27
27
|
import prettierPluginJava from "prettier-plugin-java";
|
|
28
28
|
import { execSync } from "node:child_process";
|
|
@@ -220,7 +220,8 @@ const SQL_SYNTAX_REFERENCE = `
|
|
|
220
220
|
SQL Annotation Syntax:
|
|
221
221
|
-- QUERY <name> [:one] [:pluck] Select query (returns rows)
|
|
222
222
|
-- EXEC <name> [:batch] Execute statement (INSERT/UPDATE/DELETE)
|
|
223
|
-
--
|
|
223
|
+
-- BASELINE <name> Schema created outside SQG (runs before migrations, not tracked)
|
|
224
|
+
-- MIGRATE <name> Schema migration (runs in source order; name is any identifier, e.g. "1" or "add_email")
|
|
224
225
|
-- TESTDATA <name> Test data setup (not generated)
|
|
225
226
|
-- TABLE <name> :appender Table for bulk insert appender (DuckDB, PostgreSQL)
|
|
226
227
|
|
|
@@ -716,21 +717,21 @@ async function initProject(options) {
|
|
|
716
717
|
//#region src/parser/sql-parser.ts
|
|
717
718
|
const parser = LRParser.deserialize({
|
|
718
719
|
version: 14,
|
|
719
|
-
states: "&
|
|
720
|
-
stateData: "&
|
|
721
|
-
goto: "
|
|
722
|
-
nodeNames: "⚠ File QueryBlock BlockCommentStartSpecial Name Modifiers Config LineCommentStartSpecial SetVarLine Value StringLiteral StringLiteralSingle SQLText SQLBlock
|
|
723
|
-
maxTerm:
|
|
720
|
+
states: "&fOVQPOOOOQO'#C`'#C`OOQO'#Cn'#CnOVQPOOOhQPO'#CyOmQPO'#C{OrQPO'#CxO!]QQO'#CaOOQO'#Co'#CoQ!jQPOOOOQO-E6l-E6lO!rQSO,59eO!}QPO,59gOOQO'#Cq'#CqO#VQQO,59dOOQO'#DO'#DOO#zQQO'#ClOOQO,58{,58{OOQO-E6m-E6mOOQO'#Cp'#CpO!rQSO1G/PO!uQSO1G/POOQO'#Ce'#CeOOQO1G/P1G/PO$[QPO1G/ROOQO-E6o-E6oO$dQPO'#CgOOQO'#Cr'#CrO$iQQO1G/OOOQO'#Cs'#CsO%ZQQO,59WOOQO-E6n-E6nO!uQSO7+$kOOQO7+$k7+$kO%kQPO,59ROOQO-E6p-E6pOOQO-E6q-E6qOOQO<<HV<<HVO%pQQO1G.mOOQO'#Ch'#ChOrQPO7+$XO%{QQO<<Gs",
|
|
721
|
+
stateData: "&}~OjOS~OQQORQOUSOYTOkPO~OVZO~OV[O~Ok]O~OQ_OR_O]_O^_O__Oa_O~OU`PY`Ph`P~PwOUSOYTO~OWcOk]OnfO~OWcOkoa~Ok]OpjOQlaRlaUlaYla]la^la_laalahla~OkPOU`XY`Xh`X~PwOWcOkoi~OVrO~OpjOQliRliUliYli]li^li_lialihli~OkPOU`aY`ah`a~PwOqvO~O]wO^wO_wO~Ok]OQZyRZyUZyYZy]Zy^Zy_ZyaZyhZypZy~OUapRj^Wn]YQ_~",
|
|
722
|
+
goto: "$PsPPPPt|PPP!RP!]!aPPP!dP!g!m!t#O#b#hPPPP#n#sP#sPP#xSQORTm`nVWORXQgZSqdeRupTk^lRxvRaVQRORYRSXORRbXQdZQh[TodhQ^UQeZWi^epyQpdRyxQl^RslQn`RtnVVORXVUORXQ`VTm`n",
|
|
723
|
+
nodeNames: "⚠ File LineComment BlockComment BR QueryBlock BlockCommentStartSpecial Name Modifiers Config LineCommentStartSpecial SetVarLine Value StringLiteral StringLiteralSingle SQLText SQLBlock VarRef",
|
|
724
|
+
maxTerm: 34,
|
|
724
725
|
skippedNodes: [0],
|
|
725
|
-
repeatNodeCount:
|
|
726
|
-
tokenData: "$3b~RqOX#YXY'wYZ(iZ]#Y]^$W^p#Ypq'wqr#Yrs(}st#Ytu6^uw#Ywx9[xz#Yz{%_{}#Y}!OKi!O!P#Y!P!Q#%p!Q![$)l![!]$+U!]!_#Y!_!`$.U!`!b#Y!b!c$/U!c!}$)l!}#R#Y#R#S$)l#S#T#Y#T#o$)l#o;'S#Y;'S;=`'q<%lO#YU#_][QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YS$ZTOz$Wz{$j{;'S$W;'S;=`%X<%lO$WS$mVOz$Wz{$j{!P$W!P!Q%S!Q;'S$W;'S;=`%X<%lO$WS%XOmSS%[P;=`<%l$WU%d_[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!P#Y!P!Q&c!Q;'S#Y;'S;=`'q<%lO#YU&jVmS[QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQ'UV[QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQ'nP;=`<%l'PU'tP;=`<%l#Y~'|Xi~OX$WXY'wYp$Wpq'wqz$Wz{$j{;'S$W;'S;=`%X<%lO$W~(nTl~Oz$Wz{$j{;'S$W;'S;=`%X<%lO$WU)Sb[QOX(}XY*[YZ$WZ](}]^*[^p(}pq*[qr(}rs.yst(}tu*[uz(}z{/y{#O(}#O#P5V#P;'S(};'S;=`6W<%lO(}U*_ZOY*[YZ$WZr*[rs+Qsz*[z{+f{#O*[#O#P.Z#P;'S*[;'S;=`.s<%lO*[U+VTYQOz$Wz{$j{;'S$W;'S;=`%X<%lO$WU+i]OY*[YZ$WZr*[rs+Qsz*[z{+f{!P*[!P!Q,b!Q#O*[#O#P.Z#P;'S*[;'S;=`.s<%lO*[U,gWmSOY-PZr-Prs-ls#O-P#O#P-q#P;'S-P;'S;=`.T<%lO-PQ-SWOY-PZr-Prs-ls#O-P#O#P-q#P;'S-P;'S;=`.T<%lO-PQ-qOYQQ-tTOY-PYZ-PZ;'S-P;'S;=`.T<%lO-PQ.WP;=`<%l-PU.^VOY*[YZ*[Zz*[z{+f{;'S*[;'S;=`.s<%lO*[U.vP;=`<%l*[U/Q]YQ[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YU0Od[QOX(}XY*[YZ$WZ](}]^*[^p(}pq*[qr(}rs.yst(}tu*[uz(}z{/y{!P(}!P!Q1^!Q#O(}#O#P5V#P;'S(};'S;=`6W<%lO(}U1e_mS[QOX2dXY-PZ]2d]^-P^p2dpq-Pqr2drs3hst2dtu-Pu#O2d#O#P4U#P;'S2d;'S;=`5P<%lO2dQ2i_[QOX2dXY-PZ]2d]^-P^p2dpq-Pqr2drs3hst2dtu-Pu#O2d#O#P4U#P;'S2d;'S;=`5P<%lO2dQ3oVYQ[QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQ4Z[[QOX2dXY-PYZ-PZ]2d]^-P^p2dpq-Pqt2dtu-Pu;'S2d;'S;=`5P<%lO2dQ5SP;=`<%l2dU5[^[QOX(}XY*[YZ*[Z](}]^*[^p(}pq*[qt(}tu*[uz(}z{/y{;'S(};'S;=`6W<%lO(}U6ZP;=`<%l(}U6cV[QOz$Wz{$j{#o$W#o#p6x#p;'S$W;'S;=`%X<%lO$WU6{]Oz$Wz{$j{!Q$W!Q![7t![!c$W!c!}7t!}#R$W#R#S7t#S#T$W#T#o7t#o;'S$W;'S;=`%X<%lO$WU7w_Oz$Wz{$j{!Q$W!Q![7t![!c$W!c!}7t!}#R$W#R#S7t#S#T$W#T#o7t#o#q$W#q#r8v#r;'S$W;'S;=`%X<%lO$WU8{T`QOz$Wz{$j{;'S$W;'S;=`%X<%lO$WU9ab[QOX9[XY:iYZ$WZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxAVxz9[z{BV{#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[U:lZOY:iYZ$WZw:iwx;_xz:iz{;s{#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iU;dTZQOz$Wz{$j{;'S$W;'S;=`%X<%lO$WU;v]OY:iYZ$WZw:iwx;_xz:iz{;s{!P:i!P!Q<o!Q#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iU<tWmSOY=^Zw=^wx=yx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q=aWOY=^Zw=^wx=yx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q>OOZQQ>RXOY=^YZ=^Zw=^wx>nx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q>sWZQOY=^Zw=^wx=yx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q?`P;=`<%l=^U?fZOY:iYZ:iZw:iwx@Xxz:iz{;s{#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iU@^ZZQOY:iYZ$WZw:iwx;_xz:iz{;s{#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iUASP;=`<%l:iUA^]ZQ[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YUB[d[QOX9[XY:iYZ$WZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxAVxz9[z{BV{!P9[!P!QCj!Q#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[UCq_mS[QOXDpXY=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxEtx#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQDu_[QOXDpXY=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxEtx#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQE{VZQ[QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQFg`[QOXDpXY=^YZ=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxGix#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQGp_ZQ[QOXDpXY=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxEtx#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQHrP;=`<%lDpUHzb[QOX9[XY:iYZ:iZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxJSxz9[z{BV{#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[UJZbZQ[QOX9[XY:iYZ$WZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxAVxz9[z{BV{#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[UKfP;=`<%l9[VKn_[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{}#Y}!OLm!O;'S#Y;'S;=`'q<%lO#YVLtf_Q[QOXNYXY!&vYZ$WZ]NY]^! ]^pNYpq!&vqtNYtu! ]uzNYz{!#k{!gNY!g!h!8V!h!oNY!o!p!<w!p!sNY!s!t!DP!t!vNY!v!w!Hu!w;'SNY;'S;=`!&p<%lONYUNa^_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{;'SNY;'S;=`!&p<%lONYU! bV_QOY! ]YZ$WZz! ]z{! w{;'S! ];'S;=`!#e<%lO! ]U! |X_QOY! ]YZ$WZz! ]z{! w{!P! ]!P!Q!!i!Q;'S! ];'S;=`!#e<%lO! ]U!!pSmS_QOY!!|Z;'S!!|;'S;=`!#_<%lO!!|Q!#RS_QOY!!|Z;'S!!|;'S;=`!#_<%lO!!|Q!#bP;=`<%l!!|U!#hP;=`<%l! ]U!#r`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!PNY!P!Q!$t!Q;'SNY;'S;=`!&p<%lONYU!$}ZmS_Q[QOX!%pXY!!|Z]!%p]^!!|^p!%ppq!!|qt!%ptu!!|u;'S!%p;'S;=`!&j<%lO!%pQ!%wZ_Q[QOX!%pXY!!|Z]!%p]^!!|^p!%ppq!!|qt!%ptu!!|u;'S!%p;'S;=`!&j<%lO!%pQ!&mP;=`<%l!%pU!&sP;=`<%lNYV!&{b_QOX! ]XY!&vYZ$WZp! ]pq!&vqz! ]z{! w{!g! ]!g!h!(T!h!o! ]!o!p!*u!p!s! ]!s!t!.}!t!v! ]!v!w!1s!w;'S! ];'S;=`!#e<%lO! ]V!(YX_QOY! ]YZ$WZz! ]z{! w{!z! ]!z!{!(u!{;'S! ];'S;=`!#e<%lO! ]V!(zX_QOY! ]YZ$WZz! ]z{! w{!g! ]!g!h!)g!h;'S! ];'S;=`!#e<%lO! ]V!)lX_QOY! ]YZ$WZz! ]z{! w{!e! ]!e!f!*X!f;'S! ];'S;=`!#e<%lO! ]V!*`VVR_QOY! ]YZ$WZz! ]z{! w{;'S! ];'S;=`!#e<%lO! ]V!*zX_QOY! ]YZ$WZz! ]z{! w{!k! ]!k!l!+g!l;'S! ];'S;=`!#e<%lO! ]V!+lX_QOY! ]YZ$WZz! ]z{! w{!i! ]!i!j!,X!j;'S! ];'S;=`!#e<%lO! ]V!,^X_QOY! ]YZ$WZz! ]z{! w{!t! ]!t!u!,y!u;'S! ];'S;=`!#e<%lO! ]V!-OX_QOY! ]YZ$WZz! ]z{! w{!c! ]!c!d!-k!d;'S! ];'S;=`!#e<%lO! ]V!-pX_QOY! ]YZ$WZz! ]z{! w{!v! ]!v!w!.]!w;'S! ];'S;=`!#e<%lO! ]V!.bX_QOY! ]YZ$WZz! ]z{! w{!g! ]!g!h!*X!h;'S! ];'S;=`!#e<%lO! ]V!/SX_QOY! ]YZ$WZz! ]z{! w{!w! ]!w!x!/o!x;'S! ];'S;=`!#e<%lO! ]V!/tX_QOY! ]YZ$WZz! ]z{! w{!g! ]!g!h!0a!h;'S! ];'S;=`!#e<%lO! ]V!0fX_QOY! ]YZ$WZz! ]z{! w{!t! ]!t!u!1R!u;'S! ];'S;=`!#e<%lO! ]V!1WX_QOY! ]YZ$WZz! ]z{! w{!{! ]!{!|!*X!|;'S! ];'S;=`!#e<%lO! ]V!1xZ_QOY! ]YZ$WZz! ]z{! w{!c! ]!c!d!2k!d!g! ]!g!h!3}!h;'S! ];'S;=`!#e<%lO! ]V!2pX_QOY! ]YZ$WZz! ]z{! w{!d! ]!d!e!3]!e;'S! ];'S;=`!#e<%lO! ]V!3bX_QOY! ]YZ$WZz! ]z{! w{!n! ]!n!o!.]!o;'S! ];'S;=`!#e<%lO! ]V!4SX_QOY! ]YZ$WZz! ]z{! w{!u! ]!u!v!4o!v;'S! ];'S;=`!#e<%lO! ]V!4tX_QOY! ]YZ$WZz! ]z{! w{!v! ]!v!w!5a!w;'S! ];'S;=`!#e<%lO! ]V!5fX_QOY! ]YZ$WZz! ]z{! w{!f! ]!f!g!6R!g;'S! ];'S;=`!#e<%lO! ]V!6WX_QOY! ]YZ$WZz! ]z{! w{!c! ]!c!d!6s!d;'S! ];'S;=`!#e<%lO! ]V!6xX_QOY! ]YZ$WZz! ]z{! w{!v! ]!v!w!7e!w;'S! ];'S;=`!#e<%lO! ]V!7jX_QOY! ]YZ$WZz! ]z{! w{!c! ]!c!d!*X!d;'S! ];'S;=`!#e<%lO! ]V!8^`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!zNY!z!{!9`!{;'SNY;'S;=`!&p<%lONYV!9g`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!gNY!g!h!:i!h;'SNY;'S;=`!&p<%lONYV!:p`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!eNY!e!f!;r!f;'SNY;'S;=`!&p<%lONYV!;{^VR_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{;'SNY;'S;=`!&p<%lONYV!=O`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!kNY!k!l!>Q!l;'SNY;'S;=`!&p<%lONYV!>X`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!iNY!i!j!?Z!j;'SNY;'S;=`!&p<%lONYV!?b`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!tNY!t!u!@d!u;'SNY;'S;=`!&p<%lONYV!@k`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!cNY!c!d!Am!d;'SNY;'S;=`!&p<%lONYV!At`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!vNY!v!w!Bv!w;'SNY;'S;=`!&p<%lONYV!B}`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!gNY!g!h!;r!h;'SNY;'S;=`!&p<%lONYV!DW`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!wNY!w!x!EY!x;'SNY;'S;=`!&p<%lONYV!Ea`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!gNY!g!h!Fc!h;'SNY;'S;=`!&p<%lONYV!Fj`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!tNY!t!u!Gl!u;'SNY;'S;=`!&p<%lONYV!Gs`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!{NY!{!|!;r!|;'SNY;'S;=`!&p<%lONYV!H|b_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!cNY!c!d!JU!d!gNY!g!h!Lh!h;'SNY;'S;=`!&p<%lONYV!J]`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!dNY!d!e!K_!e;'SNY;'S;=`!&p<%lONYV!Kf`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!nNY!n!o!Bv!o;'SNY;'S;=`!&p<%lONYV!Lo`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!uNY!u!v!Mq!v;'SNY;'S;=`!&p<%lONYV!Mx`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!vNY!v!w!Nz!w;'SNY;'S;=`!&p<%lONYV# R`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!fNY!f!g#!T!g;'SNY;'S;=`!&p<%lONYV#![`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!cNY!c!d##^!d;'SNY;'S;=`!&p<%lONYV##e`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!vNY!v!w#$g!w;'SNY;'S;=`!&p<%lONYV#$n`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!cNY!c!d!;r!d;'SNY;'S;=`!&p<%lONYV#%u][QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{#&n{;'S#Y;'S;=`'q<%lO#YV#&sh[QOX#(_XY#,`YZ#,`Z]#(_]^#)]^p#(_pq#,`qt#(_tu#)]uz#(_z{#*f{!P#(_!P!Q#9m!Q!g#(_!g!h#>j!h!o#(_!o!p#Bv!p!s#(_!s!t#I`!t!v#(_!v!w#Mp!w;'S#(_;'S;=`#,Y<%lO#(_U#(d][QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{;'S#(_;'S;=`#,Y<%lO#(_U#)`TOz#)]z{#)o{;'S#)];'S;=`#*`<%lO#)]U#)rVOz#)]z{#)o{!P#)]!P!Q#*X!Q;'S#)];'S;=`#*`<%lO#)]U#*`O^QmSU#*cP;=`<%l#)]U#*k_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!P#(_!P!Q#+j!Q;'S#(_;'S;=`#,Y<%lO#(_U#+sV^QmS[QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PU#,]P;=`<%l#(_V#,cbOX#)]XY#,`YZ#,`Zp#)]pq#,`qz#)]z{#)o{!g#)]!g!h#-k!h!o#)]!o!p#/k!p!s#)]!s!t#2q!t!v#)]!v!w#4u!w;'S#)];'S;=`#*`<%lO#)]V#-nVOz#)]z{#)o{!z#)]!z!{#.T!{;'S#)];'S;=`#*`<%lO#)]V#.WVOz#)]z{#)o{!g#)]!g!h#.m!h;'S#)];'S;=`#*`<%lO#)]V#.pVOz#)]z{#)o{!e#)]!e!f#/V!f;'S#)];'S;=`#*`<%lO#)]V#/[TRROz#)]z{#)o{;'S#)];'S;=`#*`<%lO#)]V#/nVOz#)]z{#)o{!k#)]!k!l#0T!l;'S#)];'S;=`#*`<%lO#)]V#0WVOz#)]z{#)o{!i#)]!i!j#0m!j;'S#)];'S;=`#*`<%lO#)]V#0pVOz#)]z{#)o{!t#)]!t!u#1V!u;'S#)];'S;=`#*`<%lO#)]V#1YVOz#)]z{#)o{!c#)]!c!d#1o!d;'S#)];'S;=`#*`<%lO#)]V#1rVOz#)]z{#)o{!v#)]!v!w#2X!w;'S#)];'S;=`#*`<%lO#)]V#2[VOz#)]z{#)o{!g#)]!g!h#/V!h;'S#)];'S;=`#*`<%lO#)]V#2tVOz#)]z{#)o{!w#)]!w!x#3Z!x;'S#)];'S;=`#*`<%lO#)]V#3^VOz#)]z{#)o{!g#)]!g!h#3s!h;'S#)];'S;=`#*`<%lO#)]V#3vVOz#)]z{#)o{!t#)]!t!u#4]!u;'S#)];'S;=`#*`<%lO#)]V#4`VOz#)]z{#)o{!{#)]!{!|#/V!|;'S#)];'S;=`#*`<%lO#)]V#4xXOz#)]z{#)o{!c#)]!c!d#5e!d!g#)]!g!h#6g!h;'S#)];'S;=`#*`<%lO#)]V#5hVOz#)]z{#)o{!d#)]!d!e#5}!e;'S#)];'S;=`#*`<%lO#)]V#6QVOz#)]z{#)o{!n#)]!n!o#2X!o;'S#)];'S;=`#*`<%lO#)]V#6jVOz#)]z{#)o{!u#)]!u!v#7P!v;'S#)];'S;=`#*`<%lO#)]V#7SVOz#)]z{#)o{!v#)]!v!w#7i!w;'S#)];'S;=`#*`<%lO#)]V#7lVOz#)]z{#)o{!f#)]!f!g#8R!g;'S#)];'S;=`#*`<%lO#)]V#8UVOz#)]z{#)o{!c#)]!c!d#8k!d;'S#)];'S;=`#*`<%lO#)]V#8nVOz#)]z{#)o{!v#)]!v!w#9T!w;'S#)];'S;=`#*`<%lO#)]V#9WVOz#)]z{#)o{!c#)]!c!d#/V!d;'S#)];'S;=`#*`<%lO#)]U#9t]mS[QOX#:mXZ#;kZ]#:m]^#;k^p#:mpq#;kqt#:mtu#;kuz#:mz{#<r{;'S#:m;'S;=`#>d<%lO#:mQ#:r][QOX#:mXZ#;kZ]#:m]^#;k^p#:mpq#;kqt#:mtu#;kuz#:mz{#<r{;'S#:m;'S;=`#>d<%lO#:mQ#;nTOz#;kz{#;}{;'S#;k;'S;=`#<l<%lO#;kQ#<QVOz#;kz{#;}{!P#;k!P!Q#<g!Q;'S#;k;'S;=`#<l<%lO#;kQ#<lO^QQ#<oP;=`<%l#;kQ#<w_[QOX#:mXZ#;kZ]#:m]^#;k^p#:mpq#;kqt#:mtu#;kuz#:mz{#<r{!P#:m!P!Q#=v!Q;'S#:m;'S;=`#>d<%lO#:mQ#=}V^Q[QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQ#>gP;=`<%l#:mV#>o_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!z#(_!z!{#?n!{;'S#(_;'S;=`#,Y<%lO#(_V#?s_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!g#(_!g!h#@r!h;'S#(_;'S;=`#,Y<%lO#(_V#@w_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!e#(_!e!f#Av!f;'S#(_;'S;=`#,Y<%lO#(_V#A}]RR[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{;'S#(_;'S;=`#,Y<%lO#(_V#B{_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!k#(_!k!l#Cz!l;'S#(_;'S;=`#,Y<%lO#(_V#DP_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!i#(_!i!j#EO!j;'S#(_;'S;=`#,Y<%lO#(_V#ET_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!t#(_!t!u#FS!u;'S#(_;'S;=`#,Y<%lO#(_V#FX_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!c#(_!c!d#GW!d;'S#(_;'S;=`#,Y<%lO#(_V#G]_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!v#(_!v!w#H[!w;'S#(_;'S;=`#,Y<%lO#(_V#Ha_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!g#(_!g!h#Av!h;'S#(_;'S;=`#,Y<%lO#(_V#Ie_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!w#(_!w!x#Jd!x;'S#(_;'S;=`#,Y<%lO#(_V#Ji_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!g#(_!g!h#Kh!h;'S#(_;'S;=`#,Y<%lO#(_V#Km_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!t#(_!t!u#Ll!u;'S#(_;'S;=`#,Y<%lO#(_V#Lq_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!{#(_!{!|#Av!|;'S#(_;'S;=`#,Y<%lO#(_V#Mua[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!c#(_!c!d#Nz!d!g#(_!g!h$#S!h;'S#(_;'S;=`#,Y<%lO#(_V$ P_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!d#(_!d!e$!O!e;'S#(_;'S;=`#,Y<%lO#(_V$!T_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!n#(_!n!o#H[!o;'S#(_;'S;=`#,Y<%lO#(_V$#X_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!u#(_!u!v$$W!v;'S#(_;'S;=`#,Y<%lO#(_V$$]_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!v#(_!v!w$%[!w;'S#(_;'S;=`#,Y<%lO#(_V$%a_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!f#(_!f!g$&`!g;'S#(_;'S;=`#,Y<%lO#(_V$&e_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!c#(_!c!d$'d!d;'S#(_;'S;=`#,Y<%lO#(_V$'i_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!v#(_!v!w$(h!w;'S#(_;'S;=`#,Y<%lO#(_V$(m_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!c#(_!c!d#Av!d;'S#(_;'S;=`#,Y<%lO#(_V$)seSP[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!Q#Y!Q![$)l![!c#Y!c!}$)l!}#R#Y#R#S$)l#S#T#Y#T#o$)l#o;'S#Y;'S;=`'q<%lO#Y~$+Ze[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!Q#Y!Q![$,l![!c#Y!c!}$,l!}#R#Y#R#S$,l#S#T#Y#T#o$,l#o;'S#Y;'S;=`'q<%lO#Y~$,seT~[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!Q#Y!Q![$,l![!c#Y!c!}$,l!}#R#Y#R#S$,l#S#T#Y#T#o$,l#o;'S#Y;'S;=`'q<%lO#YV$.]]pP[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YU$/Z_[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{#g#Y#g#h$0Y#h;'S#Y;'S;=`'q<%lO#YU$0__[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{#X#Y#X#Y$1^#Y;'S#Y;'S;=`'q<%lO#YU$1c_[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{#h#Y#h#i$2b#i;'S#Y;'S;=`'q<%lO#YU$2i]oQ[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#Y",
|
|
726
|
+
repeatNodeCount: 6,
|
|
727
|
+
tokenData: "$KR~RqOX#YXY'wYZ(iZ]#Y]^$W^p#Ypq'wqr#Yrs(}st#Ytu6^uw#Ywx9[xz#Yz{%_{}#Y}!OKi!O!P#Y!P!Q#2P!Q![$A]![!]$Bu!]!_#Y!_!`$Eu!`!b#Y!b!c$Fu!c!}$A]!}#R#Y#R#S$A]#S#T#Y#T#o$A]#o;'S#Y;'S;=`'q<%lO#YU#_]_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YS$ZTOz$Wz{$j{;'S$W;'S;=`%X<%lO$WS$mVOz$Wz{$j{!P$W!P!Q%S!Q;'S$W;'S;=`%X<%lO$WS%XOnSS%[P;=`<%l$WU%d__QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!P#Y!P!Q&c!Q;'S#Y;'S;=`'q<%lO#YU&jVnS_QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQ'UV_QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQ'nP;=`<%l'PU'tP;=`<%l#Y~'|Xj~OX$WXY'wYp$Wpq'wqz$Wz{$j{;'S$W;'S;=`%X<%lO$W~(nTk~Oz$Wz{$j{;'S$W;'S;=`%X<%lO$WU)Sb_QOX(}XY*[YZ$WZ](}]^*[^p(}pq*[qr(}rs.yst(}tu*[uz(}z{/y{#O(}#O#P5V#P;'S(};'S;=`6W<%lO(}U*_ZOY*[YZ$WZr*[rs+Qsz*[z{+f{#O*[#O#P.Z#P;'S*[;'S;=`.s<%lO*[U+VT]QOz$Wz{$j{;'S$W;'S;=`%X<%lO$WU+i]OY*[YZ$WZr*[rs+Qsz*[z{+f{!P*[!P!Q,b!Q#O*[#O#P.Z#P;'S*[;'S;=`.s<%lO*[U,gWnSOY-PZr-Prs-ls#O-P#O#P-q#P;'S-P;'S;=`.T<%lO-PQ-SWOY-PZr-Prs-ls#O-P#O#P-q#P;'S-P;'S;=`.T<%lO-PQ-qO]QQ-tTOY-PYZ-PZ;'S-P;'S;=`.T<%lO-PQ.WP;=`<%l-PU.^VOY*[YZ*[Zz*[z{+f{;'S*[;'S;=`.s<%lO*[U.vP;=`<%l*[U/Q]]Q_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YU0Od_QOX(}XY*[YZ$WZ](}]^*[^p(}pq*[qr(}rs.yst(}tu*[uz(}z{/y{!P(}!P!Q1^!Q#O(}#O#P5V#P;'S(};'S;=`6W<%lO(}U1e_nS_QOX2dXY-PZ]2d]^-P^p2dpq-Pqr2drs3hst2dtu-Pu#O2d#O#P4U#P;'S2d;'S;=`5P<%lO2dQ2i__QOX2dXY-PZ]2d]^-P^p2dpq-Pqr2drs3hst2dtu-Pu#O2d#O#P4U#P;'S2d;'S;=`5P<%lO2dQ3oV]Q_QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQ4Z[_QOX2dXY-PYZ-PZ]2d]^-P^p2dpq-Pqt2dtu-Pu;'S2d;'S;=`5P<%lO2dQ5SP;=`<%l2dU5[^_QOX(}XY*[YZ*[Z](}]^*[^p(}pq*[qt(}tu*[uz(}z{/y{;'S(};'S;=`6W<%lO(}U6ZP;=`<%l(}U6cV_QOz$Wz{$j{#o$W#o#p6x#p;'S$W;'S;=`%X<%lO$WU6{]Oz$Wz{$j{!Q$W!Q![7t![!c$W!c!}7t!}#R$W#R#S7t#S#T$W#T#o7t#o;'S$W;'S;=`%X<%lO$WU7w_Oz$Wz{$j{!Q$W!Q![7t![!c$W!c!}7t!}#R$W#R#S7t#S#T$W#T#o7t#o#q$W#q#r8v#r;'S$W;'S;=`%X<%lO$WU8{TaQOz$Wz{$j{;'S$W;'S;=`%X<%lO$WU9ab_QOX9[XY:iYZ$WZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxAVxz9[z{BV{#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[U:lZOY:iYZ$WZw:iwx;_xz:iz{;s{#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iU;dT^QOz$Wz{$j{;'S$W;'S;=`%X<%lO$WU;v]OY:iYZ$WZw:iwx;_xz:iz{;s{!P:i!P!Q<o!Q#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iU<tWnSOY=^Zw=^wx=yx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q=aWOY=^Zw=^wx=yx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q>OO^QQ>RXOY=^YZ=^Zw=^wx>nx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q>sW^QOY=^Zw=^wx=yx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q?`P;=`<%l=^U?fZOY:iYZ:iZw:iwx@Xxz:iz{;s{#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iU@^Z^QOY:iYZ$WZw:iwx;_xz:iz{;s{#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iUASP;=`<%l:iUA^]^Q_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YUB[d_QOX9[XY:iYZ$WZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxAVxz9[z{BV{!P9[!P!QCj!Q#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[UCq_nS_QOXDpXY=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxEtx#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQDu__QOXDpXY=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxEtx#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQE{V^Q_QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQFg`_QOXDpXY=^YZ=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxGix#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQGp_^Q_QOXDpXY=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxEtx#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQHrP;=`<%lDpUHzb_QOX9[XY:iYZ:iZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxJSxz9[z{BV{#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[UJZb^Q_QOX9[XY:iYZ$WZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxAVxz9[z{BV{#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[UKfP;=`<%l9[VKn__QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{}#Y}!OLm!O;'S#Y;'S;=`'q<%lO#YVLthQR_QOXN`XY!&|YZ$WZ]N`]^! c^pN`pq!&|qtN`tu! cuzN`z{!#q{!dN`!d!e!=`!e!gN`!g!h!Ft!h!oN`!o!p!Ja!p!sN`!s!t#!`!t!vN`!v!w#'U!w;'SN`;'S;=`!&v<%lON`VNg^QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{;'SN`;'S;=`!&v<%lON`V! hVQROY! cYZ$WZz! cz{! }{;'S! c;'S;=`!#k<%lO! cV!!SXQROY! cYZ$WZz! cz{! }{!P! c!P!Q!!o!Q;'S! c;'S;=`!#k<%lO! cV!!vSnSQROY!#SZ;'S!#S;'S;=`!#e<%lO!#SR!#XSQROY!#SZ;'S!#S;'S;=`!#e<%lO!#SR!#hP;=`<%l!#SV!#nP;=`<%l! cV!#x`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!PN`!P!Q!$z!Q;'SN`;'S;=`!&v<%lON`V!%TZnSQR_QOX!%vXY!#SZ]!%v]^!#S^p!%vpq!#Sqt!%vtu!#Su;'S!%v;'S;=`!&p<%lO!%vR!%}ZQR_QOX!%vXY!#SZ]!%v]^!#S^p!%vpq!#Sqt!%vtu!#Su;'S!%v;'S;=`!&p<%lO!%vR!&sP;=`<%l!%vV!&yP;=`<%lN`V!'RdQROX! cXY!&|YZ$WZp! cpq!&|qz! cz{! }{!d! c!d!e!(a!e!g! c!g!h!.l!h!o! c!o!p!0p!p!s! c!s!t!4W!t!v! c!v!w!6|!w;'S! c;'S;=`!#k<%lO! cV!(fXQROY! cYZ$WZz! cz{! }{!c! c!c!d!)R!d;'S! c;'S;=`!#k<%lO! cV!)WXQROY! cYZ$WZz! cz{! }{!u! c!u!v!)s!v;'S! c;'S;=`!#k<%lO! cV!)xXQROY! cYZ$WZz! cz{! }{!g! c!g!h!*e!h;'S! c;'S;=`!#k<%lO! cV!*jXQROY! cYZ$WZz! cz{! }{!n! c!n!o!+V!o;'S! c;'S;=`!#k<%lO! cV!+[XQROY! cYZ$WZz! cz{! }{!k! c!k!l!+w!l;'S! c;'S;=`!#k<%lO! cV!+|XQROY! cYZ$WZz! cz{! }{!p! c!p!q!,i!q;'S! c;'S;=`!#k<%lO! cV!,nXQROY! cYZ$WZz! cz{! }{!g! c!g!h!-Z!h;'S! c;'S;=`!#k<%lO! cV!-`YQROX! cXY!.OYZ$WZp! cpq!.Oqz! cz{! }{;'S! c;'S;=`!#k<%lO! cV!.VVYRQROY! cYZ$WZz! cz{! }{;'S! c;'S;=`!#k<%lO! cV!.qXQROY! cYZ$WZz! cz{! }{!z! c!z!{!/^!{;'S! c;'S;=`!#k<%lO! cV!/cXQROY! cYZ$WZz! cz{! }{!g! c!g!h!0O!h;'S! c;'S;=`!#k<%lO! cV!0TXQROY! cYZ$WZz! cz{! }{!e! c!e!f!-Z!f;'S! c;'S;=`!#k<%lO! cV!0uXQROY! cYZ$WZz! cz{! }{!k! c!k!l!1b!l;'S! c;'S;=`!#k<%lO! cV!1gXQROY! cYZ$WZz! cz{! }{!i! c!i!j!2S!j;'S! c;'S;=`!#k<%lO! cV!2XXQROY! cYZ$WZz! cz{! }{!t! c!t!u!2t!u;'S! c;'S;=`!#k<%lO! cV!2yXQROY! cYZ$WZz! cz{! }{!c! c!c!d!3f!d;'S! c;'S;=`!#k<%lO! cV!3kXQROY! cYZ$WZz! cz{! }{!v! c!v!w!,i!w;'S! c;'S;=`!#k<%lO! cV!4]XQROY! cYZ$WZz! cz{! }{!w! c!w!x!4x!x;'S! c;'S;=`!#k<%lO! cV!4}XQROY! cYZ$WZz! cz{! }{!g! c!g!h!5j!h;'S! c;'S;=`!#k<%lO! cV!5oXQROY! cYZ$WZz! cz{! }{!t! c!t!u!6[!u;'S! c;'S;=`!#k<%lO! cV!6aXQROY! cYZ$WZz! cz{! }{!{! c!{!|!-Z!|;'S! c;'S;=`!#k<%lO! cV!7RZQROY! cYZ$WZz! cz{! }{!c! c!c!d!7t!d!g! c!g!h!9W!h;'S! c;'S;=`!#k<%lO! cV!7yXQROY! cYZ$WZz! cz{! }{!d! c!d!e!8f!e;'S! c;'S;=`!#k<%lO! cV!8kXQROY! cYZ$WZz! cz{! }{!n! c!n!o!,i!o;'S! c;'S;=`!#k<%lO! cV!9]XQROY! cYZ$WZz! cz{! }{!u! c!u!v!9x!v;'S! c;'S;=`!#k<%lO! cV!9}XQROY! cYZ$WZz! cz{! }{!v! c!v!w!:j!w;'S! c;'S;=`!#k<%lO! cV!:oXQROY! cYZ$WZz! cz{! }{!f! c!f!g!;[!g;'S! c;'S;=`!#k<%lO! cV!;aXQROY! cYZ$WZz! cz{! }{!c! c!c!d!;|!d;'S! c;'S;=`!#k<%lO! cV!<RXQROY! cYZ$WZz! cz{! }{!v! c!v!w!<n!w;'S! c;'S;=`!#k<%lO! cV!<sXQROY! cYZ$WZz! cz{! }{!c! c!c!d!-Z!d;'S! c;'S;=`!#k<%lO! cV!=g`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!cN`!c!d!>i!d;'SN`;'S;=`!&v<%lON`V!>p`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!uN`!u!v!?r!v;'SN`;'S;=`!&v<%lON`V!?y`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!gN`!g!h!@{!h;'SN`;'S;=`!&v<%lON`V!AS`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!nN`!n!o!BU!o;'SN`;'S;=`!&v<%lON`V!B]`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!kN`!k!l!C_!l;'SN`;'S;=`!&v<%lON`V!Cf`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!pN`!p!q!Dh!q;'SN`;'S;=`!&v<%lON`V!Do`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!gN`!g!h!Eq!h;'SN`;'S;=`!&v<%lON`V!Ex^QR_QOXN`XY!.OYZ$WZ]N`]^! c^pN`pq!.OqtN`tu! cuzN`z{!#q{;'SN`;'S;=`!&v<%lON`V!F{`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!zN`!z!{!G}!{;'SN`;'S;=`!&v<%lON`V!HU`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!gN`!g!h!IW!h;'SN`;'S;=`!&v<%lON`V!I_`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!eN`!e!f!Eq!f;'SN`;'S;=`!&v<%lON`V!Jh`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!kN`!k!l!Kj!l;'SN`;'S;=`!&v<%lON`V!Kq`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!iN`!i!j!Ls!j;'SN`;'S;=`!&v<%lON`V!Lz`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!tN`!t!u!M|!u;'SN`;'S;=`!&v<%lON`V!NT`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!cN`!c!d# V!d;'SN`;'S;=`!&v<%lON`V# ^`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!vN`!v!w!Dh!w;'SN`;'S;=`!&v<%lON`V#!g`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!wN`!w!x##i!x;'SN`;'S;=`!&v<%lON`V##p`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!gN`!g!h#$r!h;'SN`;'S;=`!&v<%lON`V#$y`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!tN`!t!u#%{!u;'SN`;'S;=`!&v<%lON`V#&S`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!{N`!{!|!Eq!|;'SN`;'S;=`!&v<%lON`V#']bQR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!cN`!c!d#(e!d!gN`!g!h#*w!h;'SN`;'S;=`!&v<%lON`V#(l`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!dN`!d!e#)n!e;'SN`;'S;=`!&v<%lON`V#)u`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!nN`!n!o!Dh!o;'SN`;'S;=`!&v<%lON`V#+O`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!uN`!u!v#,Q!v;'SN`;'S;=`!&v<%lON`V#,X`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!vN`!v!w#-Z!w;'SN`;'S;=`!&v<%lON`V#-b`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!fN`!f!g#.d!g;'SN`;'S;=`!&v<%lON`V#.k`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!cN`!c!d#/m!d;'SN`;'S;=`!&v<%lON`V#/t`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!vN`!v!w#0v!w;'SN`;'S;=`!&v<%lON`V#0}`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!cN`!c!d!Eq!d;'SN`;'S;=`!&v<%lON`V#2U]_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{#2}{;'S#Y;'S;=`'q<%lO#YV#3Sj_QOX#4tXY#8uYZ#8uZ]#4t]^#5r^p#4tpq#8uqt#4ttu#5ruz#4tz{#6{{!P#4t!P!Q#Js!Q!d#4t!d!e$ p!e!g#4t!g!h$*_!h!o#4t!o!p$-k!p!s#4t!s!t$3P!t!v#4t!v!w$7a!w;'S#4t;'S;=`#8o<%lO#4tV#4y]_QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{;'S#4t;'S;=`#8o<%lO#4tV#5uTOz#5rz{#6U{;'S#5r;'S;=`#6u<%lO#5rV#6XVOz#5rz{#6U{!P#5r!P!Q#6n!Q;'S#5r;'S;=`#6u<%lO#5rV#6uORRnSV#6xP;=`<%l#5rV#7Q__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!P#4t!P!Q#8P!Q;'S#4t;'S;=`#8o<%lO#4tV#8YVRRnS_QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PV#8rP;=`<%l#4tV#8xdOX#5rXY#8uYZ#8uZp#5rpq#8uqz#5rz{#6U{!d#5r!d!e#:W!e!g#5r!g!h#?o!h!o#5r!o!p#AZ!p!s#5r!s!t#Cw!t!v#5r!v!w#E{!w;'S#5r;'S;=`#6u<%lO#5rV#:ZVOz#5rz{#6U{!c#5r!c!d#:p!d;'S#5r;'S;=`#6u<%lO#5rV#:sVOz#5rz{#6U{!u#5r!u!v#;Y!v;'S#5r;'S;=`#6u<%lO#5rV#;]VOz#5rz{#6U{!g#5r!g!h#;r!h;'S#5r;'S;=`#6u<%lO#5rV#;uVOz#5rz{#6U{!n#5r!n!o#<[!o;'S#5r;'S;=`#6u<%lO#5rV#<_VOz#5rz{#6U{!k#5r!k!l#<t!l;'S#5r;'S;=`#6u<%lO#5rV#<wVOz#5rz{#6U{!p#5r!p!q#=^!q;'S#5r;'S;=`#6u<%lO#5rV#=aVOz#5rz{#6U{!g#5r!g!h#=v!h;'S#5r;'S;=`#6u<%lO#5rV#=yYOX#5rXY#>iYZ#?ZZp#5rpq#>iqz#5rz{#6U{;'S#5r;'S;=`#6u<%lO#5rV#>nXUROX#5rXY#>iYp#5rpq#>iqz#5rz{#6U{;'S#5r;'S;=`#6u<%lO#5rV#?`TUROz#5rz{#6U{;'S#5r;'S;=`#6u<%lO#5rV#?rVOz#5rz{#6U{!z#5r!z!{#@X!{;'S#5r;'S;=`#6u<%lO#5rV#@[VOz#5rz{#6U{!g#5r!g!h#@q!h;'S#5r;'S;=`#6u<%lO#5rV#@tVOz#5rz{#6U{!e#5r!e!f#=v!f;'S#5r;'S;=`#6u<%lO#5rV#A^VOz#5rz{#6U{!k#5r!k!l#As!l;'S#5r;'S;=`#6u<%lO#5rV#AvVOz#5rz{#6U{!i#5r!i!j#B]!j;'S#5r;'S;=`#6u<%lO#5rV#B`VOz#5rz{#6U{!t#5r!t!u#Bu!u;'S#5r;'S;=`#6u<%lO#5rV#BxVOz#5rz{#6U{!c#5r!c!d#C_!d;'S#5r;'S;=`#6u<%lO#5rV#CbVOz#5rz{#6U{!v#5r!v!w#=^!w;'S#5r;'S;=`#6u<%lO#5rV#CzVOz#5rz{#6U{!w#5r!w!x#Da!x;'S#5r;'S;=`#6u<%lO#5rV#DdVOz#5rz{#6U{!g#5r!g!h#Dy!h;'S#5r;'S;=`#6u<%lO#5rV#D|VOz#5rz{#6U{!t#5r!t!u#Ec!u;'S#5r;'S;=`#6u<%lO#5rV#EfVOz#5rz{#6U{!{#5r!{!|#=v!|;'S#5r;'S;=`#6u<%lO#5rV#FOXOz#5rz{#6U{!c#5r!c!d#Fk!d!g#5r!g!h#Gm!h;'S#5r;'S;=`#6u<%lO#5rV#FnVOz#5rz{#6U{!d#5r!d!e#GT!e;'S#5r;'S;=`#6u<%lO#5rV#GWVOz#5rz{#6U{!n#5r!n!o#=^!o;'S#5r;'S;=`#6u<%lO#5rV#GpVOz#5rz{#6U{!u#5r!u!v#HV!v;'S#5r;'S;=`#6u<%lO#5rV#HYVOz#5rz{#6U{!v#5r!v!w#Ho!w;'S#5r;'S;=`#6u<%lO#5rV#HrVOz#5rz{#6U{!f#5r!f!g#IX!g;'S#5r;'S;=`#6u<%lO#5rV#I[VOz#5rz{#6U{!c#5r!c!d#Iq!d;'S#5r;'S;=`#6u<%lO#5rV#ItVOz#5rz{#6U{!v#5r!v!w#JZ!w;'S#5r;'S;=`#6u<%lO#5rV#J^VOz#5rz{#6U{!c#5r!c!d#=v!d;'S#5r;'S;=`#6u<%lO#5rV#Jz]nS_QOX#KsXZ#LqZ]#Ks]^#Lq^p#Kspq#Lqqt#Kstu#Lquz#Ksz{#Mx{;'S#Ks;'S;=`$ j<%lO#KsR#Kx]_QOX#KsXZ#LqZ]#Ks]^#Lq^p#Kspq#Lqqt#Kstu#Lquz#Ksz{#Mx{;'S#Ks;'S;=`$ j<%lO#KsR#LtTOz#Lqz{#MT{;'S#Lq;'S;=`#Mr<%lO#LqR#MWVOz#Lqz{#MT{!P#Lq!P!Q#Mm!Q;'S#Lq;'S;=`#Mr<%lO#LqR#MrORRR#MuP;=`<%l#LqR#M}__QOX#KsXZ#LqZ]#Ks]^#Lq^p#Kspq#Lqqt#Kstu#Lquz#Ksz{#Mx{!P#Ks!P!Q#N|!Q;'S#Ks;'S;=`$ j<%lO#KsR$ TVRR_QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PR$ mP;=`<%l#KsV$ u__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!c#4t!c!d$!t!d;'S#4t;'S;=`#8o<%lO#4tV$!y__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!u#4t!u!v$#x!v;'S#4t;'S;=`#8o<%lO#4tV$#}__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!g#4t!g!h$$|!h;'S#4t;'S;=`#8o<%lO#4tV$%R__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!n#4t!n!o$&Q!o;'S#4t;'S;=`#8o<%lO#4tV$&V__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!k#4t!k!l$'U!l;'S#4t;'S;=`#8o<%lO#4tV$'Z__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!p#4t!p!q$(Y!q;'S#4t;'S;=`#8o<%lO#4tV$(___QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!g#4t!g!h$)^!h;'S#4t;'S;=`#8o<%lO#4tV$)c^_QOX#4tXY#>iYZ#?ZZ]#4t]^#5r^p#4tpq#>iqt#4ttu#5ruz#4tz{#6{{;'S#4t;'S;=`#8o<%lO#4tV$*d__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!z#4t!z!{$+c!{;'S#4t;'S;=`#8o<%lO#4tV$+h__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!g#4t!g!h$,g!h;'S#4t;'S;=`#8o<%lO#4tV$,l__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!e#4t!e!f$)^!f;'S#4t;'S;=`#8o<%lO#4tV$-p__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!k#4t!k!l$.o!l;'S#4t;'S;=`#8o<%lO#4tV$.t__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!i#4t!i!j$/s!j;'S#4t;'S;=`#8o<%lO#4tV$/x__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!t#4t!t!u$0w!u;'S#4t;'S;=`#8o<%lO#4tV$0|__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!c#4t!c!d$1{!d;'S#4t;'S;=`#8o<%lO#4tV$2Q__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!v#4t!v!w$(Y!w;'S#4t;'S;=`#8o<%lO#4tV$3U__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!w#4t!w!x$4T!x;'S#4t;'S;=`#8o<%lO#4tV$4Y__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!g#4t!g!h$5X!h;'S#4t;'S;=`#8o<%lO#4tV$5^__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!t#4t!t!u$6]!u;'S#4t;'S;=`#8o<%lO#4tV$6b__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!{#4t!{!|$)^!|;'S#4t;'S;=`#8o<%lO#4tV$7fa_QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!c#4t!c!d$8k!d!g#4t!g!h$:s!h;'S#4t;'S;=`#8o<%lO#4tV$8p__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!d#4t!d!e$9o!e;'S#4t;'S;=`#8o<%lO#4tV$9t__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!n#4t!n!o$(Y!o;'S#4t;'S;=`#8o<%lO#4tV$:x__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!u#4t!u!v$;w!v;'S#4t;'S;=`#8o<%lO#4tV$;|__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!v#4t!v!w$<{!w;'S#4t;'S;=`#8o<%lO#4tV$=Q__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!f#4t!f!g$>P!g;'S#4t;'S;=`#8o<%lO#4tV$>U__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!c#4t!c!d$?T!d;'S#4t;'S;=`#8o<%lO#4tV$?Y__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!v#4t!v!w$@X!w;'S#4t;'S;=`#8o<%lO#4tV$@^__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!c#4t!c!d$)^!d;'S#4t;'S;=`#8o<%lO#4tV$AdeVP_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!Q#Y!Q![$A]![!c#Y!c!}$A]!}#R#Y#R#S$A]#S#T#Y#T#o$A]#o;'S#Y;'S;=`'q<%lO#Y~$Bze_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!Q#Y!Q![$D]![!c#Y!c!}$D]!}#R#Y#R#S$D]#S#T#Y#T#o$D]#o;'S#Y;'S;=`'q<%lO#Y~$DdeW~_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!Q#Y!Q![$D]![!c#Y!c!}$D]!}#R#Y#R#S$D]#S#T#Y#T#o$D]#o;'S#Y;'S;=`'q<%lO#YV$E|]qP_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YU$Fz__QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{#g#Y#g#h$Gy#h;'S#Y;'S;=`'q<%lO#YU$HO__QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{#X#Y#X#Y$H}#Y;'S#Y;'S;=`'q<%lO#YU$IS__QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{#h#Y#h#i$JR#i;'S#Y;'S;=`'q<%lO#YU$JY]pQ_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#Y",
|
|
727
728
|
tokenizers: [
|
|
728
729
|
0,
|
|
729
730
|
1,
|
|
730
731
|
2
|
|
731
732
|
],
|
|
732
733
|
topRules: { "File": [0, 1] },
|
|
733
|
-
tokenPrec:
|
|
734
|
+
tokenPrec: 262
|
|
734
735
|
});
|
|
735
736
|
//#endregion
|
|
736
737
|
//#region src/sql-query.ts
|
|
@@ -801,8 +802,11 @@ var SQLQuery = class {
|
|
|
801
802
|
get isTestdata() {
|
|
802
803
|
return this.type === "TESTDATA";
|
|
803
804
|
}
|
|
805
|
+
get isBaseline() {
|
|
806
|
+
return this.type === "BASELINE";
|
|
807
|
+
}
|
|
804
808
|
get skipGenerateFunction() {
|
|
805
|
-
return this.isTestdata || this.isMigrate || this.id.startsWith("_");
|
|
809
|
+
return this.isTestdata || this.isMigrate || this.isBaseline || this.id.startsWith("_");
|
|
806
810
|
}
|
|
807
811
|
validateVariables() {
|
|
808
812
|
const missingVars = [];
|
|
@@ -858,7 +862,21 @@ function parseSQLQueries(filePath, extraVariables) {
|
|
|
858
862
|
function nodeStr(node) {
|
|
859
863
|
return content.slice(node.from, node.to);
|
|
860
864
|
}
|
|
861
|
-
const
|
|
865
|
+
const namesByKind = /* @__PURE__ */ new Map();
|
|
866
|
+
const namespaceFor = (kind) => kind === "MIGRATE" || kind === "TESTDATA" || kind === "BASELINE" ? kind : "METHOD";
|
|
867
|
+
const checkDuplicate = (kind, n) => {
|
|
868
|
+
const ns = namespaceFor(kind);
|
|
869
|
+
let set = namesByKind.get(ns);
|
|
870
|
+
if (!set) {
|
|
871
|
+
set = /* @__PURE__ */ new Set();
|
|
872
|
+
namesByKind.set(ns, set);
|
|
873
|
+
}
|
|
874
|
+
if (set.has(n)) {
|
|
875
|
+
const label = ns === "METHOD" ? "query/table name" : `${ns} name`;
|
|
876
|
+
throw SqgError.inFile(`Duplicate ${label} '${n}'`, "DUPLICATE_QUERY", filePath, { suggestion: `Rename one of the ${ns === "METHOD" ? "queries/tables" : ns.toLowerCase() + " blocks"} to have a unique name` });
|
|
877
|
+
}
|
|
878
|
+
set.add(n);
|
|
879
|
+
};
|
|
862
880
|
do
|
|
863
881
|
if (cursor.name === "QueryBlock") {
|
|
864
882
|
const annotationNode = cursor.node.getChild("LineCommentStartSpecial") ?? cursor.node.getChild("BlockCommentStartSpecial");
|
|
@@ -1008,8 +1026,7 @@ function parseSQLQueries(filePath, extraVariables) {
|
|
|
1008
1026
|
if (match) includeColumns.push(...match[1].split(",").map((c) => c.trim()));
|
|
1009
1027
|
}
|
|
1010
1028
|
const table = new TableInfo(filePath, name, tableName, includeColumns, hasAppender, annotationLine);
|
|
1011
|
-
|
|
1012
|
-
queryNames.add(name);
|
|
1029
|
+
checkDuplicate("TABLE", name);
|
|
1013
1030
|
tables.push(table);
|
|
1014
1031
|
consola.debug(`Added table: ${name} -> ${tableName} (appender: ${hasAppender})`);
|
|
1015
1032
|
continue;
|
|
@@ -1024,8 +1041,7 @@ function parseSQLQueries(filePath, extraVariables) {
|
|
|
1024
1041
|
config
|
|
1025
1042
|
});
|
|
1026
1043
|
const query = new SQLQuery(filePath, name, sqlContentStr, sql.toSqlWithAnonymousPlaceholders(), sql.toSqlWithNamedPlaceholders(), sql.toSqlWithPositionalPlaceholders(), queryType, isOne, isPluck, isBatch, variables, config, annotationLine);
|
|
1027
|
-
|
|
1028
|
-
queryNames.add(name);
|
|
1044
|
+
checkDuplicate(queryType, name);
|
|
1029
1045
|
queries.push(query);
|
|
1030
1046
|
consola.debug(`Added query: ${name} (${queryType})`);
|
|
1031
1047
|
}
|
|
@@ -1041,8 +1057,14 @@ function parseSQLQueries(filePath, extraVariables) {
|
|
|
1041
1057
|
//#endregion
|
|
1042
1058
|
//#region src/db/types.ts
|
|
1043
1059
|
async function initializeDatabase(queries, execQueries, reporter) {
|
|
1060
|
+
const baselineQueries = queries.filter((q) => q.isBaseline);
|
|
1061
|
+
for (const query of baselineQueries) try {
|
|
1062
|
+
await execQueries(query);
|
|
1063
|
+
} catch (error) {
|
|
1064
|
+
consola.error("Failed to apply baseline:" + error.message + " when running query:\n\n " + query.rawQuery);
|
|
1065
|
+
throw error;
|
|
1066
|
+
}
|
|
1044
1067
|
const migrationQueries = queries.filter((q) => q.isMigrate);
|
|
1045
|
-
sortBy(migrationQueries, [(q) => Number(q.id.split("_")[1])]);
|
|
1046
1068
|
for (const query of migrationQueries) try {
|
|
1047
1069
|
await execQueries(query);
|
|
1048
1070
|
} catch (error) {
|
|
@@ -1056,7 +1078,7 @@ async function initializeDatabase(queries, execQueries, reporter) {
|
|
|
1056
1078
|
consola.error("Failed to initialize testdata:" + error.message + " when running query:\n\n " + query.rawQuery);
|
|
1057
1079
|
throw error;
|
|
1058
1080
|
}
|
|
1059
|
-
if (migrationQueries.length + testdataQueries.length === 0) consola.warn("No migration or testdata queries found");
|
|
1081
|
+
if (baselineQueries.length + migrationQueries.length + testdataQueries.length === 0) consola.warn("No baseline, migration or testdata queries found");
|
|
1060
1082
|
reporter?.onDatabaseInitialized?.();
|
|
1061
1083
|
}
|
|
1062
1084
|
//#endregion
|
|
@@ -1514,6 +1536,45 @@ const sqlite = new class {
|
|
|
1514
1536
|
close() {
|
|
1515
1537
|
this.db.close();
|
|
1516
1538
|
}
|
|
1539
|
+
/**
|
|
1540
|
+
* For columns where SQLite's columns() returned no type (any expression),
|
|
1541
|
+
* probe the storage class via typeof() against a single row of the query.
|
|
1542
|
+
* Returns the SQL type and observed nullability per column (in the same
|
|
1543
|
+
* order as `info`). When the type cannot be inferred (no rows, or the
|
|
1544
|
+
* sampled value was NULL), `type` is "" and the caller should fall back
|
|
1545
|
+
* to "unknown" + nullable.
|
|
1546
|
+
*/
|
|
1547
|
+
probeExpressionTypes(db, sql, params, info) {
|
|
1548
|
+
const result = info.map(() => ({
|
|
1549
|
+
type: "",
|
|
1550
|
+
nullable: true
|
|
1551
|
+
}));
|
|
1552
|
+
if (!info.some((c) => !c.type)) return result;
|
|
1553
|
+
const typeofMap = {
|
|
1554
|
+
integer: "INTEGER",
|
|
1555
|
+
real: "REAL",
|
|
1556
|
+
text: "TEXT",
|
|
1557
|
+
blob: "BLOB"
|
|
1558
|
+
};
|
|
1559
|
+
const aliased = info.map((c, i) => `"${c.name.replace(/"/g, "\"\"")}" AS sqg_c${i}`).join(", ");
|
|
1560
|
+
const probeSql = `SELECT ${info.map((_, i) => `typeof(sqg_c${i}) AS sqg_t${i}`).join(", ")} FROM (SELECT ${aliased} FROM (${sql.replace(/[\s;]+$/, "")})) LIMIT 1`;
|
|
1561
|
+
try {
|
|
1562
|
+
const row = db.prepare(probeSql).get(...params);
|
|
1563
|
+
if (!row) return result;
|
|
1564
|
+
for (let i = 0; i < info.length; i++) {
|
|
1565
|
+
const t = row[`sqg_t${i}`];
|
|
1566
|
+
if (!t) continue;
|
|
1567
|
+
if (t === "null") continue;
|
|
1568
|
+
if (typeofMap[t]) result[i] = {
|
|
1569
|
+
type: typeofMap[t],
|
|
1570
|
+
nullable: false
|
|
1571
|
+
};
|
|
1572
|
+
}
|
|
1573
|
+
} catch (e) {
|
|
1574
|
+
consola.debug(`typeof() probe failed; falling back to 'unknown': ${e.message}`);
|
|
1575
|
+
}
|
|
1576
|
+
return result;
|
|
1577
|
+
}
|
|
1517
1578
|
getTableInfo(db, table) {
|
|
1518
1579
|
const info = db.pragma(`table_info('${table}')`);
|
|
1519
1580
|
return new Map(info.map((col) => [col.name, col]));
|
|
@@ -1523,24 +1584,27 @@ const sqlite = new class {
|
|
|
1523
1584
|
try {
|
|
1524
1585
|
consola.debug("Query:", statement.sql);
|
|
1525
1586
|
const stmt = db.prepare(statement.sql);
|
|
1587
|
+
const params = statement.parameters.map((p) => p.value);
|
|
1526
1588
|
if (query.isQuery) {
|
|
1527
1589
|
const info = stmt.columns();
|
|
1528
1590
|
const tables = new Set(info.map((col) => col.table).filter(isNotNil));
|
|
1529
1591
|
const data = new Map(Array.from(tables).map((table) => [table, this.getTableInfo(db, table)]));
|
|
1530
|
-
|
|
1592
|
+
const probedTypes = this.probeExpressionTypes(db, statement.sql, params, info);
|
|
1593
|
+
query.columns = info.map((col, i) => {
|
|
1531
1594
|
const colInfo = col.table ? data.get(col.table)?.get(col.name) : null;
|
|
1595
|
+
const probed = probedTypes[i];
|
|
1532
1596
|
return {
|
|
1533
1597
|
name: col.name,
|
|
1534
|
-
type: col.type || "unknown",
|
|
1535
|
-
nullable: colInfo?.pk === 0 && colInfo?.notnull === 0
|
|
1598
|
+
type: col.type || probed.type || "unknown",
|
|
1599
|
+
nullable: col.table ? colInfo?.pk === 0 && colInfo?.notnull === 0 : probed.nullable
|
|
1536
1600
|
};
|
|
1537
1601
|
});
|
|
1538
1602
|
}
|
|
1539
1603
|
if (query.isQuery) {
|
|
1540
|
-
if (query.isOne) return stmt.get(...
|
|
1541
|
-
return stmt.all(...
|
|
1604
|
+
if (query.isOne) return stmt.get(...params);
|
|
1605
|
+
return stmt.all(...params);
|
|
1542
1606
|
}
|
|
1543
|
-
return stmt.run(...
|
|
1607
|
+
return stmt.run(...params);
|
|
1544
1608
|
} catch (error) {
|
|
1545
1609
|
consola.error(`Failed to execute query '${query.id}' in ${query.filename}:\n ${statement.sql} \n ${statement.parameters.map((p) => p.value).join(", ")}`, error);
|
|
1546
1610
|
throw error;
|
|
@@ -1820,6 +1884,18 @@ var JavaTypeMapper = class JavaTypeMapper extends TypeMapper {
|
|
|
1820
1884
|
* Generates TypeScript interfaces for struct types and handles DuckDB's complex types.
|
|
1821
1885
|
*/
|
|
1822
1886
|
var TypeScriptTypeMapper = class extends TypeMapper {
|
|
1887
|
+
/**
|
|
1888
|
+
* SQLite drivers (better-sqlite3, node:sqlite, libsql, turso) return JS
|
|
1889
|
+
* `number` for INTEGER/BIGINT columns by default. They each offer a "safe
|
|
1890
|
+
* integers" mode that returns `bigint` instead — opt in via
|
|
1891
|
+
* `config.safeIntegers: true` in the yaml. Other engines (DuckDB,
|
|
1892
|
+
* PostgreSQL) continue to use `bigint` for BIGINT/INT8.
|
|
1893
|
+
*/
|
|
1894
|
+
constructor(engine, safeIntegers = false) {
|
|
1895
|
+
super();
|
|
1896
|
+
this.engine = engine;
|
|
1897
|
+
this.safeIntegers = safeIntegers;
|
|
1898
|
+
}
|
|
1823
1899
|
/**
|
|
1824
1900
|
* Returns the TypeScript type name for a given SQL column.
|
|
1825
1901
|
* Overrides base to handle DuckDB's map type with key-value entry arrays.
|
|
@@ -1886,7 +1962,8 @@ var TypeScriptTypeMapper = class extends TypeMapper {
|
|
|
1886
1962
|
};
|
|
1887
1963
|
mapPrimitiveType(type, nullable) {
|
|
1888
1964
|
const upperType = type.toUpperCase();
|
|
1889
|
-
|
|
1965
|
+
let mappedType = this.typeMap[upperType];
|
|
1966
|
+
if (mappedType === "bigint" && this.engine === "sqlite" && !this.safeIntegers && (upperType === "BIGINT" || upperType === "INT8")) mappedType = "number";
|
|
1890
1967
|
if (mappedType) return nullable ? `${mappedType} | null` : mappedType;
|
|
1891
1968
|
if (upperType.startsWith("_")) {
|
|
1892
1969
|
const baseType = upperType.substring(1);
|
|
@@ -2189,7 +2266,10 @@ var JavaGenerator = class extends BaseGenerator {
|
|
|
2189
2266
|
}).join(" + ");
|
|
2190
2267
|
}
|
|
2191
2268
|
readColumn(column, index, path) {
|
|
2192
|
-
|
|
2269
|
+
const idx = index + 1;
|
|
2270
|
+
const readExpr = jdbcReadExpression(column, idx, this.typeMapper);
|
|
2271
|
+
if (readExpr !== null) return readExpr;
|
|
2272
|
+
return this.typeMapper.parseValue(column, `rs.getObject(${idx})`, path);
|
|
2193
2273
|
}
|
|
2194
2274
|
async beforeGenerate(_projectDir, _gen, _queries, _tables) {
|
|
2195
2275
|
Handlebars.registerHelper("isDuckDB", () => this.engine === "duckdb");
|
|
@@ -2298,6 +2378,39 @@ var JavaGenerator = class extends BaseGenerator {
|
|
|
2298
2378
|
}
|
|
2299
2379
|
}
|
|
2300
2380
|
};
|
|
2381
|
+
const JDBC_GETTER_MAP = {
|
|
2382
|
+
String: (i) => `rs.getString(${i})`,
|
|
2383
|
+
"byte[]": (i) => `rs.getBytes(${i})`,
|
|
2384
|
+
BigDecimal: (i) => `rs.getBigDecimal(${i})`,
|
|
2385
|
+
Integer: (i) => `rs.getObject(${i}, Integer.class)`,
|
|
2386
|
+
Long: (i) => `rs.getObject(${i}, Long.class)`,
|
|
2387
|
+
Short: (i) => `rs.getObject(${i}, Short.class)`,
|
|
2388
|
+
Byte: (i) => `rs.getObject(${i}, Byte.class)`,
|
|
2389
|
+
Boolean: (i) => `rs.getObject(${i}, Boolean.class)`,
|
|
2390
|
+
Double: (i) => `rs.getObject(${i}, Double.class)`,
|
|
2391
|
+
Float: (i) => `rs.getObject(${i}, Float.class)`
|
|
2392
|
+
};
|
|
2393
|
+
const OPAQUE_SQL_TYPES = new Set([
|
|
2394
|
+
"TIMESTAMP",
|
|
2395
|
+
"DATETIME",
|
|
2396
|
+
"TIMESTAMPTZ",
|
|
2397
|
+
"TIMESTAMP WITH TIME ZONE",
|
|
2398
|
+
"TIMESTAMP_S",
|
|
2399
|
+
"TIMESTAMP_MS",
|
|
2400
|
+
"TIMESTAMP_NS",
|
|
2401
|
+
"DATE",
|
|
2402
|
+
"TIME",
|
|
2403
|
+
"TIME WITH TIME ZONE",
|
|
2404
|
+
"JSON",
|
|
2405
|
+
"JSONB"
|
|
2406
|
+
]);
|
|
2407
|
+
function jdbcReadExpression(column, index, typeMapper) {
|
|
2408
|
+
if (column.type instanceof EnumType || column.type instanceof ListType || column.type instanceof StructType) return null;
|
|
2409
|
+
const upperType = column.type?.toString().toUpperCase() ?? "";
|
|
2410
|
+
if (OPAQUE_SQL_TYPES.has(upperType) || upperType.startsWith("_")) return null;
|
|
2411
|
+
const getter = JDBC_GETTER_MAP[typeMapper.getTypeName(column)];
|
|
2412
|
+
return getter ? getter(index) : null;
|
|
2413
|
+
}
|
|
2301
2414
|
const JDBC_SETTER_MAP = {
|
|
2302
2415
|
String: {
|
|
2303
2416
|
setter: "setString",
|
|
@@ -2626,8 +2739,8 @@ function resolveElementType(baseType) {
|
|
|
2626
2739
|
}[baseType.toString().toUpperCase()] || "VARCHAR";
|
|
2627
2740
|
}
|
|
2628
2741
|
var TsGenerator = class extends BaseGenerator {
|
|
2629
|
-
constructor(template) {
|
|
2630
|
-
super(template, new TypeScriptTypeMapper());
|
|
2742
|
+
constructor(template, engine) {
|
|
2743
|
+
super(template, new TypeScriptTypeMapper(engine));
|
|
2631
2744
|
}
|
|
2632
2745
|
getFunctionName(id) {
|
|
2633
2746
|
return camelCase(id);
|
|
@@ -2641,7 +2754,8 @@ var TsGenerator = class extends BaseGenerator {
|
|
|
2641
2754
|
getClassName(name) {
|
|
2642
2755
|
return pascalCase(name);
|
|
2643
2756
|
}
|
|
2644
|
-
async beforeGenerate(_projectDir,
|
|
2757
|
+
async beforeGenerate(_projectDir, gen, _queries, _tables) {
|
|
2758
|
+
if (this.typeMapper instanceof TypeScriptTypeMapper) this.typeMapper.safeIntegers = !!gen.config?.safeIntegers;
|
|
2645
2759
|
Handlebars.registerHelper("quote", (value) => this.quote(value));
|
|
2646
2760
|
Handlebars.registerHelper("appendMethod", (column) => {
|
|
2647
2761
|
if (column.type instanceof ListType) return "List";
|
|
@@ -2807,7 +2921,7 @@ var TsGenerator = class extends BaseGenerator {
|
|
|
2807
2921
|
*/
|
|
2808
2922
|
var TsDuckDBGenerator = class extends TsGenerator {
|
|
2809
2923
|
constructor(template) {
|
|
2810
|
-
super(template);
|
|
2924
|
+
super(template, "duckdb");
|
|
2811
2925
|
}
|
|
2812
2926
|
supportsAppenders(_engine) {
|
|
2813
2927
|
return true;
|
|
@@ -2886,7 +3000,7 @@ function getGenerator(generator) {
|
|
|
2886
3000
|
case "typescript/better-sqlite3":
|
|
2887
3001
|
case "typescript/node":
|
|
2888
3002
|
case "typescript/libsql":
|
|
2889
|
-
case "typescript/turso": return new TsGenerator(`templates/${info.template}
|
|
3003
|
+
case "typescript/turso": return new TsGenerator(`templates/${info.template}`, info.engine);
|
|
2890
3004
|
case "typescript/node-api": return new TsDuckDBGenerator(`templates/${info.template}`);
|
|
2891
3005
|
case "java/jdbc": return new JavaGenerator(`templates/${info.template}`, info.engine);
|
|
2892
3006
|
case "java/arrow": return new JavaDuckDBArrowGenerator(`templates/${info.template}`);
|
|
@@ -3418,7 +3532,7 @@ async function processProject(projectPath, ui) {
|
|
|
3418
3532
|
//#region src/mcp-server.ts
|
|
3419
3533
|
const server = new Server({
|
|
3420
3534
|
name: "sqg-mcp",
|
|
3421
|
-
version: process.env.npm_package_version ?? "0.
|
|
3535
|
+
version: process.env.npm_package_version ?? "0.18.0"
|
|
3422
3536
|
}, { capabilities: {
|
|
3423
3537
|
tools: {},
|
|
3424
3538
|
resources: {}
|
|
@@ -3489,8 +3603,8 @@ async function generateCode(sql, generator) {
|
|
|
3489
3603
|
const GENERATE_CODE_DESCRIPTION = `Generate type-safe database access code from annotated SQL queries.
|
|
3490
3604
|
|
|
3491
3605
|
CRITICAL REQUIREMENTS:
|
|
3492
|
-
1. MIGRATE statements MUST come BEFORE any QUERY/EXEC that references those tables
|
|
3493
|
-
2. Each query block needs a unique name
|
|
3606
|
+
1. MIGRATE (or BASELINE) statements MUST come BEFORE any QUERY/EXEC that references those tables. MIGRATE blocks run in source order; the name is an arbitrary identifier (e.g. "1", "add_email"), not a sort key.
|
|
3607
|
+
2. Each query block needs a unique name within its kind (QUERY/EXEC/TABLE share one namespace; MIGRATE/BASELINE/TESTDATA each have their own)
|
|
3494
3608
|
3. Parameters require @set declarations with sample values
|
|
3495
3609
|
|
|
3496
3610
|
${SQL_SYNTAX_REFERENCE}
|
|
@@ -3883,7 +3997,7 @@ function formatMs(ms) {
|
|
|
3883
3997
|
}
|
|
3884
3998
|
//#endregion
|
|
3885
3999
|
//#region src/sqg.ts
|
|
3886
|
-
const version = process.env.npm_package_version ?? "0.
|
|
4000
|
+
const version = process.env.npm_package_version ?? "0.18.0";
|
|
3887
4001
|
updateNotifier({ pkg: {
|
|
3888
4002
|
name: "@sqg/sqg",
|
|
3889
4003
|
version
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// {{generatedComment}}
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// biome-ignore-all lint: generated code
|
|
2
4
|
import type { Database, RunResult, Statement } from 'better-sqlite3';
|
|
3
5
|
|
|
4
6
|
export class {{className}} {
|
|
@@ -106,7 +108,7 @@ any
|
|
|
106
108
|
{{#if isOne~}}
|
|
107
109
|
{{> rowType}} | undefined
|
|
108
110
|
{{~else~}}
|
|
109
|
-
{{> rowType}}[]
|
|
111
|
+
({{> rowType}})[]
|
|
110
112
|
{{/if~}}
|
|
111
113
|
{{~else~}}
|
|
112
114
|
RunResult
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// {{generatedComment}}
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// biome-ignore-all lint: generated code
|
|
2
4
|
import type { Client, InArgs } from '@libsql/client';
|
|
3
5
|
|
|
4
6
|
interface RunResult {
|
|
@@ -109,7 +111,7 @@ unknown
|
|
|
109
111
|
{{#if isOne~}}
|
|
110
112
|
{{> rowType}} | undefined
|
|
111
113
|
{{~else~}}
|
|
112
|
-
{{> rowType}}[]
|
|
114
|
+
({{> rowType}})[]
|
|
113
115
|
{{/if~}}
|
|
114
116
|
{{~else~}}
|
|
115
117
|
RunResult
|
|
@@ -129,7 +131,7 @@ return (result.rows as unknown[])[0] as {{> rowType}} | undefined;
|
|
|
129
131
|
{{#if isPluck}}
|
|
130
132
|
return result.rows.map(row => Object.values(row)[0] as {{> rowType}});
|
|
131
133
|
{{else}}
|
|
132
|
-
return (result.rows as unknown[]) as {{> rowType}}[];
|
|
134
|
+
return (result.rows as unknown[]) as ({{> rowType}})[];
|
|
133
135
|
{{/if}}
|
|
134
136
|
{{/if}}
|
|
135
137
|
{{else}}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// {{generatedComment}}
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// biome-ignore-all lint: generated code
|
|
2
4
|
import { DatabaseSync, StatementSync } from 'node:sqlite';
|
|
3
5
|
|
|
4
6
|
interface RunResult {
|
|
@@ -111,7 +113,7 @@ any
|
|
|
111
113
|
{{#if isOne~}}
|
|
112
114
|
{{> rowType}} | undefined
|
|
113
115
|
{{~else~}}
|
|
114
|
-
{{> rowType}}[]
|
|
116
|
+
({{> rowType}})[]
|
|
115
117
|
{{/if~}}
|
|
116
118
|
{{~else~}}
|
|
117
119
|
RunResult
|
|
@@ -132,7 +134,7 @@ return stmt.get({{> params}}) as {{> rowType}} | undefined;
|
|
|
132
134
|
const rows = stmt.all({{> params}}) as Record<string, {{> rowType}}>[];
|
|
133
135
|
return rows.map(row => Object.values(row)[0]);
|
|
134
136
|
{{else}}
|
|
135
|
-
return stmt.all({{> params}}) as {{> rowType}}[];
|
|
137
|
+
return stmt.all({{> params}}) as ({{> rowType}})[];
|
|
136
138
|
{{/if}}
|
|
137
139
|
{{/if}}
|
|
138
140
|
{{else}}
|
package/dist/templates/turso.hbs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// {{generatedComment}}
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// biome-ignore-all lint: generated code
|
|
2
4
|
import { connect, type Database } from '@tursodatabase/database';
|
|
3
5
|
|
|
4
6
|
interface RunResult {
|
|
@@ -112,7 +114,7 @@ unknown
|
|
|
112
114
|
{{#if isOne~}}
|
|
113
115
|
{{> rowType}} | undefined
|
|
114
116
|
{{~else~}}
|
|
115
|
-
{{> rowType}}[]
|
|
117
|
+
({{> rowType}})[]
|
|
116
118
|
{{/if~}}
|
|
117
119
|
{{~else~}}
|
|
118
120
|
RunResult
|
|
@@ -133,7 +135,7 @@ return await stmt.get({{> params}}) as {{> rowType}} | undefined;
|
|
|
133
135
|
const rows = await stmt.all({{> params}}) as Record<string, {{> rowType}}>[];
|
|
134
136
|
return rows.map(row => Object.values(row)[0]);
|
|
135
137
|
{{else}}
|
|
136
|
-
return await stmt.all({{> params}}) as {{> rowType}}[];
|
|
138
|
+
return await stmt.all({{> params}}) as ({{> rowType}})[];
|
|
137
139
|
{{/if}}
|
|
138
140
|
{{/if}}
|
|
139
141
|
{{else}}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// {{generatedComment}}
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// biome-ignore-all lint: generated code
|
|
2
4
|
import { DuckDBListType, listValue, VARCHAR, INTEGER, BIGINT, DOUBLE, FLOAT, BOOLEAN, SMALLINT, TINYINT, type DuckDBConnection, type DuckDBMaterializedResult, type DuckDBAppender, type DuckDBDateValue, type DuckDBTimeValue, type DuckDBTimestampValue, type DuckDBBlobValue, type DuckDBValue } from "@duckdb/node-api";
|
|
3
5
|
|
|
4
6
|
export class {{className}} {
|