rawsql-ts 0.5.0-beta → 0.6.0-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +11 -0
  2. package/dist/esm/models/Clause.js +104 -6
  3. package/dist/esm/models/Clause.js.map +1 -1
  4. package/dist/esm/models/CreateTableQuery.js +1 -1
  5. package/dist/esm/models/CreateTableQuery.js.map +1 -1
  6. package/dist/esm/models/InsertQuery.js +2 -9
  7. package/dist/esm/models/InsertQuery.js.map +1 -1
  8. package/dist/esm/models/UpdateQuery.js +25 -0
  9. package/dist/esm/models/UpdateQuery.js.map +1 -0
  10. package/dist/esm/models/ValueComponent.js +31 -14
  11. package/dist/esm/models/ValueComponent.js.map +1 -1
  12. package/dist/esm/parsers/FullNameParser.js +89 -0
  13. package/dist/esm/parsers/FullNameParser.js.map +1 -0
  14. package/dist/esm/parsers/FunctionExpressionParser.js +33 -32
  15. package/dist/esm/parsers/FunctionExpressionParser.js.map +1 -1
  16. package/dist/esm/parsers/IdentifierParser.js +5 -30
  17. package/dist/esm/parsers/IdentifierParser.js.map +1 -1
  18. package/dist/esm/parsers/InsertQueryParser.js +6 -27
  19. package/dist/esm/parsers/InsertQueryParser.js.map +1 -1
  20. package/dist/esm/parsers/ReturningClauseParser.js +31 -0
  21. package/dist/esm/parsers/ReturningClauseParser.js.map +1 -0
  22. package/dist/esm/parsers/SetClauseParser.js +39 -0
  23. package/dist/esm/parsers/SetClauseParser.js.map +1 -0
  24. package/dist/esm/parsers/SourceExpressionParser.js +19 -0
  25. package/dist/esm/parsers/SourceExpressionParser.js.map +1 -1
  26. package/dist/esm/parsers/SourceParser.js +16 -8
  27. package/dist/esm/parsers/SourceParser.js.map +1 -1
  28. package/dist/esm/parsers/UpdateClauseParser.js +17 -0
  29. package/dist/esm/parsers/UpdateClauseParser.js.map +1 -0
  30. package/dist/esm/parsers/UpdateQueryParser.js +84 -0
  31. package/dist/esm/parsers/UpdateQueryParser.js.map +1 -0
  32. package/dist/esm/parsers/ValueParser.js +13 -11
  33. package/dist/esm/parsers/ValueParser.js.map +1 -1
  34. package/dist/esm/transformers/CTEDisabler.js +2 -2
  35. package/dist/esm/transformers/CTEDisabler.js.map +1 -1
  36. package/dist/esm/transformers/Formatter.js +92 -15
  37. package/dist/esm/transformers/Formatter.js.map +1 -1
  38. package/dist/esm/transformers/QueryBuilder.js +54 -6
  39. package/dist/esm/transformers/QueryBuilder.js.map +1 -1
  40. package/dist/esm/transformers/SelectValueCollector.js +4 -4
  41. package/dist/esm/transformers/UpstreamSelectQueryFinder.js +1 -1
  42. package/dist/esm/types/models/Clause.d.ts +58 -4
  43. package/dist/esm/types/models/InsertQuery.d.ts +4 -9
  44. package/dist/esm/types/models/UpdateQuery.d.ts +31 -0
  45. package/dist/esm/types/models/ValueComponent.d.ts +7 -4
  46. package/dist/esm/types/parsers/FullNameParser.d.ts +26 -0
  47. package/dist/esm/types/parsers/InsertQueryParser.d.ts +0 -1
  48. package/dist/esm/types/parsers/ReturningClauseParser.d.ts +12 -0
  49. package/dist/esm/types/parsers/SetClauseParser.d.ts +11 -0
  50. package/dist/esm/types/parsers/SourceExpressionParser.d.ts +8 -0
  51. package/dist/esm/types/parsers/SourceParser.d.ts +14 -0
  52. package/dist/esm/types/parsers/UpdateClauseParser.d.ts +15 -0
  53. package/dist/esm/types/parsers/UpdateQueryParser.d.ts +16 -0
  54. package/dist/esm/types/transformers/Formatter.d.ts +6 -0
  55. package/dist/esm/types/transformers/QueryBuilder.d.ts +9 -0
  56. package/dist/models/Clause.d.ts +58 -4
  57. package/dist/models/Clause.js +110 -7
  58. package/dist/models/Clause.js.map +1 -1
  59. package/dist/models/CreateTableQuery.js +1 -1
  60. package/dist/models/CreateTableQuery.js.map +1 -1
  61. package/dist/models/InsertQuery.d.ts +4 -9
  62. package/dist/models/InsertQuery.js +2 -9
  63. package/dist/models/InsertQuery.js.map +1 -1
  64. package/dist/models/UpdateQuery.d.ts +31 -0
  65. package/dist/models/UpdateQuery.js +29 -0
  66. package/dist/models/UpdateQuery.js.map +1 -0
  67. package/dist/models/ValueComponent.d.ts +7 -4
  68. package/dist/models/ValueComponent.js +31 -14
  69. package/dist/models/ValueComponent.js.map +1 -1
  70. package/dist/parsers/FullNameParser.d.ts +26 -0
  71. package/dist/parsers/FullNameParser.js +93 -0
  72. package/dist/parsers/FullNameParser.js.map +1 -0
  73. package/dist/parsers/FunctionExpressionParser.js +32 -31
  74. package/dist/parsers/FunctionExpressionParser.js.map +1 -1
  75. package/dist/parsers/IdentifierParser.js +5 -30
  76. package/dist/parsers/IdentifierParser.js.map +1 -1
  77. package/dist/parsers/InsertQueryParser.d.ts +0 -1
  78. package/dist/parsers/InsertQueryParser.js +6 -27
  79. package/dist/parsers/InsertQueryParser.js.map +1 -1
  80. package/dist/parsers/ReturningClauseParser.d.ts +12 -0
  81. package/dist/parsers/ReturningClauseParser.js +35 -0
  82. package/dist/parsers/ReturningClauseParser.js.map +1 -0
  83. package/dist/parsers/SetClauseParser.d.ts +11 -0
  84. package/dist/parsers/SetClauseParser.js +43 -0
  85. package/dist/parsers/SetClauseParser.js.map +1 -0
  86. package/dist/parsers/SourceExpressionParser.d.ts +8 -0
  87. package/dist/parsers/SourceExpressionParser.js +19 -0
  88. package/dist/parsers/SourceExpressionParser.js.map +1 -1
  89. package/dist/parsers/SourceParser.d.ts +14 -0
  90. package/dist/parsers/SourceParser.js +16 -8
  91. package/dist/parsers/SourceParser.js.map +1 -1
  92. package/dist/parsers/UpdateClauseParser.d.ts +15 -0
  93. package/dist/parsers/UpdateClauseParser.js +21 -0
  94. package/dist/parsers/UpdateClauseParser.js.map +1 -0
  95. package/dist/parsers/UpdateQueryParser.d.ts +16 -0
  96. package/dist/parsers/UpdateQueryParser.js +88 -0
  97. package/dist/parsers/UpdateQueryParser.js.map +1 -0
  98. package/dist/parsers/ValueParser.js +13 -11
  99. package/dist/parsers/ValueParser.js.map +1 -1
  100. package/dist/transformers/CTEDisabler.js +2 -2
  101. package/dist/transformers/CTEDisabler.js.map +1 -1
  102. package/dist/transformers/Formatter.d.ts +6 -0
  103. package/dist/transformers/Formatter.js +91 -14
  104. package/dist/transformers/Formatter.js.map +1 -1
  105. package/dist/transformers/QueryBuilder.d.ts +9 -0
  106. package/dist/transformers/QueryBuilder.js +53 -5
  107. package/dist/transformers/QueryBuilder.js.map +1 -1
  108. package/dist/transformers/SelectValueCollector.js +4 -4
  109. package/dist/transformers/UpstreamSelectQueryFinder.js +1 -1
  110. package/package.json +1 -1
  111. package/dist/esm/types/utils/extractNamespacesAndName.d.ts +0 -5
  112. package/dist/esm/types/utils/parseEscapedOrDotSeparatedIdentifiers.d.ts +0 -9
  113. package/dist/esm/utils/extractNamespacesAndName.js +0 -16
  114. package/dist/esm/utils/extractNamespacesAndName.js.map +0 -1
  115. package/dist/esm/utils/parseEscapedOrDotSeparatedIdentifiers.js +0 -39
  116. package/dist/esm/utils/parseEscapedOrDotSeparatedIdentifiers.js.map +0 -1
  117. package/dist/utils/extractNamespacesAndName.d.ts +0 -5
  118. package/dist/utils/extractNamespacesAndName.js +0 -18
  119. package/dist/utils/extractNamespacesAndName.js.map +0 -1
  120. package/dist/utils/parseEscapedOrDotSeparatedIdentifiers.d.ts +0 -9
  121. package/dist/utils/parseEscapedOrDotSeparatedIdentifiers.js +0 -42
  122. package/dist/utils/parseEscapedOrDotSeparatedIdentifiers.js.map +0 -1
