@shaxpir/squilt 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +289 -1
  2. package/dist/ast/AlterTableQuery.d.ts +32 -0
  3. package/dist/ast/AlterTableQuery.js +60 -0
  4. package/dist/ast/BetweenExpression.d.ts +10 -0
  5. package/dist/ast/BetweenExpression.js +18 -0
  6. package/dist/ast/CastExpression.d.ts +13 -0
  7. package/dist/ast/CastExpression.js +25 -0
  8. package/dist/ast/CollateExpression.d.ts +18 -0
  9. package/dist/ast/CollateExpression.js +30 -0
  10. package/dist/ast/CreateIndexQuery.d.ts +25 -0
  11. package/dist/ast/CreateIndexQuery.js +64 -0
  12. package/dist/ast/CreateTableQuery.d.ts +57 -0
  13. package/dist/ast/CreateTableQuery.js +79 -0
  14. package/dist/ast/CreateViewQuery.d.ts +34 -0
  15. package/dist/ast/CreateViewQuery.js +61 -0
  16. package/dist/ast/CreateVirtualTableQuery.d.ts +32 -0
  17. package/dist/ast/CreateVirtualTableQuery.js +74 -0
  18. package/dist/ast/DeleteQuery.d.ts +17 -0
  19. package/dist/ast/DeleteQuery.js +43 -0
  20. package/dist/ast/DropIndexQuery.d.ts +14 -0
  21. package/dist/ast/DropIndexQuery.js +35 -0
  22. package/dist/ast/DropTableQuery.d.ts +14 -0
  23. package/dist/ast/DropTableQuery.js +35 -0
  24. package/dist/ast/DropViewQuery.d.ts +11 -0
  25. package/dist/ast/DropViewQuery.js +24 -0
  26. package/dist/ast/FunctionExpression.d.ts +21 -0
  27. package/dist/ast/FunctionExpression.js +40 -1
  28. package/dist/ast/FunctionName.d.ts +1 -1
  29. package/dist/ast/FunctionName.js +1 -1
  30. package/dist/ast/InsertQuery.d.ts +24 -1
  31. package/dist/ast/InsertQuery.js +49 -1
  32. package/dist/ast/Operator.d.ts +2 -0
  33. package/dist/ast/Operator.js +3 -1
  34. package/dist/ast/SelectQuery.d.ts +4 -0
  35. package/dist/ast/SelectQuery.js +11 -1
  36. package/dist/ast/SubqueryExpression.d.ts +18 -0
  37. package/dist/ast/SubqueryExpression.js +27 -0
  38. package/dist/ast/UpdateQuery.d.ts +24 -0
  39. package/dist/ast/UpdateQuery.js +51 -0
  40. package/dist/ast/WindowExpression.d.ts +51 -0
  41. package/dist/ast/WindowExpression.js +61 -0
  42. package/dist/ast/WindowSpecification.d.ts +46 -0
  43. package/dist/ast/WindowSpecification.js +60 -0
  44. package/dist/builder/QueryBuilder.d.ts +20 -0
  45. package/dist/builder/QueryBuilder.js +41 -1
  46. package/dist/builder/Shorthand.d.ts +51 -0
  47. package/dist/builder/Shorthand.js +125 -1
  48. package/dist/index.d.ts +17 -1
  49. package/dist/index.js +59 -3
  50. package/dist/renderer/CompactQueryRenderer.d.ts +34 -2
  51. package/dist/renderer/CompactQueryRenderer.js +272 -2
  52. package/dist/renderer/IndentedQueryRenderer.d.ts +34 -2
  53. package/dist/renderer/IndentedQueryRenderer.js +289 -3
  54. package/dist/renderer/QueryRenderer.d.ts +11 -1
  55. package/dist/renderer/QueryRenderer.js +1 -1
  56. package/dist/validate/CommonQueryValidator.d.ts +31 -1
  57. package/dist/validate/CommonQueryValidator.js +253 -4
  58. package/dist/validate/QueryValidator.d.ts +10 -1
  59. package/dist/validate/QueryValidator.js +1 -1
  60. package/dist/validate/SQLiteQueryValidator.d.ts +16 -1
  61. package/dist/validate/SQLiteQueryValidator.js +32 -3
  62. package/dist/visitor/ParamCollector.d.ts +30 -0
  63. package/dist/visitor/ParamCollector.js +109 -2
  64. package/dist/visitor/QueryIdentityTransformer.d.ts +30 -0
  65. package/dist/visitor/QueryIdentityTransformer.js +217 -2
  66. package/dist/visitor/SqlTreeNodeVisitor.d.ts +30 -0
  67. package/dist/visitor/SqlTreeNodeVisitor.js +1 -1
  68. package/package.json +4 -1
@@ -23,7 +23,246 @@ class CompactQueryRenderer {
23
23
  if (node['_columns'].length > 0) {
24
24
  parts.push(`(${node['_columns'].map(QueryRenderer_1.quoteIdentifier).join(', ')})`);
25
25
  }
26
- parts.push(`VALUES (${node['_values'].map(v => v.accept(this)).join(', ')})`);
26
+ if (node['_fromSelect']) {
27
+ parts.push(node['_fromSelect'].accept(this));
28
+ }
29
+ else {
30
+ parts.push(`VALUES (${node['_values'].map(v => v.accept(this)).join(', ')})`);
31
+ }
32
+ // ON CONFLICT clause
33
+ if (node['_onConflictColumns'].length > 0) {
34
+ const conflictCols = node['_onConflictColumns'].map(QueryRenderer_1.quoteIdentifier).join(', ');
35
+ if (node['_doNothing']) {
36
+ parts.push(`ON CONFLICT (${conflictCols}) DO NOTHING`);
37
+ }
38
+ else if (node['_doUpdateSets'].length > 0) {
39
+ const setClauses = node['_doUpdateSets'].map(s => `${(0, QueryRenderer_1.quoteIdentifier)(s.column)} = ${s.value.accept(this)}`).join(', ');
40
+ let onConflict = `ON CONFLICT (${conflictCols})`;
41
+ if (node['_onConflictWhere']) {
42
+ onConflict += ` WHERE ${node['_onConflictWhere'].accept(this)}`;
43
+ }
44
+ onConflict += ` DO UPDATE SET ${setClauses}`;
45
+ parts.push(onConflict);
46
+ }
47
+ }
48
+ if (node['_returning'].length > 0) {
49
+ parts.push(`RETURNING ${node['_returning'].map(r => r.accept(this)).join(', ')}`);
50
+ }
51
+ return parts.join(' ');
52
+ }
53
+ visitDeleteQuery(node) {
54
+ const parts = [];
55
+ parts.push('DELETE');
56
+ parts.push(`FROM ${(0, QueryRenderer_1.quoteIdentifier)(node['_tableName'])}`);
57
+ if (node['_where']) {
58
+ parts.push(`WHERE ${node['_where'].accept(this)}`);
59
+ }
60
+ if (node['_returning'].length > 0) {
61
+ parts.push(`RETURNING ${node['_returning'].map(r => r.accept(this)).join(', ')}`);
62
+ }
63
+ return parts.join(' ');
64
+ }
65
+ visitUpdateQuery(node) {
66
+ const parts = [];
67
+ parts.push(`UPDATE ${(0, QueryRenderer_1.quoteIdentifier)(node['_tableName'])}`);
68
+ if (node['_set'].length > 0) {
69
+ const setClauses = node['_set'].map(s => `${(0, QueryRenderer_1.quoteIdentifier)(s.column)} = ${s.value.accept(this)}`).join(', ');
70
+ parts.push(`SET ${setClauses}`);
71
+ }
72
+ if (node['_where']) {
73
+ parts.push(`WHERE ${node['_where'].accept(this)}`);
74
+ }
75
+ if (node['_returning'].length > 0) {
76
+ parts.push(`RETURNING ${node['_returning'].map(r => r.accept(this)).join(', ')}`);
77
+ }
78
+ return parts.join(' ');
79
+ }
80
+ visitDropTableQuery(node) {
81
+ const ifExists = node.hasIfExists ? ' IF EXISTS' : '';
82
+ return `DROP TABLE${ifExists} ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)}`;
83
+ }
84
+ visitDropIndexQuery(node) {
85
+ const ifExists = node.hasIfExists ? ' IF EXISTS' : '';
86
+ return `DROP INDEX${ifExists} ${(0, QueryRenderer_1.quoteIdentifier)(node.indexName)}`;
87
+ }
88
+ visitDropViewQuery(node) {
89
+ const ifExists = node.hasIfExists ? ' IF EXISTS' : '';
90
+ return `DROP VIEW${ifExists} ${(0, QueryRenderer_1.quoteIdentifier)(node.viewName)}`;
91
+ }
92
+ visitCreateViewQuery(node) {
93
+ const parts = [];
94
+ parts.push('CREATE');
95
+ if (node.isTemporary) {
96
+ parts.push('TEMPORARY');
97
+ }
98
+ parts.push('VIEW');
99
+ if (node.hasIfNotExists) {
100
+ parts.push('IF NOT EXISTS');
101
+ }
102
+ parts.push((0, QueryRenderer_1.quoteIdentifier)(node.viewName));
103
+ if (node.columns.length > 0) {
104
+ parts.push(`(${node.columns.map(QueryRenderer_1.quoteIdentifier).join(', ')})`);
105
+ }
106
+ parts.push('AS');
107
+ if (!node.selectQuery) {
108
+ throw new Error('CreateViewQuery must have a SELECT query');
109
+ }
110
+ parts.push(node.selectQuery.accept(this));
111
+ return parts.join(' ');
112
+ }
113
+ visitCreateIndexQuery(node) {
114
+ const parts = [];
115
+ const unique = node.isUnique ? 'UNIQUE ' : '';
116
+ const ifNotExists = node.hasIfNotExists ? ' IF NOT EXISTS' : '';
117
+ parts.push(`CREATE ${unique}INDEX${ifNotExists} ${(0, QueryRenderer_1.quoteIdentifier)(node.indexName)}`);
118
+ parts.push(`ON ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)} (${node.columns.map(QueryRenderer_1.quoteIdentifier).join(', ')})`);
119
+ if (node.whereExpression) {
120
+ parts.push(`WHERE ${node.whereExpression.accept(this)}`);
121
+ }
122
+ return parts.join(' ');
123
+ }
124
+ visitAlterTableQuery(node) {
125
+ const op = node.operation;
126
+ if (!op) {
127
+ throw new Error('AlterTableQuery must have an operation');
128
+ }
129
+ switch (op.type) {
130
+ case 'ADD_COLUMN':
131
+ return `ALTER TABLE ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)} ADD COLUMN ${this.renderColumnDefinition(op.column)}`;
132
+ case 'RENAME_COLUMN':
133
+ return `ALTER TABLE ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)} RENAME COLUMN ${(0, QueryRenderer_1.quoteIdentifier)(op.oldName)} TO ${(0, QueryRenderer_1.quoteIdentifier)(op.newName)}`;
134
+ case 'DROP_COLUMN':
135
+ return `ALTER TABLE ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)} DROP COLUMN ${(0, QueryRenderer_1.quoteIdentifier)(op.columnName)}`;
136
+ case 'RENAME_TABLE':
137
+ return `ALTER TABLE ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)} RENAME TO ${(0, QueryRenderer_1.quoteIdentifier)(op.newTableName)}`;
138
+ }
139
+ }
140
+ visitCreateTableQuery(node) {
141
+ const parts = [];
142
+ const ifNotExists = node.hasIfNotExists ? ' IF NOT EXISTS' : '';
143
+ parts.push(`CREATE TABLE${ifNotExists} ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)} (`);
144
+ const definitions = [];
145
+ // Column definitions
146
+ for (const col of node.columns) {
147
+ definitions.push(this.renderColumnDefinition(col));
148
+ }
149
+ // Table constraints
150
+ for (const constraint of node.tableConstraints) {
151
+ definitions.push(this.renderTableConstraint(constraint));
152
+ }
153
+ parts.push(definitions.join(', '));
154
+ parts.push(')');
155
+ // Table options
156
+ const options = [];
157
+ if (node.hasWithoutRowid) {
158
+ options.push('WITHOUT ROWID');
159
+ }
160
+ if (node.isStrict) {
161
+ options.push('STRICT');
162
+ }
163
+ if (options.length > 0) {
164
+ parts.push(' ' + options.join(', '));
165
+ }
166
+ return parts.join('');
167
+ }
168
+ visitCreateVirtualTableQuery(node) {
169
+ const ifNotExists = node.hasIfNotExists ? ' IF NOT EXISTS' : '';
170
+ const args = [];
171
+ // Add columns (FTS5 columns don't have types)
172
+ for (const col of node.columns) {
173
+ args.push((0, QueryRenderer_1.quoteIdentifier)(col));
174
+ }
175
+ // Add FTS5 options
176
+ const opts = node.options;
177
+ if (opts.tokenize) {
178
+ args.push(`tokenize = '${opts.tokenize}'`);
179
+ }
180
+ if (opts.content) {
181
+ args.push(`content = '${opts.content}'`);
182
+ }
183
+ if (opts.contentRowid) {
184
+ args.push(`content_rowid = '${opts.contentRowid}'`);
185
+ }
186
+ if (opts.prefix) {
187
+ args.push(`prefix = '${opts.prefix}'`);
188
+ }
189
+ return `CREATE VIRTUAL TABLE${ifNotExists} ${(0, QueryRenderer_1.quoteIdentifier)(node.tableName)} USING ${node.module}(${args.join(', ')})`;
190
+ }
191
+ renderColumnDefinition(col) {
192
+ const parts = [(0, QueryRenderer_1.quoteIdentifier)(col.name), col.type];
193
+ if (col.constraints.primaryKey) {
194
+ parts.push('PRIMARY KEY');
195
+ if (col.constraints.autoIncrement) {
196
+ parts.push('AUTOINCREMENT');
197
+ }
198
+ }
199
+ if (col.constraints.notNull) {
200
+ parts.push('NOT NULL');
201
+ }
202
+ if (col.constraints.unique) {
203
+ parts.push('UNIQUE');
204
+ }
205
+ if (col.constraints.default !== undefined) {
206
+ if (col.constraints.default === null) {
207
+ parts.push('DEFAULT NULL');
208
+ }
209
+ else if (typeof col.constraints.default === 'string') {
210
+ // Check if it's a SQL keyword/function like CURRENT_TIMESTAMP
211
+ const sqlKeywords = ['CURRENT_TIMESTAMP', 'CURRENT_DATE', 'CURRENT_TIME', 'TRUE', 'FALSE'];
212
+ if (sqlKeywords.includes(col.constraints.default.toUpperCase())) {
213
+ parts.push(`DEFAULT ${col.constraints.default}`);
214
+ }
215
+ else {
216
+ parts.push(`DEFAULT '${col.constraints.default.replace(/'/g, "''")}'`);
217
+ }
218
+ }
219
+ else {
220
+ parts.push(`DEFAULT ${col.constraints.default}`);
221
+ }
222
+ }
223
+ if (col.constraints.check) {
224
+ parts.push(`CHECK ${col.constraints.check.accept(this)}`);
225
+ }
226
+ if (col.constraints.references) {
227
+ const ref = col.constraints.references;
228
+ let refStr = `REFERENCES ${(0, QueryRenderer_1.quoteIdentifier)(ref.table)}(${(0, QueryRenderer_1.quoteIdentifier)(ref.column)})`;
229
+ if (ref.onDelete) {
230
+ refStr += ` ON DELETE ${ref.onDelete}`;
231
+ }
232
+ if (ref.onUpdate) {
233
+ refStr += ` ON UPDATE ${ref.onUpdate}`;
234
+ }
235
+ parts.push(refStr);
236
+ }
237
+ return parts.join(' ');
238
+ }
239
+ renderTableConstraint(constraint) {
240
+ const parts = [];
241
+ if (constraint.name) {
242
+ parts.push(`CONSTRAINT ${(0, QueryRenderer_1.quoteIdentifier)(constraint.name)}`);
243
+ }
244
+ switch (constraint.type) {
245
+ case 'PRIMARY KEY':
246
+ parts.push(`PRIMARY KEY (${constraint.columns.map(QueryRenderer_1.quoteIdentifier).join(', ')})`);
247
+ break;
248
+ case 'UNIQUE':
249
+ parts.push(`UNIQUE (${constraint.columns.map(QueryRenderer_1.quoteIdentifier).join(', ')})`);
250
+ break;
251
+ case 'FOREIGN KEY':
252
+ const ref = constraint.references;
253
+ let fkStr = `FOREIGN KEY (${constraint.columns.map(QueryRenderer_1.quoteIdentifier).join(', ')}) REFERENCES ${(0, QueryRenderer_1.quoteIdentifier)(ref.table)}(${(0, QueryRenderer_1.quoteIdentifier)(ref.column)})`;
254
+ if (ref.onDelete) {
255
+ fkStr += ` ON DELETE ${ref.onDelete}`;
256
+ }
257
+ if (ref.onUpdate) {
258
+ fkStr += ` ON UPDATE ${ref.onUpdate}`;
259
+ }
260
+ parts.push(fkStr);
261
+ break;
262
+ case 'CHECK':
263
+ parts.push(`CHECK ${constraint.check.accept(this)}`);
264
+ break;
265
+ }
27
266
  return parts.join(' ');
28
267
  }
