circuitscript 0.0.38 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/cjs/BaseVisitor.js +69 -46
  2. package/dist/cjs/SymbolValidatorVisitor.js +1 -1
  3. package/dist/cjs/antlr/CircuitScriptLexer.js +80 -80
  4. package/dist/cjs/antlr/CircuitScriptParser.js +580 -613
  5. package/dist/cjs/builtinMethods.js +32 -10
  6. package/dist/cjs/draw_symbols.js +375 -233
  7. package/dist/cjs/execute.js +142 -131
  8. package/dist/cjs/export.js +2 -4
  9. package/dist/cjs/geometry.js +52 -19
  10. package/dist/cjs/globals.js +14 -9
  11. package/dist/cjs/helpers.js +16 -3
  12. package/dist/cjs/layout.js +143 -151
  13. package/dist/cjs/logger.js +8 -1
  14. package/dist/cjs/objects/ClassComponent.js +22 -22
  15. package/dist/cjs/objects/ExecutionScope.js +10 -4
  16. package/dist/cjs/objects/Frame.js +4 -1
  17. package/dist/cjs/objects/ParamDefinition.js +120 -4
  18. package/dist/cjs/objects/PinDefinition.js +1 -4
  19. package/dist/cjs/objects/types.js +41 -0
  20. package/dist/cjs/render.js +41 -110
  21. package/dist/cjs/sizing.js +33 -7
  22. package/dist/cjs/utils.js +92 -2
  23. package/dist/cjs/visitor.js +279 -284
  24. package/dist/esm/BaseVisitor.mjs +70 -47
  25. package/dist/esm/SymbolValidatorVisitor.mjs +1 -1
  26. package/dist/esm/antlr/CircuitScriptLexer.mjs +80 -80
  27. package/dist/esm/antlr/CircuitScriptParser.mjs +580 -613
  28. package/dist/esm/builtinMethods.mjs +29 -10
  29. package/dist/esm/draw_symbols.mjs +381 -238
  30. package/dist/esm/execute.mjs +144 -133
  31. package/dist/esm/export.mjs +2 -4
  32. package/dist/esm/geometry.mjs +52 -19
  33. package/dist/esm/globals.mjs +13 -8
  34. package/dist/esm/helpers.mjs +17 -4
  35. package/dist/esm/layout.mjs +144 -153
  36. package/dist/esm/logger.mjs +8 -1
  37. package/dist/esm/objects/ClassComponent.mjs +21 -26
  38. package/dist/esm/objects/ExecutionScope.mjs +10 -4
  39. package/dist/esm/objects/Frame.mjs +4 -1
  40. package/dist/esm/objects/ParamDefinition.mjs +119 -3
  41. package/dist/esm/objects/PinDefinition.mjs +0 -2
  42. package/dist/esm/objects/types.mjs +42 -0
  43. package/dist/esm/render.mjs +44 -113
  44. package/dist/esm/sizing.mjs +34 -8
  45. package/dist/esm/utils.mjs +86 -1
  46. package/dist/esm/visitor.mjs +281 -286
  47. package/dist/types/BaseVisitor.d.ts +3 -2
  48. package/dist/types/antlr/CircuitScriptParser.d.ts +5 -3
  49. package/dist/types/draw_symbols.d.ts +81 -49
  50. package/dist/types/execute.d.ts +16 -11
  51. package/dist/types/geometry.d.ts +31 -19
  52. package/dist/types/globals.d.ts +15 -10
  53. package/dist/types/helpers.d.ts +2 -1
  54. package/dist/types/layout.d.ts +22 -21
  55. package/dist/types/logger.d.ts +1 -1
  56. package/dist/types/objects/ClassComponent.d.ts +19 -16
  57. package/dist/types/objects/ExecutionScope.d.ts +2 -1
  58. package/dist/types/objects/Frame.d.ts +5 -3
  59. package/dist/types/objects/ParamDefinition.d.ts +31 -2
  60. package/dist/types/objects/PinDefinition.d.ts +0 -2
  61. package/dist/types/objects/types.d.ts +7 -2
  62. package/dist/types/render.d.ts +2 -1
  63. package/dist/types/utils.d.ts +9 -1
  64. package/dist/types/visitor.d.ts +5 -5
  65. package/libs/lib.cst +102 -32
  66. package/package.json +7 -3
@@ -1,15 +1,17 @@
1
1
  import { readFileSync } from 'fs';
2
2
  import { join } from 'path';
3
+ import { Big } from 'big.js';
3
4
  import { ExpressionContext } from "./antlr/CircuitScriptParser";
4
5
  import { CircuitScriptVisitor } from "./antlr/CircuitScriptVisitor";
5
6
  import { ExecutionContext } from "./execute";
6
7
  import { Logger } from "./logger";
7
8
  import { ClassComponent } from "./objects/ClassComponent";
8
- import { NumericValue, PercentageValue } from "./objects/ParamDefinition";
9
+ import { NumberOperator, NumericValue, PercentageValue } from "./objects/ParamDefinition";
9
10
  import { PinTypes } from "./objects/PinTypes";
10
11
  import { Direction, UndeclaredReference } from "./objects/types";
11
12
  import { GlobalDocumentName, ReferenceTypes } from './globals';
12
13
  import { linkBuiltInMethods } from './builtinMethods';