@@ -119,13 +119,13 @@ class SelectValueCollector {
119
119
  const wildSourceNames = wildcards.filter(item => item.value instanceof ValueComponent_1.ColumnReference && item.value.namespaces)
120
120
  .map(item => item.value.getNamespace());
121
121
  if (query.fromClause) {
122
- const fromSourceName = query.fromClause.getAliasSourceName();
122
+ const fromSourceName = query.fromClause.getSourceAliasName();
123
123
  if (fromSourceName && wildSourceNames.includes(fromSourceName)) {
124
124
  this.processFromClause(query.fromClause, false);
125
125
  }
126
126
  if (query.fromClause.joins) {
127
127
  for (const join of query.fromClause.joins) {
128
- const joinSourceName = join.getAliasSourceName();
128
+ const joinSourceName = join.getSourceAliasName();
129
129
  if (joinSourceName && wildSourceNames.includes(joinSourceName)) {
130
130
  this.processJoinClause(join);
131
131
  }
@@ -138,7 +138,7 @@ class SelectValueCollector {
138
138
  }
139
139
  processFromClause(clause, joinCascade) {
140
140
  if (clause) {
141
- const fromSourceName = clause.getAliasSourceName();
141
+ const fromSourceName = clause.getSourceAliasName();
142
142
  this.processSourceExpression(fromSourceName, clause.source);
143
143
  if (clause.joins && joinCascade) {
144
144
  for (const join of clause.joins) {
@@ -149,7 +149,7 @@ class SelectValueCollector {
149
149
  return;
150
150
  }
151
151
  processJoinClause(clause) {
152
- const sourceName = clause.getAliasSourceName();
152
+ const sourceName = clause.getSourceAliasName();
153
153
  this.processSourceExpression(sourceName, clause.source);
154
154
  }
155
155
  processSourceExpression(sourceName, source) {
@@ -28,7 +28,7 @@ class UpstreamSelectQueryFinder {
28
28
  const ctes = cteCollector.collect(query);
29
29
  const cteMap = new Map();
30
30
  for (const cte of ctes) {
31
- cteMap.set(cte.getAliasSourceName(), cte);
31
+ cteMap.set(cte.getSourceAliasName(), cte);
32
32
  }
33
33
  return this.findUpstream(query, columnNames, cteMap);
34
34
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rawsql-ts",
3
- "version": "0.5.0-beta",
3
+ "version": "0.6.0-beta",
4
4
  "description": "[beta]High-performance SQL parser and AST analyzer written in TypeScript. Provides fast parsing and advanced transformation capabilities.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -1,5 +0,0 @@
1
- declare function extractNamespacesAndName(identifiers: string[]): {
2
- namespaces: string[] | null;
3
- name: string;
4
- };
5
- export { extractNamespacesAndName };
@@ -1,9 +0,0 @@
1
- import { Lexeme } from "../models/Lexeme";
2
- /**
3
- * Parses SQL Server-style escaped identifiers ([table]) and dot-separated identifiers.
4
- * Returns the list of identifiers and the new index after parsing.
5
- */
6
- export declare function parseEscapedOrDotSeparatedIdentifiers(lexemes: Lexeme[], index: number): {
7
- identifiers: string[];
8
- newIndex: number;
9
- };
@@ -1,16 +0,0 @@
1
- // Utility to extract namespaces and the final name from an array of identifiers
2
- // Example: ["db", "schema", "users"] => { namespaces: ["db", "schema"], name: "users" }
3
- function extractNamespacesAndName(identifiers) {
4
- if (!identifiers || identifiers.length === 0) {
5
- throw new Error("Identifier list is empty");
6
- }
7
- if (identifiers.length === 1) {
8
- return { namespaces: null, name: identifiers[0] };
9
- }
10
- return {
11
- namespaces: identifiers.slice(0, -1),
12
- name: identifiers[identifiers.length - 1]
13
- };
14
- }
15
- export { extractNamespacesAndName };
16
- //# sourceMappingURL=extractNamespacesAndName.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extractNamespacesAndName.js","sourceRoot":"","sources":["../../../src/utils/extractNamespacesAndName.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,wFAAwF;AACxF,SAAS,wBAAwB,CAAC,WAAqB;IACnD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC;IACD,OAAO;QACH,UAAU,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;KAC5C,CAAC;AACN,CAAC;AAED,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
@@ -1,39 +0,0 @@
1
- import { TokenType } from "../models/Lexeme";
2
- /**
3
- * Parses SQL Server-style escaped identifiers ([table]) and dot-separated identifiers.
4
- * Returns the list of identifiers and the new index after parsing.
5
- */
6
- export function parseEscapedOrDotSeparatedIdentifiers(lexemes, index) {
7
- let idx = index;
8
- const identifiers = [];
9
- while (idx < lexemes.length) {
10
- if (lexemes[idx].type & TokenType.OpenBracket) {
11
- idx++; // skip [
12
- if (idx >= lexemes.length || !(lexemes[idx].type & TokenType.Identifier)) {
13
- throw new Error(`Expected identifier after '[' at position ${idx}`);
14
- }
15
- identifiers.push(lexemes[idx].value);
16
- idx++;
17
- if (idx >= lexemes.length || lexemes[idx].value !== "]") {
18
- throw new Error(`Expected closing ']' after identifier at position ${idx}`);
19
- }
20
- idx++; // skip ]
21
- }
22
- else if (lexemes[idx].type & TokenType.Identifier) {
23
- identifiers.push(lexemes[idx].value);
24
- idx++;
25
- }
26
- else {
27
- break;
28
- }
29
- // Handle dot for schema.table or db.schema.table
30
- if (idx < lexemes.length && (lexemes[idx].type & TokenType.Dot)) {
31
- idx++; // skip dot
32
- }
33
- else {
34
- break;
35
- }
36
- }
37
- return { identifiers, newIndex: idx };
38
- }
39
- //# sourceMappingURL=parseEscapedOrDotSeparatedIdentifiers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseEscapedOrDotSeparatedIdentifiers.js","sourceRoot":"","sources":["../../../src/utils/parseEscapedOrDotSeparatedIdentifiers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;GAGG;AACH,MAAM,UAAU,qCAAqC,CAAC,OAAiB,EAAE,KAAa;IAClF,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;YAC5C,GAAG,EAAE,CAAC,CAAC,SAAS;YAChB,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvE,MAAM,IAAI,KAAK,CAAC,6CAA6C,GAAG,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACrC,GAAG,EAAE,CAAC;YACN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,qDAAqD,GAAG,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,GAAG,EAAE,CAAC,CAAC,SAAS;QACpB,CAAC;aAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC;YAClD,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACrC,GAAG,EAAE,CAAC;QACV,CAAC;aAAM,CAAC;YACJ,MAAM;QACV,CAAC;QACD,iDAAiD;QACjD,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9D,GAAG,EAAE,CAAC,CAAC,WAAW;QACtB,CAAC;aAAM,CAAC;YACJ,MAAM;QACV,CAAC;IACL,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAC1C,CAAC"}
@@ -1,5 +0,0 @@
1
- declare function extractNamespacesAndName(identifiers: string[]): {
2
- namespaces: string[] | null;
3
- name: string;
4
- };
5
- export { extractNamespacesAndName };
@@ -1,18 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.extractNamespacesAndName = extractNamespacesAndName;
4
- // Utility to extract namespaces and the final name from an array of identifiers
5
- // Example: ["db", "schema", "users"] => { namespaces: ["db", "schema"], name: "users" }
6
- function extractNamespacesAndName(identifiers) {
7
- if (!identifiers || identifiers.length === 0) {
8
- throw new Error("Identifier list is empty");
9
- }
10
- if (identifiers.length === 1) {
11
- return { namespaces: null, name: identifiers[0] };
12
- }
13
- return {
14
- namespaces: identifiers.slice(0, -1),
15
- name: identifiers[identifiers.length - 1]
16
- };
17
- }
18
- //# sourceMappingURL=extractNamespacesAndName.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extractNamespacesAndName.js","sourceRoot":"","sources":["../../src/utils/extractNamespacesAndName.ts"],"names":[],"mappings":";;AAeS,4DAAwB;AAfjC,gFAAgF;AAChF,wFAAwF;AACxF,SAAS,wBAAwB,CAAC,WAAqB;IACnD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC;IACD,OAAO;QACH,UAAU,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;KAC5C,CAAC;AACN,CAAC"}
@@ -1,9 +0,0 @@
1
- import { Lexeme } from "../models/Lexeme";
2
- /**
3
- * Parses SQL Server-style escaped identifiers ([table]) and dot-separated identifiers.
4
- * Returns the list of identifiers and the new index after parsing.
5
- */
6
- export declare function parseEscapedOrDotSeparatedIdentifiers(lexemes: Lexeme[], index: number): {
7
- identifiers: string[];
8
- newIndex: number;
9
- };
@@ -1,42 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseEscapedOrDotSeparatedIdentifiers = parseEscapedOrDotSeparatedIdentifiers;
4
- const Lexeme_1 = require("../models/Lexeme");
5
- /**
6
- * Parses SQL Server-style escaped identifiers ([table]) and dot-separated identifiers.
7
- * Returns the list of identifiers and the new index after parsing.
8
- */
9
- function parseEscapedOrDotSeparatedIdentifiers(lexemes, index) {
10
- let idx = index;
11
- const identifiers = [];
12
- while (idx < lexemes.length) {
13
- if (lexemes[idx].type & Lexeme_1.TokenType.OpenBracket) {
14
- idx++; // skip [
15
- if (idx >= lexemes.length || !(lexemes[idx].type & Lexeme_1.TokenType.Identifier)) {
16
- throw new Error(`Expected identifier after '[' at position ${idx}`);
17
- }
18
- identifiers.push(lexemes[idx].value);
19
- idx++;
20
- if (idx >= lexemes.length || lexemes[idx].value !== "]") {
21
- throw new Error(`Expected closing ']' after identifier at position ${idx}`);
22
- }
23
- idx++; // skip ]
24
- }
25
- else if (lexemes[idx].type & Lexeme_1.TokenType.Identifier) {
26
- identifiers.push(lexemes[idx].value);
27
- idx++;
28
- }
29
- else {
30
- break;
31
- }
32
- // Handle dot for schema.table or db.schema.table
33
- if (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.Dot)) {
34
- idx++; // skip dot
35
- }
36
- else {
37
- break;
38
- }
39
- }
40
- return { identifiers, newIndex: idx };
41
- }
42
- //# sourceMappingURL=parseEscapedOrDotSeparatedIdentifiers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseEscapedOrDotSeparatedIdentifiers.js","sourceRoot":"","sources":["../../src/utils/parseEscapedOrDotSeparatedIdentifiers.ts"],"names":[],"mappings":";;AAMA,sFA6BC;AAnCD,6CAAqD;AAErD;;;GAGG;AACH,SAAgB,qCAAqC,CAAC,OAAiB,EAAE,KAAa;IAClF,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,kBAAS,CAAC,WAAW,EAAE,CAAC;YAC5C,GAAG,EAAE,CAAC,CAAC,SAAS;YAChB,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,kBAAS,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvE,MAAM,IAAI,KAAK,CAAC,6CAA6C,GAAG,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACrC,GAAG,EAAE,CAAC;YACN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,qDAAqD,GAAG,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,GAAG,EAAE,CAAC,CAAC,SAAS;QACpB,CAAC;aAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,kBAAS,CAAC,UAAU,EAAE,CAAC;YAClD,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACrC,GAAG,EAAE,CAAC;QACV,CAAC;aAAM,CAAC;YACJ,MAAM;QACV,CAAC;QACD,iDAAiD;QACjD,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,kBAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9D,GAAG,EAAE,CAAC,CAAC,WAAW;QACtB,CAAC;aAAM,CAAC;YACJ,MAAM;QACV,CAAC;IACL,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAC1C,CAAC"}