29
268
  visitSelectQuery(node) {
@@ -71,6 +310,12 @@ class CompactQueryRenderer {
71
310
  if (node['_union'].length > 0) {
72
311
  parts.push(node['_union'].map(u => `UNION ${u.accept(this)}`).join(' '));
73
312
  }
313
+ if (node['_intersect'].length > 0) {
314
+ parts.push(node['_intersect'].map(i => `INTERSECT ${i.accept(this)}`).join(' '));
315
+ }
316
+ if (node['_except'].length > 0) {
317
+ parts.push(node['_except'].map(e => `EXCEPT ${e.accept(this)}`).join(' '));
318
+ }
74
319
  if (node['_orderBy'].length > 0) {
75
320
  parts.push(`ORDER BY ${node['_orderBy'].map(o => o.accept(this)).join(', ')}`);
76
321
  }
@@ -127,6 +372,10 @@ class CompactQueryRenderer {
127
372
  visitBinaryExpression(node) {
128
373
  return `(${node.left.accept(this)} ${node.operator} ${node.right.accept(this)})`;
129
374
  }
375
+ visitBetweenExpression(node) {
376
+ const not = node.not ? ' NOT' : '';
377
+ return `(${node.operand.accept(this)}${not} BETWEEN ${node.low.accept(this)} AND ${node.high.accept(this)})`;
378
+ }
130
379
  visitUnaryExpression(node) {
131
380
  const operand = node.operand.accept(this);
132
381
  if (node.operator === Operator_1.Operator.IS_NULL || node.operator === Operator_1.Operator.IS_NOT_NULL) {
@@ -167,6 +416,27 @@ class CompactQueryRenderer {
167
416
  parts.push('END');
168
417
  return parts.join(' ');
169
418
  }
419
+ visitCastExpression(node) {
420
+ return `CAST(${node.expression.accept(this)} AS ${node.targetType})`;
421
+ }
422
+ visitCollateExpression(node) {
423
+ return `${node.expression.accept(this)} COLLATE ${node.collation}`;
424
+ }
425
+ visitSubqueryExpression(node) {
426
+ return `(${node.subquery.accept(this)})`;
427
+ }
428
+ visitWindowExpression(node) {
429
+ const fnPart = node.function.accept(this);
430
+ const spec = node.windowSpec;
431
+ const parts = [];
432
+ if (spec.partitionByColumns.length > 0) {
433
+ parts.push(`PARTITION BY ${spec.partitionByColumns.map(c => c.accept(this)).join(', ')}`);
434
+ }
435
+ if (spec.orderByColumns.length > 0) {
436
+ parts.push(`ORDER BY ${spec.orderByColumns.map(o => o.accept(this)).join(', ')}`);
437
+ }
438
+ return `${fnPart} OVER (${parts.join(' ')})`;
439
+ }
170
440
  visitFunctionExpression(node) {
171
441
  const args = node.args.map(a => a.accept(this)).join(', ');
172
442
  const distinctPrefix = node.distinct ? 'DISTINCT ' : '';
@@ -189,4 +459,4 @@ class CompactQueryRenderer {
189
459
  }
190
460
  }
191
461
  exports.CompactQueryRenderer = CompactQueryRenderer;
192
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGFjdFF1ZXJ5UmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVuZGVyZXIvQ29tcGFjdFF1ZXJ5UmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esd0NBQXFDO0FBTXJDLHNDQUEwRTtBQUkxRSxzQ0FBbUM7QUFFbkMsOENBQTJDO0FBRTNDLG9EQUFpRDtBQUdqRCxzRUFBOEg7QUFDOUgsbURBQWlFO0FBRWpFLE1BQWEsb0JBQW9CO0lBQWpDO1FBR1ksNEJBQXVCLEdBQUcsSUFBSSxtREFBOEIsRUFBUSxDQUFDO1FBQ3JFLHVCQUFrQixHQUFHLElBQUksOENBQXlCLEVBQVUsQ0FBQztJQWdNekUsQ0FBQztJQTlMUSxNQUFNLENBQUMsSUFBK0I7UUFDM0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxJQUFpQjtRQUNoQyxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFDM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFBLCtCQUFlLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQywrQkFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUks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LENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNwQixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1RCxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMs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QUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUMvQyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBbUI7UUFDcEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFrQjtRQUNqQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQscUJBQXFCLENBQUMsSUFBc0I7UUFDMUMsT0FBTyxXQUFXLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEQsQ0FBQztDQUNGO0FBcE1ELG9EQW9NQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFsaWFzYWJsZUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0Fic3RyYWN0aW9uc1wiO1xuaW1wb3J0IHsgQWxpYXMgfSBmcm9tIFwiLi4vYXN0L0FsaWFzXCI7XG5pbXBvcnQgeyBCaW5hcnlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9CaW5hcnlFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBDYXNlRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvQ2FzZUV4cHJlc3Npb25cIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi9hc3QvQ29sdW1uXCI7XG5pbXBvcnQgeyBDb25jYXQgfSBmcm9tIFwiLi4vYXN0L0NvbmNhdFwiO1xuaW1wb3J0IHsgRXhpc3RzRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvRXhpc3RzRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgRnJvbSwgSnNvbkVhY2hGcm9tLCBTdWJxdWVyeUZyb20sIFRhYmxlRnJvbSB9IGZyb20gXCIuLi9hc3QvRnJvbVwiO1xuaW1wb3J0IHsgRnVuY3Rpb25FeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9GdW5jdGlvbkV4cHJlc3Npb25cIjtcbmltcG9ydCB7IEluRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvSW5FeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBJbnNlcnRRdWVyeSB9IGZyb20gXCIuLi9hc3QvSW5zZXJ0UXVlcnlcIjtcbmltcG9ydCB7IEpvaW4gfSBmcm9tIFwiLi4vYXN0L0pvaW5cIjtcbmltcG9ydCB7IE51bGxMaXRlcmFsLCBOdW1iZXJMaXRlcmFsLCBQYXJhbSwgU3RyaW5nTGl0ZXJhbCB9IGZyb20gXCIuLi9hc3QvTGl0ZXJhbHNcIjtcbmltcG9ydCB7IE9wZXJhdG9yIH0gZnJvbSBcIi4uL2FzdC9PcGVyYXRvclwiO1xuaW1wb3J0IHsgT3JkZXJCeSB9IGZyb20gXCIuLi9hc3QvT3JkZXJCeVwiO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnkgfSBmcm9tIFwiLi4vYXN0L1NlbGVjdFF1ZXJ5XCI7XG5pbXBvcnQgeyBVbmFyeUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L1VuYXJ5RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgV2l0aCB9IGZyb20gXCIuLi9hc3QvV2l0aFwiO1xuaW1wb3J0IHsgQ29sdW1uTGlrZVZpc2l0b3JBY2NlcHRvciwgRnJvbUxpa2VBbmRKb2luVmlzaXRvckFjY2VwdG9yLCBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcbmltcG9ydCB7IFF1ZXJ5UmVuZGVyZXIsIHF1b3RlSWRlbnRpZmllciB9IGZyb20gXCIuL1F1ZXJ5UmVuZGVyZXJcIjtcblxuZXhwb3J0IGNsYXNzIENvbXBhY3RRdWVyeVJlbmRlcmVyXG4gIGltcGxlbWVudHMgUXVlcnlSZW5kZXJlciwgU3FsVHJlZU5vZGVWaXNpdG9yPHN0cmluZz5cbntcbiAgcHJvdGVjdGVkIGZyb21MaWtlQW5kSm9pbkFjY2VwdG9yID0gbmV3IEZyb21MaWtlQW5kSm9pblZpc2l0b3JBY2NlcHRvcjx2b2lkPigpO1xuICBwcm90ZWN0ZWQgY29sdW1uTGlrZUFjY2VwdG9yID0gbmV3IENvbHVtbkxpa2VWaXNpdG9yQWNjZXB0b3I8c3RyaW5nPigpO1xuXG4gIHB1YmxpYyByZW5kZXIobm9kZTogU2VsZWN0UXVlcnkgfCBJbnNlcnRRdWVyeSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5vZGUuYWNjZXB0KHRoaXMpO1xuICB9XG5cbiAgdmlzaXRJbnNlcnRRdWVyeShub2RlOiBJbnNlcnRRdWVyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgcGFydHMucHVzaChgSU5TRVJUJHtub2RlLmlzT3JSZXBsYWNlKCkgPyAnIE9SIFJFUExBQ0UnIDogJyd9YCk7XG4gICAgcGFydHMucHVzaChgSU5UTyAke3F1b3RlSWRlbnRpZmllcihub2RlWydfdGFibGVOYW1lJ10pfWApO1xuICAgIGlmIChub2RlWydfY29sdW1ucyddLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYCgke25vZGVbJ19jb2x1bW5zJ10ubWFwKHF1b3RlSWRlbnRpZmllcikuam9pbignLCAnKX0pYCk7XG4gICAgfVxuICAgIHBhcnRzLnB1c2goYFZBTFVFUyAoJHtub2RlWydfdmFsdWVzJ10ubWFwKHYgPT4gdi5hY2NlcHQodGhpcykpLmpvaW4oJywgJyl9KWApO1xuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2aXNpdFNlbGVjdFF1ZXJ5KG5vZGU6IFNlbGVjdFF1ZXJ5KTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAobm9kZVsnX3dpdGgnXS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGBXSVRIICR7bm9kZVsnX3dpdGgnXS5tYXAodyA9PiB3LmFjY2VwdCh0aGlzKSkuam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgcGFydHMucHVzaChgU0VMRUNUJHtub2RlLmlzRGlzdGluY3QoKSA/ICcgRElTVElOQ1QnIDogJyd9YCk7XG4gICAgaWYgKG5vZGVbJ19jb2x1bW5zJ10ubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChub2RlWydfY29sdW1ucyddLm1hcChjID0+IHRoaXMuY29sdW1uTGlrZUFjY2VwdG9yLmFjY2VwdCh0aGlzLCBjKSkuam9pbignLCAnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRzLnB1c2goJyonKTtcbiAgICB9XG4gICAgaWYgKG5vZGVbJ19mcm9tc0FuZEpvaW5zJ10ubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGZyb21zQW5kSm9pbnNUZXh0ID0gJyc7XG4gICAgICBmb3IgKGNvbnN0IGZyb21PckpvaW4gb2Ygbm9kZVsnX2Zyb21zQW5kSm9pbnMnXSkge1xuICAgICAgICBpZiAoZnJvbU9ySm9pbiBpbnN0YW5jZW9mIEpvaW4pIHtcbiAgICAgICAgICBmcm9tc0FuZEpvaW5zVGV4dCArPSBgICR7ZnJvbU9ySm9pbi5hY2NlcHQodGhpcyl9YDtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBmcm9tT3JKb2luIGluc3RhbmNlb2YgQWxpYXMgfHxcbiAgICAgICAgICBmcm9tT3JKb2luIGluc3RhbmNlb2YgRnJvbSB8fFxuICAgICAgICAgIGZyb21PckpvaW4gaW5zdGFuY2VvZiBUYWJsZUZyb20gfHxcbiAgICAgICAgICBmcm9tT3JKb2luIGluc3RhbmNlb2YgU3VicXVlcnlGcm9tIHx8XG4gICAgICAgICAgZnJvbU9ySm9pbiBpbnN0YW5jZW9mIEpzb25FYWNoRnJvbVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoZnJvbXNBbmRKb2luc1RleHQpIHtcbiAgICAgICAgICAgIGZyb21zQW5kSm9pbnNUZXh0ICs9IGAsICR7ZnJvbU9ySm9pbi5hY2NlcHQodGhpcyl9YDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJvbXNBbmRKb2luc1RleHQgKz0gYEZST00gJHtmcm9tT3JKb2luLmFjY2VwdCh0aGlzKX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGFydHMucHVzaChmcm9tc0FuZEpvaW5zVGV4dCk7XG4gICAgfVxuICAgIGlmIChub2RlWydfd2hlcmUnXSkge1xuICAgICAgcGFydHMucHVzaChgV0hFUkUgJHtub2RlWydfd2hlcmUnXS5hY2NlcHQodGhpcyl9YCk7XG4gICAgfVxuICAgIGlmIChub2RlWydfZ3JvdXBCeSddLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYEdST1VQIEJZICR7bm9kZVsnX2dyb3VwQnknXS5tYXAoYyA9PiBjLmFjY2VwdCh0aGlzKSkuam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgaWYgKG5vZGVbJ19oYXZpbmcnXSkge1xuICAgICAgcGFydHMucHVzaChgSEFWSU5HICR7bm9kZVsnX2hhdmluZyddLmFjY2VwdCh0aGlzKX1gKTtcbiAgICB9XG4gICAgaWYgKG5vZGVbJ191bmlvbiddLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2gobm9kZVsnX3VuaW9uJ10ubWFwKHUgPT4gYFVOSU9OICR7dS5hY2NlcHQodGhpcyl9YCkuam9pbignICcpKTtcbiAgICB9XG4gICAgaWYgKG5vZGVbJ19vcmRlckJ5J10ubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChgT1JERVIgQlkgJHtub2RlWydfb3JkZXJCeSddLm1hcChvID0+IG8uYWNjZXB0KHRoaXMpKS5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX2xpbWl0J10gIT09IG51bGwgJiYgbm9kZVsnX2xpbWl0J10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFydHMucHVzaChgTElNSVQgJHtub2RlWydfbGltaXQnXX1gKTtcbiAgICAgIGlmIChub2RlWydfb2Zmc2V0J10gIT09IG51bGwgJiYgbm9kZVsnX29mZnNldCddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFydHMucHVzaChgT0ZGU0VUICR7bm9kZVsnX29mZnNldCddfWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFydHMuZmlsdGVyKHAgPT4gcCkuam9pbignICcpO1xuICB9XG5cbiAgdmlzaXRUYWJsZUZyb20obm9kZTogVGFibGVGcm9tKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cXVvdGVJZGVudGlmaWVyKG5vZGUudGFibGVOYW1lKX1gO1xuICB9XG5cbiAgdmlzaXRTdWJxdWVyeUZyb20obm9kZTogU3VicXVlcnlGcm9tKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCgke25vZGUuc3VicXVlcnkuYWNjZXB0KHRoaXMpfSlgO1xuICB9XG5cbiAgdmlzaXRKc29uRWFjaEZyb20obm9kZTogSnNvbkVhY2hGcm9tKTogc3RyaW5nIHtcbiAgICBjb25zdCBleHByID0gbm9kZS5qc29uRXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7XG4gICAgY29uc3QgcGF0aCA9IG5vZGUuanNvblBhdGggPyBgLCAke25vZGUuanNvblBhdGguYWNjZXB0KHRoaXMpfWAgOiAnJztcbiAgICByZXR1cm4gYGpzb25fZWFjaCgke2V4cHJ9JHtwYXRofSlgO1xuICB9XG5cbiAgdmlzaXRDb2x1bW4obm9kZTogQ29sdW1uKTogc3RyaW5nIHtcbiAgICBpZiAobm9kZS5oYXNUYWJsZU5hbWUoKSkge1xuICAgICAgcmV0dXJuIGAke3F1b3RlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSBhcyBzdHJpbmcpfS4ke3F1b3RlSWRlbnRpZmllcihub2RlLmNvbHVtbk5hbWUpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHtxdW90ZUlkZW50aWZpZXIobm9kZS5jb2x1bW5OYW1lKX1gO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0QWxpYXMobm9kZTogQWxpYXM8RnJvbXxBbGlhc2FibGVFeHByZXNzaW9uPik6IHN0cmluZyB7XG4gICAgY29uc3QgaXNTdWJxdWVyeSA9IG5vZGUucmVmZXJlbnQgaW5zdGFuY2VvZiBTdWJxdWVyeUZyb20gfHwgbm9kZS5yZWZlcmVudCBpbnN0YW5jZW9mIFNlbGVjdFF1ZXJ5O1xuICAgIGNvbnN0IHJlbmRlcmVkUmVmZXJlbnQgPSBub2RlLnJlZmVyZW50LmFjY2VwdCh0aGlzKTtcbiAgICBjb25zdCByZW5kZXJlZEFsaWFzTmFtZSA9IHF1b3RlSWRlbnRpZmllcihub2RlLmFsaWFzIGFzIHN0cmluZyk7XG4gICAgaWYgKG5vZGUucmVmZXJlbnQgaW5zdGFuY2VvZiBGcm9tKSB7XG4gICAgICByZXR1cm4gYCR7cmVuZGVyZWRSZWZlcmVudH0gJHtyZW5kZXJlZEFsaWFzTmFtZX1gO1xuICAgIH0gZWxzZSBpZiAoaXNTdWJxdWVyeSkge1xuICAgICAgcmV0dXJuIGAoJHtyZW5kZXJlZFJlZmVyZW50fSkgQVMgJHtyZW5kZXJlZEFsaWFzTmFtZX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7cmVuZGVyZWRSZWZlcmVudH0gQVMgJHtyZW5kZXJlZEFsaWFzTmFtZX1gO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0Sm9pbkNsYXVzZShub2RlOiBKb2luKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7bm9kZS50eXBlfSBKT0lOICR7cXVvdGVJZGVudGlmaWVyKG5vZGUudGFibGVOYW1lKX0gJHtxdW90ZUlkZW50aWZpZXIobm9kZS5hbGlhcyl9IE9OICR7bm9kZS5vbi5hY2NlcHQodGhpcyl9YDtcbiAgfVxuXG4gIHZpc2l0T3JkZXJCeShub2RlOiBPcmRlckJ5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7bm9kZS5jb2x1bW4uYWNjZXB0KHRoaXMpfSAke25vZGUuZGlyZWN0aW9ufWA7XG4gIH1cblxuICB2aXNpdFdpdGhDbGF1c2Uobm9kZTogV2l0aCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3F1b3RlSWRlbnRpZmllcihub2RlLm5hbWUpfSBBUyAoJHtub2RlLnF1ZXJ5LmFjY2VwdCh0aGlzKX0pYDtcbiAgfVxuXG4gIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihub2RlOiBCaW5hcnlFeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCgke25vZGUubGVmdC5hY2NlcHQodGhpcyl9ICR7bm9kZS5vcGVyYXRvcn0gJHtub2RlLnJpZ2h0LmFjY2VwdCh0aGlzKX0pYDtcbiAgfVxuXG4gIHZpc2l0VW5hcnlFeHByZXNzaW9uKG5vZGU6IFVuYXJ5RXhwcmVzc2lvbik6IHN0cmluZyB7XG4gICAgY29uc3Qgb3BlcmFuZCA9IG5vZGUub3BlcmFuZC5hY2NlcHQodGhpcyk7XG4gICAgaWYgKG5vZGUub3BlcmF0b3IgPT09IE9wZXJhdG9yLklTX05VTEwgfHwgbm9kZS5vcGVyYXRvciA9PT0gT3BlcmF0b3IuSVNfTk9UX05VTEwpIHtcbiAgICAgIHJldHVybiBgKCR7b3BlcmFuZH0gJHtub2RlLm9wZXJhdG9yfSlgO1xuICAgIH0gZWxzZSBpZiAobm9kZS5vcGVyYXRvciA9PT0gJ05PVCcpIHtcbiAgICAgIHJldHVybiBgKE5PVCAke29wZXJhbmR9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgKCR7bm9kZS5vcGVyYXRvcn0ke29wZXJhbmR9KWA7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRJbkV4cHJlc3Npb24obm9kZTogSW5FeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBsZWZ0U3RyID0gbm9kZS5sZWZ0Lmxlbmd0aCA+IDFcbiAgICAgID8gYCgke25vZGUubGVmdC5tYXAobCA9PiBsLmFjY2VwdCh0aGlzKSkuam9pbignLCAnKX0pYFxuICAgICAgOiBub2RlLmxlZnRbMF0uYWNjZXB0KHRoaXMpO1xuICAgIGNvbnN0IG5vdCA9IG5vZGUubm90ID8gJyBOT1QnIDogJyc7XG4gICAgbGV0IHJpZ2h0OiBzdHJpbmc7XG4gICAgaWYgKG5vZGUudmFsdWVzIGluc3RhbmNlb2YgU2VsZWN0UXVlcnkpIHtcbiAgICAgIHJpZ2h0ID0gYCgke25vZGUudmFsdWVzLmFjY2VwdCh0aGlzKX0pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmlnaHQgPSBgKCR7bm9kZS52YWx1ZXMubWFwKHNldCA9PlxuICAgICAgICBzZXQubGVuZ3RoID4gMSA/IGAoJHtzZXQubWFwKHYgPT4gdi5hY2NlcHQodGhpcykpLmpvaW4oJywgJyl9KWAgOiBzZXRbMF0uYWNjZXB0KHRoaXMpXG4gICAgICApLmpvaW4oJywgJyl9KWA7XG4gICAgfVxuICAgIHJldHVybiBgKCR7bGVmdFN0cn0ke25vdH0gSU4gJHtyaWdodH0pYDtcbiAgfVxuXG4gIHZpc2l0Q29uY2F0KG5vZGU6IENvbmNhdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAoJHtub2RlLmV4cHJlc3Npb25zLm1hcChlID0+IGUuYWNjZXB0KHRoaXMpKS5qb2luKCcgfHwgJyl9KWA7XG4gIH1cblxuICB2aXNpdENhc2VFeHByZXNzaW9uKG5vZGU6IENhc2VFeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbJ0NBU0UnXTtcbiAgICBmb3IgKGNvbnN0IGMgb2Ygbm9kZS5jYXNlcykge1xuICAgICAgcGFydHMucHVzaChgV0hFTiAke2Mud2hlbi5hY2NlcHQodGhpcyl9IFRIRU4gJHtjLnRoZW4uYWNjZXB0KHRoaXMpfWApO1xuICAgIH1cbiAgICBpZiAobm9kZS5lbHNlKSB7XG4gICAgICBwYXJ0cy5wdXNoKGBFTFNFICR7bm9kZS5lbHNlLmFjY2VwdCh0aGlzKX1gKTtcbiAgICB9XG4gICAgcGFydHMucHVzaCgnRU5EJyk7XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKG5vZGU6IEZ1bmN0aW9uRXhwcmVzc2lvbik6IHN0cmluZyB7XG4gICAgY29uc3QgYXJncyA9IG5vZGUuYXJncy5tYXAoYSA9PiBhLmFjY2VwdCh0aGlzKSkuam9pbignLCAnKTtcbiAgICBjb25zdCBkaXN0aW5jdFByZWZpeCA9IG5vZGUuZGlzdGluY3QgPyAnRElTVElOQ1QgJyA6ICcnO1xuICAgIHJldHVybiBgJHtub2RlLm5hbWV9KCR7ZGlzdGluY3RQcmVmaXh9JHthcmdzfSlgO1xuICB9XG5cbiAgdmlzaXRQYXJhbUV4cHJlc3Npb24oX25vZGU6IFBhcmFtKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJz8nO1xuICB9XG5cbiAgdmlzaXRTdHJpbmdMaXRlcmFsKG5vZGU6IFN0cmluZ0xpdGVyYWwpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJyR7bm9kZS52YWx1ZS5yZXBsYWNlKC8nL2csIFwiJydcIil9J2A7XG4gIH1cblxuICB2aXNpdE51bWJlckxpdGVyYWwobm9kZTogTnVtYmVyTGl0ZXJhbCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5vZGUudmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHZpc2l0TnVsbExpdGVyYWwoX25vZGU6IE51bGxMaXRlcmFsKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ05VTEwnO1xuICB9XG5cbiAgdmlzaXRFeGlzdHNFeHByZXNzaW9uKG5vZGU6IEV4aXN0c0V4cHJlc3Npb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBgRVhJU1RTICgke25vZGUuc3VicXVlcnkuYWNjZXB0KHRoaXMpfSlgO1xuICB9XG59XG4iXX0=
462
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGFjdFF1ZXJ5UmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVuZGVyZXIvQ29tcGFjdFF1ZXJ5UmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esd0NBQXFDO0FBb0JyQyxzQ0FBMEU7QUFLMUUsc0NBQW1DO0FBRW5DLDhDQUEyQztBQUUzQyxvREFBaUQ7QUFHakQsc0VBQThIO0FBQzlILG1EQUFrRjtBQUVsRixNQUFhLG9CQUFvQjtJQUFqQztRQUdZLDRCQUF1QixHQUFHLElBQUksbURBQThCLEVBQVEsQ0FBQztRQUNyRSx1QkFBa0IsR0FBRyxJQUFJLDhDQUF5QixFQUFVLENBQUM7SUF1ZnpFLENBQUM7SUFyZlEsTUFBTSxDQUFDLElBQXFCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBaUI7UUFDaEMsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvRCxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBQSwrQkFBZSxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsK0JBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFDRCxxQkFBcUI7UUFDckIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxDQUFDLCtCQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEYsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsWUFBWSxjQUFjLENBQUMsQ0FBQztZQUN6RCxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUMvQyxHQUFHLElBQUEsK0JBQWUsRUFBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDekQsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2IsSUFBSSxVQUFVLEdBQUcsZ0JBQWdCLFlBQVksR0FBRyxDQUFDO2dCQUNqRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7b0JBQzdCLFVBQVUsSUFBSSxVQUFVLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNsRSxDQUFDO2dCQUNELFVBQVUsSUFBSSxrQkFBa0IsVUFBVSxFQUFFLENBQUM7Z0JBQzdDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxJQUFpQjtRQUNoQyxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFDM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQixLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBQSwrQkFBZSxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ25CLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBaUI7UUFDaEMsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFBLCtCQUFlLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ3RDLEdBQUcsSUFBQSwrQkFBZSxFQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUN6RCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNiLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ25CLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsbUJBQW1CLENBQUMsSUFBb0I7UUFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEQsT0FBTyxhQUFhLFFBQVEsSUFBSSxJQUFBLCtCQUFlLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQW9CO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RELE9BQU8sYUFBYSxRQUFRLElBQUksSUFBQSwrQkFBZSxFQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO0lBQ3BFLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUFtQjtRQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RCxPQUFPLFlBQVksUUFBUSxJQUFJLElBQUEsK0JBQWUsRUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0lBRUQsb0JBQW9CLENBQUMsSUFBcUI7UUFDeEMsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBRTNCLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUEsK0JBQWUsRUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUUzQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTFDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQscUJBQXFCLENBQUMsSUFBc0I7UUFDMUMsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFaEUsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLE1BQU0sUUFBUSxXQUFXLElBQUksSUFBQSwrQkFBZSxFQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckYsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUEsK0JBQWUsRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdEcsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxJQUFxQjtRQUN4QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRUQsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEIsS0FBSyxZQUFZO2dCQUNmLE9BQU8sZUFBZSxJQUFBLCtCQUFlLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMvRyxLQUFLLGVBQWU7Z0JBQ2xCLE9BQU8sZUFBZSxJQUFBLCtCQUFlLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsSUFBQSwrQkFBZSxFQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFBLCtCQUFlLEVBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDekksS0FBSyxhQUFhO2dCQUNoQixPQUFPLGVBQWUsSUFBQSwrQkFBZSxFQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLElBQUEsK0JBQWUsRUFBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN4RyxLQUFLLGNBQWM7Z0JBQ2pCLE9BQU8sZUFBZSxJQUFBLCtCQUFlLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLElBQUEsK0JBQWUsRUFBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUMxRyxDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLElBQXNCO1FBQzFDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUMzQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hFLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxXQUFXLElBQUksSUFBQSwrQkFBZSxFQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFOUUsTUFBTSxXQUFXLEdBQWEsRUFBRSxDQUFDO1FBRWpDLHFCQUFxQjtRQUNyQixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCxvQkFBb0I7UUFDcEIsS0FBSyxNQUFNLFVBQVUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMvQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWhCLGdCQUFnQjtRQUNoQixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCw0QkFBNEIsQ0FBQyxJQUE2QjtRQUN4RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztRQUUxQiw4Q0FBOEM7UUFDOUMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFBLCtCQUFlLEVBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsbUJBQW1CO1FBQ25CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDMUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sdUJBQXVCLFdBQVcsSUFBSSxJQUFBLCtCQUFlLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQzFILENBQUM7SUFFUyxzQkFBc0IsQ0FBQyxHQUFxQjtRQUNwRCxNQUFNLEtBQUssR0FBYSxDQUFDLElBQUEsK0JBQWUsRUFBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTlELElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMvQixLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzFCLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM1QixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNyQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzdCLENBQUM7aUJBQU0sSUFBSSxPQUFPLEdBQUcsQ0FBQyxXQUFXLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN2RCw4REFBOEQ7Z0JBQzlELE1BQU0sV0FBVyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzNGLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQ2hFLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ25ELENBQUM7cUJBQU0sQ0FBQztvQkFDTixLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pFLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxQixLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQy9CLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO1lBQ3ZDLElBQUksTUFBTSxHQUFHLGNBQWMsSUFBQSwrQkFBZSxFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFBLCtCQUFlLEVBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDeEYsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxjQUFjLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN6QyxDQUFDO1lBQ0QsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxjQUFjLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN6QyxDQUFDO1lBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFUyxxQkFBcUIsQ0FBQyxVQUEyQjtRQUN6RCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFFM0IsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUEsK0JBQWUsRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFRCxRQUFRLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4QixLQUFLLGFBQWE7Z0JBQ2hCLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLFVBQVUsQ0FBQyxPQUFRLENBQUMsR0FBRyxDQUFDLCtCQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRixNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxVQUFVLENBQUMsT0FBUSxDQUFDLEdBQUcsQ0FBQywrQkFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUUsTUFBTTtZQUNSLEtBQUssYUFBYTtnQkFDaEIsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLFVBQVcsQ0FBQztnQkFDbkMsSUFBSSxLQUFLLEdBQUcsZ0JBQWdCLFVBQVUsQ0FBQyxPQUFRLENBQUMsR0FBRyxDQUFDLCtCQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFBLCtCQUFlLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUEsK0JBQWUsRUFBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztnQkFDNUosSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2pCLEtBQUssSUFBSSxjQUFjLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDeEMsQ0FBQztnQkFDRCxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDakIsS0FBSyxJQUFJLGNBQWMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN4QyxDQUFDO2dCQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xCLE1BQU07WUFDUixLQUFLLE9BQU87Z0JBQ1YsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLFVBQVUsQ0FBQyxLQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdEQsTUFBTTtRQUNWLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQWlCO1FBQ2hDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzVGLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEMsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7WUFDM0IsS0FBSyxNQUFNLFVBQVUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUNoRCxJQUFJLFVBQVUsWUFBWSxXQUFJLEVBQUUsQ0FBQztvQkFDL0IsaUJBQWlCLElBQUksSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELENBQUM7cUJBQU0sSUFDTCxVQUFVLFlBQVksYUFBSztvQkFDM0IsVUFBVSxZQUFZLFdBQUk7b0JBQzFCLFVBQVUsWUFBWSxnQkFBUztvQkFDL0IsVUFBVSxZQUFZLG1CQUFZO29CQUNsQyxVQUFVLFlBQVksbUJBQVksRUFDbEMsQ0FBQztvQkFDRCxJQUFJLGlCQUFpQixFQUFFLENBQUM7d0JBQ3RCLGlCQUFpQixJQUFJLEtBQUssVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUN0RCxDQUFDO3lCQUFNLENBQUM7d0JBQ04saUJBQWlCLElBQUksUUFBUSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3pELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDbkIsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNwQixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FB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LG9EQTJmQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFsaWFzYWJsZUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0Fic3RyYWN0aW9uc1wiO1xuaW1wb3J0IHsgQWxpYXMgfSBmcm9tIFwiLi4vYXN0L0FsaWFzXCI7XG5pbXBvcnQgeyBBbHRlclRhYmxlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0FsdGVyVGFibGVRdWVyeVwiO1xuaW1wb3J0IHsgQmV0d2VlbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0JldHdlZW5FeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBCaW5hcnlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9CaW5hcnlFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBDYXNlRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvQ2FzZUV4cHJlc3Npb25cIjtcbmltcG9ydCB7IENhc3RFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9DYXN0RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ29sbGF0ZUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0NvbGxhdGVFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBTdWJxdWVyeUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L1N1YnF1ZXJ5RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgV2luZG93RXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvV2luZG93RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uL2FzdC9Db2x1bW5cIjtcbmltcG9ydCB7IENvbmNhdCB9IGZyb20gXCIuLi9hc3QvQ29uY2F0XCI7XG5pbXBvcnQgeyBDcmVhdGVJbmRleFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9DcmVhdGVJbmRleFF1ZXJ5XCI7XG5pbXBvcnQgeyBDcmVhdGVUYWJsZVF1ZXJ5LCBDb2x1bW5EZWZpbml0aW9uLCBUYWJsZUNvbnN0cmFpbnQgfSBmcm9tIFwiLi4vYXN0L0NyZWF0ZVRhYmxlUXVlcnlcIjtcbmltcG9ydCB7IENyZWF0ZVZpcnR1YWxUYWJsZVF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9DcmVhdGVWaXJ0dWFsVGFibGVRdWVyeVwiO1xuaW1wb3J0IHsgQ3JlYXRlVmlld1F1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9DcmVhdGVWaWV3UXVlcnlcIjtcbmltcG9ydCB7IERlbGV0ZVF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9EZWxldGVRdWVyeVwiO1xuaW1wb3J0IHsgRHJvcEluZGV4UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0Ryb3BJbmRleFF1ZXJ5XCI7XG5pbXBvcnQgeyBEcm9wVGFibGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvRHJvcFRhYmxlUXVlcnlcIjtcbmltcG9ydCB7IERyb3BWaWV3UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0Ryb3BWaWV3UXVlcnlcIjtcbmltcG9ydCB7IEV4aXN0c0V4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0V4aXN0c0V4cHJlc3Npb25cIjtcbmltcG9ydCB7IEZyb20sIEpzb25FYWNoRnJvbSwgU3VicXVlcnlGcm9tLCBUYWJsZUZyb20gfSBmcm9tIFwiLi4vYXN0L0Zyb21cIjtcbmltcG9ydCB7IEZ1bmN0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvRnVuY3Rpb25FeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBJbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0luRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0luc2VydFF1ZXJ5XCI7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvVXBkYXRlUXVlcnlcIjtcbmltcG9ydCB7IEpvaW4gfSBmcm9tIFwiLi4vYXN0L0pvaW5cIjtcbmltcG9ydCB7IE51bGxMaXRlcmFsLCBOdW1iZXJMaXRlcmFsLCBQYXJhbSwgU3RyaW5nTGl0ZXJhbCB9IGZyb20gXCIuLi9hc3QvTGl0ZXJhbHNcIjtcbmltcG9ydCB7IE9wZXJhdG9yIH0gZnJvbSBcIi4uL2FzdC9PcGVyYXRvclwiO1xuaW1wb3J0IHsgT3JkZXJCeSB9IGZyb20gXCIuLi9hc3QvT3JkZXJCeVwiO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnkgfSBmcm9tIFwiLi4vYXN0L1NlbGVjdFF1ZXJ5XCI7XG5pbXBvcnQgeyBVbmFyeUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L1VuYXJ5RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgV2l0aCB9IGZyb20gXCIuLi9hc3QvV2l0aFwiO1xuaW1wb3J0IHsgQ29sdW1uTGlrZVZpc2l0b3JBY2NlcHRvciwgRnJvbUxpa2VBbmRKb2luVmlzaXRvckFjY2VwdG9yLCBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcbmltcG9ydCB7IFF1ZXJ5UmVuZGVyZXIsIFJlbmRlcmFibGVRdWVyeSwgcXVvdGVJZGVudGlmaWVyIH0gZnJvbSBcIi4vUXVlcnlSZW5kZXJlclwiO1xuXG5leHBvcnQgY2xhc3MgQ29tcGFjdFF1ZXJ5UmVuZGVyZXJcbiAgaW1wbGVtZW50cyBRdWVyeVJlbmRlcmVyLCBTcWxUcmVlTm9kZVZpc2l0b3I8c3RyaW5nPlxue1xuICBwcm90ZWN0ZWQgZnJvbUxpa2VBbmRKb2luQWNjZXB0b3IgPSBuZXcgRnJvbUxpa2VBbmRKb2luVmlzaXRvckFjY2VwdG9yPHZvaWQ+KCk7XG4gIHByb3RlY3RlZCBjb2x1bW5MaWtlQWNjZXB0b3IgPSBuZXcgQ29sdW1uTGlrZVZpc2l0b3JBY2NlcHRvcjxzdHJpbmc+KCk7XG5cbiAgcHVibGljIHJlbmRlcihub2RlOiBSZW5kZXJhYmxlUXVlcnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBub2RlLmFjY2VwdCh0aGlzKTtcbiAgfVxuXG4gIHZpc2l0SW5zZXJ0UXVlcnkobm9kZTogSW5zZXJ0UXVlcnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHBhcnRzLnB1c2goYElOU0VSVCR7bm9kZS5pc09yUmVwbGFjZSgpID8gJyBPUiBSRVBMQUNFJyA6ICcnfWApO1xuICAgIHBhcnRzLnB1c2goYElOVE8gJHtxdW90ZUlkZW50aWZpZXIobm9kZVsnX3RhYmxlTmFtZSddKX1gKTtcbiAgICBpZiAobm9kZVsnX2NvbHVtbnMnXS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAoJHtub2RlWydfY29sdW1ucyddLm1hcChxdW90ZUlkZW50aWZpZXIpLmpvaW4oJywgJyl9KWApO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX2Zyb21TZWxlY3QnXSkge1xuICAgICAgcGFydHMucHVzaChub2RlWydfZnJvbVNlbGVjdCddLmFjY2VwdCh0aGlzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRzLnB1c2goYFZBTFVFUyAoJHtub2RlWydfdmFsdWVzJ10ubWFwKHYgPT4gdi5hY2NlcHQodGhpcykpLmpvaW4oJywgJyl9KWApO1xuICAgIH1cbiAgICAvLyBPTiBDT05GTElDVCBjbGF1c2VcbiAgICBpZiAobm9kZVsnX29uQ29uZmxpY3RDb2x1bW5zJ10ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY29uZmxpY3RDb2xzID0gbm9kZVsnX29uQ29uZmxpY3RDb2x1bW5zJ10ubWFwKHF1b3RlSWRlbnRpZmllcikuam9pbignLCAnKTtcbiAgICAgIGlmIChub2RlWydfZG9Ob3RoaW5nJ10pIHtcbiAgICAgICAgcGFydHMucHVzaChgT04gQ09ORkxJQ1QgKCR7Y29uZmxpY3RDb2xzfSkgRE8gTk9USElOR2ApO1xuICAgICAgfSBlbHNlIGlmIChub2RlWydfZG9VcGRhdGVTZXRzJ10ubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBzZXRDbGF1c2VzID0gbm9kZVsnX2RvVXBkYXRlU2V0cyddLm1hcChzID0+XG4gICAgICAgICAgYCR7cXVvdGVJZGVudGlmaWVyKHMuY29sdW1uKX0gPSAke3MudmFsdWUuYWNjZXB0KHRoaXMpfWBcbiAgICAgICAgKS5qb2luKCcsICcpO1xuICAgICAgICBsZXQgb25Db25mbGljdCA9IGBPTiBDT05GTElDVCAoJHtjb25mbGljdENvbHN9KWA7XG4gICAgICAgIGlmIChub2RlWydfb25Db25mbGljdFdoZXJlJ10pIHtcbiAgICAgICAgICBvbkNvbmZsaWN0ICs9IGAgV0hFUkUgJHtub2RlWydfb25Db25mbGljdFdoZXJlJ10uYWNjZXB0KHRoaXMpfWA7XG4gICAgICAgIH1cbiAgICAgICAgb25Db25mbGljdCArPSBgIERPIFVQREFURSBTRVQgJHtzZXRDbGF1c2VzfWA7XG4gICAgICAgIHBhcnRzLnB1c2gob25Db25mbGljdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChub2RlWydfcmV0dXJuaW5nJ10ubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChgUkVUVVJOSU5HICR7bm9kZVsnX3JldHVybmluZyddLm1hcChyID0+IHIuYWNjZXB0KHRoaXMpKS5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbignICcpO1xuICB9XG5cbiAgdmlzaXREZWxldGVRdWVyeShub2RlOiBEZWxldGVRdWVyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgcGFydHMucHVzaCgnREVMRVRFJyk7XG4gICAgcGFydHMucHVzaChgRlJPTSAke3F1b3RlSWRlbnRpZmllcihub2RlWydfdGFibGVOYW1lJ10pfWApO1xuICAgIGlmIChub2RlWydfd2hlcmUnXSkge1xuICAgICAgcGFydHMucHVzaChgV0hFUkUgJHtub2RlWydfd2hlcmUnXS5hY2NlcHQodGhpcyl9YCk7XG4gICAgfVxuICAgIGlmIChub2RlWydfcmV0dXJuaW5nJ10ubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChgUkVUVVJOSU5HICR7bm9kZVsnX3JldHVybmluZyddLm1hcChyID0+IHIuYWNjZXB0KHRoaXMpKS5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbignICcpO1xuICB9XG5cbiAgdmlzaXRVcGRhdGVRdWVyeShub2RlOiBVcGRhdGVRdWVyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgcGFydHMucHVzaChgVVBEQVRFICR7cXVvdGVJZGVudGlmaWVyKG5vZGVbJ190YWJsZU5hbWUnXSl9YCk7XG4gICAgaWYgKG5vZGVbJ19zZXQnXS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzZXRDbGF1c2VzID0gbm9kZVsnX3NldCddLm1hcChzID0+XG4gICAgICAgIGAke3F1b3RlSWRlbnRpZmllcihzLmNvbHVtbil9ID0gJHtzLnZhbHVlLmFjY2VwdCh0aGlzKX1gXG4gICAgICApLmpvaW4oJywgJyk7XG4gICAgICBwYXJ0cy5wdXNoKGBTRVQgJHtzZXRDbGF1c2VzfWApO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX3doZXJlJ10pIHtcbiAgICAgIHBhcnRzLnB1c2goYFdIRVJFICR7bm9kZVsnX3doZXJlJ10uYWNjZXB0KHRoaXMpfWApO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX3JldHVybmluZyddLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYFJFVFVSTklORyAke25vZGVbJ19yZXR1cm5pbmcnXS5tYXAociA9PiByLmFjY2VwdCh0aGlzKSkuam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZpc2l0RHJvcFRhYmxlUXVlcnkobm9kZTogRHJvcFRhYmxlUXVlcnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlmRXhpc3RzID0gbm9kZS5oYXNJZkV4aXN0cyA/ICcgSUYgRVhJU1RTJyA6ICcnO1xuICAgIHJldHVybiBgRFJPUCBUQUJMRSR7aWZFeGlzdHN9ICR7cXVvdGVJZGVudGlmaWVyKG5vZGUudGFibGVOYW1lKX1gO1xuICB9XG5cbiAgdmlzaXREcm9wSW5kZXhRdWVyeShub2RlOiBEcm9wSW5kZXhRdWVyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgaWZFeGlzdHMgPSBub2RlLmhhc0lmRXhpc3RzID8gJyBJRiBFWElTVFMnIDogJyc7XG4gICAgcmV0dXJuIGBEUk9QIElOREVYJHtpZkV4aXN0c30gJHtxdW90ZUlkZW50aWZpZXIobm9kZS5pbmRleE5hbWUpfWA7XG4gIH1cblxuICB2aXNpdERyb3BWaWV3UXVlcnkobm9kZTogRHJvcFZpZXdRdWVyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgaWZFeGlzdHMgPSBub2RlLmhhc0lmRXhpc3RzID8gJyBJRiBFWElTVFMnIDogJyc7XG4gICAgcmV0dXJuIGBEUk9QIFZJRVcke2lmRXhpc3RzfSAke3F1b3RlSWRlbnRpZmllcihub2RlLnZpZXdOYW1lKX1gO1xuICB9XG5cbiAgdmlzaXRDcmVhdGVWaWV3UXVlcnkobm9kZTogQ3JlYXRlVmlld1F1ZXJ5KTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICAgIHBhcnRzLnB1c2goJ0NSRUFURScpO1xuICAgIGlmIChub2RlLmlzVGVtcG9yYXJ5KSB7XG4gICAgICBwYXJ0cy5wdXNoKCdURU1QT1JBUlknKTtcbiAgICB9XG4gICAgcGFydHMucHVzaCgnVklFVycpO1xuICAgIGlmIChub2RlLmhhc0lmTm90RXhpc3RzKSB7XG4gICAgICBwYXJ0cy5wdXNoKCdJRiBOT1QgRVhJU1RTJyk7XG4gICAgfVxuICAgIHBhcnRzLnB1c2gocXVvdGVJZGVudGlmaWVyKG5vZGUudmlld05hbWUpKTtcblxuICAgIGlmIChub2RlLmNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChgKCR7bm9kZS5jb2x1bW5zLm1hcChxdW90ZUlkZW50aWZpZXIpLmpvaW4oJywgJyl9KWApO1xuICAgIH1cblxuICAgIHBhcnRzLnB1c2goJ0FTJyk7XG5cbiAgICBpZiAoIW5vZGUuc2VsZWN0UXVlcnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ3JlYXRlVmlld1F1ZXJ5IG11c3QgaGF2ZSBhIFNFTEVDVCBxdWVyeScpO1xuICAgIH1cbiAgICBwYXJ0cy5wdXNoKG5vZGUuc2VsZWN0UXVlcnkuYWNjZXB0KHRoaXMpKTtcblxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2aXNpdENyZWF0ZUluZGV4UXVlcnkobm9kZTogQ3JlYXRlSW5kZXhRdWVyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgdW5pcXVlID0gbm9kZS5pc1VuaXF1ZSA/ICdVTklRVUUgJyA6ICcnO1xuICAgIGNvbnN0IGlmTm90RXhpc3RzID0gbm9kZS5oYXNJZk5vdEV4aXN0cyA/ICcgSUYgTk9UIEVYSVNUUycgOiAnJztcblxuICAgIHBhcnRzLnB1c2goYENSRUFURSAke3VuaXF1ZX1JTkRFWCR7aWZOb3RFeGlzdHN9ICR7cXVvdGVJZGVudGlmaWVyKG5vZGUuaW5kZXhOYW1lKX1gKTtcbiAgICBwYXJ0cy5wdXNoKGBPTiAke3F1b3RlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSl9ICgke25vZGUuY29sdW1ucy5tYXAocXVvdGVJZGVudGlmaWVyKS5qb2luKCcsICcpfSlgKTtcblxuICAgIGlmIChub2RlLndoZXJlRXhwcmVzc2lvbikge1xuICAgICAgcGFydHMucHVzaChgV0hFUkUgJHtub2RlLndoZXJlRXhwcmVzc2lvbi5hY2NlcHQodGhpcyl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZpc2l0QWx0ZXJUYWJsZVF1ZXJ5KG5vZGU6IEFsdGVyVGFibGVRdWVyeSk6IHN0cmluZyB7XG4gICAgY29uc3Qgb3AgPSBub2RlLm9wZXJhdGlvbjtcbiAgICBpZiAoIW9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsdGVyVGFibGVRdWVyeSBtdXN0IGhhdmUgYW4gb3BlcmF0aW9uJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChvcC50eXBlKSB7XG4gICAgICBjYXNlICdBRERfQ09MVU1OJzpcbiAgICAgICAgcmV0dXJuIGBBTFRFUiBUQUJMRSAke3F1b3RlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSl9IEFERCBDT0xVTU4gJHt0aGlzLnJlbmRlckNvbHVtbkRlZmluaXRpb24ob3AuY29sdW1uKX1gO1xuICAgICAgY2FzZSAnUkVOQU1FX0NPTFVNTic6XG4gICAgICAgIHJldHVybiBgQUxURVIgVEFCTEUgJHtxdW90ZUlkZW50aWZpZXIobm9kZS50YWJsZU5hbWUpfSBSRU5BTUUgQ09MVU1OICR7cXVvdGVJZGVudGlmaWVyKG9wLm9sZE5hbWUpfSBUTyAke3F1b3RlSWRlbnRpZmllcihvcC5uZXdOYW1lKX1gO1xuICAgICAgY2FzZSAnRFJPUF9DT0xVTU4nOlxuICAgICAgICByZXR1cm4gYEFMVEVSIFRBQkxFICR7cXVvdGVJZGVudGlmaWVyKG5vZGUudGFibGVOYW1lKX0gRFJPUCBDT0xVTU4gJHtxdW90ZUlkZW50aWZpZXIob3AuY29sdW1uTmFtZSl9YDtcbiAgICAgIGNhc2UgJ1JFTkFNRV9UQUJMRSc6XG4gICAgICAgIHJldHVybiBgQUxURVIgVEFCTEUgJHtxdW90ZUlkZW50aWZpZXIobm9kZS50YWJsZU5hbWUpfSBSRU5BTUUgVE8gJHtxdW90ZUlkZW50aWZpZXIob3AubmV3VGFibGVOYW1lKX1gO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0Q3JlYXRlVGFibGVRdWVyeShub2RlOiBDcmVhdGVUYWJsZVF1ZXJ5KTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBpZk5vdEV4aXN0cyA9IG5vZGUuaGFzSWZOb3RFeGlzdHMgPyAnIElGIE5PVCBFWElTVFMnIDogJyc7XG4gICAgcGFydHMucHVzaChgQ1JFQVRFIFRBQkxFJHtpZk5vdEV4aXN0c30gJHtxdW90ZUlkZW50aWZpZXIobm9kZS50YWJsZU5hbWUpfSAoYCk7XG5cbiAgICBjb25zdCBkZWZpbml0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIENvbHVtbiBkZWZpbml0aW9uc1xuICAgIGZvciAoY29uc3QgY29sIG9mIG5vZGUuY29sdW1ucykge1xuICAgICAgZGVmaW5pdGlvbnMucHVzaCh0aGlzLnJlbmRlckNvbHVtbkRlZmluaXRpb24oY29sKSk7XG4gICAgfVxuXG4gICAgLy8gVGFibGUgY29uc3RyYWludHNcbiAgICBmb3IgKGNvbnN0IGNvbnN0cmFpbnQgb2Ygbm9kZS50YWJsZUNvbnN0cmFpbnRzKSB7XG4gICAgICBkZWZpbml0aW9ucy5wdXNoKHRoaXMucmVuZGVyVGFibGVDb25zdHJhaW50KGNvbnN0cmFpbnQpKTtcbiAgICB9XG5cbiAgICBwYXJ0cy5wdXNoKGRlZmluaXRpb25zLmpvaW4oJywgJykpO1xuICAgIHBhcnRzLnB1c2goJyknKTtcblxuICAgIC8vIFRhYmxlIG9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChub2RlLmhhc1dpdGhvdXRSb3dpZCkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdXSVRIT1VUIFJPV0lEJyk7XG4gICAgfVxuICAgIGlmIChub2RlLmlzU3RyaWN0KSB7XG4gICAgICBvcHRpb25zLnB1c2goJ1NUUklDVCcpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKCcgJyArIG9wdGlvbnMuam9pbignLCAnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJycpO1xuICB9XG5cbiAgdmlzaXRDcmVhdGVWaXJ0dWFsVGFibGVRdWVyeShub2RlOiBDcmVhdGVWaXJ0dWFsVGFibGVRdWVyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgaWZOb3RFeGlzdHMgPSBub2RlLmhhc0lmTm90RXhpc3RzID8gJyBJRiBOT1QgRVhJU1RTJyA6ICcnO1xuICAgIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBBZGQgY29sdW1ucyAoRlRTNSBjb2x1bW5zIGRvbid0IGhhdmUgdHlwZXMpXG4gICAgZm9yIChjb25zdCBjb2wgb2Ygbm9kZS5jb2x1bW5zKSB7XG4gICAgICBhcmdzLnB1c2gocXVvdGVJZGVudGlmaWVyKGNvbCkpO1xuICAgIH1cblxuICAgIC8vIEFkZCBGVFM1IG9wdGlvbnNcbiAgICBjb25zdCBvcHRzID0gbm9kZS5vcHRpb25zO1xuICAgIGlmIChvcHRzLnRva2VuaXplKSB7XG4gICAgICBhcmdzLnB1c2goYHRva2VuaXplID0gJyR7b3B0cy50b2tlbml6ZX0nYCk7XG4gICAgfVxuICAgIGlmIChvcHRzLmNvbnRlbnQpIHtcbiAgICAgIGFyZ3MucHVzaChgY29udGVudCA9ICcke29wdHMuY29udGVudH0nYCk7XG4gICAgfVxuICAgIGlmIChvcHRzLmNvbnRlbnRSb3dpZCkge1xuICAgICAgYXJncy5wdXNoKGBjb250ZW50X3Jvd2lkID0gJyR7b3B0cy5jb250ZW50Um93aWR9J2ApO1xuICAgIH1cbiAgICBpZiAob3B0cy5wcmVmaXgpIHtcbiAgICAgIGFyZ3MucHVzaChgcHJlZml4ID0gJyR7b3B0cy5wcmVmaXh9J2ApO1xuICAgIH1cblxuICAgIHJldHVybiBgQ1JFQVRFIFZJUlRVQUwgVEFCTEUke2lmTm90RXhpc3RzfSAke3F1b3RlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSl9IFVTSU5HICR7bm9kZS5tb2R1bGV9KCR7YXJncy5qb2luKCcsICcpfSlgO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbHVtbkRlZmluaXRpb24oY29sOiBDb2x1bW5EZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbcXVvdGVJZGVudGlmaWVyKGNvbC5uYW1lKSwgY29sLnR5cGVdO1xuXG4gICAgaWYgKGNvbC5jb25zdHJhaW50cy5wcmltYXJ5S2V5KSB7XG4gICAgICBwYXJ0cy5wdXNoKCdQUklNQVJZIEtFWScpO1xuICAgICAgaWYgKGNvbC5jb25zdHJhaW50cy5hdXRvSW5jcmVtZW50KSB7XG4gICAgICAgIHBhcnRzLnB1c2goJ0FVVE9JTkNSRU1FTlQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbC5jb25zdHJhaW50cy5ub3ROdWxsKSB7XG4gICAgICBwYXJ0cy5wdXNoKCdOT1QgTlVMTCcpO1xuICAgIH1cbiAgICBpZiAoY29sLmNvbnN0cmFpbnRzLnVuaXF1ZSkge1xuICAgICAgcGFydHMucHVzaCgnVU5JUVVFJyk7XG4gICAgfVxuICAgIGlmIChjb2wuY29uc3RyYWludHMuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29sLmNvbnN0cmFpbnRzLmRlZmF1bHQgPT09IG51bGwpIHtcbiAgICAgICAgcGFydHMucHVzaCgnREVGQVVMVCBOVUxMJyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2wuY29uc3RyYWludHMuZGVmYXVsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIFNRTCBrZXl3b3JkL2Z1bmN0aW9uIGxpa2UgQ1VSUkVOVF9USU1FU1RBTVBcbiAgICAgICAgY29uc3Qgc3FsS2V5d29yZHMgPSBbJ0NVUlJFTlRfVElNRVNUQU1QJywgJ0NVUlJFTlRfREFURScsICdDVVJSRU5UX1RJTUUnLCAnVFJVRScsICdGQUxTRSddO1xuICAgICAgICBpZiAoc3FsS2V5d29yZHMuaW5jbHVkZXMoY29sLmNvbnN0cmFpbnRzLmRlZmF1bHQudG9VcHBlckNhc2UoKSkpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKGBERUZBVUxUICR7Y29sLmNvbnN0cmFpbnRzLmRlZmF1bHR9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFydHMucHVzaChgREVGQVVMVCAnJHtjb2wuY29uc3RyYWludHMuZGVmYXVsdC5yZXBsYWNlKC8nL2csIFwiJydcIil9J2ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5wdXNoKGBERUZBVUxUICR7Y29sLmNvbnN0cmFpbnRzLmRlZmF1bHR9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb2wuY29uc3RyYWludHMuY2hlY2spIHtcbiAgICAgIHBhcnRzLnB1c2goYENIRUNLICR7Y29sLmNvbnN0cmFpbnRzLmNoZWNrLmFjY2VwdCh0aGlzKX1gKTtcbiAgICB9XG4gICAgaWYgKGNvbC5jb25zdHJhaW50cy5yZWZlcmVuY2VzKSB7XG4gICAgICBjb25zdCByZWYgPSBjb2wuY29uc3RyYWludHMucmVmZXJlbmNlcztcbiAgICAgIGxldCByZWZTdHIgPSBgUkVGRVJFTkNFUyAke3F1b3RlSWRlbnRpZmllcihyZWYudGFibGUpfSgke3F1b3RlSWRlbnRpZmllcihyZWYuY29sdW1uKX0pYDtcbiAgICAgIGlmIChyZWYub25EZWxldGUpIHtcbiAgICAgICAgcmVmU3RyICs9IGAgT04gREVMRVRFICR7cmVmLm9uRGVsZXRlfWA7XG4gICAgICB9XG4gICAgICBpZiAocmVmLm9uVXBkYXRlKSB7XG4gICAgICAgIHJlZlN0ciArPSBgIE9OIFVQREFURSAke3JlZi5vblVwZGF0ZX1gO1xuICAgICAgfVxuICAgICAgcGFydHMucHVzaChyZWZTdHIpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyVGFibGVDb25zdHJhaW50KGNvbnN0cmFpbnQ6IFRhYmxlQ29uc3RyYWludCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoY29uc3RyYWludC5uYW1lKSB7XG4gICAgICBwYXJ0cy5wdXNoKGBDT05TVFJBSU5UICR7cXVvdGVJZGVudGlmaWVyKGNvbnN0cmFpbnQubmFtZSl9YCk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb25zdHJhaW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ1BSSU1BUlkgS0VZJzpcbiAgICAgICAgcGFydHMucHVzaChgUFJJTUFSWSBLRVkgKCR7Y29uc3RyYWludC5jb2x1bW5zIS5tYXAocXVvdGVJZGVudGlmaWVyKS5qb2luKCcsICcpfSlgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdVTklRVUUnOlxuICAgICAgICBwYXJ0cy5wdXNoKGBVTklRVUUgKCR7Y29uc3RyYWludC5jb2x1bW5zIS5tYXAocXVvdGVJZGVudGlmaWVyKS5qb2luKCcsICcpfSlgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdGT1JFSUdOIEtFWSc6XG4gICAgICAgIGNvbnN0IHJlZiA9IGNvbnN0cmFpbnQucmVmZXJlbmNlcyE7XG4gICAgICAgIGxldCBma1N0ciA9IGBGT1JFSUdOIEtFWSAoJHtjb25zdHJhaW50LmNvbHVtbnMhLm1hcChxdW90ZUlkZW50aWZpZXIpLmpvaW4oJywgJyl9KSBSRUZFUkVOQ0VTICR7cXVvdGVJZGVudGlmaWVyKHJlZi50YWJsZSl9KCR7cXVvdGVJZGVudGlmaWVyKHJlZi5jb2x1bW4pfSlgO1xuICAgICAgICBpZiAocmVmLm9uRGVsZXRlKSB7XG4gICAgICAgICAgZmtTdHIgKz0gYCBPTiBERUxFVEUgJHtyZWYub25EZWxldGV9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmLm9uVXBkYXRlKSB7XG4gICAgICAgICAgZmtTdHIgKz0gYCBPTiBVUERBVEUgJHtyZWYub25VcGRhdGV9YDtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKGZrU3RyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdDSEVDSyc6XG4gICAgICAgIHBhcnRzLnB1c2goYENIRUNLICR7Y29uc3RyYWludC5jaGVjayEuYWNjZXB0KHRoaXMpfWApO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMuam9pbignICcpO1xuICB9XG5cbiAgdmlzaXRTZWxlY3RRdWVyeShub2RlOiBTZWxlY3RRdWVyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5vZGVbJ193aXRoJ10ubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChgV0lUSCAke25vZGVbJ193aXRoJ10ubWFwKHcgPT4gdy5hY2NlcHQodGhpcykpLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIHBhcnRzLnB1c2goYFNFTEVDVCR7bm9kZS5pc0Rpc3RpbmN0KCkgPyAnIERJU1RJTkNUJyA6ICcnfWApO1xuICAgIGlmIChub2RlWydfY29sdW1ucyddLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2gobm9kZVsnX2NvbHVtbnMnXS5tYXAoYyA9PiB0aGlzLmNvbHVtbkxpa2VBY2NlcHRvci5hY2NlcHQodGhpcywgYykpLmpvaW4oJywgJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0cy5wdXNoKCcqJyk7XG4gICAgfVxuICAgIGlmIChub2RlWydfZnJvbXNBbmRKb2lucyddLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBmcm9tc0FuZEpvaW5zVGV4dCA9ICcnO1xuICAgICAgZm9yIChjb25zdCBmcm9tT3JKb2luIG9mIG5vZGVbJ19mcm9tc0FuZEpvaW5zJ10pIHtcbiAgICAgICAgaWYgKGZyb21PckpvaW4gaW5zdGFuY2VvZiBKb2luKSB7XG4gICAgICAgICAgZnJvbXNBbmRKb2luc1RleHQgKz0gYCAke2Zyb21PckpvaW4uYWNjZXB0KHRoaXMpfWA7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZnJvbU9ySm9pbiBpbnN0YW5jZW9mIEFsaWFzIHx8XG4gICAgICAgICAgZnJvbU9ySm9pbiBpbnN0YW5jZW9mIEZyb20gfHxcbiAgICAgICAgICBmcm9tT3JKb2luIGluc3RhbmNlb2YgVGFibGVGcm9tIHx8XG4gICAgICAgICAgZnJvbU9ySm9pbiBpbnN0YW5jZW9mIFN1YnF1ZXJ5RnJvbSB8fFxuICAgICAgICAgIGZyb21PckpvaW4gaW5zdGFuY2VvZiBKc29uRWFjaEZyb21cbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGZyb21zQW5kSm9pbnNUZXh0KSB7XG4gICAgICAgICAgICBmcm9tc0FuZEpvaW5zVGV4dCArPSBgLCAke2Zyb21PckpvaW4uYWNjZXB0KHRoaXMpfWA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21zQW5kSm9pbnNUZXh0ICs9IGBGUk9NICR7ZnJvbU9ySm9pbi5hY2NlcHQodGhpcyl9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBhcnRzLnB1c2goZnJvbXNBbmRKb2luc1RleHQpO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX3doZXJlJ10pIHtcbiAgICAgIHBhcnRzLnB1c2goYFdIRVJFICR7bm9kZVsnX3doZXJlJ10uYWNjZXB0KHRoaXMpfWApO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX2dyb3VwQnknXS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGBHUk9VUCBCWSAke25vZGVbJ19ncm91cEJ5J10ubWFwKGMgPT4gYy5hY2NlcHQodGhpcykpLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGlmIChub2RlWydfaGF2aW5nJ10pIHtcbiAgICAgIHBhcnRzLnB1c2goYEhBVklORyAke25vZGVbJ19oYXZpbmcnXS5hY2NlcHQodGhpcyl9YCk7XG4gICAgfVxuICAgIGlmIChub2RlWydfdW5pb24nXS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKG5vZGVbJ191bmlvbiddLm1hcCh1ID0+IGBVTklPTiAke3UuYWNjZXB0KHRoaXMpfWApLmpvaW4oJyAnKSk7XG4gICAgfVxuICAgIGlmIChub2RlWydfaW50ZXJzZWN0J10ubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChub2RlWydfaW50ZXJzZWN0J10ubWFwKGkgPT4gYElOVEVSU0VDVCAke2kuYWNjZXB0KHRoaXMpfWApLmpvaW4oJyAnKSk7XG4gICAgfVxuICAgIGlmIChub2RlWydfZXhjZXB0J10ubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChub2RlWydfZXhjZXB0J10ubWFwKGUgPT4gYEVYQ0VQVCAke2UuYWNjZXB0KHRoaXMpfWApLmpvaW4oJyAnKSk7XG4gICAgfVxuICAgIGlmIChub2RlWydfb3JkZXJCeSddLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYE9SREVSIEJZICR7bm9kZVsnX29yZGVyQnknXS5tYXAobyA9PiBvLmFjY2VwdCh0aGlzKSkuam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgaWYgKG5vZGVbJ19saW1pdCddICE9PSBudWxsICYmIG5vZGVbJ19saW1pdCddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnRzLnB1c2goYExJTUlUICR7bm9kZVsnX2xpbWl0J119YCk7XG4gICAgICBpZiAobm9kZVsnX29mZnNldCddICE9PSBudWxsICYmIG5vZGVbJ19vZmZzZXQnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhcnRzLnB1c2goYE9GRlNFVCAke25vZGVbJ19vZmZzZXQnXX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmZpbHRlcihwID0+IHApLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZpc2l0VGFibGVGcm9tKG5vZGU6IFRhYmxlRnJvbSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3F1b3RlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSl9YDtcbiAgfVxuXG4gIHZpc2l0U3VicXVlcnlGcm9tKG5vZGU6IFN1YnF1ZXJ5RnJvbSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAoJHtub2RlLnN1YnF1ZXJ5LmFjY2VwdCh0aGlzKX0pYDtcbiAgfVxuXG4gIHZpc2l0SnNvbkVhY2hGcm9tKG5vZGU6IEpzb25FYWNoRnJvbSk6IHN0cmluZyB7XG4gICAgY29uc3QgZXhwciA9IG5vZGUuanNvbkV4cHJlc3Npb24uYWNjZXB0KHRoaXMpO1xuICAgIGNvbnN0IHBhdGggPSBub2RlLmpzb25QYXRoID8gYCwgJHtub2RlLmpzb25QYXRoLmFjY2VwdCh0aGlzKX1gIDogJyc7XG4gICAgcmV0dXJuIGBqc29uX2VhY2goJHtleHByfSR7cGF0aH0pYDtcbiAgfVxuXG4gIHZpc2l0Q29sdW1uKG5vZGU6IENvbHVtbik6IHN0cmluZyB7XG4gICAgaWYgKG5vZGUuaGFzVGFibGVOYW1lKCkpIHtcbiAgICAgIHJldHVybiBgJHtxdW90ZUlkZW50aWZpZXIobm9kZS50YWJsZU5hbWUgYXMgc3RyaW5nKX0uJHtxdW90ZUlkZW50aWZpZXIobm9kZS5jb2x1bW5OYW1lKX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7cXVvdGVJZGVudGlmaWVyKG5vZGUuY29sdW1uTmFtZSl9YDtcbiAgICB9XG4gIH1cblxuICB2aXNpdEFsaWFzKG5vZGU6IEFsaWFzPEZyb218QWxpYXNhYmxlRXhwcmVzc2lvbj4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGlzU3VicXVlcnkgPSBub2RlLnJlZmVyZW50IGluc3RhbmNlb2YgU3VicXVlcnlGcm9tIHx8IG5vZGUucmVmZXJlbnQgaW5zdGFuY2VvZiBTZWxlY3RRdWVyeTtcbiAgICBjb25zdCByZW5kZXJlZFJlZmVyZW50ID0gbm9kZS5yZWZlcmVudC5hY2NlcHQodGhpcyk7XG4gICAgY29uc3QgcmVuZGVyZWRBbGlhc05hbWUgPSBxdW90ZUlkZW50aWZpZXIobm9kZS5hbGlhcyBhcyBzdHJpbmcpO1xuICAgIGlmIChub2RlLnJlZmVyZW50IGluc3RhbmNlb2YgRnJvbSkge1xuICAgICAgcmV0dXJuIGAke3JlbmRlcmVkUmVmZXJlbnR9ICR7cmVuZGVyZWRBbGlhc05hbWV9YDtcbiAgICB9IGVsc2UgaWYgKGlzU3VicXVlcnkpIHtcbiAgICAgIHJldHVybiBgKCR7cmVuZGVyZWRSZWZlcmVudH0pIEFTICR7cmVuZGVyZWRBbGlhc05hbWV9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGAke3JlbmRlcmVkUmVmZXJlbnR9IEFTICR7cmVuZGVyZWRBbGlhc05hbWV9YDtcbiAgICB9XG4gIH1cblxuICB2aXNpdEpvaW5DbGF1c2Uobm9kZTogSm9pbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke25vZGUudHlwZX0gSk9JTiAke3F1b3RlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSl9ICR7cXVvdGVJZGVudGlmaWVyKG5vZGUuYWxpYXMpfSBPTiAke25vZGUub24uYWNjZXB0KHRoaXMpfWA7XG4gIH1cblxuICB2aXNpdE9yZGVyQnkobm9kZTogT3JkZXJCeSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke25vZGUuY29sdW1uLmFjY2VwdCh0aGlzKX0gJHtub2RlLmRpcmVjdGlvbn1gO1xuICB9XG5cbiAgdmlzaXRXaXRoQ2xhdXNlKG5vZGU6IFdpdGgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtxdW90ZUlkZW50aWZpZXIobm9kZS5uYW1lKX0gQVMgKCR7bm9kZS5xdWVyeS5hY2NlcHQodGhpcyl9KWA7XG4gIH1cblxuICB2aXNpdEJpbmFyeUV4cHJlc3Npb24obm9kZTogQmluYXJ5RXhwcmVzc2lvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAoJHtub2RlLmxlZnQuYWNjZXB0KHRoaXMpfSAke25vZGUub3BlcmF0b3J9ICR7bm9kZS5yaWdodC5hY2NlcHQodGhpcyl9KWA7XG4gIH1cblxuICB2aXNpdEJldHdlZW5FeHByZXNzaW9uKG5vZGU6IEJldHdlZW5FeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3QgPSBub2RlLm5vdCA/ICcgTk9UJyA6ICcnO1xuICAgIHJldHVybiBgKCR7bm9kZS5vcGVyYW5kLmFjY2VwdCh0aGlzKX0ke25vdH0gQkVUV0VFTiAke25vZGUubG93LmFjY2VwdCh0aGlzKX0gQU5EICR7bm9kZS5oaWdoLmFjY2VwdCh0aGlzKX0pYDtcbiAgfVxuXG4gIHZpc2l0VW5hcnlFeHByZXNzaW9uKG5vZGU6IFVuYXJ5RXhwcmVzc2lvbik6IHN0cmluZyB7XG4gICAgY29uc3Qgb3BlcmFuZCA9IG5vZGUub3BlcmFuZC5hY2NlcHQodGhpcyk7XG4gICAgaWYgKG5vZGUub3BlcmF0b3IgPT09IE9wZXJhdG9yLklTX05VTEwgfHwgbm9kZS5vcGVyYXRvciA9PT0gT3BlcmF0b3IuSVNfTk9UX05VTEwpIHtcbiAgICAgIHJldHVybiBgKCR7b3BlcmFuZH0gJHtub2RlLm9wZXJhdG9yfSlgO1xuICAgIH0gZWxzZSBpZiAobm9kZS5vcGVyYXRvciA9PT0gJ05PVCcpIHtcbiAgICAgIHJldHVybiBgKE5PVCAke29wZXJhbmR9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgKCR7bm9kZS5vcGVyYXRvcn0ke29wZXJhbmR9KWA7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRJbkV4cHJlc3Npb24obm9kZTogSW5FeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBsZWZ0U3RyID0gbm9kZS5sZWZ0Lmxlbmd0aCA+IDFcbiAgICAgID8gYCgke25vZGUubGVmdC5tYXAobCA9PiBsLmFjY2VwdCh0aGlzKSkuam9pbignLCAnKX0pYFxuICAgICAgOiBub2RlLmxlZnRbMF0uYWNjZXB0KHRoaXMpO1xuICAgIGNvbnN0IG5vdCA9IG5vZGUubm90ID8gJyBOT1QnIDogJyc7XG4gICAgbGV0IHJpZ2h0OiBzdHJpbmc7XG4gICAgaWYgKG5vZGUudmFsdWVzIGluc3RhbmNlb2YgU2VsZWN0UXVlcnkpIHtcbiAgICAgIHJpZ2h0ID0gYCgke25vZGUudmFsdWVzLmFjY2VwdCh0aGlzKX0pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmlnaHQgPSBgKCR7bm9kZS52YWx1ZXMubWFwKHNldCA9PlxuICAgICAgICBzZXQubGVuZ3RoID4gMSA/IGAoJHtzZXQubWFwKHYgPT4gdi5hY2NlcHQodGhpcykpLmpvaW4oJywgJyl9KWAgOiBzZXRbMF0uYWNjZXB0KHRoaXMpXG4gICAgICApLmpvaW4oJywgJyl9KWA7XG4gICAgfVxuICAgIHJldHVybiBgKCR7bGVmdFN0cn0ke25vdH0gSU4gJHtyaWdodH0pYDtcbiAgfVxuXG4gIHZpc2l0Q29uY2F0KG5vZGU6IENvbmNhdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAoJHtub2RlLmV4cHJlc3Npb25zLm1hcChlID0+IGUuYWNjZXB0KHRoaXMpKS5qb2luKCcgfHwgJyl9KWA7XG4gIH1cblxuICB2aXNpdENhc2VFeHByZXNzaW9uKG5vZGU6IENhc2VFeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbJ0NBU0UnXTtcbiAgICBmb3IgKGNvbnN0IGMgb2Ygbm9kZS5jYXNlcykge1xuICAgICAgcGFydHMucHVzaChgV0hFTiAke2Mud2hlbi5hY2NlcHQodGhpcyl9IFRIRU4gJHtjLnRoZW4uYWNjZXB0KHRoaXMpfWApO1xuICAgIH1cbiAgICBpZiAobm9kZS5lbHNlKSB7XG4gICAgICBwYXJ0cy5wdXNoKGBFTFNFICR7bm9kZS5lbHNlLmFjY2VwdCh0aGlzKX1gKTtcbiAgICB9XG4gICAgcGFydHMucHVzaCgnRU5EJyk7XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZpc2l0Q2FzdEV4cHJlc3Npb24obm9kZTogQ2FzdEV4cHJlc3Npb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBgQ0FTVCgke25vZGUuZXhwcmVzc2lvbi5hY2NlcHQodGhpcyl9IEFTICR7bm9kZS50YXJnZXRUeXBlfSlgO1xuICB9XG5cbiAgdmlzaXRDb2xsYXRlRXhwcmVzc2lvbihub2RlOiBDb2xsYXRlRXhwcmVzc2lvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke25vZGUuZXhwcmVzc2lvbi5hY2NlcHQodGhpcyl9IENPTExBVEUgJHtub2RlLmNvbGxhdGlvbn1gO1xuICB9XG5cbiAgdmlzaXRTdWJxdWVyeUV4cHJlc3Npb24obm9kZTogU3VicXVlcnlFeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCgke25vZGUuc3VicXVlcnkuYWNjZXB0KHRoaXMpfSlgO1xuICB9XG5cbiAgdmlzaXRXaW5kb3dFeHByZXNzaW9uKG5vZGU6IFdpbmRvd0V4cHJlc3Npb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IGZuUGFydCA9IG5vZGUuZnVuY3Rpb24uYWNjZXB0KHRoaXMpO1xuICAgIGNvbnN0IHNwZWMgPSBub2RlLndpbmRvd1NwZWM7XG5cbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoc3BlYy5wYXJ0aXRpb25CeUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgcGFydHMucHVzaChgUEFSVElUSU9OIEJZICR7c3BlYy5wYXJ0aXRpb25CeUNvbHVtbnMubWFwKGMgPT4gYy5hY2NlcHQodGhpcykpLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGlmIChzcGVjLm9yZGVyQnlDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYE9SREVSIEJZICR7c3BlYy5vcmRlckJ5Q29sdW1ucy5tYXAobyA9PiBvLmFjY2VwdCh0aGlzKSkuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7Zm5QYXJ0fSBPVkVSICgke3BhcnRzLmpvaW4oJyAnKX0pYDtcbiAgfVxuXG4gIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKG5vZGU6IEZ1bmN0aW9uRXhwcmVzc2lvbik6IHN0cmluZyB7XG4gICAgY29uc3QgYXJncyA9IG5vZGUuYXJncy5tYXAoYSA9PiBhLmFjY2VwdCh0aGlzKSkuam9pbignLCAnKTtcbiAgICBjb25zdCBkaXN0aW5jdFByZWZpeCA9IG5vZGUuZGlzdGluY3QgPyAnRElTVElOQ1QgJyA6ICcnO1xuICAgIHJldHVybiBgJHtub2RlLm5hbWV9KCR7ZGlzdGluY3RQcmVmaXh9JHthcmdzfSlgO1xuICB9XG5cbiAgdmlzaXRQYXJhbUV4cHJlc3Npb24oX25vZGU6IFBhcmFtKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJz8nO1xuICB9XG5cbiAgdmlzaXRTdHJpbmdMaXRlcmFsKG5vZGU6IFN0cmluZ0xpdGVyYWwpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJyR7bm9kZS52YWx1ZS5yZXBsYWNlKC8nL2csIFwiJydcIil9J2A7XG4gIH1cblxuICB2aXNpdE51bWJlckxpdGVyYWwobm9kZTogTnVtYmVyTGl0ZXJhbCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5vZGUudmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHZpc2l0TnVsbExpdGVyYWwoX25vZGU6IE51bGxMaXRlcmFsKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ05VTEwnO1xuICB9XG5cbiAgdmlzaXRFeGlzdHNFeHByZXNzaW9uKG5vZGU6IEV4aXN0c0V4cHJlc3Npb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBgRVhJU1RTICgke25vZGUuc3VicXVlcnkuYWNjZXB0KHRoaXMpfSlgO1xuICB9XG59XG4iXX0=
@@ -1,14 +1,29 @@
1
1
  import { AliasableExpression } from "../ast/Abstractions";
2
2
  import { Alias } from "../ast/Alias";
3
+ import { AlterTableQuery } from "../ast/AlterTableQuery";
4
+ import { BetweenExpression } from "../ast/BetweenExpression";
3
5
  import { BinaryExpression } from "../ast/BinaryExpression";
4
6
  import { CaseExpression } from "../ast/CaseExpression";
7
+ import { CastExpression } from "../ast/CastExpression";
8
+ import { CollateExpression } from "../ast/CollateExpression";
9
+ import { SubqueryExpression } from "../ast/SubqueryExpression";
10
+ import { WindowExpression } from "../ast/WindowExpression";
5
11
  import { Column } from "../ast/Column";
6
12
  import { Concat } from "../ast/Concat";
13
+ import { CreateIndexQuery } from "../ast/CreateIndexQuery";
14
+ import { CreateTableQuery, ColumnDefinition, TableConstraint } from "../ast/CreateTableQuery";
15
+ import { CreateVirtualTableQuery } from "../ast/CreateVirtualTableQuery";
16
+ import { CreateViewQuery } from "../ast/CreateViewQuery";
17
+ import { DeleteQuery } from "../ast/DeleteQuery";
18
+ import { DropIndexQuery } from "../ast/DropIndexQuery";
19
+ import { DropTableQuery } from "../ast/DropTableQuery";
20
+ import { DropViewQuery } from "../ast/DropViewQuery";
7
21
  import { ExistsExpression } from "../ast/ExistsExpression";
8
22
  import { From, JsonEachFrom, SubqueryFrom, TableFrom } from "../ast/From";
9
23
  import { FunctionExpression } from "../ast/FunctionExpression";
10
24
  import { InExpression } from "../ast/InExpression";
11
25
  import { InsertQuery } from "../ast/InsertQuery";
26
+ import { UpdateQuery } from "../ast/UpdateQuery";
12
27
  import { Join } from "../ast/Join";
13
28
  import { NullLiteral, NumberLiteral, Param, StringLiteral } from "../ast/Literals";
14
29
  import { OrderBy } from "../ast/OrderBy";
@@ -16,18 +31,30 @@ import { SelectQuery } from "../ast/SelectQuery";
16
31
  import { UnaryExpression } from "../ast/UnaryExpression";
17
32
  import { With } from "../ast/With";
18
33
  import { ColumnLikeVisitorAcceptor, FromLikeAndJoinVisitorAcceptor, SqlTreeNodeVisitor } from "../visitor/SqlTreeNodeVisitor";
19
- import { QueryRenderer } from "./QueryRenderer";
34
+ import { QueryRenderer, RenderableQuery } from "./QueryRenderer";
20
35
  export declare class IndentedQueryRenderer implements QueryRenderer, SqlTreeNodeVisitor<string> {
21
36
  protected fromLikeAndJoinAcceptor: FromLikeAndJoinVisitorAcceptor<string>;
22
37
  protected columnLikeAcceptor: ColumnLikeVisitorAcceptor<string>;
23
38
  private readonly spacesPerLevel;
24
39
  private indentationLevel;
25
40
  constructor(spacesPerLevel: number);
26
- render(node: SelectQuery | InsertQuery): string;
41
+ render(node: RenderableQuery): string;
27
42
  private getIndent;
28
43
  private indent;
29
44
  private dedent;
30
45
  visitInsertQuery(node: InsertQuery): string;
46
+ visitDeleteQuery(node: DeleteQuery): string;
47
+ visitUpdateQuery(node: UpdateQuery): string;
48
+ visitDropTableQuery(node: DropTableQuery): string;
49
+ visitDropIndexQuery(node: DropIndexQuery): string;
50
+ visitDropViewQuery(node: DropViewQuery): string;
51
+ visitCreateViewQuery(node: CreateViewQuery): string;
52
+ visitCreateIndexQuery(node: CreateIndexQuery): string;
53
+ visitAlterTableQuery(node: AlterTableQuery): string;
54
+ visitCreateTableQuery(node: CreateTableQuery): string;
55
+ visitCreateVirtualTableQuery(node: CreateVirtualTableQuery): string;
56
+ protected renderColumnDefinition(col: ColumnDefinition): string;
57
+ protected renderTableConstraint(constraint: TableConstraint): string;
31
58
  visitSelectQuery(node: SelectQuery): string;
32
59
  visitTableFrom(node: TableFrom): string;
33
60
  visitSubqueryFrom(node: SubqueryFrom): string;
@@ -38,10 +65,15 @@ export declare class IndentedQueryRenderer implements QueryRenderer, SqlTreeNode
38
65
  visitOrderBy(node: OrderBy): string;
39
66
  visitWithClause(node: With): string;
40
67
  visitBinaryExpression(node: BinaryExpression): string;
68
+ visitBetweenExpression(node: BetweenExpression): string;
41
69
  visitUnaryExpression(node: UnaryExpression): string;
42
70
  visitInExpression(node: InExpression): string;
43
71
  visitConcat(node: Concat): string;
44
72
  visitCaseExpression(node: CaseExpression): string;
73
+ visitCastExpression(node: CastExpression): string;
74
+ visitCollateExpression(node: CollateExpression): string;
75
+ visitSubqueryExpression(node: SubqueryExpression): string;
76
+ visitWindowExpression(node: WindowExpression): string;
45
77
  visitFunctionExpression(node: FunctionExpression): string;
46
78
  visitParamExpression(_node: Param): string;
47
79
  visitStringLiteral(node: StringLiteral): string;