septima-lang 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/src/ast-node.d.ts +103 -0
  2. package/dist/src/ast-node.js +156 -0
  3. package/dist/src/extract-message.d.ts +1 -0
  4. package/dist/src/extract-message.js +10 -0
  5. package/dist/src/fail-me.d.ts +1 -0
  6. package/dist/src/fail-me.js +11 -0
  7. package/dist/src/find-array-method.d.ts +15 -0
  8. package/dist/src/find-array-method.js +104 -0
  9. package/dist/src/find-string-method.d.ts +2 -0
  10. package/dist/src/find-string-method.js +88 -0
  11. package/dist/src/index.d.ts +1 -0
  12. package/dist/src/index.js +18 -0
  13. package/dist/src/location.d.ts +11 -0
  14. package/dist/src/location.js +3 -0
  15. package/dist/src/parser.d.ts +45 -0
  16. package/dist/src/parser.js +483 -0
  17. package/dist/src/result.d.ts +24 -0
  18. package/dist/src/result.js +29 -0
  19. package/dist/src/runtime.d.ts +28 -0
  20. package/dist/src/runtime.js +351 -0
  21. package/dist/src/scanner.d.ts +23 -0
  22. package/dist/src/scanner.js +88 -0
  23. package/dist/src/septima.d.ts +32 -0
  24. package/dist/src/septima.js +91 -0
  25. package/dist/src/should-never-happen.d.ts +1 -0
  26. package/dist/src/should-never-happen.js +9 -0
  27. package/dist/src/source-code.d.ts +19 -0
  28. package/dist/src/source-code.js +90 -0
  29. package/dist/src/stack.d.ts +11 -0
  30. package/dist/src/stack.js +19 -0
  31. package/dist/src/switch-on.d.ts +1 -0
  32. package/dist/src/switch-on.js +9 -0
  33. package/dist/src/symbol-table.d.ts +6 -0
  34. package/dist/src/symbol-table.js +3 -0
  35. package/dist/src/value.d.ts +128 -0
  36. package/dist/src/value.js +634 -0
  37. package/dist/tests/parser.spec.d.ts +1 -0
  38. package/dist/tests/parser.spec.js +35 -0
  39. package/dist/tests/septima-compute-module.spec.d.ts +1 -0
  40. package/dist/tests/septima-compute-module.spec.js +36 -0
  41. package/dist/tests/septima.spec.d.ts +1 -0
  42. package/dist/tests/septima.spec.js +845 -0
  43. package/dist/tests/value.spec.d.ts +1 -0
  44. package/dist/tests/value.spec.js +355 -0
  45. package/dist/tsconfig.tsbuildinfo +1 -0
  46. package/package.json +3 -3
  47. package/src/a.js +66 -0
  48. package/src/ast-node.ts +269 -0
  49. package/src/extract-message.ts +5 -0
  50. package/src/fail-me.ts +7 -0
  51. package/src/find-array-method.ts +115 -0
  52. package/src/find-string-method.ts +84 -0
  53. package/src/index.ts +1 -0
  54. package/src/location.ts +13 -0
  55. package/src/parser.ts +554 -0
  56. package/src/result.ts +45 -0
  57. package/src/runtime.ts +370 -0
  58. package/src/scanner.ts +106 -0
  59. package/src/septima.ts +121 -0
  60. package/src/should-never-happen.ts +4 -0
  61. package/src/source-code.ts +101 -0
  62. package/src/stack.ts +18 -0
  63. package/src/switch-on.ts +4 -0
  64. package/src/symbol-table.ts +7 -0
  65. package/src/value.ts +742 -0
  66. package/tests/parser.spec.ts +36 -0
  67. package/tests/septima-compute-module.spec.ts +41 -0
  68. package/tests/septima.spec.ts +921 -0
  69. package/tests/value.spec.ts +387 -0
  70. package/main.js +0 -1
