toridb 1.0.6 → 1.0.8

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/README.md CHANGED
@@ -1,130 +1,60 @@
1
- # ToriDB Client for Node.js
1
+ # ToriDB Node.js SDK
2
2
 
3
- A powerful, high-performance Node.js client for **ToriDB**. Supports Key-Value operations, NoSQL data structures, and a fluent SQL-like relational API.
3
+ A powerful, type-safe client for ToriDB.
4
4
 
5
- ## 📚 Documentation
6
-
7
- You can read the basic documentation here: [**/doc**](./doc/)
8
-
9
- or more detailed here: [**DeepWiki**](https://deepwiki.com/UnSetSoft/ToriDB)
5
+ ## Features
6
+ - **Unified Client**: Handles Key-Value, NoSQL, SQL, and Vector operations.
7
+ - **Connection Pooling**: Automatically manages socket connections.
8
+ - **Query Builder**: Fluent API for SQL-like queries.
9
+ - **Transaction Support**: ACID-compliant transaction management.
10
10
 
11
11
  ## Installation
12
-
13
12
  ```bash
14
- npm install toridb
15
- ```
16
-
17
- ## Quick Start
18
-
19
- ```javascript
20
- const { ToriDB } = require('toridb');
21
-
22
- // Initialize client (use environment variables for sensitive data!)
23
- // Format: db://user:pass+host:port
24
- const db = new ToriDB(process.env.TORIDB_URI || "db://default:secret+127.0.0.1:8569");
25
-
26
- async function main() {
27
- await db.connect();
28
-
29
- // Simple Key-Value
30
- await db.set("greeting", "Hello ToriDB!");
31
- const val = await db.get("greeting");
32
- console.log(val); // "Hello ToriDB!"
33
-
34
- await db.disconnect();
35
- }
36
-
37
- main();
38
- ```
39
-
40
- ## Features
41
-
42
- ### 🔑 Key-Value & TTL
43
- ```javascript
44
- await db.set("user:1", { name: "Alice" });
45
- await db.get("user:1");
46
-
47
- await db.setEx("session:temp", "data", 3600); // 1 hour TTL
48
- await db.ttl("session:temp");
49
-
50
- await db.incr("page_views");
51
- await db.decr("inventory:stock");
13
+ npm install toridb-client
52
14
  ```
53
15
 
54
- ### 📦 NoSQL Data Structures
55
-
56
- #### Lists
57
- ```javascript
58
- const myList = db.list("tasks");
59
- await myList.push("task1", "task2");
60
- await myList.pop();
61
- const items = await myList.range(0, -1);
62
- ```
16
+ ## detailed Usage
63
17
 
64
- #### Sets
18
+ ### Connection
65
19
  ```javascript
66
- const mySet = db.setOf("tags");
67
- await mySet.add("nodejs", "database");
68
- const members = await mySet.members();
20
+ const { ToriDB } = require('toridb-client');
21
+ const db = new ToriDB("db://default:secret+127.0.0.1:8569/my_db");
22
+ await db.connect();
69
23
  ```
70
24
 
71
- #### Hashes
25
+ ### Vector Search (AI)
72
26
  ```javascript
73
- const myHash = db.hash("user:meta");
74
- await myHash.set("theme", "dark");
75
- const theme = await myHash.get("theme");
76
- const all = await myHash.all();
27
+ // Search for 5 nearest neighbors
28
+ const results = await db.table("items")
29
+ .search("embedding_col", [0.1, 0.2, 0.9], 5);
77
30
  ```
78
31
 
79
- #### JSON
32
+ ### Transactions
80
33
  ```javascript
81
- const myJson = db.json("config");
82
- await myJson.set("$", { port: 8080, debug: true });
83
- const port = await myJson.get("$.port");
34
+ await db.beginTransaction();
35
+ try {
36
+ await db.set("account:A", 50);
37
+ await db.set("account:B", 150);
38
+ await db.commit();
39
+ } catch (e) {
40
+ await db.rollback();
41
+ }
84
42
  ```
85
43
 
86
- ### 📊 Relational-like Modeling & SQL Queries
87
-
88
- Define blueprints and use a fluent API to perform complex queries.
89
-
44
+ ### SQL & Relations
90
45
  ```javascript
91
- const users = db.model("users", new ToriDB.Blueprint({
92
- id: "int primary key",
93
- name: "text",
94
- age: "int",
95
- data: "json"
96
- }));
97
-
98
- // Create
99
- await users.create({ id: 1, name: "Tori", age: 5, data: { breed: "Shiba" } });
100
-
101
- // Fluent Querying
102
- const results = await users.find({ age: { ">": 3 } })
103
- .select(["name", "age"])
104
- .orderBy("age", "desc")
46
+ // Query Builder
47
+ const users = await db.table("users")
48
+ .select(["id", "name"])
49
+ .where({ "age": { ">": 18 } })
50
+ .orderBy("created_at", "DESC")
105
51
  .limit(10)
106
52
  .execute();
107
-
108
- // Direct Table Query
109
- const logs = db.table("system_logs").find({ level: "error" }).execute();
110
53
  ```
111
54
 
112
- ### 🛡️ System & ACL Management
55
+ ### Key-Value & NoSQL
113
56
  ```javascript
114
- // ACL (Never hardcode passwords!)
115
- // WARNING: "@all" grants full administrative access.
116
- await db.system.acl.createUser("admin_user", process.env.DB_PASS, ["@all"]);
117
-
118
- // Create a restricted user instead
119
- await db.system.acl.createUser("app_user", process.env.APP_PASS, ["+get", "+set"]);
120
-
121
- // Cluster & Replication
122
- await db.system.cluster.info();
123
- await db.system.replication.slaveOf("192.168.1.10", 8569);
124
-
125
- // Server Info
126
- const info = await db.system.info();
57
+ await db.set("key", "value");
58
+ await db.list("mylist").push("item1", "item2");
59
+ await db.json("config").set("theme", "dark"); // JSON Path support
127
60
  ```
128
-
129
- ## License
130
- UPL-1.0
@@ -1,12 +1,20 @@
1
1
  import net from 'net';
2
2
 
3
3
  /**
4
- * Command Compiler: Translates JS Objects and Types to ToriDB DSL
4
+ * Command Compiler: Translates JS Objects and Types to ToriDB DSL (Domain Specific Language).
5
+ * This class handles the conversion of MongoDB-like filter objects and high-level
6
+ * Blueprints into valid server-side SQL/NoSQL commands.
5
7
  */
6
8
  class Compiler {
7
9
  /**
8
- * Translates a JS Object to a ToriDB Filter string.
10
+ * Translates a standard JavaScript Object into a ToriDB Filter string.
11
+ * Supports nested logic ($or, $and) and comparison operators ($gt, $like, etc.).
12
+ *
13
+ * @example
9
14
  * { age: { $gt: 18 }, status: 'active' } -> "age > 18 AND status = 'active'"
15
+ *
16
+ * @param {Object} filter - The filter object to compile.
17
+ * @returns {string} Compiled SQL WHERE clause part.
10
18
  */
11
19
  static compileFilter(filter) {
12
20
  if (!filter || typeof filter !== 'object') return "";
@@ -154,6 +162,7 @@ class RespParser {
154
162
  const content = this.buffer.slice(offset + 1, lineEnd).toString();
155
163
  const bytesBeforeData = lineEnd - offset + 2;
156
164
 
165
+ // RESP Protocol Switch - Based on the first byte indicator
157
166
  switch (prefix) {
158
167
  case 43: // '+' Simple String
159
168
  return { value: content, bytesRead: bytesBeforeData };
@@ -434,6 +443,17 @@ class ToriDB {
434
443
  return this.execute(...s.match(/(?:[^\s"]+|"[^"]*")+/g).map(p => p.replace(/"/g, '')));
435
444
  }
436
445
 
446
+ // --- Transactions ---
447
+ async beginTransaction() { return this.execute("BEGIN"); }
448
+ async commit() { return this.execute("COMMIT"); }
449
+ async rollback() { return this.execute("ROLLBACK"); }
450
+
451
+ /**
452
+ * Sends a PING command to the server.
453
+ * @returns {Promise<string>} PONG on success.
454
+ */
455
+ async ping() { return this.execute("PING"); }
456
+
437
457
  // --- Key-Value & TTL ---
438
458
  /**
439
459
  * Retrieves the value of a key.
@@ -461,7 +481,7 @@ class ToriDB {
461
481
  */
462
482
  async setEx(key, val, ttl) {
463
483
  const s = typeof val === 'object' ? JSON.stringify(val) : String(val);
464
- return this.execute("SETEX", key, s, String(ttl));
484
+ return this.execute("SETEX", key, String(ttl), s);
465
485
  }
466
486
  /**
467
487
  * Gets the remaining time to live of a key.
@@ -469,6 +489,12 @@ class ToriDB {
469
489
  * @returns {Promise<number>} TTL in seconds, or -1 if no TTL, or -2 if key doesn't exist.
470
490
  */
471
491
  async ttl(key) { return this.execute("TTL", key); }
492
+ /**
493
+ * Deletes one or more keys.
494
+ * @param {...string} keys - The keys to delete.
495
+ * @returns {Promise<number>} The number of keys deleted.
496
+ */
497
+ async del(...keys) { return this.execute("DEL", ...keys); }
472
498
 
473
499
  /**
474
500
  * Increments the integer value of a key by one.
@@ -538,6 +564,12 @@ class ToriDB {
538
564
  };
539
565
  }
540
566
 
567
+ /**
568
+ * Executes a background AOF rewrite.
569
+ * @returns {Promise<string>}
570
+ */
571
+ async bgRewriteAof() { return this.system.rewriteAof(); }
572
+
541
573
  /**
542
574
  * Accesses JSON operations for a given key.
543
575
  * @param {string} key - The JSON key.
@@ -577,7 +609,13 @@ class ToriDB {
577
609
  delete: (filter) => this.execute("DELETE", "FROM", name, "WHERE", Compiler.compileFilter(filter)),
578
610
  createIndex: (idxName, col) => this.execute("CREATE", "INDEX", idxName, "ON", name, `(${col})`),
579
611
  addColumn: (col, type) => this.execute("ALTER", "TABLE", name, "ADD", `${col}:${type}`),
580
- dropColumn: (col) => this.execute("ALTER", "TABLE", name, "DROP", col)
612
+ dropColumn: (col) => this.execute("ALTER", "TABLE", name, "DROP", col),
613
+ search: (col, vec, k) => new QueryBuilder(this, name).search(col, vec, k),
614
+ count: () => new QueryBuilder(this, name).count(),
615
+ sum: (col) => new QueryBuilder(this, name).sum(col),
616
+ avg: (col) => new QueryBuilder(this, name).avg(col),
617
+ max: (col) => new QueryBuilder(this, name).max(col),
618
+ min: (col) => new QueryBuilder(this, name).min(col)
581
619
  };
582
620
  }
583
621
 
@@ -587,7 +625,25 @@ class ToriDB {
587
625
  * @returns {Object} An object with a find method.
588
626
  */
589
627
  table(name) {
590
- return { find: (filter) => new QueryBuilder(this, name, filter) };
628
+ return {
629
+ create: (data) => this.execute("INSERT", name, ...Object.values(data).map(v => typeof v === 'object' ? JSON.stringify(v) : String(v))),
630
+ find: (filter) => new QueryBuilder(this, name, filter),
631
+ findById: (id) => new QueryBuilder(this, name, { id }).execute().then(r => r[0] || null),
632
+ update: (filter, data) => {
633
+ const where = Compiler.compileFilter(filter);
634
+ const [col, val] = Object.entries(data)[0];
635
+ const sVal = typeof val === 'object' ? JSON.stringify(val) : String(val);
636
+ return this.execute("UPDATE", name, "SET", col, "=", sVal, "WHERE", where);
637
+ },
638
+ delete: (filter) => this.execute("DELETE", "FROM", name, "WHERE", Compiler.compileFilter(filter)),
639
+ select: (cols) => new QueryBuilder(this, name).select(cols),
640
+ search: (col, vec, k) => new QueryBuilder(this, name).search(col, vec, k),
641
+ count: () => new QueryBuilder(this, name).count(),
642
+ sum: (col) => new QueryBuilder(this, name).sum(col),
643
+ avg: (col) => new QueryBuilder(this, name).avg(col),
644
+ max: (col) => new QueryBuilder(this, name).max(col),
645
+ min: (col) => new QueryBuilder(this, name).min(col)
646
+ };
591
647
  }
592
648
  }
593
649
 
@@ -639,7 +695,8 @@ class SystemManager {
639
695
  return {
640
696
  meet: (h, p) => this.client.execute("CLUSTER", "MEET", h, String(p)),
641
697
  slots: () => this.client.execute("CLUSTER", "SLOTS"),
642
- info: () => this.client.execute("CLUSTER", "INFO")
698
+ info: () => this.client.execute("CLUSTER", "INFO"),
699
+ addSlots: (...slots) => this.client.execute("CLUSTER", "ADDSLOTS", ...slots.map(String))
643
700
  };
644
701
  }
645
702
 
@@ -680,25 +737,45 @@ class QueryBuilder {
680
737
  this.target = target;
681
738
  this.params = {
682
739
  filter: Compiler.compileFilter(filter),
740
+ joins: [],
683
741
  limit: null,
684
742
  offset: null,
685
743
  orderBy: null,
686
744
  groupBy: null,
745
+ having: null,
687
746
  select: "*"
688
747
  };
689
748
  }
690
749
 
691
750
  /**
692
751
  * Specifies the fields to select.
693
- * @param {string|string[]|Object} fields - Fields to select.
752
+ * @param {string|string[]} fields - Fields to select.
694
753
  * @returns {QueryBuilder} This instance for chaining.
695
754
  */
696
755
  select(fields) {
697
756
  if (typeof fields === 'string') this.params.select = fields;
698
757
  else if (Array.isArray(fields)) this.params.select = fields.join(", ");
699
- else if (typeof fields === 'object') {
700
- this.params.select = Object.entries(fields).map(([k, v]) => `${v} AS ${k}`).join(", ");
701
- }
758
+ return this;
759
+ }
760
+
761
+ /**
762
+ * Specifies aggregate functions for selection.
763
+ */
764
+ count() { this.params.select = "COUNT(*)"; return this; }
765
+ sum(col) { this.params.select = `SUM(${col})`; return this; }
766
+ avg(col) { this.params.select = `AVG(${col})`; return this; }
767
+ max(col) { this.params.select = `MAX(${col})`; return this; }
768
+ min(col) { this.params.select = `MIN(${col})`; return this; }
769
+
770
+ /**
771
+ * Adds an INNER JOIN clause.
772
+ * @param {string} table - The table to join.
773
+ * @param {string} onLeft - The left column (e.g. "users.id").
774
+ * @param {string} onRight - The right column (e.g. "orders.user_id").
775
+ * @returns {QueryBuilder} This instance for chaining.
776
+ */
777
+ join(table, onLeft, onRight) {
778
+ this.params.joins.push({ table, onLeft, onRight });
702
779
  return this;
703
780
  }
704
781
 
@@ -731,20 +808,52 @@ class QueryBuilder {
731
808
  */
732
809
  groupBy(cols) { this.params.groupBy = Array.isArray(cols) ? cols.join(", ") : cols; return this; }
733
810
 
811
+ /**
812
+ * Adds a HAVING clause to the query.
813
+ * @param {Object|string} filter - Filter object or raw string.
814
+ * @returns {QueryBuilder} This instance for chaining.
815
+ */
816
+ having(filter) {
817
+ this.params.having = typeof filter === 'string' ? filter : Compiler.compileFilter(filter);
818
+ return this;
819
+ }
820
+
734
821
  /**
735
822
  * Compiles and executes the query.
736
823
  * @returns {Promise<any[]>} The query results.
737
824
  */
738
825
  async execute() {
739
826
  const args = ["SELECT", this.params.select, "FROM", this.target];
827
+
828
+ if (this.params.joins.length > 0) {
829
+ this.params.joins.forEach(j => {
830
+ args.push("JOIN", j.table, "ON", `${j.onLeft} = ${j.onRight}`);
831
+ });
832
+ }
833
+
740
834
  if (this.params.filter) { args.push("WHERE"); args.push(this.params.filter); }
741
835
  if (this.params.groupBy) { args.push("GROUP"); args.push("BY"); args.push(this.params.groupBy); }
836
+ if (this.params.having) { args.push("HAVING"); args.push(this.params.having); }
742
837
  if (this.params.orderBy) { args.push("ORDER"); args.push("BY"); args.push(this.params.orderBy); }
743
838
  if (this.params.limit) { args.push("LIMIT"); args.push(String(this.params.limit)); }
744
839
  if (this.params.offset) { args.push("OFFSET"); args.push(String(this.params.offset)); }
745
840
 
746
841
  return this.client.execute(...args);
747
842
  }
843
+
844
+ /**
845
+ * Performs a vector similarity search.
846
+ * @param {string} column - The vector column name.
847
+ * @param {number[]} vector - The query vector.
848
+ * @param {number} [limit=10] - Number of nearest neighbors to return.
849
+ * @returns {Promise<any[]>}
850
+ */
851
+ async search(column, vector, limit = 10) {
852
+ // Syntax: SEARCH table col [v] k
853
+ // We remove spaces to avoid server-side quoting issues in RESP parsing
854
+ const vecStr = JSON.stringify(vector).replace(/\s+/g, '');
855
+ return this.client.execute("SEARCH", this.target, column, vecStr, String(limit));
856
+ }
748
857
  }
749
858
 
750
859
  export { ToriDB };
@@ -1 +1 @@
1
- {"version":3,"file":"toridb.esm.js","sources":["../src/compiler.js","../src/resp.js","../src/sdk.js"],"sourcesContent":["/**\r\n * Command Compiler: Translates JS Objects and Types to ToriDB DSL\r\n */\r\nclass Compiler {\r\n /**\r\n * Translates a JS Object to a ToriDB Filter string.\r\n * { age: { $gt: 18 }, status: 'active' } -> \"age > 18 AND status = 'active'\"\r\n */\r\n static compileFilter(filter) {\r\n if (!filter || typeof filter !== 'object') return \"\";\r\n\r\n const parts = [];\r\n for (const [key, value] of Object.entries(filter)) {\r\n if (key === '$or' && Array.isArray(value)) {\r\n parts.push(`(${value.map(f => this.compileFilter(f)).join(\" OR \")})`);\r\n } else if (key === '$and' && Array.isArray(value)) {\r\n parts.push(`(${value.map(f => this.compileFilter(f)).join(\" AND \")})`);\r\n } else if (typeof value === 'object' && value !== null) {\r\n // Handle operators: { $gt: 10 }\r\n for (const [op, val] of Object.entries(value)) {\r\n const symbol = this._mapOperator(op);\r\n parts.push(`${key} ${symbol} ${this._escape(val)}`);\r\n }\r\n } else {\r\n // Basic equality\r\n parts.push(`${key} = ${this._escape(value)}`);\r\n }\r\n }\r\n return parts.join(\" AND \");\r\n }\r\n\r\n /**\r\n * Translates a Blueprint definition to ToriDB Table Definition format.\r\n * { id: { type: 'INT', primary: true }, user_id: { type: 'INT', references: 'users.id' } }\r\n * -> \"id:INT:pk user_id:INT:fk(users.id)\"\r\n */\r\n static compileBlueprint(name, blueprint) {\r\n const cols = [];\r\n for (const [colName, config] of Object.entries(blueprint)) {\r\n let type = typeof config === 'string' ? config : config.type;\r\n let pk = (config.primary || config.is_pk) ? \":pk\" : \"\";\r\n let fk = \"\";\r\n\r\n if (config.references) {\r\n const [refTable, refCol] = config.references.split('.');\r\n fk = `:fk(${refTable}.${refCol})`;\r\n }\r\n\r\n // Auto-map JS types if not specified as SQL types\r\n if (type === 'Number') type = 'INT';\r\n if (type === 'String') type = 'STRING';\r\n if (type === 'Object') type = 'JSON';\r\n if (type === 'Boolean') type = 'BOOL';\r\n\r\n cols.push(`${colName}:${type}${pk}${fk}`);\r\n }\r\n return `CREATE TABLE ${name} ${cols.join(\" \")}`;\r\n }\r\n\r\n /**\r\n * Maps MongoDB-style operators to ToriDB SQL operators.\r\n * @param {string} op - The operator to map (e.g., \"$gt\").\r\n * @returns {string} The corresponding SQL operator or the operator itself if no map exists.\r\n * @private\r\n */\r\n static _mapOperator(op) {\r\n const maps = {\r\n '$gt': '>', '$gte': '>=', '$lt': '<', '$lte': '<=',\r\n '$ne': '!=', '$eq': '=', '$like': 'LIKE', '$in': 'IN'\r\n };\r\n return maps[op] || op;\r\n }\r\n\r\n /**\r\n * Escapes values for safe inclusion in ToriDB queries.\r\n * Handles strings, arrays, and objects (JSON).\r\n * @param {any} val - The value to escape.\r\n * @returns {string} The escaped and formatted value string.\r\n * @private\r\n */\r\n static _escape(val) {\r\n if (typeof val === 'string') {\r\n // If it's a list for IN operator, don't wrap the whole thing in quotes\r\n // but wrap individual elements if they are strings.\r\n // However, the server's IN expects (val1,val2)\r\n return `\"${val.replace(/\"/g, '\\\\\"')}\"`;\r\n }\r\n if (Array.isArray(val)) {\r\n return `(${val.map(v => this._escape(v)).join(\",\")})`;\r\n }\r\n if (typeof val === 'object' && val !== null) return `\"${JSON.stringify(val).replace(/\"/g, '\\\\\"')}\"`;\r\n return String(val);\r\n }\r\n}\r\n\r\nexport { Compiler };","/**\r\n * High-Performance RESP (REdis Serialization Protocol) Parser\r\n * Handles Simple Strings, Errors, Integers, Bulk Strings, and Nested Arrays.\r\n */\r\nclass RespParser {\r\n /**\r\n * Initializes or resets the parser state.\r\n */\r\n constructor() {\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Clears the current data buffer.\r\n */\r\n reset() {\r\n this.buffer = Buffer.alloc(0);\r\n }\r\n\r\n /**\r\n * Feeds raw binary data into the parser's buffer.\r\n * @param {Buffer} data - The raw data received from the socket.\r\n */\r\n feed(data) {\r\n this.buffer = Buffer.concat([this.buffer, data]);\r\n }\r\n\r\n /**\r\n * Tries to parse the next complete RESP value from the buffer.\r\n * @returns {any | undefined} The parsed value or undefined if incomplete.\r\n */\r\n parseNext() {\r\n if (this.buffer.length === 0) return undefined;\r\n\r\n const result = this._decode(0);\r\n if (result) {\r\n this.buffer = this.buffer.slice(result.bytesRead);\r\n return result.value;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Decodes a single RESP value from the buffer starting at a given offset.\r\n * Internal recursive method for handling nested arrays and bulk strings.\r\n * @param {number} offset - The buffer offset to start parsing from.\r\n * @returns {Object|null} An object with {value, bytesRead} or null if incomplete.\r\n * @private\r\n */\r\n _decode(offset) {\r\n if (offset >= this.buffer.length) return null;\r\n\r\n const prefix = this.buffer[offset];\r\n const lineEnd = this.buffer.indexOf('\\r\\n', offset);\r\n if (lineEnd === -1) return null;\r\n\r\n const content = this.buffer.slice(offset + 1, lineEnd).toString();\r\n const bytesBeforeData = lineEnd - offset + 2;\r\n\r\n switch (prefix) {\r\n case 43: // '+' Simple String\r\n return { value: content, bytesRead: bytesBeforeData };\r\n\r\n case 45: // '-' Error\r\n return { value: new Error(content), bytesRead: bytesBeforeData };\r\n\r\n case 58: // ':' Integer\r\n return { value: parseInt(content, 10), bytesRead: bytesBeforeData };\r\n\r\n case 36: { // '$' Bulk String\r\n const length = parseInt(content, 10);\r\n if (length === -1) return { value: null, bytesRead: bytesBeforeData };\r\n \r\n const dataEnd = lineEnd + 2 + length;\r\n if (this.buffer.length < dataEnd + 2) return null;\r\n \r\n const value = this.buffer.slice(lineEnd + 2, dataEnd).toString();\r\n // Verify CRLF\r\n if (this.buffer[dataEnd] !== 13 || this.buffer[dataEnd + 1] !== 10) {\r\n throw new Error(\"Invalid Bulk String terminator\");\r\n }\r\n return { value, bytesRead: bytesBeforeData + length + 2 };\r\n }\r\n\r\n case 42: { // '*' Array\r\n const count = parseInt(content, 10);\r\n if (count === -1) return { value: null, bytesRead: bytesBeforeData };\r\n if (count === 0) return { value: [], bytesRead: bytesBeforeData };\r\n\r\n let totalRead = bytesBeforeData;\r\n const items = [];\r\n for (let i = 0; i < count; i++) {\r\n const item = this._decode(offset + totalRead);\r\n if (!item) return null;\r\n items.push(item.value);\r\n totalRead += item.bytesRead;\r\n }\r\n return { value: items, bytesRead: totalRead };\r\n }\r\n\r\n default:\r\n // Attempt to handle unexpected data as a simple string line\r\n return { value: content, bytesRead: bytesBeforeData };\r\n }\r\n }\r\n\r\n /**\r\n * Serializes a command into a RESP Array.\r\n * @param {string[]} args \r\n */\r\n static encode(args) {\r\n let res = `*${args.length}\\r\\n`;\r\n for (const arg of args) {\r\n const s = String(arg);\r\n res += `$${Buffer.byteLength(s)}\\r\\n${s}\\r\\n`;\r\n }\r\n return Buffer.from(res);\r\n }\r\n}\r\n\r\nexport { RespParser };\r\n","import net from 'net';\r\nimport { Compiler } from './compiler.js';\r\nimport { RespParser } from './resp.js';\r\n\r\nclass ToriDBError extends Error {\r\n constructor(message, code, originalError = null) {\r\n super(message);\r\n this.name = \"ToriDBError\";\r\n this.code = code;\r\n this.originalError = originalError;\r\n }\r\n}\r\n\r\n/**\r\n * Main client class for interacting with ToriDB.\r\n * Supports Key-Value, NoSQL structures (List, Set, Hash, JSON), and Relational modeling.\r\n */\r\nclass ToriDB {\r\n /**\r\n * Represents a database schema definition.\r\n */\r\n static Blueprint = class {\r\n /**\r\n * @param {Object} definition - The schema definition object.\r\n */\r\n constructor(definition) {\r\n this.definition = definition;\r\n }\r\n };\r\n\r\n /**\r\n * Creates a new ToriDB client instance.\r\n * @param {string} [uri=\"db://127.0.0.1:8569\"] - Connection URI (e.g., db://user:pass@host:port/db)\r\n */\r\n constructor(uri = \"db://127.0.0.1:8569\") {\r\n this.host = \"127.0.0.1\";\r\n this.port = 8569;\r\n this.user = \"default\";\r\n this.password = null;\r\n this.db = \"data\";\r\n this._dbToSelect = null;\r\n this._parseUri(uri);\r\n\r\n this.parser = new RespParser();\r\n this.socket = new net.Socket();\r\n this.isConnected = false;\r\n this.pendingRequests = [];\r\n\r\n this._setupSocket();\r\n\r\n // Managers\r\n this.system = new SystemManager(this);\r\n }\r\n\r\n /**\r\n * Parses the connection URI.\r\n * @param {string} uri - The connection URI to parse.\r\n * @private\r\n */\r\n _parseUri(uri) {\r\n const regex = /^db:\\/\\/(?:(?:([^:]+):([^@+]+)[@+])?)([^:/\\?]+)(?::(\\d+))?(?:(?:\\/([^?]*))?)?(?:\\?(.*))?/;\r\n const match = uri.match(regex);\r\n if (match) {\r\n this.user = match[1] || \"default\";\r\n this.password = match[2] || null;\r\n this.host = match[3];\r\n this.port = parseInt(match[4], 10) || 8569;\r\n const dbFromUri = (match[5] || \"\").replace(/\\/+$/, \"\");\r\n if (dbFromUri) {\r\n this.db = dbFromUri;\r\n this._dbToSelect = dbFromUri;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets up socket events for data handling, errors, and closure.\r\n * @private\r\n */\r\n _setupSocket() {\r\n this.socket.on('data', (data) => {\r\n this.parser.feed(data);\r\n let response;\r\n while ((response = this.parser.parseNext()) !== undefined) {\r\n const req = this.pendingRequests.shift();\r\n if (req) {\r\n if (response instanceof Error) {\r\n req.reject(new ToriDBError(response.message, \"SERVER_ERROR\"));\r\n }\r\n else req.resolve(response);\r\n }\r\n }\r\n });\r\n\r\n this.socket.on('error', (err) => {\r\n this.isConnected = false;\r\n const wrapped = new ToriDBError(`Socket Error: ${err.message}`, \"SOCKET_ERROR\", err);\r\n this.pendingRequests.forEach(req => req.reject(wrapped));\r\n this.pendingRequests = [];\r\n });\r\n\r\n this.socket.on('close', () => {\r\n this.isConnected = false;\r\n if (this.pendingRequests.length > 0) {\r\n const err = new ToriDBError(\"Connection closed unexpectedly\", \"CONNECTION_CLOSED\");\r\n this.pendingRequests.forEach(req => req.reject(err));\r\n this.pendingRequests = [];\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Establishes a connection to the ToriDB server.\r\n * @returns {Promise<void>}\r\n * @throws {Error} If connection or authentication fails.\r\n */\r\n async connect() {\r\n if (this.isConnected) return;\r\n if (this._connectPromise) return this._connectPromise;\r\n\r\n this._connectPromise = new Promise((resolve, reject) => {\r\n const onError = (err) => {\r\n this._connectPromise = null;\r\n reject(new ToriDBError(`Connection failed: ${err.message}`, \"CONNECTION_FAILED\", err));\r\n };\r\n this.socket.once('error', onError);\r\n\r\n this.socket.connect(this.port, this.host, async () => {\r\n this.socket.removeListener('error', onError);\r\n\r\n // Set connected immediately so internal execute() calls (like AUTH/USE) can proceed.\r\n // If handshake fails, we disconnect() which reverts this to false.\r\n this.isConnected = true; \r\n\r\n try {\r\n if (this.password) {\r\n try {\r\n await this.execute(\"AUTH\", this.user, this.password);\r\n } catch (e) {\r\n throw new ToriDBError(`Authentication failed: ${e.message}`, \"AUTH_FAILED\", e);\r\n }\r\n }\r\n if (this._dbToSelect) {\r\n try {\r\n await this.execute(\"USE\", this._dbToSelect);\r\n } catch (e) {\r\n throw new ToriDBError(`Failed to select database ${this._dbToSelect}: ${e.message}`, \"DB_SELECT_FAILED\", e);\r\n }\r\n }\r\n resolve();\r\n } catch (e) {\r\n this.disconnect();\r\n reject(e);\r\n } finally {\r\n this._connectPromise = null;\r\n }\r\n });\r\n });\r\n\r\n return this._connectPromise;\r\n }\r\n\r\n /**\r\n * Disconnects from the ToriDB server.\r\n */\r\n disconnect() {\r\n this.socket.destroy();\r\n this.isConnected = false;\r\n }\r\n\r\n /**\r\n * Programmatically selects a database.\r\n * Only works if no database was specified in the connection URI.\r\n * @param {string} name - The name of the database.\r\n * @returns {ToriDB} This instance for chaining.\r\n */\r\n dbName(name) {\r\n if (this._dbToSelect && this._dbToSelect !== \"data\") {\r\n // Warn but facilitate the switch if connected, or update preference\r\n // console.warn(\"Database already specified...\"); // Removed strict warning to allow switching\r\n }\r\n this.db = name;\r\n this._dbToSelect = name;\r\n\r\n if (this.isConnected) {\r\n // Send USE command immediately to preserve order\r\n this.execute(\"USE\", name).catch(e => {\r\n console.warn(`Failed to switch to database ${name}: ${e.message}`);\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Executes a command on the ToriDB server.\r\n * @param {...any} args - Command arguments.\r\n * @returns {Promise<any>} The server response.\r\n */\r\n async execute(...args) {\r\n if (!this.isConnected) {\r\n try {\r\n await this.connect();\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n return new Promise((resolve, reject) => {\r\n this.pendingRequests.push({ resolve, reject });\r\n try {\r\n this.socket.write(RespParser.encode(args));\r\n } catch (e) {\r\n this.pendingRequests.pop();\r\n reject(new ToriDBError(`Failed to send command: ${e.message}`, \"SEND_ERROR\", e));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Executes a raw query string.\r\n * @param {string} s - The query string.\r\n * @returns {Promise<any>}\r\n */\r\n async query(s) {\r\n return this.execute(...s.match(/(?:[^\\s\"]+|\"[^\"]*\")+/g).map(p => p.replace(/\"/g, '')));\r\n }\r\n\r\n // --- Key-Value & TTL ---\r\n /**\r\n * Retrieves the value of a key.\r\n * @param {string} key - The key to get.\r\n * @returns {Promise<any>}\r\n */\r\n async get(key) { return this.execute(\"GET\", key); }\r\n\r\n /**\r\n * Sets the value of a key.\r\n * @param {string} key - The key to set.\r\n * @param {any} val - The value to store (objects are JSON-stringified).\r\n * @returns {Promise<string>} OK on success.\r\n */\r\n async set(key, val) {\r\n const s = typeof val === 'object' ? JSON.stringify(val) : String(val);\r\n return this.execute(\"SET\", key, s);\r\n }\r\n /**\r\n * Sets the value of a key with an expiration time.\r\n * @param {string} key - The key to set.\r\n * @param {any} val - The value to store.\r\n * @param {number} ttl - Time to live in seconds.\r\n * @returns {Promise<string>} OK on success.\r\n */\r\n async setEx(key, val, ttl) {\r\n const s = typeof val === 'object' ? JSON.stringify(val) : String(val);\r\n return this.execute(\"SETEX\", key, s, String(ttl));\r\n }\r\n /**\r\n * Gets the remaining time to live of a key.\r\n * @param {string} key - The key.\r\n * @returns {Promise<number>} TTL in seconds, or -1 if no TTL, or -2 if key doesn't exist.\r\n */\r\n async ttl(key) { return this.execute(\"TTL\", key); }\r\n\r\n /**\r\n * Increments the integer value of a key by one.\r\n * @param {string} key - The key to increment.\r\n * @returns {Promise<number>} The value after increment.\r\n */\r\n async incr(key) { return this.execute(\"INCR\", key); }\r\n\r\n /**\r\n * Decrements the integer value of a key by one.\r\n * @param {string} key - The key to decrement.\r\n * @returns {Promise<number>} The value after decrement.\r\n */\r\n async decr(key) { return this.execute(\"DECR\", key); }\r\n\r\n // --- NoSQL Structures ---\r\n /**\r\n * Accesses list operations for a given key.\r\n * @param {string} key - The list key.\r\n * @returns {Object} An object with list operations (push, rpush, pop, rpop, range).\r\n */\r\n list(key) {\r\n return {\r\n push: (...vals) => this.execute(\"LPUSH\", key, ...vals.map(String)),\r\n rpush: (...vals) => this.execute(\"RPUSH\", key, ...vals.map(String)),\r\n pop: (count = 1) => this.execute(\"LPOP\", key, String(count)),\r\n rpop: (count = 1) => this.execute(\"RPOP\", key, String(count)),\r\n range: (start, stop) => this.execute(\"LRANGE\", key, String(start), String(stop))\r\n };\r\n }\r\n\r\n /**\r\n * Accesses set operations for a given key.\r\n * @param {string} key - The set key.\r\n * @returns {Object} An object with set operations (add, members).\r\n */\r\n setOf(key) {\r\n return {\r\n add: (...members) => this.execute(\"SADD\", key, ...members.map(String)),\r\n members: () => this.execute(\"SMEMBERS\", key)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses hash operations for a given key.\r\n * @param {string} key - The hash key.\r\n * @returns {Object} An object with hash operations (set, get, all).\r\n */\r\n hash(key) {\r\n return {\r\n set: (field, val) => this.execute(\"HSET\", key, field, String(val)),\r\n get: (field) => this.execute(\"HGET\", key, field),\r\n all: () => this.execute(\"HGETALL\", key)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses sorted set operations for a given key.\r\n * @param {string} key - The sorted set key.\r\n * @returns {Object} An object with sorted set operations (add, range, score).\r\n */\r\n sortedSet(key) {\r\n return {\r\n add: (score, member) => this.execute(\"ZADD\", key, String(score), member),\r\n range: (start, stop) => this.execute(\"ZRANGE\", key, String(start), String(stop)),\r\n score: (member) => this.execute(\"ZSCORE\", key, member)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses JSON operations for a given key.\r\n * @param {string} key - The JSON key.\r\n * @returns {Object} An object with JSON operations (get, set).\r\n */\r\n json(key) {\r\n return {\r\n get: (path = \"$\") => this.execute(\"JSON.GET\", key, path),\r\n set: (path, val) => {\r\n const s = typeof val === 'object' ? JSON.stringify(val) : JSON.stringify(val);\r\n return this.execute(\"JSON.SET\", key, path, s);\r\n }\r\n };\r\n }\r\n\r\n // --- Relational (Models) ---\r\n /**\r\n * Defines or accesses a model for relational-like operations.\r\n * @param {string} name - The model name (table name).\r\n * @param {ToriDB.Blueprint} blueprint - The schema definition.\r\n * @returns {Object} An object with model operations (create, find, findById, update, delete, etc.).\r\n */\r\n model(name, blueprint) {\r\n const createCmd = Compiler.compileBlueprint(name, blueprint.definition);\r\n this.execute(...createCmd.match(/(?:[^\\s\"]+|\"[^\"]*\")+/g).map(p => p.replace(/\"/g, ''))).catch(() => { });\r\n\r\n return {\r\n create: (data) => this.execute(\"INSERT\", name, ...Object.values(data).map(v => typeof v === 'object' ? JSON.stringify(v) : String(v))),\r\n find: (filter) => new QueryBuilder(this, name, filter),\r\n findById: (id) => new QueryBuilder(this, name, { id }).execute().then(r => r[0] || null),\r\n update: (filter, data) => {\r\n const where = Compiler.compileFilter(filter);\r\n const [col, val] = Object.entries(data)[0];\r\n const sVal = typeof val === 'object' ? JSON.stringify(val) : String(val);\r\n return this.execute(\"UPDATE\", name, \"SET\", col, \"=\", sVal, \"WHERE\", where);\r\n },\r\n delete: (filter) => this.execute(\"DELETE\", \"FROM\", name, \"WHERE\", Compiler.compileFilter(filter)),\r\n createIndex: (idxName, col) => this.execute(\"CREATE\", \"INDEX\", idxName, \"ON\", name, `(${col})`),\r\n addColumn: (col, type) => this.execute(\"ALTER\", \"TABLE\", name, \"ADD\", `${col}:${type}`),\r\n dropColumn: (col) => this.execute(\"ALTER\", \"TABLE\", name, \"DROP\", col)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses a table for query operations.\r\n * @param {string} name - The table name.\r\n * @returns {Object} An object with a find method.\r\n */\r\n table(name) {\r\n return { find: (filter) => new QueryBuilder(this, name, filter) };\r\n }\r\n}\r\n\r\n/**\r\n * Manager for system-level operations (ACL, Cluster, Replication, etc.).\r\n */\r\nclass SystemManager {\r\n /**\r\n * @param {ToriDB} client - The ToriDB client instance.\r\n */\r\n constructor(client) { this.client = client; }\r\n\r\n /**\r\n * Retrieves server information and statistics.\r\n * @returns {Promise<string>}\r\n */\r\n async info() { return this.client.execute(\"INFO\"); }\r\n\r\n /**\r\n * Synchronously saves the dataset to disk.\r\n * @returns {Promise<string>}\r\n */\r\n async save() { return this.client.execute(\"SAVE\"); }\r\n\r\n /**\r\n * Triggers an AOF rewrite in the background.\r\n * @returns {Promise<string>}\r\n */\r\n async rewriteAof() { return this.client.execute(\"REWRITEAOF\"); }\r\n\r\n /**\r\n * Accesses ACL (Access Control List) operations.\r\n * @returns {Object} An object with ACL operations (createUser, getUser, listUsers, deleteUser).\r\n */\r\n get acl() {\r\n return {\r\n createUser: (u, p, rules) => this.client.execute(\"ACL\", \"SETUSER\", u, p, ...rules),\r\n getUser: (u) => this.client.execute(\"ACL\", \"GETUSER\", u),\r\n listUsers: () => this.client.execute(\"ACL\", \"LIST\"),\r\n deleteUser: (u) => this.client.execute(\"ACL\", \"DELUSER\", u)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses cluster management operations.\r\n * @returns {Object} An object with cluster operations (meet, slots, info).\r\n */\r\n get cluster() {\r\n return {\r\n meet: (h, p) => this.client.execute(\"CLUSTER\", \"MEET\", h, String(p)),\r\n slots: () => this.client.execute(\"CLUSTER\", \"SLOTS\"),\r\n info: () => this.client.execute(\"CLUSTER\", \"INFO\")\r\n };\r\n }\r\n\r\n /**\r\n * Accesses replication management operations.\r\n * @returns {Object} An object with replication operations (slaveOf, stop).\r\n */\r\n get replication() {\r\n return {\r\n slaveOf: (h, p) => this.client.execute(\"REPLICAOF\", h, String(p)),\r\n stop: () => this.client.execute(\"REPLICAOF\", \"NO\", \"ONE\")\r\n };\r\n }\r\n\r\n /**\r\n * Accesses client management operations.\r\n * @returns {Object} An object with client operations (list, kill).\r\n */\r\n get clients() {\r\n return {\r\n list: () => this.client.execute(\"CLIENT\", \"LIST\"),\r\n kill: (addr) => this.client.execute(\"CLIENT\", \"KILL\", addr)\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Helper class for building and executing SQL-like queries.\r\n */\r\nclass QueryBuilder {\r\n /**\r\n * @param {ToriDB} client - The ToriDB client instance.\r\n * @param {string} target - The table or model name.\r\n * @param {Object} [filter={}] - Initial filter object.\r\n */\r\n constructor(client, target, filter = {}) {\r\n this.client = client;\r\n this.target = target;\r\n this.params = {\r\n filter: Compiler.compileFilter(filter),\r\n limit: null,\r\n offset: null,\r\n orderBy: null,\r\n groupBy: null,\r\n select: \"*\"\r\n };\r\n }\r\n\r\n /**\r\n * Specifies the fields to select.\r\n * @param {string|string[]|Object} fields - Fields to select.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n select(fields) {\r\n if (typeof fields === 'string') this.params.select = fields;\r\n else if (Array.isArray(fields)) this.params.select = fields.join(\", \");\r\n else if (typeof fields === 'object') {\r\n this.params.select = Object.entries(fields).map(([k, v]) => `${v} AS ${k}`).join(\", \");\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Limits the number of results.\r\n * @param {number} n - The limit count.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n limit(n) { this.params.limit = n; return this; }\r\n\r\n /**\r\n * Offsets the results.\r\n * @param {number} n - The offset count.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n offset(n) { this.params.offset = n; return this; }\r\n\r\n /**\r\n * Orders the results by a column.\r\n * @param {string} col - The column name.\r\n * @param {string} [dir=\"ASC\"] - Sort direction (ASC or DESC).\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n orderBy(col, dir = \"ASC\") { this.params.orderBy = `${col} ${dir.toUpperCase()}`; return this; }\r\n\r\n /**\r\n * Groups the results by columns.\r\n * @param {string|string[]} cols - The columns to group by.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n groupBy(cols) { this.params.groupBy = Array.isArray(cols) ? cols.join(\", \") : cols; return this; }\r\n\r\n /**\r\n * Compiles and executes the query.\r\n * @returns {Promise<any[]>} The query results.\r\n */\r\n async execute() {\r\n const args = [\"SELECT\", this.params.select, \"FROM\", this.target];\r\n if (this.params.filter) { args.push(\"WHERE\"); args.push(this.params.filter); }\r\n if (this.params.groupBy) { args.push(\"GROUP\"); args.push(\"BY\"); args.push(this.params.groupBy); }\r\n if (this.params.orderBy) { args.push(\"ORDER\"); args.push(\"BY\"); args.push(this.params.orderBy); }\r\n if (this.params.limit) { args.push(\"LIMIT\"); args.push(String(this.params.limit)); }\r\n if (this.params.offset) { args.push(\"OFFSET\"); args.push(String(this.params.offset)); }\r\n\r\n return this.client.execute(...args);\r\n }\r\n}\r\n\r\nexport { ToriDB };"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toridb.esm.js","sources":["../src/compiler.js","../src/resp.js","../src/sdk.js"],"sourcesContent":["/**\r\n * Command Compiler: Translates JS Objects and Types to ToriDB DSL (Domain Specific Language).\r\n * This class handles the conversion of MongoDB-like filter objects and high-level \r\n * Blueprints into valid server-side SQL/NoSQL commands.\r\n */\r\nclass Compiler {\r\n /**\r\n * Translates a standard JavaScript Object into a ToriDB Filter string.\r\n * Supports nested logic ($or, $and) and comparison operators ($gt, $like, etc.).\r\n * \r\n * @example\r\n * { age: { $gt: 18 }, status: 'active' } -> \"age > 18 AND status = 'active'\"\r\n * \r\n * @param {Object} filter - The filter object to compile.\r\n * @returns {string} Compiled SQL WHERE clause part.\r\n */\r\n static compileFilter(filter) {\r\n if (!filter || typeof filter !== 'object') return \"\";\r\n\r\n const parts = [];\r\n for (const [key, value] of Object.entries(filter)) {\r\n if (key === '$or' && Array.isArray(value)) {\r\n parts.push(`(${value.map(f => this.compileFilter(f)).join(\" OR \")})`);\r\n } else if (key === '$and' && Array.isArray(value)) {\r\n parts.push(`(${value.map(f => this.compileFilter(f)).join(\" AND \")})`);\r\n } else if (typeof value === 'object' && value !== null) {\r\n // Handle operators: { $gt: 10 }\r\n for (const [op, val] of Object.entries(value)) {\r\n const symbol = this._mapOperator(op);\r\n parts.push(`${key} ${symbol} ${this._escape(val)}`);\r\n }\r\n } else {\r\n // Basic equality\r\n parts.push(`${key} = ${this._escape(value)}`);\r\n }\r\n }\r\n return parts.join(\" AND \");\r\n }\r\n\r\n /**\r\n * Translates a Blueprint definition to ToriDB Table Definition format.\r\n * { id: { type: 'INT', primary: true }, user_id: { type: 'INT', references: 'users.id' } }\r\n * -> \"id:INT:pk user_id:INT:fk(users.id)\"\r\n */\r\n static compileBlueprint(name, blueprint) {\r\n const cols = [];\r\n for (const [colName, config] of Object.entries(blueprint)) {\r\n let type = typeof config === 'string' ? config : config.type;\r\n let pk = (config.primary || config.is_pk) ? \":pk\" : \"\";\r\n let fk = \"\";\r\n\r\n if (config.references) {\r\n const [refTable, refCol] = config.references.split('.');\r\n fk = `:fk(${refTable}.${refCol})`;\r\n }\r\n\r\n // Auto-map JS types if not specified as SQL types\r\n if (type === 'Number') type = 'INT';\r\n if (type === 'String') type = 'STRING';\r\n if (type === 'Object') type = 'JSON';\r\n if (type === 'Boolean') type = 'BOOL';\r\n\r\n cols.push(`${colName}:${type}${pk}${fk}`);\r\n }\r\n return `CREATE TABLE ${name} ${cols.join(\" \")}`;\r\n }\r\n\r\n /**\r\n * Maps MongoDB-style operators to ToriDB SQL operators.\r\n * @param {string} op - The operator to map (e.g., \"$gt\").\r\n * @returns {string} The corresponding SQL operator or the operator itself if no map exists.\r\n * @private\r\n */\r\n static _mapOperator(op) {\r\n const maps = {\r\n '$gt': '>', '$gte': '>=', '$lt': '<', '$lte': '<=',\r\n '$ne': '!=', '$eq': '=', '$like': 'LIKE', '$in': 'IN'\r\n };\r\n return maps[op] || op;\r\n }\r\n\r\n /**\r\n * Escapes values for safe inclusion in ToriDB queries.\r\n * Handles strings, arrays, and objects (JSON).\r\n * @param {any} val - The value to escape.\r\n * @returns {string} The escaped and formatted value string.\r\n * @private\r\n */\r\n static _escape(val) {\r\n if (typeof val === 'string') {\r\n // If it's a list for IN operator, don't wrap the whole thing in quotes\r\n // but wrap individual elements if they are strings.\r\n // However, the server's IN expects (val1,val2)\r\n return `\"${val.replace(/\"/g, '\\\\\"')}\"`;\r\n }\r\n if (Array.isArray(val)) {\r\n return `(${val.map(v => this._escape(v)).join(\",\")})`;\r\n }\r\n if (typeof val === 'object' && val !== null) return `\"${JSON.stringify(val).replace(/\"/g, '\\\\\"')}\"`;\r\n return String(val);\r\n }\r\n}\r\n\r\nexport { Compiler };","/**\r\n * High-Performance RESP (REdis Serialization Protocol) Parser\r\n * Handles Simple Strings, Errors, Integers, Bulk Strings, and Nested Arrays.\r\n */\r\nclass RespParser {\r\n /**\r\n * Initializes or resets the parser state.\r\n */\r\n constructor() {\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Clears the current data buffer.\r\n */\r\n reset() {\r\n this.buffer = Buffer.alloc(0);\r\n }\r\n\r\n /**\r\n * Feeds raw binary data into the parser's buffer.\r\n * @param {Buffer} data - The raw data received from the socket.\r\n */\r\n feed(data) {\r\n this.buffer = Buffer.concat([this.buffer, data]);\r\n }\r\n\r\n /**\r\n * Tries to parse the next complete RESP value from the buffer.\r\n * @returns {any | undefined} The parsed value or undefined if incomplete.\r\n */\r\n parseNext() {\r\n if (this.buffer.length === 0) return undefined;\r\n\r\n const result = this._decode(0);\r\n if (result) {\r\n this.buffer = this.buffer.slice(result.bytesRead);\r\n return result.value;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Decodes a single RESP value from the buffer starting at a given offset.\r\n * Internal recursive method for handling nested arrays and bulk strings.\r\n * @param {number} offset - The buffer offset to start parsing from.\r\n * @returns {Object|null} An object with {value, bytesRead} or null if incomplete.\r\n * @private\r\n */\r\n _decode(offset) {\r\n if (offset >= this.buffer.length) return null;\r\n\r\n const prefix = this.buffer[offset];\r\n const lineEnd = this.buffer.indexOf('\\r\\n', offset);\r\n if (lineEnd === -1) return null;\r\n\r\n const content = this.buffer.slice(offset + 1, lineEnd).toString();\r\n const bytesBeforeData = lineEnd - offset + 2;\r\n\r\n // RESP Protocol Switch - Based on the first byte indicator\r\n switch (prefix) {\r\n case 43: // '+' Simple String\r\n return { value: content, bytesRead: bytesBeforeData };\r\n\r\n case 45: // '-' Error\r\n return { value: new Error(content), bytesRead: bytesBeforeData };\r\n\r\n case 58: // ':' Integer\r\n return { value: parseInt(content, 10), bytesRead: bytesBeforeData };\r\n\r\n case 36: { // '$' Bulk String\r\n const length = parseInt(content, 10);\r\n if (length === -1) return { value: null, bytesRead: bytesBeforeData };\r\n \r\n const dataEnd = lineEnd + 2 + length;\r\n if (this.buffer.length < dataEnd + 2) return null;\r\n \r\n const value = this.buffer.slice(lineEnd + 2, dataEnd).toString();\r\n // Verify CRLF\r\n if (this.buffer[dataEnd] !== 13 || this.buffer[dataEnd + 1] !== 10) {\r\n throw new Error(\"Invalid Bulk String terminator\");\r\n }\r\n return { value, bytesRead: bytesBeforeData + length + 2 };\r\n }\r\n\r\n case 42: { // '*' Array\r\n const count = parseInt(content, 10);\r\n if (count === -1) return { value: null, bytesRead: bytesBeforeData };\r\n if (count === 0) return { value: [], bytesRead: bytesBeforeData };\r\n\r\n let totalRead = bytesBeforeData;\r\n const items = [];\r\n for (let i = 0; i < count; i++) {\r\n const item = this._decode(offset + totalRead);\r\n if (!item) return null;\r\n items.push(item.value);\r\n totalRead += item.bytesRead;\r\n }\r\n return { value: items, bytesRead: totalRead };\r\n }\r\n\r\n default:\r\n // Attempt to handle unexpected data as a simple string line\r\n return { value: content, bytesRead: bytesBeforeData };\r\n }\r\n }\r\n\r\n /**\r\n * Serializes a command into a RESP Array.\r\n * @param {string[]} args \r\n */\r\n static encode(args) {\r\n let res = `*${args.length}\\r\\n`;\r\n for (const arg of args) {\r\n const s = String(arg);\r\n res += `$${Buffer.byteLength(s)}\\r\\n${s}\\r\\n`;\r\n }\r\n return Buffer.from(res);\r\n }\r\n}\r\n\r\nexport { RespParser };\r\n","import net from 'net';\r\nimport { Compiler } from './compiler.js';\r\nimport { RespParser } from './resp.js';\r\n\r\nclass ToriDBError extends Error {\r\n constructor(message, code, originalError = null) {\r\n super(message);\r\n this.name = \"ToriDBError\";\r\n this.code = code;\r\n this.originalError = originalError;\r\n }\r\n}\r\n\r\n/**\r\n * Main client class for interacting with ToriDB.\r\n * Supports Key-Value, NoSQL structures (List, Set, Hash, JSON), and Relational modeling.\r\n */\r\nclass ToriDB {\r\n /**\r\n * Represents a database schema definition.\r\n */\r\n static Blueprint = class {\r\n /**\r\n * @param {Object} definition - The schema definition object.\r\n */\r\n constructor(definition) {\r\n this.definition = definition;\r\n }\r\n };\r\n\r\n /**\r\n * Creates a new ToriDB client instance.\r\n * @param {string} [uri=\"db://127.0.0.1:8569\"] - Connection URI (e.g., db://user:pass@host:port/db)\r\n */\r\n constructor(uri = \"db://127.0.0.1:8569\") {\r\n this.host = \"127.0.0.1\";\r\n this.port = 8569;\r\n this.user = \"default\";\r\n this.password = null;\r\n this.db = \"data\";\r\n this._dbToSelect = null;\r\n this._parseUri(uri);\r\n\r\n this.parser = new RespParser();\r\n this.socket = new net.Socket();\r\n this.isConnected = false;\r\n this.pendingRequests = [];\r\n\r\n this._setupSocket();\r\n\r\n // Managers\r\n this.system = new SystemManager(this);\r\n }\r\n\r\n /**\r\n * Parses the connection URI.\r\n * @param {string} uri - The connection URI to parse.\r\n * @private\r\n */\r\n _parseUri(uri) {\r\n const regex = /^db:\\/\\/(?:(?:([^:]+):([^@+]+)[@+])?)([^:/\\?]+)(?::(\\d+))?(?:(?:\\/([^?]*))?)?(?:\\?(.*))?/;\r\n const match = uri.match(regex);\r\n if (match) {\r\n this.user = match[1] || \"default\";\r\n this.password = match[2] || null;\r\n this.host = match[3];\r\n this.port = parseInt(match[4], 10) || 8569;\r\n const dbFromUri = (match[5] || \"\").replace(/\\/+$/, \"\");\r\n if (dbFromUri) {\r\n this.db = dbFromUri;\r\n this._dbToSelect = dbFromUri;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets up socket events for data handling, errors, and closure.\r\n * @private\r\n */\r\n _setupSocket() {\r\n this.socket.on('data', (data) => {\r\n this.parser.feed(data);\r\n let response;\r\n while ((response = this.parser.parseNext()) !== undefined) {\r\n const req = this.pendingRequests.shift();\r\n if (req) {\r\n if (response instanceof Error) {\r\n req.reject(new ToriDBError(response.message, \"SERVER_ERROR\"));\r\n }\r\n else req.resolve(response);\r\n }\r\n }\r\n });\r\n\r\n this.socket.on('error', (err) => {\r\n this.isConnected = false;\r\n const wrapped = new ToriDBError(`Socket Error: ${err.message}`, \"SOCKET_ERROR\", err);\r\n this.pendingRequests.forEach(req => req.reject(wrapped));\r\n this.pendingRequests = [];\r\n });\r\n\r\n this.socket.on('close', () => {\r\n this.isConnected = false;\r\n if (this.pendingRequests.length > 0) {\r\n const err = new ToriDBError(\"Connection closed unexpectedly\", \"CONNECTION_CLOSED\");\r\n this.pendingRequests.forEach(req => req.reject(err));\r\n this.pendingRequests = [];\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Establishes a connection to the ToriDB server.\r\n * @returns {Promise<void>}\r\n * @throws {Error} If connection or authentication fails.\r\n */\r\n async connect() {\r\n if (this.isConnected) return;\r\n if (this._connectPromise) return this._connectPromise;\r\n\r\n this._connectPromise = new Promise((resolve, reject) => {\r\n const onError = (err) => {\r\n this._connectPromise = null;\r\n reject(new ToriDBError(`Connection failed: ${err.message}`, \"CONNECTION_FAILED\", err));\r\n };\r\n this.socket.once('error', onError);\r\n\r\n this.socket.connect(this.port, this.host, async () => {\r\n this.socket.removeListener('error', onError);\r\n\r\n // Set connected immediately so internal execute() calls (like AUTH/USE) can proceed.\r\n // If handshake fails, we disconnect() which reverts this to false.\r\n this.isConnected = true; \r\n\r\n try {\r\n if (this.password) {\r\n try {\r\n await this.execute(\"AUTH\", this.user, this.password);\r\n } catch (e) {\r\n throw new ToriDBError(`Authentication failed: ${e.message}`, \"AUTH_FAILED\", e);\r\n }\r\n }\r\n if (this._dbToSelect) {\r\n try {\r\n await this.execute(\"USE\", this._dbToSelect);\r\n } catch (e) {\r\n throw new ToriDBError(`Failed to select database ${this._dbToSelect}: ${e.message}`, \"DB_SELECT_FAILED\", e);\r\n }\r\n }\r\n resolve();\r\n } catch (e) {\r\n this.disconnect();\r\n reject(e);\r\n } finally {\r\n this._connectPromise = null;\r\n }\r\n });\r\n });\r\n\r\n return this._connectPromise;\r\n }\r\n\r\n /**\r\n * Disconnects from the ToriDB server.\r\n */\r\n disconnect() {\r\n this.socket.destroy();\r\n this.isConnected = false;\r\n }\r\n\r\n /**\r\n * Programmatically selects a database.\r\n * Only works if no database was specified in the connection URI.\r\n * @param {string} name - The name of the database.\r\n * @returns {ToriDB} This instance for chaining.\r\n */\r\n dbName(name) {\r\n if (this._dbToSelect && this._dbToSelect !== \"data\") {\r\n // Warn but facilitate the switch if connected, or update preference\r\n // console.warn(\"Database already specified...\"); // Removed strict warning to allow switching\r\n }\r\n this.db = name;\r\n this._dbToSelect = name;\r\n\r\n if (this.isConnected) {\r\n // Send USE command immediately to preserve order\r\n this.execute(\"USE\", name).catch(e => {\r\n console.warn(`Failed to switch to database ${name}: ${e.message}`);\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Executes a command on the ToriDB server.\r\n * @param {...any} args - Command arguments.\r\n * @returns {Promise<any>} The server response.\r\n */\r\n async execute(...args) {\r\n if (!this.isConnected) {\r\n try {\r\n await this.connect();\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n return new Promise((resolve, reject) => {\r\n this.pendingRequests.push({ resolve, reject });\r\n try {\r\n this.socket.write(RespParser.encode(args));\r\n } catch (e) {\r\n this.pendingRequests.pop();\r\n reject(new ToriDBError(`Failed to send command: ${e.message}`, \"SEND_ERROR\", e));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Executes a raw query string.\r\n * @param {string} s - The query string.\r\n * @returns {Promise<any>}\r\n */\r\n async query(s) {\r\n return this.execute(...s.match(/(?:[^\\s\"]+|\"[^\"]*\")+/g).map(p => p.replace(/\"/g, '')));\r\n }\r\n\r\n // --- Transactions ---\r\n async beginTransaction() { return this.execute(\"BEGIN\"); }\r\n async commit() { return this.execute(\"COMMIT\"); }\r\n async rollback() { return this.execute(\"ROLLBACK\"); }\r\n\r\n /**\r\n * Sends a PING command to the server.\r\n * @returns {Promise<string>} PONG on success.\r\n */\r\n async ping() { return this.execute(\"PING\"); }\r\n\r\n // --- Key-Value & TTL ---\r\n /**\r\n * Retrieves the value of a key.\r\n * @param {string} key - The key to get.\r\n * @returns {Promise<any>}\r\n */\r\n async get(key) { return this.execute(\"GET\", key); }\r\n\r\n /**\r\n * Sets the value of a key.\r\n * @param {string} key - The key to set.\r\n * @param {any} val - The value to store (objects are JSON-stringified).\r\n * @returns {Promise<string>} OK on success.\r\n */\r\n async set(key, val) {\r\n const s = typeof val === 'object' ? JSON.stringify(val) : String(val);\r\n return this.execute(\"SET\", key, s);\r\n }\r\n /**\r\n * Sets the value of a key with an expiration time.\r\n * @param {string} key - The key to set.\r\n * @param {any} val - The value to store.\r\n * @param {number} ttl - Time to live in seconds.\r\n * @returns {Promise<string>} OK on success.\r\n */\r\n async setEx(key, val, ttl) {\r\n const s = typeof val === 'object' ? JSON.stringify(val) : String(val);\r\n return this.execute(\"SETEX\", key, String(ttl), s);\r\n }\r\n /**\r\n * Gets the remaining time to live of a key.\r\n * @param {string} key - The key.\r\n * @returns {Promise<number>} TTL in seconds, or -1 if no TTL, or -2 if key doesn't exist.\r\n */\r\n async ttl(key) { return this.execute(\"TTL\", key); }\r\n /**\r\n * Deletes one or more keys.\r\n * @param {...string} keys - The keys to delete.\r\n * @returns {Promise<number>} The number of keys deleted.\r\n */\r\n async del(...keys) { return this.execute(\"DEL\", ...keys); }\r\n\r\n /**\r\n * Increments the integer value of a key by one.\r\n * @param {string} key - The key to increment.\r\n * @returns {Promise<number>} The value after increment.\r\n */\r\n async incr(key) { return this.execute(\"INCR\", key); }\r\n\r\n /**\r\n * Decrements the integer value of a key by one.\r\n * @param {string} key - The key to decrement.\r\n * @returns {Promise<number>} The value after decrement.\r\n */\r\n async decr(key) { return this.execute(\"DECR\", key); }\r\n\r\n // --- NoSQL Structures ---\r\n /**\r\n * Accesses list operations for a given key.\r\n * @param {string} key - The list key.\r\n * @returns {Object} An object with list operations (push, rpush, pop, rpop, range).\r\n */\r\n list(key) {\r\n return {\r\n push: (...vals) => this.execute(\"LPUSH\", key, ...vals.map(String)),\r\n rpush: (...vals) => this.execute(\"RPUSH\", key, ...vals.map(String)),\r\n pop: (count = 1) => this.execute(\"LPOP\", key, String(count)),\r\n rpop: (count = 1) => this.execute(\"RPOP\", key, String(count)),\r\n range: (start, stop) => this.execute(\"LRANGE\", key, String(start), String(stop))\r\n };\r\n }\r\n\r\n /**\r\n * Accesses set operations for a given key.\r\n * @param {string} key - The set key.\r\n * @returns {Object} An object with set operations (add, members).\r\n */\r\n setOf(key) {\r\n return {\r\n add: (...members) => this.execute(\"SADD\", key, ...members.map(String)),\r\n members: () => this.execute(\"SMEMBERS\", key)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses hash operations for a given key.\r\n * @param {string} key - The hash key.\r\n * @returns {Object} An object with hash operations (set, get, all).\r\n */\r\n hash(key) {\r\n return {\r\n set: (field, val) => this.execute(\"HSET\", key, field, String(val)),\r\n get: (field) => this.execute(\"HGET\", key, field),\r\n all: () => this.execute(\"HGETALL\", key)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses sorted set operations for a given key.\r\n * @param {string} key - The sorted set key.\r\n * @returns {Object} An object with sorted set operations (add, range, score).\r\n */\r\n sortedSet(key) {\r\n return {\r\n add: (score, member) => this.execute(\"ZADD\", key, String(score), member),\r\n range: (start, stop) => this.execute(\"ZRANGE\", key, String(start), String(stop)),\r\n score: (member) => this.execute(\"ZSCORE\", key, member)\r\n };\r\n }\r\n\r\n /**\r\n * Executes a background AOF rewrite.\r\n * @returns {Promise<string>}\r\n */\r\n async bgRewriteAof() { return this.system.rewriteAof(); }\r\n\r\n /**\r\n * Accesses JSON operations for a given key.\r\n * @param {string} key - The JSON key.\r\n * @returns {Object} An object with JSON operations (get, set).\r\n */\r\n json(key) {\r\n return {\r\n get: (path = \"$\") => this.execute(\"JSON.GET\", key, path),\r\n set: (path, val) => {\r\n const s = typeof val === 'object' ? JSON.stringify(val) : JSON.stringify(val);\r\n return this.execute(\"JSON.SET\", key, path, s);\r\n }\r\n };\r\n }\r\n\r\n // --- Relational (Models) ---\r\n /**\r\n * Defines or accesses a model for relational-like operations.\r\n * @param {string} name - The model name (table name).\r\n * @param {ToriDB.Blueprint} blueprint - The schema definition.\r\n * @returns {Object} An object with model operations (create, find, findById, update, delete, etc.).\r\n */\r\n model(name, blueprint) {\r\n const createCmd = Compiler.compileBlueprint(name, blueprint.definition);\r\n this.execute(...createCmd.match(/(?:[^\\s\"]+|\"[^\"]*\")+/g).map(p => p.replace(/\"/g, ''))).catch(() => { });\r\n\r\n return {\r\n create: (data) => this.execute(\"INSERT\", name, ...Object.values(data).map(v => typeof v === 'object' ? JSON.stringify(v) : String(v))),\r\n find: (filter) => new QueryBuilder(this, name, filter),\r\n findById: (id) => new QueryBuilder(this, name, { id }).execute().then(r => r[0] || null),\r\n update: (filter, data) => {\r\n const where = Compiler.compileFilter(filter);\r\n const [col, val] = Object.entries(data)[0];\r\n const sVal = typeof val === 'object' ? JSON.stringify(val) : String(val);\r\n return this.execute(\"UPDATE\", name, \"SET\", col, \"=\", sVal, \"WHERE\", where);\r\n },\r\n delete: (filter) => this.execute(\"DELETE\", \"FROM\", name, \"WHERE\", Compiler.compileFilter(filter)),\r\n createIndex: (idxName, col) => this.execute(\"CREATE\", \"INDEX\", idxName, \"ON\", name, `(${col})`),\r\n addColumn: (col, type) => this.execute(\"ALTER\", \"TABLE\", name, \"ADD\", `${col}:${type}`),\r\n dropColumn: (col) => this.execute(\"ALTER\", \"TABLE\", name, \"DROP\", col),\r\n search: (col, vec, k) => new QueryBuilder(this, name).search(col, vec, k),\r\n count: () => new QueryBuilder(this, name).count(),\r\n sum: (col) => new QueryBuilder(this, name).sum(col),\r\n avg: (col) => new QueryBuilder(this, name).avg(col),\r\n max: (col) => new QueryBuilder(this, name).max(col),\r\n min: (col) => new QueryBuilder(this, name).min(col)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses a table for query operations.\r\n * @param {string} name - The table name.\r\n * @returns {Object} An object with a find method.\r\n */\r\n table(name) {\r\n return {\r\n create: (data) => this.execute(\"INSERT\", name, ...Object.values(data).map(v => typeof v === 'object' ? JSON.stringify(v) : String(v))),\r\n find: (filter) => new QueryBuilder(this, name, filter),\r\n findById: (id) => new QueryBuilder(this, name, { id }).execute().then(r => r[0] || null),\r\n update: (filter, data) => {\r\n const where = Compiler.compileFilter(filter);\r\n const [col, val] = Object.entries(data)[0];\r\n const sVal = typeof val === 'object' ? JSON.stringify(val) : String(val);\r\n return this.execute(\"UPDATE\", name, \"SET\", col, \"=\", sVal, \"WHERE\", where);\r\n },\r\n delete: (filter) => this.execute(\"DELETE\", \"FROM\", name, \"WHERE\", Compiler.compileFilter(filter)),\r\n select: (cols) => new QueryBuilder(this, name).select(cols),\r\n search: (col, vec, k) => new QueryBuilder(this, name).search(col, vec, k),\r\n count: () => new QueryBuilder(this, name).count(),\r\n sum: (col) => new QueryBuilder(this, name).sum(col),\r\n avg: (col) => new QueryBuilder(this, name).avg(col),\r\n max: (col) => new QueryBuilder(this, name).max(col),\r\n min: (col) => new QueryBuilder(this, name).min(col)\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Manager for system-level operations (ACL, Cluster, Replication, etc.).\r\n */\r\nclass SystemManager {\r\n /**\r\n * @param {ToriDB} client - The ToriDB client instance.\r\n */\r\n constructor(client) { this.client = client; }\r\n\r\n /**\r\n * Retrieves server information and statistics.\r\n * @returns {Promise<string>}\r\n */\r\n async info() { return this.client.execute(\"INFO\"); }\r\n\r\n /**\r\n * Synchronously saves the dataset to disk.\r\n * @returns {Promise<string>}\r\n */\r\n async save() { return this.client.execute(\"SAVE\"); }\r\n\r\n /**\r\n * Triggers an AOF rewrite in the background.\r\n * @returns {Promise<string>}\r\n */\r\n async rewriteAof() { return this.client.execute(\"REWRITEAOF\"); }\r\n\r\n /**\r\n * Accesses ACL (Access Control List) operations.\r\n * @returns {Object} An object with ACL operations (createUser, getUser, listUsers, deleteUser).\r\n */\r\n get acl() {\r\n return {\r\n createUser: (u, p, rules) => this.client.execute(\"ACL\", \"SETUSER\", u, p, ...rules),\r\n getUser: (u) => this.client.execute(\"ACL\", \"GETUSER\", u),\r\n listUsers: () => this.client.execute(\"ACL\", \"LIST\"),\r\n deleteUser: (u) => this.client.execute(\"ACL\", \"DELUSER\", u)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses cluster management operations.\r\n * @returns {Object} An object with cluster operations (meet, slots, info).\r\n */\r\n get cluster() {\r\n return {\r\n meet: (h, p) => this.client.execute(\"CLUSTER\", \"MEET\", h, String(p)),\r\n slots: () => this.client.execute(\"CLUSTER\", \"SLOTS\"),\r\n info: () => this.client.execute(\"CLUSTER\", \"INFO\"),\r\n addSlots: (...slots) => this.client.execute(\"CLUSTER\", \"ADDSLOTS\", ...slots.map(String))\r\n };\r\n }\r\n\r\n /**\r\n * Accesses replication management operations.\r\n * @returns {Object} An object with replication operations (slaveOf, stop).\r\n */\r\n get replication() {\r\n return {\r\n slaveOf: (h, p) => this.client.execute(\"REPLICAOF\", h, String(p)),\r\n stop: () => this.client.execute(\"REPLICAOF\", \"NO\", \"ONE\")\r\n };\r\n }\r\n\r\n /**\r\n * Accesses client management operations.\r\n * @returns {Object} An object with client operations (list, kill).\r\n */\r\n get clients() {\r\n return {\r\n list: () => this.client.execute(\"CLIENT\", \"LIST\"),\r\n kill: (addr) => this.client.execute(\"CLIENT\", \"KILL\", addr)\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Helper class for building and executing SQL-like queries.\r\n */\r\nclass QueryBuilder {\r\n /**\r\n * @param {ToriDB} client - The ToriDB client instance.\r\n * @param {string} target - The table or model name.\r\n * @param {Object} [filter={}] - Initial filter object.\r\n */\r\n constructor(client, target, filter = {}) {\r\n this.client = client;\r\n this.target = target;\r\n this.params = {\r\n filter: Compiler.compileFilter(filter),\r\n joins: [],\r\n limit: null,\r\n offset: null,\r\n orderBy: null,\r\n groupBy: null,\r\n having: null,\r\n select: \"*\"\r\n };\r\n }\r\n\r\n /**\r\n * Specifies the fields to select.\r\n * @param {string|string[]} fields - Fields to select.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n select(fields) {\r\n if (typeof fields === 'string') this.params.select = fields;\r\n else if (Array.isArray(fields)) this.params.select = fields.join(\", \");\r\n return this;\r\n }\r\n\r\n /**\r\n * Specifies aggregate functions for selection.\r\n */\r\n count() { this.params.select = \"COUNT(*)\"; return this; }\r\n sum(col) { this.params.select = `SUM(${col})`; return this; }\r\n avg(col) { this.params.select = `AVG(${col})`; return this; }\r\n max(col) { this.params.select = `MAX(${col})`; return this; }\r\n min(col) { this.params.select = `MIN(${col})`; return this; }\r\n\r\n /**\r\n * Adds an INNER JOIN clause.\r\n * @param {string} table - The table to join.\r\n * @param {string} onLeft - The left column (e.g. \"users.id\").\r\n * @param {string} onRight - The right column (e.g. \"orders.user_id\").\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n join(table, onLeft, onRight) {\r\n this.params.joins.push({ table, onLeft, onRight });\r\n return this;\r\n }\r\n\r\n /**\r\n * Limits the number of results.\r\n * @param {number} n - The limit count.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n limit(n) { this.params.limit = n; return this; }\r\n\r\n /**\r\n * Offsets the results.\r\n * @param {number} n - The offset count.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n offset(n) { this.params.offset = n; return this; }\r\n\r\n /**\r\n * Orders the results by a column.\r\n * @param {string} col - The column name.\r\n * @param {string} [dir=\"ASC\"] - Sort direction (ASC or DESC).\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n orderBy(col, dir = \"ASC\") { this.params.orderBy = `${col} ${dir.toUpperCase()}`; return this; }\r\n\r\n /**\r\n * Groups the results by columns.\r\n * @param {string|string[]} cols - The columns to group by.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n groupBy(cols) { this.params.groupBy = Array.isArray(cols) ? cols.join(\", \") : cols; return this; }\r\n\r\n /**\r\n * Adds a HAVING clause to the query.\r\n * @param {Object|string} filter - Filter object or raw string.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n having(filter) {\r\n this.params.having = typeof filter === 'string' ? filter : Compiler.compileFilter(filter);\r\n return this;\r\n }\r\n\r\n /**\r\n * Compiles and executes the query.\r\n * @returns {Promise<any[]>} The query results.\r\n */\r\n async execute() {\r\n const args = [\"SELECT\", this.params.select, \"FROM\", this.target];\r\n\r\n if (this.params.joins.length > 0) {\r\n this.params.joins.forEach(j => {\r\n args.push(\"JOIN\", j.table, \"ON\", `${j.onLeft} = ${j.onRight}`);\r\n });\r\n }\r\n\r\n if (this.params.filter) { args.push(\"WHERE\"); args.push(this.params.filter); }\r\n if (this.params.groupBy) { args.push(\"GROUP\"); args.push(\"BY\"); args.push(this.params.groupBy); }\r\n if (this.params.having) { args.push(\"HAVING\"); args.push(this.params.having); }\r\n if (this.params.orderBy) { args.push(\"ORDER\"); args.push(\"BY\"); args.push(this.params.orderBy); }\r\n if (this.params.limit) { args.push(\"LIMIT\"); args.push(String(this.params.limit)); }\r\n if (this.params.offset) { args.push(\"OFFSET\"); args.push(String(this.params.offset)); }\r\n\r\n return this.client.execute(...args);\r\n }\r\n\r\n /**\r\n * Performs a vector similarity search.\r\n * @param {string} column - The vector column name.\r\n * @param {number[]} vector - The query vector.\r\n * @param {number} [limit=10] - Number of nearest neighbors to return.\r\n * @returns {Promise<any[]>}\r\n */\r\n async search(column, vector, limit = 10) {\r\n // Syntax: SEARCH table col [v] k\r\n // We remove spaces to avoid server-side quoting issues in RESP parsing\r\n const vecStr = JSON.stringify(vector).replace(/\\s+/g, '');\r\n return this.client.execute(\"SEARCH\", this.target, column, vecStr, String(limit));\r\n }\r\n}\r\n\r\nexport { ToriDB };"],"names":[],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA,MAAM,QAAQ,CAAC;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,aAAa,CAAC,MAAM,EAAE;AAC/B,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,OAAO,EAAE,CAAC;AACzD;AACA,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;AACrB,IAAI,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACvD,MAAM,IAAI,GAAG,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACjD,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzD,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AAC9D;AACA,QAAQ,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACvD,UAAU,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;AAC/C,UAAU,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,QAAQ,CAAC;AACT,MAAM,CAAC,MAAM;AACb;AACA,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,MAAM,CAAC;AACP,IAAI,CAAC;AACL,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/B,EAAE,CAAC;AACH;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE;AAC3C,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;AACpB,IAAI,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;AAC/D,MAAM,IAAI,IAAI,GAAG,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;AACnE,MAAM,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK,GAAG,EAAE,CAAC;AAC7D,MAAM,IAAI,EAAE,GAAG,EAAE,CAAC;AAClB;AACA,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE;AAC7B,QAAQ,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAChE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1C,MAAM,CAAC;AACP;AACA;AACA,MAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,IAAI,GAAG,KAAK,CAAC;AAC1C,MAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC;AAC7C,MAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAC;AAC3C,MAAM,IAAI,IAAI,KAAK,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;AAC5C;AACA,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAChD,IAAI,CAAC;AACL,IAAI,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpD,EAAE,CAAC;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,YAAY,CAAC,EAAE,EAAE;AAC1B,IAAI,MAAM,IAAI,GAAG;AACjB,MAAM,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI;AACxD,MAAM,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;AAC3D,KAAK,CAAC;AACN,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AAC1B,EAAE,CAAC;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,OAAO,CAAC,GAAG,EAAE;AACtB,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AACjC;AACA;AACA;AACA,MAAM,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,IAAI,CAAC;AACL,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC5B,MAAM,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,IAAI,CAAC;AACL,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACxG,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACvB,EAAE,CAAC;AACH;;ACrGA;AACA;AACA;AACA;AACA,MAAM,UAAU,CAAC;AACjB;AACA;AACA;AACA,EAAE,WAAW,GAAG;AAChB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;AACjB,EAAE,CAAC;AACH;AACA;AACA;AACA;AACA,EAAE,KAAK,GAAG;AACV,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAClC,EAAE,CAAC;AACH;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,IAAI,EAAE;AACb,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AACrD,EAAE,CAAC;AACH;AACA;AACA;AACA;AACA;AACA,EAAE,SAAS,GAAG;AACd,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,SAAS,CAAC;AACnD;AACA,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,IAAI,MAAM,EAAE;AAChB,MAAM,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACxD,MAAM,OAAO,MAAM,CAAC,KAAK,CAAC;AAC1B,IAAI,CAAC;AACL,IAAI,OAAO,SAAS,CAAC;AACrB,EAAE,CAAC;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,MAAM,EAAE;AAClB,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC;AAClD;AACA,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACvC,IAAI,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACxD,IAAI,IAAI,OAAO,KAAK,EAAE,EAAE,OAAO,IAAI,CAAC;AACpC;AACA,IAAI,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtE,IAAI,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC;AACjD;AACA;AACA,IAAI,QAAQ,MAAM;AAClB,MAAM,KAAK,EAAE;AACb,QAAQ,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AAC9D;AACA,MAAM,KAAK,EAAE;AACb,QAAQ,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AACzE;AACA,MAAM,KAAK,EAAE;AACb,QAAQ,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AAC5E;AACA,MAAM,KAAK,EAAE,EAAE;AACf,QAAQ,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC7C,QAAQ,IAAI,MAAM,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AAC9E;AACA,QAAQ,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC;AAC7C,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC;AAC1D;AACA,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACzE;AACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;AAC5E,WAAW,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;AAC7D,QAAQ,CAAC;AACT,QAAQ,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;AAClE,MAAM,CAAC;AACP;AACA,MAAM,KAAK,EAAE,EAAE;AACf,QAAQ,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC5C,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AAC7E,QAAQ,IAAI,KAAK,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AAC1E;AACA,QAAQ,IAAI,SAAS,GAAG,eAAe,CAAC;AACxC,QAAQ,MAAM,KAAK,GAAG,EAAE,CAAC;AACzB,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;AACxC,UAAU,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AACxD,UAAU,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC;AACjC,UAAU,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,UAAU,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;AACtC,QAAQ,CAAC;AACT,QAAQ,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AACtD,MAAM,CAAC;AACP;AACA,MAAM;AACN;AACA,QAAQ,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AAC9D,KAAK;AACL,EAAE,CAAC;AACH;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,MAAM,CAAC,IAAI,EAAE;AACtB,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACpC,IAAI,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AAC5B,MAAM,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AAC5B,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACpD,IAAI,CAAC;AACL,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5B,EAAE,CAAC;AACH;;ACnHA,MAAM,WAAW,SAAS,KAAK,CAAC;AAChC,IAAI,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE;AACrD,QAAQ,KAAK,CAAC,OAAO,CAAC,CAAC;AACvB,QAAQ,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;AAClC,QAAQ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACzB,QAAQ,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;AAC3C,IAAI,CAAC;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,MAAM,MAAM,CAAC;AACb;AACA;AACA;AACA,IAAI,OAAO,SAAS,GAAG,MAAM;AAC7B;AACA;AACA;AACA,QAAQ,WAAW,CAAC,UAAU,EAAE;AAChC,YAAY,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AACzC,QAAQ,CAAC;AACT,KAAK,CAAC;AACN;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,GAAG,GAAG,qBAAqB,EAAE;AAC7C,QAAQ,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;AAChC,QAAQ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACzB,QAAQ,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;AAC9B,QAAQ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC7B,QAAQ,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC;AACzB,QAAQ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AAChC,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC5B;AACA,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;AACvC,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;AACvC,QAAQ,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;AACjC,QAAQ,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;AAClC;AACA,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;AAC5B;AACA;AACA,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;AAC9C,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,CAAC,GAAG,EAAE;AACnB,QAAQ,MAAM,KAAK,GAAG,0FAA0F,CAAC;AACjH,QAAQ,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACvC,QAAQ,IAAI,KAAK,EAAE;AACnB,YAAY,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;AAC9C,YAAY,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC7C,YAAY,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACjC,YAAY,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC;AACvD,YAAY,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnE,YAAY,IAAI,SAAS,EAAE;AAC3B,gBAAgB,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;AACpC,gBAAgB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;AAC7C,YAAY,CAAC;AACb,QAAQ,CAAC;AACT,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA,IAAI,YAAY,GAAG;AACnB,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK;AACzC,YAAY,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnC,YAAY,IAAI,QAAQ,CAAC;AACzB,YAAY,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,SAAS,EAAE;AACvE,gBAAgB,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;AACzD,gBAAgB,IAAI,GAAG,EAAE;AACzB,oBAAoB,IAAI,QAAQ,YAAY,KAAK,EAAE;AACnD,wBAAwB,GAAG,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;AACtF,oBAAoB,CAAC;AACrB,yBAAyB,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC/C,gBAAgB,CAAC;AACjB,YAAY,CAAC;AACb,QAAQ,CAAC,CAAC,CAAC;AACX;AACA,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK;AACzC,YAAY,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;AACrC,YAAY,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,CAAC,cAAc,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;AACjG,YAAY,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACrE,YAAY,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;AACtC,QAAQ,CAAC,CAAC,CAAC;AACX;AACA,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM;AACtC,YAAY,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;AACrC,YAAY,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;AACjD,gBAAgB,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,gCAAgC,EAAE,mBAAmB,CAAC,CAAC;AACnG,gBAAgB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACrE,gBAAgB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;AAC1C,YAAY,CAAC;AACb,QAAQ,CAAC,CAAC,CAAC;AACX,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,OAAO,GAAG;AACpB,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,OAAO;AACrC,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,OAAO,IAAI,CAAC,eAAe,CAAC;AAC9D;AACA,QAAQ,IAAI,CAAC,eAAe,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;AAChE,YAAY,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK;AACrC,gBAAgB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;AAC5C,gBAAgB,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC,mBAAmB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAC,CAAC;AACvG,YAAY,CAAC,CAAC;AACd,YAAY,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/C;AACA,YAAY,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY;AAClE,gBAAgB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7D;AACA;AACA;AACA,gBAAgB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AACxC;AACA,gBAAgB,IAAI;AACpB,oBAAoB,IAAI,IAAI,CAAC,QAAQ,EAAE;AACvC,wBAAwB,IAAI;AAC5B,4BAA4B,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AACjF,wBAAwB,CAAC,CAAC,OAAO,CAAC,EAAE;AACpC,4BAA4B,MAAM,IAAI,WAAW,CAAC,CAAC,uBAAuB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;AAC3G,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB,oBAAoB,IAAI,IAAI,CAAC,WAAW,EAAE;AAC1C,wBAAwB,IAAI;AAC5B,4BAA4B,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;AACxE,wBAAwB,CAAC,CAAC,OAAO,CAAC,EAAE;AACpC,4BAA4B,MAAM,IAAI,WAAW,CAAC,CAAC,0BAA0B,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;AACxI,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB,oBAAoB,OAAO,EAAE,CAAC;AAC9B,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE;AAC5B,oBAAoB,IAAI,CAAC,UAAU,EAAE,CAAC;AACtC,oBAAoB,MAAM,CAAC,CAAC,CAAC,CAAC;AAC9B,gBAAgB,CAAC,SAAS;AAC1B,oBAAoB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;AAChD,gBAAgB,CAAC;AACjB,YAAY,CAAC,CAAC,CAAC;AACf,QAAQ,CAAC,CAAC,CAAC;AACX;AACA,QAAQ,OAAO,IAAI,CAAC,eAAe,CAAC;AACpC,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA,IAAI,UAAU,GAAG;AACjB,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;AAC9B,QAAQ,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;AACjC,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,CAAC,IAAI,EAAE;AACjB,QAAQ,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,KAAK,MAAM,EAAE,CAGpD;AACT,QAAQ,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;AACvB,QAAQ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AAChC;AACA,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE;AAC9B;AACA,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI;AACjD,gBAAgB,OAAO,CAAC,IAAI,CAAC,CAAC,6BAA6B,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACnF,YAAY,CAAC,CAAC,CAAC;AACf,QAAQ,CAAC;AACT,QAAQ,OAAO,IAAI,CAAC;AACpB,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,OAAO,CAAC,GAAG,IAAI,EAAE;AAC3B,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAC/B,YAAY,IAAI;AAChB,gBAAgB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;AACrC,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE;AACxB,gBAAgB,MAAM,CAAC,CAAC;AACxB,YAAY,CAAC;AACb,QAAQ,CAAC;AACT,QAAQ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;AAChD,YAAY,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AAC3D,YAAY,IAAI;AAChB,gBAAgB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3D,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE;AACxB,gBAAgB,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;AAC3C,gBAAgB,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC,wBAAwB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;AACjG,YAAY,CAAC;AACb,QAAQ,CAAC,CAAC,CAAC;AACX,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE;AACnB,QAAQ,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/F,IAAI,CAAC;AACL;AACA;AACA,IAAI,MAAM,gBAAgB,GAAG,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC9D,IAAI,MAAM,MAAM,GAAG,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACrD,IAAI,MAAM,QAAQ,GAAG,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACzD;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,IAAI,GAAG,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;AACxB,QAAQ,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AAC9E,QAAQ,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAC3C,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAC/B,QAAQ,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AAC9E,QAAQ,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1D,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACvD;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,CAAC,GAAG,EAAE;AACd,QAAQ,OAAO;AACf,YAAY,IAAI,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC9E,YAAY,KAAK,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC/E,YAAY,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AACxE,YAAY,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AACzE,YAAY,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAC5F,SAAS,CAAC;AACV,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,KAAK,CAAC,GAAG,EAAE;AACf,QAAQ,OAAO;AACf,YAAY,GAAG,EAAE,CAAC,GAAG,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAClF,YAAY,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;AACxD,SAAS,CAAC;AACV,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,CAAC,GAAG,EAAE;AACd,QAAQ,OAAO;AACf,YAAY,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;AAC9E,YAAY,GAAG,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC;AAC5D,YAAY,GAAG,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;AACnD,SAAS,CAAC;AACV,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,CAAC,GAAG,EAAE;AACnB,QAAQ,OAAO;AACf,YAAY,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;AACpF,YAAY,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAC5F,YAAY,KAAK,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC;AAClE,SAAS,CAAC;AACV,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,YAAY,GAAG,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,CAAC,GAAG,EAAE;AACd,QAAQ,OAAO;AACf,YAAY,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC;AACpE,YAAY,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK;AAChC,gBAAgB,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC9F,gBAAgB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC9D,YAAY,CAAC;AACb,SAAS,CAAC;AACV,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE;AAC3B,QAAQ,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;AAChF,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACjH;AACA,QAAQ,OAAO;AACf,YAAY,MAAM,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAClJ,YAAY,IAAI,EAAE,CAAC,MAAM,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC;AAClE,YAAY,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACpG,YAAY,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,KAAK;AACtC,gBAAgB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC7D,gBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,gBAAgB,MAAM,IAAI,GAAG,OAAO,GAAG,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AACzF,gBAAgB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAC3F,YAAY,CAAC;AACb,YAAY,MAAM,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC7G,YAAY,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3G,YAAY,SAAS,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACnG,YAAY,UAAU,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC;AAClF,YAAY,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AACrF,YAAY,KAAK,EAAE,MAAM,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE;AAC7D,YAAY,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/D,YAAY,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/D,YAAY,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/D,YAAY,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/D,SAAS,CAAC;AACV,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,KAAK,CAAC,IAAI,EAAE;AAChB,QAAQ,OAAO;AACf,YAAY,MAAM,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAClJ,YAAY,IAAI,EAAE,CAAC,MAAM,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC;AAClE,YAAY,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACpG,YAAY,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,KAAK;AACtC,gBAAgB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC7D,gBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,gBAAgB,MAAM,IAAI,GAAG,OAAO,GAAG,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AACzF,gBAAgB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAC3F,YAAY,CAAC;AACb,YAAY,MAAM,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC7G,YAAY,MAAM,EAAE,CAAC,IAAI,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;AACvE,YAAY,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AACrF,YAAY,KAAK,EAAE,MAAM,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE;AAC7D,YAAY,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/D,YAAY,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/D,YAAY,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/D,YAAY,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/D,SAAS,CAAC;AACV,IAAI,CAAC;AACL,CAAC;AACD;AACA;AACA;AACA;AACA,MAAM,aAAa,CAAC;AACpB;AACA;AACA;AACA,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;AACjD;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,IAAI,GAAG,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACxD;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,IAAI,GAAG,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACxD;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,UAAU,GAAG,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AACpE;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,GAAG,GAAG;AACd,QAAQ,OAAO;AACf,YAAY,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;AAC9F,YAAY,OAAO,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACpE,YAAY,SAAS,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;AAC/D,YAAY,UAAU,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACvE,SAAS,CAAC;AACV,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,OAAO,GAAG;AAClB,QAAQ,OAAO;AACf,YAAY,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAChF,YAAY,KAAK,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;AAChE,YAAY,IAAI,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;AAC9D,YAAY,QAAQ,EAAE,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACpG,SAAS,CAAC;AACV,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,WAAW,GAAG;AACtB,QAAQ,OAAO;AACf,YAAY,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAC7E,YAAY,IAAI,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC;AACrE,SAAS,CAAC;AACV,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,OAAO,GAAG;AAClB,QAAQ,OAAO;AACf,YAAY,IAAI,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;AAC7D,YAAY,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;AACvE,SAAS,CAAC;AACV,IAAI,CAAC;AACL,CAAC;AACD;AACA;AACA;AACA;AACA,MAAM,YAAY,CAAC;AACnB;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE;AAC7C,QAAQ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AAC7B,QAAQ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AAC7B,QAAQ,IAAI,CAAC,MAAM,GAAG;AACtB,YAAY,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AAClD,YAAY,KAAK,EAAE,EAAE;AACrB,YAAY,KAAK,EAAE,IAAI;AACvB,YAAY,MAAM,EAAE,IAAI;AACxB,YAAY,OAAO,EAAE,IAAI;AACzB,YAAY,OAAO,EAAE,IAAI;AACzB,YAAY,MAAM,EAAE,IAAI;AACxB,YAAY,MAAM,EAAE,GAAG;AACvB,SAAS,CAAC;AACV,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,CAAC,MAAM,EAAE;AACnB,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;AACpE,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/E,QAAQ,OAAO,IAAI,CAAC;AACpB,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA,IAAI,KAAK,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;AAC7D,IAAI,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;AACjE,IAAI,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;AACjE,IAAI,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;AACjE,IAAI,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;AACjC,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3D,QAAQ,OAAO,IAAI,CAAC;AACpB,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,KAAK,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;AACpD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;AACnG;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;AACtG;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,CAAC,MAAM,EAAE;AACnB,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAClG,QAAQ,OAAO,IAAI,CAAC;AACpB,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,OAAO,GAAG;AACpB,QAAQ,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AACzE;AACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1C,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI;AAC3C,gBAAgB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC/E,YAAY,CAAC,CAAC,CAAC;AACf,QAAQ,CAAC;AACT;AACA,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtF,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACzG,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvF,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACzG,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5F,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/F;AACA,QAAQ,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AAC5C,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE;AAC7C;AACA;AACA,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAClE,QAAQ,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACzF,IAAI,CAAC;AACL;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toridb",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "ToriDB Client",
5
5
  "main": "/dist/toridb.esm.js",
6
6
  "scripts": {