14
+ import { resolveToNumericValue, throwWithContext } from './utils';
13
15
  export class BaseVisitor extends CircuitScriptVisitor {
14
16
  indentLevel = 0;
15
17
  startingContext;
@@ -22,7 +24,6 @@ export class BaseVisitor extends CircuitScriptVisitor {
22
24
  printToConsole = true;
23
25
  acceptedDirections = [Direction.Up, Direction.Down,
24
26
  Direction.Right, Direction.Left];
25
- acceptedFlip = ['flipX', 'flipY'];
26
27
  resultData = new Map;
27
28
  paramData = new Map;
28
29
  pinTypesList = [
@@ -108,18 +109,21 @@ export class BaseVisitor extends CircuitScriptVisitor {
108
109
  tmpComponent.instanceName = reference.name;
109
110
  instances.delete(oldName);
110
111
  instances.set(reference.name, tmpComponent);
111
- this.getExecutor().log(`assigned '${reference.name}' to ClassComponent`);
112
+ this.log2(`assigned '${reference.name}' to ClassComponent`);
112
113
  }
113
114
  else {
114
115
  this.getExecutor().scope.variables.set(reference.name, value);
116
+ this.log2(`assigned variable ${reference.name} to ${value}`);
115
117
  }
116
118
  }
117
119
  else {
118
- if (reference.value instanceof ClassComponent) {
119
- this.setInstanceParam(reference.value, trailers, value);
120
+ if (reference.parentValue instanceof ClassComponent) {
121
+ this.setInstanceParam(reference.parentValue, trailers, value);
122
+ this.log2(`assigned component param ${reference.parentValue} trailers: ${trailers} value: ${value}`);
120
123
  }
121
- else if (reference.value instanceof Object) {
122
- reference.value[trailers.join('.')] = value;
124
+ else if (reference.parentValue instanceof Object) {
125
+ reference.parentValue[trailers.join('.')] = value;
126
+ this.log2(`assigned object ${reference.parentValue} trailers: ${trailers} value: ${value}`);
123
127
  }
124
128
  }
125
129
  this.setResult(ctx, value);
@@ -130,7 +134,7 @@ export class BaseVisitor extends CircuitScriptVisitor {
130
134
  this.visit(ctxDataExpr);
131
135
  const value = this.getResult(ctxDataExpr);
132
136
  if (!reference.found) {
133
- throw 'Undefined reference: ' + reference.name;
137
+ this.throwWithContext(ctx, 'Undefined reference: ' + reference.name);
134
138
  }
135
139
  const trailers = reference.trailers ?? [];
136
140
  let currentValue = null;
@@ -146,26 +150,27 @@ export class BaseVisitor extends CircuitScriptVisitor {
146
150
  }
147
151
  }
148
152
  if (currentValue === null) {
149
- throw 'Operator assignment failed: could not get value';
153
+ this.throwWithContext(ctx, 'Operator assignment failed: could not get value');
150
154
  }
151
155
  let newValue = 0;
156
+ const operator = new NumberOperator();
152
157
  if (ctx.AdditionAssign()) {
153
- newValue = currentValue + value;
158
+ newValue = operator.addition(currentValue, value);
154
159
  }
155
160
  else if (ctx.MinusAssign()) {
156
- newValue = currentValue - value;
161
+ newValue = operator.subtraction(currentValue, value);
157
162
  }
158
163
  else if (ctx.MultiplyAssign()) {
159
- newValue = currentValue * value;
164
+ newValue = operator.multiply(currentValue, value);
160
165
  }
161
166
  else if (ctx.DivideAssign()) {
162
- newValue = currentValue / value;
167
+ newValue = operator.divide(currentValue, value);
163
168
  }
164
169
  else if (ctx.ModulusAssign()) {
165
- newValue = currentValue % value;
170
+ newValue = operator.modulus(currentValue, value);
166
171
  }
167
172
  else {
168
- throw 'Operator assignment failed: could not perform operator';
173
+ this.throwWithContext(ctx, 'Operator assignment failed: could not perform operator');
169
174
  }
170
175
  if (trailers.length === 0) {
171
176
  this.getExecutor().scope.variables.set(reference.name, newValue);
@@ -183,12 +188,15 @@ export class BaseVisitor extends CircuitScriptVisitor {
183
188
  getReference(ctx) {
184
189
  const atomStr = ctx.getText();
185
190
  if (atomStr.indexOf('(') !== -1 || atomStr.indexOf(')') !== -1) {
186
- throw "Invalid assignment expression!";
191
+ this.throwWithContext(ctx, "Invalid assignment expression!");
187
192
  }
188
193
  this.visit(ctx);
189
194
  const reference = this.getResult(ctx);
190
- if (!reference.found && reference.trailers && reference.trailers.length > 0) {
191
- throw 'Undefined reference: ' + reference.name + '.' + reference.trailers.join('.');
195
+ const { trailers = [] } = reference;
196
+ const undefinedParentWithTrailers = trailers.length > 0
197
+ && reference.parentValue === undefined;
198
+ if (undefinedParentWithTrailers) {
199
+ this.throwWithContext(ctx, 'Undefined reference: ' + reference.name + '.' + trailers.join('.'));
192
200
  }
193
201
  return reference;
194
202
  }
@@ -197,6 +205,14 @@ export class BaseVisitor extends CircuitScriptVisitor {
197
205
  const firstId = ctx.ID(0);
198
206
  const atomId = firstId.getText();
199
207
  let currentReference;
208
+ const idTrailers = [];
209
+ if (ctx.ID().length > 1) {
210
+ const idLength = ctx.ID().length;
211
+ for (let i = 1; i < idLength; i++) {
212
+ const tmpCtx = ctx.ID(i);
213
+ idTrailers.push(tmpCtx.getText());
214
+ }
215
+ }
200
216
  if (this.pinTypesList.indexOf(atomId) !== -1) {
201
217
  currentReference = {
202
218
  found: true,
@@ -205,26 +221,17 @@ export class BaseVisitor extends CircuitScriptVisitor {
205
221
  };
206
222
  }
207
223
  else {
208
- currentReference = executor.resolveVariable(this.executionStack, atomId);
209
- }
210
- const idTrailers = [];
211
- if (ctx.ID().length > 1) {
212
- const idLength = ctx.ID().length;
213
- for (let i = 1; i < idLength; i++) {
214
- const tmpCtx = ctx.ID(i);
215
- idTrailers.push(tmpCtx.getText());
216
- }
224
+ currentReference = executor.resolveVariable(this.executionStack, atomId, idTrailers);
217
225
  }
218
- currentReference.trailers = idTrailers;
219
- if (currentReference.found && currentReference.type === 'instance') {
226
+ if (currentReference.found && currentReference.type === 'instance' && idTrailers.length === 0) {
220
227
  const tmpComponent = currentReference.value;
221
228
  for (const [pinId, net] of tmpComponent.pinNets) {
222
229
  executor.scope.setNet(tmpComponent, pinId, net);
223
230
  }
224
231
  }
225
- this.getExecutor().log('atomId:', atomId, currentReference);
232
+ this.log2(`atomId: ${atomId} ${currentReference}`);
226
233
  if (ctx.parent instanceof ExpressionContext && !currentReference.found) {
227
- throw "Unknown symbol: " + atomId;
234
+ this.throwWithContext(ctx, "Unknown symbol: " + atomId);
228
235
  }
229
236
  this.setResult(ctx, currentReference);
230
237
  };
@@ -246,7 +253,7 @@ export class BaseVisitor extends CircuitScriptVisitor {
246
253
  let currentReference = executor.resolveVariable(this.executionStack, atomId);
247
254
  if (ctx.trailer_expr().length > 0) {
248
255
  if (!currentReference.found) {
249
- throw "Unknown function name: " + atomId;
256
+ this.throwWithContext(ctx, "Unknown function name: " + atomId);
250
257
  }
251
258
  currentReference.trailers = [];
252
259
  ctx.trailer_expr().forEach(item => {
@@ -259,13 +266,18 @@ export class BaseVisitor extends CircuitScriptVisitor {
259
266
  parameters = this.getResult(ctxParameters);
260
267
  }
261
268
  const useNetNamespace = this.getNetNamespace(executor.netNamespace, passedNetNamespace);
262
- const [, functionResult] = executor.callFunction(currentReference.name, parameters, this.executionStack, useNetNamespace);
263
- currentReference = {
264
- found: true,
265
- value: functionResult,
266
- type: (functionResult instanceof ClassComponent) ?
267
- 'instance' : 'value',
268
- };
269
+ try {
270
+ const [, functionResult] = executor.callFunction(currentReference.name, parameters, this.executionStack, useNetNamespace);
271
+ currentReference = {
272
+ found: true,
273
+ value: functionResult,
274
+ type: (functionResult instanceof ClassComponent) ?
275
+ 'instance' : 'value',
276
+ };
277
+ }
278
+ catch (err) {
279
+ this.throwWithContext(ctx, err);
280
+ }
269
281
  }
270
282
  else {
271
283
  currentReference.trailers.push(itemValue);
@@ -285,10 +297,10 @@ export class BaseVisitor extends CircuitScriptVisitor {
285
297
  let result = null;
286
298
  if (ctxIntegerValue || ctxDecimalValue || ctxNumericValue) {
287
299
  if (ctxIntegerValue) {
288
- result = sign * Number(ctxIntegerValue.getText());
300
+ result = resolveToNumericValue((new Big(ctxIntegerValue.getText())).mul(new Big(sign)));
289
301
  }
290
302
  else if (ctxDecimalValue) {
291
- result = sign * Number(ctxDecimalValue.getText());
303
+ result = resolveToNumericValue((new Big(ctxDecimalValue.getText())).mul(new Big(sign)));
292
304
  }
293
305
  else if (ctxNumericValue) {
294
306
  const textExtra = ctx.Minus() ? '-' : '';
@@ -297,7 +309,7 @@ export class BaseVisitor extends CircuitScriptVisitor {
297
309
  }
298
310
  else {
299
311
  if (sign === -1) {
300
- throw "Invalid value!";
312
+ this.throwWithContext(ctx, "Invalid value");
301
313
  }
302
314
  }
303
315
  if (ctxBooleanValue) {
@@ -384,7 +396,7 @@ export class BaseVisitor extends CircuitScriptVisitor {
384
396
  visitImport_expr = (ctx) => {
385
397
  const ID = ctx.ID().toString();
386
398
  this.log('import', ID);
387
- this.handleImportFile(ID, true);
399
+ this.handleImportFile(ID, true, ctx);
388
400
  this.log('done import', ID);
389
401
  };
390
402
  visitFunction_return_expr = (ctx) => {
@@ -431,7 +443,11 @@ export class BaseVisitor extends CircuitScriptVisitor {
431
443
  getResult(ctx) {
432
444
  return this.resultData.get(ctx);
433
445
  }
434
- handleImportFile(name, throwErrors = true) {
446
+ visitResult(ctx) {
447
+ this.visit(ctx);
448
+ return this.getResult(ctx);
449
+ }
450
+ handleImportFile(name, throwErrors = true, ctx = null) {
435
451
  let hasError = false;
436
452
  let hasParseError = false;
437
453
  let pathExists = false;
@@ -466,14 +482,18 @@ export class BaseVisitor extends CircuitScriptVisitor {
466
482
  catch (err) {
467
483
  this.log('Failed to import file: ', err.message);
468
484
  }
485
+ let errorMessage = null;
469
486
  if (throwErrors && (hasError || hasParseError || !pathExists)) {
470
487
  if (!pathExists) {
471
- throw `File does not exist: ${name}`;
488
+ errorMessage = `File does not exist: ${name}`;
472
489
  }
473
490
  else {
474
- throw `Failed to import: ${name}`;
491
+ errorMessage = `Failed to import: ${name}`;
475
492
  }
476
493
  }
494
+ if (errorMessage !== null && ctx) {
495
+ this.throwWithContext(ctx, errorMessage);
496
+ }
477
497
  return {
478
498
  hasError,
479
499
  hasParseError,
@@ -561,7 +581,7 @@ export class BaseVisitor extends CircuitScriptVisitor {
561
581
  setInstanceParam(object, trailers, value) {
562
582
  const paramName = trailers[0];
563
583
  object.setParam(paramName, value);
564
- this.getExecutor().log(`set instance ${object.instanceName} param ${paramName} to ${value}`);
584
+ this.log2(`set instance ${object.instanceName} param ${paramName} to ${value}`);
565
585
  }
566
586
  getInstanceParam(object, trailers) {
567
587
  const paramName = trailers[0];
@@ -582,4 +602,7 @@ export class BaseVisitor extends CircuitScriptVisitor {
582
602
  prepareStringValue(value) {
583
603
  return value.slice(1, value.length - 1);
584
604
  }
605
+ throwWithContext(context, message) {
606
+ throwWithContext(context, message);
607
+ }
585
608
  }
@@ -37,7 +37,7 @@ export class SymbolValidatorVisitor extends BaseVisitor {
37
37
  }
38
38
  visitImport_expr = (ctx) => {
39
39
  const ID = ctx.ID().toString();
40
- const { pathExists } = this.handleImportFile(ID, false);
40
+ const { pathExists } = this.handleImportFile(ID, false, ctx);
41
41
  if (!pathExists) {
42
42
  this.symbolTable.addUndefined(this.getExecutor(), ID, ctx.ID());
43
43
  }
@@ -201,86 +201,86 @@ export class CircuitScriptLexer extends antlr.Lexer {
201
201
  95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113,
202
202
  0, 115, 57, 117, 58, 119, 59, 121, 60, 123, 61, 125, 62, 127, 63, 129, 64, 131, 0,
203
203
  133, 0, 135, 65, 1, 0, 10, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95,
204
- 97, 122, 1, 0, 49, 57, 2, 0, 48, 57, 95, 95, 1, 0, 48, 57, 1, 0, 48, 48, 5, 0, 77, 77, 107,
205
- 107, 109, 110, 112, 112, 117, 117, 3, 0, 48, 57, 65, 90, 97, 122, 2, 0, 9, 9, 32, 32,
206
- 2, 0, 10, 10, 12, 13, 511, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0,
207
- 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0,
208
- 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0,
209
- 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0,
210
- 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0,
211
- 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0,
212
- 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0,
213
- 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0,
214
- 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0,
215
- 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0,
216
- 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107,
217
- 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0,
218
- 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1,
219
- 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 1, 137, 1, 0, 0, 0, 3, 139, 1, 0, 0, 0, 5,
220
- 141, 1, 0, 0, 0, 7, 143, 1, 0, 0, 0, 9, 146, 1, 0, 0, 0, 11, 148, 1, 0, 0, 0, 13, 150, 1,
221
- 0, 0, 0, 15, 152, 1, 0, 0, 0, 17, 158, 1, 0, 0, 0, 19, 165, 1, 0, 0, 0, 21, 172, 1, 0, 0,
222
- 0, 23, 182, 1, 0, 0, 0, 25, 190, 1, 0, 0, 0, 27, 197, 1, 0, 0, 0, 29, 202, 1, 0, 0, 0, 31,
223
- 206, 1, 0, 0, 0, 33, 210, 1, 0, 0, 0, 35, 213, 1, 0, 0, 0, 37, 216, 1, 0, 0, 0, 39, 222,
224
- 1, 0, 0, 0, 41, 227, 1, 0, 0, 0, 43, 236, 1, 0, 0, 0, 45, 243, 1, 0, 0, 0, 47, 247, 1, 0,
225
- 0, 0, 49, 254, 1, 0, 0, 0, 51, 258, 1, 0, 0, 0, 53, 261, 1, 0, 0, 0, 55, 267, 1, 0, 0, 0,
226
- 57, 276, 1, 0, 0, 0, 59, 279, 1, 0, 0, 0, 61, 288, 1, 0, 0, 0, 63, 290, 1, 0, 0, 0, 65, 296,
227
- 1, 0, 0, 0, 67, 302, 1, 0, 0, 0, 69, 305, 1, 0, 0, 0, 71, 308, 1, 0, 0, 0, 73, 310, 1, 0,
228
- 0, 0, 75, 313, 1, 0, 0, 0, 77, 315, 1, 0, 0, 0, 79, 323, 1, 0, 0, 0, 81, 329, 1, 0, 0, 0,
229
- 83, 331, 1, 0, 0, 0, 85, 333, 1, 0, 0, 0, 87, 335, 1, 0, 0, 0, 89, 337, 1, 0, 0, 0, 91, 339,
230
- 1, 0, 0, 0, 93, 341, 1, 0, 0, 0, 95, 344, 1, 0, 0, 0, 97, 347, 1, 0, 0, 0, 99, 350, 1, 0,
231
- 0, 0, 101, 353, 1, 0, 0, 0, 103, 356, 1, 0, 0, 0, 105, 359, 1, 0, 0, 0, 107, 366, 1, 0,
232
- 0, 0, 109, 377, 1, 0, 0, 0, 111, 379, 1, 0, 0, 0, 113, 394, 1, 0, 0, 0, 115, 408, 1, 0,
233
- 0, 0, 117, 410, 1, 0, 0, 0, 119, 421, 1, 0, 0, 0, 121, 426, 1, 0, 0, 0, 123, 436, 1, 0,
234
- 0, 0, 125, 449, 1, 0, 0, 0, 127, 454, 1, 0, 0, 0, 129, 465, 1, 0, 0, 0, 131, 473, 1, 0,
235
- 0, 0, 133, 477, 1, 0, 0, 0, 135, 486, 1, 0, 0, 0, 137, 138, 5, 58, 0, 0, 138, 2, 1, 0, 0,
236
- 0, 139, 140, 5, 44, 0, 0, 140, 4, 1, 0, 0, 0, 141, 142, 5, 61, 0, 0, 142, 6, 1, 0, 0, 0,
237
- 143, 144, 5, 46, 0, 0, 144, 145, 5, 46, 0, 0, 145, 8, 1, 0, 0, 0, 146, 147, 5, 46, 0, 0,
238
- 147, 10, 1, 0, 0, 0, 148, 149, 5, 91, 0, 0, 149, 12, 1, 0, 0, 0, 150, 151, 5, 93, 0, 0,
239
- 151, 14, 1, 0, 0, 0, 152, 153, 5, 98, 0, 0, 153, 154, 5, 114, 0, 0, 154, 155, 5, 101,
240
- 0, 0, 155, 156, 5, 97, 0, 0, 156, 157, 5, 107, 0, 0, 157, 16, 1, 0, 0, 0, 158, 159, 5,
241
- 98, 0, 0, 159, 160, 5, 114, 0, 0, 160, 161, 5, 97, 0, 0, 161, 162, 5, 110, 0, 0, 162,
242
- 163, 5, 99, 0, 0, 163, 164, 5, 104, 0, 0, 164, 18, 1, 0, 0, 0, 165, 166, 5, 99, 0, 0, 166,
243
- 167, 5, 114, 0, 0, 167, 168, 5, 101, 0, 0, 168, 169, 5, 97, 0, 0, 169, 170, 5, 116, 0,
244
- 0, 170, 171, 5, 101, 0, 0, 171, 20, 1, 0, 0, 0, 172, 173, 5, 99, 0, 0, 173, 174, 5, 111,
245
- 0, 0, 174, 175, 5, 109, 0, 0, 175, 176, 5, 112, 0, 0, 176, 177, 5, 111, 0, 0, 177, 178,
246
- 5, 110, 0, 0, 178, 179, 5, 101, 0, 0, 179, 180, 5, 110, 0, 0, 180, 181, 5, 116, 0, 0,
247
- 181, 22, 1, 0, 0, 0, 182, 183, 5, 103, 0, 0, 183, 184, 5, 114, 0, 0, 184, 185, 5, 97,
248
- 0, 0, 185, 186, 5, 112, 0, 0, 186, 187, 5, 104, 0, 0, 187, 188, 5, 105, 0, 0, 188, 189,
249
- 5, 99, 0, 0, 189, 24, 1, 0, 0, 0, 190, 191, 5, 109, 0, 0, 191, 192, 5, 111, 0, 0, 192,
250
- 193, 5, 100, 0, 0, 193, 194, 5, 117, 0, 0, 194, 195, 5, 108, 0, 0, 195, 196, 5, 101,
251
- 0, 0, 196, 26, 1, 0, 0, 0, 197, 198, 5, 119, 0, 0, 198, 199, 5, 105, 0, 0, 199, 200, 5,
252
- 114, 0, 0, 200, 201, 5, 101, 0, 0, 201, 28, 1, 0, 0, 0, 202, 203, 5, 112, 0, 0, 203, 204,
253
- 5, 105, 0, 0, 204, 205, 5, 110, 0, 0, 205, 30, 1, 0, 0, 0, 206, 207, 5, 97, 0, 0, 207,
254
- 208, 5, 100, 0, 0, 208, 209, 5, 100, 0, 0, 209, 32, 1, 0, 0, 0, 210, 211, 5, 97, 0, 0,
255
- 211, 212, 5, 116, 0, 0, 212, 34, 1, 0, 0, 0, 213, 214, 5, 116, 0, 0, 214, 215, 5, 111,
256
- 0, 0, 215, 36, 1, 0, 0, 0, 216, 217, 5, 112, 0, 0, 217, 218, 5, 111, 0, 0, 218, 219, 5,
257
- 105, 0, 0, 219, 220, 5, 110, 0, 0, 220, 221, 5, 116, 0, 0, 221, 38, 1, 0, 0, 0, 222, 223,
258
- 5, 106, 0, 0, 223, 224, 5, 111, 0, 0, 224, 225, 5, 105, 0, 0, 225, 226, 5, 110, 0, 0,
259
- 226, 40, 1, 0, 0, 0, 227, 228, 5, 112, 0, 0, 228, 229, 5, 97, 0, 0, 229, 230, 5, 114,
260
- 0, 0, 230, 231, 5, 97, 0, 0, 231, 232, 5, 108, 0, 0, 232, 233, 5, 108, 0, 0, 233, 234,
261
- 5, 101, 0, 0, 234, 235, 5, 108, 0, 0, 235, 42, 1, 0, 0, 0, 236, 237, 5, 114, 0, 0, 237,
262
- 238, 5, 101, 0, 0, 238, 239, 5, 116, 0, 0, 239, 240, 5, 117, 0, 0, 240, 241, 5, 114,
263
- 0, 0, 241, 242, 5, 110, 0, 0, 242, 44, 1, 0, 0, 0, 243, 244, 5, 100, 0, 0, 244, 245, 5,
264
- 101, 0, 0, 245, 246, 5, 102, 0, 0, 246, 46, 1, 0, 0, 0, 247, 248, 5, 105, 0, 0, 248, 249,
265
- 5, 109, 0, 0, 249, 250, 5, 112, 0, 0, 250, 251, 5, 111, 0, 0, 251, 252, 5, 114, 0, 0,
266
- 252, 253, 5, 116, 0, 0, 253, 48, 1, 0, 0, 0, 254, 255, 5, 102, 0, 0, 255, 256, 5, 111,
267
- 0, 0, 256, 257, 5, 114, 0, 0, 257, 50, 1, 0, 0, 0, 258, 259, 5, 105, 0, 0, 259, 260, 5,
268
- 110, 0, 0, 260, 52, 1, 0, 0, 0, 261, 262, 5, 119, 0, 0, 262, 263, 5, 104, 0, 0, 263, 264,
269
- 5, 105, 0, 0, 264, 265, 5, 108, 0, 0, 265, 266, 5, 101, 0, 0, 266, 54, 1, 0, 0, 0, 267,
270
- 268, 5, 99, 0, 0, 268, 269, 5, 111, 0, 0, 269, 270, 5, 110, 0, 0, 270, 271, 5, 116, 0,
271
- 0, 271, 272, 5, 105, 0, 0, 272, 273, 5, 110, 0, 0, 273, 274, 5, 117, 0, 0, 274, 275,
272
- 5, 101, 0, 0, 275, 56, 1, 0, 0, 0, 276, 277, 5, 105, 0, 0, 277, 278, 5, 102, 0, 0, 278,
273
- 58, 1, 0, 0, 0, 279, 280, 5, 101, 0, 0, 280, 281, 5, 108, 0, 0, 281, 282, 5, 115, 0, 0,
274
- 282, 283, 5, 101, 0, 0, 283, 60, 1, 0, 0, 0, 284, 289, 5, 33, 0, 0, 285, 286, 5, 110,
275
- 0, 0, 286, 287, 5, 111, 0, 0, 287, 289, 5, 116, 0, 0, 288, 284, 1, 0, 0, 0, 288, 285,
276
- 1, 0, 0, 0, 289, 62, 1, 0, 0, 0, 290, 291, 5, 102, 0, 0, 291, 292, 5, 114, 0, 0, 292, 293,
277
- 5, 97, 0, 0, 293, 294, 5, 109, 0, 0, 294, 295, 5, 101, 0, 0, 295, 64, 1, 0, 0, 0, 296,
278
- 297, 5, 115, 0, 0, 297, 298, 5, 104, 0, 0, 298, 299, 5, 101, 0, 0, 299, 300, 5, 101,
279
- 0, 0, 300, 301, 5, 116, 0, 0, 301, 66, 1, 0, 0, 0, 302, 303, 5, 61, 0, 0, 303, 304, 5,
280
- 61, 0, 0, 304, 68, 1, 0, 0, 0, 305, 306, 5, 33, 0, 0, 306, 307, 5, 61, 0, 0, 307, 70, 1,
281
- 0, 0, 0, 308, 309, 5, 62, 0, 0, 309, 72, 1, 0, 0, 0, 310, 311, 5, 62, 0, 0, 311, 312, 5,
282
- 61, 0, 0, 312, 74, 1, 0, 0, 0, 313, 314, 5, 60, 0, 0, 314, 76, 1, 0, 0, 0, 315, 316, 5,
283
- 60, 0, 0, 316, 317, 5, 61, 0, 0, 317, 78, 1, 0, 0, 0, 318, 319, 5, 38, 0, 0, 319, 324,
204
+ 97, 122, 1, 0, 49, 57, 2, 0, 48, 57, 95, 95, 1, 0, 48, 57, 1, 0, 48, 48, 8, 0, 71, 71, 75,
205
+ 75, 77, 77, 102, 102, 107, 107, 109, 110, 112, 112, 117, 117, 3, 0, 48, 57, 65, 90,
206
+ 97, 122, 2, 0, 9, 9, 32, 32, 2, 0, 10, 10, 12, 13, 511, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0,
207
+ 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0,
208
+ 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0,
209
+ 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0,
210
+ 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0,
211
+ 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0,
212
+ 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0,
213
+ 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0,
214
+ 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0,
215
+ 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0,
216
+ 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0,
217
+ 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 115, 1,
218
+ 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0,
219
+ 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 1, 137, 1, 0,
220
+ 0, 0, 3, 139, 1, 0, 0, 0, 5, 141, 1, 0, 0, 0, 7, 143, 1, 0, 0, 0, 9, 146, 1, 0, 0, 0, 11, 148,
221
+ 1, 0, 0, 0, 13, 150, 1, 0, 0, 0, 15, 152, 1, 0, 0, 0, 17, 158, 1, 0, 0, 0, 19, 165, 1, 0,
222
+ 0, 0, 21, 172, 1, 0, 0, 0, 23, 182, 1, 0, 0, 0, 25, 190, 1, 0, 0, 0, 27, 197, 1, 0, 0, 0,
223
+ 29, 202, 1, 0, 0, 0, 31, 206, 1, 0, 0, 0, 33, 210, 1, 0, 0, 0, 35, 213, 1, 0, 0, 0, 37, 216,
224
+ 1, 0, 0, 0, 39, 222, 1, 0, 0, 0, 41, 227, 1, 0, 0, 0, 43, 236, 1, 0, 0, 0, 45, 243, 1, 0,
225
+ 0, 0, 47, 247, 1, 0, 0, 0, 49, 254, 1, 0, 0, 0, 51, 258, 1, 0, 0, 0, 53, 261, 1, 0, 0, 0,
226
+ 55, 267, 1, 0, 0, 0, 57, 276, 1, 0, 0, 0, 59, 279, 1, 0, 0, 0, 61, 288, 1, 0, 0, 0, 63, 290,
227
+ 1, 0, 0, 0, 65, 296, 1, 0, 0, 0, 67, 302, 1, 0, 0, 0, 69, 305, 1, 0, 0, 0, 71, 308, 1, 0,
228
+ 0, 0, 73, 310, 1, 0, 0, 0, 75, 313, 1, 0, 0, 0, 77, 315, 1, 0, 0, 0, 79, 323, 1, 0, 0, 0,
229
+ 81, 329, 1, 0, 0, 0, 83, 331, 1, 0, 0, 0, 85, 333, 1, 0, 0, 0, 87, 335, 1, 0, 0, 0, 89, 337,
230
+ 1, 0, 0, 0, 91, 339, 1, 0, 0, 0, 93, 341, 1, 0, 0, 0, 95, 344, 1, 0, 0, 0, 97, 347, 1, 0,
231
+ 0, 0, 99, 350, 1, 0, 0, 0, 101, 353, 1, 0, 0, 0, 103, 356, 1, 0, 0, 0, 105, 359, 1, 0, 0,
232
+ 0, 107, 366, 1, 0, 0, 0, 109, 377, 1, 0, 0, 0, 111, 379, 1, 0, 0, 0, 113, 394, 1, 0, 0,
233
+ 0, 115, 408, 1, 0, 0, 0, 117, 410, 1, 0, 0, 0, 119, 421, 1, 0, 0, 0, 121, 426, 1, 0, 0,
234
+ 0, 123, 436, 1, 0, 0, 0, 125, 449, 1, 0, 0, 0, 127, 454, 1, 0, 0, 0, 129, 465, 1, 0, 0,
235
+ 0, 131, 473, 1, 0, 0, 0, 133, 477, 1, 0, 0, 0, 135, 486, 1, 0, 0, 0, 137, 138, 5, 58, 0,
236
+ 0, 138, 2, 1, 0, 0, 0, 139, 140, 5, 44, 0, 0, 140, 4, 1, 0, 0, 0, 141, 142, 5, 61, 0, 0,
237
+ 142, 6, 1, 0, 0, 0, 143, 144, 5, 46, 0, 0, 144, 145, 5, 46, 0, 0, 145, 8, 1, 0, 0, 0, 146,
238
+ 147, 5, 46, 0, 0, 147, 10, 1, 0, 0, 0, 148, 149, 5, 91, 0, 0, 149, 12, 1, 0, 0, 0, 150,
239
+ 151, 5, 93, 0, 0, 151, 14, 1, 0, 0, 0, 152, 153, 5, 98, 0, 0, 153, 154, 5, 114, 0, 0, 154,
240
+ 155, 5, 101, 0, 0, 155, 156, 5, 97, 0, 0, 156, 157, 5, 107, 0, 0, 157, 16, 1, 0, 0, 0,
241
+ 158, 159, 5, 98, 0, 0, 159, 160, 5, 114, 0, 0, 160, 161, 5, 97, 0, 0, 161, 162, 5, 110,
242
+ 0, 0, 162, 163, 5, 99, 0, 0, 163, 164, 5, 104, 0, 0, 164, 18, 1, 0, 0, 0, 165, 166, 5,
243
+ 99, 0, 0, 166, 167, 5, 114, 0, 0, 167, 168, 5, 101, 0, 0, 168, 169, 5, 97, 0, 0, 169,
244
+ 170, 5, 116, 0, 0, 170, 171, 5, 101, 0, 0, 171, 20, 1, 0, 0, 0, 172, 173, 5, 99, 0, 0,
245
+ 173, 174, 5, 111, 0, 0, 174, 175, 5, 109, 0, 0, 175, 176, 5, 112, 0, 0, 176, 177, 5,
246
+ 111, 0, 0, 177, 178, 5, 110, 0, 0, 178, 179, 5, 101, 0, 0, 179, 180, 5, 110, 0, 0, 180,
247
+ 181, 5, 116, 0, 0, 181, 22, 1, 0, 0, 0, 182, 183, 5, 103, 0, 0, 183, 184, 5, 114, 0, 0,
248
+ 184, 185, 5, 97, 0, 0, 185, 186, 5, 112, 0, 0, 186, 187, 5, 104, 0, 0, 187, 188, 5, 105,
249
+ 0, 0, 188, 189, 5, 99, 0, 0, 189, 24, 1, 0, 0, 0, 190, 191, 5, 109, 0, 0, 191, 192, 5,
250
+ 111, 0, 0, 192, 193, 5, 100, 0, 0, 193, 194, 5, 117, 0, 0, 194, 195, 5, 108, 0, 0, 195,
251
+ 196, 5, 101, 0, 0, 196, 26, 1, 0, 0, 0, 197, 198, 5, 119, 0, 0, 198, 199, 5, 105, 0, 0,
252
+ 199, 200, 5, 114, 0, 0, 200, 201, 5, 101, 0, 0, 201, 28, 1, 0, 0, 0, 202, 203, 5, 112,
253
+ 0, 0, 203, 204, 5, 105, 0, 0, 204, 205, 5, 110, 0, 0, 205, 30, 1, 0, 0, 0, 206, 207, 5,
254
+ 97, 0, 0, 207, 208, 5, 100, 0, 0, 208, 209, 5, 100, 0, 0, 209, 32, 1, 0, 0, 0, 210, 211,
255
+ 5, 97, 0, 0, 211, 212, 5, 116, 0, 0, 212, 34, 1, 0, 0, 0, 213, 214, 5, 116, 0, 0, 214,
256
+ 215, 5, 111, 0, 0, 215, 36, 1, 0, 0, 0, 216, 217, 5, 112, 0, 0, 217, 218, 5, 111, 0, 0,
257
+ 218, 219, 5, 105, 0, 0, 219, 220, 5, 110, 0, 0, 220, 221, 5, 116, 0, 0, 221, 38, 1, 0,
258
+ 0, 0, 222, 223, 5, 106, 0, 0, 223, 224, 5, 111, 0, 0, 224, 225, 5, 105, 0, 0, 225, 226,
259
+ 5, 110, 0, 0, 226, 40, 1, 0, 0, 0, 227, 228, 5, 112, 0, 0, 228, 229, 5, 97, 0, 0, 229,
260
+ 230, 5, 114, 0, 0, 230, 231, 5, 97, 0, 0, 231, 232, 5, 108, 0, 0, 232, 233, 5, 108, 0,
261
+ 0, 233, 234, 5, 101, 0, 0, 234, 235, 5, 108, 0, 0, 235, 42, 1, 0, 0, 0, 236, 237, 5, 114,
262
+ 0, 0, 237, 238, 5, 101, 0, 0, 238, 239, 5, 116, 0, 0, 239, 240, 5, 117, 0, 0, 240, 241,
263
+ 5, 114, 0, 0, 241, 242, 5, 110, 0, 0, 242, 44, 1, 0, 0, 0, 243, 244, 5, 100, 0, 0, 244,
264
+ 245, 5, 101, 0, 0, 245, 246, 5, 102, 0, 0, 246, 46, 1, 0, 0, 0, 247, 248, 5, 105, 0, 0,
265
+ 248, 249, 5, 109, 0, 0, 249, 250, 5, 112, 0, 0, 250, 251, 5, 111, 0, 0, 251, 252, 5,
266
+ 114, 0, 0, 252, 253, 5, 116, 0, 0, 253, 48, 1, 0, 0, 0, 254, 255, 5, 102, 0, 0, 255, 256,
267
+ 5, 111, 0, 0, 256, 257, 5, 114, 0, 0, 257, 50, 1, 0, 0, 0, 258, 259, 5, 105, 0, 0, 259,
268
+ 260, 5, 110, 0, 0, 260, 52, 1, 0, 0, 0, 261, 262, 5, 119, 0, 0, 262, 263, 5, 104, 0, 0,
269
+ 263, 264, 5, 105, 0, 0, 264, 265, 5, 108, 0, 0, 265, 266, 5, 101, 0, 0, 266, 54, 1, 0,
270
+ 0, 0, 267, 268, 5, 99, 0, 0, 268, 269, 5, 111, 0, 0, 269, 270, 5, 110, 0, 0, 270, 271,
271
+ 5, 116, 0, 0, 271, 272, 5, 105, 0, 0, 272, 273, 5, 110, 0, 0, 273, 274, 5, 117, 0, 0,
272
+ 274, 275, 5, 101, 0, 0, 275, 56, 1, 0, 0, 0, 276, 277, 5, 105, 0, 0, 277, 278, 5, 102,
273
+ 0, 0, 278, 58, 1, 0, 0, 0, 279, 280, 5, 101, 0, 0, 280, 281, 5, 108, 0, 0, 281, 282, 5,
274
+ 115, 0, 0, 282, 283, 5, 101, 0, 0, 283, 60, 1, 0, 0, 0, 284, 289, 5, 33, 0, 0, 285, 286,
275
+ 5, 110, 0, 0, 286, 287, 5, 111, 0, 0, 287, 289, 5, 116, 0, 0, 288, 284, 1, 0, 0, 0, 288,
276
+ 285, 1, 0, 0, 0, 289, 62, 1, 0, 0, 0, 290, 291, 5, 102, 0, 0, 291, 292, 5, 114, 0, 0, 292,
277
+ 293, 5, 97, 0, 0, 293, 294, 5, 109, 0, 0, 294, 295, 5, 101, 0, 0, 295, 64, 1, 0, 0, 0,
278
+ 296, 297, 5, 115, 0, 0, 297, 298, 5, 104, 0, 0, 298, 299, 5, 101, 0, 0, 299, 300, 5,
279
+ 101, 0, 0, 300, 301, 5, 116, 0, 0, 301, 66, 1, 0, 0, 0, 302, 303, 5, 61, 0, 0, 303, 304,
280
+ 5, 61, 0, 0, 304, 68, 1, 0, 0, 0, 305, 306, 5, 33, 0, 0, 306, 307, 5, 61, 0, 0, 307, 70,
281
+ 1, 0, 0, 0, 308, 309, 5, 62, 0, 0, 309, 72, 1, 0, 0, 0, 310, 311, 5, 62, 0, 0, 311, 312,
282
+ 5, 61, 0, 0, 312, 74, 1, 0, 0, 0, 313, 314, 5, 60, 0, 0, 314, 76, 1, 0, 0, 0, 315, 316,
283
+ 5, 60, 0, 0, 316, 317, 5, 61, 0, 0, 317, 78, 1, 0, 0, 0, 318, 319, 5, 38, 0, 0, 319, 324,
284
284
  5, 38, 0, 0, 320, 321, 5, 97, 0, 0, 321, 322, 5, 110, 0, 0, 322, 324, 5, 100, 0, 0, 323,
285
285
  318, 1, 0, 0, 0, 323, 320, 1, 0, 0, 0, 324, 80, 1, 0, 0, 0, 325, 326, 5, 124, 0, 0, 326,
286
286
  330, 5, 124, 0, 0, 327, 328, 5, 111, 0, 0, 328, 330, 5, 114, 0, 0, 329, 325, 1, 0, 0,