@@ -0,0 +1,483 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Parser = void 0;
4
+ const ast_node_1 = require("./ast-node");
5
+ const switch_on_1 = require("./switch-on");
6
+ class Parser {
7
+ constructor(scanner) {
8
+ this.scanner = scanner;
9
+ }
10
+ parse() {
11
+ const ret = this.unit();
12
+ if (!this.scanner.eof()) {
13
+ throw new Error(`Loitering input ${this.scanner.sourceRef}`);
14
+ }
15
+ return ret;
16
+ }
17
+ unit() {
18
+ const imports = this.imports();
19
+ const expression = this.expression('TOP_LEVEL');
20
+ return { tag: 'unit', imports, expression };
21
+ }
22
+ imports() {
23
+ const ret = [];
24
+ while (true) {
25
+ const start = this.scanner.consumeIf('import');
26
+ if (!start) {
27
+ return ret;
28
+ }
29
+ this.scanner.consume('*');
30
+ this.scanner.consume('as');
31
+ const ident = this.identifier();
32
+ this.scanner.consume('from');
33
+ const pathToImportFrom = this.maybePrimitiveLiteral();
34
+ if (pathToImportFrom === undefined) {
35
+ throw new Error(`Expected a literal ${this.scanner.sourceRef}`);
36
+ }
37
+ const notString = () => {
38
+ throw new Error(`Expected a string literal ${this.scanner.sourceCode.sourceRef((0, ast_node_1.span)(pathToImportFrom))}`);
39
+ };
40
+ (0, switch_on_1.switchOn)(pathToImportFrom.type, {
41
+ bool: notString,
42
+ num: notString,
43
+ str: () => { },
44
+ sink: notString,
45
+ 'sink!': notString,
46
+ 'sink!!': notString,
47
+ });
48
+ ret.push({ start, ident, pathToImportFrom: pathToImportFrom.t });
49
+ this.scanner.consumeIf(';');
50
+ }
51
+ }
52
+ definitions(kind) {
53
+ const ret = [];
54
+ while (true) {
55
+ if (kind === 'NESTED') {
56
+ if (this.scanner.headMatches('export ')) {
57
+ throw new Error(`non-top-level definition cannot be export ${this.scanner.sourceRef}`);
58
+ }
59
+ }
60
+ let start = this.scanner.consumeIf('let ');
61
+ if (!start && kind === 'TOP_LEVEL') {
62
+ start = this.scanner.consumeIf('export let ');
63
+ }
64
+ if (!start) {
65
+ return ret;
66
+ }
67
+ const ident = this.identifier();
68
+ this.scanner.consume('=');
69
+ const value = this.lambda();
70
+ ret.push({ start, ident, value });
71
+ this.scanner.consumeIf(';');
72
+ if (!this.scanner.headMatches('let ')) {
73
+ return ret;
74
+ }
75
+ }
76
+ }
77
+ expression(kind = 'NESTED') {
78
+ const definitions = this.definitions(kind);
79
+ if (kind === 'TOP_LEVEL' && this.scanner.eof()) {
80
+ return { tag: 'topLevelExpression', definitions };
81
+ }
82
+ this.scanner.consumeIf('return');
83
+ const computation = this.lambda();
84
+ if (definitions.length === 0) {
85
+ return computation;
86
+ }
87
+ return { tag: 'topLevelExpression', definitions, computation };
88
+ }
89
+ lambda() {
90
+ const start = this.scanner.consumeIf('fun');
91
+ if (!start) {
92
+ return this.arrowFunction();
93
+ }
94
+ this.scanner.consume('(');
95
+ const args = [];
96
+ if (this.scanner.consumeIf(')')) {
97
+ // no formal args
98
+ }
99
+ else {
100
+ while (true) {
101
+ const arg = this.identifier();
102
+ args.push(arg);
103
+ if (this.scanner.consumeIf(')')) {
104
+ break;
105
+ }
106
+ this.scanner.consume(',');
107
+ }
108
+ }
109
+ const body = this.expression();
110
+ return { tag: 'lambda', start, formalArgs: args, body };
111
+ }
112
+ arrowFunction() {
113
+ if (this.scanner.headMatches('(', ')', '=>')) {
114
+ const start = this.scanner.consume('(');
115
+ this.scanner.consume(')');
116
+ this.scanner.consume('=>');
117
+ const body = this.lambdaBody();
118
+ return { tag: 'lambda', start, formalArgs: [], body };
119
+ }
120
+ if (this.scanner.headMatches(IDENT_PATTERN, '=>')) {
121
+ const ident = this.identifier();
122
+ this.scanner.consume('=>');
123
+ const body = this.lambdaBody();
124
+ return { tag: 'lambda', start: ident.t, formalArgs: [ident], body };
125
+ }
126
+ if (this.scanner.headMatches('(', IDENT_PATTERN, ')', '=>')) {
127
+ const start = this.scanner.consume('(');
128
+ const ident = this.identifier();
129
+ this.scanner.consume(')');
130
+ this.scanner.consume('=>');
131
+ const body = this.lambdaBody();
132
+ return { tag: 'lambda', start, formalArgs: [ident], body };
133
+ }
134
+ if (this.scanner.headMatches('(', IDENT_PATTERN, ',')) {
135
+ const start = this.scanner.consume('(');
136
+ const formalArgs = [];
137
+ while (true) {
138
+ const ident = this.identifier();
139
+ formalArgs.push(ident);
140
+ if (this.scanner.consumeIf(')')) {
141
+ break;
142
+ }
143
+ this.scanner.consume(',');
144
+ }
145
+ this.scanner.consume('=>');
146
+ const body = this.lambdaBody();
147
+ return { tag: 'lambda', start, formalArgs, body };
148
+ }
149
+ return this.ifExpression();
150
+ }
151
+ lambdaBody() {
152
+ if (this.scanner.consumeIf('{')) {
153
+ const ret = this.expression();
154
+ this.scanner.consume('}');
155
+ return ret;
156
+ }
157
+ return this.expression();
158
+ }
159
+ ifExpression() {
160
+ if (!this.scanner.consumeIf('if')) {
161
+ return this.ternary();
162
+ }
163
+ this.scanner.consume('(');
164
+ const condition = this.expression();
165
+ this.scanner.consume(')');
166
+ const positive = this.expression();
167
+ this.scanner.consume('else');
168
+ const negative = this.expression();
169
+ return { tag: 'if', condition, positive, negative };
170
+ }
171
+ ternary() {
172
+ const condition = this.unsink();
173
+ if (!this.scanner.consumeIf('? ')) {
174
+ return condition;
175
+ }
176
+ const positive = this.expression();
177
+ this.scanner.consume(':');
178
+ const negative = this.expression();
179
+ return { tag: 'ternary', condition, positive, negative };
180
+ }
181
+ unsink() {
182
+ const lhs = this.or();
183
+ if (this.scanner.consumeIf('??')) {
184
+ return { tag: 'binaryOperator', operator: '??', lhs, rhs: this.unsink() };
185
+ }
186
+ return lhs;
187
+ }
188
+ or() {
189
+ const lhs = this.and();
190
+ if (this.scanner.consumeIf('||')) {
191
+ return { tag: 'binaryOperator', operator: '||', lhs, rhs: this.or() };
192
+ }
193
+ return lhs;
194
+ }
195
+ and() {
196
+ const lhs = this.equality();
197
+ if (this.scanner.consumeIf('&&')) {
198
+ return { tag: 'binaryOperator', operator: '&&', lhs, rhs: this.and() };
199
+ }
200
+ return lhs;
201
+ }
202
+ equality() {
203
+ const lhs = this.comparison();
204
+ if (this.scanner.consumeIf('==')) {
205
+ return { tag: 'binaryOperator', operator: '==', lhs, rhs: this.equality() };
206
+ }
207
+ if (this.scanner.consumeIf('!=')) {
208
+ return { tag: 'binaryOperator', operator: '!=', lhs, rhs: this.equality() };
209
+ }
210
+ return lhs;
211
+ }
212
+ comparison() {
213
+ const lhs = this.addition();
214
+ if (this.scanner.consumeIf('>=')) {
215
+ return { tag: 'binaryOperator', operator: '>=', lhs, rhs: this.comparison() };
216
+ }
217
+ if (this.scanner.consumeIf('<=')) {
218
+ return { tag: 'binaryOperator', operator: '<=', lhs, rhs: this.comparison() };
219
+ }
220
+ if (this.scanner.consumeIf('>')) {
221
+ return { tag: 'binaryOperator', operator: '>', lhs, rhs: this.comparison() };
222
+ }
223
+ if (this.scanner.consumeIf('<')) {
224
+ return { tag: 'binaryOperator', operator: '<', lhs, rhs: this.comparison() };
225
+ }
226
+ return lhs;
227
+ }
228
+ addition() {
229
+ const lhs = this.multiplication();
230
+ if (this.scanner.consumeIf('+')) {
231
+ return { tag: 'binaryOperator', operator: '+', lhs, rhs: this.addition() };
232
+ }
233
+ if (this.scanner.consumeIf('-')) {
234
+ return { tag: 'binaryOperator', operator: '-', lhs, rhs: this.addition() };
235
+ }
236
+ return lhs;
237
+ }
238
+ multiplication() {
239
+ const lhs = this.power();
240
+ if (this.scanner.consumeIf('*')) {
241
+ return { tag: 'binaryOperator', operator: '*', lhs, rhs: this.multiplication() };
242
+ }
243
+ if (this.scanner.consumeIf('/')) {
244
+ return { tag: 'binaryOperator', operator: '/', lhs, rhs: this.multiplication() };
245
+ }
246
+ if (this.scanner.consumeIf('%')) {
247
+ return { tag: 'binaryOperator', operator: '%', lhs, rhs: this.multiplication() };
248
+ }
249
+ return lhs;
250
+ }
251
+ power() {
252
+ const lhs = this.unary();
253
+ if (this.scanner.consumeIf('**')) {
254
+ return { tag: 'binaryOperator', operator: '**', lhs, rhs: this.power() };
255
+ }
256
+ return lhs;
257
+ }
258
+ unary() {
259
+ let operatorToken = this.scanner.consumeIf('!');
260
+ if (operatorToken) {
261
+ return { tag: 'unaryOperator', operand: this.unary(), operator: '!', operatorToken };
262
+ }
263
+ operatorToken = this.scanner.consumeIf('+');
264
+ if (operatorToken) {
265
+ return { tag: 'unaryOperator', operand: this.unary(), operator: '+', operatorToken };
266
+ }
267
+ operatorToken = this.scanner.consumeIf('-');
268
+ if (operatorToken) {
269
+ return { tag: 'unaryOperator', operand: this.unary(), operator: '-', operatorToken };
270
+ }
271
+ return this.call();
272
+ }
273
+ call() {
274
+ const callee = this.memberAccess();
275
+ if (!this.scanner.consumeIf('(')) {
276
+ return callee;
277
+ }
278
+ const { actualArgs, end } = this.actualArgList();
279
+ return { tag: 'functionCall', actualArgs, callee, end };
280
+ }
281
+ actualArgList() {
282
+ const actualArgs = [];
283
+ const endEmpty = this.scanner.consumeIf(')');
284
+ if (endEmpty) {
285
+ // no actual args
286
+ return { actualArgs, end: endEmpty };
287
+ }
288
+ while (true) {
289
+ const arg = this.expression();
290
+ actualArgs.push(arg);
291
+ let end = this.scanner.consumeIf(')');
292
+ if (end) {
293
+ return { actualArgs, end };
294
+ }
295
+ this.scanner.consume(',');
296
+ end = this.scanner.consumeIf(')');
297
+ if (end) {
298
+ return { actualArgs, end };
299
+ }
300
+ }
301
+ }
302
+ memberAccess() {
303
+ let ret = this.parenthesized();
304
+ while (true) {
305
+ if (this.scanner.consumeIf('.')) {
306
+ ret = { tag: 'dot', receiver: ret, ident: this.identifier() };
307
+ continue;
308
+ }
309
+ if (this.scanner.consumeIf('[')) {
310
+ ret = { tag: 'indexAccess', receiver: ret, index: this.expression() };
311
+ this.scanner.consume(']');
312
+ continue;
313
+ }
314
+ if (this.scanner.consumeIf('(')) {
315
+ const { actualArgs, end } = this.actualArgList();
316
+ ret = { tag: 'functionCall', actualArgs, callee: ret, end };
317
+ continue;
318
+ }
319
+ return ret;
320
+ }
321
+ }
322
+ parenthesized() {
323
+ if (this.scanner.consumeIf('(')) {
324
+ const ret = this.expression();
325
+ this.scanner.consume(')');
326
+ return ret;
327
+ }
328
+ return this.literalOrIdent();
329
+ }
330
+ literalOrIdent() {
331
+ const ret = this.maybeLiteral() ?? this.maybeIdentifier();
332
+ if (!ret) {
333
+ throw new Error(`Unparsable input ${this.scanner.sourceRef}`);
334
+ }
335
+ return ret;
336
+ }
337
+ maybeLiteral() {
338
+ return this.maybePrimitiveLiteral() ?? this.maybeCompositeLiteral();
339
+ }
340
+ maybePrimitiveLiteral() {
341
+ let t = this.scanner.consumeIf('sink!!') || this.scanner.consumeIf('undefined!!');
342
+ if (t) {
343
+ return { tag: 'literal', type: 'sink!!', t };
344
+ }
345
+ t = this.scanner.consumeIf('sink!') || this.scanner.consumeIf('undefined!');
346
+ if (t) {
347
+ return { tag: 'literal', type: 'sink!', t };
348
+ }
349
+ t = this.scanner.consumeIf('sink') || this.scanner.consumeIf('undefined');
350
+ if (t) {
351
+ return { tag: 'literal', type: 'sink', t };
352
+ }
353
+ t = this.scanner.consumeIf('true');
354
+ if (t) {
355
+ return { tag: 'literal', type: 'bool', t };
356
+ }
357
+ t = this.scanner.consumeIf('false');
358
+ if (t) {
359
+ return { tag: 'literal', type: 'bool', t };
360
+ }
361
+ t = this.scanner.consumeIf(/([0-9]*[.])?[0-9]+/);
362
+ if (t) {
363
+ return { tag: 'literal', type: 'num', t };
364
+ }
365
+ // double-quotes-enclosd string
366
+ if (this.scanner.consumeIf(`"`, false)) {
367
+ t = this.scanner.consume(/[^"]*/);
368
+ this.scanner.consume(`"`);
369
+ return { tag: 'literal', type: 'str', t };
370
+ }
371
+ // single-quotes-enclosd string
372
+ if (this.scanner.consumeIf(`'`, false)) {
373
+ t = this.scanner.consume(/[^']*/);
374
+ this.scanner.consume(`'`);
375
+ return { tag: 'literal', type: 'str', t };
376
+ }
377
+ return undefined;
378
+ }
379
+ maybeCompositeLiteral() {
380
+ let t = this.scanner.consumeIf('[');
381
+ if (t) {
382
+ return this.arrayBody(t);
383
+ }
384
+ t = this.scanner.consumeIf('{');
385
+ if (t) {
386
+ return this.objectBody(t);
387
+ }
388
+ return undefined;
389
+ }
390
+ /**
391
+ * This method assumes that the caller consumed the opening '[' token. It consumes the array's elements
392
+ * (comma-separated list of expressions) as well as the closing ']' token.
393
+ */
394
+ arrayBody(start) {
395
+ const t = this.scanner.consumeIf(']');
396
+ if (t) {
397
+ // an empty array literal
398
+ return { tag: 'arrayLiteral', start, parts: [], end: t };
399
+ }
400
+ const parts = [];
401
+ while (true) {
402
+ if (this.scanner.consumeIf(',')) {
403
+ const end = this.scanner.consumeIf(']');
404
+ if (end) {
405
+ return { tag: 'arrayLiteral', start, parts, end };
406
+ }
407
+ continue;
408
+ }
409
+ if (this.scanner.consumeIf('...')) {
410
+ parts.push({ tag: 'spread', v: this.expression() });
411
+ }
412
+ else {
413
+ const exp = this.expression();
414
+ parts.push({ tag: 'element', v: exp });
415
+ }
416
+ let end = this.scanner.consumeIf(']');
417
+ if (end) {
418
+ return { tag: 'arrayLiteral', start, parts, end };
419
+ }
420
+ this.scanner.consume(',');
421
+ end = this.scanner.consumeIf(']');
422
+ if (end) {
423
+ return { tag: 'arrayLiteral', start, parts, end };
424
+ }
425
+ }
426
+ }
427
+ /**
428
+ * This method assumes that the caller consumed the opening '{' token. It consumes the object's attributes
429
+ * (comma-separated list of key:value parirs) as well as the closing '}' token.
430
+ */
431
+ objectBody(start) {
432
+ const t = this.scanner.consumeIf('}');
433
+ if (t) {
434
+ // an empty array literal
435
+ return { tag: 'objectLiteral', start, parts: [], end: t };
436
+ }
437
+ const parts = [];
438
+ while (true) {
439
+ if (this.scanner.consumeIf('...')) {
440
+ parts.push({ tag: 'spread', o: this.expression() });
441
+ }
442
+ else if (this.scanner.consumeIf('[')) {
443
+ const k = this.expression();
444
+ this.scanner.consume(']');
445
+ this.scanner.consume(':');
446
+ const v = this.expression();
447
+ parts.push({ tag: 'computedName', k, v });
448
+ }
449
+ else {
450
+ const k = this.identifier();
451
+ this.scanner.consume(':');
452
+ const v = this.expression();
453
+ parts.push({ tag: 'hardName', k, v });
454
+ }
455
+ let end = this.scanner.consumeIf('}');
456
+ if (end) {
457
+ return { tag: 'objectLiteral', start, parts, end };
458
+ }
459
+ this.scanner.consume(',');
460
+ end = this.scanner.consumeIf('}');
461
+ if (end) {
462
+ return { tag: 'objectLiteral', start, parts, end };
463
+ }
464
+ }
465
+ }
466
+ identifier() {
467
+ const ret = this.maybeIdentifier();
468
+ if (!ret) {
469
+ throw new Error(`Expected an identifier ${this.scanner.sourceRef}`);
470
+ }
471
+ return ret;
472
+ }
473
+ maybeIdentifier() {
474
+ const t = this.scanner.consumeIf(IDENT_PATTERN);
475
+ if (t) {
476
+ return { tag: 'ident', t };
477
+ }
478
+ return undefined;
479
+ }
480
+ }
481
+ exports.Parser = Parser;
482
+ const IDENT_PATTERN = /[a-zA-Z][0-9A-Za-z_]*/;
483
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBa0g7QUFFbEgsMkNBQXNDO0FBRXRDLE1BQWEsTUFBTTtJQUNqQixZQUE2QixPQUFnQjtRQUFoQixZQUFPLEdBQVAsT0FBTyxDQUFTO0lBQUcsQ0FBQztJQUVqRCxLQUFLO1FBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtTQUM3RDtRQUNELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVELElBQUk7UUFDRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDOUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUMvQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUE7SUFDN0MsQ0FBQztJQUVELE9BQU87UUFDTCxNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUE7UUFDeEIsT0FBTyxJQUFJLEVBQUU7WUFDWCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUM5QyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNWLE9BQU8sR0FBRyxDQUFBO2FBQ1g7WUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7WUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDNUIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQTtZQUNyRCxJQUFJLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtnQkFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO2FBQ2hFO1lBRUQsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFO2dCQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBQSxlQUFJLEVBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUMzRyxDQUFDLENBQUE7WUFDRCxJQUFBLG9CQUFRLEVBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFO2dCQUM5QixJQUFJLEVBQUUsU0FBUztnQkFDZixHQUFHLEVBQUUsU0FBUztnQkFDZCxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztnQkFDYixJQUFJLEVBQUUsU0FBUztnQkFDZixPQUFPLEVBQUUsU0FBUztnQkFDbEIsUUFBUSxFQUFFLFNBQVM7YUFDcEIsQ0FBQyxDQUFBO1lBQ0YsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUVoRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUM1QjtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsSUFBNEI7UUFDdEMsTUFBTSxHQUFHLEdBQVUsRUFBRSxDQUFBO1FBQ3JCLE9BQU8sSUFBSSxFQUFFO1lBQ1gsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUNyQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7aUJBQ3ZGO2FBQ0Y7WUFDRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUMxQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksS0FBSyxXQUFXLEVBQUU7Z0JBQ2xDLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTthQUM5QztZQUNELElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ1YsT0FBTyxHQUFHLENBQUE7YUFDWDtZQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN6QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7WUFDM0IsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtZQUVqQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3JDLE9BQU8sR0FBRyxDQUFBO2FBQ1g7U0FDRjtJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsT0FBK0IsUUFBUTtRQUNoRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzFDLElBQUksSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzlDLE9BQU8sRUFBRSxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLENBQUE7U0FDbEQ7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7UUFFakMsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM1QixPQUFPLFdBQVcsQ0FBQTtTQUNuQjtRQUVELE9BQU8sRUFBRSxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFBO0lBQ2hFLENBQUM7SUFFRCxNQUFNO1FBQ0osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDM0MsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1NBQzVCO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDekIsTUFBTSxJQUFJLEdBQVksRUFBRSxDQUFBO1FBRXhCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsaUJBQWlCO1NBQ2xCO2FBQU07WUFDTCxPQUFPLElBQUksRUFBRTtnQkFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7Z0JBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDL0IsTUFBSztpQkFDTjtnQkFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTthQUMxQjtTQUNGO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQzlCLE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFBO0lBQ3pELENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3ZDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtZQUM5QixPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQTtTQUN0RDtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ2pELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7WUFDOUIsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUE7U0FDcEU7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQzNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7WUFDOUIsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFBO1NBQzNEO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsYUFBYSxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sVUFBVSxHQUFZLEVBQUUsQ0FBQTtZQUM5QixPQUFPLElBQUksRUFBRTtnQkFDWCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7Z0JBQy9CLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBRXRCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQy9CLE1BQUs7aUJBQ047Z0JBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7YUFDMUI7WUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7WUFDOUIsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQTtTQUNsRDtRQUVELE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO0lBQzVCLENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO1lBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3pCLE9BQU8sR0FBRyxDQUFBO1NBQ1g7UUFFRCxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtTQUN0QjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUV6QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7UUFFbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBRWxDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUE7SUFDckQsQ0FBQztJQUVELE9BQU87UUFDTCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sU0FBUyxDQUFBO1NBQ2pCO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUVsQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFBO0lBQzFELENBQUM7SUFFRCxNQUFNO1FBQ0osTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFBO1FBQ3JCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUE7U0FDMUU7UUFDRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRCxFQUFFO1FBQ0EsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ3RCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUE7U0FDdEU7UUFDRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRCxHQUFHO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBQzNCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUE7U0FDdkU7UUFDRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRCxRQUFRO1FBQ04sTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQzdCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUE7U0FDNUU7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFBO1NBQzVFO1FBQ0QsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0lBRUQsVUFBVTtRQUNSLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUMzQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFBO1NBQzlFO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQyxPQUFPLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQTtTQUM5RTtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUE7U0FDN0U7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFBO1NBQzdFO1FBQ0QsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUNqQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFBO1NBQzNFO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMvQixPQUFPLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQTtTQUMzRTtRQUNELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVELGNBQWM7UUFDWixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDeEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMvQixPQUFPLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQTtTQUNqRjtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUE7U0FDakY7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFBO1NBQ2pGO1FBQ0QsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0lBRUQsS0FBSztRQUNILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUN4QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFBO1NBQ3pFO1FBQ0QsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQy9DLElBQUksYUFBYSxFQUFFO1lBQ2pCLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsQ0FBQTtTQUNyRjtRQUNELGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMzQyxJQUFJLGFBQWEsRUFBRTtZQUNqQixPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLENBQUE7U0FDckY7UUFDRCxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDM0MsSUFBSSxhQUFhLEVBQUU7WUFDakIsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxDQUFBO1NBQ3JGO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDcEIsQ0FBQztJQUVELElBQUk7UUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7UUFFbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sTUFBTSxDQUFBO1NBQ2Q7UUFFRCxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNoRCxPQUFPLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFBO0lBQ3pELENBQUM7SUFFTyxhQUFhO1FBQ25CLE1BQU0sVUFBVSxHQUFjLEVBQUUsQ0FBQTtRQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM1QyxJQUFJLFFBQVEsRUFBRTtZQUNaLGlCQUFpQjtZQUNqQixPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQTtTQUNyQztRQUVELE9BQU8sSUFBSSxFQUFFO1lBQ1gsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO1lBQzdCLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDcEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDckMsSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQTthQUMzQjtZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3pCLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNqQyxJQUFJLEdBQUcsRUFBRTtnQkFDUCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFBO2FBQzNCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUU5QixPQUFPLElBQUksRUFBRTtZQUNYLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQy9CLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUE7Z0JBQzdELFNBQVE7YUFDVDtZQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQy9CLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUE7Z0JBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUN6QixTQUFRO2FBQ1Q7WUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtnQkFDaEQsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQTtnQkFDM0QsU0FBUTthQUNUO1lBRUQsT0FBTyxHQUFHLENBQUE7U0FDWDtJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMvQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7WUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDekIsT0FBTyxHQUFHLENBQUE7U0FDWDtRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO0lBQzlCLENBQUM7SUFFRCxjQUFjO1FBQ1osTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTtRQUN6RCxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO1NBQzlEO1FBQ0QsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUE7SUFDckUsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNqRixJQUFJLENBQUMsRUFBRTtZQUNMLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUE7U0FDN0M7UUFFRCxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDM0UsSUFBSSxDQUFDLEVBQUU7WUFDTCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFBO1NBQzVDO1FBRUQsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3pFLElBQUksQ0FBQyxFQUFFO1lBQ0wsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQTtTQUMzQztRQUVELENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNsQyxJQUFJLENBQUMsRUFBRTtZQUNMLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUE7U0FDM0M7UUFDRCxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDbkMsSUFBSSxDQUFDLEVBQUU7WUFDTCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFBO1NBQzNDO1FBRUQsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUE7UUFDaEQsSUFBSSxDQUFDLEVBQUU7WUFDTCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFBO1NBQzFDO1FBRUQsK0JBQStCO1FBQy9CLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ3RDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN6QixPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFBO1NBQzFDO1FBRUQsK0JBQStCO1FBQy9CLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ3RDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN6QixPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFBO1NBQzFDO1FBRUQsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNuQyxJQUFJLENBQUMsRUFBRTtZQUNMLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUN6QjtRQUVELENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMvQixJQUFJLENBQUMsRUFBRTtZQUNMLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUMxQjtRQUVELE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsS0FBWTtRQUNwQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNyQyxJQUFJLENBQUMsRUFBRTtZQUNMLHlCQUF5QjtZQUN6QixPQUFPLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUE7U0FDekQ7UUFFRCxNQUFNLEtBQUssR0FBdUIsRUFBRSxDQUFBO1FBQ3BDLE9BQU8sSUFBSSxFQUFFO1lBQ1gsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDL0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ3ZDLElBQUksR0FBRyxFQUFFO29CQUNQLE9BQU8sRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUE7aUJBQ2xEO2dCQUNELFNBQVE7YUFDVDtZQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFBO2FBQ3BEO2lCQUFNO2dCQUNMLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtnQkFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7YUFDdkM7WUFFRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNyQyxJQUFJLEdBQUcsRUFBRTtnQkFDUCxPQUFPLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFBO2FBQ2xEO1lBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDekIsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2pDLElBQUksR0FBRyxFQUFFO2dCQUNQLE9BQU8sRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUE7YUFDbEQ7U0FDRjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsS0FBWTtRQUNyQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNyQyxJQUFJLENBQUMsRUFBRTtZQUNMLHlCQUF5QjtZQUN6QixPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUE7U0FDMUQ7UUFFRCxNQUFNLEtBQUssR0FBd0IsRUFBRSxDQUFBO1FBQ3JDLE9BQU8sSUFBSSxFQUFFO1lBQ1gsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDakMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUE7YUFDcEQ7aUJBQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDdEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO2dCQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ3pCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtnQkFDM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7YUFDMUM7aUJBQU07Z0JBQ0wsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO2dCQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDekIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO2dCQUMzQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTthQUN0QztZQUVELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3JDLElBQUksR0FBRyxFQUFFO2dCQUNQLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUE7YUFDbkQ7WUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN6QixHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDakMsSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQTthQUNuRDtTQUNGO0lBQ0gsQ0FBQztJQUVPLFVBQVU7UUFDaEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7U0FDcEU7UUFFRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFTyxlQUFlO1FBQ3JCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQy9DLElBQUksQ0FBQyxFQUFFO1lBQ0wsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUE7U0FDM0I7UUFFRCxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0NBQ0Y7QUFuaUJELHdCQW1pQkM7QUFFRCxNQUFNLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQSJ9
@@ -0,0 +1,24 @@
1
+ import { Span } from './location';
2
+ import { SourceCode } from './source-code';
3
+ import { Value } from './value';
4
+ export declare type ResultSink = {
5
+ tag: 'sink';
6
+ where: Span | undefined;
7
+ trace: string | undefined;
8
+ symbols: Record<string, unknown> | undefined;
9
+ message: string;
10
+ };
11
+ export declare type Result = {
12
+ tag: 'ok';
13
+ value: unknown;
14
+ } | ResultSink;
15
+ export declare class ResultSinkImpl {
16
+ private readonly sink;
17
+ private readonly sourceCode;
18
+ readonly tag = "sink";
19
+ constructor(sink: Value, sourceCode: SourceCode);
20
+ get where(): Span | undefined;
21
+ get trace(): string | undefined;
22
+ get symbols(): Record<string, unknown> | undefined;
23
+ get message(): string;
24
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResultSinkImpl = void 0;
4
+ class ResultSinkImpl {
5
+ constructor(sink, sourceCode) {
6
+ this.sink = sink;
7
+ this.sourceCode = sourceCode;
8
+ this.tag = 'sink';
9
+ }
10
+ get where() {
11
+ return this.sink.span();
12
+ }
13
+ get trace() {
14
+ const trace = this.sink.trace();
15
+ if (trace) {
16
+ return this.sourceCode.formatTrace(trace);
17
+ }
18
+ return undefined;
19
+ }
20
+ get symbols() {
21
+ return this.sink.symbols()?.export();
22
+ }
23
+ get message() {
24
+ const at = this.trace ?? this.sourceCode.sourceRef(this.where);
25
+ return `Evaluated to sink: ${at}`;
26
+ }
27
+ }
28
+ exports.ResultSinkImpl = ResultSinkImpl;
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFtQkEsTUFBYSxjQUFjO0lBRXpCLFlBQTZCLElBQVcsRUFBbUIsVUFBc0I7UUFBcEQsU0FBSSxHQUFKLElBQUksQ0FBTztRQUFtQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBRHhFLFFBQUcsR0FBRyxNQUFNLENBQUE7SUFDK0QsQ0FBQztJQUVyRixJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDekIsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDL0IsSUFBSSxLQUFLLEVBQUU7WUFDVCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO1NBQzFDO1FBRUQsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDOUQsT0FBTyxzQkFBc0IsRUFBRSxFQUFFLENBQUE7SUFDbkMsQ0FBQztDQUNGO0FBekJELHdDQXlCQyJ9
@@ -0,0 +1,28 @@
1
+ import { AstNode, Unit } from './ast-node';
2
+ import { Value } from './value';
3
+ export declare type Verbosity = 'quiet' | 'trace';
4
+ export declare class Runtime {
5
+ private readonly root;
6
+ private readonly verbosity;
7
+ private readonly preimports;
8
+ private readonly getAstOf;
9
+ private readonly args;
10
+ private stack;
11
+ constructor(root: AstNode, verbosity: Verbosity, preimports: Record<string, Value>, getAstOf: (fileName: string) => Unit, args: Record<string, unknown>);
12
+ private buildInitialSymbolTable;
13
+ compute(): {
14
+ value: Value;
15
+ expressionTrace?: undefined;
16
+ errorMessage?: undefined;
17
+ stack?: undefined;
18
+ } | {
19
+ expressionTrace: AstNode[];
20
+ errorMessage: unknown;
21
+ stack: string[] | undefined;
22
+ value?: undefined;
23
+ };
24
+ private evalNode;
25
+ private importDefinitions;
26
+ private evalNodeImpl;
27
+ call(callee: Value, argValues: Value[]): Value;
28
+ }