@profile-psl/psl-parser 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/parser.js ADDED
@@ -0,0 +1,707 @@
1
+ import * as fs from "node:fs";
2
+ import { StatementParser } from "./statementParser";
3
+ import { getTokens, Token } from "./tokenizer";
4
+ import { getLineAfter } from "./utilities";
5
+ /**
6
+ * Used for checking the type of Member at runtime
7
+ */
8
+ export var MemberClass;
9
+ (function (MemberClass) {
10
+ MemberClass[MemberClass["method"] = 1] = "method";
11
+ MemberClass[MemberClass["parameter"] = 2] = "parameter";
12
+ MemberClass[MemberClass["property"] = 3] = "property";
13
+ MemberClass[MemberClass["declaration"] = 4] = "declaration";
14
+ MemberClass[MemberClass["column"] = 5] = "column";
15
+ MemberClass[MemberClass["table"] = 6] = "table";
16
+ MemberClass[MemberClass["proc"] = 7] = "proc";
17
+ })(MemberClass || (MemberClass = {}));
18
+ // tslint:disable-next-line:class-name
19
+ class _Method {
20
+ closeParen;
21
+ id;
22
+ types;
23
+ modifiers;
24
+ parameters;
25
+ declarations;
26
+ line;
27
+ endLine;
28
+ batch;
29
+ memberClass;
30
+ documentation;
31
+ statements;
32
+ constructor() {
33
+ this.types = [];
34
+ this.modifiers = [];
35
+ this.parameters = [];
36
+ this.line = -1;
37
+ this.declarations = [];
38
+ this.endLine = -1;
39
+ this.memberClass = MemberClass.method;
40
+ this.documentation = "";
41
+ this.statements = [];
42
+ }
43
+ }
44
+ // tslint:disable-next-line:class-name
45
+ class _Parameter {
46
+ types;
47
+ req;
48
+ ret;
49
+ literal;
50
+ id;
51
+ memberClass;
52
+ comment;
53
+ modifiers;
54
+ constructor() {
55
+ this.modifiers = [];
56
+ this.req = false;
57
+ this.ret = false;
58
+ this.literal = false;
59
+ this.memberClass = MemberClass.parameter;
60
+ }
61
+ }
62
+ const NON_METHOD_KEYWORDS = [
63
+ "do", "d", "set", "s", "if", "i", "for", "f", "while", "w",
64
+ ];
65
+ export const NON_TYPE_MODIFIERS = [
66
+ "public", "static", "private",
67
+ ];
68
+ export function parseText(sourceText) {
69
+ const parser = new Parser();
70
+ return parser.parseDocument(sourceText);
71
+ }
72
+ export function parseFile(sourcePath) {
73
+ return new Promise((resolve, reject) => {
74
+ fs.readFile(sourcePath, (err, data) => {
75
+ if (err) {
76
+ reject(err);
77
+ }
78
+ else {
79
+ const parser = new Parser();
80
+ resolve(parser.parseDocument(data.toString()));
81
+ }
82
+ });
83
+ });
84
+ }
85
+ class Parser {
86
+ tokenizer;
87
+ activeToken;
88
+ methods;
89
+ properties;
90
+ declarations;
91
+ activeMethod;
92
+ activeProperty;
93
+ tokens;
94
+ extending;
95
+ pslPackage;
96
+ comments;
97
+ constructor(tokenizer) {
98
+ this.methods = [];
99
+ this.properties = [];
100
+ this.declarations = [];
101
+ this.tokens = [];
102
+ this.comments = [];
103
+ if (tokenizer)
104
+ this.tokenizer = tokenizer;
105
+ }
106
+ parseDocument(documentText) {
107
+ this.tokenizer = getTokens(documentText);
108
+ while (this.next()) {
109
+ if (this.activeToken.isAlphanumeric() || this.activeToken.isMinusSign()) {
110
+ const method = this.parseMethod();
111
+ if (!method)
112
+ continue;
113
+ this.methods.push(method);
114
+ this.activeMethod = method;
115
+ }
116
+ else if (this.activeToken.isTab() || this.activeToken.isSpace()) {
117
+ const lineNumber = this.activeToken.position.line;
118
+ const tokenBuffer = this.loadTokenBuffer();
119
+ const propertyDef = this.lookForPropertyDef(tokenBuffer);
120
+ if (propertyDef) {
121
+ if (propertyDef.id)
122
+ this.properties.push(propertyDef);
123
+ this.activeProperty = propertyDef;
124
+ continue;
125
+ }
126
+ const typeDec = this.lookForTypeDeclaration(tokenBuffer);
127
+ if (typeDec.length > 0) {
128
+ const activeDeclarations = this.activeMethod
129
+ ? this.activeMethod.declarations
130
+ : this.declarations;
131
+ for (const dec of typeDec)
132
+ activeDeclarations.push(dec);
133
+ continue;
134
+ }
135
+ const extending = this.checkForExtends(tokenBuffer);
136
+ if (extending)
137
+ this.extending = extending;
138
+ const pslPackage = this.checkForPSLPackage(tokenBuffer);
139
+ if (pslPackage)
140
+ this.pslPackage = pslPackage;
141
+ if (this.activeMethod &&
142
+ this.activeMethod.batch &&
143
+ this.activeMethod.id.value === "REVHIST")
144
+ continue;
145
+ const statements = this.parseStatementsOnLine(tokenBuffer);
146
+ if (statements && this.activeMethod) {
147
+ this.activeMethod.statements =
148
+ this.activeMethod.statements.concat(statements);
149
+ }
150
+ if (this.activeProperty &&
151
+ this.activeProperty.id.position.line + 1 === lineNumber) {
152
+ const documentation = this.checkForDocumentation(tokenBuffer);
153
+ if (documentation)
154
+ this.activeProperty.documentation = documentation;
155
+ }
156
+ else if (this.activeMethod &&
157
+ getLineAfter(this.activeMethod) === lineNumber) {
158
+ const documentation = this.checkForDocumentation(tokenBuffer);
159
+ if (documentation)
160
+ this.activeMethod.documentation = documentation;
161
+ }
162
+ }
163
+ else if (!this.activeToken.isNewLine()) {
164
+ this.throwAwayTokensTil(13 /* Type.NewLine */);
165
+ }
166
+ }
167
+ return {
168
+ comments: this.comments,
169
+ declarations: this.declarations,
170
+ extending: this.extending,
171
+ methods: this.methods,
172
+ properties: this.properties,
173
+ pslPackage: this.pslPackage,
174
+ tokens: this.tokens,
175
+ };
176
+ }
177
+ next() {
178
+ this.activeToken = this.tokenizer.next().value;
179
+ if (this.activeToken) {
180
+ this.tokens.push(this.activeToken);
181
+ if (this.activeToken.isLineComment() || this.activeToken.isBlockComment()) {
182
+ this.comments.push(this.activeToken);
183
+ }
184
+ }
185
+ return this.activeToken !== undefined;
186
+ }
187
+ checkForDocumentation(tokenBuffer) {
188
+ let i = 0;
189
+ while (i < tokenBuffer.length) {
190
+ const token = tokenBuffer[i];
191
+ if (token.isTab() || token.isSpace()) {
192
+ i++;
193
+ continue;
194
+ }
195
+ if (token.isBlockCommentInit() &&
196
+ tokenBuffer[i + 1] &&
197
+ tokenBuffer[i + 1].isBlockComment()) {
198
+ return tokenBuffer[i + 1].value;
199
+ }
200
+ return "";
201
+ }
202
+ return "";
203
+ }
204
+ lookForTypeDeclaration(tokenBuffer) {
205
+ let i = 0;
206
+ const tokens = [];
207
+ while (i < tokenBuffer.length) {
208
+ const token = tokenBuffer[i];
209
+ if (token.isTab() || token.isSpace()) {
210
+ i++;
211
+ continue;
212
+ }
213
+ if (token.isAlphanumeric() && token.value === "type") {
214
+ for (let j = i + 1; j < tokenBuffer.length; j++) {
215
+ const loadToken = tokenBuffer[j];
216
+ if (loadToken.isSpace() || loadToken.isTab())
217
+ continue;
218
+ // if (loadToken.isEqualSign()) break;
219
+ tokens.push(loadToken);
220
+ }
221
+ }
222
+ else if (token.isAlphanumeric() && token.value === "catch") {
223
+ for (let j = i + 1; j < tokenBuffer.length; j++) {
224
+ const loadToken = tokenBuffer[j];
225
+ if (loadToken.isSpace() || loadToken.isTab())
226
+ continue;
227
+ // if (loadToken.isEqualSign()) break;
228
+ tokens.push(new Token(1 /* Type.Alphanumeric */, "Error", { character: 0, line: 0 }));
229
+ tokens.push(loadToken);
230
+ break;
231
+ }
232
+ }
233
+ break;
234
+ }
235
+ const memberClass = MemberClass.declaration;
236
+ const declarations = [];
237
+ let type;
238
+ let tokenIndex = 0;
239
+ let id;
240
+ let hasType;
241
+ const modifiers = [];
242
+ while (tokenIndex < tokens.length) {
243
+ const token = tokens[tokenIndex];
244
+ tokenIndex++;
245
+ if (this.isDeclarationKeyword(token)) {
246
+ modifiers.push(token);
247
+ continue;
248
+ }
249
+ if (!hasType) {
250
+ if (token.type !== 1 /* Type.Alphanumeric */)
251
+ break;
252
+ if (token.value === "static") {
253
+ modifiers.push(token);
254
+ hasType = true;
255
+ }
256
+ else {
257
+ type = token;
258
+ hasType = true;
259
+ }
260
+ continue;
261
+ }
262
+ else if (token.isAlphanumeric()) {
263
+ id = token;
264
+ if (hasType && !type)
265
+ type = token;
266
+ // declarations.push({types: [type], identifier});
267
+ }
268
+ else if (token.isEqualSign()) {
269
+ tokenIndex = this.skipToNextDeclaration(tokens, tokenIndex);
270
+ if (id && type) {
271
+ declarations.push({ types: [type], id, memberClass, modifiers });
272
+ }
273
+ id = undefined;
274
+ }
275
+ else if (token.isOpenParen()) {
276
+ const types = [];
277
+ const myIdentifier = tokens[tokenIndex - 2];
278
+ while (tokenIndex < tokens.length) {
279
+ const arrayTypeToken = tokens[tokenIndex];
280
+ tokenIndex++;
281
+ if (arrayTypeToken.isOpenParen())
282
+ continue;
283
+ else if (arrayTypeToken.isAlphanumeric()) {
284
+ types.push(arrayTypeToken);
285
+ }
286
+ else if (arrayTypeToken.isComma()) {
287
+ continue;
288
+ }
289
+ else if (arrayTypeToken.isCloseParen()) {
290
+ if (type) {
291
+ declarations.push({
292
+ id: myIdentifier,
293
+ types: [type].concat(types),
294
+ memberClass,
295
+ modifiers
296
+ });
297
+ }
298
+ id = undefined;
299
+ break;
300
+ }
301
+ }
302
+ }
303
+ // Cheating!!
304
+ // else if (token.isPercentSign()) continue;
305
+ else if (token.isComma()) {
306
+ if (id && type) {
307
+ declarations.push({ types: [type], id, memberClass, modifiers });
308
+ }
309
+ id = undefined;
310
+ continue;
311
+ }
312
+ else if (token.value === "\r")
313
+ continue;
314
+ else if (token.isBlockComment())
315
+ continue;
316
+ else if (token.isBlockCommentInit())
317
+ continue;
318
+ else if (token.isBlockCommentTerm())
319
+ continue;
320
+ else if (token.isNewLine()) {
321
+ if (id && type) {
322
+ declarations.push({ types: [type], id, memberClass, modifiers });
323
+ }
324
+ id = undefined;
325
+ break;
326
+ }
327
+ else
328
+ break;
329
+ }
330
+ if (id && type)
331
+ declarations.push({ types: [type], id, memberClass, modifiers });
332
+ return declarations;
333
+ }
334
+ checkForExtends(tokenBuffer) {
335
+ let i = 0;
336
+ let classDef = false;
337
+ let extending = false;
338
+ let equals = false;
339
+ while (i < tokenBuffer.length) {
340
+ const token = tokenBuffer[i];
341
+ if (token.isTab() || token.isSpace()) {
342
+ i++;
343
+ continue;
344
+ }
345
+ else if (token.isNumberSign() && !classDef) {
346
+ const nextToken = tokenBuffer[i + 1];
347
+ if (!nextToken)
348
+ return null;
349
+ if (nextToken.value === "CLASSDEF") {
350
+ classDef = true;
351
+ i += 2;
352
+ }
353
+ else
354
+ break;
355
+ }
356
+ else if (token.value === "extends" && !extending) {
357
+ extending = true;
358
+ i++;
359
+ }
360
+ else if (token.isEqualSign() && !equals) {
361
+ equals = true;
362
+ i++;
363
+ }
364
+ else if (token.isAlphanumeric() && classDef && extending && equals) {
365
+ return token;
366
+ }
367
+ else {
368
+ i++;
369
+ }
370
+ }
371
+ return null;
372
+ }
373
+ checkForPSLPackage(tokenBuffer) {
374
+ let i = 0;
375
+ let foundPackageToken = false;
376
+ let fullPackage = "";
377
+ while (i < tokenBuffer.length) {
378
+ const token = tokenBuffer[i];
379
+ if (token.isTab() || token.isSpace()) {
380
+ i++;
381
+ continue;
382
+ }
383
+ else if (token.isNumberSign() && !foundPackageToken) {
384
+ const nextToken = tokenBuffer[i + 1];
385
+ if (!nextToken)
386
+ return "";
387
+ if (nextToken.value === "PACKAGE") {
388
+ foundPackageToken = true;
389
+ i += 2;
390
+ }
391
+ else
392
+ break;
393
+ }
394
+ else if (token.isAlphanumeric() && foundPackageToken) {
395
+ // TODO: Maybe this should return an ordered list of tokens?
396
+ if (fullPackage === "") {
397
+ fullPackage = token.value;
398
+ }
399
+ else {
400
+ fullPackage += ("." + token.value);
401
+ }
402
+ i++;
403
+ }
404
+ else {
405
+ i++;
406
+ }
407
+ }
408
+ if (fullPackage !== "") {
409
+ return fullPackage;
410
+ }
411
+ return "";
412
+ }
413
+ skipToNextDeclaration(identifiers, tokenIndex) {
414
+ let parenStack = 0;
415
+ while (tokenIndex < identifiers.length) {
416
+ const token = identifiers[tokenIndex];
417
+ tokenIndex++;
418
+ if (token.isOpenParen()) {
419
+ parenStack++;
420
+ }
421
+ else if (token.isCloseParen()) {
422
+ parenStack--;
423
+ }
424
+ else if (token.isComma() && parenStack === 0) {
425
+ break;
426
+ }
427
+ }
428
+ return tokenIndex;
429
+ }
430
+ isDeclarationKeyword(token) {
431
+ if (token.type !== 1 /* Type.Alphanumeric */)
432
+ return false;
433
+ const keywords = ["public", "private", "new", "literal"];
434
+ return keywords.indexOf(token.value) !== -1;
435
+ }
436
+ throwAwayTokensTil(type) {
437
+ while (this.next()) {
438
+ if (this.activeToken.type === type)
439
+ break;
440
+ }
441
+ }
442
+ loadTokenBuffer() {
443
+ const tokenBuffer = [];
444
+ while (this.next() && this.activeToken.type !== 13 /* Type.NewLine */) {
445
+ tokenBuffer.push(this.activeToken);
446
+ }
447
+ return tokenBuffer;
448
+ }
449
+ lookForPropertyDef(tokenBuffer) {
450
+ let i = 0;
451
+ // TODO better loop
452
+ while (i < tokenBuffer.length) {
453
+ let token = tokenBuffer[i];
454
+ if (token.isTab() || token.isSpace()) {
455
+ i++;
456
+ continue;
457
+ }
458
+ if (token.isNumberSign()) {
459
+ token = tokenBuffer[i + 1];
460
+ if (token && token.value === "PROPERTYDEF") {
461
+ const tokens = tokenBuffer.filter(t => {
462
+ if (t.isNumberSign())
463
+ return false;
464
+ if (t.value === "PROPERTYDEF")
465
+ return false;
466
+ return t.type !== 32 /* Type.Space */ && t.type !== 11 /* Type.Tab */;
467
+ });
468
+ const classTypes = [];
469
+ const classIndex = tokens.findIndex(t => t.value === "class");
470
+ if (tokens[classIndex + 1]
471
+ && tokens[classIndex + 1].value === "="
472
+ && tokens[classIndex + 2]
473
+ && tokens[classIndex + 2].isAlphanumeric()) {
474
+ classTypes.push(tokens[classIndex + 2]);
475
+ }
476
+ return {
477
+ id: tokens[0],
478
+ memberClass: MemberClass.property,
479
+ modifiers: this.findPropertyModifiers(tokens.slice(1)),
480
+ types: classTypes,
481
+ };
482
+ }
483
+ else {
484
+ break;
485
+ }
486
+ }
487
+ else {
488
+ break;
489
+ }
490
+ }
491
+ return null;
492
+ }
493
+ findPropertyModifiers(tokens) {
494
+ return tokens.filter(t => {
495
+ return (t.value === "private" ||
496
+ t.value === "literal" ||
497
+ t.value === "public");
498
+ });
499
+ }
500
+ parseMethod() {
501
+ let batchLabel = false;
502
+ const method = new _Method();
503
+ do {
504
+ if (!this.activeToken)
505
+ continue;
506
+ if (this.activeToken.isTab() || this.activeToken.isSpace())
507
+ continue;
508
+ else if (this.activeToken.isNewLine())
509
+ break;
510
+ else if (this.activeToken.isOpenParen()) {
511
+ const processed = this.processParameters(method);
512
+ if (!processed)
513
+ return undefined;
514
+ method.parameters = processed;
515
+ break;
516
+ }
517
+ else if (this.activeToken.isAlphanumeric() ||
518
+ this.activeToken.isNumeric()) {
519
+ if (batchLabel) {
520
+ method.modifiers.push(this.activeToken);
521
+ method.batch = true;
522
+ break;
523
+ }
524
+ if (method.line === -1) {
525
+ method.line = this.activeToken.position.line;
526
+ }
527
+ method.modifiers.push(this.activeToken);
528
+ }
529
+ else if (this.activeToken.isMinusSign()) {
530
+ batchLabel = true;
531
+ continue;
532
+ }
533
+ else if (this.activeToken.isLineCommentInit()
534
+ || this.activeToken.isLineComment()
535
+ || this.activeToken.isBlockCommentInit()
536
+ || this.activeToken.isBlockComment()
537
+ || this.activeToken.isBlockCommentTerm()) {
538
+ continue;
539
+ }
540
+ else if (this.activeToken.value === "\r")
541
+ continue;
542
+ else if (this.activeToken.isCloseParen()) {
543
+ if (!method.closeParen) {
544
+ method.closeParen = this.activeToken;
545
+ }
546
+ }
547
+ else {
548
+ this.throwAwayTokensTil(13 /* Type.NewLine */);
549
+ if (method.modifiers.length > 1) {
550
+ break;
551
+ }
552
+ return undefined;
553
+ }
554
+ } while (this.next());
555
+ return this.finalizeMethod(method);
556
+ }
557
+ finalizeMethod(method) {
558
+ for (const keyword of NON_METHOD_KEYWORDS) {
559
+ const index = method.modifiers
560
+ .map(i => i.value.toLowerCase())
561
+ .indexOf(keyword.toLowerCase());
562
+ if (index > -1 && index <= method.modifiers.length - 1) {
563
+ method.modifiers = [method.modifiers[0]];
564
+ method.parameters = [];
565
+ break;
566
+ }
567
+ }
568
+ // better way...
569
+ method.id = method.modifiers.pop();
570
+ if (this.activeMethod) {
571
+ this.activeMethod.endLine = method.id.position.line - 1;
572
+ }
573
+ const lastModifier = method.modifiers[method.modifiers.length - 1];
574
+ if (lastModifier && NON_TYPE_MODIFIERS.indexOf(lastModifier.value) < 0) {
575
+ method.types = [method.modifiers.pop()];
576
+ }
577
+ this.activeMethod = method;
578
+ return method;
579
+ }
580
+ processParameters(method) {
581
+ const args = [];
582
+ let param;
583
+ let open = false;
584
+ while (this.next()) {
585
+ if (this.activeToken.isTab() ||
586
+ this.activeToken.isSpace() ||
587
+ this.activeToken.isNewLine()) {
588
+ continue;
589
+ }
590
+ else if (this.activeToken.isOpenParen()) {
591
+ open = true;
592
+ if (!param)
593
+ return undefined;
594
+ if (param.types.length === 1 && !param.id) {
595
+ param.id = param.types[0];
596
+ param.types[0] = this.getDummy();
597
+ }
598
+ const objectArgs = this.processObjectArgs();
599
+ if (!objectArgs)
600
+ return undefined;
601
+ param.types = param.types.concat(objectArgs);
602
+ continue;
603
+ }
604
+ else if (this.activeToken.isCloseParen()) {
605
+ open = false;
606
+ method.closeParen = this.activeToken;
607
+ if (!param)
608
+ break;
609
+ if (param.types.length === 1 && !param.id) {
610
+ param.id = param.types[0];
611
+ param.types[0] = this.getDummy();
612
+ }
613
+ args.push(param);
614
+ break;
615
+ }
616
+ else if (this.activeToken.isAlphanumeric()) {
617
+ if (!param)
618
+ param = new _Parameter();
619
+ // let value = this.activeToken.value;
620
+ if (this.activeToken.value === "req") {
621
+ param.modifiers.push(this.activeToken);
622
+ param.req = true;
623
+ }
624
+ else if (this.activeToken.value === "ret") {
625
+ param.modifiers.push(this.activeToken);
626
+ param.ret = true;
627
+ }
628
+ else if (this.activeToken.value === "literal") {
629
+ param.modifiers.push(this.activeToken);
630
+ param.literal = true;
631
+ }
632
+ else if (!param.types)
633
+ param.types = [this.activeToken];
634
+ else {
635
+ param.id = this.activeToken;
636
+ }
637
+ }
638
+ else if (this.activeToken.isLineComment()) {
639
+ if (param) {
640
+ param.comment = this.activeToken;
641
+ }
642
+ else if (args.length >= 1) {
643
+ args[args.length - 1].comment = this.activeToken;
644
+ }
645
+ }
646
+ else if (this.activeToken.isComma()) {
647
+ if (!param)
648
+ return undefined;
649
+ if (param.types.length === 1 && !param.id) {
650
+ param.id = param.types[0];
651
+ param.types[0] = this.getDummy();
652
+ }
653
+ args.push(param);
654
+ param = undefined;
655
+ }
656
+ }
657
+ if (open)
658
+ return undefined;
659
+ return args;
660
+ }
661
+ processObjectArgs() {
662
+ const types = [];
663
+ let found = false;
664
+ while (this.next()) {
665
+ const dummy = this.getDummy();
666
+ if (this.activeToken.isTab() || this.activeToken.isSpace())
667
+ continue;
668
+ else if (this.activeToken.isCloseParen()) {
669
+ if (types.length === 0)
670
+ types.push(dummy);
671
+ return types;
672
+ }
673
+ else if (this.activeToken.isAlphanumeric()) {
674
+ if (!found) {
675
+ types.push(this.activeToken);
676
+ found = true;
677
+ }
678
+ else
679
+ return null;
680
+ }
681
+ else if (this.activeToken.isComma()) {
682
+ if (!found) {
683
+ if (types.length === 0) {
684
+ types.push(dummy);
685
+ }
686
+ types.push(dummy);
687
+ }
688
+ found = false;
689
+ continue;
690
+ }
691
+ }
692
+ return null;
693
+ }
694
+ parseStatementsOnLine(tokenBuffer) {
695
+ const statementParser = new StatementParser(tokenBuffer);
696
+ try {
697
+ return statementParser.parseLine();
698
+ }
699
+ catch {
700
+ return [];
701
+ }
702
+ }
703
+ getDummy() {
704
+ return new Token(-1 /* Type.Undefined */, "", this.activeToken.position);
705
+ }
706
+ }
707
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVEsTUFBTSxhQUFhLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUzQzs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLFdBUVg7QUFSRCxXQUFZLFdBQVc7SUFDdEIsaURBQVUsQ0FBQTtJQUNWLHVEQUFhLENBQUE7SUFDYixxREFBWSxDQUFBO0lBQ1osMkRBQWUsQ0FBQTtJQUNmLGlEQUFVLENBQUE7SUFDViwrQ0FBUyxDQUFBO0lBQ1QsNkNBQVEsQ0FBQTtBQUNULENBQUMsRUFSVyxXQUFXLEtBQVgsV0FBVyxRQVF0QjtBQThLRCxzQ0FBc0M7QUFDdEMsTUFBTSxPQUFPO0lBRVosVUFBVSxDQUFRO0lBQ2xCLEVBQUUsQ0FBUTtJQUNWLEtBQUssQ0FBVTtJQUNmLFNBQVMsQ0FBVTtJQUNuQixVQUFVLENBQWU7SUFDekIsWUFBWSxDQUFnQjtJQUM1QixJQUFJLENBQVM7SUFDYixPQUFPLENBQVM7SUFDaEIsS0FBSyxDQUFVO0lBQ2YsV0FBVyxDQUFjO0lBQ3pCLGFBQWEsQ0FBUztJQUN0QixVQUFVLENBQWM7SUFFeEI7UUFDQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8s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