septima-lang 0.0.7 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/ast-node.d.ts +103 -0
- package/dist/src/ast-node.js +156 -0
- package/dist/src/extract-message.d.ts +1 -0
- package/dist/src/extract-message.js +10 -0
- package/dist/src/fail-me.d.ts +1 -0
- package/dist/src/fail-me.js +11 -0
- package/dist/src/find-array-method.d.ts +15 -0
- package/dist/src/find-array-method.js +104 -0
- package/dist/src/find-string-method.d.ts +2 -0
- package/dist/src/find-string-method.js +88 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +18 -0
- package/dist/src/location.d.ts +11 -0
- package/dist/src/location.js +3 -0
- package/dist/src/parser.d.ts +45 -0
- package/dist/src/parser.js +490 -0
- package/dist/src/result.d.ts +24 -0
- package/dist/src/result.js +29 -0
- package/dist/src/runtime.d.ts +28 -0
- package/dist/src/runtime.js +351 -0
- package/dist/src/scanner.d.ts +23 -0
- package/dist/src/scanner.js +88 -0
- package/dist/src/septima.d.ts +32 -0
- package/dist/src/septima.js +91 -0
- package/dist/src/should-never-happen.d.ts +1 -0
- package/dist/src/should-never-happen.js +9 -0
- package/dist/src/source-code.d.ts +19 -0
- package/dist/src/source-code.js +90 -0
- package/dist/src/stack.d.ts +11 -0
- package/dist/src/stack.js +19 -0
- package/dist/src/switch-on.d.ts +1 -0
- package/dist/src/switch-on.js +9 -0
- package/dist/src/symbol-table.d.ts +6 -0
- package/dist/src/symbol-table.js +3 -0
- package/dist/src/value.d.ts +128 -0
- package/dist/src/value.js +634 -0
- package/dist/tests/parser.spec.d.ts +1 -0
- package/dist/tests/parser.spec.js +35 -0
- package/dist/tests/septima-compute-module.spec.d.ts +1 -0
- package/dist/tests/septima-compute-module.spec.js +36 -0
- package/dist/tests/septima.spec.d.ts +1 -0
- package/dist/tests/septima.spec.js +857 -0
- package/dist/tests/value.spec.d.ts +1 -0
- package/dist/tests/value.spec.js +355 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +3 -3
- package/src/a.js +66 -0
- package/src/ast-node.ts +269 -0
- package/src/extract-message.ts +5 -0
- package/src/fail-me.ts +7 -0
- package/src/find-array-method.ts +115 -0
- package/src/find-string-method.ts +84 -0
- package/src/index.ts +1 -0
- package/src/location.ts +13 -0
- package/src/parser.ts +563 -0
- package/src/result.ts +45 -0
- package/src/runtime.ts +370 -0
- package/src/scanner.ts +106 -0
- package/src/septima.ts +121 -0
- package/src/should-never-happen.ts +4 -0
- package/src/source-code.ts +101 -0
- package/src/stack.ts +18 -0
- package/src/switch-on.ts +4 -0
- package/src/symbol-table.ts +7 -0
- package/src/value.ts +742 -0
- package/tests/parser.spec.ts +36 -0
- package/tests/septima-compute-module.spec.ts +41 -0
- package/tests/septima.spec.ts +933 -0
- package/tests/value.spec.ts +387 -0
- package/main.js +0 -1
|
@@ -0,0 +1,857 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const septima_1 = require("../src/septima");
|
|
4
|
+
/**
|
|
5
|
+
* Runs a Septima program for testing purposes. If the program evaluates to `sink` an `undefined` is
|
|
6
|
+
* returned.
|
|
7
|
+
* @param input the Septima program to run
|
|
8
|
+
*/
|
|
9
|
+
function run(input) {
|
|
10
|
+
return septima_1.Septima.run(input, { onSink: () => undefined });
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Runs a Septima program for testing purposes. The program is expected to evaluate to `sink`. Throws an exception if
|
|
14
|
+
* this expectation is not met.
|
|
15
|
+
* @param input the Septima program to run
|
|
16
|
+
*/
|
|
17
|
+
function runSink(input) {
|
|
18
|
+
const septima = new septima_1.Septima();
|
|
19
|
+
const res = septima.compute(input, {}, 'quiet', {});
|
|
20
|
+
if (res.tag !== 'sink') {
|
|
21
|
+
throw new Error(`Not a sink: ${res.value}`);
|
|
22
|
+
}
|
|
23
|
+
return res;
|
|
24
|
+
}
|
|
25
|
+
describe('septima', () => {
|
|
26
|
+
test('basics', () => {
|
|
27
|
+
expect(run(`5`)).toEqual(5);
|
|
28
|
+
expect(() => run(`6 789`)).toThrowError(`Loitering input at (1:3..5) 789`);
|
|
29
|
+
expect(run(`3.14`)).toEqual(3.14);
|
|
30
|
+
});
|
|
31
|
+
test('an optional return keyword can be placed before the result', () => {
|
|
32
|
+
expect(run(`return 5`)).toEqual(5);
|
|
33
|
+
expect(run(`return 3.14`)).toEqual(3.14);
|
|
34
|
+
});
|
|
35
|
+
test('booleans', () => {
|
|
36
|
+
expect(run(`true`)).toEqual(true);
|
|
37
|
+
expect(run(`false`)).toEqual(false);
|
|
38
|
+
expect(run(`!true`)).toEqual(false);
|
|
39
|
+
expect(run(`!false`)).toEqual(true);
|
|
40
|
+
expect(run(`!!true`)).toEqual(true);
|
|
41
|
+
expect(run(`!!false`)).toEqual(false);
|
|
42
|
+
expect(run(`true||true`)).toEqual(true);
|
|
43
|
+
expect(run(`true||false`)).toEqual(true);
|
|
44
|
+
expect(run(`false||true`)).toEqual(true);
|
|
45
|
+
expect(run(`false||false`)).toEqual(false);
|
|
46
|
+
expect(run(`true && true`)).toEqual(true);
|
|
47
|
+
expect(run(`true && false`)).toEqual(false);
|
|
48
|
+
expect(run(`false && true`)).toEqual(false);
|
|
49
|
+
expect(run(`false && false`)).toEqual(false);
|
|
50
|
+
});
|
|
51
|
+
test('arithmetics', () => {
|
|
52
|
+
expect(run(`8*2`)).toEqual(16);
|
|
53
|
+
expect(run(`3+1`)).toEqual(4);
|
|
54
|
+
expect(run(`20-3`)).toEqual(17);
|
|
55
|
+
expect(run(`48/6`)).toEqual(8);
|
|
56
|
+
expect(run(`(1+4)*6`)).toEqual(30);
|
|
57
|
+
expect(run(`1+4*6`)).toEqual(25);
|
|
58
|
+
expect(run(`20%6`)).toEqual(2);
|
|
59
|
+
expect(run(`20%8`)).toEqual(4);
|
|
60
|
+
expect(run(`40%15`)).toEqual(10);
|
|
61
|
+
expect(run(`6**3`)).toEqual(216);
|
|
62
|
+
expect(run(`6**4`)).toEqual(1296);
|
|
63
|
+
expect(run(`2*3**4`)).toEqual(162);
|
|
64
|
+
expect(run(`(2*3)**4`)).toEqual(1296);
|
|
65
|
+
expect(run(`8/0`)).toEqual(Infinity);
|
|
66
|
+
expect(run(`(-4) ** 0.5`)).toEqual(NaN);
|
|
67
|
+
expect(() => run(`!5`)).toThrowError(`value type error: expected bool but found 5`);
|
|
68
|
+
expect(() => run(`!0`)).toThrowError(`value type error: expected bool but found 0`);
|
|
69
|
+
expect(() => run(`!!0`)).toThrowError(`value type error: expected bool but found 0`);
|
|
70
|
+
expect(() => run(`!!4`)).toThrowError(`value type error: expected bool but found 4`);
|
|
71
|
+
});
|
|
72
|
+
test('error message specifies the location in the file', () => {
|
|
73
|
+
expect(() => run(`7+\n6+\n5+4+3+!2`)).toThrowError(`value type error: expected bool but found 2`);
|
|
74
|
+
const expected = [
|
|
75
|
+
`value type error: expected num but found "zxcvbnm" when evaluating:`,
|
|
76
|
+
` at (1:1..21) 9 * 8 * 'zxcvbnm' * 7`,
|
|
77
|
+
` at (1:1..21) 9 * 8 * 'zxcvbnm' * 7`,
|
|
78
|
+
` at (1:5..21) 8 * 'zxcvbnm' * 7`,
|
|
79
|
+
` at (1:10..21) zxcvbnm' * 7`,
|
|
80
|
+
].join('\n');
|
|
81
|
+
expect(() => run(`9 * 8 * 'zxcvbnm' * 7`)).toThrowError(expected);
|
|
82
|
+
});
|
|
83
|
+
test('equality', () => {
|
|
84
|
+
expect(run(`3==4`)).toEqual(false);
|
|
85
|
+
expect(run(`3==3`)).toEqual(true);
|
|
86
|
+
expect(run(`3!=4`)).toEqual(true);
|
|
87
|
+
expect(run(`3!=3`)).toEqual(false);
|
|
88
|
+
});
|
|
89
|
+
test('comparison', () => {
|
|
90
|
+
expect(run(`3>2`)).toEqual(true);
|
|
91
|
+
expect(run(`3>3`)).toEqual(false);
|
|
92
|
+
expect(run(`3>4`)).toEqual(false);
|
|
93
|
+
expect(run(`3>=2`)).toEqual(true);
|
|
94
|
+
expect(run(`3>=3`)).toEqual(true);
|
|
95
|
+
expect(run(`3>=4`)).toEqual(false);
|
|
96
|
+
expect(run(`3<=2`)).toEqual(false);
|
|
97
|
+
expect(run(`3<=3`)).toEqual(true);
|
|
98
|
+
expect(run(`3<=4`)).toEqual(true);
|
|
99
|
+
expect(run(`3<2`)).toEqual(false);
|
|
100
|
+
expect(run(`3<3`)).toEqual(false);
|
|
101
|
+
expect(run(`3<4`)).toEqual(true);
|
|
102
|
+
});
|
|
103
|
+
test('combined arithmetics and logical expressions', () => {
|
|
104
|
+
expect(run(`(5 + 3 > 6) && (10*20 > 150)`)).toEqual(true);
|
|
105
|
+
expect(run(`(5 + 3 > 9) && (10*20 > 150)`)).toEqual(false);
|
|
106
|
+
expect(run(`(5 + 3 > 6) && (10*20 > 201)`)).toEqual(false);
|
|
107
|
+
expect(run(`(5 + 3 > 9) && (10*20 > 201)`)).toEqual(false);
|
|
108
|
+
});
|
|
109
|
+
test('the rhs of a logical-or expression is evaluated only if lhs is false', () => {
|
|
110
|
+
expect(run(`true || x`)).toEqual(true);
|
|
111
|
+
expect(() => run(`false || x`)).toThrowError('Symbol x was not found');
|
|
112
|
+
});
|
|
113
|
+
test('the rhs of a logical-and expression is evaluated only if lhs is true', () => {
|
|
114
|
+
expect(run(`false && x`)).toEqual(false);
|
|
115
|
+
expect(() => run(`true && x`)).toThrowError('Symbol x was not found');
|
|
116
|
+
});
|
|
117
|
+
test('eats whitespace', () => {
|
|
118
|
+
expect(run(` 8 * 2 `)).toEqual(16);
|
|
119
|
+
expect(run(`3 + 1`)).toEqual(4);
|
|
120
|
+
expect(run(`20 - 3`)).toEqual(17);
|
|
121
|
+
expect(run(`48 / 6`)).toEqual(8);
|
|
122
|
+
expect(run(`(1 + 4 ) *7`)).toEqual(35);
|
|
123
|
+
});
|
|
124
|
+
describe('unary expressions', () => {
|
|
125
|
+
test('+', () => {
|
|
126
|
+
expect(run(`+7`)).toEqual(7);
|
|
127
|
+
expect(run(`3*+7`)).toEqual(21);
|
|
128
|
+
expect(run(`3 * +7`)).toEqual(21);
|
|
129
|
+
});
|
|
130
|
+
test('errors if + is applied to non-number', () => {
|
|
131
|
+
expect(() => run(`+true`)).toThrowError('expected num but found true');
|
|
132
|
+
expect(() => run(`+[]`)).toThrowError('expected num but found []');
|
|
133
|
+
expect(() => run(`+{}`)).toThrowError('expected num but found {}');
|
|
134
|
+
expect(() => run(`+(fun (x) x*2)`)).toThrowError('expected num but found "fun (x) (x * 2)"');
|
|
135
|
+
expect(() => run(`+'abc'`)).toThrowError(`expected num but found "abc"`);
|
|
136
|
+
});
|
|
137
|
+
test('-', () => {
|
|
138
|
+
expect(run(`-7`)).toEqual(-7);
|
|
139
|
+
expect(run(`3+-7`)).toEqual(-4);
|
|
140
|
+
expect(run(`3*-7`)).toEqual(-21);
|
|
141
|
+
expect(run(`-3*-7`)).toEqual(21);
|
|
142
|
+
expect(run(`3 + -7`)).toEqual(-4);
|
|
143
|
+
expect(run(`3 * -7`)).toEqual(-21);
|
|
144
|
+
expect(run(`-3 * -7`)).toEqual(21);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
describe('strings', () => {
|
|
148
|
+
test('can be specified via the double-quotes notation', () => {
|
|
149
|
+
expect(run(`""`)).toEqual('');
|
|
150
|
+
expect(run(`"ab"`)).toEqual('ab');
|
|
151
|
+
expect(run(`"ab" + "cd"`)).toEqual('abcd');
|
|
152
|
+
});
|
|
153
|
+
test('can be specified via the single-quotes notation', () => {
|
|
154
|
+
expect(run(`''`)).toEqual('');
|
|
155
|
+
expect(run(`'ab'`)).toEqual('ab');
|
|
156
|
+
expect(run(`'ab' + 'cd'`)).toEqual('abcd');
|
|
157
|
+
});
|
|
158
|
+
test('does not trim leading/trailing whitespace', () => {
|
|
159
|
+
expect(run(`' ab'`)).toEqual(' ab');
|
|
160
|
+
expect(run(`'ab '`)).toEqual('ab ');
|
|
161
|
+
expect(run(`' '`)).toEqual(' ');
|
|
162
|
+
expect(run(`' ab '`)).toEqual(' ab ');
|
|
163
|
+
expect(run(`" ab"`)).toEqual(' ab');
|
|
164
|
+
expect(run(`"ab "`)).toEqual('ab ');
|
|
165
|
+
expect(run(`" "`)).toEqual(' ');
|
|
166
|
+
expect(run(`" ab "`)).toEqual(' ab ');
|
|
167
|
+
});
|
|
168
|
+
test('supports string methods', () => {
|
|
169
|
+
expect(run(`'bigbird'.substring(3, 7)`)).toEqual('bird');
|
|
170
|
+
expect(run(`'bigbird'.indexOf('g')`)).toEqual(2);
|
|
171
|
+
expect(run(`'ab-cde-fghi-jkl'.split('-')`)).toEqual(['ab', 'cde', 'fghi', 'jkl']);
|
|
172
|
+
expect(run(`let s = ' ab cd '; [s.trimStart(), s.trimEnd(), s.trim()]`)).toEqual([
|
|
173
|
+
'ab cd ',
|
|
174
|
+
' ab cd',
|
|
175
|
+
'ab cd',
|
|
176
|
+
]);
|
|
177
|
+
});
|
|
178
|
+
test('supports optional arguments of string methods', () => {
|
|
179
|
+
expect(run(`'bigbird'.substring(5)`)).toEqual('rd');
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
describe('let', () => {
|
|
183
|
+
test('binds values to variables', () => {
|
|
184
|
+
expect(run(`let x = 5; x+3`)).toEqual(8);
|
|
185
|
+
expect(run(`let x = 5; let y = 20; x*y+4`)).toEqual(104);
|
|
186
|
+
});
|
|
187
|
+
test('do not need the trailing semicolon', () => {
|
|
188
|
+
expect(run(`let x = 5 x+3`)).toEqual(8);
|
|
189
|
+
expect(run(`let x = 5 let y = 20 x*y+4`)).toEqual(104);
|
|
190
|
+
});
|
|
191
|
+
test('fails if the variable was not defined', () => {
|
|
192
|
+
expect(() => run(`let x = 5; x+y`)).toThrowError('Symbol y was not found');
|
|
193
|
+
});
|
|
194
|
+
test('parenthsized expression can have let defintions', () => {
|
|
195
|
+
expect(run(`
|
|
196
|
+
let x = 5;
|
|
197
|
+
let y = 20;
|
|
198
|
+
|
|
199
|
+
x*y+(let n = 4; n*7)`)).toEqual(128);
|
|
200
|
+
expect(run(`
|
|
201
|
+
let x = 5;
|
|
202
|
+
let y = 20;
|
|
203
|
+
|
|
204
|
+
x*y+(let n = 4; let o = 7; o*n)`)).toEqual(128);
|
|
205
|
+
});
|
|
206
|
+
test('inner expressions can access variables from enclosing scopes', () => {
|
|
207
|
+
expect(run(`
|
|
208
|
+
let x = 5;
|
|
209
|
+
let y = 20;
|
|
210
|
+
|
|
211
|
+
x*y+(let n = 4; n+x)`)).toEqual(109);
|
|
212
|
+
});
|
|
213
|
+
test('definitions from inner scopes overshadow definitions from outer scopes', () => {
|
|
214
|
+
expect(run(`
|
|
215
|
+
let x = 5;
|
|
216
|
+
let y = 20;
|
|
217
|
+
|
|
218
|
+
x*y+(let n = 4; let x = 200; n+x)`)).toEqual(304);
|
|
219
|
+
});
|
|
220
|
+
test('the body of a definition can reference an earlier definition from the same scope', () => {
|
|
221
|
+
expect(run(`let x = 10; let y = x*2; y*2`)).toEqual(40);
|
|
222
|
+
});
|
|
223
|
+
test('the body of a definition cannot reference a latter definition from the same scope', () => {
|
|
224
|
+
expect(() => run(`let y = x*2; let x = 10; y*2`)).toThrowError(`Symbol x was not found`);
|
|
225
|
+
});
|
|
226
|
+
test('the body of a definition cannot reference itself', () => {
|
|
227
|
+
expect(() => run(`let x = 10; let y = if (x > 0) y else x; y*2`)).toThrowError(`Unresolved definition: y`);
|
|
228
|
+
});
|
|
229
|
+
test('uses lexical scoping (and not dynamic scoping)', () => {
|
|
230
|
+
const actual = run(`let x = (let a = 1; a+1); let y = (let a=100; x+1); y`);
|
|
231
|
+
expect(actual).toEqual(3);
|
|
232
|
+
});
|
|
233
|
+
test('definitions go out of scope', () => {
|
|
234
|
+
expect(() => run(`let x = (let a = 1; a+1); a+100`)).toThrowError('Symbol a was not found');
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
describe('arrays', () => {
|
|
238
|
+
test('array literals are specified via the enclosing brackets notation ([])', () => {
|
|
239
|
+
expect(run(`["ab", 5]`)).toEqual(['ab', 5]);
|
|
240
|
+
expect(run(`[]`)).toEqual([]);
|
|
241
|
+
});
|
|
242
|
+
test('allow a dangling comma', () => {
|
|
243
|
+
expect(run(`[,]`)).toEqual([]);
|
|
244
|
+
expect(run(`[,,]`)).toEqual([]);
|
|
245
|
+
expect(run(`[246,]`)).toEqual([246]);
|
|
246
|
+
expect(run(`[246,531,]`)).toEqual([246, 531]);
|
|
247
|
+
});
|
|
248
|
+
test('individual elements of an array can be accessed via the [<index>] notation', () => {
|
|
249
|
+
expect(run(`let a = ['sun', 'mon', 'tue', 'wed']; a[1]`)).toEqual('mon');
|
|
250
|
+
});
|
|
251
|
+
test('the <index> value at the [<index>] notation can be a computed value', () => {
|
|
252
|
+
expect(run(`let a = ['sun', 'mon', 'tue', 'wed']; let f = fun(n) n-5; [a[3-1], a[18/6], a[f(5)]]`)).toEqual([
|
|
253
|
+
'tue',
|
|
254
|
+
'wed',
|
|
255
|
+
'sun',
|
|
256
|
+
]);
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
describe('objects', () => {
|
|
260
|
+
describe('literals', () => {
|
|
261
|
+
test('are specified via JSON format', () => {
|
|
262
|
+
expect(run(`{}`)).toEqual({});
|
|
263
|
+
expect(run(`{a: 1}`)).toEqual({ a: 1 });
|
|
264
|
+
expect(run(`{a: 1, b: 2}`)).toEqual({ a: 1, b: 2 });
|
|
265
|
+
expect(run(`{a: "A", b: "B", c: "CCC"}`)).toEqual({ a: 'A', b: 'B', c: 'CCC' });
|
|
266
|
+
});
|
|
267
|
+
test('allow a dangling comma', () => {
|
|
268
|
+
expect(run(`{a: 1,}`)).toEqual({ a: 1 });
|
|
269
|
+
expect(run(`{a: 1, b: 2,}`)).toEqual({ a: 1, b: 2 });
|
|
270
|
+
expect(run(`{a: "A", b: "B", c: "CCC",}`)).toEqual({ a: 'A', b: 'B', c: 'CCC' });
|
|
271
|
+
});
|
|
272
|
+
test('a dangling comma in an empty object is not allowed', () => {
|
|
273
|
+
expect(() => run(`{,}`)).toThrowError('Expected an identifier at (1:2..3) ,}');
|
|
274
|
+
});
|
|
275
|
+
test('supports computed attributes names via the [<expression>]: <value> notation', () => {
|
|
276
|
+
expect(run(`{["a" + 'b']: 'a-and-b'}`)).toEqual({ ab: 'a-and-b' });
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
describe('attributes', () => {
|
|
280
|
+
test('can be accessed via the .<ident> notation', () => {
|
|
281
|
+
expect(run(`let x = {a: 3, b: 4}; x.a`)).toEqual(3);
|
|
282
|
+
expect(run(`let x = {a: 3, b: 4}; x.a * x.b`)).toEqual(12);
|
|
283
|
+
expect(run(`let x = {a: 3, b: {x: {Jan: 1, Feb: 2, May: 5}, y: 300}}; [x.b.x.Jan, x.b.x.May, x.b.y]`)).toEqual([
|
|
284
|
+
1, 5, 300,
|
|
285
|
+
]);
|
|
286
|
+
expect(run(`let x = {a: 3, calendar: ["A"] }; x.calendar`)).toEqual(['A']);
|
|
287
|
+
expect(run(`let x = {a: 3, calendar: {months: { Jan: 1, Feb: 2, May: 5}, days: ["Mon", "Tue", "Wed" ] } }; [x.calendar.months, x.calendar.days]`)).toEqual([{ Jan: 1, Feb: 2, May: 5 }, ['Mon', 'Tue', 'Wed']]);
|
|
288
|
+
});
|
|
289
|
+
test('can be accessed via the [<name>] notation', () => {
|
|
290
|
+
expect(run(`let x = {a: 3, b: 4}; x['a']`)).toEqual(3);
|
|
291
|
+
expect(run(`let x = {a: 3, b: 4}; [x['a'], x["b"]]`)).toEqual([3, 4]);
|
|
292
|
+
expect(run(`let x = {a: 3, b: {x: {Jan: 1, Feb: 2, May: 5}, y: 300}}; x["b"]['x']["May"]`)).toEqual(5);
|
|
293
|
+
});
|
|
294
|
+
test('supports chains of attribute accesses mixing the .<ident> and the [<name>] notations', () => {
|
|
295
|
+
expect(run(`let o = {b: {x: {M: 5}}}; [o["b"].x["M"], o.b["x"].M, o.b.x["M"]]`)).toEqual([5, 5, 5]);
|
|
296
|
+
});
|
|
297
|
+
test('supports chains of calls to nested attributes which are lambda expressions', () => {
|
|
298
|
+
expect(run(`let o = {a: fun () { b: fun () { c: fun () { d: 'x' }}}}; o.a().b().c().d`)).toEqual('x');
|
|
299
|
+
expect(run(`let o = {a: fun () { b: { c: fun () { d: 'x' }}}}; o.a().b.c().d`)).toEqual('x');
|
|
300
|
+
});
|
|
301
|
+
test('the <name> value at the [<name>] notation can be a computed value', () => {
|
|
302
|
+
expect(run(`let q = fun (x) x + "eb"; let o = {Jan: 1, Feb: 2, May: 5}; [o["Ja" + 'n'], o[q('F')]]`)).toEqual([
|
|
303
|
+
1, 2,
|
|
304
|
+
]);
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
describe('spread operator in objects', () => {
|
|
309
|
+
test('shallow copies an object into an object literal', () => {
|
|
310
|
+
expect(run(`let o = {a: 1, b: 2}; {...o}`)).toEqual({ a: 1, b: 2 });
|
|
311
|
+
});
|
|
312
|
+
test('can be combined with hard-coded (literal) attributes', () => {
|
|
313
|
+
expect(run(`let o = {a: 1}; {...o, b: 2}`)).toEqual({ a: 1, b: 2 });
|
|
314
|
+
expect(run(`let o = {b: 2}; {...o, a: 1, ...o}`)).toEqual({ a: 1, b: 2 });
|
|
315
|
+
});
|
|
316
|
+
test('can be used multiple times inside a single object literal', () => {
|
|
317
|
+
expect(run(`let o1 = {b: 2}; let o2 = {c: 3}; {a: 1, ...o1, ...o2, d: 4}`)).toEqual({
|
|
318
|
+
a: 1,
|
|
319
|
+
b: 2,
|
|
320
|
+
c: 3,
|
|
321
|
+
d: 4,
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
test('overrides attributes to its left', () => {
|
|
325
|
+
expect(run(`let o = {b: 2}; {a: 100, b: 200, c: 300, ...o}`)).toEqual({ a: 100, b: 2, c: 300 });
|
|
326
|
+
});
|
|
327
|
+
test('overridden by attributes to its right', () => {
|
|
328
|
+
expect(run(`let o = {a: 1, b: 2, c: 3}; {...o, b: 200}`)).toEqual({ a: 1, b: 200, c: 3 });
|
|
329
|
+
});
|
|
330
|
+
test('can be mixed with computed attribute names', () => {
|
|
331
|
+
expect(run(`let o = {ab: 'anteater'}; {...o, ['c' + 'd']: 'cat'}`)).toEqual({ ab: 'anteater', cd: 'cat' });
|
|
332
|
+
});
|
|
333
|
+
test('errors if applied to a non-object value', () => {
|
|
334
|
+
expect(() => run(`let o = ['a']; {...o}`)).toThrowError(`value type error: expected obj but found ["a"]`);
|
|
335
|
+
expect(() => run(`let o = true; {...o}`)).toThrowError('value type error: expected obj but found true');
|
|
336
|
+
expect(() => run(`let o = 5; {...o}`)).toThrowError('value type error: expected obj but found 5');
|
|
337
|
+
expect(() => run(`let o = 'a'; {...o}`)).toThrowError('value type error: expected obj but found "a"');
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
describe('spread operator in arrays', () => {
|
|
341
|
+
test('shallow copies an array into an array literal', () => {
|
|
342
|
+
expect(run(`let a = ['x', 'y']; [...a]`)).toEqual(['x', 'y']);
|
|
343
|
+
});
|
|
344
|
+
test('can be mixed with array elements', () => {
|
|
345
|
+
expect(run(`let a = ['x', 'y']; ['p', ...a, 'q']`)).toEqual(['p', 'x', 'y', 'q']);
|
|
346
|
+
});
|
|
347
|
+
test('can be used multiple times inside an array literal', () => {
|
|
348
|
+
expect(run(`let a1 = ['x', 'y']; let a2 = ['z']; ['p', ...a1, 'q', ...a2, 'r']`)).toEqual([
|
|
349
|
+
'p',
|
|
350
|
+
'x',
|
|
351
|
+
'y',
|
|
352
|
+
'q',
|
|
353
|
+
'z',
|
|
354
|
+
'r',
|
|
355
|
+
]);
|
|
356
|
+
});
|
|
357
|
+
test('errors if applied to a non-array value', () => {
|
|
358
|
+
expect(() => run(`let a = true; [...a]`)).toThrowError('value type error: expected arr but found true');
|
|
359
|
+
expect(() => run(`let a = 5; [...a]`)).toThrowError('value type error: expected arr but found 5');
|
|
360
|
+
expect(() => run(`let a = {x: 1}; [...a]`)).toThrowError(`value type error: expected arr but found {"x":1}`);
|
|
361
|
+
expect(() => run(`let a = 'a'; [...a]`)).toThrowError('value type error: expected arr but found "a"');
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
describe('if', () => {
|
|
365
|
+
test('returns the value of the first branch if the condition is true', () => {
|
|
366
|
+
expect(run(`if (4 > 3) 200 else -100`)).toEqual(200);
|
|
367
|
+
});
|
|
368
|
+
test('evaluates the first branch only if the condition is true', () => {
|
|
369
|
+
expect(() => run(`if (true) x else -100`)).toThrowError('Symbol x was not found');
|
|
370
|
+
expect(run(`if (false) x else -100`)).toEqual(-100);
|
|
371
|
+
});
|
|
372
|
+
test('returns the value of the second branch if the condition is false', () => {
|
|
373
|
+
expect(run(`if (4 < 3) 200 else -100`)).toEqual(-100);
|
|
374
|
+
});
|
|
375
|
+
test('evaluates the second branch only if the condition is false', () => {
|
|
376
|
+
expect(() => run(`if (false) 200 else x`)).toThrowError('Symbol x was not found');
|
|
377
|
+
expect(run(`if (true) 200 else x`)).toEqual(200);
|
|
378
|
+
});
|
|
379
|
+
test('yells if conditions is not boolean', () => {
|
|
380
|
+
expect(() => run(`if (5+8) 200 else -100`)).toThrowError('value type error: expected bool but found 13');
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
describe('ternary', () => {
|
|
384
|
+
test('returns the value of the first branch if the condition is true', () => {
|
|
385
|
+
expect(run(`(4 > 3) ? 200 : -100`)).toEqual(200);
|
|
386
|
+
});
|
|
387
|
+
test('evaluates the first branch only if the condition is true', () => {
|
|
388
|
+
expect(() => run(`true ? x : -100`)).toThrowError('Symbol x was not found');
|
|
389
|
+
expect(run(`false ? x : -100`)).toEqual(-100);
|
|
390
|
+
});
|
|
391
|
+
test('returns the value of the second branch if the condition is false', () => {
|
|
392
|
+
expect(run(`(4 < 3) ? 200 : -100`)).toEqual(-100);
|
|
393
|
+
});
|
|
394
|
+
test('evaluates the second branch only if the condition is false', () => {
|
|
395
|
+
expect(() => run(`false ? 200 : x`)).toThrowError('Symbol x was not found');
|
|
396
|
+
expect(run(`true ? 200 : x`)).toEqual(200);
|
|
397
|
+
});
|
|
398
|
+
test('yells if conditions is not boolean', () => {
|
|
399
|
+
expect(() => run(`5+8 ? 200 : -100`)).toThrowError('value type error: expected bool but found 13');
|
|
400
|
+
});
|
|
401
|
+
test('higher precendence than lambda', () => {
|
|
402
|
+
expect(run(`let f = (a,b) => a > b ? 'ABOVE' : 'BELOW'; f(1,2) + '_' + f(2,1)`)).toEqual('BELOW_ABOVE');
|
|
403
|
+
});
|
|
404
|
+
test('higher precendence than if', () => {
|
|
405
|
+
expect(run(`if (5 < 2) "Y" else 3+4>8? 'ABOVE' : 'BELOW'`)).toEqual('BELOW');
|
|
406
|
+
});
|
|
407
|
+
test('can span multiple lines', () => {
|
|
408
|
+
expect(run(`3 + 4 > 6\n? 'ABOVE'\n: 'BELOW'`)).toEqual('ABOVE');
|
|
409
|
+
expect(run(`3 + 4 > 8\n? 'ABOVE'\n: 'BELOW'`)).toEqual('BELOW');
|
|
410
|
+
expect(run(`3 + 4 > 6?\n 'ABOVE':\n 'BELOW'`)).toEqual('ABOVE');
|
|
411
|
+
expect(run(`3 + 4 > 8?\n 'ABOVE':\n 'BELOW'`)).toEqual('BELOW');
|
|
412
|
+
});
|
|
413
|
+
});
|
|
414
|
+
describe('lambda expressions', () => {
|
|
415
|
+
test('binds the value of the actual arg to the formal arg', () => {
|
|
416
|
+
expect(run(`(fun(a) 2*a)(3)`)).toEqual(6);
|
|
417
|
+
expect(run(`(fun(a, b) a*a-b*b)(3,4)`)).toEqual(-7);
|
|
418
|
+
expect(run(`(fun(a, b) a*a-b*b)(4,3)`)).toEqual(7);
|
|
419
|
+
});
|
|
420
|
+
test('can be stored in a variable', () => {
|
|
421
|
+
expect(run(`let triple = (fun(a) 3*a); triple(100) - triple(90)`)).toEqual(30);
|
|
422
|
+
expect(run(`let triple = fun(a) 3*a; triple(100) - triple(90)`)).toEqual(30);
|
|
423
|
+
});
|
|
424
|
+
test('allows a dangling comma, at the call site, after the last actual argument', () => {
|
|
425
|
+
expect(run(`let triple = (fun(a) 3*a); triple(100,)`)).toEqual(300);
|
|
426
|
+
expect(run(`let mean = (fun(a,b) (a+b)/2); mean(4, 28,)`)).toEqual(16);
|
|
427
|
+
});
|
|
428
|
+
describe('arrow function notation', () => {
|
|
429
|
+
test('a single formal argument does not need to be surrounded with parenthesis', () => {
|
|
430
|
+
expect(run(`let triple = a => 3*a; triple(100)`)).toEqual(300);
|
|
431
|
+
});
|
|
432
|
+
test('(a) => <expression>', () => {
|
|
433
|
+
expect(run(`let triple = (a) => 3*a; triple(100)`)).toEqual(300);
|
|
434
|
+
});
|
|
435
|
+
test('() => <expression>', () => {
|
|
436
|
+
expect(run(`let five = () => 5; five()`)).toEqual(5);
|
|
437
|
+
});
|
|
438
|
+
test('(a,b) => <expression>', () => {
|
|
439
|
+
expect(run(`let conc = (a,b) => a+b; conc('al', 'pha')`)).toEqual('alpha');
|
|
440
|
+
expect(run(`let conc = (a,b,c,d,e,f) => a+b+c+d+e+f; conc('M', 'o', 'n', 'd', 'a', 'y')`)).toEqual('Monday');
|
|
441
|
+
});
|
|
442
|
+
test('body of an arrow function can be { return <expression>}', () => {
|
|
443
|
+
expect(run(`let triple = a => { return 3*a }; triple(100)`)).toEqual(300);
|
|
444
|
+
expect(run(`let triple = (a) => { return 3*a }; triple(100)`)).toEqual(300);
|
|
445
|
+
expect(run(`let five = () => { return 5 }; five()`)).toEqual(5);
|
|
446
|
+
expect(run(`let concat = (a,b) => { return a+b }; concat('al', 'pha')`)).toEqual('alpha');
|
|
447
|
+
});
|
|
448
|
+
test('body of an arrow function can include let definitions', () => {
|
|
449
|
+
expect(run(`let triple = a => { let factor = 3; return factor*a }; triple(100)`)).toEqual(300);
|
|
450
|
+
expect(run(`let triple = (a) => { let factor = 3; return 3*a }; triple(100)`)).toEqual(300);
|
|
451
|
+
expect(run(`let five = () => { let two = 2; let three = 3; return three+two }; five()`)).toEqual(5);
|
|
452
|
+
expect(run(`let concat = (a,b) => { let u = '_'; return u+a+b+u }; concat('a', 'b')`)).toEqual('_ab_');
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
test('can have no args', () => {
|
|
456
|
+
expect(run(`let pi = fun() 3.14; 2*pi()`)).toEqual(6.28);
|
|
457
|
+
expect(run(`(fun() 3.14)()*2`)).toEqual(6.28);
|
|
458
|
+
});
|
|
459
|
+
test('errors on arg list mismatch', () => {
|
|
460
|
+
expect(() => run(`let quadSum = fun(a,b,c,d) a+b+c+d; quadSum(4,8,2)`)).toThrowError('Arg list length mismatch: expected 4 but got 3');
|
|
461
|
+
expect(run(`let quadSum = fun(a,b,c,d) a+b+c+d; quadSum(4,8,2,6)`)).toEqual(20);
|
|
462
|
+
});
|
|
463
|
+
test('can be recursive', () => {
|
|
464
|
+
expect(run(`let factorial = fun(n) if (n > 0) n*factorial(n-1) else 1; factorial(6)`)).toEqual(720);
|
|
465
|
+
expect(run(`let gcd = fun(a, b) if (b == 0) a else gcd(b, a % b); [gcd(24, 60), gcd(1071, 462)]`)).toEqual([
|
|
466
|
+
12, 21,
|
|
467
|
+
]);
|
|
468
|
+
});
|
|
469
|
+
test('can access definitions from the enclosing scope', () => {
|
|
470
|
+
expect(run(`let a = 1; (let inc = fun(n) n+a; inc(2))`)).toEqual(3);
|
|
471
|
+
expect(run(`let by2 = fun(x) x*2; (let by10 = (let by5 = fun(x) x*5; fun(x) by2(by5(x))); by10(20))`)).toEqual(200);
|
|
472
|
+
});
|
|
473
|
+
test('expression trace on error', () => {
|
|
474
|
+
const expected = [
|
|
475
|
+
' at (1:1..88) let d = fun(x1) x2; let c = fun(x) d(x); let b = fun (x) c(x); let a = fun(x) b(...',
|
|
476
|
+
' at (1:85..88) a(5)',
|
|
477
|
+
' at (1:79..82) b(x)',
|
|
478
|
+
' at (1:58..61) c(x)',
|
|
479
|
+
' at (1:36..39) d(x)',
|
|
480
|
+
' at (1:17..18) x2',
|
|
481
|
+
].join('\n');
|
|
482
|
+
expect(() => run(`let d = fun(x1) x2; let c = fun(x) d(x); let b = fun (x) c(x); let a = fun(x) b(x); a(5)`)).toThrowError(expected);
|
|
483
|
+
});
|
|
484
|
+
test('only lexical scope is considered when looking up a definition', () => {
|
|
485
|
+
expect(run(`let a = 1; let inc = fun(n) n+a; (let a = 100; inc(2))`)).toEqual(3);
|
|
486
|
+
});
|
|
487
|
+
test('can return another lambda expression (a-la currying)', () => {
|
|
488
|
+
expect(run(`let sum = fun(a) fun(b,c) a+b+c; sum(1)(600,20)`)).toEqual(621);
|
|
489
|
+
expect(run(`let sum = fun(a) fun(b) fun(c) a+b+c; sum(1)(600)(20)`)).toEqual(621);
|
|
490
|
+
expect(run(`let sum = fun(a) fun(b,c) a+b+c; let plusOne = sum(1); plusOne(600,20)`)).toEqual(621);
|
|
491
|
+
expect(run(`let sum = fun(a) fun(b) fun(c) a+b+c; let plusOne = sum(1); plusOne(600)(20)`)).toEqual(621);
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
describe('sink', () => {
|
|
495
|
+
test('specified via the "sink" literal', () => {
|
|
496
|
+
expect(run(`sink`)).toEqual(undefined);
|
|
497
|
+
});
|
|
498
|
+
test('access to non-existing attribute of an object evalutes to a sink', () => {
|
|
499
|
+
expect(run(`{a: 1}.b`)).toEqual(undefined);
|
|
500
|
+
expect(runSink(`6\n+ 7\n+ 8\n+ 9 + 10 + 11 + {a: 9000}.b`).where).toEqual({
|
|
501
|
+
from: { offset: 26 },
|
|
502
|
+
to: { offset: 36 },
|
|
503
|
+
});
|
|
504
|
+
});
|
|
505
|
+
test('an expression involving a sink evaluates to sink', () => {
|
|
506
|
+
expect(run(`5+8+9+sink+20+30`)).toEqual(undefined);
|
|
507
|
+
expect(run(`let x = sink; 5+8+9+x+20+30`)).toEqual(undefined);
|
|
508
|
+
expect(run(`let f = fun (a) if (a > 0) a else sink; 2+f(-1)+4`)).toEqual(undefined);
|
|
509
|
+
expect(run(`let f = fun (a) if (a > 0) a else sink; 2+f(3)+4`)).toEqual(9);
|
|
510
|
+
});
|
|
511
|
+
test('the "undefined" literal is an alias for "sink"', () => {
|
|
512
|
+
expect(run(`let x = sink; 5+8+9+x+20+30`)).toEqual(undefined);
|
|
513
|
+
});
|
|
514
|
+
test('an array can hold a sink without becoming a sink itself', () => {
|
|
515
|
+
expect(run(`let f = fun (a) if (a > 0) a else sink; [f(1), f(-1), f(8)]`)).toEqual([1, undefined, 8]);
|
|
516
|
+
});
|
|
517
|
+
test('an object can hold a sink without becoming a sink itself', () => {
|
|
518
|
+
expect(run(`{a: 5, b: sink, c: 20}`)).toEqual({ a: 5, b: undefined, c: 20 });
|
|
519
|
+
});
|
|
520
|
+
test('an if() expression an have a sink positive/negative branch without becoming a sink itself', () => {
|
|
521
|
+
expect(run(`if (true) 5 else sink`)).toEqual(5);
|
|
522
|
+
expect(run(`if (false) sink else 5`)).toEqual(5);
|
|
523
|
+
});
|
|
524
|
+
test('an if() expression becomes a sink itself if the branch dictated by the condition evaluates to sink', () => {
|
|
525
|
+
expect(run(`if (false) 5 else sink`)).toEqual(undefined);
|
|
526
|
+
expect(run(`if (true) sink else 5`)).toEqual(undefined);
|
|
527
|
+
});
|
|
528
|
+
test('an if() expression becomes a sink itself if the the condition expression evaluates to sink', () => {
|
|
529
|
+
expect(run(`if (sink) 5 else 7`)).toEqual(undefined);
|
|
530
|
+
});
|
|
531
|
+
test('an && expression with sinks', () => {
|
|
532
|
+
expect(run(`sink && false`)).toEqual(undefined);
|
|
533
|
+
expect(run(`sink && true`)).toEqual(undefined);
|
|
534
|
+
expect(run(`false && sink`)).toEqual(false);
|
|
535
|
+
expect(run(`true && sink`)).toEqual(undefined);
|
|
536
|
+
});
|
|
537
|
+
test('an || expression with sinks', () => {
|
|
538
|
+
expect(run(`sink || false`)).toEqual(undefined);
|
|
539
|
+
expect(run(`sink || true`)).toEqual(undefined);
|
|
540
|
+
expect(run(`false || sink`)).toEqual(undefined);
|
|
541
|
+
expect(run(`true || sink`)).toEqual(true);
|
|
542
|
+
});
|
|
543
|
+
test('access to an attribute of a sink evaluates to sink', () => {
|
|
544
|
+
expect(run(`sink.x`)).toEqual(undefined);
|
|
545
|
+
});
|
|
546
|
+
test('calling a sink evaluates to sink', () => {
|
|
547
|
+
expect(run(`sink()`)).toEqual(undefined);
|
|
548
|
+
});
|
|
549
|
+
test('a sink compared with itself evaluates to true', () => {
|
|
550
|
+
expect(run(`sink == sink`)).toEqual(true);
|
|
551
|
+
expect(run(`sink != sink`)).toEqual(false);
|
|
552
|
+
});
|
|
553
|
+
test('a sink compared with other types evaluates to false', () => {
|
|
554
|
+
expect(run(`sink == []`)).toEqual(false);
|
|
555
|
+
expect(run(`sink == false`)).toEqual(false);
|
|
556
|
+
expect(run(`sink == true`)).toEqual(false);
|
|
557
|
+
expect(run(`sink == (fun () sink)`)).toEqual(false);
|
|
558
|
+
expect(run(`sink == 0`)).toEqual(false);
|
|
559
|
+
expect(run(`sink == 5`)).toEqual(false);
|
|
560
|
+
expect(run(`sink == {}`)).toEqual(false);
|
|
561
|
+
expect(run(`sink == ''`)).toEqual(false);
|
|
562
|
+
expect(run(`sink == 'x'`)).toEqual(false);
|
|
563
|
+
});
|
|
564
|
+
test('errors when a sink is ordered with other types', () => {
|
|
565
|
+
expect(() => run(`sink < []`)).toThrowError('Cannot compare a sink value with a value of another type');
|
|
566
|
+
expect(() => run(`sink < false`)).toThrowError('Cannot compare a sink value with a value of another type');
|
|
567
|
+
expect(() => run(`sink < true`)).toThrowError('Cannot compare a sink value with a value of another type');
|
|
568
|
+
expect(() => run(`sink < (fun () sink)`)).toThrowError('Cannot compare a sink value with a value of another type');
|
|
569
|
+
expect(() => run(`sink < 0`)).toThrowError('Cannot compare a sink value with a value of another type');
|
|
570
|
+
expect(() => run(`sink < 5`)).toThrowError('Cannot compare a sink value with a value of another type');
|
|
571
|
+
expect(() => run(`sink < {}`)).toThrowError('Cannot compare a sink value with a value of another type');
|
|
572
|
+
expect(() => run(`sink < ''`)).toThrowError('Cannot compare a sink value with a value of another type');
|
|
573
|
+
expect(() => run(`sink < 'x'`)).toThrowError('Cannot compare a sink value with a value of another type');
|
|
574
|
+
});
|
|
575
|
+
test(`the ?? operator evaluates to its right-hand-side if its left-hand-side is a sink`, () => {
|
|
576
|
+
expect(run(`sink ?? 1`)).toEqual(1);
|
|
577
|
+
});
|
|
578
|
+
test(`the ?? operator evaluates to its left-hand-side if it is a non-sink`, () => {
|
|
579
|
+
expect(run(`0 ?? 1`)).toEqual(0);
|
|
580
|
+
});
|
|
581
|
+
test(`the .where attribure of the result holds the source code of the sink`, () => {
|
|
582
|
+
expect(runSink(`1000 + 2000 + 3000 + sink + 5000 + sink`).where).toEqual({
|
|
583
|
+
from: { offset: 21 },
|
|
584
|
+
to: { offset: 24 },
|
|
585
|
+
});
|
|
586
|
+
expect(runSink(`1000 + 2000 + 3000 + 4000 + 5000 + sink`).where).toEqual({
|
|
587
|
+
from: { offset: 35 },
|
|
588
|
+
to: { offset: 38 },
|
|
589
|
+
});
|
|
590
|
+
expect(runSink(`1000\n + 2000\n + sink\n + 4000\n + 5000\n + sink`).where).toEqual({
|
|
591
|
+
from: { offset: 16 },
|
|
592
|
+
to: { offset: 19 },
|
|
593
|
+
});
|
|
594
|
+
});
|
|
595
|
+
test(`the .message attribure of the result provides a human readable summary`, () => {
|
|
596
|
+
expect(runSink(`1000 + 2000\n+ 3000 + sink + 5000 + 6000`).message).toEqual('Evaluated to sink: at (2:10..13) sink');
|
|
597
|
+
});
|
|
598
|
+
});
|
|
599
|
+
describe('sink!', () => {
|
|
600
|
+
test(`captures the expression trace at runtime`, () => {
|
|
601
|
+
expect(runSink(`1000 + 2000 + 3000 + sink!`).trace).toEqual([
|
|
602
|
+
` at (1:1..26) 1000 + 2000 + 3000 + sink!`,
|
|
603
|
+
` at (1:1..26) 1000 + 2000 + 3000 + sink!`,
|
|
604
|
+
` at (1:8..26) 2000 + 3000 + sink!`,
|
|
605
|
+
` at (1:15..26) 3000 + sink!`,
|
|
606
|
+
` at (1:22..26) sink!`,
|
|
607
|
+
].join('\n'));
|
|
608
|
+
});
|
|
609
|
+
test(`can also appear in code as undefined!`, () => {
|
|
610
|
+
expect(runSink(`1000 + undefined!`).trace).toEqual([` at (1:1..17) 1000 + undefined!`, ` at (1:1..17) 1000 + undefined!`, ` at (1:8..17) undefined!`].join('\n'));
|
|
611
|
+
});
|
|
612
|
+
});
|
|
613
|
+
describe('sink!!', () => {
|
|
614
|
+
test(`captures the expression trace and the symbol-table at runtime`, () => {
|
|
615
|
+
const actual = runSink(`let a = 2; let f = fun(x, y) x * y * sink!! * a; f(30, 40)`);
|
|
616
|
+
expect(actual.symbols).toMatchObject({
|
|
617
|
+
f: 'fun (x, y) (x * (y * (sink!! * a)))',
|
|
618
|
+
a: 2,
|
|
619
|
+
x: 30,
|
|
620
|
+
y: 40,
|
|
621
|
+
});
|
|
622
|
+
expect(Object.keys(actual.symbols ?? {})).toEqual(['Object', 'args', 'a', 'f', 'x', 'y']);
|
|
623
|
+
expect(actual.trace).toEqual([
|
|
624
|
+
` at (1:1..58) let a = 2; let f = fun(x, y) x * y * sink!! * a; f(30, 40)`,
|
|
625
|
+
` at (1:1..58) let a = 2; let f = fun(x, y) x * y * sink!! * a; f(30, 40)`,
|
|
626
|
+
` at (1:50..58) f(30, 40)`,
|
|
627
|
+
` at (1:30..47) x * y * sink!! * a`,
|
|
628
|
+
` at (1:34..47) y * sink!! * a`,
|
|
629
|
+
` at (1:38..47) sink!! * a`,
|
|
630
|
+
` at (1:38..43) sink!!`,
|
|
631
|
+
].join('\n'));
|
|
632
|
+
});
|
|
633
|
+
test('can be used to recover values of definitions from a crash site', () => {
|
|
634
|
+
expect(runSink(`let f = fun (n) if (n >= 0) f(n-7) else (sink!! && [n].goo()); f(18)`).symbols).toMatchObject({
|
|
635
|
+
n: -3,
|
|
636
|
+
});
|
|
637
|
+
});
|
|
638
|
+
test(`can also appear in code as undefined!!`, () => {
|
|
639
|
+
expect(runSink(`let f = fun (n) undefined!!; f(18)`).symbols).toMatchObject({
|
|
640
|
+
n: 18,
|
|
641
|
+
});
|
|
642
|
+
});
|
|
643
|
+
});
|
|
644
|
+
describe('array methods', () => {
|
|
645
|
+
test('concat', () => {
|
|
646
|
+
expect(run(`['foo', 'bar', 'goo'].concat(['zoo', 'poo'])`)).toEqual(['foo', 'bar', 'goo', 'zoo', 'poo']);
|
|
647
|
+
});
|
|
648
|
+
test('every', () => {
|
|
649
|
+
expect(run(`["", 'x', 'xx'].every(fun (item, i) item.length == i)`)).toEqual(true);
|
|
650
|
+
expect(run(`["", 'yy', 'zz'].every(fun (item, i) item.length == i)`)).toEqual(false);
|
|
651
|
+
expect(run(`let cb = fun (item, i, a) item == a[(a.length - i) - 1]; [[2, 7, 2].every(cb), [2, 7, 7].every(cb)]`)).toEqual([true, false]);
|
|
652
|
+
});
|
|
653
|
+
test('filter', () => {
|
|
654
|
+
expect(run(`['foo', 'bar', 'goo'].filter(fun (item) item.endsWith('oo'))`)).toEqual(['foo', 'goo']);
|
|
655
|
+
expect(run(`['a', 'b', 'c', 'd'].filter(fun (item, i) i % 2 == 1)`)).toEqual(['b', 'd']);
|
|
656
|
+
expect(run(`[8, 8, 2, 2, 2, 7].filter(fun (x, i, a) x == a[(i + 1) % a.length])`)).toEqual([8, 2, 2]);
|
|
657
|
+
});
|
|
658
|
+
test('find', () => {
|
|
659
|
+
expect(run(`[10, 20, 30, 40].find(fun (item, i) item + i == 21)`)).toEqual(20);
|
|
660
|
+
expect(run(`[8, 3, 7, 7, 6, 9].find(fun (x, i, a) x == a[a.length - (i+1)])`)).toEqual(7);
|
|
661
|
+
});
|
|
662
|
+
test('find returns sink if no matching element exists', () => {
|
|
663
|
+
expect(run(`[3, 5, 7, 9].find(fun (x) x % 2 == 0)`)).toEqual(undefined);
|
|
664
|
+
expect(run(`[].find(fun () true)`)).toEqual(undefined);
|
|
665
|
+
});
|
|
666
|
+
test('findIndex', () => {
|
|
667
|
+
expect(run(`[10, 20, 30, 40].findIndex(fun (item, i) item + i == 32)`)).toEqual(2);
|
|
668
|
+
expect(run(`[8, 3, 7, 7, 6, 9].findIndex(fun (x, i, a) x == a[a.length - (i+1)])`)).toEqual(2);
|
|
669
|
+
});
|
|
670
|
+
test('findIndex returns -1 if no matching element exists', () => {
|
|
671
|
+
expect(run(`[3, 5, 7, 9].findIndex(fun (x) x % 2 == 0)`)).toEqual(-1);
|
|
672
|
+
expect(run(`[].findIndex(fun () true)`)).toEqual(-1);
|
|
673
|
+
});
|
|
674
|
+
test('flatMap', () => {
|
|
675
|
+
expect(run(`['Columbia', 'Eagle'].flatMap(fun (x) [x, x.length])`)).toEqual(['Columbia', 8, 'Eagle', 5]);
|
|
676
|
+
expect(run(`[6,7,9].flatMap(fun (x,i) if (i % 2 == 0) [x, x/3] else [])`)).toEqual([6, 2, 9, 3]);
|
|
677
|
+
expect(run(`[2,1,6,5,9,8].flatMap(fun (x,i,a) if (i % 2 == 1) [x, a[i-1]] else [])`)).toEqual([1, 2, 5, 6, 8, 9]);
|
|
678
|
+
});
|
|
679
|
+
test('map', () => {
|
|
680
|
+
expect(run(`['foo', 'bar', 'goo'].map(fun (s) s.charAt(0))`)).toEqual(['f', 'b', 'g']);
|
|
681
|
+
expect(run(`['a', 'b'].map(fun (item, i) item + ':' + i)`)).toEqual(['a:0', 'b:1']);
|
|
682
|
+
expect(run(`['a', 'b', 'p', 'q'].map(fun (x, i, a) x + a[a.length - (i+1)])`)).toEqual(['aq', 'bp', 'pb', 'qa']);
|
|
683
|
+
});
|
|
684
|
+
test('reduce', () => {
|
|
685
|
+
expect(run(`['a','b','c','d'].reduce(fun (w, x) w+x, '')`)).toEqual('abcd');
|
|
686
|
+
expect(run(`['a','b','c','d','e'].reduce(fun (w, x, i) if (i % 2 == 0) w+x else w, '')`)).toEqual('ace');
|
|
687
|
+
expect(run(`[['w',2], ['x',0], ['y',1]].reduce(fun (w, x, i, a) w+a[x[1]][0], '')`)).toEqual('ywx');
|
|
688
|
+
});
|
|
689
|
+
test('reduceRight', () => {
|
|
690
|
+
expect(run(`['a','b','c','d'].reduceRight(fun (w, x) w+x, '')`)).toEqual('dcba');
|
|
691
|
+
expect(run(`['a','b','c','d','e'].reduceRight(fun (w, x, i) if (i % 2 == 0) w+x else w, '')`)).toEqual('eca');
|
|
692
|
+
expect(run(`[['w',2], ['x',0], ['y',1]].reduceRight(fun (w, x, i, a) w+a[x[1]][0], '')`)).toEqual('xwy');
|
|
693
|
+
});
|
|
694
|
+
test('some', () => {
|
|
695
|
+
expect(run(`['foo', 'bar', 'goo'].some(fun (item) item.endsWith('oo'))`)).toEqual(true);
|
|
696
|
+
expect(run(`['foo', 'bar', 'goo'].some(fun (item) item.endsWith('pp'))`)).toEqual(false);
|
|
697
|
+
expect(run(`['a', 'xyz', 'bc'].some(fun (item, i) i == item.length)`)).toEqual(true);
|
|
698
|
+
expect(run(`[8, 3, 7, 7, 6, 9].some(fun (x, i, a) x == a[a.length - (i+1)])`)).toEqual(true);
|
|
699
|
+
});
|
|
700
|
+
});
|
|
701
|
+
describe('Object.keys()', () => {
|
|
702
|
+
test('returns names of all attributes of the given object', () => {
|
|
703
|
+
expect(run(`Object.keys({a: 1, b: 2, w: 30})`)).toEqual(['a', 'b', 'w']);
|
|
704
|
+
// expect(run(`Object.entries({a: 1, b: 2, w: 30})`)).toEqual([['a', 1], ['b', 2], ['w', 30]])
|
|
705
|
+
});
|
|
706
|
+
test('fails if applied to a non-object value', () => {
|
|
707
|
+
expect(() => run(`Object.keys('a')`)).toThrowError('value type error: expected obj but found "a"');
|
|
708
|
+
expect(() => run(`Object.keys(5)`)).toThrowError('value type error: expected obj but found 5');
|
|
709
|
+
expect(() => run(`Object.keys(false)`)).toThrowError('value type error: expected obj but found false');
|
|
710
|
+
expect(() => run(`Object.keys(['a'])`)).toThrowError('value type error: expected obj but found ["a"]');
|
|
711
|
+
expect(() => run(`Object.keys(fun () 5)`)).toThrowError('value type error: expected obj but found "fun () 5"');
|
|
712
|
+
});
|
|
713
|
+
});
|
|
714
|
+
describe('Object.entries()', () => {
|
|
715
|
+
test('returns a [key, value] pair for each attribute of the given object', () => {
|
|
716
|
+
expect(run(`Object.entries({a: 1, b: 2, w: 30})`)).toEqual([
|
|
717
|
+
['a', 1],
|
|
718
|
+
['b', 2],
|
|
719
|
+
['w', 30],
|
|
720
|
+
]);
|
|
721
|
+
});
|
|
722
|
+
test('fails if applied to a non-object value', () => {
|
|
723
|
+
expect(() => run(`Object.entries('a')`)).toThrowError('type error: expected obj but found "a"');
|
|
724
|
+
expect(() => run(`Object.entries(5)`)).toThrowError('type error: expected obj but found 5');
|
|
725
|
+
expect(() => run(`Object.entries(false)`)).toThrowError('type error: expected obj but found false');
|
|
726
|
+
expect(() => run(`Object.entries(['a'])`)).toThrowError('type error: expected obj but found ["a"]');
|
|
727
|
+
expect(() => run(`Object.entries(fun () 5)`)).toThrowError('type error: expected obj but found "fun () 5"');
|
|
728
|
+
});
|
|
729
|
+
});
|
|
730
|
+
describe('Object.fromEntries()', () => {
|
|
731
|
+
test('constructs an object from a list of [key, value] pairs describing its attributes', () => {
|
|
732
|
+
expect(run(`Object.fromEntries([['a', 1], ['b', 2], ['w', 30], ['y', 'yoo'], ['z', true]])`)).toEqual({
|
|
733
|
+
a: 1,
|
|
734
|
+
b: 2,
|
|
735
|
+
w: 30,
|
|
736
|
+
y: 'yoo',
|
|
737
|
+
z: true,
|
|
738
|
+
});
|
|
739
|
+
});
|
|
740
|
+
test('fails if applied to a non-array value', () => {
|
|
741
|
+
expect(() => run(`Object.fromEntries('a')`)).toThrowError('type error: expected arr but found "a"');
|
|
742
|
+
expect(() => run(`Object.fromEntries(5)`)).toThrowError('type error: expected arr but found 5');
|
|
743
|
+
expect(() => run(`Object.fromEntries(false)`)).toThrowError('type error: expected arr but found false');
|
|
744
|
+
expect(() => run(`Object.fromEntries({x: 1})`)).toThrowError('type error: expected arr but found {"x":1}');
|
|
745
|
+
expect(() => run(`Object.fromEntries(fun () 5)`)).toThrowError('type error: expected arr but found "fun () 5"');
|
|
746
|
+
});
|
|
747
|
+
test('the input array must be an array of pairs', () => {
|
|
748
|
+
expect(() => run(`Object.fromEntries([['a', 1], ['b']])`)).toThrowError('each entry must be a [key, value] pair');
|
|
749
|
+
});
|
|
750
|
+
test('the first element in each pair must be a string', () => {
|
|
751
|
+
expect(() => run(`Object.fromEntries([[1, 'a']])`)).toThrowError('value type error: expected str but found 1');
|
|
752
|
+
});
|
|
753
|
+
});
|
|
754
|
+
describe('comments', () => {
|
|
755
|
+
test(`anything from '//' up to the end-of-line is ignored`, () => {
|
|
756
|
+
expect(run(`
|
|
757
|
+
1 + 20 + // 300
|
|
758
|
+
4000`)).toEqual(4021);
|
|
759
|
+
});
|
|
760
|
+
test(`allow consecutive lines which are all commented out`, () => {
|
|
761
|
+
expect(run(`
|
|
762
|
+
1 +
|
|
763
|
+
// 20 +
|
|
764
|
+
// 300 +
|
|
765
|
+
// 4000 +
|
|
766
|
+
50000`)).toEqual(50001);
|
|
767
|
+
});
|
|
768
|
+
test(`a comment inside a comment has no effect`, () => {
|
|
769
|
+
expect(run(`
|
|
770
|
+
1 +
|
|
771
|
+
// 20 + // 300 +
|
|
772
|
+
4000`)).toEqual(4001);
|
|
773
|
+
});
|
|
774
|
+
});
|
|
775
|
+
describe('evaluation stack', () => {
|
|
776
|
+
test('max recursion depth', () => {
|
|
777
|
+
expect(run(`let count = fun (n) if (n <= 0) 0 else 1 + count(n-1); count(330)`)).toEqual(330);
|
|
778
|
+
});
|
|
779
|
+
});
|
|
780
|
+
describe('preimport', () => {
|
|
781
|
+
test('definitions from a preimported file can be used', () => {
|
|
782
|
+
const septima = new septima_1.Septima();
|
|
783
|
+
const input = `libA.plus10(4) + libA.plus20(2)`;
|
|
784
|
+
const preimports = {
|
|
785
|
+
libA: `{ plus10: fun (n) n+10, plus20: fun (n) n+20}`,
|
|
786
|
+
};
|
|
787
|
+
expect(septima.compute(input, preimports, 'quiet', {})).toMatchObject({ value: 36 });
|
|
788
|
+
});
|
|
789
|
+
test('supports multiple preimports', () => {
|
|
790
|
+
const septima = new septima_1.Septima();
|
|
791
|
+
const input = `a.calc(4) + b.calc(1)`;
|
|
792
|
+
const preimports = {
|
|
793
|
+
a: `{ calc: fun (n) n+10 }`,
|
|
794
|
+
b: `{ calc: fun (n) n+20 }`,
|
|
795
|
+
};
|
|
796
|
+
expect(septima.compute(input, preimports, 'quiet', {})).toMatchObject({ value: 35 });
|
|
797
|
+
});
|
|
798
|
+
});
|
|
799
|
+
describe('args', () => {
|
|
800
|
+
test('are bounded at runtime to a special variable called "args"', () => {
|
|
801
|
+
const septima = new septima_1.Septima();
|
|
802
|
+
expect(septima.compute(`args.a + '_' + args.color[0] + '_' + args.b + '_' + args.color[1]`, {}, 'quiet', {
|
|
803
|
+
a: 'Sunday',
|
|
804
|
+
b: 'Monday',
|
|
805
|
+
color: ['Red', 'Green'],
|
|
806
|
+
})).toMatchObject({ value: 'Sunday_Red_Monday_Green' });
|
|
807
|
+
});
|
|
808
|
+
test('are shadowed by a program-defined "args" symbol', () => {
|
|
809
|
+
const septima = new septima_1.Septima();
|
|
810
|
+
expect(septima.compute(`let args = {color: 'Green' }; args.color`, {}, 'quiet', {
|
|
811
|
+
color: 'Red',
|
|
812
|
+
})).toMatchObject({ value: 'Green' });
|
|
813
|
+
});
|
|
814
|
+
test('are supported also via the Septima.run() API', () => {
|
|
815
|
+
expect(septima_1.Septima.run(`args.a + args.b`, undefined, { a: 100, b: 2 })).toEqual(102);
|
|
816
|
+
});
|
|
817
|
+
});
|
|
818
|
+
describe('export', () => {
|
|
819
|
+
test('a top level definition can have the "export" qualifier', () => {
|
|
820
|
+
expect(run(`export let x = 5; x+3`)).toEqual(8);
|
|
821
|
+
});
|
|
822
|
+
test('allows multiple exported definitions', () => {
|
|
823
|
+
expect(run(`export let x = 5; export let twice = n => n*2; export let a = r => r*r*3.14; twice(3)`)).toEqual(6);
|
|
824
|
+
});
|
|
825
|
+
test('multiple exported definitions can be interleaved with non-exported ones', () => {
|
|
826
|
+
expect(run(`export let x = 5; let twice = n => n*2; export let a = r => r*r*3.14; twice(3)`)).toEqual(6);
|
|
827
|
+
});
|
|
828
|
+
test('errors if a nested definition has the "export" qualifier', () => {
|
|
829
|
+
expect(() => run(`let x = (export let y = 4; y+1); x+3`)).toThrowError('non-top-level definition cannot be exported at (1:10..36) export let y = 4; y+1); x+3');
|
|
830
|
+
});
|
|
831
|
+
});
|
|
832
|
+
describe('unit', () => {
|
|
833
|
+
test('evaluates to an empty string if it contains only definitions', () => {
|
|
834
|
+
expect(run(`export let x = 5`)).toEqual('');
|
|
835
|
+
});
|
|
836
|
+
});
|
|
837
|
+
test.todo('support file names in locations');
|
|
838
|
+
test.todo('string interpolation via `foo` strings');
|
|
839
|
+
test.todo('imports');
|
|
840
|
+
test.todo('optional parameters');
|
|
841
|
+
test.todo('optional type annotations?');
|
|
842
|
+
test.todo('allow redundant commas');
|
|
843
|
+
test.todo('left associativity of +/-');
|
|
844
|
+
test.todo('comparison of arrays');
|
|
845
|
+
test.todo('comparison of lambdas?');
|
|
846
|
+
test.todo('deep equality of objects');
|
|
847
|
+
test.todo('"abcdef"[1] == "b"');
|
|
848
|
+
test.todo('an object literal cannot have a repeated attribute name that');
|
|
849
|
+
test.todo('quoting of a ticks inside a string');
|
|
850
|
+
test.todo('number in scientific notation');
|
|
851
|
+
test.todo('number methods');
|
|
852
|
+
test.todo('drop the fun () notation and use just arrow functions');
|
|
853
|
+
test.todo('proper internal representation of arrow function, in particular: show(), span()');
|
|
854
|
+
test.todo('sink sinkifies arrays and objects it is stored at');
|
|
855
|
+
test.todo('{foo}');
|
|
856
|
+
});
|
|
857
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VwdGltYS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdHMvc2VwdGltYS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNENBQXdDO0FBRXhDOzs7O0dBSUc7QUFDSCxTQUFTLEdBQUcsQ0FBQyxLQUFhO0lBQ3hCLE9BQU8saUJBQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7QUFDeEQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLE9BQU8sQ0FBQyxLQUFhO0lBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksaUJBQU8sRUFBRSxDQUFBO0lBQzdCLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFFbkQsSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLE1BQU0sRUFBRTtRQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7S0FDNUM7SUFDRCxPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUM7QUFFRCxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtJQUN2QixJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtRQUMxRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ25DLENBQUMsQ0FBQyxDQUFBO0lBQ0YsSUFBSSxDQUFDLDREQUE0RCxFQUFFLEdBQUcsRUFBRTtRQUN0RSxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDMUMsQ0FBQyxDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRTtRQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2pDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVyQyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3ZDLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDeEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN4QyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDekMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMzQyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzNDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM5QyxDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO1FBQ3ZCLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDOUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDOUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNsQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDOUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUM5QixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRXZDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsNkNBQTZDLENBQUMsQ0FBQTtRQUNuRixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLDZDQUE2QyxDQUFDLENBQUE7UUFDbkYsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFBO1FBQ3BGLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsNkNBQTZDLENBQUMsQ0FBQTtJQUN0RixDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUksQ0FBQyxrREFBa0QsRUFBRSxHQUFHLEVBQUU7UUFDNUQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLDZDQUE2QyxDQUFDLENBQUE7UUFFakcsTUFBTSxRQUFRLEdBQUc7WUFDZixxRUFBcUU7WUFDckUsc0NBQXNDO1lBQ3RDLHNDQUFzQztZQUN0QyxrQ0FBa0M7WUFDbEMsOEJBQThCO1NBQy9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRVosTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ25FLENBQUMsQ0FBQyxDQUFBO0lBRUYsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7UUFDcEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNsQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2pDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNwQyxDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO1FBQ3RCLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRWpDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRWxDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRWpDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2xDLENBQUMsQ0FBQyxDQUFBO0lBRUYsSUFBSSxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtRQUN4RCxNQUFNLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDekQsTUFBTSxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzFELE1BQU0sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMxRCxNQUFNLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDNUQsQ0FBQyxDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsc0VBQXNFLEVBQUUsR0FBRyxFQUFFO1FBQ2hGLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdEMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO0lBQ3hFLENBQUMsQ0FBQyxDQUFBO0lBQ0YsSUFBSSxDQUFDLHNFQUFzRSxFQUFFLEdBQUcsRUFBRTtRQUNoRixNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3hDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUN2RSxDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ3hDLENBQUMsQ0FBQyxDQUFBO0lBRUYsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUNqQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtZQUNiLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDNUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ25DLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLHNDQUFzQyxFQUFFLEdBQUcsRUFBRTtZQUNoRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLDZCQUE2QixDQUFDLENBQUE7WUFDdEUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO1lBQ2xFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtZQUNsRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsMENBQTBDLENBQUMsQ0FBQTtZQUM1RixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLDhCQUE4QixDQUFDLENBQUE7UUFDMUUsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtZQUNiLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2pDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUNsQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3BDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7SUFFRixRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixJQUFJLENBQUMsaURBQWlELEVBQUUsR0FBRyxFQUFFO1lBQzNELE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDN0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzVDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQzdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM1QyxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7WUFDckQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN6QyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzNDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtZQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDeEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2hELE1BQU0sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDakYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUN0RixjQUFjO2dCQUNkLFdBQVc7Z0JBQ1gsU0FBUzthQUNWLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLCtDQUErQyxFQUFFLEdBQUcsRUFBRTtZQUN6RCxNQUFNLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDckQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUNGLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFO1FBQ25CLElBQUksQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7WUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMxRCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7WUFDOUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUN2QyxNQUFNLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDeEQsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFO1lBQ2pELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBQzVFLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLENBQ0osR0FBRyxDQUFDOzs7OzZCQUlpQixDQUFDLENBQ3ZCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2QsTUFBTSxDQUNKLEdBQUcsQ0FBQzs7Ozt3Q0FJNEIsQ0FBQyxDQUNsQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNoQixDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyw4REFBOEQsRUFBRSxHQUFHLEVBQUU7WUFDeEUsTUFBTSxDQUNKLEdBQUcsQ0FBQzs7Ozs2QkFJaUIsQ0FBQyxDQUN2QixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNoQixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyx3RUFBd0UsRUFBRSxHQUFHLEVBQUU7WUFDbEYsTUFBTSxDQUNKLEdBQUcsQ0FBQzs7OzswQ0FJOEIsQ0FBQyxDQUNwQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNoQixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxrRkFBa0YsRUFBRSxHQUFHLEVBQUU7WUFDNUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzNELENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLG1GQUFtRixFQUFFLEdBQUcsRUFBRTtZQUM3RixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLCtCQUErQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUMzRixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxrREFBa0QsRUFBRSxHQUFHLEVBQUU7WUFDNUQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLDBCQUEwQixDQUFDLENBQUE7UUFDN0csQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1lBQzFELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyx3REFBd0QsQ0FBQyxDQUFBO1lBQzVFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDM0IsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO1lBQ3ZDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBQzdGLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7SUFFRixRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUN0QixJQUFJLENBQUMsdUVBQXVFLEVBQUUsR0FBRyxFQUFFO1lBQ2pGLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUMzQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQy9CLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtZQUNsQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDcEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQy9DLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLDRFQUE0RSxFQUFFLEdBQUcsRUFBRTtZQUN0RixNQUFNLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDMUUsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMscUVBQXFFLEVBQUUsR0FBRyxFQUFFO1lBQy9FLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0ZBQXNGLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDMUcsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7YUFDTixDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0lBRUYsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7WUFDeEIsSUFBSSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtnQkFDekMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDN0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUN2QyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDbkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO1lBQ2pGLENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtnQkFDbEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUN4QyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDcEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO1lBQ2xGLENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtnQkFDOUQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFBO1lBQ2hGLENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLDZFQUE2RSxFQUFFLEdBQUcsRUFBRTtnQkFDdkYsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7WUFDcEUsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtRQUNGLFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO1lBQzFCLElBQUksQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7Z0JBQ3JELE1BQU0sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDbkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUMxRCxNQUFNLENBQUMsR0FBRyxDQUFDLHlGQUF5RixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7b0JBQzdHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRztpQkFDVixDQUFDLENBQUE7Z0JBQ0YsTUFBTSxDQUFDLEdBQUcsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtnQkFDMUUsTUFBTSxDQUNKLEdBQUcsQ0FDRCxxSUFBcUksQ0FDdEksQ0FDRixDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2hFLENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRTtnQkFDckQsTUFBTSxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUN0RCxNQUFNLENBQUMsR0FBRyxDQUFDLHdDQUF3QyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDckUsTUFBTSxDQUFDLEdBQUcsQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3hHLENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLHNGQUFzRixFQUFFLEdBQUcsRUFBRTtnQkFDaEcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3JHLENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLDRFQUE0RSxFQUFFLEdBQUcsRUFBRTtnQkFDdEYsTUFBTSxDQUFDLEdBQUcsQ0FBQywyRUFBMkUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNyRyxNQUFNLENBQUMsR0FBRyxDQUFDLGtFQUFrRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDOUYsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLENBQUMsbUVBQW1FLEVBQUUsR0FBRyxFQUFFO2dCQUM3RSxNQUFNLENBQUMsR0FBRyxDQUFDLHdGQUF3RixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7b0JBQzVHLENBQUMsRUFBRSxDQUFDO2lCQUNMLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLFFBQVEsQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7UUFDMUMsSUFBSSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3JFLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsRUFBRTtZQUNoRSxNQUFNLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ25FLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDM0UsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsMkRBQTJELEVBQUUsR0FBRyxFQUFFO1lBQ3JFLE1BQU0sQ0FBQyxHQUFHLENBQUMsOERBQThELENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDbEYsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7YUFDTCxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7WUFDNUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO1FBQ2pHLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtZQUNqRCxNQUFNLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDM0YsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsNENBQTRDLEVBQUUsR0FBRyxFQUFFO1lBQ3RELE1BQU0sQ0FBQyxHQUFHLENBQUMsc0RBQXNELENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDNUcsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMseUNBQXlDLEVBQUUsR0FBRyxFQUFFO1lBQ25ELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxnREFBZ0QsQ0FBQyxDQUFBO1lBQ3pHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQywrQ0FBK0MsQ0FBQyxDQUFBO1lBQ3ZHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBO1lBQ2pHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFBO1FBQ3ZHLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7SUFFRixRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLElBQUksQ0FBQywrQ0FBK0MsRUFBRSxHQUFHLEVBQUU7WUFDekQsTUFBTSxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDL0QsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFO1lBQzVDLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDbkYsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsb0RBQW9ELEVBQUUsR0FBRyxFQUFFO1lBQzlELE1BQU0sQ0FBQyxHQUFHLENBQUMsb0VBQW9FLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDeEYsR0FBRztnQkFDSCxHQUFHO2dCQUNILEdBQUc7Z0JBQ0gsR0FBRztnQkFDSCxHQUFHO2dCQUNILEdBQUc7YUFDSixDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLEVBQUU7WUFDbEQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLCtDQUErQyxDQUFDLENBQUE7WUFDdkcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLDRDQUE0QyxDQUFDLENBQUE7WUFDakcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGtEQUFrRCxDQUFDLENBQUE7WUFDNUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLDhDQUE4QyxDQUFDLENBQUE7UUFDdkcsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ2xCLElBQUksQ0FBQyxnRUFBZ0UsRUFBRSxHQUFHLEVBQUU7WUFDMUUsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3RELENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLDBEQUEwRCxFQUFFLEdBQUcsRUFBRTtZQUNwRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtZQUNqRixNQUFNLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNyRCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxrRUFBa0UsRUFBRSxHQUFHLEVBQUU7WUFDNUUsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDdkQsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsNERBQTRELEVBQUUsR0FBRyxFQUFFO1lBQ3RFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1lBQ2pGLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNsRCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7WUFDOUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLDhDQUE4QyxDQUFDLENBQUE7UUFDMUcsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO1FBQ3ZCLElBQUksQ0FBQyxnRUFBZ0UsRUFBRSxHQUFHLEVBQUU7WUFDMUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2xELENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLDBEQUEwRCxFQUFFLEdBQUcsRUFBRTtZQUNwRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtZQUMzRSxNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMvQyxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxrRUFBa0UsRUFBRSxHQUFHLEVBQUU7WUFDNUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDbkQsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsNERBQTRELEVBQUUsR0FBRyxFQUFFO1lBQ3RFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1lBQzNFLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM1QyxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7WUFDOUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLDhDQUE4QyxDQUFDLENBQUE7UUFDcEcsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1lBQzFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUVBQW1FLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUN6RyxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7WUFDdEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzlFLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtZQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDL0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQy9ELE1BQU0sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUMvRCxNQUFNLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDakUsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7UUFDbEMsSUFBSSxDQUFDLHFEQUFxRCxFQUFFLEdBQUcsRUFBRTtZQUMvRCxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDekMsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDbkQsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3BELENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtZQUN2QyxNQUFNLENBQUMsR0FBRyxDQUFDLHFEQUFxRCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDOUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtREFBbUQsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzlFLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLDJFQUEyRSxFQUFFLEdBQUcsRUFBRTtZQUNyRixNQUFNLENBQUMsR0FBRyxDQUFDLHlDQUF5QyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDbkUsTUFBTSxDQUFDLEdBQUcsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3hFLENBQUMsQ0FBQyxDQUFBO1FBQ0YsUUFBUSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtZQUN2QyxJQUFJLENBQUMsMEVBQTBFLEVBQUUsR0FBRyxFQUFFO2dCQUNwRixNQUFNLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDaEUsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO2dCQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDbEUsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO2dCQUM5QixNQUFNLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDdEQsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO2dCQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBQzFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsNkVBQTZFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUM5RyxDQUFDLENBQUMsQ0FBQTtZQUNGLElBQUksQ0FBQyx5REFBeUQsRUFBRSxHQUFHLEVBQUU7Z0JBQ25FLE1BQU0sQ0FBQyxHQUFHLENBQUMsK0NBQStDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDekUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpREFBaUQsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUMzRSxNQUFNLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQy9ELE1BQU0sQ0FBQyxHQUFHLENBQUMsMkRBQTJELENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUMzRixDQUFDLENBQUMsQ0FBQTtZQUNGLElBQUksQ0FBQyx1REFBdUQsRUFBRSxHQUFHLEVBQUU7Z0JBQ2pFLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0VBQW9FLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDOUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUMzRixNQUFNLENBQUMsR0FBRyxDQUFDLDJFQUEyRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQ25HLE1BQU0sQ0FBQyxHQUFHLENBQUMseUVBQXlFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUN4RyxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtZQUM1QixNQUFNLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDeEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQy9DLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtZQUN2QyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLG9EQUFvRCxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQ2xGLGdEQUFnRCxDQUNqRCxDQUFBO1lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2pGLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtZQUM1QixNQUFNLENBQUMsR0FBRyxDQUFDLHlFQUF5RSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDbkcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxxRkFBcUYsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUN6RyxFQUFFLEVBQUUsRUFBRTthQUNQLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDbkUsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5RkFBeUYsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUM1RyxHQUFHLENBQ0osQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRTtZQUNyQyxNQUFNLFFBQVEsR0FBRztnQkFDZixvR0FBb0c7Z0JBQ3BHLHNCQUFzQjtnQkFDdEIsc0JBQXNCO2dCQUN0QixzQkFBc0I7Z0JBQ3RCLHNCQUFzQjtnQkFDdEIsb0JBQW9CO2FBQ3JCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBRVosTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUNWLEdBQUcsQ0FBQywwRkFBMEYsQ0FBQyxDQUNoRyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMxQixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQywrREFBK0QsRUFBRSxHQUFHLEVBQUU7WUFDekUsTUFBTSxDQUFDLEdBQUcsQ0FBQyx3REFBd0QsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2xGLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsRUFBRTtZQUNoRSxNQUFNLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDM0UsTUFBTSxDQUFDLEdBQUcsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2pGLE1BQU0sQ0FBQyxHQUFHLENBQUMsd0VBQXdFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNsRyxNQUFNLENBQUMsR0FBRyxDQUFDLDhFQUE4RSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDMUcsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQ3BCLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7WUFDNUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN4QyxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxrRUFBa0UsRUFBRSxHQUFHLEVBQUU7WUFDNUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMxQyxNQUFNLENBQUMsT0FBTyxDQUFDLDBDQUEwQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUN4RSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO2dCQUNwQixFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO2FBQ25CLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGtEQUFrRCxFQUFFLEdBQUcsRUFBRTtZQUM1RCxNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDbEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzdELE1BQU0sQ0FBQyxHQUFHLENBQUMsbURBQW1ELENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUNuRixNQUFNLENBQUMsR0FBRyxDQUFDLGtEQUFrRCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDNUUsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1lBQzFELE1BQU0sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUMvRCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyx5REFBeUQsRUFBRSxHQUFHLEVBQUU7WUFDbkUsTUFBTSxDQUFDLEdBQUcsQ0FBQyw2REFBNkQsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3ZHLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLDBEQUEwRCxFQUFFLEdBQUcsRUFBRTtZQUNwRSxNQUFNLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDOUUsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsMkZBQTJGLEVBQUUsR0FBRyxFQUFFO1lBQ3JHLE1BQU0sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUMvQyxNQUFNLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDbEQsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsb0dBQW9HLEVBQUUsR0FBRyxFQUFFO1lBQzlHLE1BQU0sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUN4RCxNQUFNLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDekQsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsNEZBQTRGLEVBQUUsR0FBRyxFQUFFO1lBQ3RHLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN0RCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLEVBQUU7WUFDdkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMvQyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzlDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDM0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNoRCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLEVBQUU7WUFDdkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMvQyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzlDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDL0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMzQyxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxvREFBb0QsRUFBRSxHQUFHLEVBQUU7WUFDOUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUMxQyxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7WUFDNUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUMxQyxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQywrQ0FBK0MsRUFBRSxHQUFHLEVBQUU7WUFDekQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUN6QyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzVDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLHFEQUFxRCxFQUFFLEdBQUcsRUFBRTtZQUMvRCxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDM0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUMxQyxNQUFNLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDbkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN2QyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDeEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN4QyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzNDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGdEQUFnRCxFQUFFLEdBQUcsRUFBRTtZQUMxRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLDBEQUEwRCxDQUFDLENBQUE7WUFDdkcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQywwREFBMEQsQ0FBQyxDQUFBO1lBQzFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsMERBQTBELENBQUMsQ0FBQTtZQUN6RyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsMERBQTBELENBQUMsQ0FBQTtZQUNsSCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLDBEQUEwRCxDQUFDLENBQUE7WUFDdEcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQywwREFBMEQsQ0FBQyxDQUFBO1lBQ3RHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsMERBQTBELENBQUMsQ0FBQTtZQUN2RyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLDBEQUEwRCxDQUFDLENBQUE7WUFDdkcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQywwREFBMEQsQ0FBQyxDQUFBO1FBQzFHLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGtGQUFrRixFQUFFLEdBQUcsRUFBRTtZQUM1RixNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3JDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLHFFQUFxRSxFQUFFLEdBQUcsRUFBRTtZQUMvRSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2xDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLHNFQUFzRSxFQUFFLEdBQUcsRUFBRTtZQUNoRixNQUFNLENBQUMsT0FBTyxDQUFDLHlDQUF5QyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUN2RSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO2dCQUNwQixFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO2FBQ25CLENBQUMsQ0FBQTtZQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMseUNBQXlDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3ZFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7Z0JBQ3BCLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7YUFDbkIsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxtREFBbUQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDakYsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtnQkFDcEIsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTthQUNuQixDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyx3RUFBd0UsRUFBRSxHQUFHLEVBQUU7WUFDbEYsTUFBTSxDQUFDLE9BQU8sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FDekUsdUNBQXVDLENBQ3hDLENBQUE7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0YsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDckIsSUFBSSxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtZQUNwRCxNQUFNLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUN6RDtnQkFDRSwyQ0FBMkM7Z0JBQzNDLDJDQUEyQztnQkFDM0Msb0NBQW9DO2dCQUNwQyw4QkFBOEI7Z0JBQzlCLHVCQUF1QjthQUN4QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDYixDQUFBO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFO1lBQ2pELE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQ2hELENBQUMsa0NBQWtDLEVBQUUsa0NBQWtDLEVBQUUsMkJBQTJCLENBQUMsQ0FBQyxJQUFJLENBQ3hHLElBQUksQ0FDTCxDQUNGLENBQUE7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0YsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDdEIsSUFBSSxDQUFDLCtEQUErRCxFQUFFLEdBQUcsRUFBRTtZQUN6RSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsNERBQTRELENBQUMsQ0FBQTtZQUNwRixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQztnQkFDbkMsQ0FBQyxFQUFFLHFDQUFxQztnQkFDeEMsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7YUFDTixDQUFDLENBQUE7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQ3pGLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUMxQjtnQkFDRSwyRUFBMkU7Z0JBQzNFLDJFQUEyRTtnQkFDM0UsMkJBQTJCO2dCQUMzQixvQ0FBb0M7Z0JBQ3BDLGdDQUFnQztnQkFDaEMsNEJBQTRCO2dCQUM1Qix3QkFBd0I7YUFDekIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ2IsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGdFQUFnRSxFQUFFLEdBQUcsRUFBRTtZQUMxRSxNQUFNLENBQUMsT0FBTyxDQUFDLHNFQUFzRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDO2dCQUM1RyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ04sQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO1lBQ2xELE1BQU0sQ0FBQyxPQUFPLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUM7Z0JBQzFFLENBQUMsRUFBRSxFQUFFO2FBQ04sQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO1FBQzdCLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQ2xCLE1BQU0sQ0FBQyxHQUFHLENBQUMsOENBQThDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQzFHLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDakIsTUFBTSxDQUFDLEdBQUcsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2xGLE1BQU0sQ0FBQyxHQUFHLENBQUMsd0RBQXdELENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNwRixNQUFNLENBQ0osR0FBRyxDQUFDLHFHQUFxRyxDQUFDLENBQzNHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDMUIsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtZQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDLDhEQUE4RCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUNuRyxNQUFNLENBQUMsR0FBRyxDQUFDLHVEQUF1RCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUN4RixNQUFNLENBQUMsR0FBRyxDQUFDLHFFQUFxRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkcsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtZQUNoQixNQUFNLENBQUMsR0FBRyxDQUFDLHFEQUFxRCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDOUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzNGLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDdkUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3hELENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7WUFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQywwREFBMEQsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2xGLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0VBQXNFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNoRyxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxvREFBb0QsRUFBRSxHQUFHLEVBQUU7WUFDOUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDckUsTUFBTSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEQsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtZQUNuQixNQUFNLENBQUMsR0FBRyxDQUFDLHNEQUFzRCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3hHLE1BQU0sQ0FBQyxHQUFHLENBQUMsNkRBQTZELENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDaEcsTUFBTSxDQUFDLEdBQUcsQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ25ILENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDZixNQUFNLENBQUMsR0FBRyxDQUFDLGdEQUFnRCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDdEYsTUFBTSxDQUFDLEdBQUcsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDbkYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNsSCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQ2xCLE1BQU0sQ0FBQyxHQUFHLENBQUMsOENBQThDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUMzRSxNQUFNLENBQUMsR0FBRyxDQUFDLDRFQUE0RSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDeEcsTUFBTSxDQUFDLEdBQUcsQ0FBQyx1RUFBdUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JHLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7WUFDdkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtREFBbUQsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ2hGLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUZBQWlGLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUM3RyxNQUFNLENBQUMsR0FBRyxDQUFDLDRFQUE0RSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDMUcsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtZQUNoQixNQUFNLENBQUMsR0FBRyxDQUFDLDREQUE0RCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDdkYsTUFBTSxDQUFDLEdBQUcsQ0FBQyw0REFBNEQsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3hGLE1BQU0sQ0FBQyxHQUFHLENBQUMseURBQXlELENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNwRixNQUFNLENBQUMsR0FBRyxDQUFDLGlFQUFpRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUYsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUNGLFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO1FBQzdCLElBQUksQ0FBQyxxREFBcUQsRUFBRSxHQUFHLEVBQUU7WUFDL0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQ3hFLDhGQUE4RjtRQUNoRyxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLEVBQUU7WUFDbEQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLDhDQUE4QyxDQUFDLENBQUE7WUFDbEcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLDRDQUE0QyxDQUFDLENBQUE7WUFDOUYsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGdEQUFnRCxDQUFDLENBQUE7WUFDdEcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGdEQUFnRCxDQUFDLENBQUE7WUFDdEcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLHFEQUFxRCxDQUFDLENBQUE7UUFDaEgsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUNGLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7UUFDaEMsSUFBSSxDQUFDLG9FQUFvRSxFQUFFLEdBQUcsRUFBRTtZQUM5RSxNQUFNLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3pELENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDUixDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ1IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO2FBQ1YsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO1lBQ2xELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFBO1lBQy9GLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFBO1lBQzNGLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFBO1lBQ25HLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFBO1lBQ25HLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQywrQ0FBK0MsQ0FBQyxDQUFBO1FBQzdHLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7SUFDRixRQUFRLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLElBQUksQ0FBQyxrRkFBa0YsRUFBRSxHQUFHLEVBQUU7WUFDNUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnRkFBZ0YsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUNwRyxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsS0FBSztnQkFDUixDQUFDLEVBQUUsSUFBSTthQUNSLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtZQUNqRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtZQUNuRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsc0NBQXNDLENBQUMsQ0FBQTtZQUMvRixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsMENBQTBDLENBQUMsQ0FBQTtZQUN2RyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsNENBQTRDLENBQUMsQ0FBQTtZQUMxRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsK0NBQStDLENBQUMsQ0FBQTtRQUNqSCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7WUFDckQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLHdDQUF3QyxDQUFDLENBQUE7UUFDbkgsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsaURBQWlELEVBQUUsR0FBRyxFQUFFO1lBQzNELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBO1FBQ2hILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7SUFDRixRQUFRLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRTtRQUN4QixJQUFJLENBQUMscURBQXFELEVBQUUsR0FBRyxFQUFFO1lBQy9ELE1BQU0sQ0FDSixHQUFHLENBQUM7O2FBRUMsQ0FBQyxDQUNQLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2pCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLHFEQUFxRCxFQUFFLEdBQUcsRUFBRTtZQUMvRCxNQUFNLENBQ0osR0FBRyxDQUFDOzs7OztjQUtFLENBQUMsQ0FDUixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNsQixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLEVBQUU7WUFDcEQsTUFBTSxDQUNKLEdBQUcsQ0FBQzs7O2FBR0MsQ0FBQyxDQUNQLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2pCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7SUFDRixRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1FBQ2hDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7WUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQy9GLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7SUFDRixRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtRQUN6QixJQUFJLENBQUMsaURBQWlELEVBQUUsR0FBRyxFQUFFO1lBQzNELE1BQU0sT0FBTyxHQUFHLElBQUksaUJBQU8sRUFBRSxDQUFBO1lBRTdCLE1BQU0sS0FBSyxHQUFHLGlDQUFpQyxDQUFBO1lBQy9DLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixJQUFJLEVBQUUsK0NBQStDO2FBQ3RELENBQUE7WUFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3RGLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRTtZQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLGlCQUFPLEVBQUUsQ0FBQTtZQUU3QixNQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQTtZQUNyQyxNQUFNLFVBQVUsR0FBRztnQkFDakIsQ0FBQyxFQUFFLHdCQUF3QjtnQkFDM0IsQ0FBQyxFQUFFLHdCQUF3QjthQUM1QixDQUFBO1lBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUN0RixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0YsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7UUFDcEIsSUFBSSxDQUFDLDREQUE0RCxFQUFFLEdBQUcsRUFBRTtZQUN0RSxNQUFNLE9BQU8sR0FBRyxJQUFJLGlCQUFPLEVBQUUsQ0FBQTtZQUM3QixNQUFNLENBQ0osT0FBTyxDQUFDLE9BQU8sQ0FBQyxtRUFBbUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFO2dCQUNoRyxDQUFDLEVBQUUsUUFBUTtnQkFDWCxDQUFDLEVBQUUsUUFBUTtnQkFDWCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO2FBQ3hCLENBQUMsQ0FDSCxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxDQUFDLENBQUE7UUFDdkQsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsaURBQWlELEVBQUUsR0FBRyxFQUFFO1lBQzNELE1BQU0sT0FBTyxHQUFHLElBQUksaUJBQU8sRUFBRSxDQUFBO1lBQzdCLE1BQU0sQ0FDSixPQUFPLENBQUMsT0FBTyxDQUFDLDBDQUEwQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUU7Z0JBQ3ZFLEtBQUssRUFBRSxLQUFLO2FBQ2IsQ0FBQyxDQUNILENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDckMsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsOENBQThDLEVBQUUsR0FBRyxFQUFFO1lBQ3hELE1BQU0sQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2xGLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7SUFDRixRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUN0QixJQUFJLENBQUMsd0RBQXdELEVBQUUsR0FBRyxFQUFFO1lBQ2xFLE1BQU0sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNqRCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLEVBQUU7WUFDaEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyx1RkFBdUYsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pILENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLHlFQUF5RSxFQUFFLEdBQUcsRUFBRTtZQUNuRixNQUFNLENBQUMsR0FBRyxDQUFDLGdGQUFnRixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDMUcsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsMERBQTBELEVBQUUsR0FBRyxFQUFFO1lBQ3BFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FDcEUsdUZBQXVGLENBQ3hGLENBQUE7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0YsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7UUFDcEIsSUFBSSxDQUFDLDhEQUE4RCxFQUFFLEdBQUcsRUFBRTtZQUN4RSxNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDN0MsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtJQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUE7SUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUE7SUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO0lBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO0lBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUE7SUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsOERBQThELENBQUMsQ0FBQTtJQUN6RSxJQUFJLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLENBQUE7SUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO0lBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxDQUFDLENBQUE7SUFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxpRkFBaUYsQ0FBQyxDQUFBO0lBQzVGLElBQUksQ0FBQyxJQUFJLENBQUMsbURBQW1ELENBQUMsQ0FBQTtJQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3BCLENBQUMsQ0FBQyxDQUFBIn0=
|