From 8f15cdf0841c329050136b9a153992ef6f8232eb Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Mon, 10 Jun 2024 18:11:49 +0200 Subject: [PATCH 01/56] Added random number generator --- .../context/BuiltinFunctionCatalogue.java | 53 +++++++++++++++++++ .../random/RandomNumberGeneratorIterator.java | 32 +++++++++++ .../RandomSequenceGeneratorIterator.java | 34 ++++++++++++ ...mSequenceWithoutSeedGeneratorIterator.java | 32 +++++++++++ .../FunctionRandom/RandomSequenceWithSeed.jq | 2 + 5 files changed, 153 insertions(+) create mode 100644 src/main/java/org/rumbledb/runtime/functions/random/RandomNumberGeneratorIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithoutSeedGeneratorIterator.java create mode 100644 src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java index 8ff2d1970..9a54c6540 100644 --- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java +++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java @@ -91,6 +91,9 @@ import org.rumbledb.runtime.functions.object.ObjectProjectFunctionIterator; import org.rumbledb.runtime.functions.object.ObjectRemoveKeysFunctionIterator; import org.rumbledb.runtime.functions.object.ObjectValuesFunctionIterator; +import org.rumbledb.runtime.functions.random.RandomNumberGeneratorIterator; +import org.rumbledb.runtime.functions.random.RandomSequenceGeneratorIterator; +import org.rumbledb.runtime.functions.random.RandomSequenceWithoutSeedGeneratorIterator; import org.rumbledb.runtime.functions.sequences.aggregate.AvgFunctionIterator; import org.rumbledb.runtime.functions.sequences.aggregate.CountFunctionIterator; import org.rumbledb.runtime.functions.sequences.aggregate.MaxFunctionIterator; @@ -2677,6 +2680,53 @@ private static BuiltinFunction createBuiltinFunction( BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); + /** + * function that returns a random number + */ + static final BuiltinFunction random_number_generator = createBuiltinFunction( + new Name( + Name.FN_NS, + "", + "random" + ), + "double", + RandomNumberGeneratorIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + + /** + * function that returns a sequence of random numbers + */ + static final BuiltinFunction random_sequence_generator = createBuiltinFunction( + new Name( + Name.FN_NS, + "", + "random_sequence" + ), + "integer", + "item*", + RandomSequenceWithoutSeedGeneratorIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + + /** + * function that returns a sequence of random numbers using a seed + */ + static final BuiltinFunction random_sequence_generator_with_seed = createBuiltinFunction( + new Name( + Name.FN_NS, + "", + "random_sequence" + ), + "integer", + "integer", + "item*", + RandomSequenceGeneratorIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + + + static { builtinFunctions = new HashMap<>(); @@ -2880,6 +2930,9 @@ private static BuiltinFunction createBuiltinFunction( builtinFunctions.put(binary_classification_metrics1.getIdentifier(), binary_classification_metrics1); builtinFunctions.put(binary_classification_metrics2.getIdentifier(), binary_classification_metrics2); builtinFunctions.put(print_variable_values.getIdentifier(), print_variable_values); + builtinFunctions.put(random_number_generator.getIdentifier(), random_number_generator); + builtinFunctions.put(random_sequence_generator.getIdentifier(), random_sequence_generator); + builtinFunctions.put(random_sequence_generator_with_seed.getIdentifier(), random_sequence_generator_with_seed); } diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomNumberGeneratorIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomNumberGeneratorIterator.java new file mode 100644 index 000000000..623ae8359 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomNumberGeneratorIterator.java @@ -0,0 +1,32 @@ +package org.rumbledb.runtime.functions.random; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.items.ItemFactory; +import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.List; +import java.util.Random; + +/** + * Implementation based on W3C spec: ... + */ +public class RandomNumberGeneratorIterator extends AtMostOneItemLocalRuntimeIterator { + + private static final long serialVersionUID = 1L; + + public RandomNumberGeneratorIterator( + List arguments, + RuntimeStaticContext staticContext + ) { + super(arguments, staticContext); + } + + @Override + public Item materializeFirstItemOrNull(DynamicContext dynamicContext) { + Random random = new Random(); + return ItemFactory.getInstance().createDoubleItem(random.nextDouble()); + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java new file mode 100644 index 000000000..bcb082a3a --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java @@ -0,0 +1,34 @@ +package org.rumbledb.runtime.functions.random; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.items.ItemFactory; +import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class RandomSequenceGeneratorIterator extends AtMostOneItemLocalRuntimeIterator { + private static final long serialVersionUID = 1L; + + public RandomSequenceGeneratorIterator(List arguments, RuntimeStaticContext staticContext) { + super(arguments, staticContext); + } + + @Override + public Item materializeFirstItemOrNull(DynamicContext context) { + Random random = new Random(); + List randomSequence = new ArrayList<>(); + + Item sequenceLength = this.children.get(0).materializeFirstItemOrNull(context); + Item seed = this.children.get(1).materializeFirstItemOrNull(context); + random.setSeed(seed.castToIntValue()); + random.doubles(sequenceLength.castToIntValue()).forEach(randomDouble -> { + randomSequence.add(ItemFactory.getInstance().createDoubleItem(randomDouble)); + }); + return ItemFactory.getInstance().createArrayItem(randomSequence); + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithoutSeedGeneratorIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithoutSeedGeneratorIterator.java new file mode 100644 index 000000000..e520d78b7 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithoutSeedGeneratorIterator.java @@ -0,0 +1,32 @@ +package org.rumbledb.runtime.functions.random; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.items.ItemFactory; +import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class RandomSequenceWithoutSeedGeneratorIterator extends AtMostOneItemLocalRuntimeIterator { + public RandomSequenceWithoutSeedGeneratorIterator( + List children, + RuntimeStaticContext staticContext + ) { + super(children, staticContext); + } + + @Override + public Item materializeFirstItemOrNull(DynamicContext context) { + Random random = new Random(); + Item sequenceLength = this.children.get(0).materializeFirstItemOrNull(context); + List randomSequence = new ArrayList<>(); + random.doubles(sequenceLength.castToIntValue()).forEach(randomDouble -> { + randomSequence.add(ItemFactory.getInstance().createDoubleItem(randomDouble)); + }); + return ItemFactory.getInstance().createArrayItem(randomSequence); + } +} diff --git a/src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq b/src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq new file mode 100644 index 000000000..fc25497b8 --- /dev/null +++ b/src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="([ 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316 ], [ 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316 ], [ 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316 ], [ 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316 ])":) +fn:random_sequence(5, 10),fn:random_sequence(5, 10),fn:random_sequence(5, 10),fn:random_sequence(5, 10) \ No newline at end of file From a53baad18bef563e77f8135a2f282255f166cca2 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Tue, 11 Jun 2024 20:39:39 +0200 Subject: [PATCH 02/56] Refactored random function naming --- .../context/BuiltinFunctionCatalogue.java | 41 ++++++++++++++++++- .../RandomSequenceGeneratorIterator.java | 4 +- .../random/RandomSequenceWithBounds.java | 37 +++++++++++++++++ .../FunctionRandom/RandomSequenceWithSeed.jq | 2 +- 4 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBounds.java diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java index 9a54c6540..8f9ed6cb4 100644 --- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java +++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java @@ -93,6 +93,7 @@ import org.rumbledb.runtime.functions.object.ObjectValuesFunctionIterator; import org.rumbledb.runtime.functions.random.RandomNumberGeneratorIterator; import org.rumbledb.runtime.functions.random.RandomSequenceGeneratorIterator; +import org.rumbledb.runtime.functions.random.RandomSequenceWithBounds; import org.rumbledb.runtime.functions.random.RandomSequenceWithoutSeedGeneratorIterator; import org.rumbledb.runtime.functions.sequences.aggregate.AvgFunctionIterator; import org.rumbledb.runtime.functions.sequences.aggregate.CountFunctionIterator; @@ -2701,7 +2702,7 @@ private static BuiltinFunction createBuiltinFunction( new Name( Name.FN_NS, "", - "random_sequence" + "random" ), "integer", "item*", @@ -2716,7 +2717,7 @@ private static BuiltinFunction createBuiltinFunction( new Name( Name.FN_NS, "", - "random_sequence" + "seeded_random" ), "integer", "integer", @@ -2725,6 +2726,40 @@ private static BuiltinFunction createBuiltinFunction( BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); + /** + * function that returns a sequence of random numbers using a low and high bound, while also allowing to limit the + * number of elements generated and their type + */ + static final BuiltinFunction random_sequence_with_bounds = createBuiltinFunction( + new Name( + Name.FN_NS, + "", + "random-between" + ), + "integer", + "integer", + "integer", + "string", + "item*", + RandomSequenceWithBounds.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + + static final BuiltinFunction random_sequence_with_bounds_double = createBuiltinFunction( + new Name( + Name.FN_NS, + "", + "random-between" + ), + "double", + "double", + "integer", + "string", + "item*", + RandomSequenceWithBounds.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + static { @@ -2933,6 +2968,8 @@ private static BuiltinFunction createBuiltinFunction( builtinFunctions.put(random_number_generator.getIdentifier(), random_number_generator); builtinFunctions.put(random_sequence_generator.getIdentifier(), random_sequence_generator); builtinFunctions.put(random_sequence_generator_with_seed.getIdentifier(), random_sequence_generator_with_seed); + builtinFunctions.put(random_sequence_with_bounds.getIdentifier(), random_sequence_with_bounds); + builtinFunctions.put(random_sequence_with_bounds_double.getIdentifier(), random_sequence_with_bounds_double); } diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java index bcb082a3a..9e7535470 100644 --- a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java @@ -23,8 +23,8 @@ public Item materializeFirstItemOrNull(DynamicContext context) { Random random = new Random(); List randomSequence = new ArrayList<>(); - Item sequenceLength = this.children.get(0).materializeFirstItemOrNull(context); - Item seed = this.children.get(1).materializeFirstItemOrNull(context); + Item seed = this.children.get(0).materializeFirstItemOrNull(context); + Item sequenceLength = this.children.get(1).materializeFirstItemOrNull(context); random.setSeed(seed.castToIntValue()); random.doubles(sequenceLength.castToIntValue()).forEach(randomDouble -> { randomSequence.add(ItemFactory.getInstance().createDoubleItem(randomDouble)); diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBounds.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBounds.java new file mode 100644 index 000000000..a680f2235 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBounds.java @@ -0,0 +1,37 @@ +package org.rumbledb.runtime.functions.random; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.items.ItemFactory; +import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class RandomSequenceWithBounds extends AtMostOneItemLocalRuntimeIterator { + public RandomSequenceWithBounds(List children, RuntimeStaticContext staticContext) { + super(children, staticContext); + } + + @Override + public Item materializeFirstItemOrNull(DynamicContext context) { + Item low = this.children.get(0).materializeFirstItemOrNull(context); + Item high = this.children.get(1).materializeFirstItemOrNull(context); + Item size = this.children.get(2).materializeFirstItemOrNull(context); + Item type = this.children.get(3).materializeFirstItemOrNull(context); + Random random = new Random(); + List result = new ArrayList<>(); + if (type.getStringValue().equals("integer")) { + random.ints(size.castToIntValue(), low.castToIntValue(), high.castToIntValue()) + .forEach(randomInteger -> result.add(ItemFactory.getInstance().createIntItem(randomInteger))); + } else { + // Generate doubles otherwise + random.doubles(size.castToIntValue(), low.castToDoubleValue(), high.castToDoubleValue()) + .forEach(randomDouble -> result.add(ItemFactory.getInstance().createDoubleItem(randomDouble))); + } + return ItemFactory.getInstance().createArrayItem(result); + } +} diff --git a/src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq b/src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq index fc25497b8..6a7fd5233 100644 --- a/src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq +++ b/src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq @@ -1,2 +1,2 @@ (:JIQS: ShouldRun; Output="([ 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316 ], [ 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316 ], [ 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316 ], [ 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316 ])":) -fn:random_sequence(5, 10),fn:random_sequence(5, 10),fn:random_sequence(5, 10),fn:random_sequence(5, 10) \ No newline at end of file +fn:seeded_random(10, 5),fn:seeded_random(10, 5),fn:seeded_random(10, 5),fn:seeded_random(10, 5) \ No newline at end of file From 7b6fc14db7fd96a33b3d92e092e782312e3e453a Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Wed, 12 Jun 2024 13:21:28 +0200 Subject: [PATCH 03/56] Introduced error function to rumbledb --- .../context/BuiltinFunctionCatalogue.java | 38 ++ .../rumbledb/exceptions/RumbleException.java | 2 +- .../functions/error/ThrowErrorIterator.java | 41 ++ .../runtime/numpy_lib/jsoniq_numpy.jq | 372 ++++++++++++++++++ .../runtime/numpy_lib/jsoniq_utils.jq | 15 + .../numpy_lib/test_jsoniq_numpy_arange.jq | 3 + .../numpy_lib/test_jsoniq_numpy_binsearch.jq | 3 + .../numpy_lib/test_jsoniq_numpy_digitize.jq | 3 + .../numpy_lib/test_jsoniq_numpy_full.jq | 5 + .../numpy_lib/test_jsoniq_numpy_identity.jq | 3 + .../numpy_lib/test_jsoniq_numpy_linspace.jq | 3 + .../numpy_lib/test_jsoniq_numpy_logspace.jq | 4 + .../numpy_lib/test_jsoniq_numpy_ones.jq | 3 + .../numpy_lib/test_jsoniq_numpy_random.jq | 3 + .../numpy_lib/test_jsoniq_numpy_zeros.jq | 3 + 15 files changed, 500 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/rumbledb/runtime/functions/error/ThrowErrorIterator.java create mode 100644 src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_arange.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_binsearch.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_full.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_identity.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java index 8f9ed6cb4..01e4b06f9 100644 --- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java +++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java @@ -44,6 +44,7 @@ import org.rumbledb.runtime.functions.durations.components.MonthsFromDurationFunctionIterator; import org.rumbledb.runtime.functions.durations.components.SecondsFromDurationFunctionIterator; import org.rumbledb.runtime.functions.durations.components.YearsFromDurationFunctionIterator; +import org.rumbledb.runtime.functions.error.ThrowErrorIterator; import org.rumbledb.runtime.functions.input.AvroFileFunctionIterator; import org.rumbledb.runtime.functions.input.CSVFileFunctionIterator; import org.rumbledb.runtime.functions.input.JsonFileFunctionIterator; @@ -2760,7 +2761,41 @@ private static BuiltinFunction createBuiltinFunction( BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); + static final BuiltinFunction error = createBuiltinFunction( + new Name( + Name.FN_NS, + "", + "error" + ), + "null?", + ThrowErrorIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + static final BuiltinFunction error_with_code = createBuiltinFunction( + new Name( + Name.FN_NS, + "", + "error" + ), + "string", + "null?", + ThrowErrorIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + + static final BuiltinFunction error_with_code_and_description = createBuiltinFunction( + new Name( + Name.FN_NS, + "", + "error" + ), + "string", + "string", + "null?", + ThrowErrorIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); static { builtinFunctions = new HashMap<>(); @@ -2970,6 +3005,9 @@ private static BuiltinFunction createBuiltinFunction( builtinFunctions.put(random_sequence_generator_with_seed.getIdentifier(), random_sequence_generator_with_seed); builtinFunctions.put(random_sequence_with_bounds.getIdentifier(), random_sequence_with_bounds); builtinFunctions.put(random_sequence_with_bounds_double.getIdentifier(), random_sequence_with_bounds_double); + builtinFunctions.put(error.getIdentifier(), error); + builtinFunctions.put(error_with_code.getIdentifier(), error_with_code); + builtinFunctions.put(error_with_code_and_description.getIdentifier(), error_with_code_and_description); } diff --git a/src/main/java/org/rumbledb/exceptions/RumbleException.java b/src/main/java/org/rumbledb/exceptions/RumbleException.java index e799cb9a3..36eef0c73 100644 --- a/src/main/java/org/rumbledb/exceptions/RumbleException.java +++ b/src/main/java/org/rumbledb/exceptions/RumbleException.java @@ -41,7 +41,7 @@ public class RumbleException extends RuntimeException { this.metadata = ExceptionMetadata.EMPTY_METADATA; } - RumbleException(String message, ErrorCode errorCode) { + public RumbleException(String message, ErrorCode errorCode) { super(formatMessage(errorCode, ExceptionMetadata.EMPTY_METADATA, message)); if (!Arrays.asList(ErrorCode.class.getFields()).stream().anyMatch(f -> { try { diff --git a/src/main/java/org/rumbledb/runtime/functions/error/ThrowErrorIterator.java b/src/main/java/org/rumbledb/runtime/functions/error/ThrowErrorIterator.java new file mode 100644 index 000000000..d26fad2ce --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/error/ThrowErrorIterator.java @@ -0,0 +1,41 @@ +package org.rumbledb.runtime.functions.error; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.errorcodes.ErrorCode; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.exceptions.RumbleException; +import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.List; + +public class ThrowErrorIterator extends AtMostOneItemLocalRuntimeIterator { + public ThrowErrorIterator(List children, RuntimeStaticContext staticContext) { + super(children, staticContext); + } + + @Override + public Item materializeFirstItemOrNull(DynamicContext context) { + if (this.children.isEmpty()) { + // No argument case. + throw new RumbleException( + "An error has been raised without an error description or code.", + ExceptionMetadata.EMPTY_METADATA + ); + } else if (this.children.size() == 1) { + // Error code argument case. + Item errorCode = this.children.get(0).materializeFirstItemOrNull(context); + throw new RumbleException( + "An error has been raised without an error description.", + ErrorCode.valueOf(errorCode.toString()) + ); + } else { + // Error code and description arguments case. + Item errorCode = this.children.get(0).materializeFirstItemOrNull(context); + Item description = this.children.get(1).materializeFirstItemOrNull(context); + throw new RumbleException(description.toString(), ErrorCode.valueOf(errorCode.toString())); + } + } +} diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq new file mode 100644 index 000000000..0a6404dff --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -0,0 +1,372 @@ +(:JIQS: ShouldNotParse; ErrorCode="XPST0003"; ErrorMetadata="LINE:1:COLUMN:0:" :) +module namespace jsoniq_numpy = "jsoniq_numpy.jq"; +(: Helper function for zeros :) +declare function jsoniq_numpy:zeros($shape as array, $zero, $i as integer) { + if ($i eq size($shape)) then + let $join := + for $j in 1 to $shape[[$i]] + return $zero + return [$join] + else + let $join := + for $j in 1 to $shape[[$i]] + return jsoniq_numpy:zeros($shape, $zero, $i + 1) + return [$join] +}; +(: Zeros method creates an array filled with 0 values. +Required parameters are: +- shape (array): contains the size of each dimension of the resulting array. For one dimensional arrays, a single value within is array is expected - e.g., [7] results in a 1 dimensional array with 7 zeroed elements. +Params is an object for optional arguments. These arguments are: +- type (string): the enforced type of the resulting array. +To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value:) +declare function jsoniq_numpy:zeros($shape as array, $type as string) { + variable $zero; + switch ($type) + case "string" return $zero := 0 cast as string; + case "integer" return $zero := 0 cast as integer; + case "decimal" return $zero := 0 cast as decimal; + case "double" return $zero := 0 cast as double; + default return $zero := 0 cast as integer; + if (size($shape) eq 1) then + let $join := for $j in 1 to $shape[[1]] + return $zero + return [$join] + else + let $i := 1 + let $join := + for $j in 1 to $shape[[$i]] + return jsoniq_numpy:zeros($shape, $zero, $i + 1) + return [$join] +}; + +(: Helper function for ones :) +declare function jsoniq_numpy:ones($shape as array, $one, $i as integer) { + if ($i eq size($shape)) then + let $join := + for $j in 1 to $shape[[$i]] + return $one + return [$join] + else + let $join := + for $j in 1 to $shape[[$i]] + return jsoniq_numpy:ones($shape, $one, $i + 1) + return [$join] + +}; +(: +Required parameters are: +- shape (array): contains the size of each dimension of the resulting array. For one dimensional arrays, a single value within is array is expected - e.g., [7] results in a 1 dimensional array with 7 elements with value 1. +Params is an object for optional arguments. These arguments are: +- type (string): the enforced type of the resulting array. +To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value +:) +declare function jsoniq_numpy:ones($shape as array, $type as string) { + variable $one; + switch ($type) + case "string" return $one := 1 cast as string; + case "integer" return $one := 1 cast as integer; + case "decimal" return $one := 1 cast as decimal; + case "double" return $one := 1 cast as double; + default return $one := 1 cast as integer; + if (size($shape) eq 1) then + let $join := for $j in 1 to $shape[[1]] + return $one + return [$join] + else + let $i := 1 + let $join := + for $j in 1 to $shape[[$i]] + return jsoniq_numpy:ones($shape, $one, $i + 1) + return [$join] +}; + + +(: +declare function local:min_array($array1 as array, $array2 as array) { + +}; + +declare function local:min_rec($array as array, $axis as integer, $dim as integer) { + if ($dim eq 0) then {();} + else { + if ($dim eq $axis) then { + (: Take the first array as minimum :) + variable $mini := $array[[1]]; + for $i in 2 to $dim + return $mini := local:min_array($mini, $array[[$i]]); + exit returning $mini; + } else { + for $i in 1 to $dim + return [local:min_rec($array[[$i]], $axis, size($array[[$i]]))]; + } + } +}; + +declare function local:min($array as array, $axis as integer) { + local:min_res($array, $axis, size($array)) +}; +:) + +(: +Return evenly spaced numbers over a specified interval. Returns num evenly spaced samples, calculated over the interval [start, stop]. The endpoint of the interval can optionally be excluded. +Note: we currently only support one-dimensional results. +Required params are: +- start (integer) - the start value bounding the generated sequence +- end (integer) - the end value bounding the generated sequence +Params is an object for optional arguments. These arguments are: +- num (integer): number of samples to generate. Default is 50. +- endpoint (bool): if true, stop is the last sample. Otherwise it is not included. Default is true. +- retstep (bool): if true, returns the step used which denotes the spacing of values. Default is false. +- dtype UNSUPPORTED: return is always double. +- axis UNSUPPORTED. +To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value:) +declare function jsoniq_numpy:linspace($start as integer, $end as integer, $params as object) { + if ($params.endpoint eq true) then + if ($params.num lt 0) then + (: error case :) + [] + else + let $num := $params.num + let $range := $end - $start + let $step := $range div ($num - 1) + let $res := + for $i in 1 to $num + return if ($i eq $num) then float($start + ($i - 1) * $step) + else $start + ($i - 1) * $step + return + if ($params.retstep eq true) then ([$res], $step) + else [$res] + else + if ($params.num lt 0) then + (: error case :) + [] + else + let $num := $params.num + let $range := $end - $start + let $step := $range div $num + let $res := + for $i in 1 to $num + return if ($i eq $num) then float($start + ($i - 1) * $step) + else $start + ($i - 1) * $step + return + if ($params.retstep eq true) then ([$res], $step) + else [$res] +}; + +(: +arange can be called with a combination of parameters: +- arange(stop): Values are generated within the half-open interval [0, stop) (in other words, the interval including start but excluding stop). +- arange(start, stop): Values are generated within the half-open interval [start, stop). +- arange(start, stop, step) Values are generated within the half-open interval [start, stop), with spacing between values given by step. +Required params are: +- stop (double): marks the end of the interval +Params is an object for optional arguments. These arguments are: +- start (double): the start of the interval. Default value is 0. +- stop (double): the end of the interval. +- step (double): the spacing of output values. Default value is 1. +- dtype (string): type of the returned array. The possible values include "integer" or "double". +To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value +:) +declare function jsoniq_numpy:arange($stop as double, $params as object) { + (: ADD LOGIC FOR WHEN PARAMS ARE MISSING :) + if ($params.start gt $stop) then [] + else + if ($params.start + $params.step gt $stop or $params.step eq 0) then [$params.start] + else + let $num_values := integer(ceiling(($stop - $params.start) div $params.step)) + let $res := for $i in 1 to $num_values + return $params.start + ($i - 1) * $params.step + return [$res] +}; + +(: Function generates a single random value of type double :) +declare function jsoniq_numpy:random() { + fn:random() +}; + +(: Function generates a sequence of random values of type double. +Required params are: +- length (integer): the length of the resulting sequence :) +declare function jsoniq_numpy:random($length as integer) { + fn:random($length) +}; + +(: TODO: any dimension array :) +declare function jsoniq_numpy:random_size($size as array) { + +}; + + +(: Function generates a random sample from a uniform distribution between a lower and higher limit (not inclusive). Params is an object for optional arguments. These arguments are: + - low (double): the lower bound for generated objects. Default value is 0.0 + - high (double): the upper bound for generated objects. Default value is 1.0 + - size (integer): the size of the resulting array. Default is 10. +To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value :) +declare function jsoniq_numpy:random_uniform($params as object) { + let $low := $params.low + let $high := $params.high + let $size := $params.size + return fn:random-between($low, $high, $size, "double") +}; + +(: Function generates a random sample from a uniform distribution between a lower and higher limit (not inclusive), but with type int. +Required params are: + - low (integer): the lower bound for generated objects if high is also present. Otherwise, it determines the upperbound. Without high, it makes the sequence be bounded by [0, low), otherwise it makes it bound by [low, high). +Params is an object for optional arguments. These arguments are: + - high (integer): the upper bound for generated objects. Default value is 1 + - size (integer): the size of the resulting array. Default is 10 +To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value :) + declare function jsoniq_numpy:random_randint($low as integer, $params as object) { + let $high := $params.high + let $size := $params.size + return fn:random-between($low, $high, $size, "integer") + }; + +(: Generate evenly spaced numbers on a log scale in base 10. +Required parameters are: + - start (integer): 10 ** start is the starting value of the sequence. + - end (integer): 10 ** end is the end value of the sequence. +Params is an object for optional arguments. These arguments are: + - num (integer): number of samples to generate. Default is 50. + - endpoint (bool): if true, stop is the last sample. Otherwise it is not included. Default is true. + - base UNSUPPORTED: base 10 is always used. + - dtype UNSUPPORTED: return is always double. + - axis UNSUPPORTED.:) +declare function jsoniq_numpy:logspace($start as integer, $end as integer, $params as object) { + if ($params.endpoint eq true) then + if ($params.num lt 0) then + (: error case :) + [] + else + let $num := $params.num + let $base := 10 + let $linspace_vals := jsoniq_numpy:linspace($start, $end, {"num": $num, "endpoint": true, "retstep": false}) + let $res := + for $i in 1 to $num + return pow($base, $linspace_vals[[$i]]) + return [$res] + else + if ($params.num lt 0) then + (: error case :) + [] + else + let $num := $params.num + let $base := 10 + let $linspace_vals := jsoniq_numpy:linspace($start, $end, {"num": $num, "endpoint": false, "retstep": false}) + let $res := + for $i in 1 to $num + return pow($base, $linspace_vals[[$i]]) + return [$res] +}; + +(: Helper method for the full function :) +declare function jsoniq_numpy:full($shape as array, $fill_value, $i as integer, $unused as integer) { + if ($i eq size($shape)) then + let $join := for $j in 1 to $shape[[$i]] + return $fill_value + return [$join] + else + let $join := + for $j in 1 to $shape[[$i]] + return jsoniq_numpy:full($shape, $fill_value, $i + 1, $unused) + return [$join] +}; + +declare type jsoniq_numpy:full_params as { + "type": "string=string" +}; +(: The full method returns a new array of given shape and type, filled with fill_value. +Required arguments: +- shape (array): the dimension of the new array +- fill_value (atomic): the fill value +Optional arguments include: +- type (string): the type of the resulting array values +Unsupported arguments: +- order: ordering is implicitly done row-wise (C format) +:) +declare function jsoniq_numpy:full($shape as array, $fill_value, $params as object) { + let $params := validate type jsoniq_numpy:full_params {$params} + return { variable $fill; + switch ($params.type) + case "string" return $fill := $fill_value cast as string; + case "integer" return $fill := $fill_value cast as integer; + case "decimal" return $fill := $fill_value cast as decimal; + case "double" return $fill := $fill_value cast as double; + default return $fill := $fill_value cast as integer; + if (size($shape) eq 1) then + let $join := for $j in 1 to $shape[[1]] + return $fill + return [$join] + else + let $i := 1 + let $join := + for $j in 1 to $shape[[$i]] + return jsoniq_numpy:full($shape, $fill, $i + 1, $i) + return [$join] + } +}; + +(: +Return the identity array. The identity array is a square array with ones on the main diagonal. +Required arguments: +- n (integer): the number of rows (and columns) in N x N output. +Optional arguments include: +- type (string): the type of the resulting array values +:) +declare function jsoniq_numpy:identity($n as integer, $params as object) { + variable $fill_one, $fill_zero; + if ($n le 1) then []; + else + switch ($params.type) + case "string" return {$fill_one := 1 cast as string; $fill_zero := 0 cast as string;} + case "integer" return {$fill_one := 1 cast as integer; $fill_zero := 0 cast as integer;} + case "decimal" return {$fill_one := 1 cast as decimal; $fill_zero := 0 cast as decimal;} + case "double" return {$fill_one := 1 cast as double; $fill_zero := 0 cast as double;} + default return {$fill_one := 1 cast as integer; $fill_zero := 0 cast as integer;} + let $join := + for $i in 1 to $n + let $join2 := + for $j in 1 to $n + return if ($i eq $j) then $fill_one + else $fill_zero + return [$join2] + return [$join] +}; + +(: Binary search method. It performs binary search over the given arr parameter looking for the value of x for it. The current behavior is to return the first matching position for a given x even if more values of it are present. +Required params are: +- arr (array): the array to search for x +- x (any): the value to look for in the array arr +The returned value is an integer such that: +- if x is present, the index where it first occurs is returned. +- if x is not found: + - if x is smaller than all values, index 0 is returned. + - if x is greater than all values, index size(arr) + 1 is returned.:) +declare %an:sequential function jsoniq_numpy:binsearch($arr as array, $x) { + variable $low := 1; + variable $high := size($arr) + 1; + while ($low lt $high) { + variable $mid := integer($low + ($high - $low) div 2); + if ($arr[[$mid]] eq $x) then exit returning $mid; + else + if ($x lt $arr[[$mid]]) then $high := $mid; + else $low := $mid + 1; + } + exit returning if ($low eq 1) then 0 else $low; +}; + + +(: +Return the indices of the bins to which each value in input array belongs. +Required arguments: +- x (array): input array to be binned (currently only 1 dimension is supported) +- bins (array): one dimensional monotonic, array +Optional arguments include: +- right (boolean): indicates whether the intervals include the right or the left bin edge +:) +declare function jsoniq_numpy:digitize($x as array, $bins as array) { + let $join := + for $i in 1 to size($x) + return jsoniq_numpy:binsearch($bins, $x[[$i]]) + return [$join] +}; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq new file mode 100644 index 000000000..fb76d9200 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq @@ -0,0 +1,15 @@ +(:JIQS: ShouldNotParse; ErrorCode="XPST0003"; ErrorMetadata="LINE:1:COLUMN:0:" :) +module namespace jsoniq_utils = "jsoniq_utils.jq"; + +declare function jsoniq_utils:cast-as($value, $type as string) { + switch ($type) + case "string" return $value cast as string; + case "integer" return $value cast as integer; + case "numeric" return $value cast as numeric; + case "float" return $value cast as float; + case "decimal" return $value cast as decimal; + case "double" return $value cast as double; + case "boolean" return $value cast as boolean; + case "null" return $value cast as null; + default return $value cast as integer; +}; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_arange.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_arange.jq new file mode 100644 index 000000000..3591521f6 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_arange.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], [ 5, 6, 7, 8, 9 ], [ -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], [ -20, -19, -18, -17, -16, -15, -14, -13, -12, -11 ], [ -20, -18, -16, -14, -12 ], [ 20.7, 21.7, 22.7, 23.7, 24.7, 25.7, 26.7, 27.7, 28.7, 29.7, 30.7, 31.7, 32.7, 33.7, 34.7, 35.7, 36.7, 37.7, 38.7, 39.7, 40.7, 41.7, 42.7, 43.7, 44.7, 45.7, 46.7, 47.7, 48.7, 49.7, 50.7, 51.7, 52.7, 53.7 ], [ 20.7, 22.2, 23.7, 25.2, 26.7, 28.2, 29.7, 31.2, 32.7, 34.2, 35.7, 37.2, 38.7, 40.2, 41.7, 43.2, 44.7, 46.2, 47.7, 49.2, 50.7, 52.2, 53.7 ])":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:arange(10, {"start": 0, "step": 1}), numpy:arange(10, {"start": 5, "step": 1}), numpy:arange(10, {"start": -10, "step": 1}), numpy:arange(-10, {"start": -20, "step": 1}), numpy:arange(-10, {"start": -20, "step": 2}), numpy:arange(54.3, {"start": 20.7, "step": 1}), numpy:arange(54.3, {"start": 20.7, "step": 1.5}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_binsearch.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_binsearch.jq new file mode 100644 index 000000000..57b2b7388 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_binsearch.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="(5, 4, 0, 101, 1, 10, 1, 11)":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:binsearch(numpy:arange(10, {"start": 0, "step": 1}), 4), numpy:binsearch(numpy:arange(11, {"start": 0, "step": 1}), 3), numpy:binsearch(numpy:arange(100, {"start": 0, "step": 1}), -12), numpy:binsearch(numpy:arange(100, {"start": 0, "step": 1}), 101), numpy:binsearch(numpy:arange(10, {"start": 0, "step": 1}), 0), numpy:binsearch(numpy:arange(10, {"start": 0, "step": 1}), 9), numpy:binsearch(numpy:arange(11, {"start": 0, "step": 1}), 0), numpy:binsearch(numpy:arange(11, {"start": 0, "step": 1}), 10) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq new file mode 100644 index 000000000..c6a448c5b --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="([ 2, 5, 4, 3 ])":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:digitize([0.2, 6.4, 3.0, 1.6], [0.0, 1.0, 2.5, 4.0, 10.0]) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_full.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_full.jq new file mode 100644 index 000000000..b734f4c5e --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_full.jq @@ -0,0 +1,5 @@ +(:JIQS: ShouldRun; Output="([ [ [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ] ], [ [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ] ], [ [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ] ] ], [ [ [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ] ], [ [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ] ], [ [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ] ] ], [ 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4 ], [ [ 78, 78 ], [ 78, 78 ] ], [ [ "-78.3", "-78.3" ], [ "-78.3", "-78.3" ] ], [ [ -78.3, -78.3 ], [ -78.3, -78.3 ] ])":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:full([3,4,5], 3, {"type": "integer"}), numpy:full([3,4,5], 3, {"type": "string"}), +numpy:full([100], 34.4, {"type": "double"}), numpy:full([2, 2], 78.3, {"type": ""}), +numpy:full([2, 2], -78.3, {"type": "string"}), numpy:full([2, 2], -78.3, {"type": "double"}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_identity.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_identity.jq new file mode 100644 index 000000000..7a06bc67d --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_identity.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="([ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ], [ [ "1", "0", "0", "0", "0", "0", "0", "0", "0", "0" ], [ "0", "1", "0", "0", "0", "0", "0", "0", "0", "0" ], [ "0", "0", "1", "0", "0", "0", "0", "0", "0", "0" ], [ "0", "0", "0", "1", "0", "0", "0", "0", "0", "0" ], [ "0", "0", "0", "0", "1", "0", "0", "0", "0", "0" ], [ "0", "0", "0", "0", "0", "1", "0", "0", "0", "0" ], [ "0", "0", "0", "0", "0", "0", "1", "0", "0", "0" ], [ "0", "0", "0", "0", "0", "0", "0", "1", "0", "0" ], [ "0", "0", "0", "0", "0", "0", "0", "0", "1", "0" ], [ "0", "0", "0", "0", "0", "0", "0", "0", "0", "1" ] ], [ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ], [ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ], [ ])":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:identity(10, {"type": ""}), numpy:identity(10, {"type": "string"}), numpy:identity(10, {"type": "double"}), numpy:identity(57, {"type": ""}), numpy:identity(0, {"type": ""}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq new file mode 100644 index 000000000..379bab696 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="([ 3, 4.7142857143, 6.4285714286, 8.1428571429, 9.8571428572, 11.5714285715, 13.2857142858, 15 ], [ 3, 4.5, 6, 7.5, 9, 10.5, 12, 13.5 ], [ 3, 4.7142857143, 6.4285714286, 8.1428571429, 9.8571428572, 11.5714285715, 13.2857142858, 15 ], 1.7142857143, [ 3, 4.5, 6, 7.5, 9, 10.5, 12, 13.5 ], 1.5, [ 16, 15.8571428571, 15.7142857142, 15.5714285713, 15.4285714284, 15.2857142855, 15.1428571426, 15 ], [ 15, 15, 15, 15, 15 ], 0, [ -15, -7.5, 0, 7.5, 15 ], 7.5, [ -15, -9, -3, 3, 9 ], 6, [ -127, -120.9565217391, -114.9130434782, -108.8695652173, -102.8260869564, -96.7826086955, -90.7391304346, -84.6956521737, -78.6521739128, -72.6086956519, -66.565217391, -60.5217391301, -54.4782608692, -48.4347826083, -42.3913043474, -36.3478260865, -30.3043478256, -24.2608695647, -18.2173913038, -12.1739130429, -6.130434782, -0.0869565211, 5.9565217398, 12.0000000007, 18.0434782616, 24.0869565225, 30.1304347834, 36.1739130443, 42.2173913052, 48.2608695661, 54.304347827, 60.3478260879, 66.3913043488, 72.4347826097, 78.4782608706, 84.5217391315, 90.5652173924, 96.6086956533, 102.6521739142, 108.6956521751, 114.739130436, 120.7826086969, 126.8260869578, 132.8695652187, 138.9130434796, 144.95653 ], 6.0434782609, [ -30, -27.8571428571, -25.7142857142, -23.5714285713, -21.4285714284, -19.2857142855, -17.1428571426, -15 ])":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:linspace(3, 15, {"num": 8, "endpoint": true, "retstep": false}), numpy:linspace(3, 15, {"num": 8, "endpoint": false, "retstep": false}), numpy:linspace(3, 15, {"num": 8, "endpoint": true, "retstep": true}), numpy:linspace(3, 15, {"num": 8, "endpoint": false, "retstep": true}), numpy:linspace(16, 15, {"num": 8, "endpoint": true, "retstep": false}), numpy:linspace(15, 15, {"num": 5, "endpoint": true, "retstep": true}), numpy:linspace(-15, 15, {"num": 5, "endpoint": true, "retstep": true}), numpy:linspace(-15, 15, {"num": 5, "endpoint": false, "retstep": true}), numpy:linspace(-127, 151, {"num": 46, "endpoint": false, "retstep": true}), numpy:linspace(-30, -15, {"num": 8, "endpoint": true, "retstep": false}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq new file mode 100644 index 000000000..00373b31b --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="([ 100, 177.82794100389228, 316.2277660168379, 562.341325190349 ], [ 100, 215.44346898665253, 464.1588832900267, 1000 ], [ 1.2589254117941673, 1.5488166189124812, 1.9054607179632472, 2.344228815319922, 2.8840315031266064, 3.548133892335755, 4.36515832240166, 5.370317963702528, 6.606934480075959, 8.128305652490639 ], [ 1.2589254117941673, 1.5848931924611136, 1.9952623149688795, 2.51188643150958, 3.1622776601683795, 3.9810717055349722, 5.011872336272722, 6.309573444801933, 7.943282347242816, 10 ], [ 100, 112.2018454301963, 125.89254117941675, 141.2537544622754, 158.48931924611142, 177.82794100389228, 199.52623149688787, 223.872113856834, 251.18864315095797, 281.8382931264455, 316.2277660168379, 354.8133892335753, 398.1071705534973, 446.683592150963, 501.18723362727246, 562.341325190349, 630.957344480193, 707.945784384138, 794.3282347242814, 891.2509381337459, 1000, 1122.018454301963, 1258.9254117941675, 1412.537544622754, 1584.893192461114, 1778.2794100389228, 1995.2623149688789, 2238.72113856834, 2511.88643150958, 2818.382931264455, 3162.2776601683795, 3548.133892335753, 3981.0717055349733, 4466.835921509631, 5011.872336272725, 5623.413251903491, 6309.57344480193, 7079.457843841381, 7943.282347242814, 8912.509381337459, 10000, 11220.18454301963, 12589.254117941662, 14125.375446227554, 15848.93192461114, 17782.794100389227, 19952.62314968879, 22387.21138568338, 25118.864315095823, 28183.82931264455, 31622.776601683792, 35481.33892335753, 39810.71705534969, 44668.35921509635, 50118.72336272725, 56234.13251903491, 63095.7344480193, 70794.57843841374, 79432.82347242822, 89125.0938133746, 100000, 112201.84543019629, 125892.54117941661, 141253.75446227554, 158489.3192461114, 177827.94100389228, 199526.23149688786, 223872.11385683378, 251188.6431509582, 281838.2931264455, 316227.7660168379, 354813.3892335753, 398107.1705534969, 446683.5921509635, 501187.2336272725, 562341.3251903491, 630957.344480193, 707945.7843841374, 794328.2347242822, 891250.9381337459, 1.0E6, 1.122018454301963E6, 1.258925411794166E6, 1.4125375446227554E6, 1.5848931924611142E6, 1.7782794100389227E6, 1.9952623149688788E6, 2.238721138568338E6, 2.5118864315095823E6, 2.818382931264455E6, 3.1622776601683795E6, 3.548133892335753E6, 3.981071705534969E6, 4.466835921509635E6, 5.011872336272725E6, 5.623413251903491E6, 6.30957344480193E6, 7.079457843841374E6, 7.943282347242822E6, 8.912505467113453E6 ], [ 0.1, 0.12589254117941673, 0.15848931924611132, 0.19952623149688797, 0.251188643150958, 0.31622776601683794, 0.3981071705534972, 0.5011872336272722, 0.6309573444801932, 0.7943282319988467 ], [ 1, 0.6309573444801932, 0.3981071705534972, 0.251188643150958, 0.15848931924611132, 0.1, 0.06309573444801933, 0.039810717055349734, 0.025118864315095794, 0.0158489336647576 ], [ 0.1, 0.021544346898665245, 0.004641588832900267, 0.001 ])":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:logspace(2.0, 3.0,{"num": 4, "endpoint": false}), numpy:logspace(2.0, 3.0,{"num": 4, "endpoint": true}), numpy:logspace(0.1, 1.0,{"num": 10, "endpoint": false}), numpy:logspace(0.1, 1.0,{"num": 10, "endpoint": true}), numpy:logspace(2, 7,{"num": 100, "endpoint": false}), +numpy:logspace(-1, 0,{"num": 10, "endpoint": false}), numpy:logspace(0, -2,{"num": 10, "endpoint": false}), numpy:logspace(-1, -3,{"num": 4, "endpoint": true}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq new file mode 100644 index 000000000..a359c076e --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="([ [ 1 ], [ 1 ], [ 1 ], [ 1 ] ], [ [ 1 ], [ 1 ], [ 1 ], [ 1 ] ], [ "1", "1", "1", "1", "1", "1", "1" ], [ [ 1, 1, 1, 1 ], [ 1, 1, 1, 1 ], [ 1, 1, 1, 1 ] ], [ [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ] ], [ [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ] ])" :) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:ones([4, 1], "integer"), numpy:ones([4, 1], "double"), numpy:ones([7], "string"), numpy:ones([3, 4], "integer"), numpy:ones([7,2,3], "integer"), numpy:ones([5,5,5,5], "double") \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq new file mode 100644 index 000000000..912565c1e --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="(1, 3, 4, 10)":) +import module namespace numpy = "jsoniq_numpy.jq"; +size([numpy:random()]),size(numpy:random(3)),size(numpy:random_uniform({"low": 0.5, "high": 1.0, "size": 4})), size(numpy:random_randint(5, {"high": 10, "size": 10})) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq new file mode 100644 index 000000000..65fcec7bc --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="([ [ 0 ], [ 0 ], [ 0 ], [ 0 ] ], [ [ 0 ], [ 0 ], [ 0 ], [ 0 ] ], [ "0", "0", "0", "0", "0", "0", "0" ], [ [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ], [ [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ] ], [ [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ] ])" :) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:zeros([4, 1], "integer"), numpy:zeros([4, 1], "double"), numpy:zeros([7], "string"), numpy:zeros([3, 4], "integer"), numpy:zeros([7,2,3], "integer"), numpy:zeros([5,5,5,5], "double") \ No newline at end of file From bcc79e4e0e97e90bbe2023ce80dccb87201d8c90 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Wed, 12 Jun 2024 16:11:26 +0200 Subject: [PATCH 04/56] Refactored codebase with type schema --- .../runtime/numpy_lib/jsoniq_numpy.jq | 322 +++++++++++------- .../runtime/numpy_lib/jsoniq_utils.jq | 18 +- .../numpy_lib/test_jsoniq_numpy_logspace.jq | 2 +- 3 files changed, 212 insertions(+), 130 deletions(-) diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index 0a6404dff..2b21305d5 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -1,5 +1,6 @@ (:JIQS: ShouldNotParse; ErrorCode="XPST0003"; ErrorMetadata="LINE:1:COLUMN:0:" :) module namespace jsoniq_numpy = "jsoniq_numpy.jq"; +import module namespace utils = "jsoniq_utils.jq"; (: Helper function for zeros :) declare function jsoniq_numpy:zeros($shape as array, $zero, $i as integer) { if ($i eq size($shape)) then @@ -13,30 +14,37 @@ declare function jsoniq_numpy:zeros($shape as array, $zero, $i as integer) { return jsoniq_numpy:zeros($shape, $zero, $i + 1) return [$join] }; + +declare type jsoniq_numpy:zeros_params as { + "type": "string=integer" +}; (: Zeros method creates an array filled with 0 values. Required parameters are: - shape (array): contains the size of each dimension of the resulting array. For one dimensional arrays, a single value within is array is expected - e.g., [7] results in a 1 dimensional array with 7 zeroed elements. Params is an object for optional arguments. These arguments are: - type (string): the enforced type of the resulting array. To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value:) -declare function jsoniq_numpy:zeros($shape as array, $type as string) { - variable $zero; - switch ($type) - case "string" return $zero := 0 cast as string; - case "integer" return $zero := 0 cast as integer; - case "decimal" return $zero := 0 cast as decimal; - case "double" return $zero := 0 cast as double; - default return $zero := 0 cast as integer; - if (size($shape) eq 1) then - let $join := for $j in 1 to $shape[[1]] - return $zero - return [$join] - else - let $i := 1 - let $join := - for $j in 1 to $shape[[$i]] - return jsoniq_numpy:zeros($shape, $zero, $i + 1) - return [$join] +declare function jsoniq_numpy:zeros($shape as array, $params as object) { + let $params := validate type jsoniq_numpy:zeros_params {$params} + return { + if (size($shape) eq 1) then + let $zero := utils:cast-as(0, $params.type) + let $join := for $j in 1 to $shape[[1]] + return $zero + return [$join] + else + let $i := 1 + let $zero := utils:cast-as(0, $params.type) + let $join := + for $j in 1 to $shape[[$i]] + return jsoniq_numpy:zeros($shape, $zero, $i + 1) + return [$join] + } +}; + +(: Zeros method creates an integer array filled with 0 values. :) +declare function jsoniq_numpy:zeros($shape as array) { + jsoniq_numpy:zeros($shape, {}) }; (: Helper function for ones :) @@ -53,6 +61,9 @@ declare function jsoniq_numpy:ones($shape as array, $one, $i as integer) { return [$join] }; +declare type jsoniq_numpy:ones_params as { + "type": "string=integer" +}; (: Required parameters are: - shape (array): contains the size of each dimension of the resulting array. For one dimensional arrays, a single value within is array is expected - e.g., [7] results in a 1 dimensional array with 7 elements with value 1. @@ -60,24 +71,27 @@ Params is an object for optional arguments. These arguments are: - type (string): the enforced type of the resulting array. To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value :) -declare function jsoniq_numpy:ones($shape as array, $type as string) { - variable $one; - switch ($type) - case "string" return $one := 1 cast as string; - case "integer" return $one := 1 cast as integer; - case "decimal" return $one := 1 cast as decimal; - case "double" return $one := 1 cast as double; - default return $one := 1 cast as integer; - if (size($shape) eq 1) then - let $join := for $j in 1 to $shape[[1]] - return $one - return [$join] - else - let $i := 1 - let $join := - for $j in 1 to $shape[[$i]] - return jsoniq_numpy:ones($shape, $one, $i + 1) - return [$join] +declare function jsoniq_numpy:ones($shape as array, $params as object) { + let $params := validate type jsoniq_numpy:ones_params {$params} + return { + if (size($shape) eq 1) then + let $one := utils:cast-as(1, $params.type) + let $join := for $j in 1 to $shape[[1]] + return $one + return [$join] + else + let $i := 1 + let $one := utils:cast-as(1, $params.type) + let $join := + for $j in 1 to $shape[[$i]] + return jsoniq_numpy:ones($shape, $one, $i + 1) + return [$join] + } +}; + +(: Ones method creates an integer array filled with 1 values. :) +declare function jsoniq_numpy:ones($shape as array) { + jsoniq_numpy:ones($shape, {}) }; @@ -107,12 +121,17 @@ declare function local:min($array as array, $axis as integer) { }; :) +declare type jsoniq_numpy:linspace_params as { + "num": "integer=50", + "endpoint": "boolean=true", + "retstep": "boolean=false" +}; (: Return evenly spaced numbers over a specified interval. Returns num evenly spaced samples, calculated over the interval [start, stop]. The endpoint of the interval can optionally be excluded. Note: we currently only support one-dimensional results. Required params are: -- start (integer) - the start value bounding the generated sequence -- end (integer) - the end value bounding the generated sequence +- start (double) - the start value bounding the generated sequence +- end (double) - the end value bounding the generated sequence Params is an object for optional arguments. These arguments are: - num (integer): number of samples to generate. Default is 50. - endpoint (bool): if true, stop is the last sample. Otherwise it is not included. Default is true. @@ -120,8 +139,10 @@ Params is an object for optional arguments. These arguments are: - dtype UNSUPPORTED: return is always double. - axis UNSUPPORTED. To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value:) -declare function jsoniq_numpy:linspace($start as integer, $end as integer, $params as object) { - if ($params.endpoint eq true) then +declare function jsoniq_numpy:linspace($start as double, $end as double, $params as object) { + let $params := validate type jsoniq_numpy:linspace_params {$params} + return { + if ($params.endpoint eq true) then if ($params.num lt 0) then (: error case :) [] @@ -131,7 +152,7 @@ declare function jsoniq_numpy:linspace($start as integer, $end as integer, $para let $step := $range div ($num - 1) let $res := for $i in 1 to $num - return if ($i eq $num) then float($start + ($i - 1) * $step) + return if ($i eq $num) then round(float($start + ($i - 1) * $step), 8) else $start + ($i - 1) * $step return if ($params.retstep eq true) then ([$res], $step) @@ -146,13 +167,28 @@ declare function jsoniq_numpy:linspace($start as integer, $end as integer, $para let $step := $range div $num let $res := for $i in 1 to $num - return if ($i eq $num) then float($start + ($i - 1) * $step) + return if ($i eq $num) then round(float($start + ($i - 1) * $step), 8) else $start + ($i - 1) * $step return if ($params.retstep eq true) then ([$res], $step) else [$res] + } +}; + +(: +Return evenly spaced numbers over a specified interval. Returns num evenly spaced samples, calculated over the interval [start, stop]. The endpoint of the interval can optionally be excluded. +Note: we currently only support one-dimensional results. +The following returns num=50 elements if no params are specified. +:) +declare function jsoniq_numpy:linspace($start as double, $end as double) { + jsoniq_numpy:linspace($start, $end, {}) }; +declare type jsoniq_numpy:arange_params as { + "start": "double=0", + "step": "double=1", + "type": "string=integer" +}; (: arange can be called with a combination of parameters: - arange(stop): Values are generated within the half-open interval [0, stop) (in other words, the interval including start but excluding stop). @@ -162,21 +198,31 @@ Required params are: - stop (double): marks the end of the interval Params is an object for optional arguments. These arguments are: - start (double): the start of the interval. Default value is 0. -- stop (double): the end of the interval. - step (double): the spacing of output values. Default value is 1. -- dtype (string): type of the returned array. The possible values include "integer" or "double". +- dtype (string): type of the returned array. Default is integer. To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value :) declare function jsoniq_numpy:arange($stop as double, $params as object) { - (: ADD LOGIC FOR WHEN PARAMS ARE MISSING :) - if ($params.start gt $stop) then [] - else - if ($params.start + $params.step gt $stop or $params.step eq 0) then [$params.start] + let $params := validate type jsoniq_numpy:arange_params {$params} + return { + if ($params.start gt $stop) then [] else - let $num_values := integer(ceiling(($stop - $params.start) div $params.step)) - let $res := for $i in 1 to $num_values - return $params.start + ($i - 1) * $params.step - return [$res] + if ($params.start + $params.step gt $stop or $params.step eq 0) then [$params.start] + else + let $num_values := integer(ceiling(($stop - $params.start) div $params.step)) + let $res := for $i in 1 to $num_values + return $params.start + ($i - 1) * $params.step + return [$res] + } +}; + +(: +arange can be called with a combination of parameters: +- arange(stop): Values are generated within the half-open interval [0, stop) (in other words, the interval including start but excluding stop). +For other parameters, use the params argument. +:) +declare function jsoniq_numpy:arange($stop as double) { + jsoniq_numpy:arange($stop, {}) }; (: Function generates a single random value of type double :) @@ -196,19 +242,28 @@ declare function jsoniq_numpy:random_size($size as array) { }; - +declare type jsoniq_numpy:random_uniform_params as { + "low": "double=0", + "high": "double=1", + "size": "integer=10" +}; (: Function generates a random sample from a uniform distribution between a lower and higher limit (not inclusive). Params is an object for optional arguments. These arguments are: - low (double): the lower bound for generated objects. Default value is 0.0 - high (double): the upper bound for generated objects. Default value is 1.0 - size (integer): the size of the resulting array. Default is 10. To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value :) declare function jsoniq_numpy:random_uniform($params as object) { + let $params := validate type jsoniq_numpy:random_uniform_params {$params} let $low := $params.low let $high := $params.high let $size := $params.size return fn:random-between($low, $high, $size, "double") }; +declare type jsoniq_numpy:random_randint_params as { + "high": "double=1", + "size": "integer=10" +}; (: Function generates a random sample from a uniform distribution between a lower and higher limit (not inclusive), but with type int. Required params are: - low (integer): the lower bound for generated objects if high is also present. Otherwise, it determines the upperbound. Without high, it makes the sequence be bounded by [0, low), otherwise it makes it bound by [low, high). @@ -216,47 +271,66 @@ Params is an object for optional arguments. These arguments are: - high (integer): the upper bound for generated objects. Default value is 1 - size (integer): the size of the resulting array. Default is 10 To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value :) - declare function jsoniq_numpy:random_randint($low as integer, $params as object) { - let $high := $params.high - let $size := $params.size - return fn:random-between($low, $high, $size, "integer") - }; +declare function jsoniq_numpy:random_randint($low as integer, $params as object) { + let $params := validate type jsoniq_numpy:random_randint_params {$params} + let $high := $params.high + let $size := $params.size + return fn:random-between($low, $high, $size, "integer") +}; +declare type jsoniq_numpy:logspace_params as { + "num": "integer=50", + "endpoint": "boolean=true" +}; (: Generate evenly spaced numbers on a log scale in base 10. Required parameters are: - - start (integer): 10 ** start is the starting value of the sequence. - - end (integer): 10 ** end is the end value of the sequence. + - start (double): 10 ** start is the starting value of the sequence. + - end (double): 10 ** end is the end value of the sequence. Params is an object for optional arguments. These arguments are: - num (integer): number of samples to generate. Default is 50. - endpoint (bool): if true, stop is the last sample. Otherwise it is not included. Default is true. - base UNSUPPORTED: base 10 is always used. - dtype UNSUPPORTED: return is always double. - axis UNSUPPORTED.:) -declare function jsoniq_numpy:logspace($start as integer, $end as integer, $params as object) { - if ($params.endpoint eq true) then - if ($params.num lt 0) then - (: error case :) - [] - else - let $num := $params.num - let $base := 10 - let $linspace_vals := jsoniq_numpy:linspace($start, $end, {"num": $num, "endpoint": true, "retstep": false}) - let $res := - for $i in 1 to $num - return pow($base, $linspace_vals[[$i]]) - return [$res] - else - if ($params.num lt 0) then - (: error case :) - [] +declare function jsoniq_numpy:logspace($start as double, $end as double, $params as object) { + let $params := validate type jsoniq_numpy:logspace_params {$params} + return { + if ($params.endpoint eq true) then + if ($params.num lt 0) then + (: error case :) + [] + else + let $num := $params.num + let $base := 10 + let $linspace_vals := jsoniq_numpy:linspace($start, $end, {"num": $num, "endpoint": true, "retstep": false}) + let $res := + for $i in 1 to $num + return pow($base, $linspace_vals[[$i]]) + return [$res] else - let $num := $params.num - let $base := 10 - let $linspace_vals := jsoniq_numpy:linspace($start, $end, {"num": $num, "endpoint": false, "retstep": false}) - let $res := - for $i in 1 to $num - return pow($base, $linspace_vals[[$i]]) - return [$res] + if ($params.num lt 0) then + (: error case :) + [] + else + let $num := $params.num + let $base := 10 + let $linspace_vals := jsoniq_numpy:linspace($start, $end, {"num": $num, "endpoint": false, "retstep": false}) + let $res := + for $i in 1 to $num + return pow($base, $linspace_vals[[$i]]) + return [$res] + } +}; + +(: +Generate evenly spaced numbers on a log scale in base 10. +Required parameters are: + - start (double): 10 ** start is the starting value of the sequence. + - end (double): 10 ** end is the end value of the sequence. +The result is a sequence of 50 elements where the endpoint is also included. For refined versions, use the params argument. +:) +declare function jsoniq_numpy:logspace($start as double, $end as double) { + jsoniq_numpy:logspace($start, $end, {}) }; (: Helper method for the full function :) @@ -273,39 +347,49 @@ declare function jsoniq_numpy:full($shape as array, $fill_value, $i as integer, }; declare type jsoniq_numpy:full_params as { - "type": "string=string" + "type": "string=integer" }; (: The full method returns a new array of given shape and type, filled with fill_value. Required arguments: - shape (array): the dimension of the new array - fill_value (atomic): the fill value Optional arguments include: -- type (string): the type of the resulting array values +- type (string): the type of the resulting array values. The default value is integer. Unsupported arguments: - order: ordering is implicitly done row-wise (C format) :) declare function jsoniq_numpy:full($shape as array, $fill_value, $params as object) { let $params := validate type jsoniq_numpy:full_params {$params} - return { variable $fill; - switch ($params.type) - case "string" return $fill := $fill_value cast as string; - case "integer" return $fill := $fill_value cast as integer; - case "decimal" return $fill := $fill_value cast as decimal; - case "double" return $fill := $fill_value cast as double; - default return $fill := $fill_value cast as integer; - if (size($shape) eq 1) then - let $join := for $j in 1 to $shape[[1]] - return $fill - return [$join] - else - let $i := 1 - let $join := - for $j in 1 to $shape[[$i]] - return jsoniq_numpy:full($shape, $fill, $i + 1, $i) - return [$join] + return { + if (size($shape) eq 1) then + let $fill := utils:cast-as($fill_value, $params.type) + let $join := for $j in 1 to $shape[[1]] + return $fill + return [$join] + else + let $i := 1 + let $fill := utils:cast-as($fill_value, $params.type) + let $join := + for $j in 1 to $shape[[$i]] + return jsoniq_numpy:full($shape, $fill, $i + 1, $i) + return [$join] } }; +(: +The full method returns a new array of given shape and type, filled with fill_value. +Required arguments: +- shape (array): the dimension of the new array +- fill_value (atomic): the fill value +The method returns an integer array by default. To change this, use the params argument. +:) +declare function jsoniq_numpy:full($shape as array, $fill_value) { + jsoniq_numpy:full($shape, $fill_value, {}) +}; + +declare type jsoniq_numpy:identity_params as { + "type": "string=integer" +}; (: Return the identity array. The identity array is a square array with ones on the main diagonal. Required arguments: @@ -314,23 +398,21 @@ Optional arguments include: - type (string): the type of the resulting array values :) declare function jsoniq_numpy:identity($n as integer, $params as object) { - variable $fill_one, $fill_zero; - if ($n le 1) then []; - else - switch ($params.type) - case "string" return {$fill_one := 1 cast as string; $fill_zero := 0 cast as string;} - case "integer" return {$fill_one := 1 cast as integer; $fill_zero := 0 cast as integer;} - case "decimal" return {$fill_one := 1 cast as decimal; $fill_zero := 0 cast as decimal;} - case "double" return {$fill_one := 1 cast as double; $fill_zero := 0 cast as double;} - default return {$fill_one := 1 cast as integer; $fill_zero := 0 cast as integer;} - let $join := - for $i in 1 to $n - let $join2 := - for $j in 1 to $n - return if ($i eq $j) then $fill_one - else $fill_zero - return [$join2] - return [$join] + let $params := validate type jsoniq_numpy:identity_params {$params} + return { + if ($n le 1) then [] + else + let $fill_one := utils:cast-as(1, $params.type) + let $fill_zero := utils:cast-as(0, $params.type) + let $join := + for $i in 1 to $n + let $join2 := + for $j in 1 to $n + return if ($i eq $j) then $fill_one + else $fill_zero + return [$join2] + return [$join] + } }; (: Binary search method. It performs binary search over the given arr parameter looking for the value of x for it. The current behavior is to return the first matching position for a given x even if more values of it are present. diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq index fb76d9200..c28c226e0 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq @@ -3,13 +3,13 @@ module namespace jsoniq_utils = "jsoniq_utils.jq"; declare function jsoniq_utils:cast-as($value, $type as string) { switch ($type) - case "string" return $value cast as string; - case "integer" return $value cast as integer; - case "numeric" return $value cast as numeric; - case "float" return $value cast as float; - case "decimal" return $value cast as decimal; - case "double" return $value cast as double; - case "boolean" return $value cast as boolean; - case "null" return $value cast as null; - default return $value cast as integer; + case "string" return $value cast as string + case "integer" return $value cast as integer + case "numeric" return $value cast as numeric + case "float" return $value cast as float + case "decimal" return $value cast as decimal + case "double" return $value cast as double + case "boolean" return $value cast as boolean + case "null" return $value cast as null + default return $value cast as integer }; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq index 00373b31b..54ca23fcc 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="([ 100, 177.82794100389228, 316.2277660168379, 562.341325190349 ], [ 100, 215.44346898665253, 464.1588832900267, 1000 ], [ 1.2589254117941673, 1.5488166189124812, 1.9054607179632472, 2.344228815319922, 2.8840315031266064, 3.548133892335755, 4.36515832240166, 5.370317963702528, 6.606934480075959, 8.128305652490639 ], [ 1.2589254117941673, 1.5848931924611136, 1.9952623149688795, 2.51188643150958, 3.1622776601683795, 3.9810717055349722, 5.011872336272722, 6.309573444801933, 7.943282347242816, 10 ], [ 100, 112.2018454301963, 125.89254117941675, 141.2537544622754, 158.48931924611142, 177.82794100389228, 199.52623149688787, 223.872113856834, 251.18864315095797, 281.8382931264455, 316.2277660168379, 354.8133892335753, 398.1071705534973, 446.683592150963, 501.18723362727246, 562.341325190349, 630.957344480193, 707.945784384138, 794.3282347242814, 891.2509381337459, 1000, 1122.018454301963, 1258.9254117941675, 1412.537544622754, 1584.893192461114, 1778.2794100389228, 1995.2623149688789, 2238.72113856834, 2511.88643150958, 2818.382931264455, 3162.2776601683795, 3548.133892335753, 3981.0717055349733, 4466.835921509631, 5011.872336272725, 5623.413251903491, 6309.57344480193, 7079.457843841381, 7943.282347242814, 8912.509381337459, 10000, 11220.18454301963, 12589.254117941662, 14125.375446227554, 15848.93192461114, 17782.794100389227, 19952.62314968879, 22387.21138568338, 25118.864315095823, 28183.82931264455, 31622.776601683792, 35481.33892335753, 39810.71705534969, 44668.35921509635, 50118.72336272725, 56234.13251903491, 63095.7344480193, 70794.57843841374, 79432.82347242822, 89125.0938133746, 100000, 112201.84543019629, 125892.54117941661, 141253.75446227554, 158489.3192461114, 177827.94100389228, 199526.23149688786, 223872.11385683378, 251188.6431509582, 281838.2931264455, 316227.7660168379, 354813.3892335753, 398107.1705534969, 446683.5921509635, 501187.2336272725, 562341.3251903491, 630957.344480193, 707945.7843841374, 794328.2347242822, 891250.9381337459, 1.0E6, 1.122018454301963E6, 1.258925411794166E6, 1.4125375446227554E6, 1.5848931924611142E6, 1.7782794100389227E6, 1.9952623149688788E6, 2.238721138568338E6, 2.5118864315095823E6, 2.818382931264455E6, 3.1622776601683795E6, 3.548133892335753E6, 3.981071705534969E6, 4.466835921509635E6, 5.011872336272725E6, 5.623413251903491E6, 6.30957344480193E6, 7.079457843841374E6, 7.943282347242822E6, 8.912505467113453E6 ], [ 0.1, 0.12589254117941673, 0.15848931924611132, 0.19952623149688797, 0.251188643150958, 0.31622776601683794, 0.3981071705534972, 0.5011872336272722, 0.6309573444801932, 0.7943282319988467 ], [ 1, 0.6309573444801932, 0.3981071705534972, 0.251188643150958, 0.15848931924611132, 0.1, 0.06309573444801933, 0.039810717055349734, 0.025118864315095794, 0.0158489336647576 ], [ 0.1, 0.021544346898665245, 0.004641588832900267, 0.001 ])":) +(:JIQS: ShouldRun; Output="([ 100, 177.82794100389228, 316.2277660168379, 562.341325190349 ], [ 100, 215.44346900318845, 464.15888336127773, 1000 ], [ 1.2589254117941673, 1.5488166189124812, 1.9054607179632472, 2.344228815319922, 2.8840315031266055, 3.548133892335754, 4.36515832240166, 5.370317963702528, 6.606934480075959, 8.128305652490639 ], [ 1.2589254117941673, 1.5848931924611136, 1.9952623149688797, 2.51188643150958, 3.1622776601683795, 3.9810717055349722, 5.011872336272724, 6.309573444801933, 7.943282347242816, 10 ], [ 100, 112.2018454301963, 125.89254117941675, 141.2537544622754, 158.48931924611142, 177.82794100389228, 199.52623149688787, 223.872113856834, 251.18864315095797, 281.8382931264455, 316.2277660168379, 354.8133892335753, 398.1071705534973, 446.683592150963, 501.18723362727246, 562.341325190349, 630.957344480193, 707.945784384138, 794.3282347242814, 891.2509381337459, 1000, 1122.018454301963, 1258.9254117941675, 1412.5375446227554, 1584.893192461114, 1778.2794100389228, 1995.2623149688789, 2238.72113856834, 2511.886431509582, 2818.382931264455, 3162.2776601683795, 3548.133892335753, 3981.0717055349733, 4466.835921509635, 5011.872336272725, 5623.413251903491, 6309.57344480193, 7079.457843841381, 7943.282347242822, 8912.509381337459, 10000, 11220.184543019652, 12589.254117941662, 14125.375446227554, 15848.93192461114, 17782.794100389227, 19952.62314968883, 22387.21138568338, 25118.864315095823, 28183.82931264455, 31622.776601683792, 35481.3389233576, 39810.71705534969, 44668.35921509635, 50118.72336272725, 56234.13251903491, 63095.73444801943, 70794.57843841374, 79432.82347242822, 89125.0938133746, 100000, 112201.84543019652, 125892.54117941661, 141253.75446227554, 158489.3192461114, 177827.94100389228, 199526.23149688827, 223872.11385683378, 251188.6431509582, 281838.2931264455, 316227.7660168379, 354813.389233576, 398107.1705534969, 446683.5921509635, 501187.2336272725, 562341.3251903491, 630957.3444801943, 707945.7843841374, 794328.2347242822, 891250.9381337459, 1.0E6, 1.122018454301963E6, 1.2589254117941689E6, 1.4125375446227554E6, 1.5848931924611142E6, 1.7782794100389227E6, 1.9952623149688788E6, 2.238721138568342E6, 2.5118864315095823E6, 2.818382931264455E6, 3.1622776601683795E6, 3.548133892335753E6, 3.9810717055349775E6, 4.466835921509635E6, 5.011872336272725E6, 5.623413251903491E6, 6.309573444801943E6, 7.079457843841387E6, 7.943282347242822E6, 8.912505467113453E6 ], [ 0.1, 0.12589254117941673, 0.15848931924611132, 0.19952623149688797, 0.251188643150958, 0.31622776601683794, 0.3981071705534973, 0.5011872336272724, 0.6309573444801932, 0.7943282319988467 ], [ 1, 0.6309573444801932, 0.3981071705534972, 0.25118864315095796, 0.15848931924611132, 0.1, 0.0630957344480193, 0.03981071705534971, 0.025118864315095794, 0.0158489336647576 ], [ 0.1, 0.021544346900318846, 0.004641588833612782, 0.001 ])":) import module namespace numpy = "jsoniq_numpy.jq"; numpy:logspace(2.0, 3.0,{"num": 4, "endpoint": false}), numpy:logspace(2.0, 3.0,{"num": 4, "endpoint": true}), numpy:logspace(0.1, 1.0,{"num": 10, "endpoint": false}), numpy:logspace(0.1, 1.0,{"num": 10, "endpoint": true}), numpy:logspace(2, 7,{"num": 100, "endpoint": false}), numpy:logspace(-1, 0,{"num": 10, "endpoint": false}), numpy:logspace(0, -2,{"num": 10, "endpoint": false}), numpy:logspace(-1, -3,{"num": 4, "endpoint": true}) \ No newline at end of file From 532d46182a22d584612293f28472a7535da142ca Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 13 Jun 2024 12:40:02 +0200 Subject: [PATCH 05/56] Fixed digitize and floating point issues --- .../runtime/numpy_lib/jsoniq_numpy.jq | 100 ++++++++++++++++-- .../runtime/numpy_lib/jsoniq_utils.jq | 15 +++ .../numpy_lib/test_jsoniq_numpy_digitize.jq | 4 +- .../numpy_lib/test_jsoniq_numpy_linspace.jq | 2 +- .../numpy_lib/test_jsoniq_numpy_ones.jq | 2 +- .../numpy_lib/test_jsoniq_numpy_zeros.jq | 2 +- 6 files changed, 112 insertions(+), 13 deletions(-) diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index 2b21305d5..adc2b2ff0 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -152,7 +152,7 @@ declare function jsoniq_numpy:linspace($start as double, $end as double, $params let $step := $range div ($num - 1) let $res := for $i in 1 to $num - return if ($i eq $num) then round(float($start + ($i - 1) * $step), 8) + return if ($i eq $num) then float($start + ($i - 1) * $step) else $start + ($i - 1) * $step return if ($params.retstep eq true) then ([$res], $step) @@ -167,7 +167,7 @@ declare function jsoniq_numpy:linspace($start as double, $end as double, $params let $step := $range div $num let $res := for $i in 1 to $num - return if ($i eq $num) then round(float($start + ($i - 1) * $step), 8) + return if ($i eq $num) then float($start + ($i - 1) * $step) else $start + ($i - 1) * $step return if ($params.retstep eq true) then ([$res], $step) @@ -431,12 +431,36 @@ declare %an:sequential function jsoniq_numpy:binsearch($arr as array, $x) { variable $mid := integer($low + ($high - $low) div 2); if ($arr[[$mid]] eq $x) then exit returning $mid; else - if ($x lt $arr[[$mid]]) then $high := $mid; + if ($x le $arr[[$mid]]) then $high := $mid; else $low := $mid + 1; } exit returning if ($low eq 1) then 0 else $low; }; +(: returns i s.t. arr[i - 1] <= x < arr[i] :) +declare %an:sequential function jsoniq_numpy:searchsorted_left($arr as array, $x) { + variable $low := 1; + variable $high := size($arr) + 1; + while ($low lt $high) { + variable $mid := integer($low + ($high - $low) div 2); + if ($x ge $arr[[$mid]]) then $low := $mid + 1; + else $high := $mid; + } + exit returning if ($low eq 1) then 0 else $low; +}; + +(: returns i s.t. arr[i - 1] < x <= arr[i] :) +declare %an:sequential function jsoniq_numpy:searchsorted_right($arr as array, $x) { + variable $low := 1; + variable $high := size($arr) + 1; + while ($low lt $high) { + variable $mid := integer($low + ($high - $low) div 2); + if ($x ge $arr[[$mid]]) then $low := $mid + 1; + else $high := $mid; + } + exit returning if ($low eq 1) then 0 else $low; +}; + (: Return the indices of the bins to which each value in input array belongs. @@ -445,10 +469,70 @@ Required arguments: - bins (array): one dimensional monotonic, array Optional arguments include: - right (boolean): indicates whether the intervals include the right or the left bin edge +Values outside of the bins bounds return position 1 or size(bins) + 1 according to their relation. +(: TODO: right param:) :) declare function jsoniq_numpy:digitize($x as array, $bins as array) { - let $join := - for $i in 1 to size($x) - return jsoniq_numpy:binsearch($bins, $x[[$i]]) - return [$join] -}; \ No newline at end of file + let $monotonic := jsoniq_numpy:monotonic($bins) + return { + if ($monotonic eq 0) then + fn:error("Bins must be monotonically increasing or decreasing!") + else + if ($monotonic eq 1) then + let $join := for $i in 1 to size($x) + return jsoniq_numpy:searchsorted_left($bins, $x[[$i]]) + return [$join] + else + (: reverse case requires reversing the array :) + let $bins_rev := [fn:reverse($bins[])] + let $join := for $i in 1 to size($x) + let $searchsorted_res := jsoniq_numpy:searchsorted_left($bins_rev, $x[[$i]]) + let $bin_index := jsoniq_numpy:compute_index($searchsorted_res, size($bins)) + return $bin_index + return [$join] + } +}; + +declare function jsoniq_numpy:compute_index($result as integer, $size as integer) { + (: the value is out of the bounds on the left => size + 1:) + if ($result eq 0) then $size + 1 + else + (: the value is out of bounds on the right => 1 :) + if ($result eq ($size + 1)) then 1 + else + $size - $result + 2 +}; + +declare function jsoniq_numpy:non_decreasing($arr as array) { + variable $i := 1; + while ($i lt (size($arr) - 1)) { + if ($arr[[$i]] gt $arr[[$i + 1]]) then { + exit returning 0; + } else { + $i := $i + 1; + continue loop; + } + } + 1 +}; + +declare function jsoniq_numpy:non_increasing($arr as array) { + variable $i := 1; + while ($i lt (size($arr) - 1)) { + if ($arr[[$i]] lt $arr[[$i + 1]]) then { + exit returning 0; + } else { + $i := $i + 1; + continue loop; + } + } + -1 +}; + +declare function jsoniq_numpy:monotonic($arr as array) { + if (jsoniq_numpy:non_decreasing($arr) eq 0) then + jsoniq_numpy:non_increasing($arr) + else + 1 +}; + diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq index c28c226e0..af1061bf2 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq @@ -12,4 +12,19 @@ declare function jsoniq_utils:cast-as($value, $type as string) { case "boolean" return $value cast as boolean case "null" return $value cast as null default return $value cast as integer +}; + +(: Function returns the shape of the array as a list where each index represents the number of elements in that particular dimension. +Required params are: +- arr (array): the array to compute the shape for :) +declare function jsoniq_utils:shape($arr as array) { + variable $shape := []; + variable $pos := 1; + variable $it := $arr; + while (size($it) gt 0) { + insert json size($it) into $shape at position $pos; + $pos := $pos + 1; + $it := $arr[[1]]; + } + $shape }; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq index c6a448c5b..c88244ced 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq @@ -1,3 +1,3 @@ -(:JIQS: ShouldRun; Output="([ 2, 5, 4, 3 ])":) +(:JIQS: ShouldRun; Output="([ 2, 5, 4, 3 ], [ 3, 4, 5, 6, 7, 8, 9 ], [ 2, 3, 3, 3, 3, 3, 3 ], [ 0, 2, 2, 2, 5 ], [ ], [ ], [ 0, 0 ], [ 5, 2, 3, 4 ], [ 0, 0, 0, 0, 0, 0, 0 ], [ 5, 4, 4, 4, 4, 4, 4 ], [ 5, 4, 4, 4, 1 ])":) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:digitize([0.2, 6.4, 3.0, 1.6], [0.0, 1.0, 2.5, 4.0, 10.0]) \ No newline at end of file +numpy:digitize([0.2, 6.4, 3.0, 1.6], [0.0, 1.0, 2.5, 4.0, 10.0]), numpy:digitize([1, 2, 3, 4, 5, 6, 7], numpy:arange(25)), numpy:digitize([1, 2, 3, 4, 5, 6, 7], [1, 2, 10, 20, 30]), numpy:digitize([1, 2, 3, 4, 7], [2, 5, 6, 7]), numpy:digitize([], []), numpy:digitize([], [1, 2, 3]), numpy:digitize([1, 2], []), numpy:digitize([0.2, 6.4, 3.0, 1.6], [10.0, 4.0, 2.5, 1.0, 0.0]), numpy:digitize([1, 2, 3, 4, 5, 6, 7], numpy:arange(0, {"start": 25, "step": -1})), numpy:digitize([1, 2, 3, 4, 5, 6, 7], [30, 20, 10, 2, 1]), numpy:digitize([1, 2, 3, 4, 7], [7, 6, 5, 2]) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq index 379bab696..34fd21d70 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq @@ -1,3 +1,3 @@ -(:JIQS: ShouldRun; Output="([ 3, 4.7142857143, 6.4285714286, 8.1428571429, 9.8571428572, 11.5714285715, 13.2857142858, 15 ], [ 3, 4.5, 6, 7.5, 9, 10.5, 12, 13.5 ], [ 3, 4.7142857143, 6.4285714286, 8.1428571429, 9.8571428572, 11.5714285715, 13.2857142858, 15 ], 1.7142857143, [ 3, 4.5, 6, 7.5, 9, 10.5, 12, 13.5 ], 1.5, [ 16, 15.8571428571, 15.7142857142, 15.5714285713, 15.4285714284, 15.2857142855, 15.1428571426, 15 ], [ 15, 15, 15, 15, 15 ], 0, [ -15, -7.5, 0, 7.5, 15 ], 7.5, [ -15, -9, -3, 3, 9 ], 6, [ -127, -120.9565217391, -114.9130434782, -108.8695652173, -102.8260869564, -96.7826086955, -90.7391304346, -84.6956521737, -78.6521739128, -72.6086956519, -66.565217391, -60.5217391301, -54.4782608692, -48.4347826083, -42.3913043474, -36.3478260865, -30.3043478256, -24.2608695647, -18.2173913038, -12.1739130429, -6.130434782, -0.0869565211, 5.9565217398, 12.0000000007, 18.0434782616, 24.0869565225, 30.1304347834, 36.1739130443, 42.2173913052, 48.2608695661, 54.304347827, 60.3478260879, 66.3913043488, 72.4347826097, 78.4782608706, 84.5217391315, 90.5652173924, 96.6086956533, 102.6521739142, 108.6956521751, 114.739130436, 120.7826086969, 126.8260869578, 132.8695652187, 138.9130434796, 144.95653 ], 6.0434782609, [ -30, -27.8571428571, -25.7142857142, -23.5714285713, -21.4285714284, -19.2857142855, -17.1428571426, -15 ])":) +(:JIQS: ShouldRun; Output="([ 3, 4.714285714285714, 6.428571428571429, 8.142857142857142, 9.857142857142858, 11.571428571428571, 13.285714285714285, 15 ], [ 3, 4.5, 6, 7.5, 9, 10.5, 12, 13.5 ], [ 3, 4.714285714285714, 6.428571428571429, 8.142857142857142, 9.857142857142858, 11.571428571428571, 13.285714285714285, 15 ], 1.7142857142857142, [ 3, 4.5, 6, 7.5, 9, 10.5, 12, 13.5 ], 1.5, [ 16, 15.857142857142858, 15.714285714285714, 15.571428571428571, 15.428571428571429, 15.285714285714286, 15.142857142857142, 15 ], [ 15, 15, 15, 15, 15 ], 0, [ -15, -7.5, 0, 7.5, 15 ], 7.5, [ -15, -9, -3, 3, 9 ], 6, [ -127, -120.95652173913044, -114.91304347826087, -108.86956521739131, -102.82608695652173, -96.78260869565217, -90.73913043478261, -84.69565217391303, -78.65217391304347, -72.6086956521739, -66.56521739130434, -60.52173913043478, -54.47826086956522, -48.434782608695656, -42.39130434782608, -36.347826086956516, -30.304347826086953, -24.26086956521739, -18.217391304347828, -12.173913043478251, -6.130434782608688, -0.08695652173912549, 5.956521739130437, 12, 18.043478260869563, 24.086956521739125, 30.13043478260869, 36.17391304347828, 42.21739130434784, 48.260869565217405, 54.30434782608697, 60.34782608695653, 66.3913043478261, 72.43478260869566, 78.47826086956522, 84.52173913043478, 90.56521739130434, 96.6086956521739, 102.6521739130435, 108.69565217391306, 114.73913043478262, 120.78260869565219, 126.82608695652175, 132.8695652173913, 138.91304347826087, 144.95653 ], 6.043478260869565, [ -30, -27.857142857142858, -25.714285714285715, -23.57142857142857, -21.42857142857143, -19.285714285714285, -17.142857142857142, -15 ])":) import module namespace numpy = "jsoniq_numpy.jq"; numpy:linspace(3, 15, {"num": 8, "endpoint": true, "retstep": false}), numpy:linspace(3, 15, {"num": 8, "endpoint": false, "retstep": false}), numpy:linspace(3, 15, {"num": 8, "endpoint": true, "retstep": true}), numpy:linspace(3, 15, {"num": 8, "endpoint": false, "retstep": true}), numpy:linspace(16, 15, {"num": 8, "endpoint": true, "retstep": false}), numpy:linspace(15, 15, {"num": 5, "endpoint": true, "retstep": true}), numpy:linspace(-15, 15, {"num": 5, "endpoint": true, "retstep": true}), numpy:linspace(-15, 15, {"num": 5, "endpoint": false, "retstep": true}), numpy:linspace(-127, 151, {"num": 46, "endpoint": false, "retstep": true}), numpy:linspace(-30, -15, {"num": 8, "endpoint": true, "retstep": false}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq index a359c076e..981d20868 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq @@ -1,3 +1,3 @@ (:JIQS: ShouldRun; Output="([ [ 1 ], [ 1 ], [ 1 ], [ 1 ] ], [ [ 1 ], [ 1 ], [ 1 ], [ 1 ] ], [ "1", "1", "1", "1", "1", "1", "1" ], [ [ 1, 1, 1, 1 ], [ 1, 1, 1, 1 ], [ 1, 1, 1, 1 ] ], [ [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ] ], [ [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ] ])" :) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:ones([4, 1], "integer"), numpy:ones([4, 1], "double"), numpy:ones([7], "string"), numpy:ones([3, 4], "integer"), numpy:ones([7,2,3], "integer"), numpy:ones([5,5,5,5], "double") \ No newline at end of file +numpy:ones([4, 1], {"type": "integer"}), numpy:ones([4, 1],{"type": "double"}), numpy:ones([7], {"type": "string"}), numpy:ones([3, 4], {"type": "integer"}), numpy:ones([7,2,3], {"type": "integer"}), numpy:ones([5,5,5,5],{"type": "double"}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq index 65fcec7bc..80a2bddbe 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq @@ -1,3 +1,3 @@ (:JIQS: ShouldRun; Output="([ [ 0 ], [ 0 ], [ 0 ], [ 0 ] ], [ [ 0 ], [ 0 ], [ 0 ], [ 0 ] ], [ "0", "0", "0", "0", "0", "0", "0" ], [ [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ], [ [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ] ], [ [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ] ])" :) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:zeros([4, 1], "integer"), numpy:zeros([4, 1], "double"), numpy:zeros([7], "string"), numpy:zeros([3, 4], "integer"), numpy:zeros([7,2,3], "integer"), numpy:zeros([5,5,5,5], "double") \ No newline at end of file +numpy:zeros([4, 1], {"type": "integer"}), numpy:zeros([4, 1], {"type": "double"}), numpy:zeros([7], {"type": "string"}), numpy:zeros([3, 4], {"type": "integer"}), numpy:zeros([7,2,3], {"type": "integer"}), numpy:zeros([5,5,5,5], {"type": "double"}) \ No newline at end of file From 3bec6c4ed144833e08e310c3d7a2003149b64bc1 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 13 Jun 2024 17:08:23 +0200 Subject: [PATCH 06/56] Finished non-axis methods --- .../runtime/numpy_lib/jsoniq_numpy.jq | 44 +++++++++++++++++-- .../runtime/numpy_lib/jsoniq_utils.jq | 13 ++++-- .../numpy_lib/test_jsoniq_numpy_argwhere.jq | 3 ++ .../numpy_lib/test_jsoniq_numpy_reshape.jq | 3 ++ .../numpy_lib/test_jsoniq_numpy_shape.jq | 4 ++ 5 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_argwhere.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_reshape.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_shape.jq diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index adc2b2ff0..99d99834a 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -10,8 +10,9 @@ declare function jsoniq_numpy:zeros($shape as array, $zero, $i as integer) { return [$join] else let $join := + let $partial_res := jsoniq_numpy:zeros($shape, $zero, $i + 1) for $j in 1 to $shape[[$i]] - return jsoniq_numpy:zeros($shape, $zero, $i + 1) + return $partial_res return [$join] }; @@ -36,8 +37,9 @@ declare function jsoniq_numpy:zeros($shape as array, $params as object) { let $i := 1 let $zero := utils:cast-as(0, $params.type) let $join := + let $partial_res := jsoniq_numpy:zeros($shape, $zero, $i + 1) for $j in 1 to $shape[[$i]] - return jsoniq_numpy:zeros($shape, $zero, $i + 1) + return $partial_res return [$join] } }; @@ -56,8 +58,9 @@ declare function jsoniq_numpy:ones($shape as array, $one, $i as integer) { return [$join] else let $join := + let $partial_res := jsoniq_numpy:ones($shape, $one, $i + 1) for $j in 1 to $shape[[$i]] - return jsoniq_numpy:ones($shape, $one, $i + 1) + return $partial_res return [$join] }; @@ -83,8 +86,9 @@ declare function jsoniq_numpy:ones($shape as array, $params as object) { let $i := 1 let $one := utils:cast-as(1, $params.type) let $join := + let $partial_res := jsoniq_numpy:ones($shape, $one, $i + 1) for $j in 1 to $shape[[$i]] - return jsoniq_numpy:ones($shape, $one, $i + 1) + return $partial_res return [$join] } }; @@ -415,6 +419,10 @@ declare function jsoniq_numpy:identity($n as integer, $params as object) { } }; +declare function jsoniq_numpy:identity($n as integer) { + jsoniq_numpy:identity($n, {}) +}; + (: Binary search method. It performs binary search over the given arr parameter looking for the value of x for it. The current behavior is to return the first matching position for a given x even if more values of it are present. Required params are: - arr (array): the array to search for x @@ -536,3 +544,31 @@ declare function jsoniq_numpy:monotonic($arr as array) { 1 }; +(: Gives a new shape to an array. Currently, only integer sizing is supported. +Required params are: +- arr (array): the array to reshape +- shape (array) UNSUPPORTED: the one-dimensional value to resize it to. :) +declare function jsoniq_numpy:reshape($arr as array) { + flatten($arr) +}; + +(: Helper method for argwhere :) +declare function jsoniq_numpy:argwhere($arr, $res as array) { + typeswitch($arr) + case array return { + for $i in 1 to size($arr) + let $sub_arr := $arr[[$i]] + let $next_res := [$res[], $i] + return jsoniq_numpy:argwhere($sub_arr, $next_res) + } + case integer return if ($arr gt 0) then $res + else () + default return () +}; + +(: Returns the indexes of non-zero elements with respect to the dimension. The result is a [N, nr_dim] array, where N is the number of non-zero elements and nr_dim is the number of dimensions. +Required params are: +- arr (array): the array to look into :) +declare function jsoniq_numpy:argwhere($arr as array) { + [jsoniq_numpy:argwhere($arr, [])] +}; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq index af1061bf2..c3d5e7b8d 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq @@ -21,10 +21,15 @@ declare function jsoniq_utils:shape($arr as array) { variable $shape := []; variable $pos := 1; variable $it := $arr; - while (size($it) gt 0) { - insert json size($it) into $shape at position $pos; - $pos := $pos + 1; - $it := $arr[[1]]; + try { + while (size($it) gt 0) { + insert json size($it) into $shape at position $pos; + $pos := $pos + 1; + $it := $it[[1]]; + } + } catch XPTY0004 { + (: While loop stops when $it becomes a single value :) + (); } $shape }; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_argwhere.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_argwhere.jq new file mode 100644 index 000000000..83a7eb717 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_argwhere.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="([ [ 1, 1, 1 ], [ 1, 1, 2 ], [ 1, 1, 3 ], [ 1, 2, 1 ], [ 1, 2, 2 ], [ 1, 2, 3 ] ], [ [ 1, 1, 1 ], [ 1, 2, 1 ], [ 2, 1, 1 ], [ 2, 2, 1 ], [ 3, 1, 1 ], [ 3, 2, 1 ], [ 4, 1, 1 ], [ 4, 2, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 2 ], [ 2, 1, 1 ], [ 2, 1, 2 ], [ 3, 1, 1 ], [ 3, 1, 2 ] ], [ [ 1, 1 ], [ 2, 2 ], [ 3, 3 ], [ 4, 4 ], [ 5, 5 ], [ 6, 6 ], [ 7, 7 ], [ 8, 8 ], [ 9, 9 ], [ 10, 10 ], [ 11, 11 ], [ 12, 12 ], [ 13, 13 ], [ 14, 14 ], [ 15, 15 ], [ 16, 16 ], [ 17, 17 ], [ 18, 18 ], [ 19, 19 ], [ 20, 20 ], [ 21, 21 ], [ 22, 22 ], [ 23, 23 ], [ 24, 24 ], [ 25, 25 ], [ 26, 26 ], [ 27, 27 ], [ 28, 28 ], [ 29, 29 ], [ 30, 30 ] ])":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:argwhere(numpy:ones([1, 2, 3])),numpy:argwhere(numpy:ones([4, 2, 1])), numpy:argwhere(numpy:ones([3, 1, 2])), numpy:argwhere(numpy:identity(30)) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_reshape.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_reshape.jq new file mode 100644 index 000000000..d76bd5547 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_reshape.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:reshape(numpy:zeros([1,2,3,4,5,6])) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_shape.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_shape.jq new file mode 100644 index 000000000..bc9e22c14 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_shape.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="([ 1, 1, 2 ], [ 3, 2 ], [ 7 ], [ 1, 2, 3, 4, 5, 6, 7, 8 ])":) +import module namespace utils = "jsoniq_utils.jq"; +import module namespace numpy = "jsoniq_numpy.jq"; +utils:shape([[[3,4]]]), utils:shape([[1,2], [3,4], [4, 5]]), utils:shape(numpy:arange(7)), utils:shape(numpy:ones([1, 2, 3, 4, 5, 6, 7, 8])) \ No newline at end of file From c87e1007ea3e62ee7e972502c8b2058bf9c78ab9 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Fri, 14 Jun 2024 12:24:51 +0200 Subject: [PATCH 07/56] Added minimum with axis --- .../runtime/numpy_lib/jsoniq_numpy.jq | 141 ++++++++++++++---- .../numpy_lib/test_jsoniq_numpy_min.jq | 3 + 2 files changed, 118 insertions(+), 26 deletions(-) create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_min.jq diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index 99d99834a..408fbd648 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -99,32 +99,6 @@ declare function jsoniq_numpy:ones($shape as array) { }; -(: -declare function local:min_array($array1 as array, $array2 as array) { - -}; - -declare function local:min_rec($array as array, $axis as integer, $dim as integer) { - if ($dim eq 0) then {();} - else { - if ($dim eq $axis) then { - (: Take the first array as minimum :) - variable $mini := $array[[1]]; - for $i in 2 to $dim - return $mini := local:min_array($mini, $array[[$i]]); - exit returning $mini; - } else { - for $i in 1 to $dim - return [local:min_rec($array[[$i]], $axis, size($array[[$i]]))]; - } - } -}; - -declare function local:min($array as array, $axis as integer) { - local:min_res($array, $axis, size($array)) -}; -:) - declare type jsoniq_numpy:linspace_params as { "num": "integer=50", "endpoint": "boolean=true", @@ -571,4 +545,119 @@ Required params are: - arr (array): the array to look into :) declare function jsoniq_numpy:argwhere($arr as array) { [jsoniq_numpy:argwhere($arr, [])] +}; + +(: Axis based methods :) + +(: Helper method to compute minimum of two arrays. The minimum is computed per index, so the minimum value for a specific index is taken. :) +declare function jsoniq_numpy:min_array_rec($array1, $array2) { + typeswitch($array1) + case array return let $join := + for $i in 1 to size($array1) + return jsoniq_numpy:min_array_rec($array1[[$i]], $array2[[$i]]) + return [$join] + default return if ($array1 lt $array2) then $array1 + else $array2 +}; +(: Helper method to compute minimum of two arrays. The minimum is computed per index, so the minimum value for a specific index is taken. If the minimum is greater than initial, initial is returned instead as the minimum. :) +declare function jsoniq_numpy:min_array_rec($array1, $array2, $initial) { + typeswitch($array1) + case array return let $join := + for $i in 1 to size($array1) + return jsoniq_numpy:min_array_rec($array1[[$i]], $array2[[$i]], $initial) + return [$join] + default return if ($array1 lt $array2) then + if ($initial lt $array1) then $initial + else $array1 + else + if ($initial lt $array2) then $initial + else $array2 +}; + +(: Helper method to compute the minimum on the right axis. :) +declare function jsoniq_numpy:min_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer) { + if ($dim eq $max_dim) then exit returning min($array[]); + else { + if ($dim eq $axis) then { + (: Take the first array as minimum :) + variable $mini := $array[[1]]; + variable $i := 2; + while ($i le size($array)) { + $mini := jsoniq_numpy:min_array_rec($mini, $array[[$i]]); + $i := $i + 1; + } + exit returning $mini; + } else { + let $join := + let $size := size($array) + for $i in 1 to $size + return jsoniq_numpy:min_rec($array[[$i]], $axis, $dim + 1, $max_dim) + return exit returning [$join]; + } + } +}; + +(: Helper method to compute the minimum on the right axis and using initial. :) +declare function jsoniq_numpy:min_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer, $initial as integer) { + if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); + else + if ($dim eq $max_dim) then exit returning min(($array[], $initial)); + else { + if ($dim eq $axis) then { + (: Take the first array as minimum :) + variable $mini := $array[[1]]; + variable $i := 2; + while ($i le size($array)) { + $mini := jsoniq_numpy:min_array_rec($mini, $array[[$i]], $initial); + $i := $i + 1; + } + exit returning $mini; + } else { + let $join := + let $size := size($array) + for $i in 1 to $size + return jsoniq_numpy:min_rec($array[[$i]], $axis, $dim + 1, $max_dim, $initial) + return exit returning [$join]; + } + } +}; + +(: Helper method that invokes minimum with axis only :) +declare function jsoniq_numpy:min_($array as array, $axis as integer) { + if ($axis eq -1) then min($array[]) + else + jsoniq_numpy:min_rec($array, $axis, 0, size(utils:shape($array)) - 1) +}; + +(: Helper method that invokes minimum with axis and initial :) +declare function jsoniq_numpy:min_($array as array, $axis as integer, $initial as integer) { + if ($axis eq -1) then min(($array[], $initial)) + else + jsoniq_numpy:min_rec($array, $axis, 0, size(utils:shape($array)) - 1, $initial) + +}; + +declare type jsoniq_numpy:min_params as { + "axis": "integer=-1", + "initial": "integer=-2147483648" +}; + +(: Min returns the minimum value of an array along an axis. Without an axis, it returns the minimum value in the array. +Required params are: +- array (array): The array to look into +Params is an object for optional arguments. These arguments are: +- axis (integer): The axis along which to compute the minimum. Only values greater than 0 are accepted. +- initial (integer): The maximum value returned as output. If a minimum value is greater than initial, initial is returned. We reserve the value -2147483648 for the default, unset value of initial.:) +declare function jsoniq_numpy:min($array as array, $params as object) { + let $params := validate type jsoniq_numpy:min_params {$params} + return { + if ($params.initial eq -2147483648) then + jsoniq_numpy:min_($array, $params.axis) + else + jsoniq_numpy:min_($array, $params.axis, $params.initial) + } +}; + +declare function jsoniq_numpy:min($array as array) { + jsoniq_numpy:min($array, {}) }; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_min.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_min.jq new file mode 100644 index 000000000..cb11b33d5 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_min.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="([ 0, 1 ], [ 0, 2 ], [ 0, 3, 6 ], [ 0, 1, 2 ], [ [ 0, 1, 2, 3 ], [ 8, 9, 10, 11 ] ], [ [ 0, 1, 2, 3 ], [ 4, 5, 6, 7 ] ], [ [ 0, 4 ], [ 8, 12 ] ], [ 10, 11, 22 ], [ 10, 11 ], 5, 5, 0, 0)":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:min([[0, 1], [2, 3]], {"axis": 0}), numpy:min([[0, 1], [2, 3]], {"axis": 1}), numpy:min([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 1}), numpy:min([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 0}), numpy:min([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 1}), numpy:min([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 0}), numpy:min([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 2}), numpy:min([[10, 17, 25], [15, 11, 22]], {"axis": 0}), numpy:min([[10, 17, 25], [15, 11, 22]], {"axis": 1}), numpy:min(numpy:arange(20, {"start":5})), numpy:min(numpy:arange(20, {"start":5}), {"axis": 0}), numpy:min(numpy:arange(20, {"start":5}), {"axis": 0, "initial": 0}), numpy:min(numpy:arange(20, {"start":5}), { "initial": 0}) \ No newline at end of file From a353d48f9cc6f6815318fbbd82778619da4c0f70 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Fri, 14 Jun 2024 12:29:00 +0200 Subject: [PATCH 08/56] Fixed error throw issue --- .../rumbledb/runtime/functions/error/ThrowErrorIterator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/functions/error/ThrowErrorIterator.java b/src/main/java/org/rumbledb/runtime/functions/error/ThrowErrorIterator.java index d26fad2ce..c83e61534 100644 --- a/src/main/java/org/rumbledb/runtime/functions/error/ThrowErrorIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/error/ThrowErrorIterator.java @@ -29,13 +29,13 @@ public Item materializeFirstItemOrNull(DynamicContext context) { Item errorCode = this.children.get(0).materializeFirstItemOrNull(context); throw new RumbleException( "An error has been raised without an error description.", - ErrorCode.valueOf(errorCode.toString()) + ErrorCode.valueOf(errorCode.getStringValue()) ); } else { // Error code and description arguments case. Item errorCode = this.children.get(0).materializeFirstItemOrNull(context); Item description = this.children.get(1).materializeFirstItemOrNull(context); - throw new RumbleException(description.toString(), ErrorCode.valueOf(errorCode.toString())); + throw new RumbleException(description.getStringValue(), ErrorCode.valueOf(errorCode.getStringValue())); } } } From eff118b3aa0f17396ffc83e5bf49e691e455c693 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Fri, 14 Jun 2024 13:24:46 +0200 Subject: [PATCH 09/56] Added max function --- .gitlab-ci.yml | 9 +- .../runtime/numpy_lib/jsoniq_numpy.jq | 115 ++++++++++++++++++ .../numpy_lib/test_jsoniq_numpy_max.jq | 3 + 3 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_max.jq diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fb9f08fd3..b72e77c7f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -46,8 +46,15 @@ FrontendTests: RuntimeTests: stage: tests3 + artifacts: + name: "Runtime Tests log" + paths: + - target/runtime_test.log + when: + always + expire_in: 2 days script: - - mvn -Dtest=RuntimeTests test + - mvn -Dtest=RuntimeTests test --log-file target/runtime_test.log RuntimeTestsNoParallelism: stage: tests3 diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index 408fbd648..4432f6fa2 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -660,4 +660,119 @@ declare function jsoniq_numpy:min($array as array, $params as object) { declare function jsoniq_numpy:min($array as array) { jsoniq_numpy:min($array, {}) +}; + +(: MAX :) + +(: Helper method to compute maximum of two arrays. The maximum is computed per index, so the maximum value for a specific index is taken. :) +declare function jsoniq_numpy:max_array_rec($array1, $array2) { + typeswitch($array1) + case array return let $join := + for $i in 1 to size($array1) + return jsoniq_numpy:max_array_rec($array1[[$i]], $array2[[$i]]) + return [$join] + default return if ($array1 gt $array2) then $array1 + else $array2 +}; +(: Helper method to compute maximum of two arrays. The maximum is computed per index, so the maximum value for a specific index is taken. If the maximum is greater than initial, initial is returned instead as the maximum. :) +declare function jsoniq_numpy:max_array_rec($array1, $array2, $initial) { + typeswitch($array1) + case array return let $join := + for $i in 1 to size($array1) + return jsoniq_numpy:max_array_rec($array1[[$i]], $array2[[$i]], $initial) + return [$join] + default return if ($array1 gt $array2) then + if ($initial gt $array1) then $initial + else $array1 + else + if ($initial gt $array2) then $initial + else $array2 +}; + +(: Helper method to compute the maximum on the right axis. :) +declare function jsoniq_numpy:max_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer) { + if ($dim eq $max_dim) then exit returning max($array[]); + else { + if ($dim eq $axis) then { + (: Take the first array as maximum :) + variable $maxii := $array[[1]]; + variable $i := 2; + while ($i le size($array)) { + $maxii := jsoniq_numpy:max_array_rec($maxii, $array[[$i]]); + $i := $i + 1; + } + exit returning $maxii; + } else { + let $join := + let $size := size($array) + for $i in 1 to $size + return jsoniq_numpy:max_rec($array[[$i]], $axis, $dim + 1, $max_dim) + return exit returning [$join]; + } + } +}; + +(: Helper method to compute the maximum on the right axis and using initial. :) +declare function jsoniq_numpy:max_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer, $initial as integer) { + if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); + else + if ($dim eq $max_dim) then exit returning max(($array[], $initial)); + else { + if ($dim eq $axis) then { + (: Take the first array as maximum :) + variable $maxii := $array[[1]]; + variable $i := 2; + while ($i le size($array)) { + $maxii := jsoniq_numpy:max_array_rec($maxii, $array[[$i]], $initial); + $i := $i + 1; + } + exit returning $maxii; + } else { + let $join := + let $size := size($array) + for $i in 1 to $size + return jsoniq_numpy:max_rec($array[[$i]], $axis, $dim + 1, $max_dim, $initial) + return exit returning [$join]; + } + } +}; + +(: Helper method that invokes maximum with axis only :) +declare function jsoniq_numpy:max_($array as array, $axis as integer) { + if ($axis eq -1) then max($array[]) + else + jsoniq_numpy:max_rec($array, $axis, 0, size(utils:shape($array)) - 1) +}; + +(: Helper method that invokes maximum with axis and initial :) +declare function jsoniq_numpy:max_($array as array, $axis as integer, $initial as integer) { + if ($axis eq -1) then max(($array[], $initial)) + else + jsoniq_numpy:max_rec($array, $axis, 0, size(utils:shape($array)) - 1, $initial) + +}; + +declare type jsoniq_numpy:max_params as { + "axis": "integer=-1", + "initial": "integer=2147483647" +}; + +(: max returns the maximum value of an array along an axis. Without an axis, it returns the maximum value in the array. +Required params are: +- array (array): The array to look into +Params is an object for optional arguments. These arguments are: +- axis (integer): The axis along which to compute the maximum. Only values greater than 0 are accepted. +- initial (integer): The maximum value returned as output. If a maximum value is smaller than initial, initial is returned. We reserve the value 2147483647 for the default, unset value of initial.:) +declare function jsoniq_numpy:max($array as array, $params as object) { + let $params := validate type jsoniq_numpy:max_params {$params} + return { + if ($params.initial eq 2147483647) then + jsoniq_numpy:max_($array, $params.axis) + else + jsoniq_numpy:max_($array, $params.axis, $params.initial) + } +}; + +declare function jsoniq_numpy:max($array as array) { + jsoniq_numpy:max($array, {}) }; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_max.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_max.jq new file mode 100644 index 000000000..224d4d21c --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_max.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="([ 2, 3 ], [ 1, 3 ], [ 2, 5, 8 ], [ 6, 7, 8 ], [ [ 4, 5, 6, 7 ], [ 12, 13, 14, 15 ] ], [ [ 8, 9, 10, 11 ], [ 12, 13, 14, 15 ] ], [ [ 3, 7 ], [ 11, 15 ] ], [ 15, 17, 25 ], [ 25, 22 ], 19, 19, 20, 19)":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:max([[0, 1], [2, 3]], {"axis": 0}), numpy:max([[0, 1], [2, 3]], {"axis": 1}), numpy:max([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 1}), numpy:max([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 0}), numpy:max([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 1}), numpy:max([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 0}), numpy:max([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 2}), numpy:max([[10, 17, 25], [15, 11, 22]], {"axis": 0}), numpy:max([[10, 17, 25], [15, 11, 22]], {"axis": 1}), numpy:max(numpy:arange(20, {"start":5})), numpy:max(numpy:arange(20, {"start":5}), {"axis": 0}), numpy:max(numpy:arange(20, {"start":5}), {"axis": 0, "initial": 20}), numpy:max(numpy:arange(20, {"start":5}), { "initial": 0}) \ No newline at end of file From 0e6b8c89342f31c8bdbdb5e2a7d9fee1d122494b Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Fri, 14 Jun 2024 16:26:42 +0200 Subject: [PATCH 10/56] Added mean --- .../runtime/numpy_lib/jsoniq_numpy.jq | 158 +++++++++++++----- .../numpy_lib/test_jsoniq_numpy_mean.jq | 13 ++ 2 files changed, 131 insertions(+), 40 deletions(-) create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_mean.jq diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index 4432f6fa2..7fff01377 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -576,32 +576,34 @@ declare function jsoniq_numpy:min_array_rec($array1, $array2, $initial) { (: Helper method to compute the minimum on the right axis. :) declare function jsoniq_numpy:min_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer) { - if ($dim eq $max_dim) then exit returning min($array[]); - else { - if ($dim eq $axis) then { - (: Take the first array as minimum :) - variable $mini := $array[[1]]; - variable $i := 2; - while ($i le size($array)) { - $mini := jsoniq_numpy:min_array_rec($mini, $array[[$i]]); - $i := $i + 1; + if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); + else + if ($dim eq $max_dim) then exit returning min(flatten($array[])); + else { + if ($dim eq $axis) then { + (: Take the first array as minimum :) + variable $mini := $array[[1]]; + variable $i := 2; + while ($i le size($array)) { + $mini := jsoniq_numpy:min_array_rec($mini, $array[[$i]]); + $i := $i + 1; + } + exit returning $mini; + } else { + let $join := + let $size := size($array) + for $i in 1 to $size + return jsoniq_numpy:min_rec($array[[$i]], $axis, $dim + 1, $max_dim) + return exit returning [$join]; } - exit returning $mini; - } else { - let $join := - let $size := size($array) - for $i in 1 to $size - return jsoniq_numpy:min_rec($array[[$i]], $axis, $dim + 1, $max_dim) - return exit returning [$join]; } - } }; (: Helper method to compute the minimum on the right axis and using initial. :) declare function jsoniq_numpy:min_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer, $initial as integer) { if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); else - if ($dim eq $max_dim) then exit returning min(($array[], $initial)); + if ($dim eq $max_dim) then exit returning min((flatten($array[]), $initial)); else { if ($dim eq $axis) then { (: Take the first array as minimum :) @@ -624,14 +626,14 @@ declare function jsoniq_numpy:min_rec($array as array, $axis as integer, $dim as (: Helper method that invokes minimum with axis only :) declare function jsoniq_numpy:min_($array as array, $axis as integer) { - if ($axis eq -1) then min($array[]) + if ($axis eq -1) then min(flatten($array[])) else jsoniq_numpy:min_rec($array, $axis, 0, size(utils:shape($array)) - 1) }; (: Helper method that invokes minimum with axis and initial :) declare function jsoniq_numpy:min_($array as array, $axis as integer, $initial as integer) { - if ($axis eq -1) then min(($array[], $initial)) + if ($axis eq -1) then min((flatten($array[]), $initial)) else jsoniq_numpy:min_rec($array, $axis, 0, size(utils:shape($array)) - 1, $initial) @@ -691,32 +693,34 @@ declare function jsoniq_numpy:max_array_rec($array1, $array2, $initial) { (: Helper method to compute the maximum on the right axis. :) declare function jsoniq_numpy:max_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer) { - if ($dim eq $max_dim) then exit returning max($array[]); - else { - if ($dim eq $axis) then { - (: Take the first array as maximum :) - variable $maxii := $array[[1]]; - variable $i := 2; - while ($i le size($array)) { - $maxii := jsoniq_numpy:max_array_rec($maxii, $array[[$i]]); - $i := $i + 1; + if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); + else + if ($dim eq $max_dim) then exit returning max(flatten($array[])); + else { + if ($dim eq $axis) then { + (: Take the first array as maximum :) + variable $maxii := $array[[1]]; + variable $i := 2; + while ($i le size($array)) { + $maxii := jsoniq_numpy:max_array_rec($maxii, $array[[$i]]); + $i := $i + 1; + } + exit returning $maxii; + } else { + let $join := + let $size := size($array) + for $i in 1 to $size + return jsoniq_numpy:max_rec($array[[$i]], $axis, $dim + 1, $max_dim) + return exit returning [$join]; } - exit returning $maxii; - } else { - let $join := - let $size := size($array) - for $i in 1 to $size - return jsoniq_numpy:max_rec($array[[$i]], $axis, $dim + 1, $max_dim) - return exit returning [$join]; } - } }; (: Helper method to compute the maximum on the right axis and using initial. :) declare function jsoniq_numpy:max_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer, $initial as integer) { if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); else - if ($dim eq $max_dim) then exit returning max(($array[], $initial)); + if ($dim eq $max_dim) then exit returning max((flatten($array[]), $initial)); else { if ($dim eq $axis) then { (: Take the first array as maximum :) @@ -739,14 +743,14 @@ declare function jsoniq_numpy:max_rec($array as array, $axis as integer, $dim as (: Helper method that invokes maximum with axis only :) declare function jsoniq_numpy:max_($array as array, $axis as integer) { - if ($axis eq -1) then max($array[]) + if ($axis eq -1) then max(flatten($array[])) else jsoniq_numpy:max_rec($array, $axis, 0, size(utils:shape($array)) - 1) }; (: Helper method that invokes maximum with axis and initial :) declare function jsoniq_numpy:max_($array as array, $axis as integer, $initial as integer) { - if ($axis eq -1) then max(($array[], $initial)) + if ($axis eq -1) then max((flatten($array[]), $initial)) else jsoniq_numpy:max_rec($array, $axis, 0, size(utils:shape($array)) - 1, $initial) @@ -775,4 +779,78 @@ declare function jsoniq_numpy:max($array as array, $params as object) { declare function jsoniq_numpy:max($array as array) { jsoniq_numpy:max($array, {}) +}; + + +(: MEAN :) +(: TODO: Currently, only the axis argument is supported. :) +(: Helper method to sum two arrays together. :) +declare function jsoniq_numpy:sum_array_rec($array1, $array2) { + typeswitch($array1) + case array return let $join := + for $i in 1 to size($array1) + return jsoniq_numpy:sum_array_rec($array1[[$i]], $array2[[$i]]) + return [$join] + default return $array1 + $array2 +}; + +(: Helper method to compute average on an array given the number of values. :) +declare function jsoniq_numpy:mean_array_rec($array1, $count) { + typeswitch($array1) + case array return let $join := + for $i in 1 to size($array1) + return jsoniq_numpy:mean_array_rec($array1[[$i]], $count) + return [$join] + default return $array1 div $count +}; + +(: Helper method to compute the mean on the right axis. :) +declare function jsoniq_numpy:mean_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer) { + if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); + else + if ($dim eq $max_dim) then exit returning avg(flatten($array)); + else { + if ($dim eq $axis) then { + (: Take the first array as sum :) + variable $mean := $array[[1]]; + variable $i := 2; + while ($i le size($array)) { + $mean := jsoniq_numpy:sum_array_rec($mean, $array[[$i]]); + $i := $i + 1; + } + $mean := jsoniq_numpy:mean_array_rec($mean, size($array)); + exit returning $mean; + } else { + let $join := + let $size := size($array) + for $i in 1 to $size + return jsoniq_numpy:mean_rec($array[[$i]], $axis, $dim + 1, $max_dim) + return exit returning [$join]; + } + } +}; + +(: Helper method that invokes maximum with axis only :) +declare function jsoniq_numpy:mean_($array as array, $axis as integer) { + if ($axis eq -1) then avg(flatten($array)) + else + jsoniq_numpy:mean_rec($array, $axis, 0, size(utils:shape($array)) - 1) +}; + +declare type jsoniq_numpy:mean_params as { + "axis": "integer=-1" +}; + +(: mean returns the mean (average) of an array along an axis. Without an axis, it returns the mean of the array. +Required params are: +- array (array): The array to look into +Params is an object for optional arguments. These arguments are: +- axis (integer): The axis along which to compute the mean. Only values greater than 0 are accepted.:) +declare function jsoniq_numpy:mean($array as array, $params as object) { + let $params := validate type jsoniq_numpy:mean_params {$params} + return jsoniq_numpy:mean_($array, $params.axis) +}; + +declare function jsoniq_numpy:mean($array as array) { + jsoniq_numpy:mean($array, {}) }; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_mean.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_mean.jq new file mode 100644 index 000000000..7d1f1f0a5 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_mean.jq @@ -0,0 +1,13 @@ +(:JIQS: ShouldRun; Output="(2.5, [ 2, 3 ], [ 1.5, 3.5 ], 12, [ 10, 11.3333333333, 14.6666666667 ], [ 9, 12, 15 ], 14.5, [ [ [ 0, 1, 2, 3, 4 ], [ 5, 6, 7, 8, 9 ], [ 10, 11, 12, 13, 14 ] ], [ [ 15, 16, 17, 18, 19 ], [ 20, 21, 22, 23, 24 ], [ 25, 26, 27, 28, 29 ] ] ], [ [ [ 7.5, 8.5, 9.5, 10.5, 11.5 ], [ 12.5, 13.5, 14.5, 15.5, 16.5 ], [ 17.5, 18.5, 19.5, 20.5, 21.5 ] ] ], [ [ [ 5, 6, 7, 8, 9 ], [ 20, 21, 22, 23, 24 ] ] ], [ [ [ 2, 7, 12 ], [ 17, 22, 27 ] ] ])":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:mean([[1, 2], [3, 4]]), +numpy:mean([[1, 2], [3, 4]], {"axis": 0}), +numpy:mean([[1, 2], [3, 4]], {"axis": 1}), +numpy:mean([[5, 9, 13], [14, 10, 12], [11, 15, 19]]), +numpy:mean([[5, 9, 13], [14, 10, 12], [11, 15, 19]], {"axis": 0}), +numpy:mean([[5, 9, 13], [14, 10, 12], [11, 15, 19]], {"axis": 1}), +numpy:mean([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]]), +numpy:mean([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 0}), +numpy:mean([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 1}), +numpy:mean([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 2}), +numpy:mean([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 3}) \ No newline at end of file From 2b27e7ae40ae78bef7844f5f03633e42423f0b84 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Fri, 14 Jun 2024 17:05:34 +0200 Subject: [PATCH 11/56] Added absolute --- .../test_files/runtime/numpy_lib/jsoniq_numpy.jq | 16 ++++++++++++++++ .../numpy_lib/test_jsoniq_numpy_absolute.jq | 8 ++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_absolute.jq diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index 7fff01377..82c698bc5 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -853,4 +853,20 @@ declare function jsoniq_numpy:mean($array as array, $params as object) { declare function jsoniq_numpy:mean($array as array) { jsoniq_numpy:mean($array, {}) +}; + +(: Returns the array in absolute value. +Required params are: +- array (array): the array to perform absolute value on. +Other numpy equivalent numpy params are unsupported. +:) +declare function jsoniq_numpy:absolute($array) { + typeswitch($array) + case array return if (size($array) eq 0) then [] + else + let $join := + for $i in 1 to size($array) + return jsoniq_numpy:absolute($array[[$i]]) + return [$join] + default return abs($array) }; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_absolute.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_absolute.jq new file mode 100644 index 000000000..f67b87f6a --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_absolute.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldRun; Output="([ 1, 2, 3 ], [ 1, 2, 3 ], [ [ 1, 2, 1 ], [ 2, 3, 3 ] ], [ 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ], [ [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 1, 2, 3 ] ] ], [ ])":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:absolute([1,2,3]), +numpy:absolute([-1,2,-3]), +numpy:absolute([[-1, -2, 1], [2, 3, -3]]), +numpy:absolute(numpy:arange(30, {"start": -50})), +numpy:absolute([[[1, 2, 3], [4, -5, -6], [-1, 2, 3]]]), +numpy:absolute([]) \ No newline at end of file From f3a8fc47f597415d196dad53ab7003a17c2bdc33 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Mon, 17 Jun 2024 12:24:41 +0200 Subject: [PATCH 12/56] Added sort and count nonzero --- .../runtime/numpy_lib/jsoniq_numpy.jq | 103 ++++++++++++++++++ .../test_jsoniq_numpy_count_nonzero.jq | 14 +++ .../numpy_lib/test_jsoniq_numpy_sort.jq | 11 ++ 3 files changed, 128 insertions(+) create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_count_nonzero.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_sort.jq diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index 82c698bc5..b452c3f2c 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -869,4 +869,107 @@ declare function jsoniq_numpy:absolute($array) { return jsoniq_numpy:absolute($array[[$i]]) return [$join] default return abs($array) +}; + +declare function jsoniq_numpy:sort($array as array, $low as integer, $high as integer) as array { + if ($low ge $high or $low lt 1) then exit returning $array; + else { + variable $partition_res := jsoniq_numpy:partition($array, $low, $high); + $array := [flatten(subsequence($partition_res, 1, 1))]; + variable $pivot := subsequence($partition_res, 2, 2); + $array := jsoniq_numpy:sort($array, $low, $pivot - 1); + $array := jsoniq_numpy:sort($array, $pivot + 1, $high); + exit returning $array; + } +}; + +declare function jsoniq_numpy:partition($array as array, $low as integer, $high as integer) { + variable $pivot := jsoniq_numpy:random_randint($low, {"high": $high + 1, "size": 1})[[1]]; + variable $end := $array[[$high]]; + replace json value of $array[[$high]] with $array[[$pivot]]; + replace json value of $array[[$pivot]] with $end; + + variable $i := $low; + for $j in $low to $high - 1 + return { + if ($array[[$j]] le $array[[$high]]) then { + variable $aux := $array[[$i]]; + replace json value of $array[[$i]] with $array[[$j]]; + replace json value of $array[[$j]] with $aux; + $i := $i + 1; + } else (); + } + variable $aux := $array[[$i]]; + replace json value of $array[[$i]] with $array[[$high]]; + replace json value of $array[[$high]] with $aux; + exit returning ($array, $i); +}; + +declare function jsoniq_numpy:sort($array) { + jsoniq_numpy:sort([flatten($array)], 1, size($array)) +}; + +(: Count non-zero :) + +(: TODO: Test with strings :) +(: Helper method to compute count nonzero on an array given the number of values. :) +declare function jsoniq_numpy:count_nonzero_rec_array($array1) { + typeswitch($array1) + case array return let $join := + for $i in 1 to size($array1) + return jsoniq_numpy:count_nonzero_rec_array($array1[[$i]]) + return [$join] + default return if ($array1 ne 0) then 1 + else 0 +}; + +(: Helper method to compute the mean on the right axis. :) +declare function jsoniq_numpy:count_nonzero_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer) { + if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); + else + if ($dim eq $max_dim) then exit returning sum(flatten(jsoniq_numpy:count_nonzero_rec_array($array))); + else { + if ($dim eq $axis) then { + (: Take the first array as sum :) + variable $count := jsoniq_numpy:count_nonzero_rec_array($array[[1]]); + variable $i := 2; + while ($i le size($array)) { + variable $curr_count := jsoniq_numpy:count_nonzero_rec_array($array[[$i]]); + $count := jsoniq_numpy:sum_array_rec($curr_count, $count); + $i := $i + 1; + } + exit returning $count; + } else { + let $join := + let $size := size($array) + for $i in 1 to $size + return jsoniq_numpy:count_nonzero_rec($array[[$i]], $axis, $dim + 1, $max_dim) + return exit returning [$join]; + } + } +}; + +(: Helper method that invokes maximum with axis only :) +declare function jsoniq_numpy:count_nonzero_($array as array, $axis as integer) { + if ($axis eq -1) then sum(flatten(jsoniq_numpy:count_nonzero_rec_array($array))) + else + jsoniq_numpy:count_nonzero_rec($array, $axis, 0, size(utils:shape($array)) - 1) +}; + +declare type jsoniq_numpy:count_nonzero_params as { + "axis": "integer=-1" +}; + +(: count_nonzero returns the the number of non-zero elements in the array. Non-zero is interpreted as being any value greater than 0, has a boolean value of True or is a non-empty string. +Required params are: +- array (array): The array to look into +Params is an object for optional arguments. These arguments are: +- axis (integer): The axis along which to compute the count on. Only values greater than 0 are accepted.:) +declare function jsoniq_numpy:count_nonzero($array as array, $params as object) { + let $params := validate type jsoniq_numpy:count_nonzero_params {$params} + return jsoniq_numpy:count_nonzero_($array, $params.axis) +}; + +declare function jsoniq_numpy:count_nonzero($array as array) { + jsoniq_numpy:count_nonzero($array, {}) }; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_count_nonzero.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_count_nonzero.jq new file mode 100644 index 000000000..bc087e59e --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_count_nonzero.jq @@ -0,0 +1,14 @@ +(:JIQS: ShouldRun; Output="(3, 4, 4, 3, [ 1, 2 ], [ 2, 0, 1 ], 8, [ [ 0, 1, 0, 1 ], [ 1, 0, 1, 1 ], [ 1, 1, 1, 0 ] ], [ [ 2, 2, 2, 2 ] ], [ [ 2, 3, 3 ] ])":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:count_nonzero([1,2,3]), +numpy:count_nonzero([-1,2,-3, 0, 1, 0]), +numpy:count_nonzero([-1,2,-3, 0, 1, 0], {"axis": 0}), +numpy:count_nonzero([[-1, 0, 0], [2, 0, -3]]), +numpy:count_nonzero([[-1, 0, 0], [2, 0, -3]], {"axis": 1}), +numpy:count_nonzero([[-1, 0, 0], [2, 0, -3]], {"axis": 0}), +numpy:count_nonzero([[[0, 1, 0, 3], [2, 0, -3, 7], [2, 1, -3, 0]]]), +numpy:count_nonzero([[[0, 1, 0, 3], [2, 0, -3, 7], [2, 1, -3, 0]]], {"axis": 0}), +numpy:count_nonzero([[[0, 1, 0, 3], [2, 0, -3, 7], [2, 1, -3, 0]]], {"axis": 1}), +numpy:count_nonzero([[[0, 1, 0, 3], [2, 0, -3, 7], [2, 1, -3, 0]]], {"axis": 2}) +(: numpy:count_nonzero(["1", "0", "2"]), +numpy:count_nonzero([[true, false], [false, false]]) :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_sort.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_sort.jq new file mode 100644 index 000000000..3a6b501e8 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_sort.jq @@ -0,0 +1,11 @@ +(:JIQS: ShouldRun; Output="([ -1, 1, 2, 6, 7, 10 ], [ ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 ], [ 1, 2, 3, 4, 5, 6, 7, 10 ], [ -1, 1, 2, 3, 4, 5, 6, 7 ], [ 1, 2, 2, 3, 5, 6, 7 ], [ 1, 1, 1, 1, 1, 1 ], [ -2, -1, 1, 2 ], [ -3, -2, -1, 1, 2 ])":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:sort([6, 7, 1, 2, 10, -1]), +numpy:sort([]), +numpy:sort(numpy:arange(25)), +numpy:sort([10, 1, 2, 3, 4, 5, 6, 7]), +numpy:sort([1, 2, 3, 4, 5, 6, 7, -1]), +numpy:sort([1, 2, 3, 2, 5, 6, 7]), +numpy:sort([1, 1, 1, 1, 1, 1]), +numpy:sort([1, -1, 2, -2]), +numpy:sort([1, 2, -1, -2, -3]) \ No newline at end of file From dfd45e0a5e551a9d253a887a49cecd17e9229ef8 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Tue, 18 Jun 2024 17:20:40 +0200 Subject: [PATCH 13/56] Added unique --- .../test_files/runtime/numpy_lib/jsoniq_numpy.jq | 13 ++++++++++--- .../runtime/numpy_lib/test_jsoniq_numpy_unique.jq | 8 ++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_unique.jq diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index b452c3f2c..90fc6f00f 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -872,14 +872,14 @@ declare function jsoniq_numpy:absolute($array) { }; declare function jsoniq_numpy:sort($array as array, $low as integer, $high as integer) as array { - if ($low ge $high or $low lt 1) then exit returning $array; + if ($low ge $high or $low lt 1) then $array else { variable $partition_res := jsoniq_numpy:partition($array, $low, $high); $array := [flatten(subsequence($partition_res, 1, 1))]; variable $pivot := subsequence($partition_res, 2, 2); $array := jsoniq_numpy:sort($array, $low, $pivot - 1); $array := jsoniq_numpy:sort($array, $pivot + 1, $high); - exit returning $array; + $array } }; @@ -930,7 +930,6 @@ declare function jsoniq_numpy:count_nonzero_rec($array as array, $axis as intege if ($dim eq $max_dim) then exit returning sum(flatten(jsoniq_numpy:count_nonzero_rec_array($array))); else { if ($dim eq $axis) then { - (: Take the first array as sum :) variable $count := jsoniq_numpy:count_nonzero_rec_array($array[[1]]); variable $i := 2; while ($i le size($array)) { @@ -972,4 +971,12 @@ declare function jsoniq_numpy:count_nonzero($array as array, $params as object) declare function jsoniq_numpy:count_nonzero($array as array) { jsoniq_numpy:count_nonzero($array, {}) +}; + + +(: unique returns a 1 dimensional array containing the unique elements of the array, sorted ascendingly. Currently, we only support flattening of the unique array as axis behavior is more intricate for jsoniq to support. +Required params are: +- array (array): the array to look for unique values.:) +declare function jsoniq_numpy:unique($array as array) { + jsoniq_numpy:sort([distinct-values(flatten($array))]) }; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_unique.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_unique.jq new file mode 100644 index 000000000..44dba55de --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_unique.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldRun; Output="([ 1, 2, 3 ], [ -3, -1, 2 ], [ -3, -2, -1, 1, 2, 3 ], [ -50, -49, -48, -47, -46, -45, -44, -43, -42, -41, -40, -39, -38, -37, -36, -35, -34, -33, -32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ], [ -6, -5, -1, 1, 2, 3, 4 ], [ ])":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:unique([1,2,3]), +numpy:unique([-1,2,-3]), +numpy:unique([[-1, -2, 1], [2, 3, -3]]), +numpy:unique(numpy:arange(30, {"start": -50})), +numpy:unique([[[1, 2, 3], [4, -5, -6], [-1, 2, 3]]]), +numpy:unique([]) \ No newline at end of file From 6525a658e23b0e8dd743d2ec75c44ab3f60f85a3 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Tue, 18 Jun 2024 19:24:56 +0200 Subject: [PATCH 14/56] Made count-zero work with non-integer --- .../test_files/runtime/numpy_lib/jsoniq_numpy.jq | 4 ++++ .../runtime/numpy_lib/test_jsoniq_numpy_count_nonzero.jq | 9 +++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index 90fc6f00f..8367b61c6 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -919,6 +919,10 @@ declare function jsoniq_numpy:count_nonzero_rec_array($array1) { for $i in 1 to size($array1) return jsoniq_numpy:count_nonzero_rec_array($array1[[$i]]) return [$join] + case string return if ($array1 eq "") then 0 + else 1 + case boolean return if ($array1) then 1 + else 0 default return if ($array1 ne 0) then 1 else 0 }; diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_count_nonzero.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_count_nonzero.jq index bc087e59e..4de3ba371 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_count_nonzero.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_count_nonzero.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="(3, 4, 4, 3, [ 1, 2 ], [ 2, 0, 1 ], 8, [ [ 0, 1, 0, 1 ], [ 1, 0, 1, 1 ], [ 1, 1, 1, 0 ] ], [ [ 2, 2, 2, 2 ] ], [ [ 2, 3, 3 ] ])":) +(:JIQS: ShouldRun; Output="(3, 4, 4, 3, [ 1, 2 ], [ 2, 0, 1 ], 8, [ [ 0, 1, 0, 1 ], [ 1, 0, 1, 1 ], [ 1, 1, 1, 0 ] ], [ [ 2, 2, 2, 2 ] ], [ [ 2, 3, 3 ] ], 3, 1, [ [ 3, 3, 3 ] ])":) import module namespace numpy = "jsoniq_numpy.jq"; numpy:count_nonzero([1,2,3]), numpy:count_nonzero([-1,2,-3, 0, 1, 0]), @@ -9,6 +9,7 @@ numpy:count_nonzero([[-1, 0, 0], [2, 0, -3]], {"axis": 0}), numpy:count_nonzero([[[0, 1, 0, 3], [2, 0, -3, 7], [2, 1, -3, 0]]]), numpy:count_nonzero([[[0, 1, 0, 3], [2, 0, -3, 7], [2, 1, -3, 0]]], {"axis": 0}), numpy:count_nonzero([[[0, 1, 0, 3], [2, 0, -3, 7], [2, 1, -3, 0]]], {"axis": 1}), -numpy:count_nonzero([[[0, 1, 0, 3], [2, 0, -3, 7], [2, 1, -3, 0]]], {"axis": 2}) -(: numpy:count_nonzero(["1", "0", "2"]), -numpy:count_nonzero([[true, false], [false, false]]) :) \ No newline at end of file +numpy:count_nonzero([[[0, 1, 0, 3], [2, 0, -3, 7], [2, 1, -3, 0]]], {"axis": 2}), +numpy:count_nonzero(["1", "0", "2"]), +numpy:count_nonzero([[true, false], [false, false]]), +numpy:count_nonzero([[[0, 1, 0.2, 3], [2, 0, -3.3, 7.21], [2, 1.12, -3, 0]]], {"axis": 2}) \ No newline at end of file From 7bd15d61075a7fa69b2a77b3f6d0cd69697ecd44 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Wed, 19 Jun 2024 12:37:23 +0200 Subject: [PATCH 15/56] Made reshape be n-dimensional --- .../runtime/numpy_lib/jsoniq_numpy.jq | 42 ++++++++++++++++--- .../numpy_lib/test_jsoniq_numpy_reshape.jq | 8 +++- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index 8367b61c6..bc20fb3ab 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -518,12 +518,44 @@ declare function jsoniq_numpy:monotonic($arr as array) { 1 }; -(: Gives a new shape to an array. Currently, only integer sizing is supported. -Required params are: +declare function jsoniq_numpy:product_of_all_values($arr as array) { + variable $product := 1; + variable $i := 1; + while ($i lt size($arr)) { + $product := $product * $arr[[$i]]; + $i := $i + 1; + } + $product +}; + + +declare function jsoniq_numpy:reshape_recursively($arr, $shape as array, $current_index as integer) { + if ($current_index gt size($shape)) then + $arr + else + if ($shape[[$current_index]] eq 1) then + [jsoniq_numpy:reshape_recursively($arr, $shape, $current_index + 1)] + else + let $join := let $size_arr := count($arr) + let $size_subarr := $size_arr div $shape[[$current_index]] + for $j in 0 to ($shape[[$current_index]] - 1) + return jsoniq_numpy:reshape_recursively(subsequence($arr, $j * $size_subarr + 1, $size_subarr), $shape, $current_index + 1) + return [$join] +}; +(: Gives a new shape to an array. The shape argument should have the product of its dimension sizes equal to the number of elements found in arr. - arr (array): the array to reshape -- shape (array) UNSUPPORTED: the one-dimensional value to resize it to. :) -declare function jsoniq_numpy:reshape($arr as array) { - flatten($arr) +- shape (array): the dimension sizes to resize to. :) +declare function jsoniq_numpy:reshape($arr as array, $shape as array) { + let $flatten_arr := flatten($arr) + let $flatten_size := count($flatten_arr) + let $product := jsoniq_numpy:product_of_all_values($shape) + return + if (($flatten_size mod $product) eq 0) then + (: construct array :) + jsoniq_numpy:reshape_recursively($flatten_arr, $shape, 1) + else + error("InvalidFunctionCallErrorCode", "Invalid call to reshape. The shape array must result in a size equivalent to the size of the array.") + }; (: Helper method for argwhere :) diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_reshape.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_reshape.jq index d76bd5547..f24107c20 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_reshape.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_reshape.jq @@ -1,3 +1,7 @@ -(:JIQS: ShouldRun; Output="(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)":) +(:JIQS: ShouldRun; Output="([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ [ [ [ [ 0, 0 ], [ 0, 0 ], [ 0, 0 ] ] ] ] ], [ [ 0, 0 ], [ 0, 0 ], [ 0, 0 ] ], [ [ [ [ 0 ] ], [ [ 0 ] ] ], [ [ [ 0 ] ], [ [ 0 ] ] ], [ [ [ 0 ] ], [ [ 0 ] ] ] ], [ [ [ 1, 4, 2 ] ], [ [ 241, -2, 34 ] ], [ [ 432, 234, 1 ] ], [ [ 423, 43, 430 ] ] ])":) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:reshape(numpy:zeros([1,2,3,4,5,6])) \ No newline at end of file +numpy:reshape(numpy:zeros([5,6]), [30]), +numpy:reshape(numpy:zeros([1,2,3]), [1, 1, 1, 3, 2]), +numpy:reshape(numpy:zeros([1,2,3]), [3, 2]), +numpy:reshape(numpy:zeros([1,2,3]), [3, 2, 1, 1]), +numpy:reshape([1, 4, 2, 241, -2, 34, 432, 234, 1, 423, 43, 430], [4, 1, 3]) \ No newline at end of file From 909c72c7e45b6260ee8a0d2802977187c6be5d48 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 20 Jun 2024 17:20:27 +0200 Subject: [PATCH 16/56] Added median --- .../runtime/numpy_lib/jsoniq_numpy.jq | 88 ++++++++++++++++++- .../numpy_lib/test_jsoniq_numpy_median.jq | 18 ++++ 2 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_median.jq diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index bc20fb3ab..12ddaf31e 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -943,7 +943,6 @@ declare function jsoniq_numpy:sort($array) { (: Count non-zero :) -(: TODO: Test with strings :) (: Helper method to compute count nonzero on an array given the number of values. :) declare function jsoniq_numpy:count_nonzero_rec_array($array1) { typeswitch($array1) @@ -1009,10 +1008,97 @@ declare function jsoniq_numpy:count_nonzero($array as array) { jsoniq_numpy:count_nonzero($array, {}) }; +(: Unique :) (: unique returns a 1 dimensional array containing the unique elements of the array, sorted ascendingly. Currently, we only support flattening of the unique array as axis behavior is more intricate for jsoniq to support. Required params are: - array (array): the array to look for unique values.:) declare function jsoniq_numpy:unique($array as array) { jsoniq_numpy:sort([distinct-values(flatten($array))]) +}; + +(: Median :) +(: Helper method to merge two arrays. Destination may have higher dimension that source, thus we may append to it if it is already an array. :) +declare function jsoniq_numpy:merge_arrays($source, $dest) { + typeswitch($source) + case array return let $join := + for $i in 1 to size($source) + return jsoniq_numpy:merge_arrays($source[[$i]], $dest[[$i]]) + return [$join] + default return typeswitch($dest) + case array return [$source, flatten($dest)] + default return [$source, $dest] +}; + +declare function jsoniq_numpy:median_of_array_recursive($array) { + if (size(utils:shape($array)) gt 1) then + let $join := + for $i in 1 to size($array) + return jsoniq_numpy:median_of_array_recursive($array[[$i]]) + return [$join] + else + jsoniq_numpy:median_of_array($array) +}; + +(: Helper method to compute the mean on the right axis. :) +declare function jsoniq_numpy:median_on_axis_recursive($array as array, $axis as integer, $dim as integer, $max_dim as integer) { + if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); + else + if ($dim eq $max_dim) then exit returning jsoniq_numpy:median_of_array($array); + else { + if ($dim eq $axis) then { + variable $sub_arr := $array[[1]]; + variable $i := 2; + while ($i le size($array)) { + $sub_arr := jsoniq_numpy:merge_arrays($array[[$i]], $sub_arr); + $i := $i + 1; + } + if ($i eq 2) then + (: no merging was done, no median is needed for this axis :) + exit returning $sub_arr; + else + exit returning jsoniq_numpy:median_of_array_recursive($sub_arr); + } else { + let $join := + let $size := size($array) + for $i in 1 to $size + return jsoniq_numpy:median_on_axis_recursive($array[[$i]], $axis, $dim + 1, $max_dim) + return exit returning [$join]; + } + } +}; + +declare function jsoniq_numpy:median_of_array($array as array) { + let $sorted_arr := jsoniq_numpy:sort($array) + let $middle_index := size($sorted_arr) div 2 + return + if (size($sorted_arr) mod 2 eq 0) then + ($sorted_arr[[$middle_index]] + $sorted_arr[[$middle_index + 1]]) div 2 + else + $sorted_arr[[$middle_index + 1]] +}; + +(: Helper method that computes median on given axis. It acts as a wrapper for the recursive method :) +declare function jsoniq_numpy:median_on_axis($array as array, $axis as integer) { + if ($axis eq -1) then jsoniq_numpy:median_of_array([flatten($array)]) + else + jsoniq_numpy:median_on_axis_recursive($array, $axis, 0, size(utils:shape($array)) - 1) +}; + +declare type jsoniq_numpy:median_params as { + "axis": "integer=-1" +}; + +(: median computes the median along the specified axis. Given an array V of length N, the median of V is the middle value of a sorted copy of V, V_sorted - i e., V_sorted[(N-1)/2], when N is odd, and the average of the two middle values of V_sorted when N is even. +Required params are: +- array (array): The array to look into +Params is an object for optional arguments. These arguments are: +- axis (integer): The axis along which to compute median on. Only values greater than 0 are accepted.:) +declare function jsoniq_numpy:median($array as array, $params as object) { + let $params := validate type jsoniq_numpy:median_params {$params} + return jsoniq_numpy:median_on_axis($array, $params.axis) +}; + +declare function jsoniq_numpy:median($array as array) { + jsoniq_numpy:median($array, {}) }; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_median.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_median.jq new file mode 100644 index 000000000..d29886391 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_median.jq @@ -0,0 +1,18 @@ +(:JIQS: ShouldRun; Output="(2.5, [ 2, 3 ], [ 1.5, 3.5 ], 12, [ 11, 10, 13 ], [ 9, 12, 15 ], 14.5, [ [ [ 0, 1, 2, 3, 4 ], [ 5, 6, 7, 8, 9 ], [ 10, 11, 12, 13, 14 ] ], [ [ 15, 16, 17, 18, 19 ], [ 20, 21, 22, 23, 24 ], [ 25, 26, 27, 28, 29 ] ] ], [ [ [ 7.5, 8.5, 9.5, 10.5, 11.5 ], [ 12.5, 13.5, 14.5, 15.5, 16.5 ], [ 17.5, 18.5, 19.5, 20.5, 21.5 ] ] ], [ [ [ 5, 6, 7, 8, 9 ], [ 20, 21, 22, 23, 24 ] ] ], [ [ [ 2, 7, 12 ], [ 17, 22, 27 ] ] ], 2.5, [ [ [ 1, 2, 3 ], [ 2, 4, 5 ] ] ], [ [ [ 1, 2, 3 ], [ 2, 4, 5 ] ] ], [ [ [ 1.5, 3, 4 ] ] ], [ [ [ 2, 4 ] ] ])":) +import module namespace numpy = "jsoniq_numpy.jq"; +numpy:median([[1, 2], [3, 4]]), +numpy:median([[1, 2], [3, 4]], {"axis": 0}), +numpy:median([[1, 2], [3, 4]], {"axis": 1}), +numpy:median([[5, 9, 13], [14, 10, 12], [11, 15, 19]]), +numpy:median([[5, 9, 13], [14, 10, 12], [11, 15, 19]], {"axis": 0}), +numpy:median([[5, 9, 13], [14, 10, 12], [11, 15, 19]], {"axis": 1}), +numpy:median([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]]), +numpy:median([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 0}), +numpy:median([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 1}), +numpy:median([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 2}), +numpy:median([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 3}), +numpy:median([[[[1,2,3],[2,4,5]]]]), +numpy:median([[[[1,2,3],[2,4,5]]]], {"axis": 0}), +numpy:median([[[[1,2,3],[2,4,5]]]], {"axis": 1}), +numpy:median([[[[1,2,3],[2,4,5]]]], {"axis": 2}), +numpy:median([[[[1,2,3],[2,4,5]]]], {"axis": 3}) \ No newline at end of file From f8db52d65489a7476698e05304d93481e7dc9a54 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 20 Jun 2024 17:30:45 +0200 Subject: [PATCH 17/56] Refactored tests structure --- .../runtime/numpy_lib/test_jsoniq_numpy_arange.jq | 8 +++++++- .../numpy_lib/test_jsoniq_numpy_argwhere.jq | 5 ++++- .../numpy_lib/test_jsoniq_numpy_binsearch.jq | 9 ++++++++- .../numpy_lib/test_jsoniq_numpy_digitize.jq | 12 +++++++++++- .../runtime/numpy_lib/test_jsoniq_numpy_full.jq | 9 ++++++--- .../numpy_lib/test_jsoniq_numpy_identity.jq | 6 +++++- .../numpy_lib/test_jsoniq_numpy_linspace.jq | 11 ++++++++++- .../numpy_lib/test_jsoniq_numpy_logspace.jq | 10 ++++++++-- .../runtime/numpy_lib/test_jsoniq_numpy_max.jq | 14 +++++++++++++- .../runtime/numpy_lib/test_jsoniq_numpy_min.jq | 14 +++++++++++++- .../runtime/numpy_lib/test_jsoniq_numpy_ones.jq | 7 ++++++- .../runtime/numpy_lib/test_jsoniq_numpy_random.jq | 5 ++++- .../runtime/numpy_lib/test_jsoniq_numpy_shape.jq | 5 ++++- .../runtime/numpy_lib/test_jsoniq_numpy_zeros.jq | 7 ++++++- 14 files changed, 105 insertions(+), 17 deletions(-) diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_arange.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_arange.jq index 3591521f6..c7c3c2945 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_arange.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_arange.jq @@ -1,3 +1,9 @@ (:JIQS: ShouldRun; Output="([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], [ 5, 6, 7, 8, 9 ], [ -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], [ -20, -19, -18, -17, -16, -15, -14, -13, -12, -11 ], [ -20, -18, -16, -14, -12 ], [ 20.7, 21.7, 22.7, 23.7, 24.7, 25.7, 26.7, 27.7, 28.7, 29.7, 30.7, 31.7, 32.7, 33.7, 34.7, 35.7, 36.7, 37.7, 38.7, 39.7, 40.7, 41.7, 42.7, 43.7, 44.7, 45.7, 46.7, 47.7, 48.7, 49.7, 50.7, 51.7, 52.7, 53.7 ], [ 20.7, 22.2, 23.7, 25.2, 26.7, 28.2, 29.7, 31.2, 32.7, 34.2, 35.7, 37.2, 38.7, 40.2, 41.7, 43.2, 44.7, 46.2, 47.7, 49.2, 50.7, 52.2, 53.7 ])":) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:arange(10, {"start": 0, "step": 1}), numpy:arange(10, {"start": 5, "step": 1}), numpy:arange(10, {"start": -10, "step": 1}), numpy:arange(-10, {"start": -20, "step": 1}), numpy:arange(-10, {"start": -20, "step": 2}), numpy:arange(54.3, {"start": 20.7, "step": 1}), numpy:arange(54.3, {"start": 20.7, "step": 1.5}) \ No newline at end of file +numpy:arange(10, {"start": 0, "step": 1}), +numpy:arange(10, {"start": 5, "step": 1}), +numpy:arange(10, {"start": -10, "step": 1}), +numpy:arange(-10, {"start": -20, "step": 1}), +numpy:arange(-10, {"start": -20, "step": 2}), +numpy:arange(54.3, {"start": 20.7, "step": 1}), +numpy:arange(54.3, {"start": 20.7, "step": 1.5}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_argwhere.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_argwhere.jq index 83a7eb717..1b97e7d00 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_argwhere.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_argwhere.jq @@ -1,3 +1,6 @@ (:JIQS: ShouldRun; Output="([ [ 1, 1, 1 ], [ 1, 1, 2 ], [ 1, 1, 3 ], [ 1, 2, 1 ], [ 1, 2, 2 ], [ 1, 2, 3 ] ], [ [ 1, 1, 1 ], [ 1, 2, 1 ], [ 2, 1, 1 ], [ 2, 2, 1 ], [ 3, 1, 1 ], [ 3, 2, 1 ], [ 4, 1, 1 ], [ 4, 2, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 2 ], [ 2, 1, 1 ], [ 2, 1, 2 ], [ 3, 1, 1 ], [ 3, 1, 2 ] ], [ [ 1, 1 ], [ 2, 2 ], [ 3, 3 ], [ 4, 4 ], [ 5, 5 ], [ 6, 6 ], [ 7, 7 ], [ 8, 8 ], [ 9, 9 ], [ 10, 10 ], [ 11, 11 ], [ 12, 12 ], [ 13, 13 ], [ 14, 14 ], [ 15, 15 ], [ 16, 16 ], [ 17, 17 ], [ 18, 18 ], [ 19, 19 ], [ 20, 20 ], [ 21, 21 ], [ 22, 22 ], [ 23, 23 ], [ 24, 24 ], [ 25, 25 ], [ 26, 26 ], [ 27, 27 ], [ 28, 28 ], [ 29, 29 ], [ 30, 30 ] ])":) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:argwhere(numpy:ones([1, 2, 3])),numpy:argwhere(numpy:ones([4, 2, 1])), numpy:argwhere(numpy:ones([3, 1, 2])), numpy:argwhere(numpy:identity(30)) \ No newline at end of file +numpy:argwhere(numpy:ones([1, 2, 3])), +numpy:argwhere(numpy:ones([4, 2, 1])), +numpy:argwhere(numpy:ones([3, 1, 2])), +numpy:argwhere(numpy:identity(30)) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_binsearch.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_binsearch.jq index 57b2b7388..2a9149df3 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_binsearch.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_binsearch.jq @@ -1,3 +1,10 @@ (:JIQS: ShouldRun; Output="(5, 4, 0, 101, 1, 10, 1, 11)":) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:binsearch(numpy:arange(10, {"start": 0, "step": 1}), 4), numpy:binsearch(numpy:arange(11, {"start": 0, "step": 1}), 3), numpy:binsearch(numpy:arange(100, {"start": 0, "step": 1}), -12), numpy:binsearch(numpy:arange(100, {"start": 0, "step": 1}), 101), numpy:binsearch(numpy:arange(10, {"start": 0, "step": 1}), 0), numpy:binsearch(numpy:arange(10, {"start": 0, "step": 1}), 9), numpy:binsearch(numpy:arange(11, {"start": 0, "step": 1}), 0), numpy:binsearch(numpy:arange(11, {"start": 0, "step": 1}), 10) \ No newline at end of file +numpy:binsearch(numpy:arange(10, {"start": 0, "step": 1}), 4), +numpy:binsearch(numpy:arange(11, {"start": 0, "step": 1}), 3), +numpy:binsearch(numpy:arange(100, {"start": 0, "step": 1}), -12), +numpy:binsearch(numpy:arange(100, {"start": 0, "step": 1}), 101), +numpy:binsearch(numpy:arange(10, {"start": 0, "step": 1}), 0), +numpy:binsearch(numpy:arange(10, {"start": 0, "step": 1}), 9), +numpy:binsearch(numpy:arange(11, {"start": 0, "step": 1}), 0), +numpy:binsearch(numpy:arange(11, {"start": 0, "step": 1}), 10) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq index c88244ced..836f52aea 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq @@ -1,3 +1,13 @@ (:JIQS: ShouldRun; Output="([ 2, 5, 4, 3 ], [ 3, 4, 5, 6, 7, 8, 9 ], [ 2, 3, 3, 3, 3, 3, 3 ], [ 0, 2, 2, 2, 5 ], [ ], [ ], [ 0, 0 ], [ 5, 2, 3, 4 ], [ 0, 0, 0, 0, 0, 0, 0 ], [ 5, 4, 4, 4, 4, 4, 4 ], [ 5, 4, 4, 4, 1 ])":) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:digitize([0.2, 6.4, 3.0, 1.6], [0.0, 1.0, 2.5, 4.0, 10.0]), numpy:digitize([1, 2, 3, 4, 5, 6, 7], numpy:arange(25)), numpy:digitize([1, 2, 3, 4, 5, 6, 7], [1, 2, 10, 20, 30]), numpy:digitize([1, 2, 3, 4, 7], [2, 5, 6, 7]), numpy:digitize([], []), numpy:digitize([], [1, 2, 3]), numpy:digitize([1, 2], []), numpy:digitize([0.2, 6.4, 3.0, 1.6], [10.0, 4.0, 2.5, 1.0, 0.0]), numpy:digitize([1, 2, 3, 4, 5, 6, 7], numpy:arange(0, {"start": 25, "step": -1})), numpy:digitize([1, 2, 3, 4, 5, 6, 7], [30, 20, 10, 2, 1]), numpy:digitize([1, 2, 3, 4, 7], [7, 6, 5, 2]) \ No newline at end of file +numpy:digitize([0.2, 6.4, 3.0, 1.6], [0.0, 1.0, 2.5, 4.0, 10.0]), +numpy:digitize([1, 2, 3, 4, 5, 6, 7], numpy:arange(25)), +numpy:digitize([1, 2, 3, 4, 5, 6, 7], [1, 2, 10, 20, 30]), +numpy:digitize([1, 2, 3, 4, 7], [2, 5, 6, 7]), +numpy:digitize([], []), +numpy:digitize([], [1, 2, 3]), +numpy:digitize([1, 2], []), +numpy:digitize([0.2, 6.4, 3.0, 1.6], [10.0, 4.0, 2.5, 1.0, 0.0]), +numpy:digitize([1, 2, 3, 4, 5, 6, 7], numpy:arange(0, {"start": 25, "step": -1})), +numpy:digitize([1, 2, 3, 4, 5, 6, 7], [30, 20, 10, 2, 1]), +numpy:digitize([1, 2, 3, 4, 7], [7, 6, 5, 2]) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_full.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_full.jq index b734f4c5e..fffdb9a71 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_full.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_full.jq @@ -1,5 +1,8 @@ (:JIQS: ShouldRun; Output="([ [ [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ] ], [ [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ] ], [ [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ] ] ], [ [ [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ] ], [ [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ] ], [ [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ] ] ], [ 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4 ], [ [ 78, 78 ], [ 78, 78 ] ], [ [ "-78.3", "-78.3" ], [ "-78.3", "-78.3" ] ], [ [ -78.3, -78.3 ], [ -78.3, -78.3 ] ])":) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:full([3,4,5], 3, {"type": "integer"}), numpy:full([3,4,5], 3, {"type": "string"}), -numpy:full([100], 34.4, {"type": "double"}), numpy:full([2, 2], 78.3, {"type": ""}), -numpy:full([2, 2], -78.3, {"type": "string"}), numpy:full([2, 2], -78.3, {"type": "double"}) \ No newline at end of file +numpy:full([3,4,5], 3, {"type": "integer"}), +numpy:full([3,4,5], 3, {"type": "string"}), +numpy:full([100], 34.4, {"type": "double"}), +numpy:full([2, 2], 78.3, {"type": ""}), +numpy:full([2, 2], -78.3, {"type": "string"}), +numpy:full([2, 2], -78.3, {"type": "double"}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_identity.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_identity.jq index 7a06bc67d..e89467ec1 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_identity.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_identity.jq @@ -1,3 +1,7 @@ (:JIQS: ShouldRun; Output="([ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ], [ [ "1", "0", "0", "0", "0", "0", "0", "0", "0", "0" ], [ "0", "1", "0", "0", "0", "0", "0", "0", "0", "0" ], [ "0", "0", "1", "0", "0", "0", "0", "0", "0", "0" ], [ "0", "0", "0", "1", "0", "0", "0", "0", "0", "0" ], [ "0", "0", "0", "0", "1", "0", "0", "0", "0", "0" ], [ "0", "0", "0", "0", "0", "1", "0", "0", "0", "0" ], [ "0", "0", "0", "0", "0", "0", "1", "0", "0", "0" ], [ "0", "0", "0", "0", "0", "0", "0", "1", "0", "0" ], [ "0", "0", "0", "0", "0", "0", "0", "0", "1", "0" ], [ "0", "0", "0", "0", "0", "0", "0", "0", "0", "1" ] ], [ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ], [ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ], [ ])":) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:identity(10, {"type": ""}), numpy:identity(10, {"type": "string"}), numpy:identity(10, {"type": "double"}), numpy:identity(57, {"type": ""}), numpy:identity(0, {"type": ""}) \ No newline at end of file +numpy:identity(10, {"type": ""}), +numpy:identity(10, {"type": "string"}), +numpy:identity(10, {"type": "double"}), +numpy:identity(57, {"type": ""}), +numpy:identity(0, {"type": ""}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq index 34fd21d70..550fc8b43 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq @@ -1,3 +1,12 @@ (:JIQS: ShouldRun; Output="([ 3, 4.714285714285714, 6.428571428571429, 8.142857142857142, 9.857142857142858, 11.571428571428571, 13.285714285714285, 15 ], [ 3, 4.5, 6, 7.5, 9, 10.5, 12, 13.5 ], [ 3, 4.714285714285714, 6.428571428571429, 8.142857142857142, 9.857142857142858, 11.571428571428571, 13.285714285714285, 15 ], 1.7142857142857142, [ 3, 4.5, 6, 7.5, 9, 10.5, 12, 13.5 ], 1.5, [ 16, 15.857142857142858, 15.714285714285714, 15.571428571428571, 15.428571428571429, 15.285714285714286, 15.142857142857142, 15 ], [ 15, 15, 15, 15, 15 ], 0, [ -15, -7.5, 0, 7.5, 15 ], 7.5, [ -15, -9, -3, 3, 9 ], 6, [ -127, -120.95652173913044, -114.91304347826087, -108.86956521739131, -102.82608695652173, -96.78260869565217, -90.73913043478261, -84.69565217391303, -78.65217391304347, -72.6086956521739, -66.56521739130434, -60.52173913043478, -54.47826086956522, -48.434782608695656, -42.39130434782608, -36.347826086956516, -30.304347826086953, -24.26086956521739, -18.217391304347828, -12.173913043478251, -6.130434782608688, -0.08695652173912549, 5.956521739130437, 12, 18.043478260869563, 24.086956521739125, 30.13043478260869, 36.17391304347828, 42.21739130434784, 48.260869565217405, 54.30434782608697, 60.34782608695653, 66.3913043478261, 72.43478260869566, 78.47826086956522, 84.52173913043478, 90.56521739130434, 96.6086956521739, 102.6521739130435, 108.69565217391306, 114.73913043478262, 120.78260869565219, 126.82608695652175, 132.8695652173913, 138.91304347826087, 144.95653 ], 6.043478260869565, [ -30, -27.857142857142858, -25.714285714285715, -23.57142857142857, -21.42857142857143, -19.285714285714285, -17.142857142857142, -15 ])":) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:linspace(3, 15, {"num": 8, "endpoint": true, "retstep": false}), numpy:linspace(3, 15, {"num": 8, "endpoint": false, "retstep": false}), numpy:linspace(3, 15, {"num": 8, "endpoint": true, "retstep": true}), numpy:linspace(3, 15, {"num": 8, "endpoint": false, "retstep": true}), numpy:linspace(16, 15, {"num": 8, "endpoint": true, "retstep": false}), numpy:linspace(15, 15, {"num": 5, "endpoint": true, "retstep": true}), numpy:linspace(-15, 15, {"num": 5, "endpoint": true, "retstep": true}), numpy:linspace(-15, 15, {"num": 5, "endpoint": false, "retstep": true}), numpy:linspace(-127, 151, {"num": 46, "endpoint": false, "retstep": true}), numpy:linspace(-30, -15, {"num": 8, "endpoint": true, "retstep": false}) \ No newline at end of file +numpy:linspace(3, 15, {"num": 8, "endpoint": true, "retstep": false}), +numpy:linspace(3, 15, {"num": 8, "endpoint": false, "retstep": false}), +numpy:linspace(3, 15, {"num": 8, "endpoint": true, "retstep": true}), +numpy:linspace(3, 15, {"num": 8, "endpoint": false, "retstep": true}), +numpy:linspace(16, 15, {"num": 8, "endpoint": true, "retstep": false}), +numpy:linspace(15, 15, {"num": 5, "endpoint": true, "retstep": true}), +numpy:linspace(-15, 15, {"num": 5, "endpoint": true, "retstep": true}), +numpy:linspace(-15, 15, {"num": 5, "endpoint": false, "retstep": true}), +numpy:linspace(-127, 151, {"num": 46, "endpoint": false, "retstep": true}), +numpy:linspace(-30, -15, {"num": 8, "endpoint": true, "retstep": false}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq index 54ca23fcc..0da7fb3cf 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq @@ -1,4 +1,10 @@ (:JIQS: ShouldRun; Output="([ 100, 177.82794100389228, 316.2277660168379, 562.341325190349 ], [ 100, 215.44346900318845, 464.15888336127773, 1000 ], [ 1.2589254117941673, 1.5488166189124812, 1.9054607179632472, 2.344228815319922, 2.8840315031266055, 3.548133892335754, 4.36515832240166, 5.370317963702528, 6.606934480075959, 8.128305652490639 ], [ 1.2589254117941673, 1.5848931924611136, 1.9952623149688797, 2.51188643150958, 3.1622776601683795, 3.9810717055349722, 5.011872336272724, 6.309573444801933, 7.943282347242816, 10 ], [ 100, 112.2018454301963, 125.89254117941675, 141.2537544622754, 158.48931924611142, 177.82794100389228, 199.52623149688787, 223.872113856834, 251.18864315095797, 281.8382931264455, 316.2277660168379, 354.8133892335753, 398.1071705534973, 446.683592150963, 501.18723362727246, 562.341325190349, 630.957344480193, 707.945784384138, 794.3282347242814, 891.2509381337459, 1000, 1122.018454301963, 1258.9254117941675, 1412.5375446227554, 1584.893192461114, 1778.2794100389228, 1995.2623149688789, 2238.72113856834, 2511.886431509582, 2818.382931264455, 3162.2776601683795, 3548.133892335753, 3981.0717055349733, 4466.835921509635, 5011.872336272725, 5623.413251903491, 6309.57344480193, 7079.457843841381, 7943.282347242822, 8912.509381337459, 10000, 11220.184543019652, 12589.254117941662, 14125.375446227554, 15848.93192461114, 17782.794100389227, 19952.62314968883, 22387.21138568338, 25118.864315095823, 28183.82931264455, 31622.776601683792, 35481.3389233576, 39810.71705534969, 44668.35921509635, 50118.72336272725, 56234.13251903491, 63095.73444801943, 70794.57843841374, 79432.82347242822, 89125.0938133746, 100000, 112201.84543019652, 125892.54117941661, 141253.75446227554, 158489.3192461114, 177827.94100389228, 199526.23149688827, 223872.11385683378, 251188.6431509582, 281838.2931264455, 316227.7660168379, 354813.389233576, 398107.1705534969, 446683.5921509635, 501187.2336272725, 562341.3251903491, 630957.3444801943, 707945.7843841374, 794328.2347242822, 891250.9381337459, 1.0E6, 1.122018454301963E6, 1.2589254117941689E6, 1.4125375446227554E6, 1.5848931924611142E6, 1.7782794100389227E6, 1.9952623149688788E6, 2.238721138568342E6, 2.5118864315095823E6, 2.818382931264455E6, 3.1622776601683795E6, 3.548133892335753E6, 3.9810717055349775E6, 4.466835921509635E6, 5.011872336272725E6, 5.623413251903491E6, 6.309573444801943E6, 7.079457843841387E6, 7.943282347242822E6, 8.912505467113453E6 ], [ 0.1, 0.12589254117941673, 0.15848931924611132, 0.19952623149688797, 0.251188643150958, 0.31622776601683794, 0.3981071705534973, 0.5011872336272724, 0.6309573444801932, 0.7943282319988467 ], [ 1, 0.6309573444801932, 0.3981071705534972, 0.25118864315095796, 0.15848931924611132, 0.1, 0.0630957344480193, 0.03981071705534971, 0.025118864315095794, 0.0158489336647576 ], [ 0.1, 0.021544346900318846, 0.004641588833612782, 0.001 ])":) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:logspace(2.0, 3.0,{"num": 4, "endpoint": false}), numpy:logspace(2.0, 3.0,{"num": 4, "endpoint": true}), numpy:logspace(0.1, 1.0,{"num": 10, "endpoint": false}), numpy:logspace(0.1, 1.0,{"num": 10, "endpoint": true}), numpy:logspace(2, 7,{"num": 100, "endpoint": false}), -numpy:logspace(-1, 0,{"num": 10, "endpoint": false}), numpy:logspace(0, -2,{"num": 10, "endpoint": false}), numpy:logspace(-1, -3,{"num": 4, "endpoint": true}) \ No newline at end of file +numpy:logspace(2.0, 3.0,{"num": 4, "endpoint": false}), +numpy:logspace(2.0, 3.0,{"num": 4, "endpoint": true}), +numpy:logspace(0.1, 1.0,{"num": 10, "endpoint": false}), +numpy:logspace(0.1, 1.0,{"num": 10, "endpoint": true}), +numpy:logspace(2, 7,{"num": 100, "endpoint": false}), +numpy:logspace(-1, 0,{"num": 10, "endpoint": false}), +numpy:logspace(0, -2,{"num": 10, "endpoint": false}), +numpy:logspace(-1, -3,{"num": 4, "endpoint": true}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_max.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_max.jq index 224d4d21c..c6f394b53 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_max.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_max.jq @@ -1,3 +1,15 @@ (:JIQS: ShouldRun; Output="([ 2, 3 ], [ 1, 3 ], [ 2, 5, 8 ], [ 6, 7, 8 ], [ [ 4, 5, 6, 7 ], [ 12, 13, 14, 15 ] ], [ [ 8, 9, 10, 11 ], [ 12, 13, 14, 15 ] ], [ [ 3, 7 ], [ 11, 15 ] ], [ 15, 17, 25 ], [ 25, 22 ], 19, 19, 20, 19)":) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:max([[0, 1], [2, 3]], {"axis": 0}), numpy:max([[0, 1], [2, 3]], {"axis": 1}), numpy:max([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 1}), numpy:max([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 0}), numpy:max([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 1}), numpy:max([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 0}), numpy:max([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 2}), numpy:max([[10, 17, 25], [15, 11, 22]], {"axis": 0}), numpy:max([[10, 17, 25], [15, 11, 22]], {"axis": 1}), numpy:max(numpy:arange(20, {"start":5})), numpy:max(numpy:arange(20, {"start":5}), {"axis": 0}), numpy:max(numpy:arange(20, {"start":5}), {"axis": 0, "initial": 20}), numpy:max(numpy:arange(20, {"start":5}), { "initial": 0}) \ No newline at end of file +numpy:max([[0, 1], [2, 3]], {"axis": 0}), +numpy:max([[0, 1], [2, 3]], {"axis": 1}), +numpy:max([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 1}), +numpy:max([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 0}), +numpy:max([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 1}), +numpy:max([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 0}), +numpy:max([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 2}), +numpy:max([[10, 17, 25], [15, 11, 22]], {"axis": 0}), +numpy:max([[10, 17, 25], [15, 11, 22]], {"axis": 1}), +numpy:max(numpy:arange(20, {"start":5})), +numpy:max(numpy:arange(20, {"start":5}), {"axis": 0}), +numpy:max(numpy:arange(20, {"start":5}), {"axis": 0, "initial": 20}), +numpy:max(numpy:arange(20, {"start":5}), { "initial": 0}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_min.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_min.jq index cb11b33d5..aec4442a2 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_min.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_min.jq @@ -1,3 +1,15 @@ (:JIQS: ShouldRun; Output="([ 0, 1 ], [ 0, 2 ], [ 0, 3, 6 ], [ 0, 1, 2 ], [ [ 0, 1, 2, 3 ], [ 8, 9, 10, 11 ] ], [ [ 0, 1, 2, 3 ], [ 4, 5, 6, 7 ] ], [ [ 0, 4 ], [ 8, 12 ] ], [ 10, 11, 22 ], [ 10, 11 ], 5, 5, 0, 0)":) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:min([[0, 1], [2, 3]], {"axis": 0}), numpy:min([[0, 1], [2, 3]], {"axis": 1}), numpy:min([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 1}), numpy:min([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 0}), numpy:min([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 1}), numpy:min([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 0}), numpy:min([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 2}), numpy:min([[10, 17, 25], [15, 11, 22]], {"axis": 0}), numpy:min([[10, 17, 25], [15, 11, 22]], {"axis": 1}), numpy:min(numpy:arange(20, {"start":5})), numpy:min(numpy:arange(20, {"start":5}), {"axis": 0}), numpy:min(numpy:arange(20, {"start":5}), {"axis": 0, "initial": 0}), numpy:min(numpy:arange(20, {"start":5}), { "initial": 0}) \ No newline at end of file +numpy:min([[0, 1], [2, 3]], {"axis": 0}), +numpy:min([[0, 1], [2, 3]], {"axis": 1}), +numpy:min([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 1}), +numpy:min([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 0}), +numpy:min([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 1}), +numpy:min([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 0}), +numpy:min([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 2}), +numpy:min([[10, 17, 25], [15, 11, 22]], {"axis": 0}), +numpy:min([[10, 17, 25], [15, 11, 22]], {"axis": 1}), +numpy:min(numpy:arange(20, {"start":5})), +numpy:min(numpy:arange(20, {"start":5}), {"axis": 0}), +numpy:min(numpy:arange(20, {"start":5}), {"axis": 0, "initial": 0}), +numpy:min(numpy:arange(20, {"start":5}), { "initial": 0}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq index 981d20868..de41ca029 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq @@ -1,3 +1,8 @@ (:JIQS: ShouldRun; Output="([ [ 1 ], [ 1 ], [ 1 ], [ 1 ] ], [ [ 1 ], [ 1 ], [ 1 ], [ 1 ] ], [ "1", "1", "1", "1", "1", "1", "1" ], [ [ 1, 1, 1, 1 ], [ 1, 1, 1, 1 ], [ 1, 1, 1, 1 ] ], [ [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ] ], [ [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ] ])" :) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:ones([4, 1], {"type": "integer"}), numpy:ones([4, 1],{"type": "double"}), numpy:ones([7], {"type": "string"}), numpy:ones([3, 4], {"type": "integer"}), numpy:ones([7,2,3], {"type": "integer"}), numpy:ones([5,5,5,5],{"type": "double"}) \ No newline at end of file +numpy:ones([4, 1], {"type": "integer"}), +numpy:ones([4, 1],{"type": "double"}), +numpy:ones([7], {"type": "string"}), +numpy:ones([3, 4], {"type": "integer"}), +numpy:ones([7,2,3], {"type": "integer"}), +numpy:ones([5,5,5,5],{"type": "double"}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq index 912565c1e..fde08c0d3 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq @@ -1,3 +1,6 @@ (:JIQS: ShouldRun; Output="(1, 3, 4, 10)":) import module namespace numpy = "jsoniq_numpy.jq"; -size([numpy:random()]),size(numpy:random(3)),size(numpy:random_uniform({"low": 0.5, "high": 1.0, "size": 4})), size(numpy:random_randint(5, {"high": 10, "size": 10})) \ No newline at end of file +size([numpy:random()]), +size(numpy:random(3)), +size(numpy:random_uniform({"low": 0.5, "high": 1.0, "size": 4})), +size(numpy:random_randint(5, {"high": 10, "size": 10})) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_shape.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_shape.jq index bc9e22c14..dc77b0cee 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_shape.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_shape.jq @@ -1,4 +1,7 @@ (:JIQS: ShouldRun; Output="([ 1, 1, 2 ], [ 3, 2 ], [ 7 ], [ 1, 2, 3, 4, 5, 6, 7, 8 ])":) import module namespace utils = "jsoniq_utils.jq"; import module namespace numpy = "jsoniq_numpy.jq"; -utils:shape([[[3,4]]]), utils:shape([[1,2], [3,4], [4, 5]]), utils:shape(numpy:arange(7)), utils:shape(numpy:ones([1, 2, 3, 4, 5, 6, 7, 8])) \ No newline at end of file +utils:shape([[[3,4]]]), +utils:shape([[1,2], [3,4], [4, 5]]), +utils:shape(numpy:arange(7)), +utils:shape(numpy:ones([1, 2, 3, 4, 5, 6, 7, 8])) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq index 80a2bddbe..d53b9bad5 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq @@ -1,3 +1,8 @@ (:JIQS: ShouldRun; Output="([ [ 0 ], [ 0 ], [ 0 ], [ 0 ] ], [ [ 0 ], [ 0 ], [ 0 ], [ 0 ] ], [ "0", "0", "0", "0", "0", "0", "0" ], [ [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ], [ [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ] ], [ [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ] ])" :) import module namespace numpy = "jsoniq_numpy.jq"; -numpy:zeros([4, 1], {"type": "integer"}), numpy:zeros([4, 1], {"type": "double"}), numpy:zeros([7], {"type": "string"}), numpy:zeros([3, 4], {"type": "integer"}), numpy:zeros([7,2,3], {"type": "integer"}), numpy:zeros([5,5,5,5], {"type": "double"}) \ No newline at end of file +numpy:zeros([4, 1], {"type": "integer"}), +numpy:zeros([4, 1], {"type": "double"}), +numpy:zeros([7], {"type": "string"}), +numpy:zeros([3, 4], {"type": "integer"}), +numpy:zeros([7,2,3], {"type": "integer"}), +numpy:zeros([5,5,5,5], {"type": "double"}) \ No newline at end of file From d62d1e4c1c07668e606b6cb9e71d0d302e56ed45 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 20 Jun 2024 19:50:23 +0200 Subject: [PATCH 18/56] Refactored functions --- .../runtime/numpy_lib/jsoniq_numpy.jq | 689 +++++++++--------- .../numpy_lib/test_jsoniq_numpy_digitize.jq | 8 +- .../numpy_lib/test_jsoniq_numpy_random.jq | 11 +- 3 files changed, 371 insertions(+), 337 deletions(-) diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index 12ddaf31e..0410dcad7 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -1,19 +1,19 @@ (:JIQS: ShouldNotParse; ErrorCode="XPST0003"; ErrorMetadata="LINE:1:COLUMN:0:" :) module namespace jsoniq_numpy = "jsoniq_numpy.jq"; import module namespace utils = "jsoniq_utils.jq"; -(: Helper function for zeros :) -declare function jsoniq_numpy:zeros($shape as array, $zero, $i as integer) { - if ($i eq size($shape)) then - let $join := - for $j in 1 to $shape[[$i]] + +declare function jsoniq_numpy:zeros($shape as array, $zero, $current_dimensionension as integer) { + if ($current_dimensionension eq size($shape)) then + let $accumulated_result := + for $j in 1 to $shape[[$current_dimensionension]] return $zero - return [$join] + return [$accumulated_result] else - let $join := - let $partial_res := jsoniq_numpy:zeros($shape, $zero, $i + 1) - for $j in 1 to $shape[[$i]] - return $partial_res - return [$join] + let $accumulated_result := + let $higher_dimension_result := jsoniq_numpy:zeros($shape, $zero, $current_dimensionension + 1) + for $j in 1 to $shape[[$current_dimensionension]] + return $higher_dimension_result + return [$accumulated_result] }; declare type jsoniq_numpy:zeros_params as { @@ -30,38 +30,36 @@ declare function jsoniq_numpy:zeros($shape as array, $params as object) { return { if (size($shape) eq 1) then let $zero := utils:cast-as(0, $params.type) - let $join := for $j in 1 to $shape[[1]] + let $accumulated_result := for $j in 1 to $shape[[1]] return $zero - return [$join] + return [$accumulated_result] else - let $i := 1 + let $current_dimensionension := 1 let $zero := utils:cast-as(0, $params.type) - let $join := - let $partial_res := jsoniq_numpy:zeros($shape, $zero, $i + 1) - for $j in 1 to $shape[[$i]] - return $partial_res - return [$join] + let $accumulated_result := + let $higher_dimension_result := jsoniq_numpy:zeros($shape, $zero, $current_dimensionension + 1) + for $j in 1 to $shape[[$current_dimensionension]] + return $higher_dimension_result + return [$accumulated_result] } }; -(: Zeros method creates an integer array filled with 0 values. :) declare function jsoniq_numpy:zeros($shape as array) { jsoniq_numpy:zeros($shape, {}) }; -(: Helper function for ones :) -declare function jsoniq_numpy:ones($shape as array, $one, $i as integer) { - if ($i eq size($shape)) then - let $join := - for $j in 1 to $shape[[$i]] +declare function jsoniq_numpy:ones($shape as array, $one, $current_dimensionension as integer) { + if ($current_dimensionension eq size($shape)) then + let $accumulated_result := + for $j in 1 to $shape[[$current_dimensionension]] return $one - return [$join] + return [$accumulated_result] else - let $join := - let $partial_res := jsoniq_numpy:ones($shape, $one, $i + 1) - for $j in 1 to $shape[[$i]] - return $partial_res - return [$join] + let $accumulated_result := + let $higher_dimension_result := jsoniq_numpy:ones($shape, $one, $current_dimensionension + 1) + for $j in 1 to $shape[[$current_dimensionension]] + return $higher_dimension_result + return [$accumulated_result] }; declare type jsoniq_numpy:ones_params as { @@ -79,17 +77,17 @@ declare function jsoniq_numpy:ones($shape as array, $params as object) { return { if (size($shape) eq 1) then let $one := utils:cast-as(1, $params.type) - let $join := for $j in 1 to $shape[[1]] + let $accumulated_result := for $j in 1 to $shape[[1]] return $one - return [$join] + return [$accumulated_result] else - let $i := 1 + let $current_dimensionension := 1 let $one := utils:cast-as(1, $params.type) - let $join := - let $partial_res := jsoniq_numpy:ones($shape, $one, $i + 1) - for $j in 1 to $shape[[$i]] - return $partial_res - return [$join] + let $accumulated_result := + let $higher_dimension_result := jsoniq_numpy:ones($shape, $one, $current_dimensionension + 1) + for $j in 1 to $shape[[$current_dimensionension]] + return $higher_dimension_result + return [$accumulated_result] } }; @@ -104,6 +102,20 @@ declare type jsoniq_numpy:linspace_params as { "endpoint": "boolean=true", "retstep": "boolean=false" }; + +declare function jsoniq_numpy:compute_linspace($start as double, $end as double, $params as object, $step_unit as integer) { + let $range := $end - $start + let $step := $range div $step_unit + let $accumulated_result := + for $i in 1 to $params.num + return + if ($i eq $params.num) then float($start + ($i - 1) * $step) + else $start + ($i - 1) * $step + return + if ($params.retstep eq true) then ([$accumulated_result], $step) + else [$accumulated_result] +}; + (: Return evenly spaced numbers over a specified interval. Returns num evenly spaced samples, calculated over the interval [start, stop]. The endpoint of the interval can optionally be excluded. Note: we currently only support one-dimensional results. @@ -120,36 +132,13 @@ To submit optional parameters to this method, a JSON object must be passed, wher declare function jsoniq_numpy:linspace($start as double, $end as double, $params as object) { let $params := validate type jsoniq_numpy:linspace_params {$params} return { - if ($params.endpoint eq true) then - if ($params.num lt 0) then - (: error case :) - [] - else - let $num := $params.num - let $range := $end - $start - let $step := $range div ($num - 1) - let $res := - for $i in 1 to $num - return if ($i eq $num) then float($start + ($i - 1) * $step) - else $start + ($i - 1) * $step - return - if ($params.retstep eq true) then ([$res], $step) - else [$res] + if ($params.num lt 0) then + error("InvalidFunctionCallErrorCode", "Function expects a num value to be greater than or equal to 0") else - if ($params.num lt 0) then - (: error case :) - [] + if ($params.endpoint eq true) then + jsoniq_numpy:compute_linspace($start, $end, $params, $params.num - 1) else - let $num := $params.num - let $range := $end - $start - let $step := $range div $num - let $res := - for $i in 1 to $num - return if ($i eq $num) then float($start + ($i - 1) * $step) - else $start + ($i - 1) * $step - return - if ($params.retstep eq true) then ([$res], $step) - else [$res] + jsoniq_numpy:compute_linspace($start, $end, $params, $params.num) } }; @@ -167,6 +156,30 @@ declare type jsoniq_numpy:arange_params as { "step": "double=1", "type": "string=integer" }; + +declare function jsoniq_numpy:arange_negative_range($stop as double, $params as object) { + if ($stop gt $params.start) then [] + else + if ($params.start + $params.step lt $stop) then [$params.start] + else + let $range := $params.start - $stop + let $num_values := integer(ceiling($range div abs($params.step))) + let $accumulated_values_in_range := for $i in 1 to $num_values + return $params.start + ($i - 1) * $params.step + return [$accumulated_values_in_range] +}; + +declare function jsoniq_numpy:arange_positive_range($stop as double, $params as object) { + if ($params.start gt $stop) then [] + else + if ($params.start + $params.step gt $stop or $params.step eq 0) then [$params.start] + else + let $range := $stop - $params.start + let $num_values := integer(ceiling($range div $params.step)) + let $accumulated_values_in_range := for $i in 1 to $num_values + return $params.start + ($i - 1) * $params.step + return [$accumulated_values_in_range] +}; (: arange can be called with a combination of parameters: - arange(stop): Values are generated within the half-open interval [0, stop) (in other words, the interval including start but excluding stop). @@ -183,14 +196,10 @@ To submit optional parameters to this method, a JSON object must be passed, wher declare function jsoniq_numpy:arange($stop as double, $params as object) { let $params := validate type jsoniq_numpy:arange_params {$params} return { - if ($params.start gt $stop) then [] + if ($params.step lt 0) then + jsoniq_numpy:arange_negative_range($stop, $params) else - if ($params.start + $params.step gt $stop or $params.step eq 0) then [$params.start] - else - let $num_values := integer(ceiling(($stop - $params.start) div $params.step)) - let $res := for $i in 1 to $num_values - return $params.start + ($i - 1) * $params.step - return [$res] + jsoniq_numpy:arange_positive_range($stop, $params) } }; @@ -211,55 +220,80 @@ declare function jsoniq_numpy:random() { (: Function generates a sequence of random values of type double. Required params are: - length (integer): the length of the resulting sequence :) -declare function jsoniq_numpy:random($length as integer) { - fn:random($length) +declare function jsoniq_numpy:random($size as array) { + if (size($size) eq 0) then [] + else jsoniq_numpy:random_with_dimensions($size, 1) }; -(: TODO: any dimension array :) -declare function jsoniq_numpy:random_size($size as array) { +declare function jsoniq_numpy:random_with_dimensions($current_dimensionensions as array, $current_dimension as integer) { + if ($current_dimension eq size($current_dimensionensions)) then fn:random($current_dimensionensions[[$current_dimension]]) + else + let $accumulated_result := + let $higher_dimension_result := jsoniq_numpy:random_with_dimensions($current_dimensionensions, $current_dimension + 1) + for $i in 1 to $current_dimensionensions[[$current_dimension]] + return $higher_dimension_result + return [$accumulated_result] +}; +declare function jsoniq_numpy:random_between_with_dimensions($low as double, $high as double, $type as string, $current_dimensionensions as array, $current_dimension as integer) { + if ($current_dimension eq size($current_dimensionensions)) then fn:random-between($low, $high, $current_dimensionensions[[$current_dimension]], $type) + else + let $accumulated_result := + let $higher_dimension_result := jsoniq_numpy:random_between_with_dimensions($low, $high, $type, $current_dimensionensions, $current_dimension + 1) + for $i in 1 to $current_dimensionensions[[$current_dimension]] + return $higher_dimension_result + return [$accumulated_result] }; declare type jsoniq_numpy:random_uniform_params as { "low": "double=0", "high": "double=1", - "size": "integer=10" + "size": "array" }; (: Function generates a random sample from a uniform distribution between a lower and higher limit (not inclusive). Params is an object for optional arguments. These arguments are: - low (double): the lower bound for generated objects. Default value is 0.0 - high (double): the upper bound for generated objects. Default value is 1.0 - - size (integer): the size of the resulting array. Default is 10. -To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value :) + - size (array): the size of the resulting array. Each value in the array represents the size for the specific dimension. :) declare function jsoniq_numpy:random_uniform($params as object) { let $params := validate type jsoniq_numpy:random_uniform_params {$params} let $low := $params.low let $high := $params.high - let $size := $params.size - return fn:random-between($low, $high, $size, "double") + let $current_dimensionensions := $params.size + return if (size($current_dimensionensions) eq 0) then [] + else jsoniq_numpy:random_between_with_dimensions($low, $high, "double", $current_dimensionensions, 1) }; declare type jsoniq_numpy:random_randint_params as { "high": "double=1", - "size": "integer=10" + "size": "array" }; (: Function generates a random sample from a uniform distribution between a lower and higher limit (not inclusive), but with type int. Required params are: - low (integer): the lower bound for generated objects if high is also present. Otherwise, it determines the upperbound. Without high, it makes the sequence be bounded by [0, low), otherwise it makes it bound by [low, high). Params is an object for optional arguments. These arguments are: - high (integer): the upper bound for generated objects. Default value is 1 - - size (integer): the size of the resulting array. Default is 10 -To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value :) + - size (array): the size of the resulting array. Each value in the array represents the size for the specific dimension :) declare function jsoniq_numpy:random_randint($low as integer, $params as object) { let $params := validate type jsoniq_numpy:random_randint_params {$params} let $high := $params.high - let $size := $params.size - return fn:random-between($low, $high, $size, "integer") + let $current_dimensionensions := $params.size + return if (size($current_dimensionensions) eq 0) then [] + else jsoniq_numpy:random_between_with_dimensions($low, $high, "integer", $current_dimensionensions, 1) }; declare type jsoniq_numpy:logspace_params as { "num": "integer=50", "endpoint": "boolean=true" }; + +declare function jsoniq_numpy:compute_logspace($start as double, $end as double, $params as object) { + let $base := 10 + let $linspace_vals := jsoniq_numpy:linspace($start, $end, {"num": $params.num, "endpoint": $params.endpoint, "retstep": false}) + let $res := + for $i in 1 to $params.num + return pow($base, $linspace_vals[[$i]]) + return [$res] +}; (: Generate evenly spaced numbers on a log scale in base 10. Required parameters are: - start (double): 10 ** start is the starting value of the sequence. @@ -273,30 +307,10 @@ Params is an object for optional arguments. These arguments are: declare function jsoniq_numpy:logspace($start as double, $end as double, $params as object) { let $params := validate type jsoniq_numpy:logspace_params {$params} return { - if ($params.endpoint eq true) then - if ($params.num lt 0) then - (: error case :) - [] - else - let $num := $params.num - let $base := 10 - let $linspace_vals := jsoniq_numpy:linspace($start, $end, {"num": $num, "endpoint": true, "retstep": false}) - let $res := - for $i in 1 to $num - return pow($base, $linspace_vals[[$i]]) - return [$res] + if ($params.num lt 0) then + error("InvalidFunctionCallErrorCode", "Function expects a num value to be greater than or equal to 0") else - if ($params.num lt 0) then - (: error case :) - [] - else - let $num := $params.num - let $base := 10 - let $linspace_vals := jsoniq_numpy:linspace($start, $end, {"num": $num, "endpoint": false, "retstep": false}) - let $res := - for $i in 1 to $num - return pow($base, $linspace_vals[[$i]]) - return [$res] + jsoniq_numpy:compute_logspace($start, $end, $params) } }; @@ -311,17 +325,14 @@ declare function jsoniq_numpy:logspace($start as double, $end as double) { jsoniq_numpy:logspace($start, $end, {}) }; -(: Helper method for the full function :) -declare function jsoniq_numpy:full($shape as array, $fill_value, $i as integer, $unused as integer) { - if ($i eq size($shape)) then - let $join := for $j in 1 to $shape[[$i]] - return $fill_value - return [$join] - else - let $join := - for $j in 1 to $shape[[$i]] - return jsoniq_numpy:full($shape, $fill_value, $i + 1, $unused) - return [$join] +declare function jsoniq_numpy:compute_full_on_sub_dimensions($current_dimensionensions as array, $fill_value, $current_dimension as integer) { + let $current_dimensionension := size($current_dimensionensions) + let $accumulated_result := + for $j in 1 to $current_dimensionensions[[$current_dimension]] + return + if ($current_dimension eq $current_dimensionension) then $fill_value + else jsoniq_numpy:compute_full_on_sub_dimensions($current_dimensionensions, $fill_value, $current_dimension + 1) + return [$accumulated_result] }; declare type jsoniq_numpy:full_params as { @@ -339,18 +350,17 @@ Unsupported arguments: declare function jsoniq_numpy:full($shape as array, $fill_value, $params as object) { let $params := validate type jsoniq_numpy:full_params {$params} return { - if (size($shape) eq 1) then - let $fill := utils:cast-as($fill_value, $params.type) - let $join := for $j in 1 to $shape[[1]] - return $fill - return [$join] - else - let $i := 1 + let $num_dimensions := size($shape) + let $current_dimension := 1 let $fill := utils:cast-as($fill_value, $params.type) - let $join := - for $j in 1 to $shape[[$i]] - return jsoniq_numpy:full($shape, $fill, $i + 1, $i) - return [$join] + let $sub_dimension_result := + for $j in 1 to $shape[[$current_dimension]] + return + if ($num_dimensions eq 1) then + $fill + else + jsoniq_numpy:compute_full_on_sub_dimensions($shape, $fill, $current_dimension + 1) + return [$sub_dimension_result] } }; @@ -376,105 +386,130 @@ Optional arguments include: - type (string): the type of the resulting array values :) declare function jsoniq_numpy:identity($n as integer, $params as object) { - let $params := validate type jsoniq_numpy:identity_params {$params} - return { - if ($n le 1) then [] - else + if ($n le 1) then [] + else + let $params := validate type jsoniq_numpy:identity_params {$params} + return { let $fill_one := utils:cast-as(1, $params.type) let $fill_zero := utils:cast-as(0, $params.type) - let $join := - for $i in 1 to $n - let $join2 := - for $j in 1 to $n - return if ($i eq $j) then $fill_one + let $accumulated_matrix := + for $row in 1 to $n + let $accumulated_row := + for $column in 1 to $n + return if ($row eq $column) then $fill_one else $fill_zero - return [$join2] - return [$join] - } + return [$accumulated_row] + return [$accumulated_matrix] + } }; declare function jsoniq_numpy:identity($n as integer) { jsoniq_numpy:identity($n, {}) }; -(: Binary search method. It performs binary search over the given arr parameter looking for the value of x for it. The current behavior is to return the first matching position for a given x even if more values of it are present. +(: Binary search method. It performs binary search over the given arr parameter looking for the value of searched_element for it. The current behavior is to return the first matching position for a given searched_element even if more values of it are present. Required params are: -- arr (array): the array to search for x -- x (any): the value to look for in the array arr +- arr (array): the array to search for searched_element +- searched_element (any): the value to look for in the array arr The returned value is an integer such that: -- if x is present, the index where it first occurs is returned. -- if x is not found: - - if x is smaller than all values, index 0 is returned. - - if x is greater than all values, index size(arr) + 1 is returned.:) -declare %an:sequential function jsoniq_numpy:binsearch($arr as array, $x) { +- if searched_element is present, the index where it first occurs is returned. +- if searched_element is not found: + - if searched_element is smaller than all values, index 0 is returned. + - if searched_element is greater than all values, index size(arr) + 1 is returned.:) +declare %an:sequential function jsoniq_numpy:binsearch($arr as array, $searched_element) { variable $low := 1; variable $high := size($arr) + 1; while ($low lt $high) { - variable $mid := integer($low + ($high - $low) div 2); - if ($arr[[$mid]] eq $x) then exit returning $mid; + variable $mid_index := integer($low + ($high - $low) div 2); + if ($arr[[$mid_index]] eq $searched_element) then exit returning $mid_index; else - if ($x le $arr[[$mid]]) then $high := $mid; - else $low := $mid + 1; + if ($searched_element le $arr[[$mid_index]]) then $high := $mid_index; + else $low := $mid_index + 1; } exit returning if ($low eq 1) then 0 else $low; }; (: returns i s.t. arr[i - 1] <= x < arr[i] :) -declare %an:sequential function jsoniq_numpy:searchsorted_left($arr as array, $x) { +declare %an:sequential function jsoniq_numpy:searchsorted_left($arr as array, $searched_element) { variable $low := 1; variable $high := size($arr) + 1; while ($low lt $high) { - variable $mid := integer($low + ($high - $low) div 2); - if ($x ge $arr[[$mid]]) then $low := $mid + 1; - else $high := $mid; + variable $mid_index := integer($low + ($high - $low) div 2); + if ($searched_element ge $arr[[$mid_index]]) then $low := $mid_index + 1; + else $high := $mid_index; } exit returning if ($low eq 1) then 0 else $low; }; (: returns i s.t. arr[i - 1] < x <= arr[i] :) -declare %an:sequential function jsoniq_numpy:searchsorted_right($arr as array, $x) { +declare %an:sequential function jsoniq_numpy:searchsorted_right($arr as array, $searched_element) { variable $low := 1; variable $high := size($arr) + 1; while ($low lt $high) { - variable $mid := integer($low + ($high - $low) div 2); - if ($x ge $arr[[$mid]]) then $low := $mid + 1; - else $high := $mid; + variable $mid_index := integer($low + ($high - $low) div 2); + if ($searched_element le $arr[[$mid_index]]) then $high := $mid_index; + else $low := $mid_index + 1; } exit returning if ($low eq 1) then 0 else $low; }; +declare function jsoniq_numpy:digitize_monotonically_increasing_left($x as array, $bins as array) { + let $bin_indexes := for $i in 1 to size($x) + return jsoniq_numpy:searchsorted_left($bins, $x[[$i]]) + return [$bin_indexes] +}; + +declare function jsoniq_numpy:digitize_monotonically_increasing_right($x as array, $bins as array) { + let $bin_indexes := + for $i in 1 to size($x) + return jsoniq_numpy:searchsorted_right($bins, $x[[$i]]) + return [$bin_indexes] +}; + +declare function jsoniq_numpy:digitize_in_reverse($x as array, $bins as array, $right as boolean) { + let $bins_rev := [fn:reverse($bins[])] + let $bin_indexes := + for $i in 1 to size($x) + let $searchsorted_res := + if ($right eq false) then jsoniq_numpy:searchsorted_left($bins_rev, $x[[$i]]) + else jsoniq_numpy:searchsorted_right($bins_rev, $x[[$i]]) + let $bin_index := jsoniq_numpy:compute_index($searchsorted_res, size($bins)) + return $bin_index + return [$bin_indexes] +}; +declare type jsoniq_numpy:digitize_params as { + "right": "boolean=false" +}; (: Return the indices of the bins to which each value in input array belongs. Required arguments: - x (array): input array to be binned (currently only 1 dimension is supported) - bins (array): one dimensional monotonic, array Optional arguments include: -- right (boolean): indicates whether the intervals include the right or the left bin edge +- right (boolean): indicates whether the intervals include the right or the left bin edge. Values outside of the bins bounds return position 1 or size(bins) + 1 according to their relation. -(: TODO: right param:) :) -declare function jsoniq_numpy:digitize($x as array, $bins as array) { +declare function jsoniq_numpy:digitize($x as array, $bins as array, $params as object) { let $monotonic := jsoniq_numpy:monotonic($bins) + let $params := validate type jsoniq_numpy:digitize_params {$params} return { if ($monotonic eq 0) then fn:error("Bins must be monotonically increasing or decreasing!") else if ($monotonic eq 1) then - let $join := for $i in 1 to size($x) - return jsoniq_numpy:searchsorted_left($bins, $x[[$i]]) - return [$join] + if ($params.right eq false) then jsoniq_numpy:digitize_monotonically_increasing_left($x, $bins) + else + jsoniq_numpy:digitize_monotonically_increasing_right($x, $bins) else - (: reverse case requires reversing the array :) - let $bins_rev := [fn:reverse($bins[])] - let $join := for $i in 1 to size($x) - let $searchsorted_res := jsoniq_numpy:searchsorted_left($bins_rev, $x[[$i]]) - let $bin_index := jsoniq_numpy:compute_index($searchsorted_res, size($bins)) - return $bin_index - return [$join] + jsoniq_numpy:digitize_in_reverse($x, $bins, $params.right) } }; +declare function jsoniq_numpy:digitize($x as array, $bins as array) { + jsoniq_numpy:digitize($x, $bins, {}) +}; + declare function jsoniq_numpy:compute_index($result as integer, $size as integer) { (: the value is out of the bounds on the left => size + 1:) if ($result eq 0) then $size + 1 @@ -529,45 +564,45 @@ declare function jsoniq_numpy:product_of_all_values($arr as array) { }; -declare function jsoniq_numpy:reshape_recursively($arr, $shape as array, $current_index as integer) { - if ($current_index gt size($shape)) then +declare function jsoniq_numpy:reshape_sub_dimension($arr, $current_dimensionensions as array, $current_dimension as integer) { + if ($current_dimension gt size($current_dimensionensions)) then $arr else - if ($shape[[$current_index]] eq 1) then - [jsoniq_numpy:reshape_recursively($arr, $shape, $current_index + 1)] + if ($current_dimensionensions[[$current_dimension]] eq 1) then + [jsoniq_numpy:reshape_sub_dimension($arr, $current_dimensionensions, $current_dimension + 1)] else - let $join := let $size_arr := count($arr) - let $size_subarr := $size_arr div $shape[[$current_index]] - for $j in 0 to ($shape[[$current_index]] - 1) - return jsoniq_numpy:reshape_recursively(subsequence($arr, $j * $size_subarr + 1, $size_subarr), $shape, $current_index + 1) - return [$join] + let $sub_dimension_result := + let $size_arr := count($arr) + let $size_subarr := $size_arr div $current_dimensionensions[[$current_dimension]] + for $j in 0 to ($current_dimensionensions[[$current_dimension]] - 1) + return jsoniq_numpy:reshape_sub_dimension(subsequence($arr, $j * $size_subarr + 1, $size_subarr), $current_dimensionensions, $current_dimension + 1) + return [$sub_dimension_result] }; (: Gives a new shape to an array. The shape argument should have the product of its dimension sizes equal to the number of elements found in arr. - arr (array): the array to reshape - shape (array): the dimension sizes to resize to. :) declare function jsoniq_numpy:reshape($arr as array, $shape as array) { - let $flatten_arr := flatten($arr) - let $flatten_size := count($flatten_arr) - let $product := jsoniq_numpy:product_of_all_values($shape) + let $flattened_arr := flatten($arr) + let $number_of_elements := count($flattened_arr) + let $product_of_all_values := jsoniq_numpy:product_of_all_values($shape) return - if (($flatten_size mod $product) eq 0) then - (: construct array :) - jsoniq_numpy:reshape_recursively($flatten_arr, $shape, 1) + if (($number_of_elements mod $product_of_all_values) eq 0) then + jsoniq_numpy:reshape_sub_dimension($flattened_arr, $shape, 1) else error("InvalidFunctionCallErrorCode", "Invalid call to reshape. The shape array must result in a size equivalent to the size of the array.") }; (: Helper method for argwhere :) -declare function jsoniq_numpy:argwhere($arr, $res as array) { - typeswitch($arr) +declare function jsoniq_numpy:argwhere($current_dimension, $positions_at_each_dimension as array) { + typeswitch($current_dimension) case array return { - for $i in 1 to size($arr) - let $sub_arr := $arr[[$i]] - let $next_res := [$res[], $i] - return jsoniq_numpy:argwhere($sub_arr, $next_res) + for $i in 1 to size($current_dimension) + let $sub_dimension := $current_dimension[[$i]] + let $positions_at_each_dimension := [$positions_at_each_dimension[], $i] + return jsoniq_numpy:argwhere($sub_dimension, $positions_at_each_dimension) } - case integer return if ($arr gt 0) then $res + case integer return if ($current_dimension gt 0) then $positions_at_each_dimension else () default return () }; @@ -581,23 +616,23 @@ declare function jsoniq_numpy:argwhere($arr as array) { (: Axis based methods :) -(: Helper method to compute minimum of two arrays. The minimum is computed per index, so the minimum value for a specific index is taken. :) -declare function jsoniq_numpy:min_array_rec($array1, $array2) { +(: Method expects array to be of the same size. :) +declare function jsoniq_numpy:compute_min_values_of_arrays($array1, $array2) { typeswitch($array1) - case array return let $join := + case array return let $accumulated_sub_dimensions := for $i in 1 to size($array1) - return jsoniq_numpy:min_array_rec($array1[[$i]], $array2[[$i]]) - return [$join] + return jsoniq_numpy:compute_min_values_of_arrays($array1[[$i]], $array2[[$i]]) + return [$accumulated_sub_dimensions] default return if ($array1 lt $array2) then $array1 else $array2 }; (: Helper method to compute minimum of two arrays. The minimum is computed per index, so the minimum value for a specific index is taken. If the minimum is greater than initial, initial is returned instead as the minimum. :) -declare function jsoniq_numpy:min_array_rec($array1, $array2, $initial) { +declare function jsoniq_numpy:compute_min_values_of_arrays($array1, $array2, $initial) { typeswitch($array1) - case array return let $join := + case array return let $accumulated_sub_dimensions := for $i in 1 to size($array1) - return jsoniq_numpy:min_array_rec($array1[[$i]], $array2[[$i]], $initial) - return [$join] + return jsoniq_numpy:compute_min_values_of_arrays($array1[[$i]], $array2[[$i]], $initial) + return [$accumulated_sub_dimensions] default return if ($array1 lt $array2) then if ($initial lt $array1) then $initial else $array1 @@ -607,67 +642,65 @@ declare function jsoniq_numpy:min_array_rec($array1, $array2, $initial) { }; (: Helper method to compute the minimum on the right axis. :) -declare function jsoniq_numpy:min_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer) { +declare function jsoniq_numpy:compute_min_along_axis($array as array, $axis as integer, $current_dimension as integer, $max_dim as integer) { if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); else - if ($dim eq $max_dim) then exit returning min(flatten($array[])); + if ($current_dimension eq $max_dim) then exit returning min(flatten($array)); else { - if ($dim eq $axis) then { + if ($current_dimension eq $axis) then { (: Take the first array as minimum :) variable $mini := $array[[1]]; variable $i := 2; while ($i le size($array)) { - $mini := jsoniq_numpy:min_array_rec($mini, $array[[$i]]); + $mini := jsoniq_numpy:compute_min_values_of_arrays($mini, $array[[$i]]); $i := $i + 1; } exit returning $mini; } else { - let $join := + let $accumulated_sub_dimensions := let $size := size($array) for $i in 1 to $size - return jsoniq_numpy:min_rec($array[[$i]], $axis, $dim + 1, $max_dim) - return exit returning [$join]; + return jsoniq_numpy:compute_min_along_axis($array[[$i]], $axis, $current_dimension + 1, $max_dim) + return exit returning [$accumulated_sub_dimensions]; } } }; (: Helper method to compute the minimum on the right axis and using initial. :) -declare function jsoniq_numpy:min_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer, $initial as integer) { +declare function jsoniq_numpy:compute_min_along_axis($array as array, $axis as integer, $current_dimension as integer, $max_dim as integer, $initial as integer) { if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); else - if ($dim eq $max_dim) then exit returning min((flatten($array[]), $initial)); + if ($current_dimension eq $max_dim) then exit returning min((flatten($array), $initial)); else { - if ($dim eq $axis) then { + if ($current_dimension eq $axis) then { (: Take the first array as minimum :) variable $mini := $array[[1]]; variable $i := 2; while ($i le size($array)) { - $mini := jsoniq_numpy:min_array_rec($mini, $array[[$i]], $initial); + $mini := jsoniq_numpy:compute_min_values_of_arrays($mini, $array[[$i]], $initial); $i := $i + 1; } exit returning $mini; } else { - let $join := + let $accumulated_sub_dimensions := let $size := size($array) for $i in 1 to $size - return jsoniq_numpy:min_rec($array[[$i]], $axis, $dim + 1, $max_dim, $initial) - return exit returning [$join]; + return jsoniq_numpy:compute_min_along_axis($array[[$i]], $axis, $current_dimension + 1, $max_dim, $initial) + return exit returning [$accumulated_sub_dimensions]; } } }; -(: Helper method that invokes minimum with axis only :) -declare function jsoniq_numpy:min_($array as array, $axis as integer) { +declare function jsoniq_numpy:compute_min_along_axis_wrapper($array as array, $axis as integer) { if ($axis eq -1) then min(flatten($array[])) else - jsoniq_numpy:min_rec($array, $axis, 0, size(utils:shape($array)) - 1) + jsoniq_numpy:compute_min_along_axis($array, $axis, 0, size(utils:shape($array)) - 1) }; -(: Helper method that invokes minimum with axis and initial :) -declare function jsoniq_numpy:min_($array as array, $axis as integer, $initial as integer) { +declare function jsoniq_numpy:compute_min_along_axis_wrapper($array as array, $axis as integer, $initial as integer) { if ($axis eq -1) then min((flatten($array[]), $initial)) else - jsoniq_numpy:min_rec($array, $axis, 0, size(utils:shape($array)) - 1, $initial) + jsoniq_numpy:compute_min_along_axis($array, $axis, 0, size(utils:shape($array)) - 1, $initial) }; @@ -686,9 +719,9 @@ declare function jsoniq_numpy:min($array as array, $params as object) { let $params := validate type jsoniq_numpy:min_params {$params} return { if ($params.initial eq -2147483648) then - jsoniq_numpy:min_($array, $params.axis) + jsoniq_numpy:compute_min_along_axis_wrapper($array, $params.axis) else - jsoniq_numpy:min_($array, $params.axis, $params.initial) + jsoniq_numpy:compute_min_along_axis_wrapper($array, $params.axis, $params.initial) } }; @@ -699,22 +732,22 @@ declare function jsoniq_numpy:min($array as array) { (: MAX :) (: Helper method to compute maximum of two arrays. The maximum is computed per index, so the maximum value for a specific index is taken. :) -declare function jsoniq_numpy:max_array_rec($array1, $array2) { +declare function jsoniq_numpy:compute_max_values_of_arrays($array1, $array2) { typeswitch($array1) - case array return let $join := + case array return let $accumulated_sub_dimensions := for $i in 1 to size($array1) - return jsoniq_numpy:max_array_rec($array1[[$i]], $array2[[$i]]) - return [$join] + return jsoniq_numpy:compute_max_values_of_arrays($array1[[$i]], $array2[[$i]]) + return [$accumulated_sub_dimensions] default return if ($array1 gt $array2) then $array1 else $array2 }; (: Helper method to compute maximum of two arrays. The maximum is computed per index, so the maximum value for a specific index is taken. If the maximum is greater than initial, initial is returned instead as the maximum. :) -declare function jsoniq_numpy:max_array_rec($array1, $array2, $initial) { +declare function jsoniq_numpy:compute_max_values_of_arrays($array1, $array2, $initial) { typeswitch($array1) - case array return let $join := + case array return let $accumulated_sub_dimensions := for $i in 1 to size($array1) - return jsoniq_numpy:max_array_rec($array1[[$i]], $array2[[$i]], $initial) - return [$join] + return jsoniq_numpy:compute_max_values_of_arrays($array1[[$i]], $array2[[$i]], $initial) + return [$accumulated_sub_dimensions] default return if ($array1 gt $array2) then if ($initial gt $array1) then $initial else $array1 @@ -724,67 +757,67 @@ declare function jsoniq_numpy:max_array_rec($array1, $array2, $initial) { }; (: Helper method to compute the maximum on the right axis. :) -declare function jsoniq_numpy:max_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer) { +declare function jsoniq_numpy:compute_max_along_axis($array as array, $axis as integer, $current_dimension as integer, $max_dim as integer) { if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); else - if ($dim eq $max_dim) then exit returning max(flatten($array[])); + if ($current_dimension eq $max_dim) then exit returning max(flatten($array)); else { - if ($dim eq $axis) then { + if ($current_dimension eq $axis) then { (: Take the first array as maximum :) - variable $maxii := $array[[1]]; + variable $max_arr := $array[[1]]; variable $i := 2; while ($i le size($array)) { - $maxii := jsoniq_numpy:max_array_rec($maxii, $array[[$i]]); + $max_arr := jsoniq_numpy:compute_max_values_of_arrays($max_arr, $array[[$i]]); $i := $i + 1; } - exit returning $maxii; + exit returning $max_arr; } else { - let $join := + let $accumulated_sub_dimensions := let $size := size($array) for $i in 1 to $size - return jsoniq_numpy:max_rec($array[[$i]], $axis, $dim + 1, $max_dim) - return exit returning [$join]; + return jsoniq_numpy:compute_max_along_axis($array[[$i]], $axis, $current_dimension + 1, $max_dim) + return exit returning [$accumulated_sub_dimensions]; } } }; (: Helper method to compute the maximum on the right axis and using initial. :) -declare function jsoniq_numpy:max_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer, $initial as integer) { +declare function jsoniq_numpy:compute_max_along_axis($array as array, $axis as integer, $current_dimension as integer, $max_dim as integer, $initial as integer) { if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); else - if ($dim eq $max_dim) then exit returning max((flatten($array[]), $initial)); + if ($current_dimension eq $max_dim) then exit returning max((flatten($array), $initial)); else { - if ($dim eq $axis) then { + if ($current_dimension eq $axis) then { (: Take the first array as maximum :) - variable $maxii := $array[[1]]; + variable $max_arr := $array[[1]]; variable $i := 2; while ($i le size($array)) { - $maxii := jsoniq_numpy:max_array_rec($maxii, $array[[$i]], $initial); + $max_arr := jsoniq_numpy:compute_max_values_of_arrays($max_arr, $array[[$i]], $initial); $i := $i + 1; } - exit returning $maxii; + exit returning $max_arr; } else { - let $join := + let $accumulated_sub_dimensions := let $size := size($array) for $i in 1 to $size - return jsoniq_numpy:max_rec($array[[$i]], $axis, $dim + 1, $max_dim, $initial) - return exit returning [$join]; + return jsoniq_numpy:compute_max_along_axis($array[[$i]], $axis, $current_dimension + 1, $max_dim, $initial) + return exit returning [$accumulated_sub_dimensions]; } } }; (: Helper method that invokes maximum with axis only :) -declare function jsoniq_numpy:max_($array as array, $axis as integer) { +declare function jsoniq_numpy:compute_max_along_axis_wrapper($array as array, $axis as integer) { if ($axis eq -1) then max(flatten($array[])) else - jsoniq_numpy:max_rec($array, $axis, 0, size(utils:shape($array)) - 1) + jsoniq_numpy:compute_max_along_axis($array, $axis, 0, size(utils:shape($array)) - 1) }; (: Helper method that invokes maximum with axis and initial :) -declare function jsoniq_numpy:max_($array as array, $axis as integer, $initial as integer) { +declare function jsoniq_numpy:compute_max_along_axis_wrapper($array as array, $axis as integer, $initial as integer) { if ($axis eq -1) then max((flatten($array[]), $initial)) else - jsoniq_numpy:max_rec($array, $axis, 0, size(utils:shape($array)) - 1, $initial) + jsoniq_numpy:compute_max_along_axis($array, $axis, 0, size(utils:shape($array)) - 1, $initial) }; @@ -803,9 +836,9 @@ declare function jsoniq_numpy:max($array as array, $params as object) { let $params := validate type jsoniq_numpy:max_params {$params} return { if ($params.initial eq 2147483647) then - jsoniq_numpy:max_($array, $params.axis) + jsoniq_numpy:compute_max_along_axis_wrapper($array, $params.axis) else - jsoniq_numpy:max_($array, $params.axis, $params.initial) + jsoniq_numpy:compute_max_along_axis_wrapper($array, $params.axis, $params.initial) } }; @@ -815,58 +848,57 @@ declare function jsoniq_numpy:max($array as array) { (: MEAN :) -(: TODO: Currently, only the axis argument is supported. :) -(: Helper method to sum two arrays together. :) -declare function jsoniq_numpy:sum_array_rec($array1, $array2) { + +declare function jsoniq_numpy:sum_arrays($array1, $array2) { typeswitch($array1) - case array return let $join := + case array return let $accumulated_sub_dimensions := for $i in 1 to size($array1) - return jsoniq_numpy:sum_array_rec($array1[[$i]], $array2[[$i]]) - return [$join] + return jsoniq_numpy:sum_arrays($array1[[$i]], $array2[[$i]]) + return [$accumulated_sub_dimensions] default return $array1 + $array2 }; (: Helper method to compute average on an array given the number of values. :) -declare function jsoniq_numpy:mean_array_rec($array1, $count) { +declare function jsoniq_numpy:compute_mean_of_array($array1, $count) { typeswitch($array1) - case array return let $join := + case array return let $accumulated_sub_dimensions := for $i in 1 to size($array1) - return jsoniq_numpy:mean_array_rec($array1[[$i]], $count) - return [$join] + return jsoniq_numpy:compute_mean_of_array($array1[[$i]], $count) + return [$accumulated_sub_dimensions] default return $array1 div $count }; (: Helper method to compute the mean on the right axis. :) -declare function jsoniq_numpy:mean_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer) { +declare function jsoniq_numpy:compute_mean_along_axis($array as array, $axis as integer, $current_dimension as integer, $max_dim as integer) { if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); else - if ($dim eq $max_dim) then exit returning avg(flatten($array)); + if ($current_dimension eq $max_dim) then exit returning avg(flatten($array)); else { - if ($dim eq $axis) then { + if ($current_dimension eq $axis) then { (: Take the first array as sum :) variable $mean := $array[[1]]; variable $i := 2; while ($i le size($array)) { - $mean := jsoniq_numpy:sum_array_rec($mean, $array[[$i]]); + $mean := jsoniq_numpy:sum_arrays($mean, $array[[$i]]); $i := $i + 1; } - $mean := jsoniq_numpy:mean_array_rec($mean, size($array)); + $mean := jsoniq_numpy:compute_mean_of_array($mean, size($array)); exit returning $mean; } else { - let $join := + let $accumulated_sub_dimensions := let $size := size($array) for $i in 1 to $size - return jsoniq_numpy:mean_rec($array[[$i]], $axis, $dim + 1, $max_dim) - return exit returning [$join]; + return jsoniq_numpy:compute_mean_along_axis($array[[$i]], $axis, $current_dimension + 1, $max_dim) + return exit returning [$accumulated_sub_dimensions]; } } }; (: Helper method that invokes maximum with axis only :) -declare function jsoniq_numpy:mean_($array as array, $axis as integer) { +declare function jsoniq_numpy:compute_mean_along_axis_wrapper($array as array, $axis as integer) { if ($axis eq -1) then avg(flatten($array)) else - jsoniq_numpy:mean_rec($array, $axis, 0, size(utils:shape($array)) - 1) + jsoniq_numpy:compute_mean_along_axis($array, $axis, 0, size(utils:shape($array)) - 1) }; declare type jsoniq_numpy:mean_params as { @@ -880,7 +912,7 @@ Params is an object for optional arguments. These arguments are: - axis (integer): The axis along which to compute the mean. Only values greater than 0 are accepted.:) declare function jsoniq_numpy:mean($array as array, $params as object) { let $params := validate type jsoniq_numpy:mean_params {$params} - return jsoniq_numpy:mean_($array, $params.axis) + return jsoniq_numpy:compute_mean_along_axis_wrapper($array, $params.axis) }; declare function jsoniq_numpy:mean($array as array) { @@ -896,10 +928,10 @@ declare function jsoniq_numpy:absolute($array) { typeswitch($array) case array return if (size($array) eq 0) then [] else - let $join := + let $accumulated_sub_dimensions := for $i in 1 to size($array) return jsoniq_numpy:absolute($array[[$i]]) - return [$join] + return [$accumulated_sub_dimensions] default return abs($array) }; @@ -916,7 +948,7 @@ declare function jsoniq_numpy:sort($array as array, $low as integer, $high as in }; declare function jsoniq_numpy:partition($array as array, $low as integer, $high as integer) { - variable $pivot := jsoniq_numpy:random_randint($low, {"high": $high + 1, "size": 1})[[1]]; + variable $pivot := jsoniq_numpy:random_randint($low, {"high": $high + 1, "size": [1]})[[1]]; variable $end := $array[[$high]]; replace json value of $array[[$high]] with $array[[$pivot]]; replace json value of $array[[$pivot]] with $end; @@ -943,13 +975,12 @@ declare function jsoniq_numpy:sort($array) { (: Count non-zero :) -(: Helper method to compute count nonzero on an array given the number of values. :) -declare function jsoniq_numpy:count_nonzero_rec_array($array1) { +declare function jsoniq_numpy:count_nonzero_values($array1) { typeswitch($array1) - case array return let $join := + case array return let $accumulated_sub_dimensions := for $i in 1 to size($array1) - return jsoniq_numpy:count_nonzero_rec_array($array1[[$i]]) - return [$join] + return jsoniq_numpy:count_nonzero_values($array1[[$i]]) + return [$accumulated_sub_dimensions] case string return if ($array1 eq "") then 0 else 1 case boolean return if ($array1) then 1 @@ -958,36 +989,34 @@ declare function jsoniq_numpy:count_nonzero_rec_array($array1) { else 0 }; -(: Helper method to compute the mean on the right axis. :) -declare function jsoniq_numpy:count_nonzero_rec($array as array, $axis as integer, $dim as integer, $max_dim as integer) { +declare function jsoniq_numpy:count_nonzero_values_along_axis($array as array, $axis as integer, $current_dimension as integer, $max_dim as integer) { if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); else - if ($dim eq $max_dim) then exit returning sum(flatten(jsoniq_numpy:count_nonzero_rec_array($array))); + if ($current_dimension eq $max_dim) then exit returning sum(flatten(jsoniq_numpy:count_nonzero_values($array))); else { - if ($dim eq $axis) then { - variable $count := jsoniq_numpy:count_nonzero_rec_array($array[[1]]); + if ($current_dimension eq $axis) then { + variable $count_nonzero_accumulated := jsoniq_numpy:count_nonzero_values($array[[1]]); variable $i := 2; while ($i le size($array)) { - variable $curr_count := jsoniq_numpy:count_nonzero_rec_array($array[[$i]]); - $count := jsoniq_numpy:sum_array_rec($curr_count, $count); + variable $curr_count := jsoniq_numpy:count_nonzero_values($array[[$i]]); + $count_nonzero_accumulated := jsoniq_numpy:sum_arrays($curr_count, $count_nonzero_accumulated); $i := $i + 1; } - exit returning $count; + exit returning $count_nonzero_accumulated; } else { - let $join := + let $accumulated_sub_dimensions := let $size := size($array) for $i in 1 to $size - return jsoniq_numpy:count_nonzero_rec($array[[$i]], $axis, $dim + 1, $max_dim) - return exit returning [$join]; + return jsoniq_numpy:count_nonzero_values_along_axis($array[[$i]], $axis, $current_dimension + 1, $max_dim) + return exit returning [$accumulated_sub_dimensions]; } } }; -(: Helper method that invokes maximum with axis only :) -declare function jsoniq_numpy:count_nonzero_($array as array, $axis as integer) { - if ($axis eq -1) then sum(flatten(jsoniq_numpy:count_nonzero_rec_array($array))) +declare function jsoniq_numpy:count_nonzero_along_axis_wrapper($array as array, $axis as integer) { + if ($axis eq -1) then sum(flatten(jsoniq_numpy:count_nonzero_values($array))) else - jsoniq_numpy:count_nonzero_rec($array, $axis, 0, size(utils:shape($array)) - 1) + jsoniq_numpy:count_nonzero_values_along_axis($array, $axis, 0, size(utils:shape($array)) - 1) }; declare type jsoniq_numpy:count_nonzero_params as { @@ -1001,7 +1030,7 @@ Params is an object for optional arguments. These arguments are: - axis (integer): The axis along which to compute the count on. Only values greater than 0 are accepted.:) declare function jsoniq_numpy:count_nonzero($array as array, $params as object) { let $params := validate type jsoniq_numpy:count_nonzero_params {$params} - return jsoniq_numpy:count_nonzero_($array, $params.axis) + return jsoniq_numpy:count_nonzero_along_axis_wrapper($array, $params.axis) }; declare function jsoniq_numpy:count_nonzero($array as array) { @@ -1018,57 +1047,56 @@ declare function jsoniq_numpy:unique($array as array) { }; (: Median :) -(: Helper method to merge two arrays. Destination may have higher dimension that source, thus we may append to it if it is already an array. :) +(: Helper method to merge two arrays. Destination may have higher dimension than source, thus we may append to it if it is already an array type. :) declare function jsoniq_numpy:merge_arrays($source, $dest) { typeswitch($source) - case array return let $join := + case array return let $accumulated_sub_dimensions := for $i in 1 to size($source) return jsoniq_numpy:merge_arrays($source[[$i]], $dest[[$i]]) - return [$join] + return [$accumulated_sub_dimensions] default return typeswitch($dest) case array return [$source, flatten($dest)] default return [$source, $dest] }; -declare function jsoniq_numpy:median_of_array_recursive($array) { +declare function jsoniq_numpy:compute_median($array) { if (size(utils:shape($array)) gt 1) then - let $join := + let $accumulated_sub_dimensions := for $i in 1 to size($array) - return jsoniq_numpy:median_of_array_recursive($array[[$i]]) - return [$join] + return jsoniq_numpy:compute_median($array[[$i]]) + return [$accumulated_sub_dimensions] else - jsoniq_numpy:median_of_array($array) + jsoniq_numpy:compute_median_without_axis($array) }; -(: Helper method to compute the mean on the right axis. :) -declare function jsoniq_numpy:median_on_axis_recursive($array as array, $axis as integer, $dim as integer, $max_dim as integer) { +declare function jsoniq_numpy:compute_median_along_axis($array as array, $axis as integer, $current_dimension as integer, $max_dim as integer) { if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array."); else - if ($dim eq $max_dim) then exit returning jsoniq_numpy:median_of_array($array); + if ($current_dimension eq $max_dim) then exit returning jsoniq_numpy:compute_median_without_axis($array); else { - if ($dim eq $axis) then { - variable $sub_arr := $array[[1]]; + if ($current_dimension eq $axis) then { + variable $accumulated_subarrays := $array[[1]]; variable $i := 2; while ($i le size($array)) { - $sub_arr := jsoniq_numpy:merge_arrays($array[[$i]], $sub_arr); + $accumulated_subarrays := jsoniq_numpy:merge_arrays($array[[$i]], $accumulated_subarrays); $i := $i + 1; } if ($i eq 2) then (: no merging was done, no median is needed for this axis :) - exit returning $sub_arr; + exit returning $accumulated_subarrays; else - exit returning jsoniq_numpy:median_of_array_recursive($sub_arr); + exit returning jsoniq_numpy:compute_median($accumulated_subarrays); } else { - let $join := + let $accumulated_sub_dimensions := let $size := size($array) for $i in 1 to $size - return jsoniq_numpy:median_on_axis_recursive($array[[$i]], $axis, $dim + 1, $max_dim) - return exit returning [$join]; + return jsoniq_numpy:compute_median_along_axis($array[[$i]], $axis, $current_dimension + 1, $max_dim) + return exit returning [$accumulated_sub_dimensions]; } } }; -declare function jsoniq_numpy:median_of_array($array as array) { +declare function jsoniq_numpy:compute_median_without_axis($array as array) { let $sorted_arr := jsoniq_numpy:sort($array) let $middle_index := size($sorted_arr) div 2 return @@ -1078,11 +1106,10 @@ declare function jsoniq_numpy:median_of_array($array as array) { $sorted_arr[[$middle_index + 1]] }; -(: Helper method that computes median on given axis. It acts as a wrapper for the recursive method :) declare function jsoniq_numpy:median_on_axis($array as array, $axis as integer) { - if ($axis eq -1) then jsoniq_numpy:median_of_array([flatten($array)]) + if ($axis eq -1) then jsoniq_numpy:compute_median_without_axis([flatten($array)]) else - jsoniq_numpy:median_on_axis_recursive($array, $axis, 0, size(utils:shape($array)) - 1) + jsoniq_numpy:compute_median_along_axis($array, $axis, 0, size(utils:shape($array)) - 1) }; declare type jsoniq_numpy:median_params as { diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq index 836f52aea..451be5969 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="([ 2, 5, 4, 3 ], [ 3, 4, 5, 6, 7, 8, 9 ], [ 2, 3, 3, 3, 3, 3, 3 ], [ 0, 2, 2, 2, 5 ], [ ], [ ], [ 0, 0 ], [ 5, 2, 3, 4 ], [ 0, 0, 0, 0, 0, 0, 0 ], [ 5, 4, 4, 4, 4, 4, 4 ], [ 5, 4, 4, 4, 1 ])":) +(:JIQS: ShouldRun; Output="([ 2, 5, 4, 3 ], [ 3, 4, 5, 6, 7, 8, 9 ], [ 2, 3, 3, 3, 3, 3, 3 ], [ 0, 2, 2, 2, 5 ], [ ], [ ], [ 0, 0 ], [ 5, 2, 3, 4 ], [ 25, 24, 23, 22, 21, 20, 19 ], [ 5, 4, 4, 4, 4, 4, 4 ], [ 5, 4, 4, 4, 1 ], [ 5, 2, 3, 4 ], [ 26, 25, 24, 23, 22, 21, 20 ], [ 6, 5, 4, 4, 4, 4, 4 ], [ 5, 5, 4, 4, 2 ])":) import module namespace numpy = "jsoniq_numpy.jq"; numpy:digitize([0.2, 6.4, 3.0, 1.6], [0.0, 1.0, 2.5, 4.0, 10.0]), numpy:digitize([1, 2, 3, 4, 5, 6, 7], numpy:arange(25)), @@ -10,4 +10,8 @@ numpy:digitize([1, 2], []), numpy:digitize([0.2, 6.4, 3.0, 1.6], [10.0, 4.0, 2.5, 1.0, 0.0]), numpy:digitize([1, 2, 3, 4, 5, 6, 7], numpy:arange(0, {"start": 25, "step": -1})), numpy:digitize([1, 2, 3, 4, 5, 6, 7], [30, 20, 10, 2, 1]), -numpy:digitize([1, 2, 3, 4, 7], [7, 6, 5, 2]) \ No newline at end of file +numpy:digitize([1, 2, 3, 4, 7], [7, 6, 5, 2]), +numpy:digitize([0.2, 6.4, 3.0, 1.6], [10.0, 4.0, 2.5, 1.0, 0.0], {"right": true}), +numpy:digitize([1, 2, 3, 4, 5, 6, 7], numpy:arange(0, {"start": 25, "step": -1}), {"right": true}), +numpy:digitize([1, 2, 3, 4, 5, 6, 7], [30, 20, 10, 2, 1], {"right": true}), +numpy:digitize([1, 2, 3, 4, 7], [7, 6, 5, 2], {"right": true}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq index fde08c0d3..198688895 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq @@ -1,6 +1,9 @@ -(:JIQS: ShouldRun; Output="(1, 3, 4, 10)":) +(:JIQS: ShouldRun; Output="(1, 3, 4, 10, 600, 21, 256)":) import module namespace numpy = "jsoniq_numpy.jq"; size([numpy:random()]), -size(numpy:random(3)), -size(numpy:random_uniform({"low": 0.5, "high": 1.0, "size": 4})), -size(numpy:random_randint(5, {"high": 10, "size": 10})) \ No newline at end of file +size(numpy:random([3])), +size(numpy:random_uniform({"low": 0.5, "high": 1.0, "size": [4]})), +size(numpy:random_randint(5, {"high": 10, "size": [10]})), +count(flatten(numpy:random_randint(5, {"high": 10, "size": [10, 20, 3]}))), +count(flatten(numpy:random([3, 7, 1, 1]))), +count(flatten(numpy:random_uniform({"low": 0.5, "high": 1.0, "size": [4, 4, 4, 4]}))) \ No newline at end of file From 68dfbd810ba8a33330939bd183f05e130edfbe3b Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Sun, 23 Jun 2024 12:39:56 +0200 Subject: [PATCH 19/56] Rounded logspace with float --- src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq | 2 +- .../test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index 0410dcad7..725360b5b 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -291,7 +291,7 @@ declare function jsoniq_numpy:compute_logspace($start as double, $end as double, let $linspace_vals := jsoniq_numpy:linspace($start, $end, {"num": $params.num, "endpoint": $params.endpoint, "retstep": false}) let $res := for $i in 1 to $params.num - return pow($base, $linspace_vals[[$i]]) + return float(pow($base, $linspace_vals[[$i]])) return [$res] }; (: Generate evenly spaced numbers on a log scale in base 10. diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq index 0da7fb3cf..2c1613db4 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="([ 100, 177.82794100389228, 316.2277660168379, 562.341325190349 ], [ 100, 215.44346900318845, 464.15888336127773, 1000 ], [ 1.2589254117941673, 1.5488166189124812, 1.9054607179632472, 2.344228815319922, 2.8840315031266055, 3.548133892335754, 4.36515832240166, 5.370317963702528, 6.606934480075959, 8.128305652490639 ], [ 1.2589254117941673, 1.5848931924611136, 1.9952623149688797, 2.51188643150958, 3.1622776601683795, 3.9810717055349722, 5.011872336272724, 6.309573444801933, 7.943282347242816, 10 ], [ 100, 112.2018454301963, 125.89254117941675, 141.2537544622754, 158.48931924611142, 177.82794100389228, 199.52623149688787, 223.872113856834, 251.18864315095797, 281.8382931264455, 316.2277660168379, 354.8133892335753, 398.1071705534973, 446.683592150963, 501.18723362727246, 562.341325190349, 630.957344480193, 707.945784384138, 794.3282347242814, 891.2509381337459, 1000, 1122.018454301963, 1258.9254117941675, 1412.5375446227554, 1584.893192461114, 1778.2794100389228, 1995.2623149688789, 2238.72113856834, 2511.886431509582, 2818.382931264455, 3162.2776601683795, 3548.133892335753, 3981.0717055349733, 4466.835921509635, 5011.872336272725, 5623.413251903491, 6309.57344480193, 7079.457843841381, 7943.282347242822, 8912.509381337459, 10000, 11220.184543019652, 12589.254117941662, 14125.375446227554, 15848.93192461114, 17782.794100389227, 19952.62314968883, 22387.21138568338, 25118.864315095823, 28183.82931264455, 31622.776601683792, 35481.3389233576, 39810.71705534969, 44668.35921509635, 50118.72336272725, 56234.13251903491, 63095.73444801943, 70794.57843841374, 79432.82347242822, 89125.0938133746, 100000, 112201.84543019652, 125892.54117941661, 141253.75446227554, 158489.3192461114, 177827.94100389228, 199526.23149688827, 223872.11385683378, 251188.6431509582, 281838.2931264455, 316227.7660168379, 354813.389233576, 398107.1705534969, 446683.5921509635, 501187.2336272725, 562341.3251903491, 630957.3444801943, 707945.7843841374, 794328.2347242822, 891250.9381337459, 1.0E6, 1.122018454301963E6, 1.2589254117941689E6, 1.4125375446227554E6, 1.5848931924611142E6, 1.7782794100389227E6, 1.9952623149688788E6, 2.238721138568342E6, 2.5118864315095823E6, 2.818382931264455E6, 3.1622776601683795E6, 3.548133892335753E6, 3.9810717055349775E6, 4.466835921509635E6, 5.011872336272725E6, 5.623413251903491E6, 6.309573444801943E6, 7.079457843841387E6, 7.943282347242822E6, 8.912505467113453E6 ], [ 0.1, 0.12589254117941673, 0.15848931924611132, 0.19952623149688797, 0.251188643150958, 0.31622776601683794, 0.3981071705534973, 0.5011872336272724, 0.6309573444801932, 0.7943282319988467 ], [ 1, 0.6309573444801932, 0.3981071705534972, 0.25118864315095796, 0.15848931924611132, 0.1, 0.0630957344480193, 0.03981071705534971, 0.025118864315095794, 0.0158489336647576 ], [ 0.1, 0.021544346900318846, 0.004641588833612782, 0.001 ])":) +(:JIQS: ShouldRun; Output="([ 100, 177.82794, 316.22775, 562.3413 ], [ 100, 215.44347, 464.15887, 1000 ], [ 1.2589254, 1.5488166, 1.9054607, 2.3442287, 2.8840315, 3.5481339, 4.3651586, 5.370318, 6.6069345, 8.128305 ], [ 1.2589254, 1.5848932, 1.9952623, 2.5118864, 3.1622777, 3.9810717, 5.0118723, 6.3095737, 7.943282, 10 ], [ 100, 112.20184, 125.89254, 141.25375, 158.48932, 177.82794, 199.52623, 223.87212, 251.18864, 281.8383, 316.22775, 354.8134, 398.10718, 446.6836, 501.18723, 562.3413, 630.95734, 707.9458, 794.32825, 891.2509, 1000, 1122.0184, 1258.9254, 1412.5376, 1584.8932, 1778.2794, 1995.2623, 2238.7212, 2511.8865, 2818.3828, 3162.2776, 3548.1338, 3981.0718, 4466.836, 5011.8726, 5623.413, 6309.573, 7079.458, 7943.282, 8912.51, 10000, 11220.185, 12589.254, 14125.375, 15848.932, 17782.795, 19952.623, 22387.21, 25118.865, 28183.83, 31622.777, 35481.34, 39810.72, 44668.36, 50118.723, 56234.133, 63095.734, 70794.58, 79432.82, 89125.09, 100000, 112201.84, 125892.54, 141253.75, 158489.31, 177827.94, 199526.23, 223872.11, 251188.64, 281838.28, 316227.78, 354813.38, 398107.16, 446683.6, 501187.22, 562341.3, 630957.4, 707945.8, 794328.25, 891250.94, 1.0E6, 1.1220185E6, 1.2589254E6, 1.4125375E6, 1.5848932E6, 1.7782794E6, 1.9952624E6, 2.2387212E6, 2.5118864E6, 2.818383E6, 3.1622778E6, 3.548134E6, 3.9810716E6, 4.466836E6, 5.0118724E6, 5.6234136E6, 6.3095736E6, 7.0794576E6, 7.9432824E6, 8.9125048E6 ], [ 0.1, 0.12589253, 0.15848932, 0.19952624, 0.25118864, 0.31622776, 0.39810717, 0.5011872, 0.63095737, 0.7943282 ], [ 1, 0.63095737, 0.39810717, 0.25118864, 0.15848932, 0.1, 0.06309573, 0.039810717, 0.025118865, 0.015848933 ], [ 0.1, 0.021544347, 0.004641589, 0.001 ])":) import module namespace numpy = "jsoniq_numpy.jq"; numpy:logspace(2.0, 3.0,{"num": 4, "endpoint": false}), numpy:logspace(2.0, 3.0,{"num": 4, "endpoint": true}), From 66bd9e5b1c90b8d32f065083bfdc7332bf37544b Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Sat, 6 Jul 2024 12:40:31 +0200 Subject: [PATCH 20/56] Added initial pandas implementation for fillna and dropna, together with the item-type method --- .../context/BuiltinFunctionCatalogue.java | 14 ++ .../functions/typing/DynamicItemType.java | 53 ++++++ .../resources/queries/sample-na-data.json | 6 + .../runtime/numpy_lib/jsoniq_pandas.jq | 172 ++++++++++++++++++ .../runtime/numpy_lib/test_item_type.jq | 22 +++ .../numpy_lib/test_jsoniq_pandas_dropna.jq | 4 + .../numpy_lib/test_jsoniq_pandas_fill_na.jq | 4 + 7 files changed, 275 insertions(+) create mode 100644 src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemType.java create mode 100644 src/test/resources/queries/sample-na-data.json create mode 100644 src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_item_type.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java index 01e4b06f9..46f6f9b22 100644 --- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java +++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java @@ -142,6 +142,7 @@ import org.rumbledb.runtime.functions.strings.TokenizeFunctionIterator; import org.rumbledb.runtime.functions.strings.TranslateFunctionIterator; import org.rumbledb.runtime.functions.strings.UpperCaseFunctionIterator; +import org.rumbledb.runtime.functions.typing.DynamicItemType; import org.rumbledb.types.FunctionSignature; import org.rumbledb.types.SequenceType; import sparksoniq.spark.ml.AnnotateFunctionIterator; @@ -2797,6 +2798,18 @@ private static BuiltinFunction createBuiltinFunction( BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); + static final BuiltinFunction item_type = createBuiltinFunction( + new Name( + Name.FN_NS, + "", + "item-type" + ), + "item*", + "string", + DynamicItemType.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + static { builtinFunctions = new HashMap<>(); @@ -3008,6 +3021,7 @@ private static BuiltinFunction createBuiltinFunction( builtinFunctions.put(error.getIdentifier(), error); builtinFunctions.put(error_with_code.getIdentifier(), error_with_code); builtinFunctions.put(error_with_code_and_description.getIdentifier(), error_with_code_and_description); + builtinFunctions.put(item_type.getIdentifier(), item_type); } diff --git a/src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemType.java b/src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemType.java new file mode 100644 index 000000000..d032627f1 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemType.java @@ -0,0 +1,53 @@ +package org.rumbledb.runtime.functions.typing; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.items.ItemFactory; +import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; +import org.rumbledb.types.ItemType; + +import java.util.List; + +public class DynamicItemType extends AtMostOneItemLocalRuntimeIterator { + private final ItemFactory itemFactory; + private List materializedArgument; + private ItemType itemType; + + public DynamicItemType(List children, RuntimeStaticContext staticContext) { + super(children, staticContext); + this.itemFactory = ItemFactory.getInstance(); + } + + @Override + public Item materializeFirstItemOrNull(DynamicContext context) { + materializeArgument(context); + setArgumentType(); + return getLeastCommonSupertype(); + } + + private void materializeArgument(DynamicContext context) { + this.materializedArgument = this.children.get(0).materialize(context); + } + + private void setArgumentType() { + this.itemType = this.materializedArgument.get(0).getDynamicType(); + } + + private Item getLeastCommonSupertype() { + List structureItems = getStructureItems(); + ItemType structureCommonType = structureItems.get(0).getDynamicType(); + for (Item item : structureItems) { + structureCommonType = structureCommonType.findLeastCommonSuperTypeWith(item.getDynamicType()); + } + return this.itemFactory.createStringItem(structureCommonType.getIdentifierString()); + } + + private List getStructureItems() { + if (this.itemType.isArrayItemType()) { + return this.materializedArgument.get(0).getItems(); + } + return this.materializedArgument; + } +} diff --git a/src/test/resources/queries/sample-na-data.json b/src/test/resources/queries/sample-na-data.json new file mode 100644 index 000000000..99eca2db9 --- /dev/null +++ b/src/test/resources/queries/sample-na-data.json @@ -0,0 +1,6 @@ +{"label": 0, "binaryLabel": 0, "name": "a", "age": 20, "weight": 50.0, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 1", "stringArrayCol": ["i", "am", "data", "entry", "1"], "intArrayCol": [1,2,3], "doubleArrayCol": [1.0,2.0,3.0], "doubleArrayArrayCol": [[1.0,2.0,3.0]]} +{"label": 1, "binaryLabel": 0, "name": "b", "age": 21, "weight": 55.3, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 2", "stringArrayCol": ["i", "am", "data", "entry", "2"], "intArrayCol": [4,5,6], "doubleArrayCol": [4.0,5.0,6.0], "doubleArrayArrayCol": [[4.0,5.0,6.0]]} +{"label": 2, "binaryLabel": 0, "name": "c", "age": 22, "weight": 60.6, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 3", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [7,8,9], "doubleArrayCol": [7.0,8.0,9.0], "doubleArrayArrayCol": [[7.0,8.0,9.0]]} +{"label": 3, "binaryLabel": 1, "name": "d", "age": 23, "weight": 65.9, "booleanCol": null, "nullCol": null, "stringCol": "i am data entry 4", "stringArrayCol": ["i", "am", "data", "entry", "4"], "intArrayCol": [1,4,7], "doubleArrayCol": [1.0,4.0,7.0], "doubleArrayArrayCol": [[1.0,4.0,7.0]]} +{"label": 4, "binaryLabel": 1, "name": "e", "age": 24, "weight": 70.3, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 5", "stringArrayCol": ["i", "am", "data", "entry", "5"], "intArrayCol": [2,5,8], "doubleArrayCol": [2.0,5.0,8.0], "doubleArrayArrayCol": [[2.0,5.0,8.0]]} +{"label": 5, "binaryLabel": 1, "name": "f", "age": 25, "weight": 75.6, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 6", "stringArrayCol": ["i", "am", "data", "entry", "6"], "intArrayCol": [3,6,9], "doubleArrayCol": [3.0,6.0,9.0], "doubleArrayArrayCol": [[3.0,6.0,9.0]]} diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq new file mode 100644 index 000000000..173ee77e4 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq @@ -0,0 +1,172 @@ +(:JIQS: ShouldNotParse; ErrorCode="XPST0003"; ErrorMetadata="LINE:1:COLUMN:0:" :) +module namespace jsoniq_pandas = "jsoniq_pandas.jq"; +import module namespace utils = "jsoniq_utils.jq"; + + +declare type jsoniq_pandas:describe_params as { + "include": "array", + "exclude": "array" +}; +(: describe generates descriptive statistics about a dataset. Statistics summarize the central tendency, dispersion and shape of a dataset, excluding null values. Provides a string/dataframe as result. +TODO: Supported percentiles are only [.25, .5, .75]. +Required params are: +- dataframe (DataFrame): The dataframe to look into +Params is an object for optional arguments. These arguments are: +- include (array) - list of types of data to include in the description. To return only numeric summaries for numeric types, submit 'number'. To return only object summaries for object types, submit 'object'. TODO: categorical data +- exclude (array) - list of types of data to exclude in the description. To exclude numeric summaries for numeric types, submit 'number'. To exclude object summaries for object types, submit 'object'. TODO: categorical data :) +declare function jsoniq_pandas:describe($dataframe as object*, $params as object) {}; + + +declare type jsoniq_pandas:info_params as { + "max_cols": "integer=10", + "memory_usage": "boolean=false", + "show_counts": "boolean=false" +}; +(: info prints a summary of a DataFrame to the screen. +Required params are: +- dataframe (DataFrame): The dataframe to look into +Params is an object for optional arguments. These arguments are: +- max_cols (integer): If the DataFrame has more columns, a truncated output is provided up to the given maximum column number. +- memory_usage (boolean): Provides memory size of the DataFrame (TODO) +- show_counts (boolean): Option to provide count of null elements in a column.:) +declare function jsoniq_pandas:info($dataframe as object*, $params as object){}; + +(: assign inserts new columns into a dataframe. Returns a new DataFrame with all of the original dataframe's columns in addition to new ones. Existing columns that are re-assigned are overwritten. +Required params are: +- dataframe (DataFrame): The dataframe to copy the columns from. +- columns (object): Pairs of string:array values to insert, where string is the column name and array is the values. Note, the array must have the same size as the number of entries in the DataFrame, otherwise an error is raised. +:) +declare function jsoniq_pandas:assign($to_insert as object) {}; + +(: sample returns a random sample from the DataFrame. We currently only support returning results from the first axis, that is rows of the DataFrame. We do not support weighted samples or fractional samples. We only support sampling with replacement. +Required params are: +- dataframe (DataFrame): the dataframe to sample from. +- n (integer): number of samples to return. +:) +declare function jsoniq_pandas:sample($dataframe as object*, $num as integer) {}; + + +(: isnull returns a same-sized array indicating if values are null or not. +Required params are: +- dataframe (DataFrame): the dataframe to search nulls in. +:) +declare function jsoniq_pandas:isnull($dataframe as object*) {}; + + +declare type jsoniq_pandas:fillna_params as { + "value": "integer=0", + "method": "string=none", + "limit": "integer=1000" +}; + +declare function jsoniq_pandas:fill_na_array($row_or_value as array, $params as object) { + (: TODO: Error handling. Limit. Method :) + typeswitch($row_or_value) + case array return + for $value in $row_or_value + return + if (item-type($value) eq "object") then + jsoniq_pandas:fill_na_object($value, $params) + else jsoniq_pandas:fill_na_array($value, $params) + default return + if ($row_or_value eq null) then $params.value + else $row_or_value +}; + +declare function jsoniq_pandas:fill_na_object($object as object, $params as object) { + for $key in keys($object) + let $value := $object.$key + return + if (item-type($value) eq "object") then + let $result := jsoniq_pandas:fill_na_object($value, $params) + return {$key: $result} + else + let $result := jsoniq_pandas:fill_na_array($value, $params) + return {$key: $result} +}; + +(: fillna replaces null values with specified values. It returns a new DataFrame with the replacement result. +Required params are: +- dataframe (DataFrame): the dataframe to fill nulls in. +Params is an object for optional arguments. These arguments are: +- value (integer): the value to replace null's with. +- method (string): bfill and ffill are supported. Method and value cannot be both specified! +- limit (integer): how many null's to fill. If unspecified, all nulls are replaced. +:) +declare function jsoniq_pandas:fillna($dataframe as object*, $params as object) { + let $params := validate type jsoniq_pandas:fillna_params {$params} + for $row in $dataframe + return jsoniq_pandas:fill_na_array($row, $params) +}; + + +declare type jsoniq_pandas:dropna_params as { + "axis": "integer=0", + "how": "string=any" +}; +(: dropna removes rows or columns from DataFrames that contain nulls. The $axis parameter controls if rows or columns are removed, whereas the $how parameter controls the ruling for dropping the row or column. +Required params are: +- dataframe (DataFrame): the dataframe to drop nulls from. +Params is an object for optional arguments. These arguments are: +- axis (integer): the axis along to remove values from. Can only be 0 for rows or 1 for columns. +- how (string): 'any' or 'all' are supported. +(: :) +declare function jsoniq_pandas:dropna($dataframe as object*, $params as object) { + let $params := validate type jsoniq_pandas:dropna_params {$params} + return + if ($params.axis eq 0) then { + (: Remove rows :) + for $row in $dataframe + return jsoniq_pandas:dropna_how($row, $params.how) + } else { + (: Remove columns :) + for $column_name in keys($dataframe) + return jsoniq_pandas:dropna_how($dataframe.$column_name, $params.how) + } +}; :) + +declare function jsoniq_pandas:dropna_how($data, $how as string) { + $data + (: if ($how eq "any") then + typeswitch($data) + case object return + for $key in keys($data) + return if (jsoniq_pandas:has_na($data.$key)) then () + else { $key: $data.$key } + case array return + if (jsoniq_pandas:has_na($data)) then () + else $data + default return + if ($data eq null) then () + else $data + else + typeswitch($data) + case object return + for $key in keys($data) + return if (not jsoniq_pandas:has_na($data.$key)) then { $key: $data.$key } + else () + case array return + if (not jsoniq_pandas:has_na($data)) then $data + else () + default return + if ($data eq null) then () + else $data :) +}; + +(: declare function jsoniq_pandas:has_na($data) { + variable $has_na := false; + typeswitch($data) + case object return + for $key in keys($data) + return if (jsoniq_pandas:has_na($data.$key)) then {$has_na := true; break loop;} + else (); + case array return + for $value in $data + return + if ($value eq null) then {$has_na := true; break loop;} + else (); + default return + if ($data eq null) then $has_na := true; + else (); + exit returning $has_na; +}; :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_item_type.jq b/src/test/resources/test_files/runtime/numpy_lib/test_item_type.jq new file mode 100644 index 000000000..f7928e0f8 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_item_type.jq @@ -0,0 +1,22 @@ +(:JIQS: ShouldRun; Output="(xs:string, js:atomic, js:object, xs:int, xs:dateTime, xs:string, xs:decimal, xs:date, xs:time, xs:duration, xs:boolean, js:null, xs:base64Binary, xs:hexBinary, xs:anyURI, xs:dateTimeStamp, xs:dayTimeDuration, xs:yearMonthDuration, js:object, xs:int)":) + +fn:item-type(["2", "3", "4"]), +fn:item-type([1, "2", 3]), +fn:item-type({"a": "boo"}), +fn:item-type(3), +fn:item-type(dateTime("2001-12-12T23:00:00")), +fn:item-type("test"), +fn:item-type(3.234), +fn:item-type(date("2001-12-12-10:00")), +fn:item-type(time("13:20:30.5555")), +fn:item-type(duration("P3Y5M") ), +fn:item-type(true), +fn:item-type(null), +fn:item-type(base64Binary("abcdEFGH")), +fn:item-type(hexBinary("ab88")), +fn:item-type(anyURI("example.com/")), +fn:item-type(dateTimeStamp("2004-04-12T13:20:00-05:00")), +fn:item-type(dayTimeDuration("P3DT5H6.001S")), +fn:item-type(yearMonthDuration("P2Y4M")), +fn:item-type(json-file("../../../queries/rumbleML/sample-ml-data-age-weight.json")), +fn:item-type(json-file("../../../queries/rumbleML/sample-ml-data-age-weight.json")."age") \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq new file mode 100644 index 000000000..676583658 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="":) +import module namespace pandas = "jsoniq_pandas.jq"; + +pandas:dropna(json-file("../../../queries/sample-na-data.json"), {"axis": 1, "how": "any"}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq new file mode 100644 index 000000000..6a6360488 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="":) +import module namespace pandas = "jsoniq_pandas.jq"; + +pandas:fillna(json-file("../../../queries/sample-na-data.json"), {"value": 1}) \ No newline at end of file From 662d83cbf629c8ecabfa6fa026ce485543fe9d36 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Mon, 8 Jul 2024 14:31:15 +0200 Subject: [PATCH 21/56] Implemented initial version of describe --- .../functions/typing/DynamicItemType.java | 5 +- .../runtime/numpy_lib/jsoniq_pandas.jq | 285 +++++++++++++----- .../numpy_lib/test_jsoniq_pandas_describe.jq | 8 + .../numpy_lib/test_jsoniq_pandas_fill_na.jq | 7 +- 4 files changed, 221 insertions(+), 84 deletions(-) create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq diff --git a/src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemType.java b/src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemType.java index d032627f1..f672026bf 100644 --- a/src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemType.java +++ b/src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemType.java @@ -4,6 +4,7 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; +import org.rumbledb.items.StringItem; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.types.ItemType; @@ -11,13 +12,11 @@ import java.util.List; public class DynamicItemType extends AtMostOneItemLocalRuntimeIterator { - private final ItemFactory itemFactory; private List materializedArgument; private ItemType itemType; public DynamicItemType(List children, RuntimeStaticContext staticContext) { super(children, staticContext); - this.itemFactory = ItemFactory.getInstance(); } @Override @@ -41,7 +40,7 @@ private Item getLeastCommonSupertype() { for (Item item : structureItems) { structureCommonType = structureCommonType.findLeastCommonSuperTypeWith(item.getDynamicType()); } - return this.itemFactory.createStringItem(structureCommonType.getIdentifierString()); + return new StringItem(structureCommonType.getIdentifierString()); } private List getStructureItems() { diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq index 173ee77e4..727e099ff 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq @@ -1,20 +1,127 @@ (:JIQS: ShouldNotParse; ErrorCode="XPST0003"; ErrorMetadata="LINE:1:COLUMN:0:" :) module namespace jsoniq_pandas = "jsoniq_pandas.jq"; -import module namespace utils = "jsoniq_utils.jq"; - +import module namespace jsoniq_numpy = "jsoniq_numpy.jq"; declare type jsoniq_pandas:describe_params as { - "include": "array", - "exclude": "array" + "include": "string=all" }; (: describe generates descriptive statistics about a dataset. Statistics summarize the central tendency, dispersion and shape of a dataset, excluding null values. Provides a string/dataframe as result. TODO: Supported percentiles are only [.25, .5, .75]. Required params are: - dataframe (DataFrame): The dataframe to look into Params is an object for optional arguments. These arguments are: -- include (array) - list of types of data to include in the description. To return only numeric summaries for numeric types, submit 'number'. To return only object summaries for object types, submit 'object'. TODO: categorical data -- exclude (array) - list of types of data to exclude in the description. To exclude numeric summaries for numeric types, submit 'number'. To exclude object summaries for object types, submit 'object'. TODO: categorical data :) -declare function jsoniq_pandas:describe($dataframe as object*, $params as object) {}; +- include (array) - type of data to include in the description. To return only numeric summaries for numeric types, submit 'number'. To return only object summaries for object types, submit 'categorical'. To return all types, submit 'all'. +- exclude - not supported :) +declare function jsoniq_pandas:describe($dataframe as object*, $params as object) { + let $params := validate type jsoniq_pandas:describe_params {$params} + for $row in $dataframe + for $column in keys($row) + return { $column: + switch($params.include) + case "all" return jsoniq_pandas:all_report($row.$column) + case "number" return jsoniq_pandas:number_report($row.$column) + case "object" return jsoniq_pandas:object_report($row.$column) + default return error("Unrecognized include option. Only 'number' and 'object' are supported.") + } +}; + +declare function jsoniq_pandas:describe($dataframe as object*) { + jsoniq_pandas:describe($dataframe, {}) +}; + +declare function jsoniq_pandas:all_report($column) { + let $column_type := item-type($column) + return switch($column_type) + case "xs:int" return jsoniq_pandas:numerical_report($column) + case "xs:decimal" return jsoniq_pandas:numerical_report($column) + case "xs:float" return jsoniq_pandas:numerical_report($column) + case "xs:double" return jsoniq_pandas:numerical_report($column) + case "xs:boolean" return jsoniq_pandas:categorical_report($column) + default return jsoniq_pandas:categorical_report($column) +}; + +declare function jsoniq_pandas:number_report($column) { + let $column_type := item-type($column) + return switch($column_type) + case "xs:int" return jsoniq_pandas:numerical_report($column) + case "xs:decimal" return jsoniq_pandas:numerical_report($column) + case "xs:float" return jsoniq_pandas:numerical_report($column) + case "xs:double" return jsoniq_pandas:numerical_report($column) + default return () +}; + +declare function jsoniq_pandas:object_report($column) { + let $column_type := item-type($column) + return switch($column_type) + case "xs:boolean" return jsoniq_pandas:categorical_report($column) + case "xs:string" return jsoniq_pandas:categorical_report($column) + default return () +}; + +declare function jsoniq_pandas:numerical_report($column) { + (: Compute count, mean, std, min, .25, .5, .75, max :) + let $count := size($column) + let $mean := jsoniq_numpy:mean($column) + let $std := jsoniq_pandas:std($column, $mean) + let $min := jsoniq_numpy:min($column) + let $max := jsoniq_numpy:max($column) + let $sorted_arr := jsoniq_numpy:sort($column) + let $percentile_25 := jsoniq_pandas:compute_percentile($sorted_arr, .25) + let $percentile_50 := jsoniq_pandas:compute_percentile($sorted_arr, .50) + let $percentile_75 := jsoniq_pandas:compute_percentile($sorted_arr, .75) + return { + "count": $count, + "mean": $mean, + "std": $std, + "min": $min, + "max": $max, + "25%": $percentile_25, + "50%": $percentile_50, + "75%": $percentile_75 + } +}; + +declare function jsoniq_pandas:std($arr as array, $mean as double) { + let $accumulated := + for $value in $arr[] + return pow($value - $mean, 2) + let $sum_accumulated := fn:sum($accumulated) + let $sample_size := size($arr) - 1 + return float(sqrt($sum_accumulated div $sample_size)) +}; + +declare function jsoniq_pandas:categorical_report($column) { + let $count := size($column) + let $unique := size(jsoniq_numpy:unique($column)) + let $top := jsoniq_numpy:max($column) + let $frequency := jsoniq_pandas:count_occurences($column, $top) + return { + "count": $count, + "unique": $unique, + "top": $top, + "frequency": $frequency + } +}; + +declare function jsoniq_pandas:compute_percentile($arr as array, $percentile) { + let $distance_of_min_to_max := size($arr) - 1 + let $percentile_index := $distance_of_min_to_max * $percentile + 1 + let $percentile_index_integer_part := floor($percentile_index) + let $percentile_index_fractional_part := $percentile_index - $percentile_index_integer_part + let $adjacent_difference := $arr[[$percentile_index]] + $percentile_index_fractional_part * ($arr[[$percentile_index_integer_part + 1]] - $arr[[$percentile_index_integer_part]]) + return $adjacent_difference +}; + +declare function jsoniq_pandas:count_occurences($arr as array, $value) { + variable $count := 0; + variable $index := 1; + while ($index le size($arr)) { + if ($arr[[$index]] eq $value) then $count := $count + 1; + else (); + $index := $index + 1; + } + exit returning $count; +}; declare type jsoniq_pandas:info_params as { @@ -54,35 +161,40 @@ declare function jsoniq_pandas:isnull($dataframe as object*) {}; declare type jsoniq_pandas:fillna_params as { - "value": "integer=0", - "method": "string=none", + "value": "item", "limit": "integer=1000" }; -declare function jsoniq_pandas:fill_na_array($row_or_value as array, $params as object) { - (: TODO: Error handling. Limit. Method :) - typeswitch($row_or_value) - case array return - for $value in $row_or_value - return - if (item-type($value) eq "object") then - jsoniq_pandas:fill_na_object($value, $params) - else jsoniq_pandas:fill_na_array($value, $params) - default return - if ($row_or_value eq null) then $params.value - else $row_or_value -}; - -declare function jsoniq_pandas:fill_na_object($object as object, $params as object) { - for $key in keys($object) - let $value := $object.$key - return - if (item-type($value) eq "object") then - let $result := jsoniq_pandas:fill_na_object($value, $params) - return {$key: $result} - else - let $result := jsoniq_pandas:fill_na_array($value, $params) - return {$key: $result} +declare function jsoniq_pandas:fillna_value($value, $params as object) { + if ($value eq null) then $params.value + else $value +}; + +declare function jsoniq_pandas:fillna_array($array as array, $params as object) { + (: TODO: Error handling. Limit. :) + for $value in $array[] + return typeswitch($value) + case array return jsoniq_pandas:fillna_array($value, $params) + case object return jsoniq_pandas:fillna_object($value, $params) + default return jsoniq_pandas:fillna_value($value, $params) +}; + +declare function jsoniq_pandas:fillna_object($object as object, $params as object) { + {| + for $key in keys($object) + let $value := $object.$key + return + typeswitch($value) + case object return + let $result := jsoniq_pandas:fillna_object($value, $params) + return {$key: $result} + case array return + let $result := jsoniq_pandas:fillna_array($value, $params) + return {$key: $result} + default return + let $result := jsoniq_pandas:fillna_value($value, $params) + return {$key: $result} + |} }; (: fillna replaces null values with specified values. It returns a new DataFrame with the replacement result. @@ -90,13 +202,16 @@ Required params are: - dataframe (DataFrame): the dataframe to fill nulls in. Params is an object for optional arguments. These arguments are: - value (integer): the value to replace null's with. -- method (string): bfill and ffill are supported. Method and value cannot be both specified! - limit (integer): how many null's to fill. If unspecified, all nulls are replaced. :) declare function jsoniq_pandas:fillna($dataframe as object*, $params as object) { let $params := validate type jsoniq_pandas:fillna_params {$params} for $row in $dataframe - return jsoniq_pandas:fill_na_array($row, $params) + return jsoniq_pandas:fillna_object($row, $params) +}; + +declare function jsoniq_pandas:fillna($dataframe as object*) { + jsoniq_pandas:fillna($dataframe, {}) }; @@ -110,63 +225,75 @@ Required params are: Params is an object for optional arguments. These arguments are: - axis (integer): the axis along to remove values from. Can only be 0 for rows or 1 for columns. - how (string): 'any' or 'all' are supported. -(: :) +:) declare function jsoniq_pandas:dropna($dataframe as object*, $params as object) { let $params := validate type jsoniq_pandas:dropna_params {$params} return if ($params.axis eq 0) then { (: Remove rows :) for $row in $dataframe - return jsoniq_pandas:dropna_how($row, $params.how) + return jsoniq_pandas:dropna_how_object($row, $params.how) } else { (: Remove columns :) for $column_name in keys($dataframe) - return jsoniq_pandas:dropna_how($dataframe.$column_name, $params.how) + return jsoniq_pandas:dropna_how_array($dataframe.$column_name, $params.how) } -}; :) - -declare function jsoniq_pandas:dropna_how($data, $how as string) { - $data - (: if ($how eq "any") then - typeswitch($data) - case object return - for $key in keys($data) - return if (jsoniq_pandas:has_na($data.$key)) then () - else { $key: $data.$key } - case array return - if (jsoniq_pandas:has_na($data)) then () - else $data - default return - if ($data eq null) then () - else $data - else - typeswitch($data) - case object return - for $key in keys($data) - return if (not jsoniq_pandas:has_na($data.$key)) then { $key: $data.$key } - else () - case array return - if (not jsoniq_pandas:has_na($data)) then $data - else () - default return - if ($data eq null) then () - else $data :) }; -(: declare function jsoniq_pandas:has_na($data) { - variable $has_na := false; - typeswitch($data) +declare function jsoniq_pandas:dropna_how_object($object as object, $how as string) { + {| + for $key in keys($object) + return + if ($how eq "any") then + if (jsoniq_pandas:has_na($object.$key)) then () + else {$key: $object.$key} + else + if (jsoniq_pandas:has_all_na($object.$key)) then () + else {$key: $object.$key} + |} +}; + +declare function jsoniq_pandas:dropna_how_array($array as array, $how as string) { + [ + for $value in $array[] + return + if ($how eq "any") then + if (jsoniq_pandas:has_na($value)) then () + else $value + else + if (jsoniq_pandas:has_all_na($value)) then () + else $value + ] +}; + +declare function jsoniq_pandas:has_na($data) { + variable $res := false; + typeswitch($data) case object return for $key in keys($data) - return if (jsoniq_pandas:has_na($data.$key)) then {$has_na := true; break loop;} - else (); + return if (jsoniq_pandas:has_na($data.$key)) then {$res := true; break loop;} + else (); case array return - for $value in $data - return - if ($value eq null) then {$has_na := true; break loop;} - else (); - default return - if ($data eq null) then $has_na := true; + for $value in $data[] + return if (jsoniq_pandas:has_na($value)) then {$res := true; break loop;} else (); - exit returning $has_na; -}; :) \ No newline at end of file + default return if ($data eq null) then $res := true; + else $res := false; + exit returning $res; +}; + +declare function jsoniq_pandas:has_all_na($data) { + variable $res := false; + typeswitch($data) + case object return + for $key in keys($data) + return if (jsoniq_pandas:has_all_na($data.$key)) then $res := true; + else {$res := false; break loop;} + case array return + for $value in $data[] + return if (jsoniq_pandas:has_all_na($value)) then $res := true; + else {$res := false; break loop;} + default return if ($data eq null) then $res := true; + else $res := false; + exit returning $res; +}; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq new file mode 100644 index 000000000..a6bc73547 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldRun; Output="":) +import module namespace pandas = "jsoniq_pandas.jq"; + +pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": ["a", "b", "c"]}), +pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": ["a", "b", "c"]}, {"include": "number"}), +pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": ["a", "b", "c"]}, {"include": "object"}), +pandas:describe({"0": [10, 18, 11],"1": [13, 15, 8], "2": [9, 20, 3]}), +pandas:describe({"Normal": [1, 2, 3, 4, 5],"Uniform": [1, 1, 1, 1, 1],"Skewed": [1, 1, 1, 1,100]}) diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq index 6a6360488..4ec0b51bd 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq @@ -1,4 +1,7 @@ -(:JIQS: ShouldRun; Output="":) +(:JIQS: ShouldRun; Output="({ "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ 1, 2, 3 ] }, { "label" : 1, "binaryLabel" : 0, "name" : "b", "age" : 21, "weight" : 55.3, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 2", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "intArrayCol" : [ 4, 5, 6 ], "doubleArrayCol" : [ 4, 5, 6 ], "doubleArrayArrayCol" : [ 4, 5, 6 ] }, { "label" : 2, "binaryLabel" : 0, "name" : "c", "age" : 22, "weight" : 60.6, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 3", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 7, 8, 9 ], "doubleArrayCol" : [ 7, 8, 9 ], "doubleArrayArrayCol" : [ 7, 8, 9 ] }, { "label" : 3, "binaryLabel" : 1, "name" : "d", "age" : 23, "weight" : 65.9, "booleanCol" : 1, "nullCol" : 1, "stringCol" : "i am data entry 4", "stringArrayCol" : [ "i", "am", "data", "entry", "4" ], "intArrayCol" : [ 1, 4, 7 ], "doubleArrayCol" : [ 1, 4, 7 ], "doubleArrayArrayCol" : [ 1, 4, 7 ] }, { "label" : 4, "binaryLabel" : 1, "name" : "e", "age" : 24, "weight" : 70.3, "booleanCol" : true, "nullCol" : 1, "stringCol" : "i am data entry 5", "stringArrayCol" : [ "i", "am", "data", "entry", "5" ], "intArrayCol" : [ 2, 5, 8 ], "doubleArrayCol" : [ 2, 5, 8 ], "doubleArrayArrayCol" : [ 2, 5, 8 ] }, { "label" : 5, "binaryLabel" : 1, "name" : "f", "age" : 25, "weight" : 75.6, "booleanCol" : true, "nullCol" : 1, "stringCol" : "i am data entry 6", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "intArrayCol" : [ 3, 6, 9 ], "doubleArrayCol" : [ 3, 6, 9 ], "doubleArrayArrayCol" : [ 3, 6, 9 ] }, { "test" : [ 1, 2, -34 ], "test2" : -34, "test3" : { "test4" : [ 1, 4, 2 ], "test5" : -34, "test6" : { "test7" : [ 1, -34, -34, -34 ] } } }, { "test1" : [ { "test2" : [ 1, 2, 3 ] }, { "test3" : [ 1, 2, [ 1, 2, 3 ] ] }, { "test4" : { "test5" : [ 1, 2, 3 ] } } ] }, { "test1" : [ { "test2" : "not_null" }, { "test3" : [ 1, 2, "not_null" ] }, { "test4" : { "test5" : "not_null" } } ] })":) import module namespace pandas = "jsoniq_pandas.jq"; -pandas:fillna(json-file("../../../queries/sample-na-data.json"), {"value": 1}) \ No newline at end of file +pandas:fillna(json-file("../../../queries/sample-na-data.json"), {"value": 1}), +pandas:fillna({"test": [1,2, null], "test2": null, "test3": {"test4": [1, 4, 2], "test5": null, "test6": {"test7": [1, null, null, null]}}}, {"value": -34}), +pandas:fillna({"test1": [{"test2": null}, {"test3": [1, 2, null]}, {"test4": {"test5": null}}]}, {"value": [1, 2, 3]}), +pandas:fillna({"test1": [{"test2": null}, {"test3": [1, 2, null]}, {"test4": {"test5": null}}]}, {"value": "not_null"}) \ No newline at end of file From a033ca0f3ee85041cec9f3b8174c72743994269a Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Mon, 8 Jul 2024 16:06:30 +0200 Subject: [PATCH 22/56] Added isnull --- .../runtime/numpy_lib/jsoniq_pandas.jq | 38 ++++++++++++++++++- .../numpy_lib/test_jsoniq_pandas_describe.jq | 2 +- .../numpy_lib/test_jsoniq_pandas_isnull.jq | 7 ++++ 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq index 727e099ff..00100d2a5 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq @@ -157,7 +157,43 @@ declare function jsoniq_pandas:sample($dataframe as object*, $num as integer) {} Required params are: - dataframe (DataFrame): the dataframe to search nulls in. :) -declare function jsoniq_pandas:isnull($dataframe as object*) {}; +declare function jsoniq_pandas:isnull($dataframe as object*) { + for $row in $dataframe + return jsoniq_pandas:isnull_object($row) +}; + + +declare function jsoniq_pandas:isnull_value($value) { + if ($value eq null) then true + else false +}; + +declare function jsoniq_pandas:isnull_array($array as array) { + (: TODO: Error handling. Limit. :) + for $value in $array[] + return typeswitch($value) + case array return jsoniq_pandas:isnull_array($value) + case object return jsoniq_pandas:isnull_object($value) + default return jsoniq_pandas:isnull_value($value) +}; + +declare function jsoniq_pandas:isnull_object($object as object) { + {| + for $key in keys($object) + let $value := $object.$key + return + typeswitch($value) + case object return + let $result := jsoniq_pandas:isnull_object($value) + return {$key: $result} + case array return + let $result := jsoniq_pandas:isnull_array($value) + return {$key: $result} + default return + let $result := jsoniq_pandas:isnull_value($value) + return {$key: $result} + |} +}; declare type jsoniq_pandas:fillna_params as { diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq index a6bc73547..1b93070fe 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="":) +(:JIQS: ShouldRun; Output="({ "categorical" : { "count" : 3, "unique" : 3, "top" : "f", "frequency" : 1 } }, { "numeric" : { "count" : 3, "mean" : 2, "std" : 1, "min" : 1, "max" : 3, "25%" : 1.5, "50%" : 2, "75%" : 2.5 } }, { "object" : { "count" : 3, "unique" : 3, "top" : "c", "frequency" : 1 } }, { "categorical" : null }, { "numeric" : { "count" : 3, "mean" : 2, "std" : 1, "min" : 1, "max" : 3, "25%" : 1.5, "50%" : 2, "75%" : 2.5 } }, { "object" : null }, { "categorical" : { "count" : 3, "unique" : 3, "top" : "f", "frequency" : 1 } }, { "numeric" : null }, { "object" : { "count" : 3, "unique" : 3, "top" : "c", "frequency" : 1 } }, { "0" : { "count" : 3, "mean" : 13, "std" : 4.358899, "min" : 10, "max" : 18, "25%" : 10.5, "50%" : 11, "75%" : 14.5 } }, { "1" : { "count" : 3, "mean" : 12, "std" : 3.6055512, "min" : 8, "max" : 15, "25%" : 10.5, "50%" : 13, "75%" : 14 } }, { "2" : { "count" : 3, "mean" : 10.6666666667, "std" : 8.621678, "min" : 3, "max" : 20, "25%" : 6, "50%" : 9, "75%" : 14.5 } }, { "Normal" : { "count" : 5, "mean" : 3, "std" : 1.5811388, "min" : 1, "max" : 5, "25%" : 2, "50%" : 3, "75%" : 4 } }, { "Uniform" : { "count" : 5, "mean" : 1, "std" : 0, "min" : 1, "max" : 1, "25%" : 1, "50%" : 1, "75%" : 1 } }, { "Skewed" : { "count" : 5, "mean" : 20.8, "std" : 44.274147, "min" : 1, "max" : 100, "25%" : 1, "50%" : 1, "75%" : 1 } })":) import module namespace pandas = "jsoniq_pandas.jq"; pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": ["a", "b", "c"]}), diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq new file mode 100644 index 000000000..eda91d184 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq @@ -0,0 +1,7 @@ +(:JIQS: ShouldRun; Output="({ "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : true, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "test" : [ false, false, true ], "test2" : true, "test3" : { "test4" : [ false, false, false ], "test5" : true, "test6" : { "test7" : [ false, true, true, true ] } } }, { "test1" : [ { "test2" : true }, { "test3" : [ false, false, true ] }, { "test4" : { "test5" : true } } ] }, { "test1" : [ { "test2" : true }, { "test3" : [ false, false, true ] }, { "test4" : { "test5" : true } } ] }, { "test" : [ false, false, true ], "test2" : true, "test3" : [ false, false, false ], "test4" : [ false, true, true ] })":) +import module namespace pandas = "jsoniq_pandas.jq"; + +pandas:isnull(json-file("../../../queries/sample-na-data.json")), +pandas:isnull({"test": [1,2, null], "test2": null, "test3": {"test4": [1, 4, 2], "test5": null, "test6": {"test7": [1, null, null, null]}}}), +pandas:isnull({"test1": [{"test2": null}, {"test3": [1, 2, null]}, {"test4": {"test5": null}}]}), +pandas:isnull({"test": [1,2,null], "test2": null, "test3": [1, 4, 2], "test4": [1, null, null]}) \ No newline at end of file From df1d985872b2762543d01345fa7994bebd2bf674 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Tue, 9 Jul 2024 18:58:47 +0200 Subject: [PATCH 23/56] Refactored random generation to be sequence based --- .../context/BuiltinFunctionCatalogue.java | 13 ++--- .../GeneratedRandomDoublesIterator.java | 24 ++++++++ .../GeneratedRandomIntegersIterator.java | 24 ++++++++ .../random/GeneratedRandomsIterator.java | 10 ++++ .../RandomSequenceGeneratorIterator.java | 48 +++++++++++----- .../random/RandomSequenceWithBounds.java | 37 ------------ .../RandomSequenceWithBoundsIterator.java | 56 +++++++++++++++++++ ...mSequenceWithoutSeedGeneratorIterator.java | 32 ----------- ...Type.java => DynamicItemTypeIterator.java} | 7 +-- .../FunctionRandom/RandomSequenceWithSeed.jq | 2 +- .../runtime/numpy_lib/jsoniq_numpy.jq | 56 ++++++++++--------- .../numpy_lib/test_jsoniq_numpy_random.jq | 8 +-- 12 files changed, 191 insertions(+), 126 deletions(-) create mode 100644 src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java delete mode 100644 src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBounds.java create mode 100644 src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java delete mode 100644 src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithoutSeedGeneratorIterator.java rename src/main/java/org/rumbledb/runtime/functions/typing/{DynamicItemType.java => DynamicItemTypeIterator.java} (84%) diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java index 46f6f9b22..205cdfb8e 100644 --- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java +++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java @@ -94,8 +94,7 @@ import org.rumbledb.runtime.functions.object.ObjectValuesFunctionIterator; import org.rumbledb.runtime.functions.random.RandomNumberGeneratorIterator; import org.rumbledb.runtime.functions.random.RandomSequenceGeneratorIterator; -import org.rumbledb.runtime.functions.random.RandomSequenceWithBounds; -import org.rumbledb.runtime.functions.random.RandomSequenceWithoutSeedGeneratorIterator; +import org.rumbledb.runtime.functions.random.RandomSequenceWithBoundsIterator; import org.rumbledb.runtime.functions.sequences.aggregate.AvgFunctionIterator; import org.rumbledb.runtime.functions.sequences.aggregate.CountFunctionIterator; import org.rumbledb.runtime.functions.sequences.aggregate.MaxFunctionIterator; @@ -142,7 +141,7 @@ import org.rumbledb.runtime.functions.strings.TokenizeFunctionIterator; import org.rumbledb.runtime.functions.strings.TranslateFunctionIterator; import org.rumbledb.runtime.functions.strings.UpperCaseFunctionIterator; -import org.rumbledb.runtime.functions.typing.DynamicItemType; +import org.rumbledb.runtime.functions.typing.DynamicItemTypeIterator; import org.rumbledb.types.FunctionSignature; import org.rumbledb.types.SequenceType; import sparksoniq.spark.ml.AnnotateFunctionIterator; @@ -2708,7 +2707,7 @@ private static BuiltinFunction createBuiltinFunction( ), "integer", "item*", - RandomSequenceWithoutSeedGeneratorIterator.class, + RandomSequenceGeneratorIterator.class, BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); @@ -2743,7 +2742,7 @@ private static BuiltinFunction createBuiltinFunction( "integer", "string", "item*", - RandomSequenceWithBounds.class, + RandomSequenceWithBoundsIterator.class, BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); @@ -2758,7 +2757,7 @@ private static BuiltinFunction createBuiltinFunction( "integer", "string", "item*", - RandomSequenceWithBounds.class, + RandomSequenceWithBoundsIterator.class, BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); @@ -2806,7 +2805,7 @@ private static BuiltinFunction createBuiltinFunction( ), "item*", "string", - DynamicItemType.class, + DynamicItemTypeIterator.class, BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); diff --git a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java new file mode 100644 index 000000000..6bd2e5c40 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java @@ -0,0 +1,24 @@ +package org.rumbledb.runtime.functions.random; + +import org.rumbledb.api.Item; +import org.rumbledb.items.ItemFactory; + +import java.util.PrimitiveIterator; + +public class GeneratedRandomDoublesIterator extends GeneratedRandomsIterator { + private final PrimitiveIterator.OfDouble iterator; + + public GeneratedRandomDoublesIterator(PrimitiveIterator.OfDouble iterator) { + this.iterator = iterator; + } + + @Override + public Item getNextRandom() { + return ItemFactory.getInstance().createDoubleItem(iterator.next()); + } + + @Override + public boolean hasNext() { + return this.iterator.hasNext(); + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java new file mode 100644 index 000000000..5f797542b --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java @@ -0,0 +1,24 @@ +package org.rumbledb.runtime.functions.random; + +import org.rumbledb.api.Item; +import org.rumbledb.items.ItemFactory; + +import java.util.PrimitiveIterator; + +public class GeneratedRandomIntegersIterator extends GeneratedRandomsIterator { + private final PrimitiveIterator.OfInt iterator; + + public GeneratedRandomIntegersIterator(PrimitiveIterator.OfInt iterator) { + this.iterator = iterator; + } + + @Override + public Item getNextRandom() { + return ItemFactory.getInstance().createIntItem(iterator.next()); + } + + @Override + public boolean hasNext() { + return this.iterator.hasNext(); + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java new file mode 100644 index 000000000..654f386a9 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java @@ -0,0 +1,10 @@ +package org.rumbledb.runtime.functions.random; + +import org.rumbledb.api.Item; + +public abstract class GeneratedRandomsIterator { + + public abstract Item getNextRandom(); + + public abstract boolean hasNext(); +} diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java index 9e7535470..a0c00dca4 100644 --- a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java @@ -3,32 +3,50 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.RuntimeStaticContext; -import org.rumbledb.items.ItemFactory; -import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; +import org.rumbledb.runtime.LocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; -import java.util.ArrayList; import java.util.List; import java.util.Random; -public class RandomSequenceGeneratorIterator extends AtMostOneItemLocalRuntimeIterator { +public class RandomSequenceGeneratorIterator extends LocalRuntimeIterator { private static final long serialVersionUID = 1L; + private GeneratedRandomsIterator generatedRandomsIterator; + private Random random; + private Item seed; + private Item sequenceLength; public RandomSequenceGeneratorIterator(List arguments, RuntimeStaticContext staticContext) { super(arguments, staticContext); } @Override - public Item materializeFirstItemOrNull(DynamicContext context) { - Random random = new Random(); - List randomSequence = new ArrayList<>(); - - Item seed = this.children.get(0).materializeFirstItemOrNull(context); - Item sequenceLength = this.children.get(1).materializeFirstItemOrNull(context); - random.setSeed(seed.castToIntValue()); - random.doubles(sequenceLength.castToIntValue()).forEach(randomDouble -> { - randomSequence.add(ItemFactory.getInstance().createDoubleItem(randomDouble)); - }); - return ItemFactory.getInstance().createArrayItem(randomSequence); + public Item next() { + return this.generatedRandomsIterator.getNextRandom(); + } + + @Override + public boolean hasNext() { + return this.generatedRandomsIterator.hasNext(); + } + + @Override + public void open(DynamicContext context) { + this.random = new Random(); + initializeSeedAndLength(context); + this.generatedRandomsIterator = new GeneratedRandomDoublesIterator( + random.doubles(sequenceLength.castToIntValue()).iterator() + ); + } + + private void initializeSeedAndLength(DynamicContext context) { + if (this.children.size() == 2) { + // Seed is present as first argument + this.seed = this.children.get(0).materializeFirstItemOrNull(context); + this.random.setSeed(seed.castToIntValue()); + this.sequenceLength = this.children.get(1).materializeFirstItemOrNull(context); + } else { + this.sequenceLength = this.children.get(0).materializeFirstItemOrNull(context); + } } } diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBounds.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBounds.java deleted file mode 100644 index a680f2235..000000000 --- a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBounds.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.rumbledb.runtime.functions.random; - -import org.rumbledb.api.Item; -import org.rumbledb.context.DynamicContext; -import org.rumbledb.context.RuntimeStaticContext; -import org.rumbledb.items.ItemFactory; -import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; -import org.rumbledb.runtime.RuntimeIterator; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -public class RandomSequenceWithBounds extends AtMostOneItemLocalRuntimeIterator { - public RandomSequenceWithBounds(List children, RuntimeStaticContext staticContext) { - super(children, staticContext); - } - - @Override - public Item materializeFirstItemOrNull(DynamicContext context) { - Item low = this.children.get(0).materializeFirstItemOrNull(context); - Item high = this.children.get(1).materializeFirstItemOrNull(context); - Item size = this.children.get(2).materializeFirstItemOrNull(context); - Item type = this.children.get(3).materializeFirstItemOrNull(context); - Random random = new Random(); - List result = new ArrayList<>(); - if (type.getStringValue().equals("integer")) { - random.ints(size.castToIntValue(), low.castToIntValue(), high.castToIntValue()) - .forEach(randomInteger -> result.add(ItemFactory.getInstance().createIntItem(randomInteger))); - } else { - // Generate doubles otherwise - random.doubles(size.castToIntValue(), low.castToDoubleValue(), high.castToDoubleValue()) - .forEach(randomDouble -> result.add(ItemFactory.getInstance().createDoubleItem(randomDouble))); - } - return ItemFactory.getInstance().createArrayItem(result); - } -} diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java new file mode 100644 index 000000000..f42d11f34 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java @@ -0,0 +1,56 @@ +package org.rumbledb.runtime.functions.random; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.runtime.LocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.List; +import java.util.Random; + +public class RandomSequenceWithBoundsIterator extends LocalRuntimeIterator { + private Item low; + private Item high; + private int size; + private Item type; + private Random random; + private GeneratedRandomsIterator generatedRandomsIterator; + + public RandomSequenceWithBoundsIterator(List children, RuntimeStaticContext staticContext) { + super(children, staticContext); + } + + @Override + public void open(DynamicContext context) { + this.low = this.children.get(0).materializeFirstItemOrNull(context); + this.high = this.children.get(1).materializeFirstItemOrNull(context); + this.type = this.children.get(3).materializeFirstItemOrNull(context); + this.size = this.children.get(2).materializeFirstItemOrNull(context).castToIntValue(); + this.random = new Random(); + this.generatedRandomsIterator = createRandomNumberStream(); + } + + private GeneratedRandomsIterator createRandomNumberStream() { + if (type.getStringValue().equals("integer")) { + return new GeneratedRandomIntegersIterator( + random.ints(size, low.castToIntValue(), high.castToIntValue()).iterator() + ); + } else { + // Generate doubles otherwise + return new GeneratedRandomDoublesIterator( + random.doubles(size, low.castToDoubleValue(), high.castToDoubleValue()).iterator() + ); + } + } + + @Override + public Item next() { + return this.generatedRandomsIterator.getNextRandom(); + } + + @Override + public boolean hasNext() { + return this.generatedRandomsIterator.hasNext(); + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithoutSeedGeneratorIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithoutSeedGeneratorIterator.java deleted file mode 100644 index e520d78b7..000000000 --- a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithoutSeedGeneratorIterator.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.rumbledb.runtime.functions.random; - -import org.rumbledb.api.Item; -import org.rumbledb.context.DynamicContext; -import org.rumbledb.context.RuntimeStaticContext; -import org.rumbledb.items.ItemFactory; -import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; -import org.rumbledb.runtime.RuntimeIterator; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -public class RandomSequenceWithoutSeedGeneratorIterator extends AtMostOneItemLocalRuntimeIterator { - public RandomSequenceWithoutSeedGeneratorIterator( - List children, - RuntimeStaticContext staticContext - ) { - super(children, staticContext); - } - - @Override - public Item materializeFirstItemOrNull(DynamicContext context) { - Random random = new Random(); - Item sequenceLength = this.children.get(0).materializeFirstItemOrNull(context); - List randomSequence = new ArrayList<>(); - random.doubles(sequenceLength.castToIntValue()).forEach(randomDouble -> { - randomSequence.add(ItemFactory.getInstance().createDoubleItem(randomDouble)); - }); - return ItemFactory.getInstance().createArrayItem(randomSequence); - } -} diff --git a/src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemType.java b/src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemTypeIterator.java similarity index 84% rename from src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemType.java rename to src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemTypeIterator.java index f672026bf..5cd463c79 100644 --- a/src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemType.java +++ b/src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemTypeIterator.java @@ -4,18 +4,17 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; -import org.rumbledb.items.StringItem; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.types.ItemType; import java.util.List; -public class DynamicItemType extends AtMostOneItemLocalRuntimeIterator { +public class DynamicItemTypeIterator extends AtMostOneItemLocalRuntimeIterator { private List materializedArgument; private ItemType itemType; - public DynamicItemType(List children, RuntimeStaticContext staticContext) { + public DynamicItemTypeIterator(List children, RuntimeStaticContext staticContext) { super(children, staticContext); } @@ -40,7 +39,7 @@ private Item getLeastCommonSupertype() { for (Item item : structureItems) { structureCommonType = structureCommonType.findLeastCommonSuperTypeWith(item.getDynamicType()); } - return new StringItem(structureCommonType.getIdentifierString()); + return ItemFactory.getInstance().createStringItem(structureCommonType.getIdentifierString()); } private List getStructureItems() { diff --git a/src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq b/src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq index 6a7fd5233..edca3bce9 100644 --- a/src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq +++ b/src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq @@ -1,2 +1,2 @@ -(:JIQS: ShouldRun; Output="([ 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316 ], [ 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316 ], [ 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316 ], [ 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316 ])":) +(:JIQS: ShouldRun; Output="(0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316, 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316, 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316, 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316)":) fn:seeded_random(10, 5),fn:seeded_random(10, 5),fn:seeded_random(10, 5),fn:seeded_random(10, 5) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index 725360b5b..8f8a3f754 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -225,22 +225,22 @@ declare function jsoniq_numpy:random($size as array) { else jsoniq_numpy:random_with_dimensions($size, 1) }; -declare function jsoniq_numpy:random_with_dimensions($current_dimensionensions as array, $current_dimension as integer) { - if ($current_dimension eq size($current_dimensionensions)) then fn:random($current_dimensionensions[[$current_dimension]]) +declare function jsoniq_numpy:random_with_dimensions($current_dimensions as array, $current_dimension as integer) { + if ($current_dimension eq size($current_dimensions)) then fn:random($current_dimensions[[$current_dimension]]) else let $accumulated_result := - let $higher_dimension_result := jsoniq_numpy:random_with_dimensions($current_dimensionensions, $current_dimension + 1) - for $i in 1 to $current_dimensionensions[[$current_dimension]] + let $higher_dimension_result := jsoniq_numpy:random_with_dimensions($current_dimensions, $current_dimension + 1) + for $i in 1 to $current_dimensions[[$current_dimension]] return $higher_dimension_result return [$accumulated_result] }; -declare function jsoniq_numpy:random_between_with_dimensions($low as double, $high as double, $type as string, $current_dimensionensions as array, $current_dimension as integer) { - if ($current_dimension eq size($current_dimensionensions)) then fn:random-between($low, $high, $current_dimensionensions[[$current_dimension]], $type) +declare function jsoniq_numpy:random_between_with_dimensions($low as double, $high as double, $type as string, $current_dimensions as array, $current_dimension as integer) { + if ($current_dimension eq size($current_dimensions)) then fn:random-between($low, $high, $current_dimensions[[$current_dimension]], $type) else let $accumulated_result := - let $higher_dimension_result := jsoniq_numpy:random_between_with_dimensions($low, $high, $type, $current_dimensionensions, $current_dimension + 1) - for $i in 1 to $current_dimensionensions[[$current_dimension]] + let $higher_dimension_result := jsoniq_numpy:random_between_with_dimensions($low, $high, $type, $current_dimensions, $current_dimension + 1) + for $i in 1 to $current_dimensions[[$current_dimension]] return $higher_dimension_result return [$accumulated_result] }; @@ -258,9 +258,9 @@ declare function jsoniq_numpy:random_uniform($params as object) { let $params := validate type jsoniq_numpy:random_uniform_params {$params} let $low := $params.low let $high := $params.high - let $current_dimensionensions := $params.size - return if (size($current_dimensionensions) eq 0) then [] - else jsoniq_numpy:random_between_with_dimensions($low, $high, "double", $current_dimensionensions, 1) + let $current_dimensions := $params.size + return if (size($current_dimensions) eq 0) then [] + else jsoniq_numpy:random_between_with_dimensions($low, $high, "double", $current_dimensions, 1) }; declare type jsoniq_numpy:random_randint_params as { @@ -276,9 +276,13 @@ Params is an object for optional arguments. These arguments are: declare function jsoniq_numpy:random_randint($low as integer, $params as object) { let $params := validate type jsoniq_numpy:random_randint_params {$params} let $high := $params.high - let $current_dimensionensions := $params.size - return if (size($current_dimensionensions) eq 0) then [] - else jsoniq_numpy:random_between_with_dimensions($low, $high, "integer", $current_dimensionensions, 1) + let $current_dimensions := $params.size + return if (size($current_dimensions) eq 0) then [] + else jsoniq_numpy:random_between_with_dimensions($low, $high, "integer", $current_dimensions, 1) +}; + +declare function jsoniq_numpy:random_randint($low as integer) { + jsoniq_numpy:random_randint($low, {}) }; declare type jsoniq_numpy:logspace_params as { @@ -325,13 +329,13 @@ declare function jsoniq_numpy:logspace($start as double, $end as double) { jsoniq_numpy:logspace($start, $end, {}) }; -declare function jsoniq_numpy:compute_full_on_sub_dimensions($current_dimensionensions as array, $fill_value, $current_dimension as integer) { - let $current_dimensionension := size($current_dimensionensions) +declare function jsoniq_numpy:compute_full_on_sub_dimensions($current_dimensions as array, $fill_value, $current_dimension as integer) { + let $current_dimensionension := size($current_dimensions) let $accumulated_result := - for $j in 1 to $current_dimensionensions[[$current_dimension]] + for $j in 1 to $current_dimensions[[$current_dimension]] return if ($current_dimension eq $current_dimensionension) then $fill_value - else jsoniq_numpy:compute_full_on_sub_dimensions($current_dimensionensions, $fill_value, $current_dimension + 1) + else jsoniq_numpy:compute_full_on_sub_dimensions($current_dimensions, $fill_value, $current_dimension + 1) return [$accumulated_result] }; @@ -564,18 +568,18 @@ declare function jsoniq_numpy:product_of_all_values($arr as array) { }; -declare function jsoniq_numpy:reshape_sub_dimension($arr, $current_dimensionensions as array, $current_dimension as integer) { - if ($current_dimension gt size($current_dimensionensions)) then +declare function jsoniq_numpy:reshape_sub_dimension($arr, $current_dimensions as array, $current_dimension as integer) { + if ($current_dimension gt size($current_dimensions)) then $arr else - if ($current_dimensionensions[[$current_dimension]] eq 1) then - [jsoniq_numpy:reshape_sub_dimension($arr, $current_dimensionensions, $current_dimension + 1)] + if ($current_dimensions[[$current_dimension]] eq 1) then + [jsoniq_numpy:reshape_sub_dimension($arr, $current_dimensions, $current_dimension + 1)] else let $sub_dimension_result := let $size_arr := count($arr) - let $size_subarr := $size_arr div $current_dimensionensions[[$current_dimension]] - for $j in 0 to ($current_dimensionensions[[$current_dimension]] - 1) - return jsoniq_numpy:reshape_sub_dimension(subsequence($arr, $j * $size_subarr + 1, $size_subarr), $current_dimensionensions, $current_dimension + 1) + let $size_subarr := $size_arr div $current_dimensions[[$current_dimension]] + for $j in 0 to ($current_dimensions[[$current_dimension]] - 1) + return jsoniq_numpy:reshape_sub_dimension(subsequence($arr, $j * $size_subarr + 1, $size_subarr), $current_dimensions, $current_dimension + 1) return [$sub_dimension_result] }; (: Gives a new shape to an array. The shape argument should have the product of its dimension sizes equal to the number of elements found in arr. @@ -948,7 +952,7 @@ declare function jsoniq_numpy:sort($array as array, $low as integer, $high as in }; declare function jsoniq_numpy:partition($array as array, $low as integer, $high as integer) { - variable $pivot := jsoniq_numpy:random_randint($low, {"high": $high + 1, "size": [1]})[[1]]; + variable $pivot := jsoniq_numpy:random_randint($low, {"high": $high + 1, "size": [1]})[1]; variable $end := $array[[$high]]; replace json value of $array[[$high]] with $array[[$pivot]]; replace json value of $array[[$pivot]] with $end; diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq index 198688895..e84a6fae5 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq @@ -1,9 +1,9 @@ (:JIQS: ShouldRun; Output="(1, 3, 4, 10, 600, 21, 256)":) import module namespace numpy = "jsoniq_numpy.jq"; -size([numpy:random()]), -size(numpy:random([3])), -size(numpy:random_uniform({"low": 0.5, "high": 1.0, "size": [4]})), -size(numpy:random_randint(5, {"high": 10, "size": [10]})), +count([numpy:random()]), +count(numpy:random([3])), +count(numpy:random_uniform({"low": 0.5, "high": 1.0, "size": [4]})), +count(numpy:random_randint(5, {"high": 10, "size": [10]})), count(flatten(numpy:random_randint(5, {"high": 10, "size": [10, 20, 3]}))), count(flatten(numpy:random([3, 7, 1, 1]))), count(flatten(numpy:random_uniform({"low": 0.5, "high": 1.0, "size": [4, 4, 4, 4]}))) \ No newline at end of file From 7f7a0c42b30c643a4c4d66be227ac71300b5b784 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 11 Jul 2024 12:51:24 +0200 Subject: [PATCH 24/56] Adding DataFrames to pandas methods --- .../sample-na-data-without-arrays.json | 6 + .../runtime/numpy_lib/jsoniq_pandas.jq | 116 +++++++++--------- .../numpy_lib/test_jsoniq_pandas_describe.jq | 32 ++++- .../numpy_lib/test_jsoniq_pandas_fill_na.jq | 3 +- .../numpy_lib/test_jsoniq_pandas_isnull.jq | 2 +- .../numpy_lib/test_jsoniq_pandas_sample.jq | 4 + 6 files changed, 102 insertions(+), 61 deletions(-) create mode 100644 src/test/resources/queries/sample-na-data-without-arrays.json create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq diff --git a/src/test/resources/queries/sample-na-data-without-arrays.json b/src/test/resources/queries/sample-na-data-without-arrays.json new file mode 100644 index 000000000..8748e405a --- /dev/null +++ b/src/test/resources/queries/sample-na-data-without-arrays.json @@ -0,0 +1,6 @@ +{"label": 0, "binaryLabel": 0, "name": "a", "age": 20, "weight": 50.0, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 1"} +{"label": 1, "binaryLabel": 0, "name": "b", "age": 21, "weight": 55.3, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 2" } +{"label": 2, "binaryLabel": 0, "name": "c", "age": 22, "weight": 60.6, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 3"} +{"label": 3, "binaryLabel": 1, "name": "d", "age": 23, "weight": 65.9, "booleanCol": null, "nullCol": null, "stringCol": "i am data entry 4"} +{"label": 4, "binaryLabel": 1, "name": "e", "age": 24, "weight": 70.3, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 5"} +{"label": 5, "binaryLabel": 1, "name": "f", "age": 25, "weight": 75.6, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 6"} diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq index 00100d2a5..bf4ea9bc0 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq @@ -3,7 +3,8 @@ module namespace jsoniq_pandas = "jsoniq_pandas.jq"; import module namespace jsoniq_numpy = "jsoniq_numpy.jq"; declare type jsoniq_pandas:describe_params as { - "include": "string=all" + "include": "string=all", + "percentiles": "array" }; (: describe generates descriptive statistics about a dataset. Statistics summarize the central tendency, dispersion and shape of a dataset, excluding null values. Provides a string/dataframe as result. TODO: Supported percentiles are only [.25, .5, .75]. @@ -14,14 +15,13 @@ Params is an object for optional arguments. These arguments are: - exclude - not supported :) declare function jsoniq_pandas:describe($dataframe as object*, $params as object) { let $params := validate type jsoniq_pandas:describe_params {$params} - for $row in $dataframe - for $column in keys($row) + for $column in keys($dataframe) return { $column: switch($params.include) - case "all" return jsoniq_pandas:all_report($row.$column) - case "number" return jsoniq_pandas:number_report($row.$column) - case "object" return jsoniq_pandas:object_report($row.$column) - default return error("Unrecognized include option. Only 'number' and 'object' are supported.") + case "all" return jsoniq_pandas:all_report([$dataframe.$column], $params) + (: case "number" return jsoniq_pandas:number_report($dataframe.$column, $params) + case "object" return jsoniq_pandas:object_report($dataframe.$column) :) + default return error("Unrecognized include option. Only 'number' and 'object' are supported.") } }; @@ -29,24 +29,24 @@ declare function jsoniq_pandas:describe($dataframe as object*) { jsoniq_pandas:describe($dataframe, {}) }; -declare function jsoniq_pandas:all_report($column) { +declare function jsoniq_pandas:all_report($column, $params as object) { let $column_type := item-type($column) return switch($column_type) - case "xs:int" return jsoniq_pandas:numerical_report($column) - case "xs:decimal" return jsoniq_pandas:numerical_report($column) - case "xs:float" return jsoniq_pandas:numerical_report($column) - case "xs:double" return jsoniq_pandas:numerical_report($column) + case "xs:int" return jsoniq_pandas:numerical_report($column, $params) + case "xs:decimal" return jsoniq_pandas:numerical_report($column, $params) + case "xs:float" return jsoniq_pandas:numerical_report($column, $params) + case "xs:double" return jsoniq_pandas:numerical_report($column, $params) case "xs:boolean" return jsoniq_pandas:categorical_report($column) default return jsoniq_pandas:categorical_report($column) }; -declare function jsoniq_pandas:number_report($column) { +declare function jsoniq_pandas:number_report($column, $params as object) { let $column_type := item-type($column) return switch($column_type) - case "xs:int" return jsoniq_pandas:numerical_report($column) - case "xs:decimal" return jsoniq_pandas:numerical_report($column) - case "xs:float" return jsoniq_pandas:numerical_report($column) - case "xs:double" return jsoniq_pandas:numerical_report($column) + case "xs:int" return jsoniq_pandas:numerical_report($column, $params) + case "xs:decimal" return jsoniq_pandas:numerical_report($column, $params) + case "xs:float" return jsoniq_pandas:numerical_report($column, $params) + case "xs:double" return jsoniq_pandas:numerical_report($column, $params) default return () }; @@ -58,7 +58,7 @@ declare function jsoniq_pandas:object_report($column) { default return () }; -declare function jsoniq_pandas:numerical_report($column) { +declare function jsoniq_pandas:numerical_report($column as array, $params as object) { (: Compute count, mean, std, min, .25, .5, .75, max :) let $count := size($column) let $mean := jsoniq_numpy:mean($column) @@ -66,19 +66,23 @@ declare function jsoniq_pandas:numerical_report($column) { let $min := jsoniq_numpy:min($column) let $max := jsoniq_numpy:max($column) let $sorted_arr := jsoniq_numpy:sort($column) - let $percentile_25 := jsoniq_pandas:compute_percentile($sorted_arr, .25) - let $percentile_50 := jsoniq_pandas:compute_percentile($sorted_arr, .50) - let $percentile_75 := jsoniq_pandas:compute_percentile($sorted_arr, .75) - return { + let $percentiles := jsoniq_pandas:get_percentiles($params.percentiles) + return {| + { "count": $count, "mean": $mean, "std": $std, "min": $min, - "max": $max, - "25%": $percentile_25, - "50%": $percentile_50, - "75%": $percentile_75 - } + "max": $max + }, + for $percentile in $percentiles[] + return {string($percentile * 100) || "%": jsoniq_pandas:compute_percentile($sorted_arr, $percentile)} + |} +}; + +declare function jsoniq_pandas:get_percentiles($params_percentiles) { + if (empty($params_percentiles)) then [.25, .5, .75] + else $params_percentiles }; declare function jsoniq_pandas:std($arr as array, $mean as double) { @@ -93,8 +97,9 @@ declare function jsoniq_pandas:std($arr as array, $mean as double) { declare function jsoniq_pandas:categorical_report($column) { let $count := size($column) let $unique := size(jsoniq_numpy:unique($column)) - let $top := jsoniq_numpy:max($column) - let $frequency := jsoniq_pandas:count_occurences($column, $top) + let $occurences := jsoniq_pandas:count_occurences($column) + let $top := $occurences[1].value + let $frequency := $occurences[1].count return { "count": $count, "unique": $unique, @@ -103,7 +108,16 @@ declare function jsoniq_pandas:categorical_report($column) { } }; -declare function jsoniq_pandas:compute_percentile($arr as array, $percentile) { +declare function jsoniq_pandas:count_occurences($column) { + for $value in $column[] + let $group_key := $value + group by $group_key + (: let $freq := count($value) :) + (: order by $freq descending :) + return {"value": $group_key, "count": count($value)} +}; + +declare function jsoniq_pandas:compute_percentile($arr as array, $percentile as double) { let $distance_of_min_to_max := size($arr) - 1 let $percentile_index := $distance_of_min_to_max * $percentile + 1 let $percentile_index_integer_part := floor($percentile_index) @@ -112,17 +126,6 @@ declare function jsoniq_pandas:compute_percentile($arr as array, $percentile) { return $adjacent_difference }; -declare function jsoniq_pandas:count_occurences($arr as array, $value) { - variable $count := 0; - variable $index := 1; - while ($index le size($arr)) { - if ($arr[[$index]] eq $value) then $count := $count + 1; - else (); - $index := $index + 1; - } - exit returning $count; -}; - declare type jsoniq_pandas:info_params as { "max_cols": "integer=10", @@ -150,7 +153,14 @@ Required params are: - dataframe (DataFrame): the dataframe to sample from. - n (integer): number of samples to return. :) -declare function jsoniq_pandas:sample($dataframe as object*, $num as integer) {}; +declare function jsoniq_pandas:sample($dataframe as object*, $num as integer) { + if ($num lt 0) then () + else + let $df_keys := keys($dataframe) + let $size_dataframe := size($df_keys) + for $i in 1 to $num + return $df_keys[jsoniq_numpy:random_randint($size_dataframe, {"size": [1]})] +}; (: isnull returns a same-sized array indicating if values are null or not. @@ -271,8 +281,13 @@ declare function jsoniq_pandas:dropna($dataframe as object*, $params as object) return jsoniq_pandas:dropna_how_object($row, $params.how) } else { (: Remove columns :) - for $column_name in keys($dataframe) - return jsoniq_pandas:dropna_how_array($dataframe.$column_name, $params.how) + + let $columns_to_remove := + for $column_name in keys($dataframe) + where (every $value in $dataframe.$column_name + satisfies $value eq null) + return $column_name + return remove-keys($dataframe, $columns_to_remove) } }; @@ -289,19 +304,6 @@ declare function jsoniq_pandas:dropna_how_object($object as object, $how as stri |} }; -declare function jsoniq_pandas:dropna_how_array($array as array, $how as string) { - [ - for $value in $array[] - return - if ($how eq "any") then - if (jsoniq_pandas:has_na($value)) then () - else $value - else - if (jsoniq_pandas:has_all_na($value)) then () - else $value - ] -}; - declare function jsoniq_pandas:has_na($data) { variable $res := false; typeswitch($data) diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq index 1b93070fe..e03c34efa 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq @@ -1,8 +1,36 @@ (:JIQS: ShouldRun; Output="({ "categorical" : { "count" : 3, "unique" : 3, "top" : "f", "frequency" : 1 } }, { "numeric" : { "count" : 3, "mean" : 2, "std" : 1, "min" : 1, "max" : 3, "25%" : 1.5, "50%" : 2, "75%" : 2.5 } }, { "object" : { "count" : 3, "unique" : 3, "top" : "c", "frequency" : 1 } }, { "categorical" : null }, { "numeric" : { "count" : 3, "mean" : 2, "std" : 1, "min" : 1, "max" : 3, "25%" : 1.5, "50%" : 2, "75%" : 2.5 } }, { "object" : null }, { "categorical" : { "count" : 3, "unique" : 3, "top" : "f", "frequency" : 1 } }, { "numeric" : null }, { "object" : { "count" : 3, "unique" : 3, "top" : "c", "frequency" : 1 } }, { "0" : { "count" : 3, "mean" : 13, "std" : 4.358899, "min" : 10, "max" : 18, "25%" : 10.5, "50%" : 11, "75%" : 14.5 } }, { "1" : { "count" : 3, "mean" : 12, "std" : 3.6055512, "min" : 8, "max" : 15, "25%" : 10.5, "50%" : 13, "75%" : 14 } }, { "2" : { "count" : 3, "mean" : 10.6666666667, "std" : 8.621678, "min" : 3, "max" : 20, "25%" : 6, "50%" : 9, "75%" : 14.5 } }, { "Normal" : { "count" : 5, "mean" : 3, "std" : 1.5811388, "min" : 1, "max" : 5, "25%" : 2, "50%" : 3, "75%" : 4 } }, { "Uniform" : { "count" : 5, "mean" : 1, "std" : 0, "min" : 1, "max" : 1, "25%" : 1, "50%" : 1, "75%" : 1 } }, { "Skewed" : { "count" : 5, "mean" : 20.8, "std" : 44.274147, "min" : 1, "max" : 100, "25%" : 1, "50%" : 1, "75%" : 1 } })":) import module namespace pandas = "jsoniq_pandas.jq"; -pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": ["a", "b", "c"]}), +declare type local:sample-type-with-arrays as { + "label": "integer", + "binaryLabel": "integer", + "name": "string", + "age": "integer", + "weight": "double", + "booleanCol": "boolean", + "nullCol": "null", + "stringCol": "string", + "stringArrayCol": ["string"], + "intArrayCol": ["integer"], + "doubleArrayCol": ["double"], + "doubleArrayArrayCol": [["double"]] +}; + +declare type local:sample-type-without-arrays as { + "label": "integer", + "binaryLabel": "integer", + "name": "string", + "age": "integer", + "weight": "double", + "booleanCol": "boolean", + "nullCol": "null", + "stringCol": "string" +}; +(: pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": ["a", "b", "c"]}), pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": ["a", "b", "c"]}, {"include": "number"}), pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": ["a", "b", "c"]}, {"include": "object"}), pandas:describe({"0": [10, 18, 11],"1": [13, 15, 8], "2": [9, 20, 3]}), -pandas:describe({"Normal": [1, 2, 3, 4, 5],"Uniform": [1, 1, 1, 1, 1],"Skewed": [1, 1, 1, 1,100]}) +pandas:describe({"Normal": [1, 2, 3, 4, 5],"Uniform": [1, 1, 1, 1, 1],"Skewed": [1, 1, 1, 1,100]}), :) +declare variable $file_data := json-file("../../../queries/sample-na-data-without-arrays.json"); +let $data := validate type local:sample-type-without-arrays* {$file_data} +return $data=>pandas:describe() \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq index 4ec0b51bd..f2c6c9a0a 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq @@ -1,7 +1,8 @@ (:JIQS: ShouldRun; Output="({ "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ 1, 2, 3 ] }, { "label" : 1, "binaryLabel" : 0, "name" : "b", "age" : 21, "weight" : 55.3, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 2", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "intArrayCol" : [ 4, 5, 6 ], "doubleArrayCol" : [ 4, 5, 6 ], "doubleArrayArrayCol" : [ 4, 5, 6 ] }, { "label" : 2, "binaryLabel" : 0, "name" : "c", "age" : 22, "weight" : 60.6, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 3", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 7, 8, 9 ], "doubleArrayCol" : [ 7, 8, 9 ], "doubleArrayArrayCol" : [ 7, 8, 9 ] }, { "label" : 3, "binaryLabel" : 1, "name" : "d", "age" : 23, "weight" : 65.9, "booleanCol" : 1, "nullCol" : 1, "stringCol" : "i am data entry 4", "stringArrayCol" : [ "i", "am", "data", "entry", "4" ], "intArrayCol" : [ 1, 4, 7 ], "doubleArrayCol" : [ 1, 4, 7 ], "doubleArrayArrayCol" : [ 1, 4, 7 ] }, { "label" : 4, "binaryLabel" : 1, "name" : "e", "age" : 24, "weight" : 70.3, "booleanCol" : true, "nullCol" : 1, "stringCol" : "i am data entry 5", "stringArrayCol" : [ "i", "am", "data", "entry", "5" ], "intArrayCol" : [ 2, 5, 8 ], "doubleArrayCol" : [ 2, 5, 8 ], "doubleArrayArrayCol" : [ 2, 5, 8 ] }, { "label" : 5, "binaryLabel" : 1, "name" : "f", "age" : 25, "weight" : 75.6, "booleanCol" : true, "nullCol" : 1, "stringCol" : "i am data entry 6", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "intArrayCol" : [ 3, 6, 9 ], "doubleArrayCol" : [ 3, 6, 9 ], "doubleArrayArrayCol" : [ 3, 6, 9 ] }, { "test" : [ 1, 2, -34 ], "test2" : -34, "test3" : { "test4" : [ 1, 4, 2 ], "test5" : -34, "test6" : { "test7" : [ 1, -34, -34, -34 ] } } }, { "test1" : [ { "test2" : [ 1, 2, 3 ] }, { "test3" : [ 1, 2, [ 1, 2, 3 ] ] }, { "test4" : { "test5" : [ 1, 2, 3 ] } } ] }, { "test1" : [ { "test2" : "not_null" }, { "test3" : [ 1, 2, "not_null" ] }, { "test4" : { "test5" : "not_null" } } ] })":) import module namespace pandas = "jsoniq_pandas.jq"; -pandas:fillna(json-file("../../../queries/sample-na-data.json"), {"value": 1}), + +json-file("../../../queries/sample-na-data.json")=>pandas:fillna({"value": 1}), pandas:fillna({"test": [1,2, null], "test2": null, "test3": {"test4": [1, 4, 2], "test5": null, "test6": {"test7": [1, null, null, null]}}}, {"value": -34}), pandas:fillna({"test1": [{"test2": null}, {"test3": [1, 2, null]}, {"test4": {"test5": null}}]}, {"value": [1, 2, 3]}), pandas:fillna({"test1": [{"test2": null}, {"test3": [1, 2, null]}, {"test4": {"test5": null}}]}, {"value": "not_null"}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq index eda91d184..be7e60566 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="({ "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : true, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "test" : [ false, false, true ], "test2" : true, "test3" : { "test4" : [ false, false, false ], "test5" : true, "test6" : { "test7" : [ false, true, true, true ] } } }, { "test1" : [ { "test2" : true }, { "test3" : [ false, false, true ] }, { "test4" : { "test5" : true } } ] }, { "test1" : [ { "test2" : true }, { "test3" : [ false, false, true ] }, { "test4" : { "test5" : true } } ] }, { "test" : [ false, false, true ], "test2" : true, "test3" : [ false, false, false ], "test4" : [ false, true, true ] })":) +(:JIQS: ShouldRun; Output="({ "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : true, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "test" : [ false, false, true ], "test2" : true, "test3" : { "test4" : [ false, false, false ], "test5" : true, "test6" : { "test7" : [ false, true, true, true ] } } }, { "test1" : [ { "test2" : true }, { "test3" : [ false, false, true ] }, { "test4" : { "test5" : true } } ] }, { "test" : [ false, false, true ], "test2" : true, "test3" : [ false, false, false ], "test4" : [ false, true, true ] })":) import module namespace pandas = "jsoniq_pandas.jq"; pandas:isnull(json-file("../../../queries/sample-na-data.json")), diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq new file mode 100644 index 000000000..8217c27af --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="":) + +import module namespace pandas = "jsoniq_pandas.jq"; +pandas:sample(json-file("../../../queries/sample-na-data.json"), 4) \ No newline at end of file From a6baf1c40f400fd9a0e88a4436d81cb6104efb48 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Tue, 16 Jul 2024 12:17:33 +0200 Subject: [PATCH 25/56] Updated random and pandas tests --- .../context/BuiltinFunctionCatalogue.java | 81 +++++++++++ .../dataframe/DropColumnsIterator.java | 70 +++++++++ .../functions/nullable/IsNullIterator.java | 28 ++++ .../GeneratedRandomDoublesIterator.java | 20 ++- .../GeneratedRandomIntegersIterator.java | 10 +- .../random/GeneratedRandomsIterator.java | 12 ++ .../RandomSequenceGeneratorIterator.java | 26 ++-- ...ndomSequenceWithBoundsAndSeedIterator.java | 61 ++++++++ .../RandomSequenceWithBoundsIterator.java | 10 +- .../resources/queries/sample-na-data-2.json | 6 + .../runtime/numpy_lib/jsoniq_pandas.jq | 134 ++++++++++-------- .../numpy_lib/test_jsoniq_pandas_describe.jq | 4 +- .../numpy_lib/test_jsoniq_pandas_dropna.jq | 19 ++- .../test_jsoniq_pandas_dropna_rows.jq | 5 + .../numpy_lib/test_jsoniq_pandas_sample.jq | 23 ++- 15 files changed, 420 insertions(+), 89 deletions(-) create mode 100644 src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/functions/nullable/IsNullIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsAndSeedIterator.java create mode 100644 src/test/resources/queries/sample-na-data-2.json create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java index 205cdfb8e..062079004 100644 --- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java +++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java @@ -12,6 +12,7 @@ import org.rumbledb.runtime.functions.booleans.TrueFunctionIterator; import org.rumbledb.runtime.functions.context.LastFunctionIterator; import org.rumbledb.runtime.functions.context.PositionFunctionIterator; +import org.rumbledb.runtime.functions.dataframe.DropColumnsIterator; import org.rumbledb.runtime.functions.datetime.CurrentDateFunctionIterator; import org.rumbledb.runtime.functions.datetime.CurrentDateTimeFunctionIterator; import org.rumbledb.runtime.functions.datetime.CurrentTimeFunctionIterator; @@ -62,6 +63,7 @@ import org.rumbledb.runtime.functions.io.TraceFunctionIterator; import org.rumbledb.runtime.functions.io.UnparsedTextFunctionIterator; import org.rumbledb.runtime.functions.io.YamlDocFunctionIterator; +import org.rumbledb.runtime.functions.nullable.IsNullIterator; import org.rumbledb.runtime.functions.numerics.AbsFunctionIterator; import org.rumbledb.runtime.functions.numerics.CeilingFunctionIterator; import org.rumbledb.runtime.functions.numerics.FloorFunctionIterator; @@ -94,6 +96,7 @@ import org.rumbledb.runtime.functions.object.ObjectValuesFunctionIterator; import org.rumbledb.runtime.functions.random.RandomNumberGeneratorIterator; import org.rumbledb.runtime.functions.random.RandomSequenceGeneratorIterator; +import org.rumbledb.runtime.functions.random.RandomSequenceWithBoundsAndSeedIterator; import org.rumbledb.runtime.functions.random.RandomSequenceWithBoundsIterator; import org.rumbledb.runtime.functions.sequences.aggregate.AvgFunctionIterator; import org.rumbledb.runtime.functions.sequences.aggregate.CountFunctionIterator; @@ -359,6 +362,36 @@ private static BuiltinFunction createBuiltinFunction( ); } + private static BuiltinFunction createBuiltinFunction( + Name functionName, + String param1Type, + String param2Type, + String param3Type, + String param4Type, + String param5Type, + String returnType, + Class functionIteratorClass, + BuiltinFunction.BuiltinFunctionExecutionMode builtInFunctionExecutionMode + ) { + return new BuiltinFunction( + new FunctionIdentifier(functionName, 5), + new FunctionSignature( + Collections.unmodifiableList( + Arrays.asList( + SequenceType.createSequenceType(param1Type), + SequenceType.createSequenceType(param2Type), + SequenceType.createSequenceType(param3Type), + SequenceType.createSequenceType(param4Type), + SequenceType.createSequenceType(param5Type) + ) + ), + SequenceType.createSequenceType(returnType) + ), + functionIteratorClass, + builtInFunctionExecutionMode + ); + } + /** * function that returns the context position */ @@ -2741,6 +2774,7 @@ private static BuiltinFunction createBuiltinFunction( "integer", "integer", "string", + "integer", "item*", RandomSequenceWithBoundsIterator.class, BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL @@ -2761,6 +2795,22 @@ private static BuiltinFunction createBuiltinFunction( BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); + static final BuiltinFunction random_sequence_with_bounds_seeded_int = createBuiltinFunction( + new Name( + Name.FN_NS, + "", + "random-between" + ), + "integer", + "integer", + "integer", + "string", + "integer", + "item*", + RandomSequenceWithBoundsAndSeedIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + static final BuiltinFunction error = createBuiltinFunction( new Name( Name.FN_NS, @@ -2809,6 +2859,31 @@ private static BuiltinFunction createBuiltinFunction( BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); + static final BuiltinFunction drop_columns = createBuiltinFunction( + new Name( + Name.JN_NS, + "jn", + "drop-columns" + ), + "object*", + "string*", + "object*", + DropColumnsIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.DATAFRAME + ); + + static final BuiltinFunction is_null = createBuiltinFunction( + new Name( + Name.JN_NS, + "jn", + "is-null" + ), + "item*", + "boolean", + IsNullIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + static { builtinFunctions = new HashMap<>(); @@ -3021,6 +3096,12 @@ private static BuiltinFunction createBuiltinFunction( builtinFunctions.put(error_with_code.getIdentifier(), error_with_code); builtinFunctions.put(error_with_code_and_description.getIdentifier(), error_with_code_and_description); builtinFunctions.put(item_type.getIdentifier(), item_type); + builtinFunctions.put(drop_columns.getIdentifier(), drop_columns); + builtinFunctions.put(is_null.getIdentifier(), is_null); + builtinFunctions.put( + random_sequence_with_bounds_seeded_int.getIdentifier(), + random_sequence_with_bounds_seeded_int + ); } diff --git a/src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java b/src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java new file mode 100644 index 000000000..3064a555c --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java @@ -0,0 +1,70 @@ +package org.rumbledb.runtime.functions.dataframe; + +import org.apache.spark.api.java.JavaRDD; +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.InvalidSelectorException; +import org.rumbledb.exceptions.UnexpectedTypeException; +import org.rumbledb.items.structured.JSoundDataFrame; +import org.rumbledb.runtime.HybridRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.List; + +public class DropColumnsIterator extends HybridRuntimeIterator { + public DropColumnsIterator(List children, RuntimeStaticContext staticContext) { + super(children, staticContext); + } + + @Override + public JavaRDD getRDDAux(DynamicContext context) { + return null; + } + + @Override + public void openLocal() { + + } + + @Override + public void closeLocal() { + + } + + @Override + public void resetLocal() { + + } + + @Override + public boolean hasNextLocal() { + return false; + } + + @Override + public Item nextLocal() { + return null; + } + + public JSoundDataFrame getDataFrame(DynamicContext context) { + JSoundDataFrame dataFrame = this.children.get(0).getDataFrame(context); + List columnsToDropItems = this.children.get(1).materialize(context); + if (columnsToDropItems.isEmpty()) { + throw new InvalidSelectorException( + "Invalid drop-columns parameter; drop-columns can't be performed without string columns to be removed.", + getMetadata() + ); + } + String[] columnsToDrop = new String[columnsToDropItems.size()]; + int i = 0; + for (Item columnItem : columnsToDropItems) { + if (!columnItem.isString()) { + throw new UnexpectedTypeException("drop-columns invoked with non-string columns", getMetadata()); + } + columnsToDrop[i] = columnItem.getStringValue(); + ++i; + } + return new JSoundDataFrame(dataFrame.getDataFrame().drop(columnsToDrop), dataFrame.getItemType()); + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/nullable/IsNullIterator.java b/src/main/java/org/rumbledb/runtime/functions/nullable/IsNullIterator.java new file mode 100644 index 000000000..ddb2af01a --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/nullable/IsNullIterator.java @@ -0,0 +1,28 @@ +package org.rumbledb.runtime.functions.nullable; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.items.ItemFactory; +import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.List; + +public class IsNullIterator extends AtMostOneItemLocalRuntimeIterator { + public IsNullIterator(List children, RuntimeStaticContext staticContext) { + super(children, staticContext); + } + + @Override + public Item materializeFirstItemOrNull(DynamicContext context) { + List materializedItems = this.children.get(0).materialize(context); + if (materializedItems == null || materializedItems.isEmpty()) { + return ItemFactory.getInstance().createBooleanItem(true); + } + if (materializedItems.size() > 1) { + return ItemFactory.getInstance().createBooleanItem(false); + } + return ItemFactory.getInstance().createBooleanItem(materializedItems.get(0).isNull()); + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java index 6bd2e5c40..6c3d61748 100644 --- a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java @@ -8,8 +8,24 @@ public class GeneratedRandomDoublesIterator extends GeneratedRandomsIterator { private final PrimitiveIterator.OfDouble iterator; - public GeneratedRandomDoublesIterator(PrimitiveIterator.OfDouble iterator) { - this.iterator = iterator; + public GeneratedRandomDoublesIterator(int size, double low, double high) { + super(); + this.iterator = this.random.doubles(size, low, high).iterator(); + } + + public GeneratedRandomDoublesIterator(int size, double low, double high, int seed) { + super(seed); + this.iterator = this.random.doubles(size, low, high).iterator(); + } + + public GeneratedRandomDoublesIterator(int size) { + super(); + this.iterator = this.random.doubles(size).iterator(); + } + + public GeneratedRandomDoublesIterator(int size, int seed) { + super(seed); + this.iterator = this.random.doubles(size).iterator(); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java index 5f797542b..72f135237 100644 --- a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java @@ -8,8 +8,14 @@ public class GeneratedRandomIntegersIterator extends GeneratedRandomsIterator { private final PrimitiveIterator.OfInt iterator; - public GeneratedRandomIntegersIterator(PrimitiveIterator.OfInt iterator) { - this.iterator = iterator; + public GeneratedRandomIntegersIterator(int size, int low, int high) { + super(); + this.iterator = random.ints(size, low, high).iterator(); + } + + public GeneratedRandomIntegersIterator(int size, int low, int high, int seed) { + super(seed); + this.iterator = random.ints(size, low, high).iterator(); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java index 654f386a9..de111c430 100644 --- a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java @@ -2,7 +2,19 @@ import org.rumbledb.api.Item; +import java.util.Random; + public abstract class GeneratedRandomsIterator { + protected Random random; + + protected GeneratedRandomsIterator() { + this.random = new Random(); + } + + protected GeneratedRandomsIterator(int seed) { + this.random = new Random(); + this.random.setSeed(seed); + } public abstract Item getNextRandom(); diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java index a0c00dca4..caf042642 100644 --- a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java @@ -7,14 +7,10 @@ import org.rumbledb.runtime.RuntimeIterator; import java.util.List; -import java.util.Random; public class RandomSequenceGeneratorIterator extends LocalRuntimeIterator { private static final long serialVersionUID = 1L; private GeneratedRandomsIterator generatedRandomsIterator; - private Random random; - private Item seed; - private Item sequenceLength; public RandomSequenceGeneratorIterator(List arguments, RuntimeStaticContext staticContext) { super(arguments, staticContext); @@ -32,21 +28,19 @@ public boolean hasNext() { @Override public void open(DynamicContext context) { - this.random = new Random(); - initializeSeedAndLength(context); - this.generatedRandomsIterator = new GeneratedRandomDoublesIterator( - random.doubles(sequenceLength.castToIntValue()).iterator() - ); - } - - private void initializeSeedAndLength(DynamicContext context) { if (this.children.size() == 2) { // Seed is present as first argument - this.seed = this.children.get(0).materializeFirstItemOrNull(context); - this.random.setSeed(seed.castToIntValue()); - this.sequenceLength = this.children.get(1).materializeFirstItemOrNull(context); + int seed = this.children.get(0).materializeFirstItemOrNull(context).castToIntValue(); + int sequenceLength = this.children.get(1).materializeFirstItemOrNull(context).castToIntValue(); + this.generatedRandomsIterator = new GeneratedRandomDoublesIterator( + sequenceLength, + seed + ); } else { - this.sequenceLength = this.children.get(0).materializeFirstItemOrNull(context); + int sequenceLength = this.children.get(0).materializeFirstItemOrNull(context).castToIntValue(); + this.generatedRandomsIterator = new GeneratedRandomDoublesIterator( + sequenceLength + ); } } } diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsAndSeedIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsAndSeedIterator.java new file mode 100644 index 000000000..a7ff948aa --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsAndSeedIterator.java @@ -0,0 +1,61 @@ +package org.rumbledb.runtime.functions.random; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.runtime.LocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.List; + +public class RandomSequenceWithBoundsAndSeedIterator extends LocalRuntimeIterator { + private Item low; + private Item high; + private Item type; + private int seed; + private int size; + private GeneratedRandomsIterator generatedRandomsIterator; + + public RandomSequenceWithBoundsAndSeedIterator(List children, RuntimeStaticContext staticContext) { + super(children, staticContext); + } + + @Override + public void open(DynamicContext context) { + this.low = this.children.get(0).materializeFirstItemOrNull(context); + this.high = this.children.get(1).materializeFirstItemOrNull(context); + this.size = this.children.get(2).materializeFirstItemOrNull(context).castToIntValue(); + this.type = this.children.get(3).materializeFirstItemOrNull(context); + this.seed = this.children.get(4).materializeFirstItemOrNull(context).castToIntValue(); + this.generatedRandomsIterator = createRandomNumberStream(); + } + + private GeneratedRandomsIterator createRandomNumberStream() { + if (type.getStringValue().equals("integer")) { + return new GeneratedRandomIntegersIterator( + size, + low.castToIntValue(), + high.castToIntValue(), + seed + ); + } else { + // Generate doubles otherwise + return new GeneratedRandomDoublesIterator( + size, + low.castToDoubleValue(), + high.castToDoubleValue(), + seed + ); + } + } + + @Override + public Item next() { + return this.generatedRandomsIterator.getNextRandom(); + } + + @Override + public boolean hasNext() { + return this.generatedRandomsIterator.hasNext(); + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java index f42d11f34..dc64bc01a 100644 --- a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java @@ -25,8 +25,8 @@ public RandomSequenceWithBoundsIterator(List children, RuntimeS public void open(DynamicContext context) { this.low = this.children.get(0).materializeFirstItemOrNull(context); this.high = this.children.get(1).materializeFirstItemOrNull(context); - this.type = this.children.get(3).materializeFirstItemOrNull(context); this.size = this.children.get(2).materializeFirstItemOrNull(context).castToIntValue(); + this.type = this.children.get(3).materializeFirstItemOrNull(context); this.random = new Random(); this.generatedRandomsIterator = createRandomNumberStream(); } @@ -34,12 +34,16 @@ public void open(DynamicContext context) { private GeneratedRandomsIterator createRandomNumberStream() { if (type.getStringValue().equals("integer")) { return new GeneratedRandomIntegersIterator( - random.ints(size, low.castToIntValue(), high.castToIntValue()).iterator() + size, + low.castToIntValue(), + high.castToIntValue() ); } else { // Generate doubles otherwise return new GeneratedRandomDoublesIterator( - random.doubles(size, low.castToDoubleValue(), high.castToDoubleValue()).iterator() + size, + low.castToDoubleValue(), + high.castToDoubleValue() ); } } diff --git a/src/test/resources/queries/sample-na-data-2.json b/src/test/resources/queries/sample-na-data-2.json new file mode 100644 index 000000000..6a309c131 --- /dev/null +++ b/src/test/resources/queries/sample-na-data-2.json @@ -0,0 +1,6 @@ +{"label": 0, "binaryLabel": 0, "name": "a", "age": 20, "weight": 50.0, "booleanCol": false, "stringCol": "i am data entry 1", "stringArrayCol": ["i", "am", "data", "entry", "1"], "intArrayCol": [1,2,3], "doubleArrayCol": [1.0,2.0,3.0], "doubleArrayArrayCol": [[1.0,2.0,3.0]]} +{"label": 1, "binaryLabel": 0, "name": "b", "age": 21, "weight": 55.3, "booleanCol": false, "stringCol": "i am data entry 2", "stringArrayCol": ["i", "am", "data", "entry", "2"], "intArrayCol": [4,5,6], "doubleArrayCol": [4.0,5.0,6.0], "doubleArrayArrayCol": [[4.0,5.0,6.0]]} +{"label": 2, "binaryLabel": 0, "name": "c", "age": 22, "weight": null, "booleanCol": null, "stringCol": "i am data entry 3", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [7,8,9], "doubleArrayCol": [7.0,8.0,9.0], "doubleArrayArrayCol": [[7.0,8.0,9.0]]} +{"label": 3, "binaryLabel": 1, "name": "d", "age": 23, "weight": null, "booleanCol": null, "stringCol": "i am data entry 4", "stringArrayCol": ["i", "am", "data", "entry", "4"], "intArrayCol": [1,4,7], "doubleArrayCol": [1.0,4.0,7.0], "doubleArrayArrayCol": [[1.0,4.0,7.0]]} +{"label": 4, "binaryLabel": 1, "name": "e", "age": 24, "weight": 70.3, "booleanCol": true, "stringCol": "i am data entry 5", "stringArrayCol": ["i", "am", "data", "entry", "5"], "intArrayCol": [2,5,8], "doubleArrayCol": [2.0,5.0,8.0], "doubleArrayArrayCol": [[2.0,5.0,8.0]]} +{"label": 5, "binaryLabel": 1, "name": "f", "age": 25, "weight": 75.6, "booleanCol": true, "stringCol": "i am data entry 6", "stringArrayCol": ["i", "am", "data", "entry", "6"], "intArrayCol": [3,6,9], "doubleArrayCol": [3.0,6.0,9.0], "doubleArrayArrayCol": [[3.0,6.0,9.0]]} diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq index bf4ea9bc0..02f7c2421 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq @@ -19,8 +19,8 @@ declare function jsoniq_pandas:describe($dataframe as object*, $params as object return { $column: switch($params.include) case "all" return jsoniq_pandas:all_report([$dataframe.$column], $params) - (: case "number" return jsoniq_pandas:number_report($dataframe.$column, $params) - case "object" return jsoniq_pandas:object_report($dataframe.$column) :) + case "number" return jsoniq_pandas:number_report([$dataframe.$column], $params) + case "object" return jsoniq_pandas:object_report([$dataframe.$column]) default return error("Unrecognized include option. Only 'number' and 'object' are supported.") } }; @@ -112,8 +112,6 @@ declare function jsoniq_pandas:count_occurences($column) { for $value in $column[] let $group_key := $value group by $group_key - (: let $freq := count($value) :) - (: order by $freq descending :) return {"value": $group_key, "count": count($value)} }; @@ -141,13 +139,6 @@ Params is an object for optional arguments. These arguments are: - show_counts (boolean): Option to provide count of null elements in a column.:) declare function jsoniq_pandas:info($dataframe as object*, $params as object){}; -(: assign inserts new columns into a dataframe. Returns a new DataFrame with all of the original dataframe's columns in addition to new ones. Existing columns that are re-assigned are overwritten. -Required params are: -- dataframe (DataFrame): The dataframe to copy the columns from. -- columns (object): Pairs of string:array values to insert, where string is the column name and array is the values. Note, the array must have the same size as the number of entries in the DataFrame, otherwise an error is raised. -:) -declare function jsoniq_pandas:assign($to_insert as object) {}; - (: sample returns a random sample from the DataFrame. We currently only support returning results from the first axis, that is rows of the DataFrame. We do not support weighted samples or fractional samples. We only support sampling with replacement. Required params are: - dataframe (DataFrame): the dataframe to sample from. @@ -156,10 +147,19 @@ Required params are: declare function jsoniq_pandas:sample($dataframe as object*, $num as integer) { if ($num lt 0) then () else - let $df_keys := keys($dataframe) - let $size_dataframe := size($df_keys) + let $size_dataframe := count($dataframe) + let $random_numbers := jsoniq_numpy:random_randint(1, {"size": [$size_dataframe], "high": $size_dataframe}) for $i in 1 to $num - return $df_keys[jsoniq_numpy:random_randint($size_dataframe, {"size": [1]})] + return $dataframe[$random_numbers[$i]] +}; + +declare function jsoniq_pandas:sample($dataframe as object*, $num as integer, $seed as integer) { + if ($num lt 0) then () + else + let $size_dataframe := count($dataframe) + let $random_numbers := random-between(1, $size_dataframe, $num, "integer", $seed) + for $i in 1 to $num + return $dataframe[$random_numbers[$i]] }; @@ -179,7 +179,7 @@ declare function jsoniq_pandas:isnull_value($value) { }; declare function jsoniq_pandas:isnull_array($array as array) { - (: TODO: Error handling. Limit. :) + (: TODO: Add support for limited number of replacements :) for $value in $array[] return typeswitch($value) case array return jsoniq_pandas:isnull_array($value) @@ -217,7 +217,7 @@ declare function jsoniq_pandas:fillna_value($value, $params as object) { }; declare function jsoniq_pandas:fillna_array($array as array, $params as object) { - (: TODO: Error handling. Limit. :) + (: TODO: Add support for limited number of replacements :) for $value in $array[] return typeswitch($value) case array return jsoniq_pandas:fillna_array($value, $params) @@ -278,60 +278,74 @@ declare function jsoniq_pandas:dropna($dataframe as object*, $params as object) if ($params.axis eq 0) then { (: Remove rows :) for $row in $dataframe - return jsoniq_pandas:dropna_how_object($row, $params.how) + return + if (not jsoniq_pandas:row_has_null($row, $params.how)) then $row + else () } else { (: Remove columns :) - let $columns_to_remove := for $column_name in keys($dataframe) - where (every $value in $dataframe.$column_name - satisfies $value eq null) + where jsoniq_pandas:column_has_null($dataframe.$column_name, $params.how) eq true return $column_name - return remove-keys($dataframe, $columns_to_remove) + return + if (count($columns_to_remove) gt 0) then drop-columns($dataframe, $columns_to_remove) + else $dataframe } }; -declare function jsoniq_pandas:dropna_how_object($object as object, $how as string) { - {| - for $key in keys($object) - return - if ($how eq "any") then - if (jsoniq_pandas:has_na($object.$key)) then () - else {$key: $object.$key} - else - if (jsoniq_pandas:has_all_na($object.$key)) then () - else {$key: $object.$key} - |} -}; - -declare function jsoniq_pandas:has_na($data) { - variable $res := false; - typeswitch($data) - case object return - for $key in keys($data) - return if (jsoniq_pandas:has_na($data.$key)) then {$res := true; break loop;} +declare function jsoniq_pandas:row_has_null($row as object, $how as string) { + if ($how eq "any") then { + variable $i := 1; + variable $keys := keys($row); + variable $size := count($keys); + print_vars($row); + while($i le $size) { + if (is-null($row.($keys[$i]))) then exit returning true; else (); - case array return - for $value in $data[] - return if (jsoniq_pandas:has_na($value)) then {$res := true; break loop;} + $i := $i + 1; + } + exit returning false; + } + else { + variable $i := 1; + variable $keys := keys($row); + variable $size := count($keys); + while($i le $size) { + if (not is-null($row.keys[$i])) then exit returning false; else (); - default return if ($data eq null) then $res := true; - else $res := false; - exit returning $res; + $i := $i + 1; + } + exit returning true; + } + (: if ($how eq "any") then + some $key in keys($row) satisfies is-null($row.$key) eq true + else + every $key in keys($row) satisfies is-null($row.$key) eq true :) }; -declare function jsoniq_pandas:has_all_na($data) { - variable $res := false; - typeswitch($data) - case object return - for $key in keys($data) - return if (jsoniq_pandas:has_all_na($data.$key)) then $res := true; - else {$res := false; break loop;} - case array return - for $value in $data[] - return if (jsoniq_pandas:has_all_na($value)) then $res := true; - else {$res := false; break loop;} - default return if ($data eq null) then $res := true; - else $res := false; - exit returning $res; +declare function jsoniq_pandas:column_has_null($column, $how as string) { + if ($how eq "any") then { + variable $i := 1; + variable $size := count($column); + variable $column_flat := flatten($column); + while($i le $size) { + if (is-null($column_flat[$i])) then exit returning true; + else (); + $i := $i + 1; + } + exit returning false; + } + (: some $value in $column satisfies is-null($value) eq true :) + else { + (: every $value in $column satisfies is-null($value) eq true :) + variable $i := 1; + variable $size := count($column); + variable $column_flat := flatten($column); + while($i le $size) { + if (not is-null($column_flat[$i])) then exit returning false; + else (); + $i := $i + 1; + } + exit returning true; + } }; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq index e03c34efa..28ee032b6 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq @@ -31,6 +31,6 @@ pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": [ pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": ["a", "b", "c"]}, {"include": "object"}), pandas:describe({"0": [10, 18, 11],"1": [13, 15, 8], "2": [9, 20, 3]}), pandas:describe({"Normal": [1, 2, 3, 4, 5],"Uniform": [1, 1, 1, 1, 1],"Skewed": [1, 1, 1, 1,100]}), :) -declare variable $file_data := json-file("../../../queries/sample-na-data-without-arrays.json"); -let $data := validate type local:sample-type-without-arrays* {$file_data} +declare variable $file_data := json-file("../../../queries/sample-na-data.json"); +let $data := validate type local:sample-type-with-arrays* {$file_data} return $data=>pandas:describe() \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq index 676583658..6112cbcbf 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq @@ -1,4 +1,21 @@ (:JIQS: ShouldRun; Output="":) import module namespace pandas = "jsoniq_pandas.jq"; -pandas:dropna(json-file("../../../queries/sample-na-data.json"), {"axis": 1, "how": "any"}) \ No newline at end of file +declare type local:sample-type-with-arrays as { + "label": "integer", + "binaryLabel": "integer", + "name": "string", + "age": "integer", + "weight": "double", + "booleanCol": "boolean", + "nullCol": "null", + "stringCol": "string", + "stringArrayCol": ["string"], + "intArrayCol": ["integer"], + "doubleArrayCol": ["double"], + "doubleArrayArrayCol": [["double"]] +}; + +declare variable $file_data := json-file("../../../queries/sample-na-data.json"); +let $data := validate type local:sample-type-with-arrays* {$file_data} +return $data=>pandas:dropna({"axis": 1, "how": "any"}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq new file mode 100644 index 000000000..9df93cbde --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq @@ -0,0 +1,5 @@ +(:JIQS: ShouldRun; Output="":) +import module namespace pandas = "jsoniq_pandas.jq"; + +let $data := structured-json-file("../../../queries/sample-na-data-2.json") +return $data=>pandas:dropna({"axis": 0, "how": "any"}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq index 8217c27af..65d5eb8de 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq @@ -1,4 +1,21 @@ -(:JIQS: ShouldRun; Output="":) - +(:JIQS: ShouldRun; Output="({ "label" : 4, "binaryLabel" : 1, "name" : "e", "age" : 24, "weight" : 70.3, "booleanCol" : true, "nullCol" : null, "stringCol" : "i am data entry 5", "stringArrayCol" : [ "i", "am", "data", "entry", "5" ], "intArrayCol" : [ 2, 5, 8 ], "doubleArrayCol" : [ 2, 5, 8 ], "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ] }, { "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] }, { "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] })":) import module namespace pandas = "jsoniq_pandas.jq"; -pandas:sample(json-file("../../../queries/sample-na-data.json"), 4) \ No newline at end of file + +declare type local:sample-type-with-arrays as { + "label": "integer", + "binaryLabel": "integer", + "name": "string", + "age": "integer", + "weight": "double", + "booleanCol": "boolean", + "nullCol": "null", + "stringCol": "string", + "stringArrayCol": ["string"], + "intArrayCol": ["integer"], + "doubleArrayCol": ["double"], + "doubleArrayArrayCol": [["double"]] +}; + +declare variable $file_data := json-file("../../../queries/sample-na-data.json"); +let $data := validate type local:sample-type-with-arrays* {$file_data} +return $data=>pandas:sample(3, 3) \ No newline at end of file From fb59e028692692788b2eec7aad4d78693bad14ba Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Tue, 16 Jul 2024 12:17:33 +0200 Subject: [PATCH 26/56] Updated random and pandas tests --- .../context/BuiltinFunctionCatalogue.java | 81 +++++++++++ .../dataframe/DropColumnsIterator.java | 70 +++++++++ .../functions/nullable/IsNullIterator.java | 28 ++++ .../GeneratedRandomDoublesIterator.java | 20 ++- .../GeneratedRandomIntegersIterator.java | 10 +- .../random/GeneratedRandomsIterator.java | 12 ++ .../RandomSequenceGeneratorIterator.java | 26 ++-- ...ndomSequenceWithBoundsAndSeedIterator.java | 61 ++++++++ .../RandomSequenceWithBoundsIterator.java | 10 +- .../resources/queries/sample-na-data-2.json | 6 + .../runtime/numpy_lib/jsoniq_pandas.jq | 134 ++++++++++-------- .../numpy_lib/test_jsoniq_pandas_describe.jq | 4 +- .../numpy_lib/test_jsoniq_pandas_dropna.jq | 19 ++- .../test_jsoniq_pandas_dropna_rows.jq | 5 + .../numpy_lib/test_jsoniq_pandas_sample.jq | 23 ++- 15 files changed, 420 insertions(+), 89 deletions(-) create mode 100644 src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/functions/nullable/IsNullIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsAndSeedIterator.java create mode 100644 src/test/resources/queries/sample-na-data-2.json create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java index 205cdfb8e..062079004 100644 --- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java +++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java @@ -12,6 +12,7 @@ import org.rumbledb.runtime.functions.booleans.TrueFunctionIterator; import org.rumbledb.runtime.functions.context.LastFunctionIterator; import org.rumbledb.runtime.functions.context.PositionFunctionIterator; +import org.rumbledb.runtime.functions.dataframe.DropColumnsIterator; import org.rumbledb.runtime.functions.datetime.CurrentDateFunctionIterator; import org.rumbledb.runtime.functions.datetime.CurrentDateTimeFunctionIterator; import org.rumbledb.runtime.functions.datetime.CurrentTimeFunctionIterator; @@ -62,6 +63,7 @@ import org.rumbledb.runtime.functions.io.TraceFunctionIterator; import org.rumbledb.runtime.functions.io.UnparsedTextFunctionIterator; import org.rumbledb.runtime.functions.io.YamlDocFunctionIterator; +import org.rumbledb.runtime.functions.nullable.IsNullIterator; import org.rumbledb.runtime.functions.numerics.AbsFunctionIterator; import org.rumbledb.runtime.functions.numerics.CeilingFunctionIterator; import org.rumbledb.runtime.functions.numerics.FloorFunctionIterator; @@ -94,6 +96,7 @@ import org.rumbledb.runtime.functions.object.ObjectValuesFunctionIterator; import org.rumbledb.runtime.functions.random.RandomNumberGeneratorIterator; import org.rumbledb.runtime.functions.random.RandomSequenceGeneratorIterator; +import org.rumbledb.runtime.functions.random.RandomSequenceWithBoundsAndSeedIterator; import org.rumbledb.runtime.functions.random.RandomSequenceWithBoundsIterator; import org.rumbledb.runtime.functions.sequences.aggregate.AvgFunctionIterator; import org.rumbledb.runtime.functions.sequences.aggregate.CountFunctionIterator; @@ -359,6 +362,36 @@ private static BuiltinFunction createBuiltinFunction( ); } + private static BuiltinFunction createBuiltinFunction( + Name functionName, + String param1Type, + String param2Type, + String param3Type, + String param4Type, + String param5Type, + String returnType, + Class functionIteratorClass, + BuiltinFunction.BuiltinFunctionExecutionMode builtInFunctionExecutionMode + ) { + return new BuiltinFunction( + new FunctionIdentifier(functionName, 5), + new FunctionSignature( + Collections.unmodifiableList( + Arrays.asList( + SequenceType.createSequenceType(param1Type), + SequenceType.createSequenceType(param2Type), + SequenceType.createSequenceType(param3Type), + SequenceType.createSequenceType(param4Type), + SequenceType.createSequenceType(param5Type) + ) + ), + SequenceType.createSequenceType(returnType) + ), + functionIteratorClass, + builtInFunctionExecutionMode + ); + } + /** * function that returns the context position */ @@ -2741,6 +2774,7 @@ private static BuiltinFunction createBuiltinFunction( "integer", "integer", "string", + "integer", "item*", RandomSequenceWithBoundsIterator.class, BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL @@ -2761,6 +2795,22 @@ private static BuiltinFunction createBuiltinFunction( BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); + static final BuiltinFunction random_sequence_with_bounds_seeded_int = createBuiltinFunction( + new Name( + Name.FN_NS, + "", + "random-between" + ), + "integer", + "integer", + "integer", + "string", + "integer", + "item*", + RandomSequenceWithBoundsAndSeedIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + static final BuiltinFunction error = createBuiltinFunction( new Name( Name.FN_NS, @@ -2809,6 +2859,31 @@ private static BuiltinFunction createBuiltinFunction( BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); + static final BuiltinFunction drop_columns = createBuiltinFunction( + new Name( + Name.JN_NS, + "jn", + "drop-columns" + ), + "object*", + "string*", + "object*", + DropColumnsIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.DATAFRAME + ); + + static final BuiltinFunction is_null = createBuiltinFunction( + new Name( + Name.JN_NS, + "jn", + "is-null" + ), + "item*", + "boolean", + IsNullIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + static { builtinFunctions = new HashMap<>(); @@ -3021,6 +3096,12 @@ private static BuiltinFunction createBuiltinFunction( builtinFunctions.put(error_with_code.getIdentifier(), error_with_code); builtinFunctions.put(error_with_code_and_description.getIdentifier(), error_with_code_and_description); builtinFunctions.put(item_type.getIdentifier(), item_type); + builtinFunctions.put(drop_columns.getIdentifier(), drop_columns); + builtinFunctions.put(is_null.getIdentifier(), is_null); + builtinFunctions.put( + random_sequence_with_bounds_seeded_int.getIdentifier(), + random_sequence_with_bounds_seeded_int + ); } diff --git a/src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java b/src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java new file mode 100644 index 000000000..3064a555c --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java @@ -0,0 +1,70 @@ +package org.rumbledb.runtime.functions.dataframe; + +import org.apache.spark.api.java.JavaRDD; +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.InvalidSelectorException; +import org.rumbledb.exceptions.UnexpectedTypeException; +import org.rumbledb.items.structured.JSoundDataFrame; +import org.rumbledb.runtime.HybridRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.List; + +public class DropColumnsIterator extends HybridRuntimeIterator { + public DropColumnsIterator(List children, RuntimeStaticContext staticContext) { + super(children, staticContext); + } + + @Override + public JavaRDD getRDDAux(DynamicContext context) { + return null; + } + + @Override + public void openLocal() { + + } + + @Override + public void closeLocal() { + + } + + @Override + public void resetLocal() { + + } + + @Override + public boolean hasNextLocal() { + return false; + } + + @Override + public Item nextLocal() { + return null; + } + + public JSoundDataFrame getDataFrame(DynamicContext context) { + JSoundDataFrame dataFrame = this.children.get(0).getDataFrame(context); + List columnsToDropItems = this.children.get(1).materialize(context); + if (columnsToDropItems.isEmpty()) { + throw new InvalidSelectorException( + "Invalid drop-columns parameter; drop-columns can't be performed without string columns to be removed.", + getMetadata() + ); + } + String[] columnsToDrop = new String[columnsToDropItems.size()]; + int i = 0; + for (Item columnItem : columnsToDropItems) { + if (!columnItem.isString()) { + throw new UnexpectedTypeException("drop-columns invoked with non-string columns", getMetadata()); + } + columnsToDrop[i] = columnItem.getStringValue(); + ++i; + } + return new JSoundDataFrame(dataFrame.getDataFrame().drop(columnsToDrop), dataFrame.getItemType()); + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/nullable/IsNullIterator.java b/src/main/java/org/rumbledb/runtime/functions/nullable/IsNullIterator.java new file mode 100644 index 000000000..ddb2af01a --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/nullable/IsNullIterator.java @@ -0,0 +1,28 @@ +package org.rumbledb.runtime.functions.nullable; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.items.ItemFactory; +import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.List; + +public class IsNullIterator extends AtMostOneItemLocalRuntimeIterator { + public IsNullIterator(List children, RuntimeStaticContext staticContext) { + super(children, staticContext); + } + + @Override + public Item materializeFirstItemOrNull(DynamicContext context) { + List materializedItems = this.children.get(0).materialize(context); + if (materializedItems == null || materializedItems.isEmpty()) { + return ItemFactory.getInstance().createBooleanItem(true); + } + if (materializedItems.size() > 1) { + return ItemFactory.getInstance().createBooleanItem(false); + } + return ItemFactory.getInstance().createBooleanItem(materializedItems.get(0).isNull()); + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java index 6bd2e5c40..6c3d61748 100644 --- a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java @@ -8,8 +8,24 @@ public class GeneratedRandomDoublesIterator extends GeneratedRandomsIterator { private final PrimitiveIterator.OfDouble iterator; - public GeneratedRandomDoublesIterator(PrimitiveIterator.OfDouble iterator) { - this.iterator = iterator; + public GeneratedRandomDoublesIterator(int size, double low, double high) { + super(); + this.iterator = this.random.doubles(size, low, high).iterator(); + } + + public GeneratedRandomDoublesIterator(int size, double low, double high, int seed) { + super(seed); + this.iterator = this.random.doubles(size, low, high).iterator(); + } + + public GeneratedRandomDoublesIterator(int size) { + super(); + this.iterator = this.random.doubles(size).iterator(); + } + + public GeneratedRandomDoublesIterator(int size, int seed) { + super(seed); + this.iterator = this.random.doubles(size).iterator(); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java index 5f797542b..72f135237 100644 --- a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java @@ -8,8 +8,14 @@ public class GeneratedRandomIntegersIterator extends GeneratedRandomsIterator { private final PrimitiveIterator.OfInt iterator; - public GeneratedRandomIntegersIterator(PrimitiveIterator.OfInt iterator) { - this.iterator = iterator; + public GeneratedRandomIntegersIterator(int size, int low, int high) { + super(); + this.iterator = random.ints(size, low, high).iterator(); + } + + public GeneratedRandomIntegersIterator(int size, int low, int high, int seed) { + super(seed); + this.iterator = random.ints(size, low, high).iterator(); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java index 654f386a9..de111c430 100644 --- a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java @@ -2,7 +2,19 @@ import org.rumbledb.api.Item; +import java.util.Random; + public abstract class GeneratedRandomsIterator { + protected Random random; + + protected GeneratedRandomsIterator() { + this.random = new Random(); + } + + protected GeneratedRandomsIterator(int seed) { + this.random = new Random(); + this.random.setSeed(seed); + } public abstract Item getNextRandom(); diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java index a0c00dca4..caf042642 100644 --- a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java @@ -7,14 +7,10 @@ import org.rumbledb.runtime.RuntimeIterator; import java.util.List; -import java.util.Random; public class RandomSequenceGeneratorIterator extends LocalRuntimeIterator { private static final long serialVersionUID = 1L; private GeneratedRandomsIterator generatedRandomsIterator; - private Random random; - private Item seed; - private Item sequenceLength; public RandomSequenceGeneratorIterator(List arguments, RuntimeStaticContext staticContext) { super(arguments, staticContext); @@ -32,21 +28,19 @@ public boolean hasNext() { @Override public void open(DynamicContext context) { - this.random = new Random(); - initializeSeedAndLength(context); - this.generatedRandomsIterator = new GeneratedRandomDoublesIterator( - random.doubles(sequenceLength.castToIntValue()).iterator() - ); - } - - private void initializeSeedAndLength(DynamicContext context) { if (this.children.size() == 2) { // Seed is present as first argument - this.seed = this.children.get(0).materializeFirstItemOrNull(context); - this.random.setSeed(seed.castToIntValue()); - this.sequenceLength = this.children.get(1).materializeFirstItemOrNull(context); + int seed = this.children.get(0).materializeFirstItemOrNull(context).castToIntValue(); + int sequenceLength = this.children.get(1).materializeFirstItemOrNull(context).castToIntValue(); + this.generatedRandomsIterator = new GeneratedRandomDoublesIterator( + sequenceLength, + seed + ); } else { - this.sequenceLength = this.children.get(0).materializeFirstItemOrNull(context); + int sequenceLength = this.children.get(0).materializeFirstItemOrNull(context).castToIntValue(); + this.generatedRandomsIterator = new GeneratedRandomDoublesIterator( + sequenceLength + ); } } } diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsAndSeedIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsAndSeedIterator.java new file mode 100644 index 000000000..a7ff948aa --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsAndSeedIterator.java @@ -0,0 +1,61 @@ +package org.rumbledb.runtime.functions.random; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.runtime.LocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.List; + +public class RandomSequenceWithBoundsAndSeedIterator extends LocalRuntimeIterator { + private Item low; + private Item high; + private Item type; + private int seed; + private int size; + private GeneratedRandomsIterator generatedRandomsIterator; + + public RandomSequenceWithBoundsAndSeedIterator(List children, RuntimeStaticContext staticContext) { + super(children, staticContext); + } + + @Override + public void open(DynamicContext context) { + this.low = this.children.get(0).materializeFirstItemOrNull(context); + this.high = this.children.get(1).materializeFirstItemOrNull(context); + this.size = this.children.get(2).materializeFirstItemOrNull(context).castToIntValue(); + this.type = this.children.get(3).materializeFirstItemOrNull(context); + this.seed = this.children.get(4).materializeFirstItemOrNull(context).castToIntValue(); + this.generatedRandomsIterator = createRandomNumberStream(); + } + + private GeneratedRandomsIterator createRandomNumberStream() { + if (type.getStringValue().equals("integer")) { + return new GeneratedRandomIntegersIterator( + size, + low.castToIntValue(), + high.castToIntValue(), + seed + ); + } else { + // Generate doubles otherwise + return new GeneratedRandomDoublesIterator( + size, + low.castToDoubleValue(), + high.castToDoubleValue(), + seed + ); + } + } + + @Override + public Item next() { + return this.generatedRandomsIterator.getNextRandom(); + } + + @Override + public boolean hasNext() { + return this.generatedRandomsIterator.hasNext(); + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java index f42d11f34..dc64bc01a 100644 --- a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java @@ -25,8 +25,8 @@ public RandomSequenceWithBoundsIterator(List children, RuntimeS public void open(DynamicContext context) { this.low = this.children.get(0).materializeFirstItemOrNull(context); this.high = this.children.get(1).materializeFirstItemOrNull(context); - this.type = this.children.get(3).materializeFirstItemOrNull(context); this.size = this.children.get(2).materializeFirstItemOrNull(context).castToIntValue(); + this.type = this.children.get(3).materializeFirstItemOrNull(context); this.random = new Random(); this.generatedRandomsIterator = createRandomNumberStream(); } @@ -34,12 +34,16 @@ public void open(DynamicContext context) { private GeneratedRandomsIterator createRandomNumberStream() { if (type.getStringValue().equals("integer")) { return new GeneratedRandomIntegersIterator( - random.ints(size, low.castToIntValue(), high.castToIntValue()).iterator() + size, + low.castToIntValue(), + high.castToIntValue() ); } else { // Generate doubles otherwise return new GeneratedRandomDoublesIterator( - random.doubles(size, low.castToDoubleValue(), high.castToDoubleValue()).iterator() + size, + low.castToDoubleValue(), + high.castToDoubleValue() ); } } diff --git a/src/test/resources/queries/sample-na-data-2.json b/src/test/resources/queries/sample-na-data-2.json new file mode 100644 index 000000000..91f36b945 --- /dev/null +++ b/src/test/resources/queries/sample-na-data-2.json @@ -0,0 +1,6 @@ +{"label": 0, "binaryLabel": 0, "name": "a", "age": 20, "weight": 50.0, "booleanCol": false, "stringCol": "i am data entry 1", "stringArrayCol": ["i", "am", "data", "entry", "1"], "intArrayCol": [1,2,3], "doubleArrayCol": [1.0,2.0,3.0], "doubleArrayArrayCol": [[1.0,2.0,3.0]]} +{"label": 1, "binaryLabel": 0, "name": "b", "age": 21, "weight": 55.3, "booleanCol": false, "stringCol": "i am data entry 2", "stringArrayCol": ["i", "am", "data", "entry", "2"], "intArrayCol": [4,5,6], "doubleArrayCol": [4.0,5.0,6.0], "doubleArrayArrayCol": [[4.0,5.0,6.0]]} +{"label": 2, "binaryLabel": 0, "name": "c", "age": 22, "stringCol": "i am data entry 3", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [7,8,9], "doubleArrayCol": [7.0,8.0,9.0], "doubleArrayArrayCol": [[7.0,8.0,9.0]]} +{"label": 3, "binaryLabel": 1, "name": "d", "age": 23, "stringCol": "i am data entry 4", "stringArrayCol": ["i", "am", "data", "entry", "4"], "intArrayCol": [1,4,7], "doubleArrayCol": [1.0,4.0,7.0], "doubleArrayArrayCol": [[1.0,4.0,7.0]]} +{"label": 4, "binaryLabel": 1, "name": "e", "age": 24, "weight": 70.3, "booleanCol": true, "stringCol": "i am data entry 5", "stringArrayCol": ["i", "am", "data", "entry", "5"], "intArrayCol": [2,5,8], "doubleArrayCol": [2.0,5.0,8.0], "doubleArrayArrayCol": [[2.0,5.0,8.0]]} +{"label": 5, "binaryLabel": 1, "name": "f", "age": 25, "weight": 75.6, "booleanCol": true, "stringCol": "i am data entry 6", "stringArrayCol": ["i", "am", "data", "entry", "6"], "intArrayCol": [3,6,9], "doubleArrayCol": [3.0,6.0,9.0], "doubleArrayArrayCol": [[3.0,6.0,9.0]]} diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq index bf4ea9bc0..a32838d9d 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq @@ -19,8 +19,8 @@ declare function jsoniq_pandas:describe($dataframe as object*, $params as object return { $column: switch($params.include) case "all" return jsoniq_pandas:all_report([$dataframe.$column], $params) - (: case "number" return jsoniq_pandas:number_report($dataframe.$column, $params) - case "object" return jsoniq_pandas:object_report($dataframe.$column) :) + case "number" return jsoniq_pandas:number_report([$dataframe.$column], $params) + case "object" return jsoniq_pandas:object_report([$dataframe.$column]) default return error("Unrecognized include option. Only 'number' and 'object' are supported.") } }; @@ -112,8 +112,6 @@ declare function jsoniq_pandas:count_occurences($column) { for $value in $column[] let $group_key := $value group by $group_key - (: let $freq := count($value) :) - (: order by $freq descending :) return {"value": $group_key, "count": count($value)} }; @@ -141,13 +139,6 @@ Params is an object for optional arguments. These arguments are: - show_counts (boolean): Option to provide count of null elements in a column.:) declare function jsoniq_pandas:info($dataframe as object*, $params as object){}; -(: assign inserts new columns into a dataframe. Returns a new DataFrame with all of the original dataframe's columns in addition to new ones. Existing columns that are re-assigned are overwritten. -Required params are: -- dataframe (DataFrame): The dataframe to copy the columns from. -- columns (object): Pairs of string:array values to insert, where string is the column name and array is the values. Note, the array must have the same size as the number of entries in the DataFrame, otherwise an error is raised. -:) -declare function jsoniq_pandas:assign($to_insert as object) {}; - (: sample returns a random sample from the DataFrame. We currently only support returning results from the first axis, that is rows of the DataFrame. We do not support weighted samples or fractional samples. We only support sampling with replacement. Required params are: - dataframe (DataFrame): the dataframe to sample from. @@ -156,10 +147,19 @@ Required params are: declare function jsoniq_pandas:sample($dataframe as object*, $num as integer) { if ($num lt 0) then () else - let $df_keys := keys($dataframe) - let $size_dataframe := size($df_keys) + let $size_dataframe := count($dataframe) + let $random_numbers := jsoniq_numpy:random_randint(1, {"size": [$size_dataframe], "high": $size_dataframe}) for $i in 1 to $num - return $df_keys[jsoniq_numpy:random_randint($size_dataframe, {"size": [1]})] + return $dataframe[$random_numbers[$i]] +}; + +declare function jsoniq_pandas:sample($dataframe as object*, $num as integer, $seed as integer) { + if ($num lt 0) then () + else + let $size_dataframe := count($dataframe) + let $random_numbers := random-between(1, $size_dataframe, $num, "integer", $seed) + for $i in 1 to $num + return $dataframe[$random_numbers[$i]] }; @@ -179,7 +179,7 @@ declare function jsoniq_pandas:isnull_value($value) { }; declare function jsoniq_pandas:isnull_array($array as array) { - (: TODO: Error handling. Limit. :) + (: TODO: Add support for limited number of replacements :) for $value in $array[] return typeswitch($value) case array return jsoniq_pandas:isnull_array($value) @@ -217,7 +217,7 @@ declare function jsoniq_pandas:fillna_value($value, $params as object) { }; declare function jsoniq_pandas:fillna_array($array as array, $params as object) { - (: TODO: Error handling. Limit. :) + (: TODO: Add support for limited number of replacements :) for $value in $array[] return typeswitch($value) case array return jsoniq_pandas:fillna_array($value, $params) @@ -274,64 +274,78 @@ Params is an object for optional arguments. These arguments are: :) declare function jsoniq_pandas:dropna($dataframe as object*, $params as object) { let $params := validate type jsoniq_pandas:dropna_params {$params} + let $keys := keys($dataframe) return if ($params.axis eq 0) then { (: Remove rows :) for $row in $dataframe - return jsoniq_pandas:dropna_how_object($row, $params.how) + where (count(keys($row)) eq count($keys)) + return $row } else { (: Remove columns :) - let $columns_to_remove := for $column_name in keys($dataframe) - where (every $value in $dataframe.$column_name - satisfies $value eq null) + where jsoniq_pandas:column_has_null($dataframe.$column_name, $params.how) eq true return $column_name - return remove-keys($dataframe, $columns_to_remove) + return + if (count($columns_to_remove) gt 0) then drop-columns($dataframe, $columns_to_remove) + else $dataframe } }; -declare function jsoniq_pandas:dropna_how_object($object as object, $how as string) { - {| - for $key in keys($object) - return - if ($how eq "any") then - if (jsoniq_pandas:has_na($object.$key)) then () - else {$key: $object.$key} - else - if (jsoniq_pandas:has_all_na($object.$key)) then () - else {$key: $object.$key} - |} -}; - -declare function jsoniq_pandas:has_na($data) { - variable $res := false; - typeswitch($data) - case object return - for $key in keys($data) - return if (jsoniq_pandas:has_na($data.$key)) then {$res := true; break loop;} +declare function jsoniq_pandas:row_has_null($row as object, $how as string) { + if ($how eq "any") then { + variable $i := 1; + variable $keys := keys($row); + variable $size := count($keys); + print_vars($row); + while($i le $size) { + if (empty($row.($keys[$i]))) then exit returning true; else (); - case array return - for $value in $data[] - return if (jsoniq_pandas:has_na($value)) then {$res := true; break loop;} + $i := $i + 1; + } + exit returning false; + } + else { + variable $i := 1; + variable $keys := keys($row); + variable $size := count($keys); + while($i le $size) { + if (exists($row.keys[$i])) then exit returning false; else (); - default return if ($data eq null) then $res := true; - else $res := false; - exit returning $res; + $i := $i + 1; + } + exit returning true; + } + (: if ($how eq "any") then + some $key in keys($row) satisfies is-null($row.$key) eq true + else + every $key in keys($row) satisfies is-null($row.$key) eq true :) }; -declare function jsoniq_pandas:has_all_na($data) { - variable $res := false; - typeswitch($data) - case object return - for $key in keys($data) - return if (jsoniq_pandas:has_all_na($data.$key)) then $res := true; - else {$res := false; break loop;} - case array return - for $value in $data[] - return if (jsoniq_pandas:has_all_na($value)) then $res := true; - else {$res := false; break loop;} - default return if ($data eq null) then $res := true; - else $res := false; - exit returning $res; +declare function jsoniq_pandas:column_has_null($column, $how as string) { + if ($how eq "any") then { + variable $i := 1; + variable $size := count($column); + variable $column_flat := flatten($column); + while($i le $size) { + if (is-null($column_flat[$i])) then exit returning true; + else (); + $i := $i + 1; + } + exit returning false; + } + (: some $value in $column satisfies is-null($value) eq true :) + else { + (: every $value in $column satisfies is-null($value) eq true :) + variable $i := 1; + variable $size := count($column); + variable $column_flat := flatten($column); + while($i le $size) { + if (not is-null($column_flat[$i])) then exit returning false; + else (); + $i := $i + 1; + } + exit returning true; + } }; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq index e03c34efa..28ee032b6 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq @@ -31,6 +31,6 @@ pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": [ pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": ["a", "b", "c"]}, {"include": "object"}), pandas:describe({"0": [10, 18, 11],"1": [13, 15, 8], "2": [9, 20, 3]}), pandas:describe({"Normal": [1, 2, 3, 4, 5],"Uniform": [1, 1, 1, 1, 1],"Skewed": [1, 1, 1, 1,100]}), :) -declare variable $file_data := json-file("../../../queries/sample-na-data-without-arrays.json"); -let $data := validate type local:sample-type-without-arrays* {$file_data} +declare variable $file_data := json-file("../../../queries/sample-na-data.json"); +let $data := validate type local:sample-type-with-arrays* {$file_data} return $data=>pandas:describe() \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq index 676583658..6112cbcbf 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq @@ -1,4 +1,21 @@ (:JIQS: ShouldRun; Output="":) import module namespace pandas = "jsoniq_pandas.jq"; -pandas:dropna(json-file("../../../queries/sample-na-data.json"), {"axis": 1, "how": "any"}) \ No newline at end of file +declare type local:sample-type-with-arrays as { + "label": "integer", + "binaryLabel": "integer", + "name": "string", + "age": "integer", + "weight": "double", + "booleanCol": "boolean", + "nullCol": "null", + "stringCol": "string", + "stringArrayCol": ["string"], + "intArrayCol": ["integer"], + "doubleArrayCol": ["double"], + "doubleArrayArrayCol": [["double"]] +}; + +declare variable $file_data := json-file("../../../queries/sample-na-data.json"); +let $data := validate type local:sample-type-with-arrays* {$file_data} +return $data=>pandas:dropna({"axis": 1, "how": "any"}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq new file mode 100644 index 000000000..9df93cbde --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq @@ -0,0 +1,5 @@ +(:JIQS: ShouldRun; Output="":) +import module namespace pandas = "jsoniq_pandas.jq"; + +let $data := structured-json-file("../../../queries/sample-na-data-2.json") +return $data=>pandas:dropna({"axis": 0, "how": "any"}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq index 8217c27af..65d5eb8de 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq @@ -1,4 +1,21 @@ -(:JIQS: ShouldRun; Output="":) - +(:JIQS: ShouldRun; Output="({ "label" : 4, "binaryLabel" : 1, "name" : "e", "age" : 24, "weight" : 70.3, "booleanCol" : true, "nullCol" : null, "stringCol" : "i am data entry 5", "stringArrayCol" : [ "i", "am", "data", "entry", "5" ], "intArrayCol" : [ 2, 5, 8 ], "doubleArrayCol" : [ 2, 5, 8 ], "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ] }, { "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] }, { "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] })":) import module namespace pandas = "jsoniq_pandas.jq"; -pandas:sample(json-file("../../../queries/sample-na-data.json"), 4) \ No newline at end of file + +declare type local:sample-type-with-arrays as { + "label": "integer", + "binaryLabel": "integer", + "name": "string", + "age": "integer", + "weight": "double", + "booleanCol": "boolean", + "nullCol": "null", + "stringCol": "string", + "stringArrayCol": ["string"], + "intArrayCol": ["integer"], + "doubleArrayCol": ["double"], + "doubleArrayArrayCol": [["double"]] +}; + +declare variable $file_data := json-file("../../../queries/sample-na-data.json"); +let $data := validate type local:sample-type-with-arrays* {$file_data} +return $data=>pandas:sample(3, 3) \ No newline at end of file From 6956f3da92b713fcda0d97699bb397bddd0536fb Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 18 Jul 2024 18:59:27 +0200 Subject: [PATCH 27/56] Fixed dropna --- .../context/BuiltinFunctionCatalogue.java | 15 ---- .../dataframe/DropColumnsIterator.java | 70 ------------------- .../ObjectRemoveKeysFunctionIterator.java | 23 ++++++ .../runtime/numpy_lib/jsoniq_pandas.jq | 62 ++++++---------- .../numpy_lib/test_jsoniq_pandas_dropna.jq | 2 +- .../test_jsoniq_pandas_dropna_rows.jq | 2 +- 6 files changed, 46 insertions(+), 128 deletions(-) delete mode 100644 src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java index 062079004..b2795372b 100644 --- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java +++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java @@ -12,7 +12,6 @@ import org.rumbledb.runtime.functions.booleans.TrueFunctionIterator; import org.rumbledb.runtime.functions.context.LastFunctionIterator; import org.rumbledb.runtime.functions.context.PositionFunctionIterator; -import org.rumbledb.runtime.functions.dataframe.DropColumnsIterator; import org.rumbledb.runtime.functions.datetime.CurrentDateFunctionIterator; import org.rumbledb.runtime.functions.datetime.CurrentDateTimeFunctionIterator; import org.rumbledb.runtime.functions.datetime.CurrentTimeFunctionIterator; @@ -2859,19 +2858,6 @@ private static BuiltinFunction createBuiltinFunction( BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); - static final BuiltinFunction drop_columns = createBuiltinFunction( - new Name( - Name.JN_NS, - "jn", - "drop-columns" - ), - "object*", - "string*", - "object*", - DropColumnsIterator.class, - BuiltinFunction.BuiltinFunctionExecutionMode.DATAFRAME - ); - static final BuiltinFunction is_null = createBuiltinFunction( new Name( Name.JN_NS, @@ -3096,7 +3082,6 @@ private static BuiltinFunction createBuiltinFunction( builtinFunctions.put(error_with_code.getIdentifier(), error_with_code); builtinFunctions.put(error_with_code_and_description.getIdentifier(), error_with_code_and_description); builtinFunctions.put(item_type.getIdentifier(), item_type); - builtinFunctions.put(drop_columns.getIdentifier(), drop_columns); builtinFunctions.put(is_null.getIdentifier(), is_null); builtinFunctions.put( random_sequence_with_bounds_seeded_int.getIdentifier(), diff --git a/src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java b/src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java deleted file mode 100644 index 3064a555c..000000000 --- a/src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.rumbledb.runtime.functions.dataframe; - -import org.apache.spark.api.java.JavaRDD; -import org.rumbledb.api.Item; -import org.rumbledb.context.DynamicContext; -import org.rumbledb.context.RuntimeStaticContext; -import org.rumbledb.exceptions.InvalidSelectorException; -import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.items.structured.JSoundDataFrame; -import org.rumbledb.runtime.HybridRuntimeIterator; -import org.rumbledb.runtime.RuntimeIterator; - -import java.util.List; - -public class DropColumnsIterator extends HybridRuntimeIterator { - public DropColumnsIterator(List children, RuntimeStaticContext staticContext) { - super(children, staticContext); - } - - @Override - public JavaRDD getRDDAux(DynamicContext context) { - return null; - } - - @Override - public void openLocal() { - - } - - @Override - public void closeLocal() { - - } - - @Override - public void resetLocal() { - - } - - @Override - public boolean hasNextLocal() { - return false; - } - - @Override - public Item nextLocal() { - return null; - } - - public JSoundDataFrame getDataFrame(DynamicContext context) { - JSoundDataFrame dataFrame = this.children.get(0).getDataFrame(context); - List columnsToDropItems = this.children.get(1).materialize(context); - if (columnsToDropItems.isEmpty()) { - throw new InvalidSelectorException( - "Invalid drop-columns parameter; drop-columns can't be performed without string columns to be removed.", - getMetadata() - ); - } - String[] columnsToDrop = new String[columnsToDropItems.size()]; - int i = 0; - for (Item columnItem : columnsToDropItems) { - if (!columnItem.isString()) { - throw new UnexpectedTypeException("drop-columns invoked with non-string columns", getMetadata()); - } - columnsToDrop[i] = columnItem.getStringValue(); - ++i; - } - return new JSoundDataFrame(dataFrame.getDataFrame().drop(columnsToDrop), dataFrame.getItemType()); - } -} diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java index 6b5dd20f0..79ee55955 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java @@ -29,6 +29,7 @@ import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.UnexpectedTypeException; import org.rumbledb.items.ItemFactory; +import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -163,4 +164,26 @@ public JavaRDD getRDDAux(DynamicContext context) { ); return childRDD.flatMap(transformation); } + + @Override + public JSoundDataFrame getDataFrame(DynamicContext context) { + JSoundDataFrame dataFrame = this.iterator.getDataFrame(context); + List columnsToDropItems = this.children.get(1).materialize(context); + if (columnsToDropItems.isEmpty()) { + throw new InvalidSelectorException( + "Invalid drop-columns parameter; drop-columns can't be performed without string columns to be removed.", + getMetadata() + ); + } + String[] columnsToDrop = new String[columnsToDropItems.size()]; + int i = 0; + for (Item columnItem : columnsToDropItems) { + if (!columnItem.isString()) { + throw new UnexpectedTypeException("drop-columns invoked with non-string columns", getMetadata()); + } + columnsToDrop[i] = columnItem.getStringValue(); + ++i; + } + return new JSoundDataFrame(dataFrame.getDataFrame().drop(columnsToDrop), dataFrame.getItemType()); + } } diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq index a32838d9d..56ee0713f 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq @@ -276,51 +276,33 @@ declare function jsoniq_pandas:dropna($dataframe as object*, $params as object) let $params := validate type jsoniq_pandas:dropna_params {$params} let $keys := keys($dataframe) return - if ($params.axis eq 0) then { - (: Remove rows :) - for $row in $dataframe - where (count(keys($row)) eq count($keys)) - return $row - } else { - (: Remove columns :) - let $columns_to_remove := - for $column_name in keys($dataframe) - where jsoniq_pandas:column_has_null($dataframe.$column_name, $params.how) eq true - return $column_name - return - if (count($columns_to_remove) gt 0) then drop-columns($dataframe, $columns_to_remove) - else $dataframe - } + if ($params.axis eq 0) then + jsoniq_pandas:remove_rows($dataframe, $params.how, $keys) + else + jsoniq_pandas:remove_columns($dataframe, $params.how, $keys) }; -declare function jsoniq_pandas:row_has_null($row as object, $how as string) { +declare function jsoniq_pandas:remove_columns($dataframe as object*, $how as string, $keys) { + let $columns_to_remove := + for $column_name in $keys + where jsoniq_pandas:column_has_null($dataframe.$column_name, $how) eq true + return $column_name + return + if (count($columns_to_remove) gt 0) then remove-keys($dataframe, $columns_to_remove) + else $dataframe +}; + +declare function jsoniq_pandas:remove_rows($dataframe as object*, $how as string, $keys) { if ($how eq "any") then { - variable $i := 1; - variable $keys := keys($row); - variable $size := count($keys); - print_vars($row); - while($i le $size) { - if (empty($row.($keys[$i]))) then exit returning true; - else (); - $i := $i + 1; - } - exit returning false; + for $row in $dataframe + where (count(keys($row)) eq count ($keys)) + return $row } else { - variable $i := 1; - variable $keys := keys($row); - variable $size := count($keys); - while($i le $size) { - if (exists($row.keys[$i])) then exit returning false; - else (); - $i := $i + 1; - } - exit returning true; + for $row in $dataframe + where (count(keys($row)) gt 0) + return $row } - (: if ($how eq "any") then - some $key in keys($row) satisfies is-null($row.$key) eq true - else - every $key in keys($row) satisfies is-null($row.$key) eq true :) }; declare function jsoniq_pandas:column_has_null($column, $how as string) { @@ -335,9 +317,7 @@ declare function jsoniq_pandas:column_has_null($column, $how as string) { } exit returning false; } - (: some $value in $column satisfies is-null($value) eq true :) else { - (: every $value in $column satisfies is-null($value) eq true :) variable $i := 1; variable $size := count($column); variable $column_flat := flatten($column); diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq index 6112cbcbf..d6a568507 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="":) +(:JIQS: ShouldRun; Output="({ "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] }, { "label" : 1, "binaryLabel" : 0, "name" : "b", "age" : 21, "weight" : 55.3, "booleanCol" : false, "stringCol" : "i am data entry 2", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "intArrayCol" : [ 4, 5, 6 ], "doubleArrayCol" : [ 4, 5, 6 ], "doubleArrayArrayCol" : [ [ 4, 5, 6 ] ] }, { "label" : 2, "binaryLabel" : 0, "name" : "c", "age" : 22, "weight" : 60.6, "booleanCol" : false, "stringCol" : "i am data entry 3", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 7, 8, 9 ], "doubleArrayCol" : [ 7, 8, 9 ], "doubleArrayArrayCol" : [ [ 7, 8, 9 ] ] }, { "label" : 3, "binaryLabel" : 1, "name" : "d", "age" : 23, "weight" : 65.9, "booleanCol" : false, "stringCol" : "i am data entry 4", "stringArrayCol" : [ "i", "am", "data", "entry", "4" ], "intArrayCol" : [ 1, 4, 7 ], "doubleArrayCol" : [ 1, 4, 7 ], "doubleArrayArrayCol" : [ [ 1, 4, 7 ] ] }, { "label" : 4, "binaryLabel" : 1, "name" : "e", "age" : 24, "weight" : 70.3, "booleanCol" : true, "stringCol" : "i am data entry 5", "stringArrayCol" : [ "i", "am", "data", "entry", "5" ], "intArrayCol" : [ 2, 5, 8 ], "doubleArrayCol" : [ 2, 5, 8 ], "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ] }, { "label" : 5, "binaryLabel" : 1, "name" : "f", "age" : 25, "weight" : 75.6, "booleanCol" : true, "stringCol" : "i am data entry 6", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "intArrayCol" : [ 3, 6, 9 ], "doubleArrayCol" : [ 3, 6, 9 ], "doubleArrayArrayCol" : [ [ 3, 6, 9 ] ] })":) import module namespace pandas = "jsoniq_pandas.jq"; declare type local:sample-type-with-arrays as { diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq index 9df93cbde..830ce16f0 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="":) +(:JIQS: ShouldRun; Output="({ "age" : 20, "binaryLabel" : 0, "booleanCol" : false, "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ], "doubleArrayCol" : [ 1, 2, 3 ], "intArrayCol" : [ 1, 2, 3 ], "label" : 0, "name" : "a", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "stringCol" : "i am data entry 1", "weight" : 50 }, { "age" : 21, "binaryLabel" : 0, "booleanCol" : false, "doubleArrayArrayCol" : [ [ 4, 5, 6 ] ], "doubleArrayCol" : [ 4, 5, 6 ], "intArrayCol" : [ 4, 5, 6 ], "label" : 1, "name" : "b", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "stringCol" : "i am data entry 2", "weight" : 55.3 }, { "age" : 24, "binaryLabel" : 1, "booleanCol" : true, "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ], "doubleArrayCol" : [ 2, 5, 8 ], "intArrayCol" : [ 2, 5, 8 ], "label" : 4, "name" : "e", "stringArrayCol" : [ "i", "am", "data", "entry", "5" ], "stringCol" : "i am data entry 5", "weight" : 70.3 }, { "age" : 25, "binaryLabel" : 1, "booleanCol" : true, "doubleArrayArrayCol" : [ [ 3, 6, 9 ] ], "doubleArrayCol" : [ 3, 6, 9 ], "intArrayCol" : [ 3, 6, 9 ], "label" : 5, "name" : "f", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "stringCol" : "i am data entry 6", "weight" : 75.6 })":) import module namespace pandas = "jsoniq_pandas.jq"; let $data := structured-json-file("../../../queries/sample-na-data-2.json") From 10510f3418ae000995fc1b6fc999473d084f08bb Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Fri, 19 Jul 2024 13:21:21 +0200 Subject: [PATCH 28/56] Fixed fillna --- .../resources/queries/sample-na-data-2.json | 4 +-- .../resources/queries/sample-na-data-3.json | 3 ++ .../resources/queries/sample-na-data-4.json | 6 ++++ .../runtime/numpy_lib/jsoniq_pandas.jq | 35 ++++--------------- .../numpy_lib/test_jsoniq_numpy_fillna1.jq | 20 +++++++++++ .../numpy_lib/test_jsoniq_numpy_fillna2.jq | 5 +++ .../numpy_lib/test_jsoniq_numpy_fillna3.jq | 14 ++++++++ .../numpy_lib/test_jsoniq_pandas_fill_na.jq | 8 ----- 8 files changed, 56 insertions(+), 39 deletions(-) create mode 100644 src/test/resources/queries/sample-na-data-3.json create mode 100644 src/test/resources/queries/sample-na-data-4.json create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna2.jq create mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq delete mode 100644 src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq diff --git a/src/test/resources/queries/sample-na-data-2.json b/src/test/resources/queries/sample-na-data-2.json index 6a309c131..91f36b945 100644 --- a/src/test/resources/queries/sample-na-data-2.json +++ b/src/test/resources/queries/sample-na-data-2.json @@ -1,6 +1,6 @@ {"label": 0, "binaryLabel": 0, "name": "a", "age": 20, "weight": 50.0, "booleanCol": false, "stringCol": "i am data entry 1", "stringArrayCol": ["i", "am", "data", "entry", "1"], "intArrayCol": [1,2,3], "doubleArrayCol": [1.0,2.0,3.0], "doubleArrayArrayCol": [[1.0,2.0,3.0]]} {"label": 1, "binaryLabel": 0, "name": "b", "age": 21, "weight": 55.3, "booleanCol": false, "stringCol": "i am data entry 2", "stringArrayCol": ["i", "am", "data", "entry", "2"], "intArrayCol": [4,5,6], "doubleArrayCol": [4.0,5.0,6.0], "doubleArrayArrayCol": [[4.0,5.0,6.0]]} -{"label": 2, "binaryLabel": 0, "name": "c", "age": 22, "weight": null, "booleanCol": null, "stringCol": "i am data entry 3", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [7,8,9], "doubleArrayCol": [7.0,8.0,9.0], "doubleArrayArrayCol": [[7.0,8.0,9.0]]} -{"label": 3, "binaryLabel": 1, "name": "d", "age": 23, "weight": null, "booleanCol": null, "stringCol": "i am data entry 4", "stringArrayCol": ["i", "am", "data", "entry", "4"], "intArrayCol": [1,4,7], "doubleArrayCol": [1.0,4.0,7.0], "doubleArrayArrayCol": [[1.0,4.0,7.0]]} +{"label": 2, "binaryLabel": 0, "name": "c", "age": 22, "stringCol": "i am data entry 3", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [7,8,9], "doubleArrayCol": [7.0,8.0,9.0], "doubleArrayArrayCol": [[7.0,8.0,9.0]]} +{"label": 3, "binaryLabel": 1, "name": "d", "age": 23, "stringCol": "i am data entry 4", "stringArrayCol": ["i", "am", "data", "entry", "4"], "intArrayCol": [1,4,7], "doubleArrayCol": [1.0,4.0,7.0], "doubleArrayArrayCol": [[1.0,4.0,7.0]]} {"label": 4, "binaryLabel": 1, "name": "e", "age": 24, "weight": 70.3, "booleanCol": true, "stringCol": "i am data entry 5", "stringArrayCol": ["i", "am", "data", "entry", "5"], "intArrayCol": [2,5,8], "doubleArrayCol": [2.0,5.0,8.0], "doubleArrayArrayCol": [[2.0,5.0,8.0]]} {"label": 5, "binaryLabel": 1, "name": "f", "age": 25, "weight": 75.6, "booleanCol": true, "stringCol": "i am data entry 6", "stringArrayCol": ["i", "am", "data", "entry", "6"], "intArrayCol": [3,6,9], "doubleArrayCol": [3.0,6.0,9.0], "doubleArrayArrayCol": [[3.0,6.0,9.0]]} diff --git a/src/test/resources/queries/sample-na-data-3.json b/src/test/resources/queries/sample-na-data-3.json new file mode 100644 index 000000000..0f583efc5 --- /dev/null +++ b/src/test/resources/queries/sample-na-data-3.json @@ -0,0 +1,3 @@ +{ "name": [null], "type": "null", "other2": {"x": null}} +{ "name": [null], "type": null, "other": ["null"], "other2": {"x": "3"}, "anotherArray": [[2, 1, 2]]} +{ "name": [null], "type": null, "other2": {}, "anotherArray": [[23]]} \ No newline at end of file diff --git a/src/test/resources/queries/sample-na-data-4.json b/src/test/resources/queries/sample-na-data-4.json new file mode 100644 index 000000000..4bfec9d21 --- /dev/null +++ b/src/test/resources/queries/sample-na-data-4.json @@ -0,0 +1,6 @@ +{"label": 0, "binaryLabel": 0, "name": "a", "age": 20, "weight": 50.0, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 1", "stringArrayCol": ["i", "am", "data", "entry", "1"], "intArrayCol": [1,2,3], "doubleArrayCol": [1.0,2.0,3.0], "doubleArrayArrayCol": [[1.0,2.0,3.0]]} +{"label": 1, "binaryLabel": 0, "name": "b", "age": 21, "weight": 55.3, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 2", "stringArrayCol": ["i", "am", "data", "entry", "2"], "intArrayCol": [4,5,6], "doubleArrayCol": [4.0,5.0,6.0], "doubleArrayArrayCol": [[4.0,5.0,6.0]]} +{"label": 2, "binaryLabel": 0, "name": "c", "age": 22, "weight": 60.6, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 3", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [7,8,9], "doubleArrayCol": [7.0,8.0,9.0], "doubleArrayArrayCol": [[7.0,8.0,9.0]]} +{"label": 3, "binaryLabel": 1, "name": "d", "age": 23, "weight": 65.9, "nullCol": null, "stringCol": "i am data entry 4", "stringArrayCol": ["i", "am", "data", "entry", "4"], "intArrayCol": [1,4,7], "doubleArrayCol": [1.0,4.0,7.0], "doubleArrayArrayCol": [[1.0,4.0,7.0]]} +{"label": 4, "binaryLabel": 1, "name": "e", "age": 24, "weight": 70.3, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 5", "stringArrayCol": ["i", "am", "data", "entry", "5"], "intArrayCol": [2,5,8], "doubleArrayCol": [2.0,5.0,8.0], "doubleArrayArrayCol": [[2.0,5.0,8.0]]} +{"label": 5, "binaryLabel": 1, "name": "f", "age": 25, "weight": 75.6, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 6", "stringArrayCol": ["i", "am", "data", "entry", "6"], "intArrayCol": [3,6,9], "doubleArrayCol": [3.0,6.0,9.0], "doubleArrayArrayCol": [[3.0,6.0,9.0]]} diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq index 56ee0713f..8c2899186 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq @@ -211,35 +211,11 @@ declare type jsoniq_pandas:fillna_params as { "limit": "integer=1000" }; -declare function jsoniq_pandas:fillna_value($value, $params as object) { - if ($value eq null) then $params.value - else $value -}; - -declare function jsoniq_pandas:fillna_array($array as array, $params as object) { - (: TODO: Add support for limited number of replacements :) - for $value in $array[] - return typeswitch($value) - case array return jsoniq_pandas:fillna_array($value, $params) - case object return jsoniq_pandas:fillna_object($value, $params) - default return jsoniq_pandas:fillna_value($value, $params) -}; - -declare function jsoniq_pandas:fillna_object($object as object, $params as object) { +declare function jsoniq_pandas:fillna_row($row as object, $params as object, $keys) { {| - for $key in keys($object) - let $value := $object.$key - return - typeswitch($value) - case object return - let $result := jsoniq_pandas:fillna_object($value, $params) - return {$key: $result} - case array return - let $result := jsoniq_pandas:fillna_array($value, $params) - return {$key: $result} - default return - let $result := jsoniq_pandas:fillna_value($value, $params) - return {$key: $result} + for $key in $keys + return if (empty($row.$key)) then {$key: $params.value} + else {$key: $row.$key} |} }; @@ -252,8 +228,9 @@ Params is an object for optional arguments. These arguments are: :) declare function jsoniq_pandas:fillna($dataframe as object*, $params as object) { let $params := validate type jsoniq_pandas:fillna_params {$params} + let $keys := keys($dataframe) for $row in $dataframe - return jsoniq_pandas:fillna_object($row, $params) + return jsoniq_pandas:fillna_row($row, $params, $keys) }; declare function jsoniq_pandas:fillna($dataframe as object*) { diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq new file mode 100644 index 000000000..29598cea8 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq @@ -0,0 +1,20 @@ +(:JIQS: ShouldRun; Output="({ "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] }, { "label" : 1, "binaryLabel" : 0, "name" : "b", "age" : 21, "weight" : 55.3, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 2", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "intArrayCol" : [ 4, 5, 6 ], "doubleArrayCol" : [ 4, 5, 6 ], "doubleArrayArrayCol" : [ [ 4, 5, 6 ] ] }, { "label" : 2, "binaryLabel" : 0, "name" : "c", "age" : 22, "weight" : 60.6, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 3", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 7, 8, 9 ], "doubleArrayCol" : [ 7, 8, 9 ], "doubleArrayArrayCol" : [ [ 7, 8, 9 ] ] }, { "label" : 3, "binaryLabel" : 1, "name" : "d", "age" : 23, "weight" : 65.9, "booleanCol" : 1, "nullCol" : null, "stringCol" : "i am data entry 4", "stringArrayCol" : [ "i", "am", "data", "entry", "4" ], "intArrayCol" : [ 1, 4, 7 ], "doubleArrayCol" : [ 1, 4, 7 ], "doubleArrayArrayCol" : [ [ 1, 4, 7 ] ] }, { "label" : 4, "binaryLabel" : 1, "name" : "e", "age" : 24, "weight" : 70.3, "booleanCol" : true, "nullCol" : null, "stringCol" : "i am data entry 5", "stringArrayCol" : [ "i", "am", "data", "entry", "5" ], "intArrayCol" : [ 2, 5, 8 ], "doubleArrayCol" : [ 2, 5, 8 ], "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ] }, { "label" : 5, "binaryLabel" : 1, "name" : "f", "age" : 25, "weight" : 75.6, "booleanCol" : true, "nullCol" : null, "stringCol" : "i am data entry 6", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "intArrayCol" : [ 3, 6, 9 ], "doubleArrayCol" : [ 3, 6, 9 ], "doubleArrayArrayCol" : [ [ 3, 6, 9 ] ] })":) +import module namespace pandas = "jsoniq_pandas.jq"; +declare type local:sample-type-with-arrays as { + "label": "integer", + "binaryLabel": "integer", + "name": "string", + "age": "integer", + "weight": "double", + "booleanCol": "boolean", + "nullCol": "null", + "stringCol": "string", + "stringArrayCol": ["string"], + "intArrayCol": ["integer"], + "doubleArrayCol": ["double"], + "doubleArrayArrayCol": [["double"]] +}; + +declare variable $file_data := json-file("../../../queries/sample-na-data-4.json"); +let $data := validate type local:sample-type-with-arrays* {$file_data} +return $data=>pandas:fillna({"value": 1}) diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna2.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna2.jq new file mode 100644 index 000000000..5c4e0312f --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna2.jq @@ -0,0 +1,5 @@ +(:JIQS: ShouldRun; Output="":) +import module namespace pandas = "jsoniq_pandas.jq"; + +let $file_data := structured-json-file("../../../queries/sample-na-data-2.json") +return $file_data=>pandas:fillna({"value": null}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq new file mode 100644 index 000000000..45e9cf798 --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq @@ -0,0 +1,14 @@ +(:JIQS: ShouldRun; Output="({ "name" : [ null ], "type" : "null", "other2" : { "x" : null }, "other" : [ 1, 2, 3 ], "anotherArray" : [ 1, 2, 3 ] }, { "name" : [ null ], "type" : "null", "other2" : { "x" : "3" }, "other" : [ "null" ], "anotherArray" : [ [ 2, 1, 2 ] ] }, { "name" : [ null ], "type" : "null", "other2" : { }, "other" : [ 1, 2, 3 ], "anotherArray" : [ [ 23 ] ] })":) +import module namespace pandas = "jsoniq_pandas.jq"; + +declare type local:sample-type as { + "name": ["null"], + "type": "string", + "other": ["string"], + "other2": "object", + "anotherArray": [["integer"]] +}; + +declare variable $file_data := json-file("../../../queries/sample-na-data-3.json"); +let $data := validate type local:sample-type* {$file_data} +return $data=>pandas:fillna({"value": [1,2,3]}) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq deleted file mode 100644 index f2c6c9a0a..000000000 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_fill_na.jq +++ /dev/null @@ -1,8 +0,0 @@ -(:JIQS: ShouldRun; Output="({ "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ 1, 2, 3 ] }, { "label" : 1, "binaryLabel" : 0, "name" : "b", "age" : 21, "weight" : 55.3, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 2", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "intArrayCol" : [ 4, 5, 6 ], "doubleArrayCol" : [ 4, 5, 6 ], "doubleArrayArrayCol" : [ 4, 5, 6 ] }, { "label" : 2, "binaryLabel" : 0, "name" : "c", "age" : 22, "weight" : 60.6, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 3", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 7, 8, 9 ], "doubleArrayCol" : [ 7, 8, 9 ], "doubleArrayArrayCol" : [ 7, 8, 9 ] }, { "label" : 3, "binaryLabel" : 1, "name" : "d", "age" : 23, "weight" : 65.9, "booleanCol" : 1, "nullCol" : 1, "stringCol" : "i am data entry 4", "stringArrayCol" : [ "i", "am", "data", "entry", "4" ], "intArrayCol" : [ 1, 4, 7 ], "doubleArrayCol" : [ 1, 4, 7 ], "doubleArrayArrayCol" : [ 1, 4, 7 ] }, { "label" : 4, "binaryLabel" : 1, "name" : "e", "age" : 24, "weight" : 70.3, "booleanCol" : true, "nullCol" : 1, "stringCol" : "i am data entry 5", "stringArrayCol" : [ "i", "am", "data", "entry", "5" ], "intArrayCol" : [ 2, 5, 8 ], "doubleArrayCol" : [ 2, 5, 8 ], "doubleArrayArrayCol" : [ 2, 5, 8 ] }, { "label" : 5, "binaryLabel" : 1, "name" : "f", "age" : 25, "weight" : 75.6, "booleanCol" : true, "nullCol" : 1, "stringCol" : "i am data entry 6", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "intArrayCol" : [ 3, 6, 9 ], "doubleArrayCol" : [ 3, 6, 9 ], "doubleArrayArrayCol" : [ 3, 6, 9 ] }, { "test" : [ 1, 2, -34 ], "test2" : -34, "test3" : { "test4" : [ 1, 4, 2 ], "test5" : -34, "test6" : { "test7" : [ 1, -34, -34, -34 ] } } }, { "test1" : [ { "test2" : [ 1, 2, 3 ] }, { "test3" : [ 1, 2, [ 1, 2, 3 ] ] }, { "test4" : { "test5" : [ 1, 2, 3 ] } } ] }, { "test1" : [ { "test2" : "not_null" }, { "test3" : [ 1, 2, "not_null" ] }, { "test4" : { "test5" : "not_null" } } ] })":) -import module namespace pandas = "jsoniq_pandas.jq"; - - -json-file("../../../queries/sample-na-data.json")=>pandas:fillna({"value": 1}), -pandas:fillna({"test": [1,2, null], "test2": null, "test3": {"test4": [1, 4, 2], "test5": null, "test6": {"test7": [1, null, null, null]}}}, {"value": -34}), -pandas:fillna({"test1": [{"test2": null}, {"test3": [1, 2, null]}, {"test4": {"test5": null}}]}, {"value": [1, 2, 3]}), -pandas:fillna({"test1": [{"test2": null}, {"test3": [1, 2, null]}, {"test4": {"test5": null}}]}, {"value": "not_null"}) \ No newline at end of file From 39c70adcf60a3a1707ab4958f7978083f5715c07 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Sun, 21 Jul 2024 11:59:47 +0200 Subject: [PATCH 29/56] Fixed describe and added more fillna tests --- .../resources/queries/sample-na-data-4.json | 4 +-- .../test_files/runtime/numpy_lib/functx.jq | 11 ++++++ .../runtime/numpy_lib/jsoniq_pandas.jq | 36 +++++++++++++++---- .../numpy_lib/test_jsoniq_numpy_fillna2.jq | 2 +- .../numpy_lib/test_jsoniq_pandas_describe.jq | 6 ++-- 5 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 src/test/resources/test_files/runtime/numpy_lib/functx.jq diff --git a/src/test/resources/queries/sample-na-data-4.json b/src/test/resources/queries/sample-na-data-4.json index 4bfec9d21..7ed5b9bf6 100644 --- a/src/test/resources/queries/sample-na-data-4.json +++ b/src/test/resources/queries/sample-na-data-4.json @@ -2,5 +2,5 @@ {"label": 1, "binaryLabel": 0, "name": "b", "age": 21, "weight": 55.3, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 2", "stringArrayCol": ["i", "am", "data", "entry", "2"], "intArrayCol": [4,5,6], "doubleArrayCol": [4.0,5.0,6.0], "doubleArrayArrayCol": [[4.0,5.0,6.0]]} {"label": 2, "binaryLabel": 0, "name": "c", "age": 22, "weight": 60.6, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 3", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [7,8,9], "doubleArrayCol": [7.0,8.0,9.0], "doubleArrayArrayCol": [[7.0,8.0,9.0]]} {"label": 3, "binaryLabel": 1, "name": "d", "age": 23, "weight": 65.9, "nullCol": null, "stringCol": "i am data entry 4", "stringArrayCol": ["i", "am", "data", "entry", "4"], "intArrayCol": [1,4,7], "doubleArrayCol": [1.0,4.0,7.0], "doubleArrayArrayCol": [[1.0,4.0,7.0]]} -{"label": 4, "binaryLabel": 1, "name": "e", "age": 24, "weight": 70.3, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 5", "stringArrayCol": ["i", "am", "data", "entry", "5"], "intArrayCol": [2,5,8], "doubleArrayCol": [2.0,5.0,8.0], "doubleArrayArrayCol": [[2.0,5.0,8.0]]} -{"label": 5, "binaryLabel": 1, "name": "f", "age": 25, "weight": 75.6, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 6", "stringArrayCol": ["i", "am", "data", "entry", "6"], "intArrayCol": [3,6,9], "doubleArrayCol": [3.0,6.0,9.0], "doubleArrayArrayCol": [[3.0,6.0,9.0]]} +{"label": 4, "binaryLabel": 1, "name": "e", "age": 24, "weight": 70.3, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 5", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [2,5,8], "doubleArrayCol": [2.0,5.0,8.0], "doubleArrayArrayCol": [[2.0,5.0,8.0]]} +{"label": 5, "binaryLabel": 1, "name": "f", "age": 25, "weight": 75.6, "nullCol": null, "stringCol": "i am data entry 6", "stringArrayCol": ["i", "am", "data", "entry", "6"], "intArrayCol": [3,6,9], "doubleArrayCol": [3.0,6.0,9.0], "doubleArrayArrayCol": [[3.0,6.0,9.0]]} diff --git a/src/test/resources/test_files/runtime/numpy_lib/functx.jq b/src/test/resources/test_files/runtime/numpy_lib/functx.jq new file mode 100644 index 000000000..f9c55569b --- /dev/null +++ b/src/test/resources/test_files/runtime/numpy_lib/functx.jq @@ -0,0 +1,11 @@ +(:JIQS: ShouldNotParse; ErrorCode="XPST0003"; ErrorMetadata="LINE:1:COLUMN:0:" :) +module namespace functx = "functx.jq"; + +declare function functx:distinct-deep($items as item*) as item* { + for $seq in 1 to count($items) + return $items[$seq][not(functx:is-node-in-sequence-deep-equal($$, $items[position() lt $seq]))] +}; + +declare function functx:is-node-in-sequence-deep-equal($item as item?, $seq as item*) as xs:boolean { + some $itemInSeq in $seq satisfies deep-equal($itemInSeq, $item) +}; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq index 8c2899186..71b31178f 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq @@ -1,6 +1,7 @@ (:JIQS: ShouldNotParse; ErrorCode="XPST0003"; ErrorMetadata="LINE:1:COLUMN:0:" :) module namespace jsoniq_pandas = "jsoniq_pandas.jq"; import module namespace jsoniq_numpy = "jsoniq_numpy.jq"; +import module namespace functx = "functx.jq"; declare type jsoniq_pandas:describe_params as { "include": "string=all", @@ -32,7 +33,7 @@ declare function jsoniq_pandas:describe($dataframe as object*) { declare function jsoniq_pandas:all_report($column, $params as object) { let $column_type := item-type($column) return switch($column_type) - case "xs:int" return jsoniq_pandas:numerical_report($column, $params) + case "xs:integer" return jsoniq_pandas:numerical_report($column, $params) case "xs:decimal" return jsoniq_pandas:numerical_report($column, $params) case "xs:float" return jsoniq_pandas:numerical_report($column, $params) case "xs:double" return jsoniq_pandas:numerical_report($column, $params) @@ -43,7 +44,7 @@ declare function jsoniq_pandas:all_report($column, $params as object) { declare function jsoniq_pandas:number_report($column, $params as object) { let $column_type := item-type($column) return switch($column_type) - case "xs:int" return jsoniq_pandas:numerical_report($column, $params) + case "xs:integer" return jsoniq_pandas:numerical_report($column, $params) case "xs:decimal" return jsoniq_pandas:numerical_report($column, $params) case "xs:float" return jsoniq_pandas:numerical_report($column, $params) case "xs:double" return jsoniq_pandas:numerical_report($column, $params) @@ -94,10 +95,10 @@ declare function jsoniq_pandas:std($arr as array, $mean as double) { return float(sqrt($sum_accumulated div $sample_size)) }; -declare function jsoniq_pandas:categorical_report($column) { +declare function jsoniq_pandas:categorical_report($column as array) { let $count := size($column) - let $unique := size(jsoniq_numpy:unique($column)) - let $occurences := jsoniq_pandas:count_occurences($column) + let $unique := count(functx:distinct-deep($column[])) + let $occurences := jsoniq_pandas:frequency_of_values($column) let $top := $occurences[1].value let $frequency := $occurences[1].count return { @@ -108,11 +109,31 @@ declare function jsoniq_pandas:categorical_report($column) { } }; -declare function jsoniq_pandas:count_occurences($column) { +(: declare function jsoniq_pandas:count_occurences($column) { for $value in $column[] let $group_key := $value group by $group_key return {"value": $group_key, "count": count($value)} +}; :) + +declare function jsoniq_pandas:frequency_of_values($column) { + variable $counts := + let $distinct_values := functx:distinct-deep($column[]) + for $value in $distinct_values + return {"count": jsoniq_pandas:count_value($value, $column[]), "value": $value}; + print_vars($counts); + (: for $count in $counts + order by $count.count + return $count :) +}; + +declare function jsoniq_pandas:count_value($value, $column) { + print_vars($value); + let $frequency := + for $column_value in $column + where deep-equal($value, $column_value) + return 1 + return count($frequency) }; declare function jsoniq_pandas:compute_percentile($arr as array, $percentile as double) { @@ -305,4 +326,5 @@ declare function jsoniq_pandas:column_has_null($column, $how as string) { } exit returning true; } -}; \ No newline at end of file +}; + diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna2.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna2.jq index 5c4e0312f..b704224f6 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna2.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna2.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="":) +(:JIQS: ShouldRun; Output="({ "age" : 20, "binaryLabel" : 0, "booleanCol" : false, "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ], "doubleArrayCol" : [ 1, 2, 3 ], "intArrayCol" : [ 1, 2, 3 ], "label" : 0, "name" : "a", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "stringCol" : "i am data entry 1", "weight" : 50 }, { "age" : 21, "binaryLabel" : 0, "booleanCol" : false, "doubleArrayArrayCol" : [ [ 4, 5, 6 ] ], "doubleArrayCol" : [ 4, 5, 6 ], "intArrayCol" : [ 4, 5, 6 ], "label" : 1, "name" : "b", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "stringCol" : "i am data entry 2", "weight" : 55.3 }, { "age" : 22, "binaryLabel" : 0, "booleanCol" : null, "doubleArrayArrayCol" : [ [ 7, 8, 9 ] ], "doubleArrayCol" : [ 7, 8, 9 ], "intArrayCol" : [ 7, 8, 9 ], "label" : 2, "name" : "c", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "stringCol" : "i am data entry 3", "weight" : null }, { "age" : 23, "binaryLabel" : 1, "booleanCol" : null, "doubleArrayArrayCol" : [ [ 1, 4, 7 ] ], "doubleArrayCol" : [ 1, 4, 7 ], "intArrayCol" : [ 1, 4, 7 ], "label" : 3, "name" : "d", "stringArrayCol" : [ "i", "am", "data", "entry", "4" ], "stringCol" : "i am data entry 4", "weight" : null }, { "age" : 24, "binaryLabel" : 1, "booleanCol" : true, "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ], "doubleArrayCol" : [ 2, 5, 8 ], "intArrayCol" : [ 2, 5, 8 ], "label" : 4, "name" : "e", "stringArrayCol" : [ "i", "am", "data", "entry", "5" ], "stringCol" : "i am data entry 5", "weight" : 70.3 }, { "age" : 25, "binaryLabel" : 1, "booleanCol" : true, "doubleArrayArrayCol" : [ [ 3, 6, 9 ] ], "doubleArrayCol" : [ 3, 6, 9 ], "intArrayCol" : [ 3, 6, 9 ], "label" : 5, "name" : "f", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "stringCol" : "i am data entry 6", "weight" : 75.6 })":) import module namespace pandas = "jsoniq_pandas.jq"; let $file_data := structured-json-file("../../../queries/sample-na-data-2.json") diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq index 28ee032b6..f24c5884c 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq @@ -2,7 +2,7 @@ import module namespace pandas = "jsoniq_pandas.jq"; declare type local:sample-type-with-arrays as { - "label": "integer", + (: "label": "integer", "binaryLabel": "integer", "name": "string", "age": "integer", @@ -12,7 +12,7 @@ declare type local:sample-type-with-arrays as { "stringCol": "string", "stringArrayCol": ["string"], "intArrayCol": ["integer"], - "doubleArrayCol": ["double"], + "doubleArrayCol": ["double"], :) "doubleArrayArrayCol": [["double"]] }; @@ -31,6 +31,6 @@ pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": [ pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": ["a", "b", "c"]}, {"include": "object"}), pandas:describe({"0": [10, 18, 11],"1": [13, 15, 8], "2": [9, 20, 3]}), pandas:describe({"Normal": [1, 2, 3, 4, 5],"Uniform": [1, 1, 1, 1, 1],"Skewed": [1, 1, 1, 1,100]}), :) -declare variable $file_data := json-file("../../../queries/sample-na-data.json"); +declare variable $file_data := json-file("../../../queries/sample-na-data-4.json"); let $data := validate type local:sample-type-with-arrays* {$file_data} return $data=>pandas:describe() \ No newline at end of file From 24d93452cde98af67c919d241df6a682b05dae39 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Wed, 17 Jul 2024 17:34:40 +0200 Subject: [PATCH 30/56] Added Items classes and creation methods for XML nodes: document, element, attribute and text --- src/main/java/org/rumbledb/api/Item.java | 65 ++++++++- .../context/BuiltinFunctionCatalogue.java | 9 ++ .../java/org/rumbledb/items/ItemFactory.java | 20 +++ .../rumbledb/items/parsing/ItemParser.java | 74 ++++++++++- .../org/rumbledb/items/xml/AttributeItem.java | 69 ++++++++++ .../org/rumbledb/items/xml/DocumentItem.java | 73 ++++++++++ .../org/rumbledb/items/xml/ElementItem.java | 125 ++++++++++++++++++ .../java/org/rumbledb/items/xml/NodeItem.java | 78 +++++++++++ .../java/org/rumbledb/items/xml/TextItem.java | 93 +++++++++++++ .../functions/io/XmlDocFunctionIterator.java | 69 ++++++++++ .../runtime/misc/ComparisonIterator.java | 5 + src/test/resources/queries/xml/books.xml | 36 +++++ .../runtime/FunctionXPath/FunctionXmlDoc.jq | 2 + 13 files changed, 707 insertions(+), 11 deletions(-) create mode 100644 src/main/java/org/rumbledb/items/xml/AttributeItem.java create mode 100644 src/main/java/org/rumbledb/items/xml/DocumentItem.java create mode 100644 src/main/java/org/rumbledb/items/xml/ElementItem.java create mode 100644 src/main/java/org/rumbledb/items/xml/NodeItem.java create mode 100644 src/main/java/org/rumbledb/items/xml/TextItem.java create mode 100644 src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java create mode 100644 src/test/resources/queries/xml/books.xml create mode 100644 src/test/resources/test_files/runtime/FunctionXPath/FunctionXmlDoc.jq diff --git a/src/main/java/org/rumbledb/api/Item.java b/src/main/java/org/rumbledb/api/Item.java index ae0feeb35..67733eb38 100644 --- a/src/main/java/org/rumbledb/api/Item.java +++ b/src/main/java/org/rumbledb/api/Item.java @@ -1,11 +1,6 @@ package org.rumbledb.api; -import java.io.Serializable; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.List; -import java.util.Map; - +import com.esotericsoftware.kryo.KryoSerializable; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.ml.Estimator; import org.apache.spark.ml.Transformer; @@ -21,7 +16,11 @@ import org.rumbledb.types.FunctionSignature; import org.rumbledb.types.ItemType; -import com.esotericsoftware.kryo.KryoSerializable; +import java.io.Serializable; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.List; +import java.util.Map; /** @@ -297,6 +296,42 @@ default boolean isBase64Binary() { return false; } + /** + * Tests whether the item is an XML Element node. + * + * @return true if it is an XML Element node, false otherwise. + */ + default boolean isElement() { + return false; + } + + /** + * Tests whether the item is an XML Attribute node. + * + * @return true if it is an XML Attribute node, false otherwise. + */ + default boolean isAttribute() { + return false; + } + + /** + * Tests whether the item is an XML Text node. + * + * @return true if it is an XML Text node, false otherwise. + */ + default boolean getContent() { + return false; + } + + /** + * Tests whether the item is an XML Document node. + * + * @return true if it is an XML Document node, false otherwise. + */ + default boolean isDocument() { + return false; + } + /** * Returns the members of the item if it is an array. * @@ -747,4 +782,20 @@ default boolean isTransformer() { default Transformer getTransformer() { throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); } + + /** + * Returns the string value of the text item, if it is a text item. + * + * @return the string value. + */ + default String getTextValue() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + /** + * Method sets the parent item for all descendents of the current item. + */ + default void addParentToDescendants() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } } diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java index b2795372b..97c24d8e4 100644 --- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java +++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java @@ -61,6 +61,7 @@ import org.rumbledb.runtime.functions.io.ParseJsonFunctionIterator; import org.rumbledb.runtime.functions.io.TraceFunctionIterator; import org.rumbledb.runtime.functions.io.UnparsedTextFunctionIterator; +import org.rumbledb.runtime.functions.io.XmlDocFunctionIterator; import org.rumbledb.runtime.functions.io.YamlDocFunctionIterator; import org.rumbledb.runtime.functions.nullable.IsNullIterator; import org.rumbledb.runtime.functions.numerics.AbsFunctionIterator; @@ -471,6 +472,13 @@ private static BuiltinFunction createBuiltinFunction( ParseJsonFunctionIterator.class, BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); + static final BuiltinFunction xml_doc = createBuiltinFunction( + new Name(Name.FN_NS, "fn", "xml-doc"), + "string", + "item*", + XmlDocFunctionIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); /** * function that parses a text file @@ -3087,6 +3095,7 @@ private static BuiltinFunction createBuiltinFunction( random_sequence_with_bounds_seeded_int.getIdentifier(), random_sequence_with_bounds_seeded_int ); + builtinFunctions.put(xml_doc.getIdentifier(), xml_doc); } diff --git a/src/main/java/org/rumbledb/items/ItemFactory.java b/src/main/java/org/rumbledb/items/ItemFactory.java index c81854cd4..885744d74 100644 --- a/src/main/java/org/rumbledb/items/ItemFactory.java +++ b/src/main/java/org/rumbledb/items/ItemFactory.java @@ -4,7 +4,12 @@ import org.joda.time.Period; import org.rumbledb.api.Item; import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.items.xml.AttributeItem; +import org.rumbledb.items.xml.DocumentItem; +import org.rumbledb.items.xml.ElementItem; +import org.rumbledb.items.xml.TextItem; import org.rumbledb.types.ItemType; +import org.w3c.dom.Node; import java.math.BigDecimal; import java.math.BigInteger; @@ -221,4 +226,19 @@ public Item createObjectItem(Map> keyValuePairs) { return new ObjectItem(keyValuePairs); } + public Item createXmlTextNode(Node currentNode) { + return new TextItem(currentNode.getTextContent()); + } + + public Item createXmlAttributeNode(Node attribute) { + return new AttributeItem(attribute.getNodeName(), attribute.getNodeValue()); + } + + public Item createXmlDocumentNode(List children) { + return new DocumentItem(children); + } + + public Item createXmlElementNode(List children, List attributes, String nodeName) { + return new ElementItem(children, attributes, nodeName); + } } diff --git a/src/main/java/org/rumbledb/items/parsing/ItemParser.java b/src/main/java/org/rumbledb/items/parsing/ItemParser.java index 0229a7955..5ad6c8c7a 100644 --- a/src/main/java/org/rumbledb/items/parsing/ItemParser.java +++ b/src/main/java/org/rumbledb/items/parsing/ItemParser.java @@ -20,6 +20,9 @@ package org.rumbledb.items.parsing; +import com.fasterxml.jackson.dataformat.yaml.YAMLParser; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; import org.apache.commons.codec.binary.Hex; import org.apache.spark.ml.linalg.DenseVector; import org.apache.spark.ml.linalg.SparseVector; @@ -39,13 +42,12 @@ import org.rumbledb.exceptions.ParsingException; import org.rumbledb.exceptions.RumbleException; import org.rumbledb.items.ItemFactory; - -import com.fasterxml.jackson.dataformat.yaml.YAMLParser; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonToken; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.FieldDescriptor; import org.rumbledb.types.ItemType; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import scala.collection.mutable.WrappedArray; import sparksoniq.spark.SparkSessionManager; @@ -581,4 +583,68 @@ private static Item convertValueToItem( throw new RuntimeException("DataFrame type unsupported: " + fieldType.json()); } } + + /** + * Parses an XML document to an item. + * + * @param currentNode The current node + * @return the parsed item + */ + public static Item getItemFromXML(Node currentNode) { + if (currentNode.getNodeType() == Node.TEXT_NODE) { + return getTextNodeItem(currentNode); + } else if (currentNode.getNodeType() == Node.DOCUMENT_NODE) { + return getDocumentNodeItem(currentNode); + } + return getElementNodeItem(currentNode); + } + + private static List getChildren(Node currentNode) { + List children = new ArrayList<>(); + NodeList nodeList = currentNode.getChildNodes(); + for (int i = 0; i < nodeList.getLength(); ++i) { + Node childNode = nodeList.item(i); + if (childNode.getNodeType() == Node.ELEMENT_NODE) { + children.add(getItemFromXML(childNode)); + } else if (childNode.getNodeType() == Node.TEXT_NODE) { + children.add(ItemFactory.getInstance().createXmlTextNode(childNode)); + } + } + return children; + } + + private static List getAttributes(Node currentNode) { + List attributes = new ArrayList<>(); + NamedNodeMap attributesMap = currentNode.getAttributes(); + + for (int i = 0; i < attributesMap.getLength(); ++i) { + Node attribute = attributesMap.item(i); + attributes.add(ItemFactory.getInstance().createXmlAttributeNode(attribute)); + } + return attributes; + } + + private static Item getDocumentNodeItem(Node currentNode) { + List children = getChildren(currentNode); + Item documentItem = ItemFactory.getInstance().createXmlDocumentNode(children); + addParentToChildrenAndAttributes(documentItem); + return documentItem; + } + + private static Item getElementNodeItem(Node currentNode) { + List children = getChildren(currentNode); + List attributes = getAttributes(currentNode); + Item elementItem = ItemFactory.getInstance() + .createXmlElementNode(children, attributes, currentNode.getNodeName()); + addParentToChildrenAndAttributes(elementItem); + return elementItem; + } + + private static void addParentToChildrenAndAttributes(Item nodeItem) { + nodeItem.addParentToDescendants(); + } + + private static Item getTextNodeItem(Node currentNode) { + return ItemFactory.getInstance().createXmlTextNode(currentNode); + } } diff --git a/src/main/java/org/rumbledb/items/xml/AttributeItem.java b/src/main/java/org/rumbledb/items/xml/AttributeItem.java new file mode 100644 index 000000000..491405ba8 --- /dev/null +++ b/src/main/java/org/rumbledb/items/xml/AttributeItem.java @@ -0,0 +1,69 @@ +package org.rumbledb.items.xml; + +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; +import org.rumbledb.api.Item; +import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.ItemType; + +public class AttributeItem implements NodeItem { + private String nodeName; + private String nodeValue; + private Item parent; + // TODO: add schema-type, typed-value, is-id, is-idrefs + + public AttributeItem(String nodeName, String nodeValue) { + this.nodeName = nodeName; + this.nodeValue = nodeValue; + } + + @Override + public void write(Kryo kryo, Output output) { + kryo.writeObject(output, this.parent); + kryo.writeObject(output, this.nodeName); + kryo.writeObject(output, this.nodeValue); + } + + @Override + public void read(Kryo kryo, Input input) { + this.parent = kryo.readObject(input, Item.class); + this.nodeName = kryo.readObject(input, String.class); + this.nodeValue = kryo.readObject(input, String.class); + } + + @Override + public boolean nilled() { + return false; + } + + @Override + public String nodeKind() { + return "attribute"; + } + + @Override + public String nodeName() { + return this.nodeName; + } + + @Override + public Item parent() { + return this.parent; + } + + @Override + public String stringValue() { + return this.nodeValue; + } + + @Override + public void setParent(NodeItem parent) { + this.parent = parent; + } + + @Override + public ItemType getDynamicType() { + return BuiltinTypesCatalogue.item; + } +} diff --git a/src/main/java/org/rumbledb/items/xml/DocumentItem.java b/src/main/java/org/rumbledb/items/xml/DocumentItem.java new file mode 100644 index 000000000..9f075affa --- /dev/null +++ b/src/main/java/org/rumbledb/items/xml/DocumentItem.java @@ -0,0 +1,73 @@ +package org.rumbledb.items.xml; + +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; +import org.rumbledb.api.Item; +import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.ItemType; + +import java.util.ArrayList; +import java.util.List; + +public class DocumentItem implements NodeItem { + private List children; + // TODO: add base-uri, document-uri, typed-value + + public DocumentItem(List children) { + this.children = children; + } + + @Override + public void addParentToDescendants() { + this.children.forEach(child -> ((NodeItem) child).setParent(this)); + } + + @Override + public void write(Kryo kryo, Output output) { + kryo.writeObject(output, children); + } + + @SuppressWarnings("unchecked") + @Override + public void read(Kryo kryo, Input input) { + this.children = kryo.readObject(input, ArrayList.class); + } + + @Override + public List children() { + return this.children; + } + + @Override + public boolean nilled() { + return false; + } + + @Override + public String nodeKind() { + return "document"; + } + + @Override + public Item parent() { + return null; + } + + @Override + public String stringValue() { + StringBuffer result = new StringBuffer(); + this.children.forEach(child -> { + String childStringValue = child.getStringValue(); + if (!childStringValue.isEmpty()) { + result.append(childStringValue); + } + }); + return result.toString(); + } + + @Override + public ItemType getDynamicType() { + return BuiltinTypesCatalogue.item; + } +} diff --git a/src/main/java/org/rumbledb/items/xml/ElementItem.java b/src/main/java/org/rumbledb/items/xml/ElementItem.java new file mode 100644 index 000000000..54156c328 --- /dev/null +++ b/src/main/java/org/rumbledb/items/xml/ElementItem.java @@ -0,0 +1,125 @@ +package org.rumbledb.items.xml; + +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; +import org.rumbledb.api.Item; +import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.ItemType; + +import java.util.ArrayList; +import java.util.List; + +public class ElementItem implements NodeItem { + private List children; + private List attributes; + private String nodeName; + private Item parent; + // TODO: add base-uri, schema-type, namespaces, is-id, is-idrefs + + public ElementItem(List children, List attributes, String nodeName) { + this.children = children; + this.attributes = attributes; + this.nodeName = nodeName; + } + + @Override + public void addParentToDescendants() { + this.children.forEach(child -> ((NodeItem) child).setParent(this)); + this.attributes.forEach(attribute -> ((NodeItem) attribute).setParent(this)); + } + + private void setParent(Item parent) { + this.parent = parent; + } + + @Override + public void write(Kryo kryo, Output output) { + kryo.writeObject(output, this.children); + kryo.writeObject(output, this.attributes); + kryo.writeObject(output, this.parent); + kryo.writeObject(output, this.nodeName); + } + + @SuppressWarnings("unchecked") + @Override + public void read(Kryo kryo, Input input) { + this.children = kryo.readObject(input, ArrayList.class); + this.attributes = kryo.readObject(input, ArrayList.class); + this.parent = kryo.readObject(input, NodeItem.class); + this.nodeName = kryo.readObject(input, String.class); + } + + @Override + public boolean isElement() { + return true; + } + + + + @Override + public boolean equals(Object otherItem) { + if (!(otherItem instanceof NodeItem)) { + return false; + } + NodeItem o = (NodeItem) otherItem; + if (!o.isElement()) { + return false; + } + // TODO: Compare each element + return true; + } + + @Override + public List attributes() { + return this.attributes; + } + + @Override + public List children() { + return this.children; + } + + @Override + public boolean nilled() { + return false; + } + + @Override + public String nodeKind() { + return "element"; + } + + @Override + public String nodeName() { + return this.nodeName; + } + + @Override + public Item parent() { + return this.parent; + } + + + @Override + public String stringValue() { + StringBuffer result = new StringBuffer(); + this.children.forEach(child -> { + String childStringValue = child.getStringValue(); + if (!childStringValue.isEmpty()) { + result.append(childStringValue); + } + }); + return result.toString(); + } + + @Override + public ItemType getDynamicType() { + return BuiltinTypesCatalogue.item; + } + + @Override + public void setParent(NodeItem parent) { + this.parent = parent; + } +} diff --git a/src/main/java/org/rumbledb/items/xml/NodeItem.java b/src/main/java/org/rumbledb/items/xml/NodeItem.java new file mode 100644 index 000000000..61803854a --- /dev/null +++ b/src/main/java/org/rumbledb/items/xml/NodeItem.java @@ -0,0 +1,78 @@ +package org.rumbledb.items.xml; + +import org.rumbledb.api.Item; +import org.rumbledb.types.ItemType; + +import java.util.ArrayList; +import java.util.List; + +public interface NodeItem extends Item { + default List attributes() { + return new ArrayList<>(); + } + + default String baseUri() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default List children() { + return new ArrayList<>(); + } + + default String documentUri() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default boolean isId() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default boolean isIdRefs() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default List namespaceNodes() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default boolean nilled() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default String nodeKind() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default String nodeName() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default Item parent() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default String stringValue() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default String typeName() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default ItemType typedValue() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default String unparsedEntityPublicId() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default String unparsedEntityServerId() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default void setParent(NodeItem parent) { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + +} diff --git a/src/main/java/org/rumbledb/items/xml/TextItem.java b/src/main/java/org/rumbledb/items/xml/TextItem.java new file mode 100644 index 000000000..d4c05e271 --- /dev/null +++ b/src/main/java/org/rumbledb/items/xml/TextItem.java @@ -0,0 +1,93 @@ +package org.rumbledb.items.xml; + +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; +import org.rumbledb.api.Item; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.expressions.comparison.ComparisonExpression; +import org.rumbledb.runtime.misc.ComparisonIterator; +import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.ItemType; + +public class TextItem implements NodeItem { + private static final long serialVersionUID = 1L; + private String content; + private NodeItem parent; + + public TextItem() { + super(); + } + + public TextItem(String content) { + super(); + this.content = content; + } + + @Override + public void setParent(NodeItem parent) { + this.parent = parent; + } + + @Override + public boolean equals(Object otherItem) { + if (otherItem instanceof Item) { + long c = ComparisonIterator.compareItems( + this, + (Item) otherItem, + ComparisonExpression.ComparisonOperator.VC_EQ, + ExceptionMetadata.EMPTY_METADATA + ); + return c == 0; + } + return false; + } + + @Override + public String getTextValue() { + return this.content; + } + + public boolean getEffectiveBooleanValue() { + return !this.getTextValue().isEmpty(); + } + + @Override + public void write(Kryo kryo, Output output) { + output.writeString(this.getTextValue()); + } + + @Override + public void read(Kryo kryo, Input input) { + this.content = input.readString(); + } + + public int hashCode() { + return getTextValue().hashCode(); + } + + @Override + public boolean nilled() { + return false; + } + + @Override + public String nodeKind() { + return "text"; + } + + @Override + public String stringValue() { + return this.content; + } + + @Override + public Item parent() { + return this.parent; + } + + @Override + public ItemType getDynamicType() { + return BuiltinTypesCatalogue.item; + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java new file mode 100644 index 000000000..ec3b48c3e --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java @@ -0,0 +1,69 @@ +package org.rumbledb.runtime.functions.io; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.IteratorFlowException; +import org.rumbledb.exceptions.OurBadException; +import org.rumbledb.items.parsing.ItemParser; +import org.rumbledb.runtime.RuntimeIterator; +import org.rumbledb.runtime.functions.base.LocalFunctionCallIterator; +import org.rumbledb.runtime.functions.input.FileSystemUtil; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.util.List; + +public class XmlDocFunctionIterator extends LocalFunctionCallIterator { + private static final long serialVersionUID = 1L; + private RuntimeIterator pathIterator; + + public XmlDocFunctionIterator(List parameters, RuntimeStaticContext staticContext) { + super(parameters, staticContext); + } + + @Override + public void open(DynamicContext context) { + super.open(context); + this.pathIterator = this.children.get(0); + this.pathIterator.open(this.currentDynamicContextForLocalExecution); + this.hasNext = this.pathIterator.hasNext(); + this.pathIterator.close(); + } + + @Override + public Item next() { + if (this.hasNext) { + this.hasNext = false; + Item path = this.pathIterator.materializeFirstItemOrNull(this.currentDynamicContextForLocalExecution); + try { + URI uri = FileSystemUtil.resolveURI(this.staticURI, path.getStringValue(), getMetadata()); + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + InputStream xmlFileStream = FileSystemUtil.getDataInputStream( + uri, + this.currentDynamicContextForLocalExecution.getRumbleRuntimeConfiguration(), + getMetadata() + ); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + Document xmlDocument = documentBuilder.parse(xmlFileStream); + Item res = ItemParser.getItemFromXML(xmlDocument.getDocumentElement()); + return res; + } catch (IteratorFlowException e) { + throw new IteratorFlowException(e.getJSONiqErrorMessage(), getMetadata()); + } catch (ParserConfigurationException e) { + throw new OurBadException("Document builder creation failed with: " + e); + } catch (IOException e) { + throw new RuntimeException("IOException while reading XML document." + e); + } catch (SAXException e) { + throw new RuntimeException("SAXException while reading XML document." + e); + } + } + throw new IteratorFlowException(RuntimeIterator.FLOW_EXCEPTION_MESSAGE + " xml-doc function", getMetadata()); + } +} diff --git a/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java b/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java index b4bfd4578..8dd71cde8 100644 --- a/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java +++ b/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java @@ -364,6 +364,11 @@ public static long compareItems( String r = right.getStringValue(); return processString(l, r); } + if (left.getContent() && right.getContent()) { + String l = left.getTextValue(); + String r = right.getTextValue(); + return processString(l, r); + } return Long.MIN_VALUE; } diff --git a/src/test/resources/queries/xml/books.xml b/src/test/resources/queries/xml/books.xml new file mode 100644 index 000000000..c2c39f9e1 --- /dev/null +++ b/src/test/resources/queries/xml/books.xml @@ -0,0 +1,36 @@ + + + + + Everyday Italian + Giada De Laurentiis + 2005 + 30.00 + + + + Harry Potter + J K. Rowling + 2005 + 29.99 + + + + XQuery Kick Start + James McGovern + Per Bothner + Kurt Cagle + James Linn + Vaidyanathan Nagarajan + 2003 + 49.99 + + + + Learning XML + Erik T. Ray + 2003 + 39.95 + + + \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/FunctionXPath/FunctionXmlDoc.jq b/src/test/resources/test_files/runtime/FunctionXPath/FunctionXmlDoc.jq new file mode 100644 index 000000000..2c9da0cbe --- /dev/null +++ b/src/test/resources/test_files/runtime/FunctionXPath/FunctionXmlDoc.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="3" :) +xml-doc("../../../queries/xml/books.xml") From 2adf7075be47ab51c99438ad2a3185f5da8b7555 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 18 Jul 2024 07:50:58 +0200 Subject: [PATCH 31/56] Removed whitespace-only nodes from tree --- .../rumbledb/items/parsing/ItemParser.java | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/rumbledb/items/parsing/ItemParser.java b/src/main/java/org/rumbledb/items/parsing/ItemParser.java index 5ad6c8c7a..b41539f57 100644 --- a/src/main/java/org/rumbledb/items/parsing/ItemParser.java +++ b/src/main/java/org/rumbledb/items/parsing/ItemParser.java @@ -591,7 +591,7 @@ private static Item convertValueToItem( * @return the parsed item */ public static Item getItemFromXML(Node currentNode) { - if (currentNode.getNodeType() == Node.TEXT_NODE) { + if (currentNode.getNodeType() == Node.TEXT_NODE && !hasWhitespaceText(currentNode)) { return getTextNodeItem(currentNode); } else if (currentNode.getNodeType() == Node.DOCUMENT_NODE) { return getDocumentNodeItem(currentNode); @@ -599,6 +599,28 @@ public static Item getItemFromXML(Node currentNode) { return getElementNodeItem(currentNode); } + private static Item getDocumentNodeItem(Node currentNode) { + List children = getChildren(currentNode); + Item documentItem = ItemFactory.getInstance().createXmlDocumentNode(children); + addParentToChildrenAndAttributes(documentItem); + return documentItem; + } + + private static Item getElementNodeItem(Node currentNode) { + List children = getChildren(currentNode); + List attributes = getAttributes(currentNode); + Item elementItem = ItemFactory.getInstance() + .createXmlElementNode(children, attributes, currentNode.getNodeName()); + addParentToChildrenAndAttributes(elementItem); + return elementItem; + } + + private static boolean hasWhitespaceText(Node currentNode) { + String content = currentNode.getTextContent(); + content = content.replaceAll("[\\r\\n]+\\s", ""); + return content.trim().isEmpty(); + } + private static List getChildren(Node currentNode) { List children = new ArrayList<>(); NodeList nodeList = currentNode.getChildNodes(); @@ -606,7 +628,7 @@ private static List getChildren(Node currentNode) { Node childNode = nodeList.item(i); if (childNode.getNodeType() == Node.ELEMENT_NODE) { children.add(getItemFromXML(childNode)); - } else if (childNode.getNodeType() == Node.TEXT_NODE) { + } else if (childNode.getNodeType() == Node.TEXT_NODE && !hasWhitespaceText(childNode)) { children.add(ItemFactory.getInstance().createXmlTextNode(childNode)); } } @@ -624,22 +646,6 @@ private static List getAttributes(Node currentNode) { return attributes; } - private static Item getDocumentNodeItem(Node currentNode) { - List children = getChildren(currentNode); - Item documentItem = ItemFactory.getInstance().createXmlDocumentNode(children); - addParentToChildrenAndAttributes(documentItem); - return documentItem; - } - - private static Item getElementNodeItem(Node currentNode) { - List children = getChildren(currentNode); - List attributes = getAttributes(currentNode); - Item elementItem = ItemFactory.getInstance() - .createXmlElementNode(children, attributes, currentNode.getNodeName()); - addParentToChildrenAndAttributes(elementItem); - return elementItem; - } - private static void addParentToChildrenAndAttributes(Item nodeItem) { nodeItem.addParentToDescendants(); } From b53e077af5aebfa728b7dbd3fd9c393aed1ffd98 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 18 Jul 2024 14:14:51 +0200 Subject: [PATCH 32/56] Updated grammar to include XPath --- src/main/java/org/rumbledb/parser/Jsoniq.g4 | 215 +++++++++++++++++++- 1 file changed, 211 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.g4 b/src/main/java/org/rumbledb/parser/Jsoniq.g4 index 56f30d4bb..dbeb7d140 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.g4 +++ b/src/main/java/org/rumbledb/parser/Jsoniq.g4 @@ -342,6 +342,179 @@ copyDecl : var_ref=varRef ':=' src_expr=exprSingle; // TODO: Direct element constructors + +///////////////////////// XPath and XQuery + +// Mostly taken from http://www.w3.org/TR/xquery/#id-grammar, with some +// simplifications: +// +// 1. The parser itself doesn't really enforce ws:explicit except for some easy +// cases (QNames and wildcards). Walkers will need to do this (and also parse +// wildcards a bit). +// +// 2. When collecting element content, we will need to check the HIDDEN +// channel as well, for whitespace and XQuery comments (these should be +// treated as regular text inside elements). + +// MODULE HEADER /////////////////////////////////////////////////////////////// + +// Replace according to https://www.w3.org/TR/xquery-31/#id-query-prolog, we only have single mainModule + +schemaImport: Kimport Kschema + schemaPrefix? + nsURI=uriLiteral + (Kat locations+=uriLiteral (',' locations+=uriLiteral)*)? ; + +schemaPrefix: (Knamespace NCName '=' | Kdefault Kelement Knamespace) ; + +// PATHS /////////////////////////////////////////////////////////////////////// + +pathExpr: (Kslash singleslash=relativePathExpr?) | (Kdslash doubleslash=relativePathExpr) | relative=relativePathExpr ; + +relativePathExpr: stepExpr (sep=(Kslash|Kdslash) stepExpr)* ; + +stepExpr: postfixExpr | axisStep ; + +axisStep: (reverseStep | forwardStep) predicateList ; + +forwardStep: forwardAxis nodeTest | abbrevForwardStep ; + +forwardAxis: ( Kchild + | Kdescendant + | Kattribute + | Kself + | Kdescendant_or_self + | Kfollowing_sibling + | Kfollowing ) ':' ':' ; + +abbrevForwardStep: Kat_symbol ? nodeTest ; + +reverseStep: reverseAxis nodeTest | abbrevReverseStep ; + +reverseAxis: ( Kparent + | Kancestor + | Kpreceding_sibling + | Kpreceding + | Kancestor_or_self ) ':' ':'; + +abbrevReverseStep: '..' ; + +nodeTest: nameTest | kindTest ; + +nameTest: qname wildcard ; + +wildcard: '*' # allNames + | nCNameWithLocalWildcard # allWithNS // walkers must strip out the trailing :* + | nCNameWithPrefixWildcard # allWithLocal // walkers must strip out the leading *: + ; +nCNameWithLocalWildcard : NCName ':' '*' ; +nCNameWithPrefixWildcard: '*' ':' NCName ; + +postfixExpr: main_expr=primaryExpr (predicate | argumentList | lookup)* ; + +predicateList: predicate*; + +lookup: '?' keySpecifier ; + +keySpecifier: NCName | IntegerLiteral | parenthesizedExpr | '*' ; + +typeDeclaration: Kas sequenceType ; + +itemType: qname + | NullLiteral + | kindTest + | ('item' '(' ')') + | functionTest + | mapTest + | arrayTest + | atomicOrUnionType + | parenthesizedItemTest ; + +atomicOrUnionType: qname ; + +kindTest: documentTest + | elementTest + | attributeTest + | schemaElementTest + | schemaAttributeTest + | piTest + | commentTest + | textTest + | namespaceNodeTest + | mlNodeTest + | binaryNodeTest + | anyKindTest + ; + +anyKindTest: Knode '(' '*'? ')' ; + +binaryNodeTest: Kbinary '(' ')' ; + +documentTest: Kdocument_node '(' (elementTest | schemaElementTest)? ')' ; + +textTest: Ktext '(' ')' ; + +commentTest: Kcomment '(' ')' ; + +namespaceNodeTest: Knamespace_node '(' ')' ; + +piTest: Kpi '(' (NCName | stringLiteral)? ')' ; + +attributeTest: Kattribute '(' (attributeNameOrWildcard (',' type=typeName)?)? ')' ; + +attributeNameOrWildcard: attributeName | '*' ; + +schemaAttributeTest: Kschema_attribute '(' attributeDeclaration ')' ; + +elementTest: Kelement '(' (elementNameOrWildcard (',' typeName optional='?'?)?)? ')' ; + +elementNameOrWildcard: elementName | '*' ; + +schemaElementTest: Kschema_element '(' elementDeclaration ')' ; + +elementDeclaration: elementName ; + +attributeName: qname ; + +elementName: qname ; + +simpleTypeName: typeName ; + +typeName: qname; + +mapTest: anyMapTest | typedMapTest ; + +anyMapTest: Kmap '(' '*' ')' ; + +typedMapTest: Kmap '(' qname ',' sequenceType ')' ; + +arrayTest: anyArrayTest | typedArrayTest ; + +anyArrayTest: Karray '(' '*' ')' ; + +typedArrayTest: Karray '(' sequenceType ')' ; + +parenthesizedItemTest: '(' itemType ')' ; + +attributeDeclaration: attributeName ; + +mlNodeTest: mlArrayNodeTest + | mlObjectNodeTest + | mlNumberNodeTest + | mlBooleanNodeTest + | mlNullNodeTest + ; + +mlArrayNodeTest: Karray_node '(' stringLiteral? ')' ; + +mlObjectNodeTest: Kobject_node '(' stringLiteral? ')' ; + +mlNumberNodeTest: Knumber_node '(' stringLiteral? ')' ; + +mlBooleanNodeTest: Kboolean_node '(' stringLiteral? ')' ; + +mlNullNodeTest: Knull_node '(' stringLiteral? ')' ; + ///////////////////////// Types sequenceType : '(' ')' @@ -350,10 +523,6 @@ sequenceType : '(' ')' objectConstructor : '{' ( pairConstructor (',' pairConstructor)* )? '}' | merge_operator+='{|' expr '|}'; -itemType : qname - | NullLiteral - | functionTest; - functionTest : (anyFunctionTest | typedFunctionTest); anyFunctionTest : 'function' '(' '*' ')'; @@ -587,6 +756,44 @@ Kexit : 'exit' ; Kreturning : 'returning' ; Kwhile : 'while' ; +///////////////////////// XPath +Kimport : 'import'; +Kschema : 'schema'; +Knamespace : 'namespace'; +Kelement : 'element'; +Kslash : '/'; +Kdslash : '//'; +Kat_symbol : '@'; +Kchild : 'child'; +Kdescendant : 'descendant'; +Kattribute : 'attribute'; +Kself : 'self'; +Kdescendant_or_self : 'descendant-or-self'; +Kfollowing_sibling : 'following-sibling'; +Kfollowing : 'following'; +Kparent : 'parent'; +Kancestor : 'ancestor'; +Kpreceding_sibling : 'preceding-sibling'; +Kpreceding : 'preceding'; +Kancestor_or_self : 'ancestor-or-self'; +Knode : 'node'; +Kbinary : 'binary'; +Kdocument : 'document'; +Kdocument_node : 'document-node'; +Ktext : 'text'; +Kpi : 'processing-instruction'; +Knamespace_node : 'namespace-node'; +Kschema_attribute : 'schema-attribute'; +Kschema_element : 'schema-element'; +Karray_node : 'array-node'; +Kboolean_node : 'boolean-node'; +Knull_node : 'null-node'; +Knumber_node : 'number-node'; +Kobject_node : 'object-node'; +Kcomment : 'comment'; +Karray : 'array'; +Kmap : 'map'; + STRING : '"' (ESC | ~ ["\\])* '"'; fragment ESC : '\\' (["\\/bfnrt] | UNICODE); From 19da620d29ffa7b76264bfbfe72196f80b6a4b39 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Sun, 21 Jul 2024 14:32:57 +0200 Subject: [PATCH 33/56] Refactored items to include node instance --- src/main/java/org/rumbledb/api/Item.java | 69 ++++++++++++++++ .../java/org/rumbledb/items/ItemFactory.java | 12 +-- .../rumbledb/items/parsing/ItemParser.java | 4 +- .../org/rumbledb/items/xml/AttributeItem.java | 23 +++--- .../org/rumbledb/items/xml/DocumentItem.java | 22 +++--- .../org/rumbledb/items/xml/ElementItem.java | 41 ++++------ .../java/org/rumbledb/items/xml/NodeItem.java | 78 ------------------- .../java/org/rumbledb/items/xml/TextItem.java | 23 +++--- 8 files changed, 126 insertions(+), 146 deletions(-) delete mode 100644 src/main/java/org/rumbledb/items/xml/NodeItem.java diff --git a/src/main/java/org/rumbledb/api/Item.java b/src/main/java/org/rumbledb/api/Item.java index 67733eb38..71a69a49a 100644 --- a/src/main/java/org/rumbledb/api/Item.java +++ b/src/main/java/org/rumbledb/api/Item.java @@ -19,6 +19,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -798,4 +799,72 @@ default String getTextValue() { default void addParentToDescendants() { throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); } + + default List attributes() { + return new ArrayList<>(); + } + + default String baseUri() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default List children() { + return new ArrayList<>(); + } + + default String documentUri() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default boolean isId() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default boolean isIdRefs() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default List namespaceNodes() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default boolean nilled() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default String nodeKind() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default String nodeName() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default Item parent() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default String stringValue() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default String typeName() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default ItemType typedValue() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default String unparsedEntityPublicId() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default String unparsedEntityServerId() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default void setParent(Item parent) { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } } diff --git a/src/main/java/org/rumbledb/items/ItemFactory.java b/src/main/java/org/rumbledb/items/ItemFactory.java index 885744d74..b9ed49d85 100644 --- a/src/main/java/org/rumbledb/items/ItemFactory.java +++ b/src/main/java/org/rumbledb/items/ItemFactory.java @@ -227,18 +227,18 @@ public Item createObjectItem(Map> keyValuePairs) { } public Item createXmlTextNode(Node currentNode) { - return new TextItem(currentNode.getTextContent()); + return new TextItem(currentNode); } public Item createXmlAttributeNode(Node attribute) { - return new AttributeItem(attribute.getNodeName(), attribute.getNodeValue()); + return new AttributeItem(attribute); } - public Item createXmlDocumentNode(List children) { - return new DocumentItem(children); + public Item createXmlDocumentNode(Node documentNode, List children) { + return new DocumentItem(documentNode, children); } - public Item createXmlElementNode(List children, List attributes, String nodeName) { - return new ElementItem(children, attributes, nodeName); + public Item createXmlElementNode(Node elementNode, List children, List attributes) { + return new ElementItem(elementNode, children, attributes); } } diff --git a/src/main/java/org/rumbledb/items/parsing/ItemParser.java b/src/main/java/org/rumbledb/items/parsing/ItemParser.java index b41539f57..9c7087ca7 100644 --- a/src/main/java/org/rumbledb/items/parsing/ItemParser.java +++ b/src/main/java/org/rumbledb/items/parsing/ItemParser.java @@ -601,7 +601,7 @@ public static Item getItemFromXML(Node currentNode) { private static Item getDocumentNodeItem(Node currentNode) { List children = getChildren(currentNode); - Item documentItem = ItemFactory.getInstance().createXmlDocumentNode(children); + Item documentItem = ItemFactory.getInstance().createXmlDocumentNode(currentNode, children); addParentToChildrenAndAttributes(documentItem); return documentItem; } @@ -610,7 +610,7 @@ private static Item getElementNodeItem(Node currentNode) { List children = getChildren(currentNode); List attributes = getAttributes(currentNode); Item elementItem = ItemFactory.getInstance() - .createXmlElementNode(children, attributes, currentNode.getNodeName()); + .createXmlElementNode(currentNode, children, attributes); addParentToChildrenAndAttributes(elementItem); return elementItem; } diff --git a/src/main/java/org/rumbledb/items/xml/AttributeItem.java b/src/main/java/org/rumbledb/items/xml/AttributeItem.java index 491405ba8..0c0e290e8 100644 --- a/src/main/java/org/rumbledb/items/xml/AttributeItem.java +++ b/src/main/java/org/rumbledb/items/xml/AttributeItem.java @@ -6,30 +6,27 @@ import org.rumbledb.api.Item; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.ItemType; +import org.w3c.dom.Node; -public class AttributeItem implements NodeItem { - private String nodeName; - private String nodeValue; +public class AttributeItem implements Item { + private Node attributeNode; private Item parent; // TODO: add schema-type, typed-value, is-id, is-idrefs - public AttributeItem(String nodeName, String nodeValue) { - this.nodeName = nodeName; - this.nodeValue = nodeValue; + public AttributeItem(Node attributeNode) { + this.attributeNode = attributeNode; } @Override public void write(Kryo kryo, Output output) { kryo.writeObject(output, this.parent); - kryo.writeObject(output, this.nodeName); - kryo.writeObject(output, this.nodeValue); + kryo.writeObject(output, this.attributeNode); } @Override public void read(Kryo kryo, Input input) { this.parent = kryo.readObject(input, Item.class); - this.nodeName = kryo.readObject(input, String.class); - this.nodeValue = kryo.readObject(input, String.class); + this.attributeNode = kryo.readObject(input, Node.class); } @Override @@ -44,7 +41,7 @@ public String nodeKind() { @Override public String nodeName() { - return this.nodeName; + return this.attributeNode.getNodeName(); } @Override @@ -54,11 +51,11 @@ public Item parent() { @Override public String stringValue() { - return this.nodeValue; + return this.attributeNode.getNodeValue(); } @Override - public void setParent(NodeItem parent) { + public void setParent(Item parent) { this.parent = parent; } diff --git a/src/main/java/org/rumbledb/items/xml/DocumentItem.java b/src/main/java/org/rumbledb/items/xml/DocumentItem.java index 9f075affa..c7d7f24f2 100644 --- a/src/main/java/org/rumbledb/items/xml/DocumentItem.java +++ b/src/main/java/org/rumbledb/items/xml/DocumentItem.java @@ -6,31 +6,36 @@ import org.rumbledb.api.Item; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.ItemType; +import org.w3c.dom.Node; import java.util.ArrayList; import java.util.List; -public class DocumentItem implements NodeItem { +public class DocumentItem implements Item { + private Node documentNode; private List children; // TODO: add base-uri, document-uri, typed-value - public DocumentItem(List children) { + public DocumentItem(Node documentNode, List children) { + this.documentNode = documentNode; this.children = children; } @Override public void addParentToDescendants() { - this.children.forEach(child -> ((NodeItem) child).setParent(this)); + this.children.forEach(child -> child.setParent(this)); } @Override public void write(Kryo kryo, Output output) { - kryo.writeObject(output, children); + kryo.writeObject(output, this.documentNode); + kryo.writeObject(output, this.children); } @SuppressWarnings("unchecked") @Override public void read(Kryo kryo, Input input) { + this.documentNode = kryo.readObject(input, Node.class); this.children = kryo.readObject(input, ArrayList.class); } @@ -56,14 +61,7 @@ public Item parent() { @Override public String stringValue() { - StringBuffer result = new StringBuffer(); - this.children.forEach(child -> { - String childStringValue = child.getStringValue(); - if (!childStringValue.isEmpty()) { - result.append(childStringValue); - } - }); - return result.toString(); + return this.documentNode.getTextContent(); } @Override diff --git a/src/main/java/org/rumbledb/items/xml/ElementItem.java b/src/main/java/org/rumbledb/items/xml/ElementItem.java index 54156c328..365e6cc2f 100644 --- a/src/main/java/org/rumbledb/items/xml/ElementItem.java +++ b/src/main/java/org/rumbledb/items/xml/ElementItem.java @@ -6,48 +6,45 @@ import org.rumbledb.api.Item; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.ItemType; +import org.w3c.dom.Node; import java.util.ArrayList; import java.util.List; -public class ElementItem implements NodeItem { +public class ElementItem implements Item { private List children; private List attributes; - private String nodeName; + private Node elementNode; private Item parent; // TODO: add base-uri, schema-type, namespaces, is-id, is-idrefs - public ElementItem(List children, List attributes, String nodeName) { + public ElementItem(Node elementNode, List children, List attributes) { + this.elementNode = elementNode; this.children = children; this.attributes = attributes; - this.nodeName = nodeName; } @Override public void addParentToDescendants() { - this.children.forEach(child -> ((NodeItem) child).setParent(this)); - this.attributes.forEach(attribute -> ((NodeItem) attribute).setParent(this)); - } - - private void setParent(Item parent) { - this.parent = parent; + this.children.forEach(child -> child.setParent(this)); + this.attributes.forEach(attribute -> attribute.setParent(this)); } @Override public void write(Kryo kryo, Output output) { + kryo.writeObject(output, this.elementNode); kryo.writeObject(output, this.children); kryo.writeObject(output, this.attributes); kryo.writeObject(output, this.parent); - kryo.writeObject(output, this.nodeName); } @SuppressWarnings("unchecked") @Override public void read(Kryo kryo, Input input) { + this.elementNode = kryo.readObject(input, Node.class); this.children = kryo.readObject(input, ArrayList.class); this.attributes = kryo.readObject(input, ArrayList.class); - this.parent = kryo.readObject(input, NodeItem.class); - this.nodeName = kryo.readObject(input, String.class); + this.parent = kryo.readObject(input, Item.class); } @Override @@ -59,10 +56,10 @@ public boolean isElement() { @Override public boolean equals(Object otherItem) { - if (!(otherItem instanceof NodeItem)) { + if (!(otherItem instanceof Item)) { return false; } - NodeItem o = (NodeItem) otherItem; + Item o = (Item) otherItem; if (!o.isElement()) { return false; } @@ -80,6 +77,7 @@ public List children() { return this.children; } + // TODO: may require more checks to comply with the specification using typing. @Override public boolean nilled() { return false; @@ -92,7 +90,7 @@ public String nodeKind() { @Override public String nodeName() { - return this.nodeName; + return this.elementNode.getNodeName(); } @Override @@ -103,14 +101,7 @@ public Item parent() { @Override public String stringValue() { - StringBuffer result = new StringBuffer(); - this.children.forEach(child -> { - String childStringValue = child.getStringValue(); - if (!childStringValue.isEmpty()) { - result.append(childStringValue); - } - }); - return result.toString(); + return this.elementNode.getTextContent(); } @Override @@ -119,7 +110,7 @@ public ItemType getDynamicType() { } @Override - public void setParent(NodeItem parent) { + public void setParent(Item parent) { this.parent = parent; } } diff --git a/src/main/java/org/rumbledb/items/xml/NodeItem.java b/src/main/java/org/rumbledb/items/xml/NodeItem.java deleted file mode 100644 index 61803854a..000000000 --- a/src/main/java/org/rumbledb/items/xml/NodeItem.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.rumbledb.items.xml; - -import org.rumbledb.api.Item; -import org.rumbledb.types.ItemType; - -import java.util.ArrayList; -import java.util.List; - -public interface NodeItem extends Item { - default List attributes() { - return new ArrayList<>(); - } - - default String baseUri() { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - - default List children() { - return new ArrayList<>(); - } - - default String documentUri() { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - - default boolean isId() { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - - default boolean isIdRefs() { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - - default List namespaceNodes() { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - - default boolean nilled() { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - - default String nodeKind() { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - - default String nodeName() { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - - default Item parent() { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - - default String stringValue() { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - - default String typeName() { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - - default ItemType typedValue() { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - - default String unparsedEntityPublicId() { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - - default String unparsedEntityServerId() { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - - default void setParent(NodeItem parent) { - throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); - } - -} diff --git a/src/main/java/org/rumbledb/items/xml/TextItem.java b/src/main/java/org/rumbledb/items/xml/TextItem.java index d4c05e271..25ed93aba 100644 --- a/src/main/java/org/rumbledb/items/xml/TextItem.java +++ b/src/main/java/org/rumbledb/items/xml/TextItem.java @@ -9,23 +9,24 @@ import org.rumbledb.runtime.misc.ComparisonIterator; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.ItemType; +import org.w3c.dom.Node; -public class TextItem implements NodeItem { +public class TextItem implements Item { private static final long serialVersionUID = 1L; - private String content; - private NodeItem parent; + private Node textNode; + private Item parent; public TextItem() { super(); } - public TextItem(String content) { + public TextItem(Node textNode) { super(); - this.content = content; + this.textNode = textNode; } @Override - public void setParent(NodeItem parent) { + public void setParent(Item parent) { this.parent = parent; } @@ -45,7 +46,7 @@ public boolean equals(Object otherItem) { @Override public String getTextValue() { - return this.content; + return this.textNode.getNodeValue(); } public boolean getEffectiveBooleanValue() { @@ -54,12 +55,14 @@ public boolean getEffectiveBooleanValue() { @Override public void write(Kryo kryo, Output output) { - output.writeString(this.getTextValue()); + kryo.writeObject(output, this.textNode); + kryo.writeObject(output, this.parent); } @Override public void read(Kryo kryo, Input input) { - this.content = input.readString(); + this.textNode = kryo.readObject(input, Node.class); + this.parent = kryo.readObject(input, Item.class); } public int hashCode() { @@ -78,7 +81,7 @@ public String nodeKind() { @Override public String stringValue() { - return this.content; + return this.textNode.getTextContent(); } @Override From 8205b1da96e51741b71f9d6de094c19e4ae8120c Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Sun, 21 Jul 2024 15:39:14 +0200 Subject: [PATCH 34/56] Added test for xml --- src/test/java/iq/ReadXMLTests.java | 78 +++++++++++++++++++ .../FunctionXmlDoc1.jq} | 0 .../xml/read-xml/FunctionXmlDoc1.jq | 2 + 3 files changed, 80 insertions(+) create mode 100644 src/test/java/iq/ReadXMLTests.java rename src/test/resources/test_files/{runtime/FunctionXPath/FunctionXmlDoc.jq => xml/FunctionXmlDoc1.jq} (100%) create mode 100644 src/test/resources/test_files/xml/read-xml/FunctionXmlDoc1.jq diff --git a/src/test/java/iq/ReadXMLTests.java b/src/test/java/iq/ReadXMLTests.java new file mode 100644 index 000000000..f6f007b85 --- /dev/null +++ b/src/test/java/iq/ReadXMLTests.java @@ -0,0 +1,78 @@ +package iq; + +import iq.base.AnnotationsTestsBase; +import org.junit.Before; +import org.junit.Test; +import org.rumbledb.api.Item; +import org.rumbledb.api.Rumble; +import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.runtime.functions.input.FileSystemUtil; + +import java.net.URI; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +public class ReadXMLTests extends AnnotationsTestsBase { + private Rumble rumble; + + @Before + public void initializeRumble() { + this.rumble = new Rumble(getConfiguration()); + } + + private URI resolveUri(String path) { + return FileSystemUtil.resolveURIAgainstWorkingDirectory( + path, + getConfiguration(), + ExceptionMetadata.EMPTY_METADATA + ); + } + + @Test(timeout = 100000) + public void testBlockStatementWithSequentialStatement() throws Throwable { + String filePath = System.getProperty("user.dir") + + + "/src/test/resources/test_files/xml/read-xml/FunctionXmlDoc1.jq"; + URI uri = resolveUri(filePath); + SequenceOfItems sequence = this.rumble.runQuery(uri); + sequence.open(); + Item result = sequence.next(); + List children = result.children(); + Item elementNode1 = children.get(0); + Item elementNode2 = children.get(1); + Item elementNode3 = children.get(2); + Item elementNode4 = children.get(3); + String content1 = elementNode1.stringValue().trim().replaceAll("(?<=\\n)\\s+", ""); + String content2 = elementNode2.stringValue().trim().replaceAll("(?<=\\n)\\s+", "");; + String content3 = elementNode3.stringValue().trim().replaceAll("(?<=\\n)\\s+", "");; + String content4 = elementNode4.stringValue().trim().replaceAll("(?<=\\n)\\s+", "");; + Item attribute1 = elementNode1.attributes().get(0); + Item attribute2 = elementNode2.attributes().get(0); + Item attribute3 = elementNode3.attributes().get(0); + Item attribute4 = elementNode4.attributes().get(0); + assertFalse(sequence.hasNext()); + assertEquals(4, children.size()); + assertEquals(4, elementNode1.children().size()); + assertEquals(4, elementNode2.children().size()); + assertEquals(8, elementNode3.children().size()); + assertEquals(4, elementNode4.children().size()); + assertEquals("Everyday Italian\nGiada De Laurentiis\n2005\n30.00", content1); + assertEquals("Harry Potter\nJ K. Rowling\n2005\n29.99", content2); + assertEquals( + "XQuery Kick Start\nJames McGovern\nPer Bothner\nKurt Cagle\nJames Linn\nVaidyanathan Nagarajan\n2003\n49.99", + content3 + ); + assertEquals("Learning XML\nErik T. Ray\n2003\n39.95", content4); + assertEquals("category", attribute1.nodeName()); + assertEquals("category", attribute2.nodeName()); + assertEquals("category", attribute3.nodeName()); + assertEquals("category", attribute4.nodeName()); + assertEquals("cooking", attribute1.stringValue()); + assertEquals("children", attribute2.stringValue()); + assertEquals("web", attribute3.stringValue()); + assertEquals("web", attribute4.stringValue()); + } +} diff --git a/src/test/resources/test_files/runtime/FunctionXPath/FunctionXmlDoc.jq b/src/test/resources/test_files/xml/FunctionXmlDoc1.jq similarity index 100% rename from src/test/resources/test_files/runtime/FunctionXPath/FunctionXmlDoc.jq rename to src/test/resources/test_files/xml/FunctionXmlDoc1.jq diff --git a/src/test/resources/test_files/xml/read-xml/FunctionXmlDoc1.jq b/src/test/resources/test_files/xml/read-xml/FunctionXmlDoc1.jq new file mode 100644 index 000000000..2c9da0cbe --- /dev/null +++ b/src/test/resources/test_files/xml/read-xml/FunctionXmlDoc1.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="3" :) +xml-doc("../../../queries/xml/books.xml") From b0065e7a0cd23281cb0d3773e78e19db14ed4e4a Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Sun, 21 Jul 2024 18:30:28 +0200 Subject: [PATCH 35/56] Generated new parser from grammar --- src/main/java/org/rumbledb/parser/Jsoniq.g4 | 11 +- .../java/org/rumbledb/parser/Jsoniq.interp | 134 +- .../java/org/rumbledb/parser/Jsoniq.tokens | 504 +- .../rumbledb/parser/JsoniqBaseVisitor.java | 382 +- .../org/rumbledb/parser/JsoniqLexer.interp | 118 +- .../java/org/rumbledb/parser/JsoniqLexer.java | 1105 +-- .../org/rumbledb/parser/JsoniqLexer.tokens | 504 +- .../org/rumbledb/parser/JsoniqParser.java | 6905 ++++++++++++----- .../org/rumbledb/parser/JsoniqVisitor.java | 335 +- 9 files changed, 7342 insertions(+), 2656 deletions(-) diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.g4 b/src/main/java/org/rumbledb/parser/Jsoniq.g4 index dbeb7d140..c2a2ebe29 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.g4 +++ b/src/main/java/org/rumbledb/parser/Jsoniq.g4 @@ -373,7 +373,7 @@ pathExpr: (Kslash singleslash=relativePathExpr?) | (Kdslash doubleslash=relative relativePathExpr: stepExpr (sep=(Kslash|Kdslash) stepExpr)* ; -stepExpr: postfixExpr | axisStep ; +stepExpr: postFixExpr | axisStep ; axisStep: (reverseStep | forwardStep) predicateList ; @@ -410,16 +410,9 @@ wildcard: '*' # allNames nCNameWithLocalWildcard : NCName ':' '*' ; nCNameWithPrefixWildcard: '*' ':' NCName ; -postfixExpr: main_expr=primaryExpr (predicate | argumentList | lookup)* ; predicateList: predicate*; -lookup: '?' keySpecifier ; - -keySpecifier: NCName | IntegerLiteral | parenthesizedExpr | '*' ; - -typeDeclaration: Kas sequenceType ; - itemType: qname | NullLiteral | kindTest @@ -466,7 +459,7 @@ attributeNameOrWildcard: attributeName | '*' ; schemaAttributeTest: Kschema_attribute '(' attributeDeclaration ')' ; -elementTest: Kelement '(' (elementNameOrWildcard (',' typeName optional='?'?)?)? ')' ; +elementTest: Kelement '(' (elementNameOrWildcard (',' type=typeName optional='?'?)?)? ')' ; elementNameOrWildcard: elementName | '*' ; diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.interp b/src/main/java/org/rumbledb/parser/Jsoniq.interp index ea32fc013..453c6f6cd 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.interp +++ b/src/main/java/org/rumbledb/parser/Jsoniq.interp @@ -2,7 +2,6 @@ token literal names: null ';' 'module' -'namespace' '=' '$' ':=' @@ -28,13 +27,11 @@ null 'zero-digit' 'digit' 'pattern-separator' -'import' 'external' 'function' 'jsound' 'compact' 'verbose' -'schema' 'eq' 'ne' 'lt' @@ -58,6 +55,7 @@ null '.' '$$' '#' +'..' '{|' '|}' 'for' @@ -132,6 +130,42 @@ null 'exit' 'returning' 'while' +'import' +'schema' +'namespace' +'element' +'/' +'//' +'@' +'child' +'descendant' +'attribute' +'self' +'descendant-or-self' +'following-sibling' +'following' +'parent' +'ancestor' +'preceding-sibling' +'preceding' +'ancestor-or-self' +'node' +'binary' +'document' +'document-node' +'text' +'processing-instruction' +'namespace-node' +'schema-attribute' +'schema-element' +'array-node' +'boolean-node' +'null-node' +'number-node' +'object-node' +'comment' +'array' +'map' null '?' 'null' @@ -205,8 +239,6 @@ null null null null -null -null Kfor Klet Kwhere @@ -279,6 +311,42 @@ Kcontinue Kexit Kreturning Kwhile +Kimport +Kschema +Knamespace +Kelement +Kslash +Kdslash +Kat_symbol +Kchild +Kdescendant +Kattribute +Kself +Kdescendant_or_self +Kfollowing_sibling +Kfollowing +Kparent +Kancestor +Kpreceding_sibling +Kpreceding +Kancestor_or_self +Knode +Kbinary +Kdocument +Kdocument_node +Ktext +Kpi +Knamespace_node +Kschema_attribute +Kschema_element +Karray_node +Kboolean_node +Knull_node +Knumber_node +Kobject_node +Kcomment +Karray +Kmap STRING ArgumentPlaceholder NullLiteral @@ -408,9 +476,61 @@ transformExpr appendExpr updateLocator copyDecl +schemaImport +schemaPrefix +pathExpr +relativePathExpr +stepExpr +axisStep +forwardStep +forwardAxis +abbrevForwardStep +reverseStep +reverseAxis +abbrevReverseStep +nodeTest +nameTest +wildcard +nCNameWithLocalWildcard +nCNameWithPrefixWildcard +predicateList +itemType +atomicOrUnionType +kindTest +anyKindTest +binaryNodeTest +documentTest +textTest +commentTest +namespaceNodeTest +piTest +attributeTest +attributeNameOrWildcard +schemaAttributeTest +elementTest +elementNameOrWildcard +schemaElementTest +elementDeclaration +attributeName +elementName +simpleTypeName +typeName +mapTest +anyMapTest +typedMapTest +arrayTest +anyArrayTest +typedArrayTest +parenthesizedItemTest +attributeDeclaration +mlNodeTest +mlArrayNodeTest +mlObjectNodeTest +mlNumberNodeTest +mlBooleanNodeTest +mlNullNodeTest sequenceType objectConstructor -itemType functionTest anyFunctionTest typedFunctionTest @@ -423,4 +543,4 @@ keyWords atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 146, 1347, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 265, 10, 3, 3, 3, 3, 3, 5, 3, 269, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 285, 10, 6, 3, 6, 3, 6, 7, 6, 289, 10, 6, 12, 6, 14, 6, 292, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 297, 10, 6, 12, 6, 14, 6, 300, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 305, 10, 8, 12, 8, 14, 8, 308, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 315, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 330, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 360, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 368, 10, 18, 12, 18, 14, 18, 371, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 390, 10, 20, 13, 20, 14, 20, 391, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 400, 10, 21, 13, 21, 14, 21, 401, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 410, 10, 22, 13, 22, 14, 22, 411, 3, 23, 3, 23, 3, 23, 5, 23, 417, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 422, 10, 23, 7, 23, 424, 10, 23, 12, 23, 14, 23, 427, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 436, 10, 24, 13, 24, 14, 24, 437, 3, 24, 3, 24, 5, 24, 442, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 451, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 456, 10, 25, 12, 25, 14, 25, 459, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 470, 10, 26, 12, 26, 14, 26, 473, 11, 26, 3, 26, 5, 26, 476, 10, 26, 3, 27, 7, 27, 479, 10, 27, 12, 27, 14, 27, 482, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 489, 10, 28, 12, 28, 14, 28, 492, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 499, 10, 29, 3, 29, 3, 29, 5, 29, 503, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 515, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 527, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 549, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 555, 10, 37, 12, 37, 14, 37, 558, 11, 37, 3, 38, 3, 38, 5, 38, 562, 10, 38, 3, 38, 5, 38, 565, 10, 38, 3, 38, 3, 38, 5, 38, 569, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 578, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 585, 10, 40, 12, 40, 14, 40, 588, 11, 40, 5, 40, 590, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 598, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 605, 10, 41, 5, 41, 607, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 614, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 621, 10, 42, 5, 42, 623, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 631, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 636, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 643, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 650, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 660, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 665, 10, 46, 12, 46, 14, 46, 668, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 674, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 679, 10, 48, 12, 48, 14, 48, 682, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 690, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 700, 10, 50, 3, 51, 3, 51, 5, 51, 704, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 712, 10, 51, 12, 51, 14, 51, 715, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 724, 10, 52, 12, 52, 14, 52, 727, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 732, 10, 53, 3, 53, 3, 53, 5, 53, 736, 10, 53, 3, 53, 3, 53, 5, 53, 740, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 749, 10, 54, 12, 54, 14, 54, 752, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 757, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 770, 10, 57, 12, 57, 14, 57, 773, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 778, 10, 58, 3, 58, 3, 58, 5, 58, 782, 10, 58, 3, 58, 3, 58, 5, 58, 786, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 793, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 798, 10, 59, 12, 59, 14, 59, 801, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 806, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 811, 10, 60, 5, 60, 813, 10, 60, 3, 60, 3, 60, 5, 60, 817, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 824, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 829, 10, 62, 12, 62, 14, 62, 832, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 840, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 850, 10, 64, 13, 64, 14, 64, 851, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 860, 10, 65, 13, 65, 14, 65, 861, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 872, 10, 66, 13, 66, 14, 66, 873, 3, 66, 3, 66, 5, 66, 878, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 887, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 892, 10, 67, 12, 67, 14, 67, 895, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 914, 10, 69, 13, 69, 14, 69, 915, 3, 70, 3, 70, 3, 70, 5, 70, 921, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 926, 10, 70, 7, 70, 928, 10, 70, 12, 70, 14, 70, 931, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 940, 10, 71, 12, 71, 14, 71, 943, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 948, 10, 72, 12, 72, 14, 72, 951, 11, 72, 3, 73, 5, 73, 954, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 961, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 966, 10, 75, 12, 75, 14, 75, 969, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 974, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 979, 10, 77, 12, 77, 14, 77, 982, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 987, 10, 78, 12, 78, 14, 78, 990, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 996, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1002, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1008, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1014, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1020, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1029, 10, 84, 12, 84, 14, 84, 1032, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1037, 10, 85, 3, 86, 7, 86, 1040, 10, 86, 12, 86, 14, 86, 1043, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1050, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1069, 10, 90, 12, 90, 14, 90, 1072, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1080, 10, 91, 12, 91, 14, 91, 1083, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1105, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1122, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1133, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1155, 10, 104, 7, 104, 1157, 10, 104, 12, 104, 14, 104, 1160, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1166, 10, 105, 3, 106, 3, 106, 5, 106, 1170, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1180, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1185, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1199, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1206, 10, 109, 12, 109, 14, 109, 1209, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1214, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1239, 10, 113, 12, 113, 14, 113, 1242, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1258, 10, 115, 13, 115, 14, 115, 1259, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 5, 117, 1272, 10, 117, 5, 117, 1274, 10, 117, 3, 118, 3, 118, 3, 118, 3, 118, 7, 118, 1280, 10, 118, 12, 118, 14, 118, 1283, 11, 118, 5, 118, 1285, 10, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 5, 118, 1292, 10, 118, 3, 119, 3, 119, 3, 119, 5, 119, 1297, 10, 119, 3, 120, 3, 120, 5, 120, 1301, 10, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 7, 122, 1313, 10, 122, 12, 122, 14, 122, 1316, 11, 122, 5, 122, 1318, 10, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 5, 123, 1326, 10, 123, 3, 124, 3, 124, 5, 124, 1330, 10, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 5, 125, 1337, 10, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 2, 2, 129, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 2, 10, 4, 2, 18, 18, 107, 107, 3, 2, 84, 85, 3, 2, 21, 30, 4, 2, 6, 6, 38, 48, 3, 2, 50, 51, 4, 2, 13, 13, 52, 54, 4, 2, 20, 20, 136, 136, 4, 2, 63, 134, 137, 137, 2, 1412, 2, 256, 3, 2, 2, 2, 4, 264, 3, 2, 2, 2, 6, 270, 3, 2, 2, 2, 8, 273, 3, 2, 2, 2, 10, 290, 3, 2, 2, 2, 12, 301, 3, 2, 2, 2, 14, 306, 3, 2, 2, 2, 16, 309, 3, 2, 2, 2, 18, 312, 3, 2, 2, 2, 20, 329, 3, 2, 2, 2, 22, 331, 3, 2, 2, 2, 24, 334, 3, 2, 2, 2, 26, 340, 3, 2, 2, 2, 28, 344, 3, 2, 2, 2, 30, 348, 3, 2, 2, 2, 32, 352, 3, 2, 2, 2, 34, 359, 3, 2, 2, 2, 36, 375, 3, 2, 2, 2, 38, 384, 3, 2, 2, 2, 40, 399, 3, 2, 2, 2, 42, 406, 3, 2, 2, 2, 44, 413, 3, 2, 2, 2, 46, 430, 3, 2, 2, 2, 48, 446, 3, 2, 2, 2, 50, 463, 3, 2, 2, 2, 52, 480, 3, 2, 2, 2, 54, 483, 3, 2, 2, 2, 56, 495, 3, 2, 2, 2, 58, 504, 3, 2, 2, 2, 60, 514, 3, 2, 2, 2, 62, 516, 3, 2, 2, 2, 64, 526, 3, 2, 2, 2, 66, 528, 3, 2, 2, 2, 68, 533, 3, 2, 2, 2, 70, 537, 3, 2, 2, 2, 72, 543, 3, 2, 2, 2, 74, 564, 3, 2, 2, 2, 76, 570, 3, 2, 2, 2, 78, 572, 3, 2, 2, 2, 80, 591, 3, 2, 2, 2, 82, 608, 3, 2, 2, 2, 84, 624, 3, 2, 2, 2, 86, 644, 3, 2, 2, 2, 88, 659, 3, 2, 2, 2, 90, 661, 3, 2, 2, 2, 92, 669, 3, 2, 2, 2, 94, 675, 3, 2, 2, 2, 96, 689, 3, 2, 2, 2, 98, 699, 3, 2, 2, 2, 100, 703, 3, 2, 2, 2, 102, 719, 3, 2, 2, 2, 104, 728, 3, 2, 2, 2, 106, 744, 3, 2, 2, 2, 108, 753, 3, 2, 2, 2, 110, 761, 3, 2, 2, 2, 112, 764, 3, 2, 2, 2, 114, 774, 3, 2, 2, 2, 116, 792, 3, 2, 2, 2, 118, 802, 3, 2, 2, 2, 120, 818, 3, 2, 2, 2, 122, 823, 3, 2, 2, 2, 124, 836, 3, 2, 2, 2, 126, 844, 3, 2, 2, 2, 128, 859, 3, 2, 2, 2, 130, 866, 3, 2, 2, 2, 132, 882, 3, 2, 2, 2, 134, 899, 3, 2, 2, 2, 136, 908, 3, 2, 2, 2, 138, 917, 3, 2, 2, 2, 140, 936, 3, 2, 2, 2, 142, 944, 3, 2, 2, 2, 144, 953, 3, 2, 2, 2, 146, 957, 3, 2, 2, 2, 148, 962, 3, 2, 2, 2, 150, 970, 3, 2, 2, 2, 152, 975, 3, 2, 2, 2, 154, 983, 3, 2, 2, 2, 156, 991, 3, 2, 2, 2, 158, 997, 3, 2, 2, 2, 160, 1003, 3, 2, 2, 2, 162, 1009, 3, 2, 2, 2, 164, 1015, 3, 2, 2, 2, 166, 1021, 3, 2, 2, 2, 168, 1036, 3, 2, 2, 2, 170, 1041, 3, 2, 2, 2, 172, 1049, 3, 2, 2, 2, 174, 1051, 3, 2, 2, 2, 176, 1058, 3, 2, 2, 2, 178, 1065, 3, 2, 2, 2, 180, 1073, 3, 2, 2, 2, 182, 1084, 3, 2, 2, 2, 184, 1090, 3, 2, 2, 2, 186, 1093, 3, 2, 2, 2, 188, 1097, 3, 2, 2, 2, 190, 1121, 3, 2, 2, 2, 192, 1123, 3, 2, 2, 2, 194, 1127, 3, 2, 2, 2, 196, 1130, 3, 2, 2, 2, 198, 1136, 3, 2, 2, 2, 200, 1138, 3, 2, 2, 2, 202, 1143, 3, 2, 2, 2, 204, 1148, 3, 2, 2, 2, 206, 1151, 3, 2, 2, 2, 208, 1165, 3, 2, 2, 2, 210, 1169, 3, 2, 2, 2, 212, 1171, 3, 2, 2, 2, 214, 1175, 3, 2, 2, 2, 216, 1213, 3, 2, 2, 2, 218, 1215, 3, 2, 2, 2, 220, 1219, 3, 2, 2, 2, 222, 1225, 3, 2, 2, 2, 224, 1233, 3, 2, 2, 2, 226, 1248, 3, 2, 2, 2, 228, 1254, 3, 2, 2, 2, 230, 1261, 3, 2, 2, 2, 232, 1273, 3, 2, 2, 2, 234, 1291, 3, 2, 2, 2, 236, 1296, 3, 2, 2, 2, 238, 1300, 3, 2, 2, 2, 240, 1302, 3, 2, 2, 2, 242, 1307, 3, 2, 2, 2, 244, 1323, 3, 2, 2, 2, 246, 1329, 3, 2, 2, 2, 248, 1334, 3, 2, 2, 2, 250, 1340, 3, 2, 2, 2, 252, 1342, 3, 2, 2, 2, 254, 1344, 3, 2, 2, 2, 256, 257, 5, 4, 3, 2, 257, 258, 7, 2, 2, 3, 258, 3, 3, 2, 2, 2, 259, 260, 7, 106, 2, 2, 260, 261, 7, 105, 2, 2, 261, 262, 5, 252, 127, 2, 262, 263, 7, 3, 2, 2, 263, 265, 3, 2, 2, 2, 264, 259, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 269, 5, 8, 5, 2, 267, 269, 5, 6, 4, 2, 268, 266, 3, 2, 2, 2, 268, 267, 3, 2, 2, 2, 269, 5, 3, 2, 2, 2, 270, 271, 5, 10, 6, 2, 271, 272, 5, 12, 7, 2, 272, 7, 3, 2, 2, 2, 273, 274, 7, 4, 2, 2, 274, 275, 7, 5, 2, 2, 275, 276, 7, 144, 2, 2, 276, 277, 7, 6, 2, 2, 277, 278, 5, 250, 126, 2, 278, 279, 7, 3, 2, 2, 279, 280, 5, 10, 6, 2, 280, 9, 3, 2, 2, 2, 281, 285, 5, 60, 31, 2, 282, 285, 5, 62, 32, 2, 283, 285, 5, 78, 40, 2, 284, 281, 3, 2, 2, 2, 284, 282, 3, 2, 2, 2, 284, 283, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 287, 7, 3, 2, 2, 287, 289, 3, 2, 2, 2, 288, 284, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 288, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 298, 3, 2, 2, 2, 292, 290, 3, 2, 2, 2, 293, 294, 5, 64, 33, 2, 294, 295, 7, 3, 2, 2, 295, 297, 3, 2, 2, 2, 296, 293, 3, 2, 2, 2, 297, 300, 3, 2, 2, 2, 298, 296, 3, 2, 2, 2, 298, 299, 3, 2, 2, 2, 299, 11, 3, 2, 2, 2, 300, 298, 3, 2, 2, 2, 301, 302, 5, 18, 10, 2, 302, 13, 3, 2, 2, 2, 303, 305, 5, 20, 11, 2, 304, 303, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 15, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 309, 310, 5, 14, 8, 2, 310, 311, 5, 94, 48, 2, 311, 17, 3, 2, 2, 2, 312, 314, 5, 14, 8, 2, 313, 315, 5, 94, 48, 2, 314, 313, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 19, 3, 2, 2, 2, 316, 330, 5, 22, 12, 2, 317, 330, 5, 24, 13, 2, 318, 330, 5, 26, 14, 2, 319, 330, 5, 28, 15, 2, 320, 330, 5, 30, 16, 2, 321, 330, 5, 32, 17, 2, 322, 330, 5, 34, 18, 2, 323, 330, 5, 36, 19, 2, 324, 330, 5, 38, 20, 2, 325, 330, 5, 42, 22, 2, 326, 330, 5, 46, 24, 2, 327, 330, 5, 54, 28, 2, 328, 330, 5, 58, 30, 2, 329, 316, 3, 2, 2, 2, 329, 317, 3, 2, 2, 2, 329, 318, 3, 2, 2, 2, 329, 319, 3, 2, 2, 2, 329, 320, 3, 2, 2, 2, 329, 321, 3, 2, 2, 2, 329, 322, 3, 2, 2, 2, 329, 323, 3, 2, 2, 2, 329, 324, 3, 2, 2, 2, 329, 325, 3, 2, 2, 2, 329, 326, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 328, 3, 2, 2, 2, 330, 21, 3, 2, 2, 2, 331, 332, 5, 98, 50, 2, 332, 333, 7, 3, 2, 2, 333, 23, 3, 2, 2, 2, 334, 335, 7, 7, 2, 2, 335, 336, 5, 74, 38, 2, 336, 337, 7, 8, 2, 2, 337, 338, 5, 96, 49, 2, 338, 339, 7, 3, 2, 2, 339, 25, 3, 2, 2, 2, 340, 341, 7, 9, 2, 2, 341, 342, 5, 14, 8, 2, 342, 343, 7, 10, 2, 2, 343, 27, 3, 2, 2, 2, 344, 345, 7, 129, 2, 2, 345, 346, 7, 130, 2, 2, 346, 347, 7, 3, 2, 2, 347, 29, 3, 2, 2, 2, 348, 349, 7, 131, 2, 2, 349, 350, 7, 130, 2, 2, 350, 351, 7, 3, 2, 2, 351, 31, 3, 2, 2, 2, 352, 353, 7, 132, 2, 2, 353, 354, 7, 133, 2, 2, 354, 355, 5, 96, 49, 2, 355, 356, 7, 3, 2, 2, 356, 33, 3, 2, 2, 2, 357, 360, 5, 102, 52, 2, 358, 360, 5, 106, 54, 2, 359, 357, 3, 2, 2, 2, 359, 358, 3, 2, 2, 2, 360, 369, 3, 2, 2, 2, 361, 368, 5, 102, 52, 2, 362, 368, 5, 106, 54, 2, 363, 368, 5, 110, 56, 2, 364, 368, 5, 112, 57, 2, 365, 368, 5, 116, 59, 2, 366, 368, 5, 120, 61, 2, 367, 361, 3, 2, 2, 2, 367, 362, 3, 2, 2, 2, 367, 363, 3, 2, 2, 2, 367, 364, 3, 2, 2, 2, 367, 365, 3, 2, 2, 2, 367, 366, 3, 2, 2, 2, 368, 371, 3, 2, 2, 2, 369, 367, 3, 2, 2, 2, 369, 370, 3, 2, 2, 2, 370, 372, 3, 2, 2, 2, 371, 369, 3, 2, 2, 2, 372, 373, 7, 69, 2, 2, 373, 374, 5, 20, 11, 2, 374, 35, 3, 2, 2, 2, 375, 376, 7, 70, 2, 2, 376, 377, 7, 11, 2, 2, 377, 378, 5, 94, 48, 2, 378, 379, 7, 12, 2, 2, 379, 380, 7, 91, 2, 2, 380, 381, 5, 20, 11, 2, 381, 382, 7, 92, 2, 2, 382, 383, 5, 20, 11, 2, 383, 37, 3, 2, 2, 2, 384, 385, 7, 86, 2, 2, 385, 386, 7, 11, 2, 2, 386, 387, 5, 94, 48, 2, 387, 389, 7, 12, 2, 2, 388, 390, 5, 40, 21, 2, 389, 388, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 393, 3, 2, 2, 2, 393, 394, 7, 90, 2, 2, 394, 395, 7, 69, 2, 2, 395, 396, 5, 20, 11, 2, 396, 39, 3, 2, 2, 2, 397, 398, 7, 87, 2, 2, 398, 400, 5, 96, 49, 2, 399, 397, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 401, 402, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 404, 7, 69, 2, 2, 404, 405, 5, 20, 11, 2, 405, 41, 3, 2, 2, 2, 406, 407, 7, 88, 2, 2, 407, 409, 5, 26, 14, 2, 408, 410, 5, 44, 23, 2, 409, 408, 3, 2, 2, 2, 410, 411, 3, 2, 2, 2, 411, 409, 3, 2, 2, 2, 411, 412, 3, 2, 2, 2, 412, 43, 3, 2, 2, 2, 413, 416, 7, 89, 2, 2, 414, 417, 7, 13, 2, 2, 415, 417, 5, 74, 38, 2, 416, 414, 3, 2, 2, 2, 416, 415, 3, 2, 2, 2, 417, 425, 3, 2, 2, 2, 418, 421, 7, 14, 2, 2, 419, 422, 7, 13, 2, 2, 420, 422, 5, 74, 38, 2, 421, 419, 3, 2, 2, 2, 421, 420, 3, 2, 2, 2, 422, 424, 3, 2, 2, 2, 423, 418, 3, 2, 2, 2, 424, 427, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 428, 429, 5, 26, 14, 2, 429, 45, 3, 2, 2, 2, 430, 431, 7, 93, 2, 2, 431, 432, 7, 11, 2, 2, 432, 433, 5, 94, 48, 2, 433, 435, 7, 12, 2, 2, 434, 436, 5, 48, 25, 2, 435, 434, 3, 2, 2, 2, 436, 437, 3, 2, 2, 2, 437, 435, 3, 2, 2, 2, 437, 438, 3, 2, 2, 2, 438, 439, 3, 2, 2, 2, 439, 441, 7, 90, 2, 2, 440, 442, 5, 194, 98, 2, 441, 440, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 444, 7, 69, 2, 2, 444, 445, 5, 20, 11, 2, 445, 47, 3, 2, 2, 2, 446, 450, 7, 87, 2, 2, 447, 448, 5, 194, 98, 2, 448, 449, 7, 72, 2, 2, 449, 451, 3, 2, 2, 2, 450, 447, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 457, 5, 232, 117, 2, 453, 454, 7, 14, 2, 2, 454, 456, 5, 232, 117, 2, 455, 453, 3, 2, 2, 2, 456, 459, 3, 2, 2, 2, 457, 455, 3, 2, 2, 2, 457, 458, 3, 2, 2, 2, 458, 460, 3, 2, 2, 2, 459, 457, 3, 2, 2, 2, 460, 461, 7, 69, 2, 2, 461, 462, 5, 20, 11, 2, 462, 49, 3, 2, 2, 2, 463, 464, 7, 15, 2, 2, 464, 475, 5, 74, 38, 2, 465, 466, 7, 11, 2, 2, 466, 471, 7, 138, 2, 2, 467, 468, 7, 16, 2, 2, 468, 470, 7, 138, 2, 2, 469, 467, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 474, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 474, 476, 7, 12, 2, 2, 475, 465, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 51, 3, 2, 2, 2, 477, 479, 5, 50, 26, 2, 478, 477, 3, 2, 2, 2, 479, 482, 3, 2, 2, 2, 480, 478, 3, 2, 2, 2, 480, 481, 3, 2, 2, 2, 481, 53, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 483, 484, 5, 52, 27, 2, 484, 485, 7, 116, 2, 2, 485, 490, 5, 56, 29, 2, 486, 487, 7, 16, 2, 2, 487, 489, 5, 56, 29, 2, 488, 486, 3, 2, 2, 2, 489, 492, 3, 2, 2, 2, 490, 488, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 493, 3, 2, 2, 2, 492, 490, 3, 2, 2, 2, 493, 494, 7, 3, 2, 2, 494, 55, 3, 2, 2, 2, 495, 498, 5, 194, 98, 2, 496, 497, 7, 72, 2, 2, 497, 499, 5, 232, 117, 2, 498, 496, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 502, 3, 2, 2, 2, 500, 501, 7, 8, 2, 2, 501, 503, 5, 96, 49, 2, 502, 500, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 57, 3, 2, 2, 2, 504, 505, 7, 134, 2, 2, 505, 506, 7, 11, 2, 2, 506, 507, 5, 94, 48, 2, 507, 508, 7, 12, 2, 2, 508, 509, 5, 20, 11, 2, 509, 59, 3, 2, 2, 2, 510, 515, 5, 66, 34, 2, 511, 515, 5, 68, 35, 2, 512, 515, 5, 70, 36, 2, 513, 515, 5, 72, 37, 2, 514, 510, 3, 2, 2, 2, 514, 511, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 514, 513, 3, 2, 2, 2, 515, 61, 3, 2, 2, 2, 516, 517, 7, 113, 2, 2, 517, 518, 7, 5, 2, 2, 518, 519, 7, 144, 2, 2, 519, 520, 7, 6, 2, 2, 520, 521, 5, 250, 126, 2, 521, 63, 3, 2, 2, 2, 522, 527, 5, 84, 43, 2, 523, 527, 5, 80, 41, 2, 524, 527, 5, 86, 44, 2, 525, 527, 5, 82, 42, 2, 526, 522, 3, 2, 2, 2, 526, 523, 3, 2, 2, 2, 526, 524, 3, 2, 2, 2, 526, 525, 3, 2, 2, 2, 527, 65, 3, 2, 2, 2, 528, 529, 7, 113, 2, 2, 529, 530, 7, 90, 2, 2, 530, 531, 7, 83, 2, 2, 531, 532, 5, 250, 126, 2, 532, 67, 3, 2, 2, 2, 533, 534, 7, 113, 2, 2, 534, 535, 7, 17, 2, 2, 535, 536, 9, 2, 2, 2, 536, 69, 3, 2, 2, 2, 537, 538, 7, 113, 2, 2, 538, 539, 7, 90, 2, 2, 539, 540, 7, 68, 2, 2, 540, 541, 7, 75, 2, 2, 541, 542, 9, 3, 2, 2, 542, 71, 3, 2, 2, 2, 543, 548, 7, 113, 2, 2, 544, 545, 7, 19, 2, 2, 545, 549, 5, 74, 38, 2, 546, 547, 7, 90, 2, 2, 547, 549, 7, 19, 2, 2, 548, 544, 3, 2, 2, 2, 548, 546, 3, 2, 2, 2, 549, 556, 3, 2, 2, 2, 550, 551, 5, 76, 39, 2, 551, 552, 7, 6, 2, 2, 552, 553, 5, 252, 127, 2, 553, 555, 3, 2, 2, 2, 554, 550, 3, 2, 2, 2, 555, 558, 3, 2, 2, 2, 556, 554, 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 73, 3, 2, 2, 2, 558, 556, 3, 2, 2, 2, 559, 562, 7, 144, 2, 2, 560, 562, 5, 254, 128, 2, 561, 559, 3, 2, 2, 2, 561, 560, 3, 2, 2, 2, 562, 563, 3, 2, 2, 2, 563, 565, 7, 20, 2, 2, 564, 561, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 568, 3, 2, 2, 2, 566, 569, 7, 144, 2, 2, 567, 569, 5, 254, 128, 2, 568, 566, 3, 2, 2, 2, 568, 567, 3, 2, 2, 2, 569, 75, 3, 2, 2, 2, 570, 571, 9, 4, 2, 2, 571, 77, 3, 2, 2, 2, 572, 573, 7, 31, 2, 2, 573, 577, 7, 4, 2, 2, 574, 575, 7, 5, 2, 2, 575, 576, 7, 144, 2, 2, 576, 578, 7, 6, 2, 2, 577, 574, 3, 2, 2, 2, 577, 578, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 589, 5, 250, 126, 2, 580, 581, 7, 73, 2, 2, 581, 586, 5, 250, 126, 2, 582, 583, 7, 16, 2, 2, 583, 585, 5, 250, 126, 2, 584, 582, 3, 2, 2, 2, 585, 588, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 590, 3, 2, 2, 2, 588, 586, 3, 2, 2, 2, 589, 580, 3, 2, 2, 2, 589, 590, 3, 2, 2, 2, 590, 79, 3, 2, 2, 2, 591, 592, 7, 113, 2, 2, 592, 593, 5, 52, 27, 2, 593, 594, 7, 116, 2, 2, 594, 597, 5, 194, 98, 2, 595, 596, 7, 72, 2, 2, 596, 598, 5, 232, 117, 2, 597, 595, 3, 2, 2, 2, 597, 598, 3, 2, 2, 2, 598, 606, 3, 2, 2, 2, 599, 600, 7, 8, 2, 2, 600, 607, 5, 96, 49, 2, 601, 604, 7, 32, 2, 2, 602, 603, 7, 8, 2, 2, 603, 605, 5, 96, 49, 2, 604, 602, 3, 2, 2, 2, 604, 605, 3, 2, 2, 2, 605, 607, 3, 2, 2, 2, 606, 599, 3, 2, 2, 2, 606, 601, 3, 2, 2, 2, 607, 81, 3, 2, 2, 2, 608, 609, 7, 113, 2, 2, 609, 610, 7, 114, 2, 2, 610, 613, 7, 115, 2, 2, 611, 612, 7, 72, 2, 2, 612, 614, 5, 232, 117, 2, 613, 611, 3, 2, 2, 2, 613, 614, 3, 2, 2, 2, 614, 622, 3, 2, 2, 2, 615, 616, 7, 8, 2, 2, 616, 623, 5, 96, 49, 2, 617, 620, 7, 32, 2, 2, 618, 619, 7, 8, 2, 2, 619, 621, 5, 96, 49, 2, 620, 618, 3, 2, 2, 2, 620, 621, 3, 2, 2, 2, 621, 623, 3, 2, 2, 2, 622, 615, 3, 2, 2, 2, 622, 617, 3, 2, 2, 2, 623, 83, 3, 2, 2, 2, 624, 625, 7, 113, 2, 2, 625, 626, 5, 52, 27, 2, 626, 627, 7, 33, 2, 2, 627, 628, 5, 74, 38, 2, 628, 630, 7, 11, 2, 2, 629, 631, 5, 90, 46, 2, 630, 629, 3, 2, 2, 2, 630, 631, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 635, 7, 12, 2, 2, 633, 634, 7, 72, 2, 2, 634, 636, 5, 232, 117, 2, 635, 633, 3, 2, 2, 2, 635, 636, 3, 2, 2, 2, 636, 642, 3, 2, 2, 2, 637, 638, 7, 9, 2, 2, 638, 639, 5, 18, 10, 2, 639, 640, 7, 10, 2, 2, 640, 643, 3, 2, 2, 2, 641, 643, 7, 32, 2, 2, 642, 637, 3, 2, 2, 2, 642, 641, 3, 2, 2, 2, 643, 85, 3, 2, 2, 2, 644, 645, 7, 113, 2, 2, 645, 646, 7, 110, 2, 2, 646, 647, 5, 74, 38, 2, 647, 649, 7, 72, 2, 2, 648, 650, 5, 88, 45, 2, 649, 648, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 652, 5, 96, 49, 2, 652, 87, 3, 2, 2, 2, 653, 654, 7, 34, 2, 2, 654, 660, 7, 35, 2, 2, 655, 656, 7, 34, 2, 2, 656, 660, 7, 36, 2, 2, 657, 658, 7, 126, 2, 2, 658, 660, 7, 37, 2, 2, 659, 653, 3, 2, 2, 2, 659, 655, 3, 2, 2, 2, 659, 657, 3, 2, 2, 2, 660, 89, 3, 2, 2, 2, 661, 666, 5, 92, 47, 2, 662, 663, 7, 16, 2, 2, 663, 665, 5, 92, 47, 2, 664, 662, 3, 2, 2, 2, 665, 668, 3, 2, 2, 2, 666, 664, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 91, 3, 2, 2, 2, 668, 666, 3, 2, 2, 2, 669, 670, 7, 7, 2, 2, 670, 673, 5, 74, 38, 2, 671, 672, 7, 72, 2, 2, 672, 674, 5, 232, 117, 2, 673, 671, 3, 2, 2, 2, 673, 674, 3, 2, 2, 2, 674, 93, 3, 2, 2, 2, 675, 680, 5, 96, 49, 2, 676, 677, 7, 16, 2, 2, 677, 679, 5, 96, 49, 2, 678, 676, 3, 2, 2, 2, 679, 682, 3, 2, 2, 2, 680, 678, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 95, 3, 2, 2, 2, 682, 680, 3, 2, 2, 2, 683, 690, 5, 98, 50, 2, 684, 690, 5, 100, 51, 2, 685, 690, 5, 126, 64, 2, 686, 690, 5, 130, 66, 2, 687, 690, 5, 134, 68, 2, 688, 690, 5, 136, 69, 2, 689, 683, 3, 2, 2, 2, 689, 684, 3, 2, 2, 2, 689, 685, 3, 2, 2, 2, 689, 686, 3, 2, 2, 2, 689, 687, 3, 2, 2, 2, 689, 688, 3, 2, 2, 2, 690, 97, 3, 2, 2, 2, 691, 700, 5, 122, 62, 2, 692, 700, 5, 140, 71, 2, 693, 700, 5, 216, 109, 2, 694, 700, 5, 218, 110, 2, 695, 700, 5, 220, 111, 2, 696, 700, 5, 222, 112, 2, 697, 700, 5, 224, 113, 2, 698, 700, 5, 226, 114, 2, 699, 691, 3, 2, 2, 2, 699, 692, 3, 2, 2, 2, 699, 693, 3, 2, 2, 2, 699, 694, 3, 2, 2, 2, 699, 695, 3, 2, 2, 2, 699, 696, 3, 2, 2, 2, 699, 697, 3, 2, 2, 2, 699, 698, 3, 2, 2, 2, 700, 99, 3, 2, 2, 2, 701, 704, 5, 102, 52, 2, 702, 704, 5, 106, 54, 2, 703, 701, 3, 2, 2, 2, 703, 702, 3, 2, 2, 2, 704, 713, 3, 2, 2, 2, 705, 712, 5, 102, 52, 2, 706, 712, 5, 106, 54, 2, 707, 712, 5, 110, 56, 2, 708, 712, 5, 112, 57, 2, 709, 712, 5, 116, 59, 2, 710, 712, 5, 120, 61, 2, 711, 705, 3, 2, 2, 2, 711, 706, 3, 2, 2, 2, 711, 707, 3, 2, 2, 2, 711, 708, 3, 2, 2, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 715, 3, 2, 2, 2, 713, 711, 3, 2, 2, 2, 713, 714, 3, 2, 2, 2, 714, 716, 3, 2, 2, 2, 715, 713, 3, 2, 2, 2, 716, 717, 7, 69, 2, 2, 717, 718, 5, 96, 49, 2, 718, 101, 3, 2, 2, 2, 719, 720, 7, 63, 2, 2, 720, 725, 5, 104, 53, 2, 721, 722, 7, 16, 2, 2, 722, 724, 5, 104, 53, 2, 723, 721, 3, 2, 2, 2, 724, 727, 3, 2, 2, 2, 725, 723, 3, 2, 2, 2, 725, 726, 3, 2, 2, 2, 726, 103, 3, 2, 2, 2, 727, 725, 3, 2, 2, 2, 728, 731, 5, 194, 98, 2, 729, 730, 7, 72, 2, 2, 730, 732, 5, 232, 117, 2, 731, 729, 3, 2, 2, 2, 731, 732, 3, 2, 2, 2, 732, 735, 3, 2, 2, 2, 733, 734, 7, 74, 2, 2, 734, 736, 7, 75, 2, 2, 735, 733, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 739, 3, 2, 2, 2, 737, 738, 7, 73, 2, 2, 738, 740, 5, 194, 98, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 742, 7, 71, 2, 2, 742, 743, 5, 96, 49, 2, 743, 105, 3, 2, 2, 2, 744, 745, 7, 64, 2, 2, 745, 750, 5, 108, 55, 2, 746, 747, 7, 16, 2, 2, 747, 749, 5, 108, 55, 2, 748, 746, 3, 2, 2, 2, 749, 752, 3, 2, 2, 2, 750, 748, 3, 2, 2, 2, 750, 751, 3, 2, 2, 2, 751, 107, 3, 2, 2, 2, 752, 750, 3, 2, 2, 2, 753, 756, 5, 194, 98, 2, 754, 755, 7, 72, 2, 2, 755, 757, 5, 232, 117, 2, 756, 754, 3, 2, 2, 2, 756, 757, 3, 2, 2, 2, 757, 758, 3, 2, 2, 2, 758, 759, 7, 8, 2, 2, 759, 760, 5, 96, 49, 2, 760, 109, 3, 2, 2, 2, 761, 762, 7, 65, 2, 2, 762, 763, 5, 96, 49, 2, 763, 111, 3, 2, 2, 2, 764, 765, 7, 66, 2, 2, 765, 766, 7, 67, 2, 2, 766, 771, 5, 114, 58, 2, 767, 768, 7, 16, 2, 2, 768, 770, 5, 114, 58, 2, 769, 767, 3, 2, 2, 2, 770, 773, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 771, 772, 3, 2, 2, 2, 772, 113, 3, 2, 2, 2, 773, 771, 3, 2, 2, 2, 774, 781, 5, 194, 98, 2, 775, 776, 7, 72, 2, 2, 776, 778, 5, 232, 117, 2, 777, 775, 3, 2, 2, 2, 777, 778, 3, 2, 2, 2, 778, 779, 3, 2, 2, 2, 779, 780, 7, 8, 2, 2, 780, 782, 5, 96, 49, 2, 781, 777, 3, 2, 2, 2, 781, 782, 3, 2, 2, 2, 782, 785, 3, 2, 2, 2, 783, 784, 7, 83, 2, 2, 784, 786, 5, 250, 126, 2, 785, 783, 3, 2, 2, 2, 785, 786, 3, 2, 2, 2, 786, 115, 3, 2, 2, 2, 787, 788, 7, 68, 2, 2, 788, 793, 7, 67, 2, 2, 789, 790, 7, 77, 2, 2, 790, 791, 7, 68, 2, 2, 791, 793, 7, 67, 2, 2, 792, 787, 3, 2, 2, 2, 792, 789, 3, 2, 2, 2, 793, 794, 3, 2, 2, 2, 794, 799, 5, 118, 60, 2, 795, 796, 7, 16, 2, 2, 796, 798, 5, 118, 60, 2, 797, 795, 3, 2, 2, 2, 798, 801, 3, 2, 2, 2, 799, 797, 3, 2, 2, 2, 799, 800, 3, 2, 2, 2, 800, 117, 3, 2, 2, 2, 801, 799, 3, 2, 2, 2, 802, 805, 5, 96, 49, 2, 803, 806, 7, 78, 2, 2, 804, 806, 7, 79, 2, 2, 805, 803, 3, 2, 2, 2, 805, 804, 3, 2, 2, 2, 805, 806, 3, 2, 2, 2, 806, 812, 3, 2, 2, 2, 807, 810, 7, 75, 2, 2, 808, 811, 7, 84, 2, 2, 809, 811, 7, 85, 2, 2, 810, 808, 3, 2, 2, 2, 810, 809, 3, 2, 2, 2, 811, 813, 3, 2, 2, 2, 812, 807, 3, 2, 2, 2, 812, 813, 3, 2, 2, 2, 813, 816, 3, 2, 2, 2, 814, 815, 7, 83, 2, 2, 815, 817, 5, 250, 126, 2, 816, 814, 3, 2, 2, 2, 816, 817, 3, 2, 2, 2, 817, 119, 3, 2, 2, 2, 818, 819, 7, 76, 2, 2, 819, 820, 5, 194, 98, 2, 820, 121, 3, 2, 2, 2, 821, 824, 7, 80, 2, 2, 822, 824, 7, 81, 2, 2, 823, 821, 3, 2, 2, 2, 823, 822, 3, 2, 2, 2, 824, 825, 3, 2, 2, 2, 825, 830, 5, 124, 63, 2, 826, 827, 7, 16, 2, 2, 827, 829, 5, 124, 63, 2, 828, 826, 3, 2, 2, 2, 829, 832, 3, 2, 2, 2, 830, 828, 3, 2, 2, 2, 830, 831, 3, 2, 2, 2, 831, 833, 3, 2, 2, 2, 832, 830, 3, 2, 2, 2, 833, 834, 7, 82, 2, 2, 834, 835, 5, 96, 49, 2, 835, 123, 3, 2, 2, 2, 836, 839, 5, 194, 98, 2, 837, 838, 7, 72, 2, 2, 838, 840, 5, 232, 117, 2, 839, 837, 3, 2, 2, 2, 839, 840, 3, 2, 2, 2, 840, 841, 3, 2, 2, 2, 841, 842, 7, 71, 2, 2, 842, 843, 5, 96, 49, 2, 843, 125, 3, 2, 2, 2, 844, 845, 7, 86, 2, 2, 845, 846, 7, 11, 2, 2, 846, 847, 5, 94, 48, 2, 847, 849, 7, 12, 2, 2, 848, 850, 5, 128, 65, 2, 849, 848, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 849, 3, 2, 2, 2, 851, 852, 3, 2, 2, 2, 852, 853, 3, 2, 2, 2, 853, 854, 7, 90, 2, 2, 854, 855, 7, 69, 2, 2, 855, 856, 5, 96, 49, 2, 856, 127, 3, 2, 2, 2, 857, 858, 7, 87, 2, 2, 858, 860, 5, 96, 49, 2, 859, 857, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 859, 3, 2, 2, 2, 861, 862, 3, 2, 2, 2, 862, 863, 3, 2, 2, 2, 863, 864, 7, 69, 2, 2, 864, 865, 5, 96, 49, 2, 865, 129, 3, 2, 2, 2, 866, 867, 7, 93, 2, 2, 867, 868, 7, 11, 2, 2, 868, 869, 5, 94, 48, 2, 869, 871, 7, 12, 2, 2, 870, 872, 5, 132, 67, 2, 871, 870, 3, 2, 2, 2, 872, 873, 3, 2, 2, 2, 873, 871, 3, 2, 2, 2, 873, 874, 3, 2, 2, 2, 874, 875, 3, 2, 2, 2, 875, 877, 7, 90, 2, 2, 876, 878, 5, 194, 98, 2, 877, 876, 3, 2, 2, 2, 877, 878, 3, 2, 2, 2, 878, 879, 3, 2, 2, 2, 879, 880, 7, 69, 2, 2, 880, 881, 5, 96, 49, 2, 881, 131, 3, 2, 2, 2, 882, 886, 7, 87, 2, 2, 883, 884, 5, 194, 98, 2, 884, 885, 7, 72, 2, 2, 885, 887, 3, 2, 2, 2, 886, 883, 3, 2, 2, 2, 886, 887, 3, 2, 2, 2, 887, 888, 3, 2, 2, 2, 888, 893, 5, 232, 117, 2, 889, 890, 7, 14, 2, 2, 890, 892, 5, 232, 117, 2, 891, 889, 3, 2, 2, 2, 892, 895, 3, 2, 2, 2, 893, 891, 3, 2, 2, 2, 893, 894, 3, 2, 2, 2, 894, 896, 3, 2, 2, 2, 895, 893, 3, 2, 2, 2, 896, 897, 7, 69, 2, 2, 897, 898, 5, 96, 49, 2, 898, 133, 3, 2, 2, 2, 899, 900, 7, 70, 2, 2, 900, 901, 7, 11, 2, 2, 901, 902, 5, 94, 48, 2, 902, 903, 7, 12, 2, 2, 903, 904, 7, 91, 2, 2, 904, 905, 5, 96, 49, 2, 905, 906, 7, 92, 2, 2, 906, 907, 5, 96, 49, 2, 907, 135, 3, 2, 2, 2, 908, 909, 7, 88, 2, 2, 909, 910, 7, 9, 2, 2, 910, 911, 5, 94, 48, 2, 911, 913, 7, 10, 2, 2, 912, 914, 5, 138, 70, 2, 913, 912, 3, 2, 2, 2, 914, 915, 3, 2, 2, 2, 915, 913, 3, 2, 2, 2, 915, 916, 3, 2, 2, 2, 916, 137, 3, 2, 2, 2, 917, 920, 7, 89, 2, 2, 918, 921, 7, 13, 2, 2, 919, 921, 5, 74, 38, 2, 920, 918, 3, 2, 2, 2, 920, 919, 3, 2, 2, 2, 921, 929, 3, 2, 2, 2, 922, 925, 7, 14, 2, 2, 923, 926, 7, 13, 2, 2, 924, 926, 5, 74, 38, 2, 925, 923, 3, 2, 2, 2, 925, 924, 3, 2, 2, 2, 926, 928, 3, 2, 2, 2, 927, 922, 3, 2, 2, 2, 928, 931, 3, 2, 2, 2, 929, 927, 3, 2, 2, 2, 929, 930, 3, 2, 2, 2, 930, 932, 3, 2, 2, 2, 931, 929, 3, 2, 2, 2, 932, 933, 7, 9, 2, 2, 933, 934, 5, 94, 48, 2, 934, 935, 7, 10, 2, 2, 935, 139, 3, 2, 2, 2, 936, 941, 5, 142, 72, 2, 937, 938, 7, 94, 2, 2, 938, 940, 5, 142, 72, 2, 939, 937, 3, 2, 2, 2, 940, 943, 3, 2, 2, 2, 941, 939, 3, 2, 2, 2, 941, 942, 3, 2, 2, 2, 942, 141, 3, 2, 2, 2, 943, 941, 3, 2, 2, 2, 944, 949, 5, 144, 73, 2, 945, 946, 7, 95, 2, 2, 946, 948, 5, 144, 73, 2, 947, 945, 3, 2, 2, 2, 948, 951, 3, 2, 2, 2, 949, 947, 3, 2, 2, 2, 949, 950, 3, 2, 2, 2, 950, 143, 3, 2, 2, 2, 951, 949, 3, 2, 2, 2, 952, 954, 7, 96, 2, 2, 953, 952, 3, 2, 2, 2, 953, 954, 3, 2, 2, 2, 954, 955, 3, 2, 2, 2, 955, 956, 5, 146, 74, 2, 956, 145, 3, 2, 2, 2, 957, 960, 5, 148, 75, 2, 958, 959, 9, 5, 2, 2, 959, 961, 5, 148, 75, 2, 960, 958, 3, 2, 2, 2, 960, 961, 3, 2, 2, 2, 961, 147, 3, 2, 2, 2, 962, 967, 5, 150, 76, 2, 963, 964, 7, 49, 2, 2, 964, 966, 5, 150, 76, 2, 965, 963, 3, 2, 2, 2, 966, 969, 3, 2, 2, 2, 967, 965, 3, 2, 2, 2, 967, 968, 3, 2, 2, 2, 968, 149, 3, 2, 2, 2, 969, 967, 3, 2, 2, 2, 970, 973, 5, 152, 77, 2, 971, 972, 7, 97, 2, 2, 972, 974, 5, 152, 77, 2, 973, 971, 3, 2, 2, 2, 973, 974, 3, 2, 2, 2, 974, 151, 3, 2, 2, 2, 975, 980, 5, 154, 78, 2, 976, 977, 9, 6, 2, 2, 977, 979, 5, 154, 78, 2, 978, 976, 3, 2, 2, 2, 979, 982, 3, 2, 2, 2, 980, 978, 3, 2, 2, 2, 980, 981, 3, 2, 2, 2, 981, 153, 3, 2, 2, 2, 982, 980, 3, 2, 2, 2, 983, 988, 5, 156, 79, 2, 984, 985, 9, 7, 2, 2, 985, 987, 5, 156, 79, 2, 986, 984, 3, 2, 2, 2, 987, 990, 3, 2, 2, 2, 988, 986, 3, 2, 2, 2, 988, 989, 3, 2, 2, 2, 989, 155, 3, 2, 2, 2, 990, 988, 3, 2, 2, 2, 991, 995, 5, 158, 80, 2, 992, 993, 7, 98, 2, 2, 993, 994, 7, 99, 2, 2, 994, 996, 5, 232, 117, 2, 995, 992, 3, 2, 2, 2, 995, 996, 3, 2, 2, 2, 996, 157, 3, 2, 2, 2, 997, 1001, 5, 160, 81, 2, 998, 999, 7, 101, 2, 2, 999, 1000, 7, 100, 2, 2, 1000, 1002, 5, 232, 117, 2, 1001, 998, 3, 2, 2, 2, 1001, 1002, 3, 2, 2, 2, 1002, 159, 3, 2, 2, 2, 1003, 1007, 5, 162, 82, 2, 1004, 1005, 7, 102, 2, 2, 1005, 1006, 7, 72, 2, 2, 1006, 1008, 5, 232, 117, 2, 1007, 1004, 3, 2, 2, 2, 1007, 1008, 3, 2, 2, 2, 1008, 161, 3, 2, 2, 2, 1009, 1013, 5, 164, 83, 2, 1010, 1011, 7, 104, 2, 2, 1011, 1012, 7, 72, 2, 2, 1012, 1014, 5, 244, 123, 2, 1013, 1010, 3, 2, 2, 2, 1013, 1014, 3, 2, 2, 2, 1014, 163, 3, 2, 2, 2, 1015, 1019, 5, 166, 84, 2, 1016, 1017, 7, 103, 2, 2, 1017, 1018, 7, 72, 2, 2, 1018, 1020, 5, 244, 123, 2, 1019, 1016, 3, 2, 2, 2, 1019, 1020, 3, 2, 2, 2, 1020, 165, 3, 2, 2, 2, 1021, 1030, 5, 170, 86, 2, 1022, 1023, 7, 6, 2, 2, 1023, 1024, 7, 47, 2, 2, 1024, 1025, 3, 2, 2, 2, 1025, 1026, 5, 168, 85, 2, 1026, 1027, 5, 206, 104, 2, 1027, 1029, 3, 2, 2, 2, 1028, 1022, 3, 2, 2, 2, 1029, 1032, 3, 2, 2, 2, 1030, 1028, 3, 2, 2, 2, 1030, 1031, 3, 2, 2, 2, 1031, 167, 3, 2, 2, 2, 1032, 1030, 3, 2, 2, 2, 1033, 1037, 5, 74, 38, 2, 1034, 1037, 5, 194, 98, 2, 1035, 1037, 5, 196, 99, 2, 1036, 1033, 3, 2, 2, 2, 1036, 1034, 3, 2, 2, 2, 1036, 1035, 3, 2, 2, 2, 1037, 169, 3, 2, 2, 2, 1038, 1040, 9, 6, 2, 2, 1039, 1038, 3, 2, 2, 2, 1040, 1043, 3, 2, 2, 2, 1041, 1039, 3, 2, 2, 2, 1041, 1042, 3, 2, 2, 2, 1042, 1044, 3, 2, 2, 2, 1043, 1041, 3, 2, 2, 2, 1044, 1045, 5, 172, 87, 2, 1045, 171, 3, 2, 2, 2, 1046, 1050, 5, 178, 90, 2, 1047, 1050, 5, 174, 88, 2, 1048, 1050, 5, 176, 89, 2, 1049, 1046, 3, 2, 2, 2, 1049, 1047, 3, 2, 2, 2, 1049, 1048, 3, 2, 2, 2, 1050, 173, 3, 2, 2, 2, 1051, 1052, 7, 111, 2, 2, 1052, 1053, 7, 110, 2, 2, 1053, 1054, 5, 232, 117, 2, 1054, 1055, 7, 9, 2, 2, 1055, 1056, 5, 94, 48, 2, 1056, 1057, 7, 10, 2, 2, 1057, 175, 3, 2, 2, 2, 1058, 1059, 7, 112, 2, 2, 1059, 1060, 7, 110, 2, 2, 1060, 1061, 5, 232, 117, 2, 1061, 1062, 7, 9, 2, 2, 1062, 1063, 5, 94, 48, 2, 1063, 1064, 7, 10, 2, 2, 1064, 177, 3, 2, 2, 2, 1065, 1070, 5, 180, 91, 2, 1066, 1067, 7, 55, 2, 2, 1067, 1069, 5, 180, 91, 2, 1068, 1066, 3, 2, 2, 2, 1069, 1072, 3, 2, 2, 2, 1070, 1068, 3, 2, 2, 2, 1070, 1071, 3, 2, 2, 2, 1071, 179, 3, 2, 2, 2, 1072, 1070, 3, 2, 2, 2, 1073, 1081, 5, 190, 96, 2, 1074, 1080, 5, 182, 92, 2, 1075, 1080, 5, 186, 94, 2, 1076, 1080, 5, 188, 95, 2, 1077, 1080, 5, 184, 93, 2, 1078, 1080, 5, 206, 104, 2, 1079, 1074, 3, 2, 2, 2, 1079, 1075, 3, 2, 2, 2, 1079, 1076, 3, 2, 2, 2, 1079, 1077, 3, 2, 2, 2, 1079, 1078, 3, 2, 2, 2, 1080, 1083, 3, 2, 2, 2, 1081, 1079, 3, 2, 2, 2, 1081, 1082, 3, 2, 2, 2, 1082, 181, 3, 2, 2, 2, 1083, 1081, 3, 2, 2, 2, 1084, 1085, 7, 56, 2, 2, 1085, 1086, 7, 56, 2, 2, 1086, 1087, 5, 94, 48, 2, 1087, 1088, 7, 57, 2, 2, 1088, 1089, 7, 57, 2, 2, 1089, 183, 3, 2, 2, 2, 1090, 1091, 7, 56, 2, 2, 1091, 1092, 7, 57, 2, 2, 1092, 185, 3, 2, 2, 2, 1093, 1094, 7, 56, 2, 2, 1094, 1095, 5, 94, 48, 2, 1095, 1096, 7, 57, 2, 2, 1096, 187, 3, 2, 2, 2, 1097, 1104, 7, 58, 2, 2, 1098, 1105, 5, 254, 128, 2, 1099, 1105, 5, 252, 127, 2, 1100, 1105, 7, 144, 2, 2, 1101, 1105, 5, 196, 99, 2, 1102, 1105, 5, 194, 98, 2, 1103, 1105, 5, 198, 100, 2, 1104, 1098, 3, 2, 2, 2, 1104, 1099, 3, 2, 2, 2, 1104, 1100, 3, 2, 2, 2, 1104, 1101, 3, 2, 2, 2, 1104, 1102, 3, 2, 2, 2, 1104, 1103, 3, 2, 2, 2, 1105, 189, 3, 2, 2, 2, 1106, 1122, 7, 137, 2, 2, 1107, 1122, 7, 108, 2, 2, 1108, 1122, 7, 109, 2, 2, 1109, 1122, 7, 138, 2, 2, 1110, 1122, 5, 252, 127, 2, 1111, 1122, 5, 194, 98, 2, 1112, 1122, 5, 196, 99, 2, 1113, 1122, 5, 198, 100, 2, 1114, 1122, 5, 234, 118, 2, 1115, 1122, 5, 204, 103, 2, 1116, 1122, 5, 200, 101, 2, 1117, 1122, 5, 202, 102, 2, 1118, 1122, 5, 248, 125, 2, 1119, 1122, 5, 210, 106, 2, 1120, 1122, 5, 192, 97, 2, 1121, 1106, 3, 2, 2, 2, 1121, 1107, 3, 2, 2, 2, 1121, 1108, 3, 2, 2, 2, 1121, 1109, 3, 2, 2, 2, 1121, 1110, 3, 2, 2, 2, 1121, 1111, 3, 2, 2, 2, 1121, 1112, 3, 2, 2, 2, 1121, 1113, 3, 2, 2, 2, 1121, 1114, 3, 2, 2, 2, 1121, 1115, 3, 2, 2, 2, 1121, 1116, 3, 2, 2, 2, 1121, 1117, 3, 2, 2, 2, 1121, 1118, 3, 2, 2, 2, 1121, 1119, 3, 2, 2, 2, 1121, 1120, 3, 2, 2, 2, 1122, 191, 3, 2, 2, 2, 1123, 1124, 7, 9, 2, 2, 1124, 1125, 5, 16, 9, 2, 1125, 1126, 7, 10, 2, 2, 1126, 193, 3, 2, 2, 2, 1127, 1128, 7, 7, 2, 2, 1128, 1129, 5, 74, 38, 2, 1129, 195, 3, 2, 2, 2, 1130, 1132, 7, 11, 2, 2, 1131, 1133, 5, 94, 48, 2, 1132, 1131, 3, 2, 2, 2, 1132, 1133, 3, 2, 2, 2, 1133, 1134, 3, 2, 2, 2, 1134, 1135, 7, 12, 2, 2, 1135, 197, 3, 2, 2, 2, 1136, 1137, 7, 59, 2, 2, 1137, 199, 3, 2, 2, 2, 1138, 1139, 7, 18, 2, 2, 1139, 1140, 7, 9, 2, 2, 1140, 1141, 5, 94, 48, 2, 1141, 1142, 7, 10, 2, 2, 1142, 201, 3, 2, 2, 2, 1143, 1144, 7, 107, 2, 2, 1144, 1145, 7, 9, 2, 2, 1145, 1146, 5, 94, 48, 2, 1146, 1147, 7, 10, 2, 2, 1147, 203, 3, 2, 2, 2, 1148, 1149, 5, 74, 38, 2, 1149, 1150, 5, 206, 104, 2, 1150, 205, 3, 2, 2, 2, 1151, 1158, 7, 11, 2, 2, 1152, 1154, 5, 208, 105, 2, 1153, 1155, 7, 16, 2, 2, 1154, 1153, 3, 2, 2, 2, 1154, 1155, 3, 2, 2, 2, 1155, 1157, 3, 2, 2, 2, 1156, 1152, 3, 2, 2, 2, 1157, 1160, 3, 2, 2, 2, 1158, 1156, 3, 2, 2, 2, 1158, 1159, 3, 2, 2, 2, 1159, 1161, 3, 2, 2, 2, 1160, 1158, 3, 2, 2, 2, 1161, 1162, 7, 12, 2, 2, 1162, 207, 3, 2, 2, 2, 1163, 1166, 5, 96, 49, 2, 1164, 1166, 7, 136, 2, 2, 1165, 1163, 3, 2, 2, 2, 1165, 1164, 3, 2, 2, 2, 1166, 209, 3, 2, 2, 2, 1167, 1170, 5, 212, 107, 2, 1168, 1170, 5, 214, 108, 2, 1169, 1167, 3, 2, 2, 2, 1169, 1168, 3, 2, 2, 2, 1170, 211, 3, 2, 2, 2, 1171, 1172, 5, 74, 38, 2, 1172, 1173, 7, 60, 2, 2, 1173, 1174, 7, 138, 2, 2, 1174, 213, 3, 2, 2, 2, 1175, 1176, 5, 52, 27, 2, 1176, 1177, 7, 33, 2, 2, 1177, 1179, 7, 11, 2, 2, 1178, 1180, 5, 90, 46, 2, 1179, 1178, 3, 2, 2, 2, 1179, 1180, 3, 2, 2, 2, 1180, 1181, 3, 2, 2, 2, 1181, 1184, 7, 12, 2, 2, 1182, 1183, 7, 72, 2, 2, 1183, 1185, 5, 232, 117, 2, 1184, 1182, 3, 2, 2, 2, 1184, 1185, 3, 2, 2, 2, 1185, 1186, 3, 2, 2, 2, 1186, 1187, 7, 9, 2, 2, 1187, 1188, 5, 18, 10, 2, 1188, 1189, 7, 10, 2, 2, 1189, 215, 3, 2, 2, 2, 1190, 1191, 7, 117, 2, 2, 1191, 1192, 7, 126, 2, 2, 1192, 1193, 5, 96, 49, 2, 1193, 1194, 7, 124, 2, 2, 1194, 1198, 5, 96, 49, 2, 1195, 1196, 7, 73, 2, 2, 1196, 1197, 7, 128, 2, 2, 1197, 1199, 5, 96, 49, 2, 1198, 1195, 3, 2, 2, 2, 1198, 1199, 3, 2, 2, 2, 1199, 1214, 3, 2, 2, 2, 1200, 1201, 7, 117, 2, 2, 1201, 1202, 7, 126, 2, 2, 1202, 1207, 5, 246, 124, 2, 1203, 1204, 7, 16, 2, 2, 1204, 1206, 5, 246, 124, 2, 1205, 1203, 3, 2, 2, 2, 1206, 1209, 3, 2, 2, 2, 1207, 1205, 3, 2, 2, 2, 1207, 1208, 3, 2, 2, 2, 1208, 1210, 3, 2, 2, 2, 1209, 1207, 3, 2, 2, 2, 1210, 1211, 7, 124, 2, 2, 1211, 1212, 5, 96, 49, 2, 1212, 1214, 3, 2, 2, 2, 1213, 1190, 3, 2, 2, 2, 1213, 1200, 3, 2, 2, 2, 1214, 217, 3, 2, 2, 2, 1215, 1216, 7, 118, 2, 2, 1216, 1217, 7, 126, 2, 2, 1217, 1218, 5, 228, 115, 2, 1218, 219, 3, 2, 2, 2, 1219, 1220, 7, 119, 2, 2, 1220, 1221, 7, 126, 2, 2, 1221, 1222, 5, 228, 115, 2, 1222, 1223, 7, 72, 2, 2, 1223, 1224, 5, 96, 49, 2, 1224, 221, 3, 2, 2, 2, 1225, 1226, 7, 120, 2, 2, 1226, 1227, 7, 126, 2, 2, 1227, 1228, 7, 125, 2, 2, 1228, 1229, 7, 99, 2, 2, 1229, 1230, 5, 228, 115, 2, 1230, 1231, 7, 127, 2, 2, 1231, 1232, 5, 96, 49, 2, 1232, 223, 3, 2, 2, 2, 1233, 1234, 7, 121, 2, 2, 1234, 1235, 7, 126, 2, 2, 1235, 1240, 5, 230, 116, 2, 1236, 1237, 7, 16, 2, 2, 1237, 1239, 5, 230, 116, 2, 1238, 1236, 3, 2, 2, 2, 1239, 1242, 3, 2, 2, 2, 1240, 1238, 3, 2, 2, 2, 1240, 1241, 3, 2, 2, 2, 1241, 1243, 3, 2, 2, 2, 1242, 1240, 3, 2, 2, 2, 1243, 1244, 7, 122, 2, 2, 1244, 1245, 5, 96, 49, 2, 1245, 1246, 7, 69, 2, 2, 1246, 1247, 5, 96, 49, 2, 1247, 225, 3, 2, 2, 2, 1248, 1249, 7, 123, 2, 2, 1249, 1250, 7, 126, 2, 2, 1250, 1251, 5, 96, 49, 2, 1251, 1252, 7, 124, 2, 2, 1252, 1253, 5, 96, 49, 2, 1253, 227, 3, 2, 2, 2, 1254, 1257, 5, 190, 96, 2, 1255, 1258, 5, 182, 92, 2, 1256, 1258, 5, 188, 95, 2, 1257, 1255, 3, 2, 2, 2, 1257, 1256, 3, 2, 2, 2, 1258, 1259, 3, 2, 2, 2, 1259, 1257, 3, 2, 2, 2, 1259, 1260, 3, 2, 2, 2, 1260, 229, 3, 2, 2, 2, 1261, 1262, 5, 194, 98, 2, 1262, 1263, 7, 8, 2, 2, 1263, 1264, 5, 96, 49, 2, 1264, 231, 3, 2, 2, 2, 1265, 1266, 7, 11, 2, 2, 1266, 1274, 7, 12, 2, 2, 1267, 1271, 5, 236, 119, 2, 1268, 1272, 7, 136, 2, 2, 1269, 1272, 7, 13, 2, 2, 1270, 1272, 7, 50, 2, 2, 1271, 1268, 3, 2, 2, 2, 1271, 1269, 3, 2, 2, 2, 1271, 1270, 3, 2, 2, 2, 1271, 1272, 3, 2, 2, 2, 1272, 1274, 3, 2, 2, 2, 1273, 1265, 3, 2, 2, 2, 1273, 1267, 3, 2, 2, 2, 1274, 233, 3, 2, 2, 2, 1275, 1284, 7, 9, 2, 2, 1276, 1281, 5, 246, 124, 2, 1277, 1278, 7, 16, 2, 2, 1278, 1280, 5, 246, 124, 2, 1279, 1277, 3, 2, 2, 2, 1280, 1283, 3, 2, 2, 2, 1281, 1279, 3, 2, 2, 2, 1281, 1282, 3, 2, 2, 2, 1282, 1285, 3, 2, 2, 2, 1283, 1281, 3, 2, 2, 2, 1284, 1276, 3, 2, 2, 2, 1284, 1285, 3, 2, 2, 2, 1285, 1286, 3, 2, 2, 2, 1286, 1292, 7, 10, 2, 2, 1287, 1288, 7, 61, 2, 2, 1288, 1289, 5, 94, 48, 2, 1289, 1290, 7, 62, 2, 2, 1290, 1292, 3, 2, 2, 2, 1291, 1275, 3, 2, 2, 2, 1291, 1287, 3, 2, 2, 2, 1292, 235, 3, 2, 2, 2, 1293, 1297, 5, 74, 38, 2, 1294, 1297, 7, 137, 2, 2, 1295, 1297, 5, 238, 120, 2, 1296, 1293, 3, 2, 2, 2, 1296, 1294, 3, 2, 2, 2, 1296, 1295, 3, 2, 2, 2, 1297, 237, 3, 2, 2, 2, 1298, 1301, 5, 240, 121, 2, 1299, 1301, 5, 242, 122, 2, 1300, 1298, 3, 2, 2, 2, 1300, 1299, 3, 2, 2, 2, 1301, 239, 3, 2, 2, 2, 1302, 1303, 7, 33, 2, 2, 1303, 1304, 7, 11, 2, 2, 1304, 1305, 7, 13, 2, 2, 1305, 1306, 7, 12, 2, 2, 1306, 241, 3, 2, 2, 2, 1307, 1308, 7, 33, 2, 2, 1308, 1317, 7, 11, 2, 2, 1309, 1314, 5, 232, 117, 2, 1310, 1311, 7, 16, 2, 2, 1311, 1313, 5, 232, 117, 2, 1312, 1310, 3, 2, 2, 2, 1313, 1316, 3, 2, 2, 2, 1314, 1312, 3, 2, 2, 2, 1314, 1315, 3, 2, 2, 2, 1315, 1318, 3, 2, 2, 2, 1316, 1314, 3, 2, 2, 2, 1317, 1309, 3, 2, 2, 2, 1317, 1318, 3, 2, 2, 2, 1318, 1319, 3, 2, 2, 2, 1319, 1320, 7, 12, 2, 2, 1320, 1321, 7, 72, 2, 2, 1321, 1322, 5, 232, 117, 2, 1322, 243, 3, 2, 2, 2, 1323, 1325, 5, 236, 119, 2, 1324, 1326, 7, 136, 2, 2, 1325, 1324, 3, 2, 2, 2, 1325, 1326, 3, 2, 2, 2, 1326, 245, 3, 2, 2, 2, 1327, 1330, 5, 96, 49, 2, 1328, 1330, 7, 144, 2, 2, 1329, 1327, 3, 2, 2, 2, 1329, 1328, 3, 2, 2, 2, 1330, 1331, 3, 2, 2, 2, 1331, 1332, 9, 8, 2, 2, 1332, 1333, 5, 96, 49, 2, 1333, 247, 3, 2, 2, 2, 1334, 1336, 7, 56, 2, 2, 1335, 1337, 5, 94, 48, 2, 1336, 1335, 3, 2, 2, 2, 1336, 1337, 3, 2, 2, 2, 1337, 1338, 3, 2, 2, 2, 1338, 1339, 7, 57, 2, 2, 1339, 249, 3, 2, 2, 2, 1340, 1341, 5, 252, 127, 2, 1341, 251, 3, 2, 2, 2, 1342, 1343, 7, 135, 2, 2, 1343, 253, 3, 2, 2, 2, 1344, 1345, 9, 9, 2, 2, 1345, 255, 3, 2, 2, 2, 134, 264, 268, 284, 290, 298, 306, 314, 329, 359, 367, 369, 391, 401, 411, 416, 421, 425, 437, 441, 450, 457, 471, 475, 480, 490, 498, 502, 514, 526, 548, 556, 561, 564, 568, 577, 586, 589, 597, 604, 606, 613, 620, 622, 630, 635, 642, 649, 659, 666, 673, 680, 689, 699, 703, 711, 713, 725, 731, 735, 739, 750, 756, 771, 777, 781, 785, 792, 799, 805, 810, 812, 816, 823, 830, 839, 851, 861, 873, 877, 886, 893, 915, 920, 925, 929, 941, 949, 953, 960, 967, 973, 980, 988, 995, 1001, 1007, 1013, 1019, 1030, 1036, 1041, 1049, 1070, 1079, 1081, 1104, 1121, 1132, 1154, 1158, 1165, 1169, 1179, 1184, 1198, 1207, 1213, 1240, 1257, 1259, 1271, 1273, 1281, 1284, 1291, 1296, 1300, 1314, 1317, 1325, 1329, 1336] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 180, 1750, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 369, 10, 3, 3, 3, 3, 3, 5, 3, 373, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 389, 10, 6, 3, 6, 3, 6, 7, 6, 393, 10, 6, 12, 6, 14, 6, 396, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 401, 10, 6, 12, 6, 14, 6, 404, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 409, 10, 8, 12, 8, 14, 8, 412, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 419, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 434, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 464, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 472, 10, 18, 12, 18, 14, 18, 475, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 494, 10, 20, 13, 20, 14, 20, 495, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 504, 10, 21, 13, 21, 14, 21, 505, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 514, 10, 22, 13, 22, 14, 22, 515, 3, 23, 3, 23, 3, 23, 5, 23, 521, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 526, 10, 23, 7, 23, 528, 10, 23, 12, 23, 14, 23, 531, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 540, 10, 24, 13, 24, 14, 24, 541, 3, 24, 3, 24, 5, 24, 546, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 555, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 560, 10, 25, 12, 25, 14, 25, 563, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 574, 10, 26, 12, 26, 14, 26, 577, 11, 26, 3, 26, 5, 26, 580, 10, 26, 3, 27, 7, 27, 583, 10, 27, 12, 27, 14, 27, 586, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 593, 10, 28, 12, 28, 14, 28, 596, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 603, 10, 29, 3, 29, 3, 29, 5, 29, 607, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 619, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 631, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 653, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 659, 10, 37, 12, 37, 14, 37, 662, 11, 37, 3, 38, 3, 38, 5, 38, 666, 10, 38, 3, 38, 5, 38, 669, 10, 38, 3, 38, 3, 38, 5, 38, 673, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 682, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 689, 10, 40, 12, 40, 14, 40, 692, 11, 40, 5, 40, 694, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 702, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 709, 10, 41, 5, 41, 711, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 718, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 725, 10, 42, 5, 42, 727, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 735, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 740, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 747, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 754, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 764, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 769, 10, 46, 12, 46, 14, 46, 772, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 778, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 783, 10, 48, 12, 48, 14, 48, 786, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 794, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 804, 10, 50, 3, 51, 3, 51, 5, 51, 808, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 816, 10, 51, 12, 51, 14, 51, 819, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 828, 10, 52, 12, 52, 14, 52, 831, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 836, 10, 53, 3, 53, 3, 53, 5, 53, 840, 10, 53, 3, 53, 3, 53, 5, 53, 844, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 853, 10, 54, 12, 54, 14, 54, 856, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 861, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 874, 10, 57, 12, 57, 14, 57, 877, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 882, 10, 58, 3, 58, 3, 58, 5, 58, 886, 10, 58, 3, 58, 3, 58, 5, 58, 890, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 897, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 902, 10, 59, 12, 59, 14, 59, 905, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 910, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 915, 10, 60, 5, 60, 917, 10, 60, 3, 60, 3, 60, 5, 60, 921, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 928, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 933, 10, 62, 12, 62, 14, 62, 936, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 944, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 954, 10, 64, 13, 64, 14, 64, 955, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 964, 10, 65, 13, 65, 14, 65, 965, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 976, 10, 66, 13, 66, 14, 66, 977, 3, 66, 3, 66, 5, 66, 982, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 991, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 996, 10, 67, 12, 67, 14, 67, 999, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 1018, 10, 69, 13, 69, 14, 69, 1019, 3, 70, 3, 70, 3, 70, 5, 70, 1025, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 1030, 10, 70, 7, 70, 1032, 10, 70, 12, 70, 14, 70, 1035, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 1044, 10, 71, 12, 71, 14, 71, 1047, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 1052, 10, 72, 12, 72, 14, 72, 1055, 11, 72, 3, 73, 5, 73, 1058, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 1065, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 1070, 10, 75, 12, 75, 14, 75, 1073, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 1078, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 1083, 10, 77, 12, 77, 14, 77, 1086, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 1091, 10, 78, 12, 78, 14, 78, 1094, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 1100, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1106, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1112, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1118, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1124, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1133, 10, 84, 12, 84, 14, 84, 1136, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1141, 10, 85, 3, 86, 7, 86, 1144, 10, 86, 12, 86, 14, 86, 1147, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1154, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1173, 10, 90, 12, 90, 14, 90, 1176, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1184, 10, 91, 12, 91, 14, 91, 1187, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1209, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1226, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1237, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1259, 10, 104, 7, 104, 1261, 10, 104, 12, 104, 14, 104, 1264, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1270, 10, 105, 3, 106, 3, 106, 5, 106, 1274, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1284, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1289, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1303, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1310, 10, 109, 12, 109, 14, 109, 1313, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1318, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1343, 10, 113, 12, 113, 14, 113, 1346, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1362, 10, 115, 13, 115, 14, 115, 1363, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 5, 117, 1373, 10, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 7, 117, 1380, 10, 117, 12, 117, 14, 117, 1383, 11, 117, 5, 117, 1385, 10, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 5, 118, 1393, 10, 118, 3, 119, 3, 119, 5, 119, 1397, 10, 119, 3, 119, 3, 119, 3, 119, 5, 119, 1402, 10, 119, 3, 120, 3, 120, 3, 120, 7, 120, 1407, 10, 120, 12, 120, 14, 120, 1410, 11, 120, 3, 121, 3, 121, 5, 121, 1414, 10, 121, 3, 122, 3, 122, 5, 122, 1418, 10, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 5, 123, 1426, 10, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 5, 125, 1433, 10, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 5, 126, 1441, 10, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 129, 3, 129, 5, 129, 1451, 10, 129, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 5, 131, 1459, 10, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 7, 134, 1470, 10, 134, 12, 134, 14, 134, 1473, 11, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 5, 135, 1486, 10, 135, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 5, 137, 1502, 10, 137, 3, 138, 3, 138, 3, 138, 5, 138, 1507, 10, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 5, 140, 1519, 10, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 5, 144, 1539, 10, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 5, 145, 1548, 10, 145, 5, 145, 1550, 10, 145, 3, 145, 3, 145, 3, 146, 3, 146, 5, 146, 1556, 10, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 5, 148, 1569, 10, 148, 5, 148, 1571, 10, 148, 5, 148, 1573, 10, 148, 3, 148, 3, 148, 3, 149, 3, 149, 5, 149, 1579, 10, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 153, 3, 153, 3, 154, 3, 154, 3, 155, 3, 155, 3, 156, 3, 156, 5, 156, 1598, 10, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 5, 159, 1614, 10, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 5, 164, 1637, 10, 164, 3, 165, 3, 165, 3, 165, 5, 165, 1642, 10, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 5, 166, 1649, 10, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 5, 167, 1656, 10, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 5, 168, 1663, 10, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 5, 169, 1670, 10, 169, 3, 169, 3, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 5, 170, 1680, 10, 170, 5, 170, 1682, 10, 170, 3, 171, 3, 171, 3, 171, 3, 171, 7, 171, 1688, 10, 171, 12, 171, 14, 171, 1691, 11, 171, 5, 171, 1693, 10, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 5, 171, 1700, 10, 171, 3, 172, 3, 172, 5, 172, 1704, 10, 172, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 7, 174, 1716, 10, 174, 12, 174, 14, 174, 1719, 11, 174, 5, 174, 1721, 10, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 175, 3, 175, 5, 175, 1729, 10, 175, 3, 176, 3, 176, 5, 176, 1733, 10, 176, 3, 176, 3, 176, 3, 176, 3, 177, 3, 177, 5, 177, 1740, 10, 177, 3, 177, 3, 177, 3, 178, 3, 178, 3, 179, 3, 179, 3, 180, 3, 180, 3, 180, 2, 2, 181, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 2, 13, 4, 2, 17, 17, 105, 105, 3, 2, 82, 83, 3, 2, 20, 29, 4, 2, 5, 5, 35, 45, 3, 2, 47, 48, 4, 2, 12, 12, 49, 51, 3, 2, 137, 138, 3, 2, 140, 146, 3, 2, 147, 151, 4, 2, 19, 19, 170, 170, 4, 2, 61, 132, 171, 171, 2, 1820, 2, 360, 3, 2, 2, 2, 4, 368, 3, 2, 2, 2, 6, 374, 3, 2, 2, 2, 8, 377, 3, 2, 2, 2, 10, 394, 3, 2, 2, 2, 12, 405, 3, 2, 2, 2, 14, 410, 3, 2, 2, 2, 16, 413, 3, 2, 2, 2, 18, 416, 3, 2, 2, 2, 20, 433, 3, 2, 2, 2, 22, 435, 3, 2, 2, 2, 24, 438, 3, 2, 2, 2, 26, 444, 3, 2, 2, 2, 28, 448, 3, 2, 2, 2, 30, 452, 3, 2, 2, 2, 32, 456, 3, 2, 2, 2, 34, 463, 3, 2, 2, 2, 36, 479, 3, 2, 2, 2, 38, 488, 3, 2, 2, 2, 40, 503, 3, 2, 2, 2, 42, 510, 3, 2, 2, 2, 44, 517, 3, 2, 2, 2, 46, 534, 3, 2, 2, 2, 48, 550, 3, 2, 2, 2, 50, 567, 3, 2, 2, 2, 52, 584, 3, 2, 2, 2, 54, 587, 3, 2, 2, 2, 56, 599, 3, 2, 2, 2, 58, 608, 3, 2, 2, 2, 60, 618, 3, 2, 2, 2, 62, 620, 3, 2, 2, 2, 64, 630, 3, 2, 2, 2, 66, 632, 3, 2, 2, 2, 68, 637, 3, 2, 2, 2, 70, 641, 3, 2, 2, 2, 72, 647, 3, 2, 2, 2, 74, 668, 3, 2, 2, 2, 76, 674, 3, 2, 2, 2, 78, 676, 3, 2, 2, 2, 80, 695, 3, 2, 2, 2, 82, 712, 3, 2, 2, 2, 84, 728, 3, 2, 2, 2, 86, 748, 3, 2, 2, 2, 88, 763, 3, 2, 2, 2, 90, 765, 3, 2, 2, 2, 92, 773, 3, 2, 2, 2, 94, 779, 3, 2, 2, 2, 96, 793, 3, 2, 2, 2, 98, 803, 3, 2, 2, 2, 100, 807, 3, 2, 2, 2, 102, 823, 3, 2, 2, 2, 104, 832, 3, 2, 2, 2, 106, 848, 3, 2, 2, 2, 108, 857, 3, 2, 2, 2, 110, 865, 3, 2, 2, 2, 112, 868, 3, 2, 2, 2, 114, 878, 3, 2, 2, 2, 116, 896, 3, 2, 2, 2, 118, 906, 3, 2, 2, 2, 120, 922, 3, 2, 2, 2, 122, 927, 3, 2, 2, 2, 124, 940, 3, 2, 2, 2, 126, 948, 3, 2, 2, 2, 128, 963, 3, 2, 2, 2, 130, 970, 3, 2, 2, 2, 132, 986, 3, 2, 2, 2, 134, 1003, 3, 2, 2, 2, 136, 1012, 3, 2, 2, 2, 138, 1021, 3, 2, 2, 2, 140, 1040, 3, 2, 2, 2, 142, 1048, 3, 2, 2, 2, 144, 1057, 3, 2, 2, 2, 146, 1061, 3, 2, 2, 2, 148, 1066, 3, 2, 2, 2, 150, 1074, 3, 2, 2, 2, 152, 1079, 3, 2, 2, 2, 154, 1087, 3, 2, 2, 2, 156, 1095, 3, 2, 2, 2, 158, 1101, 3, 2, 2, 2, 160, 1107, 3, 2, 2, 2, 162, 1113, 3, 2, 2, 2, 164, 1119, 3, 2, 2, 2, 166, 1125, 3, 2, 2, 2, 168, 1140, 3, 2, 2, 2, 170, 1145, 3, 2, 2, 2, 172, 1153, 3, 2, 2, 2, 174, 1155, 3, 2, 2, 2, 176, 1162, 3, 2, 2, 2, 178, 1169, 3, 2, 2, 2, 180, 1177, 3, 2, 2, 2, 182, 1188, 3, 2, 2, 2, 184, 1194, 3, 2, 2, 2, 186, 1197, 3, 2, 2, 2, 188, 1201, 3, 2, 2, 2, 190, 1225, 3, 2, 2, 2, 192, 1227, 3, 2, 2, 2, 194, 1231, 3, 2, 2, 2, 196, 1234, 3, 2, 2, 2, 198, 1240, 3, 2, 2, 2, 200, 1242, 3, 2, 2, 2, 202, 1247, 3, 2, 2, 2, 204, 1252, 3, 2, 2, 2, 206, 1255, 3, 2, 2, 2, 208, 1269, 3, 2, 2, 2, 210, 1273, 3, 2, 2, 2, 212, 1275, 3, 2, 2, 2, 214, 1279, 3, 2, 2, 2, 216, 1317, 3, 2, 2, 2, 218, 1319, 3, 2, 2, 2, 220, 1323, 3, 2, 2, 2, 222, 1329, 3, 2, 2, 2, 224, 1337, 3, 2, 2, 2, 226, 1352, 3, 2, 2, 2, 228, 1358, 3, 2, 2, 2, 230, 1365, 3, 2, 2, 2, 232, 1369, 3, 2, 2, 2, 234, 1392, 3, 2, 2, 2, 236, 1401, 3, 2, 2, 2, 238, 1403, 3, 2, 2, 2, 240, 1413, 3, 2, 2, 2, 242, 1417, 3, 2, 2, 2, 244, 1425, 3, 2, 2, 2, 246, 1427, 3, 2, 2, 2, 248, 1432, 3, 2, 2, 2, 250, 1440, 3, 2, 2, 2, 252, 1442, 3, 2, 2, 2, 254, 1446, 3, 2, 2, 2, 256, 1450, 3, 2, 2, 2, 258, 1452, 3, 2, 2, 2, 260, 1458, 3, 2, 2, 2, 262, 1460, 3, 2, 2, 2, 264, 1464, 3, 2, 2, 2, 266, 1471, 3, 2, 2, 2, 268, 1485, 3, 2, 2, 2, 270, 1487, 3, 2, 2, 2, 272, 1501, 3, 2, 2, 2, 274, 1503, 3, 2, 2, 2, 276, 1510, 3, 2, 2, 2, 278, 1514, 3, 2, 2, 2, 280, 1522, 3, 2, 2, 2, 282, 1526, 3, 2, 2, 2, 284, 1530, 3, 2, 2, 2, 286, 1534, 3, 2, 2, 2, 288, 1542, 3, 2, 2, 2, 290, 1555, 3, 2, 2, 2, 292, 1557, 3, 2, 2, 2, 294, 1562, 3, 2, 2, 2, 296, 1578, 3, 2, 2, 2, 298, 1580, 3, 2, 2, 2, 300, 1585, 3, 2, 2, 2, 302, 1587, 3, 2, 2, 2, 304, 1589, 3, 2, 2, 2, 306, 1591, 3, 2, 2, 2, 308, 1593, 3, 2, 2, 2, 310, 1597, 3, 2, 2, 2, 312, 1599, 3, 2, 2, 2, 314, 1604, 3, 2, 2, 2, 316, 1613, 3, 2, 2, 2, 318, 1615, 3, 2, 2, 2, 320, 1620, 3, 2, 2, 2, 322, 1625, 3, 2, 2, 2, 324, 1629, 3, 2, 2, 2, 326, 1636, 3, 2, 2, 2, 328, 1638, 3, 2, 2, 2, 330, 1645, 3, 2, 2, 2, 332, 1652, 3, 2, 2, 2, 334, 1659, 3, 2, 2, 2, 336, 1666, 3, 2, 2, 2, 338, 1681, 3, 2, 2, 2, 340, 1699, 3, 2, 2, 2, 342, 1703, 3, 2, 2, 2, 344, 1705, 3, 2, 2, 2, 346, 1710, 3, 2, 2, 2, 348, 1726, 3, 2, 2, 2, 350, 1732, 3, 2, 2, 2, 352, 1737, 3, 2, 2, 2, 354, 1743, 3, 2, 2, 2, 356, 1745, 3, 2, 2, 2, 358, 1747, 3, 2, 2, 2, 360, 361, 5, 4, 3, 2, 361, 362, 7, 2, 2, 3, 362, 3, 3, 2, 2, 2, 363, 364, 7, 104, 2, 2, 364, 365, 7, 103, 2, 2, 365, 366, 5, 356, 179, 2, 366, 367, 7, 3, 2, 2, 367, 369, 3, 2, 2, 2, 368, 363, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 373, 5, 8, 5, 2, 371, 373, 5, 6, 4, 2, 372, 370, 3, 2, 2, 2, 372, 371, 3, 2, 2, 2, 373, 5, 3, 2, 2, 2, 374, 375, 5, 10, 6, 2, 375, 376, 5, 12, 7, 2, 376, 7, 3, 2, 2, 2, 377, 378, 7, 4, 2, 2, 378, 379, 7, 135, 2, 2, 379, 380, 7, 178, 2, 2, 380, 381, 7, 5, 2, 2, 381, 382, 5, 354, 178, 2, 382, 383, 7, 3, 2, 2, 383, 384, 5, 10, 6, 2, 384, 9, 3, 2, 2, 2, 385, 389, 5, 60, 31, 2, 386, 389, 5, 62, 32, 2, 387, 389, 5, 78, 40, 2, 388, 385, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 388, 387, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 3, 2, 2, 391, 393, 3, 2, 2, 2, 392, 388, 3, 2, 2, 2, 393, 396, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 402, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 397, 398, 5, 64, 33, 2, 398, 399, 7, 3, 2, 2, 399, 401, 3, 2, 2, 2, 400, 397, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 11, 3, 2, 2, 2, 404, 402, 3, 2, 2, 2, 405, 406, 5, 18, 10, 2, 406, 13, 3, 2, 2, 2, 407, 409, 5, 20, 11, 2, 408, 407, 3, 2, 2, 2, 409, 412, 3, 2, 2, 2, 410, 408, 3, 2, 2, 2, 410, 411, 3, 2, 2, 2, 411, 15, 3, 2, 2, 2, 412, 410, 3, 2, 2, 2, 413, 414, 5, 14, 8, 2, 414, 415, 5, 94, 48, 2, 415, 17, 3, 2, 2, 2, 416, 418, 5, 14, 8, 2, 417, 419, 5, 94, 48, 2, 418, 417, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 19, 3, 2, 2, 2, 420, 434, 5, 22, 12, 2, 421, 434, 5, 24, 13, 2, 422, 434, 5, 26, 14, 2, 423, 434, 5, 28, 15, 2, 424, 434, 5, 30, 16, 2, 425, 434, 5, 32, 17, 2, 426, 434, 5, 34, 18, 2, 427, 434, 5, 36, 19, 2, 428, 434, 5, 38, 20, 2, 429, 434, 5, 42, 22, 2, 430, 434, 5, 46, 24, 2, 431, 434, 5, 54, 28, 2, 432, 434, 5, 58, 30, 2, 433, 420, 3, 2, 2, 2, 433, 421, 3, 2, 2, 2, 433, 422, 3, 2, 2, 2, 433, 423, 3, 2, 2, 2, 433, 424, 3, 2, 2, 2, 433, 425, 3, 2, 2, 2, 433, 426, 3, 2, 2, 2, 433, 427, 3, 2, 2, 2, 433, 428, 3, 2, 2, 2, 433, 429, 3, 2, 2, 2, 433, 430, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 432, 3, 2, 2, 2, 434, 21, 3, 2, 2, 2, 435, 436, 5, 98, 50, 2, 436, 437, 7, 3, 2, 2, 437, 23, 3, 2, 2, 2, 438, 439, 7, 6, 2, 2, 439, 440, 5, 74, 38, 2, 440, 441, 7, 7, 2, 2, 441, 442, 5, 96, 49, 2, 442, 443, 7, 3, 2, 2, 443, 25, 3, 2, 2, 2, 444, 445, 7, 8, 2, 2, 445, 446, 5, 14, 8, 2, 446, 447, 7, 9, 2, 2, 447, 27, 3, 2, 2, 2, 448, 449, 7, 127, 2, 2, 449, 450, 7, 128, 2, 2, 450, 451, 7, 3, 2, 2, 451, 29, 3, 2, 2, 2, 452, 453, 7, 129, 2, 2, 453, 454, 7, 128, 2, 2, 454, 455, 7, 3, 2, 2, 455, 31, 3, 2, 2, 2, 456, 457, 7, 130, 2, 2, 457, 458, 7, 131, 2, 2, 458, 459, 5, 96, 49, 2, 459, 460, 7, 3, 2, 2, 460, 33, 3, 2, 2, 2, 461, 464, 5, 102, 52, 2, 462, 464, 5, 106, 54, 2, 463, 461, 3, 2, 2, 2, 463, 462, 3, 2, 2, 2, 464, 473, 3, 2, 2, 2, 465, 472, 5, 102, 52, 2, 466, 472, 5, 106, 54, 2, 467, 472, 5, 110, 56, 2, 468, 472, 5, 112, 57, 2, 469, 472, 5, 116, 59, 2, 470, 472, 5, 120, 61, 2, 471, 465, 3, 2, 2, 2, 471, 466, 3, 2, 2, 2, 471, 467, 3, 2, 2, 2, 471, 468, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 470, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 477, 7, 67, 2, 2, 477, 478, 5, 20, 11, 2, 478, 35, 3, 2, 2, 2, 479, 480, 7, 68, 2, 2, 480, 481, 7, 10, 2, 2, 481, 482, 5, 94, 48, 2, 482, 483, 7, 11, 2, 2, 483, 484, 7, 89, 2, 2, 484, 485, 5, 20, 11, 2, 485, 486, 7, 90, 2, 2, 486, 487, 5, 20, 11, 2, 487, 37, 3, 2, 2, 2, 488, 489, 7, 84, 2, 2, 489, 490, 7, 10, 2, 2, 490, 491, 5, 94, 48, 2, 491, 493, 7, 11, 2, 2, 492, 494, 5, 40, 21, 2, 493, 492, 3, 2, 2, 2, 494, 495, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 495, 496, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 7, 88, 2, 2, 498, 499, 7, 67, 2, 2, 499, 500, 5, 20, 11, 2, 500, 39, 3, 2, 2, 2, 501, 502, 7, 85, 2, 2, 502, 504, 5, 96, 49, 2, 503, 501, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 503, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 7, 67, 2, 2, 508, 509, 5, 20, 11, 2, 509, 41, 3, 2, 2, 2, 510, 511, 7, 86, 2, 2, 511, 513, 5, 26, 14, 2, 512, 514, 5, 44, 23, 2, 513, 512, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 43, 3, 2, 2, 2, 517, 520, 7, 87, 2, 2, 518, 521, 7, 12, 2, 2, 519, 521, 5, 74, 38, 2, 520, 518, 3, 2, 2, 2, 520, 519, 3, 2, 2, 2, 521, 529, 3, 2, 2, 2, 522, 525, 7, 13, 2, 2, 523, 526, 7, 12, 2, 2, 524, 526, 5, 74, 38, 2, 525, 523, 3, 2, 2, 2, 525, 524, 3, 2, 2, 2, 526, 528, 3, 2, 2, 2, 527, 522, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 532, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 533, 5, 26, 14, 2, 533, 45, 3, 2, 2, 2, 534, 535, 7, 91, 2, 2, 535, 536, 7, 10, 2, 2, 536, 537, 5, 94, 48, 2, 537, 539, 7, 11, 2, 2, 538, 540, 5, 48, 25, 2, 539, 538, 3, 2, 2, 2, 540, 541, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 545, 7, 88, 2, 2, 544, 546, 5, 194, 98, 2, 545, 544, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 547, 3, 2, 2, 2, 547, 548, 7, 67, 2, 2, 548, 549, 5, 20, 11, 2, 549, 47, 3, 2, 2, 2, 550, 554, 7, 85, 2, 2, 551, 552, 5, 194, 98, 2, 552, 553, 7, 70, 2, 2, 553, 555, 3, 2, 2, 2, 554, 551, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 561, 5, 338, 170, 2, 557, 558, 7, 13, 2, 2, 558, 560, 5, 338, 170, 2, 559, 557, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 561, 562, 3, 2, 2, 2, 562, 564, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 564, 565, 7, 67, 2, 2, 565, 566, 5, 20, 11, 2, 566, 49, 3, 2, 2, 2, 567, 568, 7, 14, 2, 2, 568, 579, 5, 74, 38, 2, 569, 570, 7, 10, 2, 2, 570, 575, 7, 172, 2, 2, 571, 572, 7, 15, 2, 2, 572, 574, 7, 172, 2, 2, 573, 571, 3, 2, 2, 2, 574, 577, 3, 2, 2, 2, 575, 573, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 578, 3, 2, 2, 2, 577, 575, 3, 2, 2, 2, 578, 580, 7, 11, 2, 2, 579, 569, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 51, 3, 2, 2, 2, 581, 583, 5, 50, 26, 2, 582, 581, 3, 2, 2, 2, 583, 586, 3, 2, 2, 2, 584, 582, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 53, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 587, 588, 5, 52, 27, 2, 588, 589, 7, 114, 2, 2, 589, 594, 5, 56, 29, 2, 590, 591, 7, 15, 2, 2, 591, 593, 5, 56, 29, 2, 592, 590, 3, 2, 2, 2, 593, 596, 3, 2, 2, 2, 594, 592, 3, 2, 2, 2, 594, 595, 3, 2, 2, 2, 595, 597, 3, 2, 2, 2, 596, 594, 3, 2, 2, 2, 597, 598, 7, 3, 2, 2, 598, 55, 3, 2, 2, 2, 599, 602, 5, 194, 98, 2, 600, 601, 7, 70, 2, 2, 601, 603, 5, 338, 170, 2, 602, 600, 3, 2, 2, 2, 602, 603, 3, 2, 2, 2, 603, 606, 3, 2, 2, 2, 604, 605, 7, 7, 2, 2, 605, 607, 5, 96, 49, 2, 606, 604, 3, 2, 2, 2, 606, 607, 3, 2, 2, 2, 607, 57, 3, 2, 2, 2, 608, 609, 7, 132, 2, 2, 609, 610, 7, 10, 2, 2, 610, 611, 5, 94, 48, 2, 611, 612, 7, 11, 2, 2, 612, 613, 5, 20, 11, 2, 613, 59, 3, 2, 2, 2, 614, 619, 5, 66, 34, 2, 615, 619, 5, 68, 35, 2, 616, 619, 5, 70, 36, 2, 617, 619, 5, 72, 37, 2, 618, 614, 3, 2, 2, 2, 618, 615, 3, 2, 2, 2, 618, 616, 3, 2, 2, 2, 618, 617, 3, 2, 2, 2, 619, 61, 3, 2, 2, 2, 620, 621, 7, 111, 2, 2, 621, 622, 7, 135, 2, 2, 622, 623, 7, 178, 2, 2, 623, 624, 7, 5, 2, 2, 624, 625, 5, 354, 178, 2, 625, 63, 3, 2, 2, 2, 626, 631, 5, 84, 43, 2, 627, 631, 5, 80, 41, 2, 628, 631, 5, 86, 44, 2, 629, 631, 5, 82, 42, 2, 630, 626, 3, 2, 2, 2, 630, 627, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 630, 629, 3, 2, 2, 2, 631, 65, 3, 2, 2, 2, 632, 633, 7, 111, 2, 2, 633, 634, 7, 88, 2, 2, 634, 635, 7, 81, 2, 2, 635, 636, 5, 354, 178, 2, 636, 67, 3, 2, 2, 2, 637, 638, 7, 111, 2, 2, 638, 639, 7, 16, 2, 2, 639, 640, 9, 2, 2, 2, 640, 69, 3, 2, 2, 2, 641, 642, 7, 111, 2, 2, 642, 643, 7, 88, 2, 2, 643, 644, 7, 66, 2, 2, 644, 645, 7, 73, 2, 2, 645, 646, 9, 3, 2, 2, 646, 71, 3, 2, 2, 2, 647, 652, 7, 111, 2, 2, 648, 649, 7, 18, 2, 2, 649, 653, 5, 74, 38, 2, 650, 651, 7, 88, 2, 2, 651, 653, 7, 18, 2, 2, 652, 648, 3, 2, 2, 2, 652, 650, 3, 2, 2, 2, 653, 660, 3, 2, 2, 2, 654, 655, 5, 76, 39, 2, 655, 656, 7, 5, 2, 2, 656, 657, 5, 356, 179, 2, 657, 659, 3, 2, 2, 2, 658, 654, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 73, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 666, 7, 178, 2, 2, 664, 666, 5, 358, 180, 2, 665, 663, 3, 2, 2, 2, 665, 664, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 669, 7, 19, 2, 2, 668, 665, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 672, 3, 2, 2, 2, 670, 673, 7, 178, 2, 2, 671, 673, 5, 358, 180, 2, 672, 670, 3, 2, 2, 2, 672, 671, 3, 2, 2, 2, 673, 75, 3, 2, 2, 2, 674, 675, 9, 4, 2, 2, 675, 77, 3, 2, 2, 2, 676, 677, 7, 133, 2, 2, 677, 681, 7, 4, 2, 2, 678, 679, 7, 135, 2, 2, 679, 680, 7, 178, 2, 2, 680, 682, 7, 5, 2, 2, 681, 678, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 693, 5, 354, 178, 2, 684, 685, 7, 71, 2, 2, 685, 690, 5, 354, 178, 2, 686, 687, 7, 15, 2, 2, 687, 689, 5, 354, 178, 2, 688, 686, 3, 2, 2, 2, 689, 692, 3, 2, 2, 2, 690, 688, 3, 2, 2, 2, 690, 691, 3, 2, 2, 2, 691, 694, 3, 2, 2, 2, 692, 690, 3, 2, 2, 2, 693, 684, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 79, 3, 2, 2, 2, 695, 696, 7, 111, 2, 2, 696, 697, 5, 52, 27, 2, 697, 698, 7, 114, 2, 2, 698, 701, 5, 194, 98, 2, 699, 700, 7, 70, 2, 2, 700, 702, 5, 338, 170, 2, 701, 699, 3, 2, 2, 2, 701, 702, 3, 2, 2, 2, 702, 710, 3, 2, 2, 2, 703, 704, 7, 7, 2, 2, 704, 711, 5, 96, 49, 2, 705, 708, 7, 30, 2, 2, 706, 707, 7, 7, 2, 2, 707, 709, 5, 96, 49, 2, 708, 706, 3, 2, 2, 2, 708, 709, 3, 2, 2, 2, 709, 711, 3, 2, 2, 2, 710, 703, 3, 2, 2, 2, 710, 705, 3, 2, 2, 2, 711, 81, 3, 2, 2, 2, 712, 713, 7, 111, 2, 2, 713, 714, 7, 112, 2, 2, 714, 717, 7, 113, 2, 2, 715, 716, 7, 70, 2, 2, 716, 718, 5, 338, 170, 2, 717, 715, 3, 2, 2, 2, 717, 718, 3, 2, 2, 2, 718, 726, 3, 2, 2, 2, 719, 720, 7, 7, 2, 2, 720, 727, 5, 96, 49, 2, 721, 724, 7, 30, 2, 2, 722, 723, 7, 7, 2, 2, 723, 725, 5, 96, 49, 2, 724, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 727, 3, 2, 2, 2, 726, 719, 3, 2, 2, 2, 726, 721, 3, 2, 2, 2, 727, 83, 3, 2, 2, 2, 728, 729, 7, 111, 2, 2, 729, 730, 5, 52, 27, 2, 730, 731, 7, 31, 2, 2, 731, 732, 5, 74, 38, 2, 732, 734, 7, 10, 2, 2, 733, 735, 5, 90, 46, 2, 734, 733, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 739, 7, 11, 2, 2, 737, 738, 7, 70, 2, 2, 738, 740, 5, 338, 170, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 746, 3, 2, 2, 2, 741, 742, 7, 8, 2, 2, 742, 743, 5, 18, 10, 2, 743, 744, 7, 9, 2, 2, 744, 747, 3, 2, 2, 2, 745, 747, 7, 30, 2, 2, 746, 741, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 85, 3, 2, 2, 2, 748, 749, 7, 111, 2, 2, 749, 750, 7, 108, 2, 2, 750, 751, 5, 74, 38, 2, 751, 753, 7, 70, 2, 2, 752, 754, 5, 88, 45, 2, 753, 752, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 755, 3, 2, 2, 2, 755, 756, 5, 96, 49, 2, 756, 87, 3, 2, 2, 2, 757, 758, 7, 32, 2, 2, 758, 764, 7, 33, 2, 2, 759, 760, 7, 32, 2, 2, 760, 764, 7, 34, 2, 2, 761, 762, 7, 124, 2, 2, 762, 764, 7, 134, 2, 2, 763, 757, 3, 2, 2, 2, 763, 759, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 764, 89, 3, 2, 2, 2, 765, 770, 5, 92, 47, 2, 766, 767, 7, 15, 2, 2, 767, 769, 5, 92, 47, 2, 768, 766, 3, 2, 2, 2, 769, 772, 3, 2, 2, 2, 770, 768, 3, 2, 2, 2, 770, 771, 3, 2, 2, 2, 771, 91, 3, 2, 2, 2, 772, 770, 3, 2, 2, 2, 773, 774, 7, 6, 2, 2, 774, 777, 5, 74, 38, 2, 775, 776, 7, 70, 2, 2, 776, 778, 5, 338, 170, 2, 777, 775, 3, 2, 2, 2, 777, 778, 3, 2, 2, 2, 778, 93, 3, 2, 2, 2, 779, 784, 5, 96, 49, 2, 780, 781, 7, 15, 2, 2, 781, 783, 5, 96, 49, 2, 782, 780, 3, 2, 2, 2, 783, 786, 3, 2, 2, 2, 784, 782, 3, 2, 2, 2, 784, 785, 3, 2, 2, 2, 785, 95, 3, 2, 2, 2, 786, 784, 3, 2, 2, 2, 787, 794, 5, 98, 50, 2, 788, 794, 5, 100, 51, 2, 789, 794, 5, 126, 64, 2, 790, 794, 5, 130, 66, 2, 791, 794, 5, 134, 68, 2, 792, 794, 5, 136, 69, 2, 793, 787, 3, 2, 2, 2, 793, 788, 3, 2, 2, 2, 793, 789, 3, 2, 2, 2, 793, 790, 3, 2, 2, 2, 793, 791, 3, 2, 2, 2, 793, 792, 3, 2, 2, 2, 794, 97, 3, 2, 2, 2, 795, 804, 5, 122, 62, 2, 796, 804, 5, 140, 71, 2, 797, 804, 5, 216, 109, 2, 798, 804, 5, 218, 110, 2, 799, 804, 5, 220, 111, 2, 800, 804, 5, 222, 112, 2, 801, 804, 5, 224, 113, 2, 802, 804, 5, 226, 114, 2, 803, 795, 3, 2, 2, 2, 803, 796, 3, 2, 2, 2, 803, 797, 3, 2, 2, 2, 803, 798, 3, 2, 2, 2, 803, 799, 3, 2, 2, 2, 803, 800, 3, 2, 2, 2, 803, 801, 3, 2, 2, 2, 803, 802, 3, 2, 2, 2, 804, 99, 3, 2, 2, 2, 805, 808, 5, 102, 52, 2, 806, 808, 5, 106, 54, 2, 807, 805, 3, 2, 2, 2, 807, 806, 3, 2, 2, 2, 808, 817, 3, 2, 2, 2, 809, 816, 5, 102, 52, 2, 810, 816, 5, 106, 54, 2, 811, 816, 5, 110, 56, 2, 812, 816, 5, 112, 57, 2, 813, 816, 5, 116, 59, 2, 814, 816, 5, 120, 61, 2, 815, 809, 3, 2, 2, 2, 815, 810, 3, 2, 2, 2, 815, 811, 3, 2, 2, 2, 815, 812, 3, 2, 2, 2, 815, 813, 3, 2, 2, 2, 815, 814, 3, 2, 2, 2, 816, 819, 3, 2, 2, 2, 817, 815, 3, 2, 2, 2, 817, 818, 3, 2, 2, 2, 818, 820, 3, 2, 2, 2, 819, 817, 3, 2, 2, 2, 820, 821, 7, 67, 2, 2, 821, 822, 5, 96, 49, 2, 822, 101, 3, 2, 2, 2, 823, 824, 7, 61, 2, 2, 824, 829, 5, 104, 53, 2, 825, 826, 7, 15, 2, 2, 826, 828, 5, 104, 53, 2, 827, 825, 3, 2, 2, 2, 828, 831, 3, 2, 2, 2, 829, 827, 3, 2, 2, 2, 829, 830, 3, 2, 2, 2, 830, 103, 3, 2, 2, 2, 831, 829, 3, 2, 2, 2, 832, 835, 5, 194, 98, 2, 833, 834, 7, 70, 2, 2, 834, 836, 5, 338, 170, 2, 835, 833, 3, 2, 2, 2, 835, 836, 3, 2, 2, 2, 836, 839, 3, 2, 2, 2, 837, 838, 7, 72, 2, 2, 838, 840, 7, 73, 2, 2, 839, 837, 3, 2, 2, 2, 839, 840, 3, 2, 2, 2, 840, 843, 3, 2, 2, 2, 841, 842, 7, 71, 2, 2, 842, 844, 5, 194, 98, 2, 843, 841, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 845, 3, 2, 2, 2, 845, 846, 7, 69, 2, 2, 846, 847, 5, 96, 49, 2, 847, 105, 3, 2, 2, 2, 848, 849, 7, 62, 2, 2, 849, 854, 5, 108, 55, 2, 850, 851, 7, 15, 2, 2, 851, 853, 5, 108, 55, 2, 852, 850, 3, 2, 2, 2, 853, 856, 3, 2, 2, 2, 854, 852, 3, 2, 2, 2, 854, 855, 3, 2, 2, 2, 855, 107, 3, 2, 2, 2, 856, 854, 3, 2, 2, 2, 857, 860, 5, 194, 98, 2, 858, 859, 7, 70, 2, 2, 859, 861, 5, 338, 170, 2, 860, 858, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 862, 3, 2, 2, 2, 862, 863, 7, 7, 2, 2, 863, 864, 5, 96, 49, 2, 864, 109, 3, 2, 2, 2, 865, 866, 7, 63, 2, 2, 866, 867, 5, 96, 49, 2, 867, 111, 3, 2, 2, 2, 868, 869, 7, 64, 2, 2, 869, 870, 7, 65, 2, 2, 870, 875, 5, 114, 58, 2, 871, 872, 7, 15, 2, 2, 872, 874, 5, 114, 58, 2, 873, 871, 3, 2, 2, 2, 874, 877, 3, 2, 2, 2, 875, 873, 3, 2, 2, 2, 875, 876, 3, 2, 2, 2, 876, 113, 3, 2, 2, 2, 877, 875, 3, 2, 2, 2, 878, 885, 5, 194, 98, 2, 879, 880, 7, 70, 2, 2, 880, 882, 5, 338, 170, 2, 881, 879, 3, 2, 2, 2, 881, 882, 3, 2, 2, 2, 882, 883, 3, 2, 2, 2, 883, 884, 7, 7, 2, 2, 884, 886, 5, 96, 49, 2, 885, 881, 3, 2, 2, 2, 885, 886, 3, 2, 2, 2, 886, 889, 3, 2, 2, 2, 887, 888, 7, 81, 2, 2, 888, 890, 5, 354, 178, 2, 889, 887, 3, 2, 2, 2, 889, 890, 3, 2, 2, 2, 890, 115, 3, 2, 2, 2, 891, 892, 7, 66, 2, 2, 892, 897, 7, 65, 2, 2, 893, 894, 7, 75, 2, 2, 894, 895, 7, 66, 2, 2, 895, 897, 7, 65, 2, 2, 896, 891, 3, 2, 2, 2, 896, 893, 3, 2, 2, 2, 897, 898, 3, 2, 2, 2, 898, 903, 5, 118, 60, 2, 899, 900, 7, 15, 2, 2, 900, 902, 5, 118, 60, 2, 901, 899, 3, 2, 2, 2, 902, 905, 3, 2, 2, 2, 903, 901, 3, 2, 2, 2, 903, 904, 3, 2, 2, 2, 904, 117, 3, 2, 2, 2, 905, 903, 3, 2, 2, 2, 906, 909, 5, 96, 49, 2, 907, 910, 7, 76, 2, 2, 908, 910, 7, 77, 2, 2, 909, 907, 3, 2, 2, 2, 909, 908, 3, 2, 2, 2, 909, 910, 3, 2, 2, 2, 910, 916, 3, 2, 2, 2, 911, 914, 7, 73, 2, 2, 912, 915, 7, 82, 2, 2, 913, 915, 7, 83, 2, 2, 914, 912, 3, 2, 2, 2, 914, 913, 3, 2, 2, 2, 915, 917, 3, 2, 2, 2, 916, 911, 3, 2, 2, 2, 916, 917, 3, 2, 2, 2, 917, 920, 3, 2, 2, 2, 918, 919, 7, 81, 2, 2, 919, 921, 5, 354, 178, 2, 920, 918, 3, 2, 2, 2, 920, 921, 3, 2, 2, 2, 921, 119, 3, 2, 2, 2, 922, 923, 7, 74, 2, 2, 923, 924, 5, 194, 98, 2, 924, 121, 3, 2, 2, 2, 925, 928, 7, 78, 2, 2, 926, 928, 7, 79, 2, 2, 927, 925, 3, 2, 2, 2, 927, 926, 3, 2, 2, 2, 928, 929, 3, 2, 2, 2, 929, 934, 5, 124, 63, 2, 930, 931, 7, 15, 2, 2, 931, 933, 5, 124, 63, 2, 932, 930, 3, 2, 2, 2, 933, 936, 3, 2, 2, 2, 934, 932, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 937, 3, 2, 2, 2, 936, 934, 3, 2, 2, 2, 937, 938, 7, 80, 2, 2, 938, 939, 5, 96, 49, 2, 939, 123, 3, 2, 2, 2, 940, 943, 5, 194, 98, 2, 941, 942, 7, 70, 2, 2, 942, 944, 5, 338, 170, 2, 943, 941, 3, 2, 2, 2, 943, 944, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 946, 7, 69, 2, 2, 946, 947, 5, 96, 49, 2, 947, 125, 3, 2, 2, 2, 948, 949, 7, 84, 2, 2, 949, 950, 7, 10, 2, 2, 950, 951, 5, 94, 48, 2, 951, 953, 7, 11, 2, 2, 952, 954, 5, 128, 65, 2, 953, 952, 3, 2, 2, 2, 954, 955, 3, 2, 2, 2, 955, 953, 3, 2, 2, 2, 955, 956, 3, 2, 2, 2, 956, 957, 3, 2, 2, 2, 957, 958, 7, 88, 2, 2, 958, 959, 7, 67, 2, 2, 959, 960, 5, 96, 49, 2, 960, 127, 3, 2, 2, 2, 961, 962, 7, 85, 2, 2, 962, 964, 5, 96, 49, 2, 963, 961, 3, 2, 2, 2, 964, 965, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 967, 3, 2, 2, 2, 967, 968, 7, 67, 2, 2, 968, 969, 5, 96, 49, 2, 969, 129, 3, 2, 2, 2, 970, 971, 7, 91, 2, 2, 971, 972, 7, 10, 2, 2, 972, 973, 5, 94, 48, 2, 973, 975, 7, 11, 2, 2, 974, 976, 5, 132, 67, 2, 975, 974, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 975, 3, 2, 2, 2, 977, 978, 3, 2, 2, 2, 978, 979, 3, 2, 2, 2, 979, 981, 7, 88, 2, 2, 980, 982, 5, 194, 98, 2, 981, 980, 3, 2, 2, 2, 981, 982, 3, 2, 2, 2, 982, 983, 3, 2, 2, 2, 983, 984, 7, 67, 2, 2, 984, 985, 5, 96, 49, 2, 985, 131, 3, 2, 2, 2, 986, 990, 7, 85, 2, 2, 987, 988, 5, 194, 98, 2, 988, 989, 7, 70, 2, 2, 989, 991, 3, 2, 2, 2, 990, 987, 3, 2, 2, 2, 990, 991, 3, 2, 2, 2, 991, 992, 3, 2, 2, 2, 992, 997, 5, 338, 170, 2, 993, 994, 7, 13, 2, 2, 994, 996, 5, 338, 170, 2, 995, 993, 3, 2, 2, 2, 996, 999, 3, 2, 2, 2, 997, 995, 3, 2, 2, 2, 997, 998, 3, 2, 2, 2, 998, 1000, 3, 2, 2, 2, 999, 997, 3, 2, 2, 2, 1000, 1001, 7, 67, 2, 2, 1001, 1002, 5, 96, 49, 2, 1002, 133, 3, 2, 2, 2, 1003, 1004, 7, 68, 2, 2, 1004, 1005, 7, 10, 2, 2, 1005, 1006, 5, 94, 48, 2, 1006, 1007, 7, 11, 2, 2, 1007, 1008, 7, 89, 2, 2, 1008, 1009, 5, 96, 49, 2, 1009, 1010, 7, 90, 2, 2, 1010, 1011, 5, 96, 49, 2, 1011, 135, 3, 2, 2, 2, 1012, 1013, 7, 86, 2, 2, 1013, 1014, 7, 8, 2, 2, 1014, 1015, 5, 94, 48, 2, 1015, 1017, 7, 9, 2, 2, 1016, 1018, 5, 138, 70, 2, 1017, 1016, 3, 2, 2, 2, 1018, 1019, 3, 2, 2, 2, 1019, 1017, 3, 2, 2, 2, 1019, 1020, 3, 2, 2, 2, 1020, 137, 3, 2, 2, 2, 1021, 1024, 7, 87, 2, 2, 1022, 1025, 7, 12, 2, 2, 1023, 1025, 5, 74, 38, 2, 1024, 1022, 3, 2, 2, 2, 1024, 1023, 3, 2, 2, 2, 1025, 1033, 3, 2, 2, 2, 1026, 1029, 7, 13, 2, 2, 1027, 1030, 7, 12, 2, 2, 1028, 1030, 5, 74, 38, 2, 1029, 1027, 3, 2, 2, 2, 1029, 1028, 3, 2, 2, 2, 1030, 1032, 3, 2, 2, 2, 1031, 1026, 3, 2, 2, 2, 1032, 1035, 3, 2, 2, 2, 1033, 1031, 3, 2, 2, 2, 1033, 1034, 3, 2, 2, 2, 1034, 1036, 3, 2, 2, 2, 1035, 1033, 3, 2, 2, 2, 1036, 1037, 7, 8, 2, 2, 1037, 1038, 5, 94, 48, 2, 1038, 1039, 7, 9, 2, 2, 1039, 139, 3, 2, 2, 2, 1040, 1045, 5, 142, 72, 2, 1041, 1042, 7, 92, 2, 2, 1042, 1044, 5, 142, 72, 2, 1043, 1041, 3, 2, 2, 2, 1044, 1047, 3, 2, 2, 2, 1045, 1043, 3, 2, 2, 2, 1045, 1046, 3, 2, 2, 2, 1046, 141, 3, 2, 2, 2, 1047, 1045, 3, 2, 2, 2, 1048, 1053, 5, 144, 73, 2, 1049, 1050, 7, 93, 2, 2, 1050, 1052, 5, 144, 73, 2, 1051, 1049, 3, 2, 2, 2, 1052, 1055, 3, 2, 2, 2, 1053, 1051, 3, 2, 2, 2, 1053, 1054, 3, 2, 2, 2, 1054, 143, 3, 2, 2, 2, 1055, 1053, 3, 2, 2, 2, 1056, 1058, 7, 94, 2, 2, 1057, 1056, 3, 2, 2, 2, 1057, 1058, 3, 2, 2, 2, 1058, 1059, 3, 2, 2, 2, 1059, 1060, 5, 146, 74, 2, 1060, 145, 3, 2, 2, 2, 1061, 1064, 5, 148, 75, 2, 1062, 1063, 9, 5, 2, 2, 1063, 1065, 5, 148, 75, 2, 1064, 1062, 3, 2, 2, 2, 1064, 1065, 3, 2, 2, 2, 1065, 147, 3, 2, 2, 2, 1066, 1071, 5, 150, 76, 2, 1067, 1068, 7, 46, 2, 2, 1068, 1070, 5, 150, 76, 2, 1069, 1067, 3, 2, 2, 2, 1070, 1073, 3, 2, 2, 2, 1071, 1069, 3, 2, 2, 2, 1071, 1072, 3, 2, 2, 2, 1072, 149, 3, 2, 2, 2, 1073, 1071, 3, 2, 2, 2, 1074, 1077, 5, 152, 77, 2, 1075, 1076, 7, 95, 2, 2, 1076, 1078, 5, 152, 77, 2, 1077, 1075, 3, 2, 2, 2, 1077, 1078, 3, 2, 2, 2, 1078, 151, 3, 2, 2, 2, 1079, 1084, 5, 154, 78, 2, 1080, 1081, 9, 6, 2, 2, 1081, 1083, 5, 154, 78, 2, 1082, 1080, 3, 2, 2, 2, 1083, 1086, 3, 2, 2, 2, 1084, 1082, 3, 2, 2, 2, 1084, 1085, 3, 2, 2, 2, 1085, 153, 3, 2, 2, 2, 1086, 1084, 3, 2, 2, 2, 1087, 1092, 5, 156, 79, 2, 1088, 1089, 9, 7, 2, 2, 1089, 1091, 5, 156, 79, 2, 1090, 1088, 3, 2, 2, 2, 1091, 1094, 3, 2, 2, 2, 1092, 1090, 3, 2, 2, 2, 1092, 1093, 3, 2, 2, 2, 1093, 155, 3, 2, 2, 2, 1094, 1092, 3, 2, 2, 2, 1095, 1099, 5, 158, 80, 2, 1096, 1097, 7, 96, 2, 2, 1097, 1098, 7, 97, 2, 2, 1098, 1100, 5, 338, 170, 2, 1099, 1096, 3, 2, 2, 2, 1099, 1100, 3, 2, 2, 2, 1100, 157, 3, 2, 2, 2, 1101, 1105, 5, 160, 81, 2, 1102, 1103, 7, 99, 2, 2, 1103, 1104, 7, 98, 2, 2, 1104, 1106, 5, 338, 170, 2, 1105, 1102, 3, 2, 2, 2, 1105, 1106, 3, 2, 2, 2, 1106, 159, 3, 2, 2, 2, 1107, 1111, 5, 162, 82, 2, 1108, 1109, 7, 100, 2, 2, 1109, 1110, 7, 70, 2, 2, 1110, 1112, 5, 338, 170, 2, 1111, 1108, 3, 2, 2, 2, 1111, 1112, 3, 2, 2, 2, 1112, 161, 3, 2, 2, 2, 1113, 1117, 5, 164, 83, 2, 1114, 1115, 7, 102, 2, 2, 1115, 1116, 7, 70, 2, 2, 1116, 1118, 5, 348, 175, 2, 1117, 1114, 3, 2, 2, 2, 1117, 1118, 3, 2, 2, 2, 1118, 163, 3, 2, 2, 2, 1119, 1123, 5, 166, 84, 2, 1120, 1121, 7, 101, 2, 2, 1121, 1122, 7, 70, 2, 2, 1122, 1124, 5, 348, 175, 2, 1123, 1120, 3, 2, 2, 2, 1123, 1124, 3, 2, 2, 2, 1124, 165, 3, 2, 2, 2, 1125, 1134, 5, 170, 86, 2, 1126, 1127, 7, 5, 2, 2, 1127, 1128, 7, 44, 2, 2, 1128, 1129, 3, 2, 2, 2, 1129, 1130, 5, 168, 85, 2, 1130, 1131, 5, 206, 104, 2, 1131, 1133, 3, 2, 2, 2, 1132, 1126, 3, 2, 2, 2, 1133, 1136, 3, 2, 2, 2, 1134, 1132, 3, 2, 2, 2, 1134, 1135, 3, 2, 2, 2, 1135, 167, 3, 2, 2, 2, 1136, 1134, 3, 2, 2, 2, 1137, 1141, 5, 74, 38, 2, 1138, 1141, 5, 194, 98, 2, 1139, 1141, 5, 196, 99, 2, 1140, 1137, 3, 2, 2, 2, 1140, 1138, 3, 2, 2, 2, 1140, 1139, 3, 2, 2, 2, 1141, 169, 3, 2, 2, 2, 1142, 1144, 9, 6, 2, 2, 1143, 1142, 3, 2, 2, 2, 1144, 1147, 3, 2, 2, 2, 1145, 1143, 3, 2, 2, 2, 1145, 1146, 3, 2, 2, 2, 1146, 1148, 3, 2, 2, 2, 1147, 1145, 3, 2, 2, 2, 1148, 1149, 5, 172, 87, 2, 1149, 171, 3, 2, 2, 2, 1150, 1154, 5, 178, 90, 2, 1151, 1154, 5, 174, 88, 2, 1152, 1154, 5, 176, 89, 2, 1153, 1150, 3, 2, 2, 2, 1153, 1151, 3, 2, 2, 2, 1153, 1152, 3, 2, 2, 2, 1154, 173, 3, 2, 2, 2, 1155, 1156, 7, 109, 2, 2, 1156, 1157, 7, 108, 2, 2, 1157, 1158, 5, 338, 170, 2, 1158, 1159, 7, 8, 2, 2, 1159, 1160, 5, 94, 48, 2, 1160, 1161, 7, 9, 2, 2, 1161, 175, 3, 2, 2, 2, 1162, 1163, 7, 110, 2, 2, 1163, 1164, 7, 108, 2, 2, 1164, 1165, 5, 338, 170, 2, 1165, 1166, 7, 8, 2, 2, 1166, 1167, 5, 94, 48, 2, 1167, 1168, 7, 9, 2, 2, 1168, 177, 3, 2, 2, 2, 1169, 1174, 5, 180, 91, 2, 1170, 1171, 7, 52, 2, 2, 1171, 1173, 5, 180, 91, 2, 1172, 1170, 3, 2, 2, 2, 1173, 1176, 3, 2, 2, 2, 1174, 1172, 3, 2, 2, 2, 1174, 1175, 3, 2, 2, 2, 1175, 179, 3, 2, 2, 2, 1176, 1174, 3, 2, 2, 2, 1177, 1185, 5, 190, 96, 2, 1178, 1184, 5, 182, 92, 2, 1179, 1184, 5, 186, 94, 2, 1180, 1184, 5, 188, 95, 2, 1181, 1184, 5, 184, 93, 2, 1182, 1184, 5, 206, 104, 2, 1183, 1178, 3, 2, 2, 2, 1183, 1179, 3, 2, 2, 2, 1183, 1180, 3, 2, 2, 2, 1183, 1181, 3, 2, 2, 2, 1183, 1182, 3, 2, 2, 2, 1184, 1187, 3, 2, 2, 2, 1185, 1183, 3, 2, 2, 2, 1185, 1186, 3, 2, 2, 2, 1186, 181, 3, 2, 2, 2, 1187, 1185, 3, 2, 2, 2, 1188, 1189, 7, 53, 2, 2, 1189, 1190, 7, 53, 2, 2, 1190, 1191, 5, 94, 48, 2, 1191, 1192, 7, 54, 2, 2, 1192, 1193, 7, 54, 2, 2, 1193, 183, 3, 2, 2, 2, 1194, 1195, 7, 53, 2, 2, 1195, 1196, 7, 54, 2, 2, 1196, 185, 3, 2, 2, 2, 1197, 1198, 7, 53, 2, 2, 1198, 1199, 5, 94, 48, 2, 1199, 1200, 7, 54, 2, 2, 1200, 187, 3, 2, 2, 2, 1201, 1208, 7, 55, 2, 2, 1202, 1209, 5, 358, 180, 2, 1203, 1209, 5, 356, 179, 2, 1204, 1209, 7, 178, 2, 2, 1205, 1209, 5, 196, 99, 2, 1206, 1209, 5, 194, 98, 2, 1207, 1209, 5, 198, 100, 2, 1208, 1202, 3, 2, 2, 2, 1208, 1203, 3, 2, 2, 2, 1208, 1204, 3, 2, 2, 2, 1208, 1205, 3, 2, 2, 2, 1208, 1206, 3, 2, 2, 2, 1208, 1207, 3, 2, 2, 2, 1209, 189, 3, 2, 2, 2, 1210, 1226, 7, 171, 2, 2, 1211, 1226, 7, 106, 2, 2, 1212, 1226, 7, 107, 2, 2, 1213, 1226, 7, 172, 2, 2, 1214, 1226, 5, 356, 179, 2, 1215, 1226, 5, 194, 98, 2, 1216, 1226, 5, 196, 99, 2, 1217, 1226, 5, 198, 100, 2, 1218, 1226, 5, 340, 171, 2, 1219, 1226, 5, 204, 103, 2, 1220, 1226, 5, 200, 101, 2, 1221, 1226, 5, 202, 102, 2, 1222, 1226, 5, 352, 177, 2, 1223, 1226, 5, 210, 106, 2, 1224, 1226, 5, 192, 97, 2, 1225, 1210, 3, 2, 2, 2, 1225, 1211, 3, 2, 2, 2, 1225, 1212, 3, 2, 2, 2, 1225, 1213, 3, 2, 2, 2, 1225, 1214, 3, 2, 2, 2, 1225, 1215, 3, 2, 2, 2, 1225, 1216, 3, 2, 2, 2, 1225, 1217, 3, 2, 2, 2, 1225, 1218, 3, 2, 2, 2, 1225, 1219, 3, 2, 2, 2, 1225, 1220, 3, 2, 2, 2, 1225, 1221, 3, 2, 2, 2, 1225, 1222, 3, 2, 2, 2, 1225, 1223, 3, 2, 2, 2, 1225, 1224, 3, 2, 2, 2, 1226, 191, 3, 2, 2, 2, 1227, 1228, 7, 8, 2, 2, 1228, 1229, 5, 16, 9, 2, 1229, 1230, 7, 9, 2, 2, 1230, 193, 3, 2, 2, 2, 1231, 1232, 7, 6, 2, 2, 1232, 1233, 5, 74, 38, 2, 1233, 195, 3, 2, 2, 2, 1234, 1236, 7, 10, 2, 2, 1235, 1237, 5, 94, 48, 2, 1236, 1235, 3, 2, 2, 2, 1236, 1237, 3, 2, 2, 2, 1237, 1238, 3, 2, 2, 2, 1238, 1239, 7, 11, 2, 2, 1239, 197, 3, 2, 2, 2, 1240, 1241, 7, 56, 2, 2, 1241, 199, 3, 2, 2, 2, 1242, 1243, 7, 17, 2, 2, 1243, 1244, 7, 8, 2, 2, 1244, 1245, 5, 94, 48, 2, 1245, 1246, 7, 9, 2, 2, 1246, 201, 3, 2, 2, 2, 1247, 1248, 7, 105, 2, 2, 1248, 1249, 7, 8, 2, 2, 1249, 1250, 5, 94, 48, 2, 1250, 1251, 7, 9, 2, 2, 1251, 203, 3, 2, 2, 2, 1252, 1253, 5, 74, 38, 2, 1253, 1254, 5, 206, 104, 2, 1254, 205, 3, 2, 2, 2, 1255, 1262, 7, 10, 2, 2, 1256, 1258, 5, 208, 105, 2, 1257, 1259, 7, 15, 2, 2, 1258, 1257, 3, 2, 2, 2, 1258, 1259, 3, 2, 2, 2, 1259, 1261, 3, 2, 2, 2, 1260, 1256, 3, 2, 2, 2, 1261, 1264, 3, 2, 2, 2, 1262, 1260, 3, 2, 2, 2, 1262, 1263, 3, 2, 2, 2, 1263, 1265, 3, 2, 2, 2, 1264, 1262, 3, 2, 2, 2, 1265, 1266, 7, 11, 2, 2, 1266, 207, 3, 2, 2, 2, 1267, 1270, 5, 96, 49, 2, 1268, 1270, 7, 170, 2, 2, 1269, 1267, 3, 2, 2, 2, 1269, 1268, 3, 2, 2, 2, 1270, 209, 3, 2, 2, 2, 1271, 1274, 5, 212, 107, 2, 1272, 1274, 5, 214, 108, 2, 1273, 1271, 3, 2, 2, 2, 1273, 1272, 3, 2, 2, 2, 1274, 211, 3, 2, 2, 2, 1275, 1276, 5, 74, 38, 2, 1276, 1277, 7, 57, 2, 2, 1277, 1278, 7, 172, 2, 2, 1278, 213, 3, 2, 2, 2, 1279, 1280, 5, 52, 27, 2, 1280, 1281, 7, 31, 2, 2, 1281, 1283, 7, 10, 2, 2, 1282, 1284, 5, 90, 46, 2, 1283, 1282, 3, 2, 2, 2, 1283, 1284, 3, 2, 2, 2, 1284, 1285, 3, 2, 2, 2, 1285, 1288, 7, 11, 2, 2, 1286, 1287, 7, 70, 2, 2, 1287, 1289, 5, 338, 170, 2, 1288, 1286, 3, 2, 2, 2, 1288, 1289, 3, 2, 2, 2, 1289, 1290, 3, 2, 2, 2, 1290, 1291, 7, 8, 2, 2, 1291, 1292, 5, 18, 10, 2, 1292, 1293, 7, 9, 2, 2, 1293, 215, 3, 2, 2, 2, 1294, 1295, 7, 115, 2, 2, 1295, 1296, 7, 124, 2, 2, 1296, 1297, 5, 96, 49, 2, 1297, 1298, 7, 122, 2, 2, 1298, 1302, 5, 96, 49, 2, 1299, 1300, 7, 71, 2, 2, 1300, 1301, 7, 126, 2, 2, 1301, 1303, 5, 96, 49, 2, 1302, 1299, 3, 2, 2, 2, 1302, 1303, 3, 2, 2, 2, 1303, 1318, 3, 2, 2, 2, 1304, 1305, 7, 115, 2, 2, 1305, 1306, 7, 124, 2, 2, 1306, 1311, 5, 350, 176, 2, 1307, 1308, 7, 15, 2, 2, 1308, 1310, 5, 350, 176, 2, 1309, 1307, 3, 2, 2, 2, 1310, 1313, 3, 2, 2, 2, 1311, 1309, 3, 2, 2, 2, 1311, 1312, 3, 2, 2, 2, 1312, 1314, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1314, 1315, 7, 122, 2, 2, 1315, 1316, 5, 96, 49, 2, 1316, 1318, 3, 2, 2, 2, 1317, 1294, 3, 2, 2, 2, 1317, 1304, 3, 2, 2, 2, 1318, 217, 3, 2, 2, 2, 1319, 1320, 7, 116, 2, 2, 1320, 1321, 7, 124, 2, 2, 1321, 1322, 5, 228, 115, 2, 1322, 219, 3, 2, 2, 2, 1323, 1324, 7, 117, 2, 2, 1324, 1325, 7, 124, 2, 2, 1325, 1326, 5, 228, 115, 2, 1326, 1327, 7, 70, 2, 2, 1327, 1328, 5, 96, 49, 2, 1328, 221, 3, 2, 2, 2, 1329, 1330, 7, 118, 2, 2, 1330, 1331, 7, 124, 2, 2, 1331, 1332, 7, 123, 2, 2, 1332, 1333, 7, 97, 2, 2, 1333, 1334, 5, 228, 115, 2, 1334, 1335, 7, 125, 2, 2, 1335, 1336, 5, 96, 49, 2, 1336, 223, 3, 2, 2, 2, 1337, 1338, 7, 119, 2, 2, 1338, 1339, 7, 124, 2, 2, 1339, 1344, 5, 230, 116, 2, 1340, 1341, 7, 15, 2, 2, 1341, 1343, 5, 230, 116, 2, 1342, 1340, 3, 2, 2, 2, 1343, 1346, 3, 2, 2, 2, 1344, 1342, 3, 2, 2, 2, 1344, 1345, 3, 2, 2, 2, 1345, 1347, 3, 2, 2, 2, 1346, 1344, 3, 2, 2, 2, 1347, 1348, 7, 120, 2, 2, 1348, 1349, 5, 96, 49, 2, 1349, 1350, 7, 67, 2, 2, 1350, 1351, 5, 96, 49, 2, 1351, 225, 3, 2, 2, 2, 1352, 1353, 7, 121, 2, 2, 1353, 1354, 7, 124, 2, 2, 1354, 1355, 5, 96, 49, 2, 1355, 1356, 7, 122, 2, 2, 1356, 1357, 5, 96, 49, 2, 1357, 227, 3, 2, 2, 2, 1358, 1361, 5, 190, 96, 2, 1359, 1362, 5, 182, 92, 2, 1360, 1362, 5, 188, 95, 2, 1361, 1359, 3, 2, 2, 2, 1361, 1360, 3, 2, 2, 2, 1362, 1363, 3, 2, 2, 2, 1363, 1361, 3, 2, 2, 2, 1363, 1364, 3, 2, 2, 2, 1364, 229, 3, 2, 2, 2, 1365, 1366, 5, 194, 98, 2, 1366, 1367, 7, 7, 2, 2, 1367, 1368, 5, 96, 49, 2, 1368, 231, 3, 2, 2, 2, 1369, 1370, 7, 133, 2, 2, 1370, 1372, 7, 134, 2, 2, 1371, 1373, 5, 234, 118, 2, 1372, 1371, 3, 2, 2, 2, 1372, 1373, 3, 2, 2, 2, 1373, 1374, 3, 2, 2, 2, 1374, 1384, 5, 354, 178, 2, 1375, 1376, 7, 71, 2, 2, 1376, 1381, 5, 354, 178, 2, 1377, 1378, 7, 15, 2, 2, 1378, 1380, 5, 354, 178, 2, 1379, 1377, 3, 2, 2, 2, 1380, 1383, 3, 2, 2, 2, 1381, 1379, 3, 2, 2, 2, 1381, 1382, 3, 2, 2, 2, 1382, 1385, 3, 2, 2, 2, 1383, 1381, 3, 2, 2, 2, 1384, 1375, 3, 2, 2, 2, 1384, 1385, 3, 2, 2, 2, 1385, 233, 3, 2, 2, 2, 1386, 1387, 7, 135, 2, 2, 1387, 1388, 7, 178, 2, 2, 1388, 1393, 7, 5, 2, 2, 1389, 1390, 7, 88, 2, 2, 1390, 1391, 7, 136, 2, 2, 1391, 1393, 7, 135, 2, 2, 1392, 1386, 3, 2, 2, 2, 1392, 1389, 3, 2, 2, 2, 1393, 235, 3, 2, 2, 2, 1394, 1396, 7, 137, 2, 2, 1395, 1397, 5, 238, 120, 2, 1396, 1395, 3, 2, 2, 2, 1396, 1397, 3, 2, 2, 2, 1397, 1402, 3, 2, 2, 2, 1398, 1399, 7, 138, 2, 2, 1399, 1402, 5, 238, 120, 2, 1400, 1402, 5, 238, 120, 2, 1401, 1394, 3, 2, 2, 2, 1401, 1398, 3, 2, 2, 2, 1401, 1400, 3, 2, 2, 2, 1402, 237, 3, 2, 2, 2, 1403, 1408, 5, 240, 121, 2, 1404, 1405, 9, 8, 2, 2, 1405, 1407, 5, 240, 121, 2, 1406, 1404, 3, 2, 2, 2, 1407, 1410, 3, 2, 2, 2, 1408, 1406, 3, 2, 2, 2, 1408, 1409, 3, 2, 2, 2, 1409, 239, 3, 2, 2, 2, 1410, 1408, 3, 2, 2, 2, 1411, 1414, 5, 180, 91, 2, 1412, 1414, 5, 242, 122, 2, 1413, 1411, 3, 2, 2, 2, 1413, 1412, 3, 2, 2, 2, 1414, 241, 3, 2, 2, 2, 1415, 1418, 5, 250, 126, 2, 1416, 1418, 5, 244, 123, 2, 1417, 1415, 3, 2, 2, 2, 1417, 1416, 3, 2, 2, 2, 1418, 1419, 3, 2, 2, 2, 1419, 1420, 5, 266, 134, 2, 1420, 243, 3, 2, 2, 2, 1421, 1422, 5, 246, 124, 2, 1422, 1423, 5, 256, 129, 2, 1423, 1426, 3, 2, 2, 2, 1424, 1426, 5, 248, 125, 2, 1425, 1421, 3, 2, 2, 2, 1425, 1424, 3, 2, 2, 2, 1426, 245, 3, 2, 2, 2, 1427, 1428, 9, 9, 2, 2, 1428, 1429, 7, 19, 2, 2, 1429, 1430, 7, 19, 2, 2, 1430, 247, 3, 2, 2, 2, 1431, 1433, 7, 139, 2, 2, 1432, 1431, 3, 2, 2, 2, 1432, 1433, 3, 2, 2, 2, 1433, 1434, 3, 2, 2, 2, 1434, 1435, 5, 256, 129, 2, 1435, 249, 3, 2, 2, 2, 1436, 1437, 5, 252, 127, 2, 1437, 1438, 5, 256, 129, 2, 1438, 1441, 3, 2, 2, 2, 1439, 1441, 5, 254, 128, 2, 1440, 1436, 3, 2, 2, 2, 1440, 1439, 3, 2, 2, 2, 1441, 251, 3, 2, 2, 2, 1442, 1443, 9, 10, 2, 2, 1443, 1444, 7, 19, 2, 2, 1444, 1445, 7, 19, 2, 2, 1445, 253, 3, 2, 2, 2, 1446, 1447, 7, 58, 2, 2, 1447, 255, 3, 2, 2, 2, 1448, 1451, 5, 258, 130, 2, 1449, 1451, 5, 272, 137, 2, 1450, 1448, 3, 2, 2, 2, 1450, 1449, 3, 2, 2, 2, 1451, 257, 3, 2, 2, 2, 1452, 1453, 5, 74, 38, 2, 1453, 1454, 5, 260, 131, 2, 1454, 259, 3, 2, 2, 2, 1455, 1459, 7, 12, 2, 2, 1456, 1459, 5, 262, 132, 2, 1457, 1459, 5, 264, 133, 2, 1458, 1455, 3, 2, 2, 2, 1458, 1456, 3, 2, 2, 2, 1458, 1457, 3, 2, 2, 2, 1459, 261, 3, 2, 2, 2, 1460, 1461, 7, 178, 2, 2, 1461, 1462, 7, 19, 2, 2, 1462, 1463, 7, 12, 2, 2, 1463, 263, 3, 2, 2, 2, 1464, 1465, 7, 12, 2, 2, 1465, 1466, 7, 19, 2, 2, 1466, 1467, 7, 178, 2, 2, 1467, 265, 3, 2, 2, 2, 1468, 1470, 5, 186, 94, 2, 1469, 1468, 3, 2, 2, 2, 1470, 1473, 3, 2, 2, 2, 1471, 1469, 3, 2, 2, 2, 1471, 1472, 3, 2, 2, 2, 1472, 267, 3, 2, 2, 2, 1473, 1471, 3, 2, 2, 2, 1474, 1486, 5, 74, 38, 2, 1475, 1486, 7, 171, 2, 2, 1476, 1486, 5, 272, 137, 2, 1477, 1478, 7, 113, 2, 2, 1478, 1479, 7, 10, 2, 2, 1479, 1486, 7, 11, 2, 2, 1480, 1486, 5, 342, 172, 2, 1481, 1486, 5, 310, 156, 2, 1482, 1486, 5, 316, 159, 2, 1483, 1486, 5, 270, 136, 2, 1484, 1486, 5, 322, 162, 2, 1485, 1474, 3, 2, 2, 2, 1485, 1475, 3, 2, 2, 2, 1485, 1476, 3, 2, 2, 2, 1485, 1477, 3, 2, 2, 2, 1485, 1480, 3, 2, 2, 2, 1485, 1481, 3, 2, 2, 2, 1485, 1482, 3, 2, 2, 2, 1485, 1483, 3, 2, 2, 2, 1485, 1484, 3, 2, 2, 2, 1486, 269, 3, 2, 2, 2, 1487, 1488, 5, 74, 38, 2, 1488, 271, 3, 2, 2, 2, 1489, 1502, 5, 278, 140, 2, 1490, 1502, 5, 294, 148, 2, 1491, 1502, 5, 288, 145, 2, 1492, 1502, 5, 298, 150, 2, 1493, 1502, 5, 292, 147, 2, 1494, 1502, 5, 286, 144, 2, 1495, 1502, 5, 282, 142, 2, 1496, 1502, 5, 280, 141, 2, 1497, 1502, 5, 284, 143, 2, 1498, 1502, 5, 326, 164, 2, 1499, 1502, 5, 276, 139, 2, 1500, 1502, 5, 274, 138, 2, 1501, 1489, 3, 2, 2, 2, 1501, 1490, 3, 2, 2, 2, 1501, 1491, 3, 2, 2, 2, 1501, 1492, 3, 2, 2, 2, 1501, 1493, 3, 2, 2, 2, 1501, 1494, 3, 2, 2, 2, 1501, 1495, 3, 2, 2, 2, 1501, 1496, 3, 2, 2, 2, 1501, 1497, 3, 2, 2, 2, 1501, 1498, 3, 2, 2, 2, 1501, 1499, 3, 2, 2, 2, 1501, 1500, 3, 2, 2, 2, 1502, 273, 3, 2, 2, 2, 1503, 1504, 7, 152, 2, 2, 1504, 1506, 7, 10, 2, 2, 1505, 1507, 7, 12, 2, 2, 1506, 1505, 3, 2, 2, 2, 1506, 1507, 3, 2, 2, 2, 1507, 1508, 3, 2, 2, 2, 1508, 1509, 7, 11, 2, 2, 1509, 275, 3, 2, 2, 2, 1510, 1511, 7, 153, 2, 2, 1511, 1512, 7, 10, 2, 2, 1512, 1513, 7, 11, 2, 2, 1513, 277, 3, 2, 2, 2, 1514, 1515, 7, 155, 2, 2, 1515, 1518, 7, 10, 2, 2, 1516, 1519, 5, 294, 148, 2, 1517, 1519, 5, 298, 150, 2, 1518, 1516, 3, 2, 2, 2, 1518, 1517, 3, 2, 2, 2, 1518, 1519, 3, 2, 2, 2, 1519, 1520, 3, 2, 2, 2, 1520, 1521, 7, 11, 2, 2, 1521, 279, 3, 2, 2, 2, 1522, 1523, 7, 156, 2, 2, 1523, 1524, 7, 10, 2, 2, 1524, 1525, 7, 11, 2, 2, 1525, 281, 3, 2, 2, 2, 1526, 1527, 7, 166, 2, 2, 1527, 1528, 7, 10, 2, 2, 1528, 1529, 7, 11, 2, 2, 1529, 283, 3, 2, 2, 2, 1530, 1531, 7, 158, 2, 2, 1531, 1532, 7, 10, 2, 2, 1532, 1533, 7, 11, 2, 2, 1533, 285, 3, 2, 2, 2, 1534, 1535, 7, 157, 2, 2, 1535, 1538, 7, 10, 2, 2, 1536, 1539, 7, 178, 2, 2, 1537, 1539, 5, 356, 179, 2, 1538, 1536, 3, 2, 2, 2, 1538, 1537, 3, 2, 2, 2, 1538, 1539, 3, 2, 2, 2, 1539, 1540, 3, 2, 2, 2, 1540, 1541, 7, 11, 2, 2, 1541, 287, 3, 2, 2, 2, 1542, 1543, 7, 142, 2, 2, 1543, 1549, 7, 10, 2, 2, 1544, 1547, 5, 290, 146, 2, 1545, 1546, 7, 15, 2, 2, 1546, 1548, 5, 308, 155, 2, 1547, 1545, 3, 2, 2, 2, 1547, 1548, 3, 2, 2, 2, 1548, 1550, 3, 2, 2, 2, 1549, 1544, 3, 2, 2, 2, 1549, 1550, 3, 2, 2, 2, 1550, 1551, 3, 2, 2, 2, 1551, 1552, 7, 11, 2, 2, 1552, 289, 3, 2, 2, 2, 1553, 1556, 5, 302, 152, 2, 1554, 1556, 7, 12, 2, 2, 1555, 1553, 3, 2, 2, 2, 1555, 1554, 3, 2, 2, 2, 1556, 291, 3, 2, 2, 2, 1557, 1558, 7, 159, 2, 2, 1558, 1559, 7, 10, 2, 2, 1559, 1560, 5, 324, 163, 2, 1560, 1561, 7, 11, 2, 2, 1561, 293, 3, 2, 2, 2, 1562, 1563, 7, 136, 2, 2, 1563, 1572, 7, 10, 2, 2, 1564, 1570, 5, 296, 149, 2, 1565, 1566, 7, 15, 2, 2, 1566, 1568, 5, 308, 155, 2, 1567, 1569, 7, 170, 2, 2, 1568, 1567, 3, 2, 2, 2, 1568, 1569, 3, 2, 2, 2, 1569, 1571, 3, 2, 2, 2, 1570, 1565, 3, 2, 2, 2, 1570, 1571, 3, 2, 2, 2, 1571, 1573, 3, 2, 2, 2, 1572, 1564, 3, 2, 2, 2, 1572, 1573, 3, 2, 2, 2, 1573, 1574, 3, 2, 2, 2, 1574, 1575, 7, 11, 2, 2, 1575, 295, 3, 2, 2, 2, 1576, 1579, 5, 304, 153, 2, 1577, 1579, 7, 12, 2, 2, 1578, 1576, 3, 2, 2, 2, 1578, 1577, 3, 2, 2, 2, 1579, 297, 3, 2, 2, 2, 1580, 1581, 7, 160, 2, 2, 1581, 1582, 7, 10, 2, 2, 1582, 1583, 5, 300, 151, 2, 1583, 1584, 7, 11, 2, 2, 1584, 299, 3, 2, 2, 2, 1585, 1586, 5, 304, 153, 2, 1586, 301, 3, 2, 2, 2, 1587, 1588, 5, 74, 38, 2, 1588, 303, 3, 2, 2, 2, 1589, 1590, 5, 74, 38, 2, 1590, 305, 3, 2, 2, 2, 1591, 1592, 5, 308, 155, 2, 1592, 307, 3, 2, 2, 2, 1593, 1594, 5, 74, 38, 2, 1594, 309, 3, 2, 2, 2, 1595, 1598, 5, 312, 157, 2, 1596, 1598, 5, 314, 158, 2, 1597, 1595, 3, 2, 2, 2, 1597, 1596, 3, 2, 2, 2, 1598, 311, 3, 2, 2, 2, 1599, 1600, 7, 168, 2, 2, 1600, 1601, 7, 10, 2, 2, 1601, 1602, 7, 12, 2, 2, 1602, 1603, 7, 11, 2, 2, 1603, 313, 3, 2, 2, 2, 1604, 1605, 7, 168, 2, 2, 1605, 1606, 7, 10, 2, 2, 1606, 1607, 5, 74, 38, 2, 1607, 1608, 7, 15, 2, 2, 1608, 1609, 5, 338, 170, 2, 1609, 1610, 7, 11, 2, 2, 1610, 315, 3, 2, 2, 2, 1611, 1614, 5, 318, 160, 2, 1612, 1614, 5, 320, 161, 2, 1613, 1611, 3, 2, 2, 2, 1613, 1612, 3, 2, 2, 2, 1614, 317, 3, 2, 2, 2, 1615, 1616, 7, 167, 2, 2, 1616, 1617, 7, 10, 2, 2, 1617, 1618, 7, 12, 2, 2, 1618, 1619, 7, 11, 2, 2, 1619, 319, 3, 2, 2, 2, 1620, 1621, 7, 167, 2, 2, 1621, 1622, 7, 10, 2, 2, 1622, 1623, 5, 338, 170, 2, 1623, 1624, 7, 11, 2, 2, 1624, 321, 3, 2, 2, 2, 1625, 1626, 7, 10, 2, 2, 1626, 1627, 5, 268, 135, 2, 1627, 1628, 7, 11, 2, 2, 1628, 323, 3, 2, 2, 2, 1629, 1630, 5, 302, 152, 2, 1630, 325, 3, 2, 2, 2, 1631, 1637, 5, 328, 165, 2, 1632, 1637, 5, 330, 166, 2, 1633, 1637, 5, 332, 167, 2, 1634, 1637, 5, 334, 168, 2, 1635, 1637, 5, 336, 169, 2, 1636, 1631, 3, 2, 2, 2, 1636, 1632, 3, 2, 2, 2, 1636, 1633, 3, 2, 2, 2, 1636, 1634, 3, 2, 2, 2, 1636, 1635, 3, 2, 2, 2, 1637, 327, 3, 2, 2, 2, 1638, 1639, 7, 161, 2, 2, 1639, 1641, 7, 10, 2, 2, 1640, 1642, 5, 356, 179, 2, 1641, 1640, 3, 2, 2, 2, 1641, 1642, 3, 2, 2, 2, 1642, 1643, 3, 2, 2, 2, 1643, 1644, 7, 11, 2, 2, 1644, 329, 3, 2, 2, 2, 1645, 1646, 7, 165, 2, 2, 1646, 1648, 7, 10, 2, 2, 1647, 1649, 5, 356, 179, 2, 1648, 1647, 3, 2, 2, 2, 1648, 1649, 3, 2, 2, 2, 1649, 1650, 3, 2, 2, 2, 1650, 1651, 7, 11, 2, 2, 1651, 331, 3, 2, 2, 2, 1652, 1653, 7, 164, 2, 2, 1653, 1655, 7, 10, 2, 2, 1654, 1656, 5, 356, 179, 2, 1655, 1654, 3, 2, 2, 2, 1655, 1656, 3, 2, 2, 2, 1656, 1657, 3, 2, 2, 2, 1657, 1658, 7, 11, 2, 2, 1658, 333, 3, 2, 2, 2, 1659, 1660, 7, 162, 2, 2, 1660, 1662, 7, 10, 2, 2, 1661, 1663, 5, 356, 179, 2, 1662, 1661, 3, 2, 2, 2, 1662, 1663, 3, 2, 2, 2, 1663, 1664, 3, 2, 2, 2, 1664, 1665, 7, 11, 2, 2, 1665, 335, 3, 2, 2, 2, 1666, 1667, 7, 163, 2, 2, 1667, 1669, 7, 10, 2, 2, 1668, 1670, 5, 356, 179, 2, 1669, 1668, 3, 2, 2, 2, 1669, 1670, 3, 2, 2, 2, 1670, 1671, 3, 2, 2, 2, 1671, 1672, 7, 11, 2, 2, 1672, 337, 3, 2, 2, 2, 1673, 1674, 7, 10, 2, 2, 1674, 1682, 7, 11, 2, 2, 1675, 1679, 5, 268, 135, 2, 1676, 1680, 7, 170, 2, 2, 1677, 1680, 7, 12, 2, 2, 1678, 1680, 7, 47, 2, 2, 1679, 1676, 3, 2, 2, 2, 1679, 1677, 3, 2, 2, 2, 1679, 1678, 3, 2, 2, 2, 1679, 1680, 3, 2, 2, 2, 1680, 1682, 3, 2, 2, 2, 1681, 1673, 3, 2, 2, 2, 1681, 1675, 3, 2, 2, 2, 1682, 339, 3, 2, 2, 2, 1683, 1692, 7, 8, 2, 2, 1684, 1689, 5, 350, 176, 2, 1685, 1686, 7, 15, 2, 2, 1686, 1688, 5, 350, 176, 2, 1687, 1685, 3, 2, 2, 2, 1688, 1691, 3, 2, 2, 2, 1689, 1687, 3, 2, 2, 2, 1689, 1690, 3, 2, 2, 2, 1690, 1693, 3, 2, 2, 2, 1691, 1689, 3, 2, 2, 2, 1692, 1684, 3, 2, 2, 2, 1692, 1693, 3, 2, 2, 2, 1693, 1694, 3, 2, 2, 2, 1694, 1700, 7, 9, 2, 2, 1695, 1696, 7, 59, 2, 2, 1696, 1697, 5, 94, 48, 2, 1697, 1698, 7, 60, 2, 2, 1698, 1700, 3, 2, 2, 2, 1699, 1683, 3, 2, 2, 2, 1699, 1695, 3, 2, 2, 2, 1700, 341, 3, 2, 2, 2, 1701, 1704, 5, 344, 173, 2, 1702, 1704, 5, 346, 174, 2, 1703, 1701, 3, 2, 2, 2, 1703, 1702, 3, 2, 2, 2, 1704, 343, 3, 2, 2, 2, 1705, 1706, 7, 31, 2, 2, 1706, 1707, 7, 10, 2, 2, 1707, 1708, 7, 12, 2, 2, 1708, 1709, 7, 11, 2, 2, 1709, 345, 3, 2, 2, 2, 1710, 1711, 7, 31, 2, 2, 1711, 1720, 7, 10, 2, 2, 1712, 1717, 5, 338, 170, 2, 1713, 1714, 7, 15, 2, 2, 1714, 1716, 5, 338, 170, 2, 1715, 1713, 3, 2, 2, 2, 1716, 1719, 3, 2, 2, 2, 1717, 1715, 3, 2, 2, 2, 1717, 1718, 3, 2, 2, 2, 1718, 1721, 3, 2, 2, 2, 1719, 1717, 3, 2, 2, 2, 1720, 1712, 3, 2, 2, 2, 1720, 1721, 3, 2, 2, 2, 1721, 1722, 3, 2, 2, 2, 1722, 1723, 7, 11, 2, 2, 1723, 1724, 7, 70, 2, 2, 1724, 1725, 5, 338, 170, 2, 1725, 347, 3, 2, 2, 2, 1726, 1728, 5, 268, 135, 2, 1727, 1729, 7, 170, 2, 2, 1728, 1727, 3, 2, 2, 2, 1728, 1729, 3, 2, 2, 2, 1729, 349, 3, 2, 2, 2, 1730, 1733, 5, 96, 49, 2, 1731, 1733, 7, 178, 2, 2, 1732, 1730, 3, 2, 2, 2, 1732, 1731, 3, 2, 2, 2, 1733, 1734, 3, 2, 2, 2, 1734, 1735, 9, 11, 2, 2, 1735, 1736, 5, 96, 49, 2, 1736, 351, 3, 2, 2, 2, 1737, 1739, 7, 53, 2, 2, 1738, 1740, 5, 94, 48, 2, 1739, 1738, 3, 2, 2, 2, 1739, 1740, 3, 2, 2, 2, 1740, 1741, 3, 2, 2, 2, 1741, 1742, 7, 54, 2, 2, 1742, 353, 3, 2, 2, 2, 1743, 1744, 5, 356, 179, 2, 1744, 355, 3, 2, 2, 2, 1745, 1746, 7, 169, 2, 2, 1746, 357, 3, 2, 2, 2, 1747, 1748, 9, 12, 2, 2, 1748, 359, 3, 2, 2, 2, 168, 368, 372, 388, 394, 402, 410, 418, 433, 463, 471, 473, 495, 505, 515, 520, 525, 529, 541, 545, 554, 561, 575, 579, 584, 594, 602, 606, 618, 630, 652, 660, 665, 668, 672, 681, 690, 693, 701, 708, 710, 717, 724, 726, 734, 739, 746, 753, 763, 770, 777, 784, 793, 803, 807, 815, 817, 829, 835, 839, 843, 854, 860, 875, 881, 885, 889, 896, 903, 909, 914, 916, 920, 927, 934, 943, 955, 965, 977, 981, 990, 997, 1019, 1024, 1029, 1033, 1045, 1053, 1057, 1064, 1071, 1077, 1084, 1092, 1099, 1105, 1111, 1117, 1123, 1134, 1140, 1145, 1153, 1174, 1183, 1185, 1208, 1225, 1236, 1258, 1262, 1269, 1273, 1283, 1288, 1302, 1311, 1317, 1344, 1361, 1363, 1372, 1381, 1384, 1392, 1396, 1401, 1408, 1413, 1417, 1425, 1432, 1440, 1450, 1458, 1471, 1485, 1501, 1506, 1518, 1538, 1547, 1549, 1555, 1568, 1570, 1572, 1578, 1597, 1613, 1636, 1641, 1648, 1655, 1662, 1669, 1679, 1681, 1689, 1692, 1699, 1703, 1717, 1720, 1728, 1732, 1739] \ No newline at end of file diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.tokens b/src/main/java/org/rumbledb/parser/Jsoniq.tokens index 74d3a280c..ee3ace15f 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.tokens +++ b/src/main/java/org/rumbledb/parser/Jsoniq.tokens @@ -56,223 +56,291 @@ T__54=55 T__55=56 T__56=57 T__57=58 -T__58=59 -T__59=60 -Kfor=61 -Klet=62 -Kwhere=63 -Kgroup=64 -Kby=65 -Korder=66 -Kreturn=67 -Kif=68 -Kin=69 -Kas=70 -Kat=71 -Kallowing=72 -Kempty=73 -Kcount=74 -Kstable=75 -Kascending=76 -Kdescending=77 -Ksome=78 -Kevery=79 -Ksatisfies=80 -Kcollation=81 -Kgreatest=82 -Kleast=83 -Kswitch=84 -Kcase=85 -Ktry=86 -Kcatch=87 -Kdefault=88 -Kthen=89 -Kelse=90 -Ktypeswitch=91 -Kor=92 -Kand=93 -Knot=94 -Kto=95 -Kinstance=96 -Kof=97 -Kstatically=98 -Kis=99 -Ktreat=100 -Kcast=101 -Kcastable=102 -Kversion=103 -Kjsoniq=104 -Kunordered=105 -Ktrue=106 -Kfalse=107 -Ktype=108 -Kvalidate=109 -Kannotate=110 -Kdeclare=111 -Kcontext=112 -Kitem=113 -Kvariable=114 -Kinsert=115 -Kdelete=116 -Krename=117 -Kreplace=118 -Kcopy=119 -Kmodify=120 -Kappend=121 -Kinto=122 -Kvalue=123 -Kjson=124 -Kwith=125 -Kposition=126 -Kbreak=127 -Kloop=128 -Kcontinue=129 -Kexit=130 -Kreturning=131 -Kwhile=132 -STRING=133 -ArgumentPlaceholder=134 -NullLiteral=135 -Literal=136 -NumericLiteral=137 -IntegerLiteral=138 -DecimalLiteral=139 -DoubleLiteral=140 -WS=141 -NCName=142 -XQComment=143 -ContentChar=144 +Kfor=59 +Klet=60 +Kwhere=61 +Kgroup=62 +Kby=63 +Korder=64 +Kreturn=65 +Kif=66 +Kin=67 +Kas=68 +Kat=69 +Kallowing=70 +Kempty=71 +Kcount=72 +Kstable=73 +Kascending=74 +Kdescending=75 +Ksome=76 +Kevery=77 +Ksatisfies=78 +Kcollation=79 +Kgreatest=80 +Kleast=81 +Kswitch=82 +Kcase=83 +Ktry=84 +Kcatch=85 +Kdefault=86 +Kthen=87 +Kelse=88 +Ktypeswitch=89 +Kor=90 +Kand=91 +Knot=92 +Kto=93 +Kinstance=94 +Kof=95 +Kstatically=96 +Kis=97 +Ktreat=98 +Kcast=99 +Kcastable=100 +Kversion=101 +Kjsoniq=102 +Kunordered=103 +Ktrue=104 +Kfalse=105 +Ktype=106 +Kvalidate=107 +Kannotate=108 +Kdeclare=109 +Kcontext=110 +Kitem=111 +Kvariable=112 +Kinsert=113 +Kdelete=114 +Krename=115 +Kreplace=116 +Kcopy=117 +Kmodify=118 +Kappend=119 +Kinto=120 +Kvalue=121 +Kjson=122 +Kwith=123 +Kposition=124 +Kbreak=125 +Kloop=126 +Kcontinue=127 +Kexit=128 +Kreturning=129 +Kwhile=130 +Kimport=131 +Kschema=132 +Knamespace=133 +Kelement=134 +Kslash=135 +Kdslash=136 +Kat_symbol=137 +Kchild=138 +Kdescendant=139 +Kattribute=140 +Kself=141 +Kdescendant_or_self=142 +Kfollowing_sibling=143 +Kfollowing=144 +Kparent=145 +Kancestor=146 +Kpreceding_sibling=147 +Kpreceding=148 +Kancestor_or_self=149 +Knode=150 +Kbinary=151 +Kdocument=152 +Kdocument_node=153 +Ktext=154 +Kpi=155 +Knamespace_node=156 +Kschema_attribute=157 +Kschema_element=158 +Karray_node=159 +Kboolean_node=160 +Knull_node=161 +Knumber_node=162 +Kobject_node=163 +Kcomment=164 +Karray=165 +Kmap=166 +STRING=167 +ArgumentPlaceholder=168 +NullLiteral=169 +Literal=170 +NumericLiteral=171 +IntegerLiteral=172 +DecimalLiteral=173 +DoubleLiteral=174 +WS=175 +NCName=176 +XQComment=177 +ContentChar=178 ';'=1 'module'=2 -'namespace'=3 -'='=4 -'$'=5 -':='=6 -'{'=7 -'}'=8 -'('=9 -')'=10 -'*'=11 -'|'=12 -'%'=13 -','=14 -'ordering'=15 -'ordered'=16 -'decimal-format'=17 -':'=18 -'decimal-separator'=19 -'grouping-separator'=20 -'infinity'=21 -'minus-sign'=22 -'NaN'=23 -'percent'=24 -'per-mille'=25 -'zero-digit'=26 -'digit'=27 -'pattern-separator'=28 -'import'=29 -'external'=30 -'function'=31 -'jsound'=32 -'compact'=33 -'verbose'=34 -'schema'=35 -'eq'=36 -'ne'=37 -'lt'=38 -'le'=39 -'gt'=40 -'ge'=41 -'!='=42 -'<'=43 -'<='=44 -'>'=45 -'>='=46 -'||'=47 -'+'=48 -'-'=49 -'div'=50 -'idiv'=51 -'mod'=52 -'!'=53 -'['=54 -']'=55 -'.'=56 -'$$'=57 -'#'=58 -'{|'=59 -'|}'=60 -'for'=61 -'let'=62 -'where'=63 -'group'=64 -'by'=65 -'order'=66 -'return'=67 -'if'=68 -'in'=69 -'as'=70 -'at'=71 -'allowing'=72 -'empty'=73 -'count'=74 -'stable'=75 -'ascending'=76 -'descending'=77 -'some'=78 -'every'=79 -'satisfies'=80 -'collation'=81 -'greatest'=82 -'least'=83 -'switch'=84 -'case'=85 -'try'=86 -'catch'=87 -'default'=88 -'then'=89 -'else'=90 -'typeswitch'=91 -'or'=92 -'and'=93 -'not'=94 -'to'=95 -'instance'=96 -'of'=97 -'statically'=98 -'is'=99 -'treat'=100 -'cast'=101 -'castable'=102 -'version'=103 -'jsoniq'=104 -'unordered'=105 -'true'=106 -'false'=107 -'type'=108 -'validate'=109 -'annotate'=110 -'declare'=111 -'context'=112 -'item'=113 -'variable'=114 -'insert'=115 -'delete'=116 -'rename'=117 -'replace'=118 -'copy'=119 -'modify'=120 -'append'=121 -'into'=122 -'value'=123 -'json'=124 -'with'=125 -'position'=126 -'break'=127 -'loop'=128 -'continue'=129 -'exit'=130 -'returning'=131 -'while'=132 -'?'=134 -'null'=135 +'='=3 +'$'=4 +':='=5 +'{'=6 +'}'=7 +'('=8 +')'=9 +'*'=10 +'|'=11 +'%'=12 +','=13 +'ordering'=14 +'ordered'=15 +'decimal-format'=16 +':'=17 +'decimal-separator'=18 +'grouping-separator'=19 +'infinity'=20 +'minus-sign'=21 +'NaN'=22 +'percent'=23 +'per-mille'=24 +'zero-digit'=25 +'digit'=26 +'pattern-separator'=27 +'external'=28 +'function'=29 +'jsound'=30 +'compact'=31 +'verbose'=32 +'eq'=33 +'ne'=34 +'lt'=35 +'le'=36 +'gt'=37 +'ge'=38 +'!='=39 +'<'=40 +'<='=41 +'>'=42 +'>='=43 +'||'=44 +'+'=45 +'-'=46 +'div'=47 +'idiv'=48 +'mod'=49 +'!'=50 +'['=51 +']'=52 +'.'=53 +'$$'=54 +'#'=55 +'..'=56 +'{|'=57 +'|}'=58 +'for'=59 +'let'=60 +'where'=61 +'group'=62 +'by'=63 +'order'=64 +'return'=65 +'if'=66 +'in'=67 +'as'=68 +'at'=69 +'allowing'=70 +'empty'=71 +'count'=72 +'stable'=73 +'ascending'=74 +'descending'=75 +'some'=76 +'every'=77 +'satisfies'=78 +'collation'=79 +'greatest'=80 +'least'=81 +'switch'=82 +'case'=83 +'try'=84 +'catch'=85 +'default'=86 +'then'=87 +'else'=88 +'typeswitch'=89 +'or'=90 +'and'=91 +'not'=92 +'to'=93 +'instance'=94 +'of'=95 +'statically'=96 +'is'=97 +'treat'=98 +'cast'=99 +'castable'=100 +'version'=101 +'jsoniq'=102 +'unordered'=103 +'true'=104 +'false'=105 +'type'=106 +'validate'=107 +'annotate'=108 +'declare'=109 +'context'=110 +'item'=111 +'variable'=112 +'insert'=113 +'delete'=114 +'rename'=115 +'replace'=116 +'copy'=117 +'modify'=118 +'append'=119 +'into'=120 +'value'=121 +'json'=122 +'with'=123 +'position'=124 +'break'=125 +'loop'=126 +'continue'=127 +'exit'=128 +'returning'=129 +'while'=130 +'import'=131 +'schema'=132 +'namespace'=133 +'element'=134 +'/'=135 +'//'=136 +'@'=137 +'child'=138 +'descendant'=139 +'attribute'=140 +'self'=141 +'descendant-or-self'=142 +'following-sibling'=143 +'following'=144 +'parent'=145 +'ancestor'=146 +'preceding-sibling'=147 +'preceding'=148 +'ancestor-or-self'=149 +'node'=150 +'binary'=151 +'document'=152 +'document-node'=153 +'text'=154 +'processing-instruction'=155 +'namespace-node'=156 +'schema-attribute'=157 +'schema-element'=158 +'array-node'=159 +'boolean-node'=160 +'null-node'=161 +'number-node'=162 +'object-node'=163 +'comment'=164 +'array'=165 +'map'=166 +'?'=168 +'null'=169 diff --git a/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java b/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java index 1b4a5e416..dcd29befe 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java +++ b/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java @@ -825,14 +825,140 @@ public class JsoniqBaseVisitor extends AbstractParseTreeVisitor implements *

The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.

*/ - @Override public T visitSequenceType(JsoniqParser.SequenceTypeContext ctx) { return visitChildren(ctx); } + @Override public T visitSchemaImport(JsoniqParser.SchemaImportContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * *

The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.

*/ - @Override public T visitObjectConstructor(JsoniqParser.ObjectConstructorContext ctx) { return visitChildren(ctx); } + @Override public T visitSchemaPrefix(JsoniqParser.SchemaPrefixContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPathExpr(JsoniqParser.PathExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRelativePathExpr(JsoniqParser.RelativePathExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStepExpr(JsoniqParser.StepExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAxisStep(JsoniqParser.AxisStepContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitForwardStep(JsoniqParser.ForwardStepContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitForwardAxis(JsoniqParser.ForwardAxisContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAbbrevForwardStep(JsoniqParser.AbbrevForwardStepContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitReverseStep(JsoniqParser.ReverseStepContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitReverseAxis(JsoniqParser.ReverseAxisContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAbbrevReverseStep(JsoniqParser.AbbrevReverseStepContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNodeTest(JsoniqParser.NodeTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNameTest(JsoniqParser.NameTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAllNames(JsoniqParser.AllNamesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAllWithNS(JsoniqParser.AllWithNSContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAllWithLocal(JsoniqParser.AllWithLocalContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNCNameWithLocalWildcard(JsoniqParser.NCNameWithLocalWildcardContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNCNameWithPrefixWildcard(JsoniqParser.NCNameWithPrefixWildcardContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPredicateList(JsoniqParser.PredicateListContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -840,6 +966,258 @@ public class JsoniqBaseVisitor extends AbstractParseTreeVisitor implements * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitItemType(JsoniqParser.ItemTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAtomicOrUnionType(JsoniqParser.AtomicOrUnionTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitKindTest(JsoniqParser.KindTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAnyKindTest(JsoniqParser.AnyKindTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBinaryNodeTest(JsoniqParser.BinaryNodeTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDocumentTest(JsoniqParser.DocumentTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTextTest(JsoniqParser.TextTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCommentTest(JsoniqParser.CommentTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNamespaceNodeTest(JsoniqParser.NamespaceNodeTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPiTest(JsoniqParser.PiTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAttributeTest(JsoniqParser.AttributeTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAttributeNameOrWildcard(JsoniqParser.AttributeNameOrWildcardContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSchemaAttributeTest(JsoniqParser.SchemaAttributeTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitElementTest(JsoniqParser.ElementTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitElementNameOrWildcard(JsoniqParser.ElementNameOrWildcardContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSchemaElementTest(JsoniqParser.SchemaElementTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitElementDeclaration(JsoniqParser.ElementDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAttributeName(JsoniqParser.AttributeNameContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitElementName(JsoniqParser.ElementNameContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSimpleTypeName(JsoniqParser.SimpleTypeNameContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypeName(JsoniqParser.TypeNameContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMapTest(JsoniqParser.MapTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAnyMapTest(JsoniqParser.AnyMapTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypedMapTest(JsoniqParser.TypedMapTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArrayTest(JsoniqParser.ArrayTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAnyArrayTest(JsoniqParser.AnyArrayTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypedArrayTest(JsoniqParser.TypedArrayTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitParenthesizedItemTest(JsoniqParser.ParenthesizedItemTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAttributeDeclaration(JsoniqParser.AttributeDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMlNodeTest(JsoniqParser.MlNodeTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMlArrayNodeTest(JsoniqParser.MlArrayNodeTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMlObjectNodeTest(JsoniqParser.MlObjectNodeTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMlNumberNodeTest(JsoniqParser.MlNumberNodeTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMlBooleanNodeTest(JsoniqParser.MlBooleanNodeTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMlNullNodeTest(JsoniqParser.MlNullNodeTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSequenceType(JsoniqParser.SequenceTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitObjectConstructor(JsoniqParser.ObjectConstructorContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.interp b/src/main/java/org/rumbledb/parser/JsoniqLexer.interp index 0d02ed8f1..a9241f1e8 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.interp +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.interp @@ -2,7 +2,6 @@ token literal names: null ';' 'module' -'namespace' '=' '$' ':=' @@ -28,13 +27,11 @@ null 'zero-digit' 'digit' 'pattern-separator' -'import' 'external' 'function' 'jsound' 'compact' 'verbose' -'schema' 'eq' 'ne' 'lt' @@ -58,6 +55,7 @@ null '.' '$$' '#' +'..' '{|' '|}' 'for' @@ -132,6 +130,42 @@ null 'exit' 'returning' 'while' +'import' +'schema' +'namespace' +'element' +'/' +'//' +'@' +'child' +'descendant' +'attribute' +'self' +'descendant-or-self' +'following-sibling' +'following' +'parent' +'ancestor' +'preceding-sibling' +'preceding' +'ancestor-or-self' +'node' +'binary' +'document' +'document-node' +'text' +'processing-instruction' +'namespace-node' +'schema-attribute' +'schema-element' +'array-node' +'boolean-node' +'null-node' +'number-node' +'object-node' +'comment' +'array' +'map' null '?' 'null' @@ -205,8 +239,6 @@ null null null null -null -null Kfor Klet Kwhere @@ -279,6 +311,42 @@ Kcontinue Kexit Kreturning Kwhile +Kimport +Kschema +Knamespace +Kelement +Kslash +Kdslash +Kat_symbol +Kchild +Kdescendant +Kattribute +Kself +Kdescendant_or_self +Kfollowing_sibling +Kfollowing +Kparent +Kancestor +Kpreceding_sibling +Kpreceding +Kancestor_or_self +Knode +Kbinary +Kdocument +Kdocument_node +Ktext +Kpi +Knamespace_node +Kschema_attribute +Kschema_element +Karray_node +Kboolean_node +Knull_node +Knumber_node +Kobject_node +Kcomment +Karray +Kmap STRING ArgumentPlaceholder NullLiteral @@ -351,8 +419,6 @@ T__54 T__55 T__56 T__57 -T__58 -T__59 Kfor Klet Kwhere @@ -425,6 +491,42 @@ Kcontinue Kexit Kreturning Kwhile +Kimport +Kschema +Knamespace +Kelement +Kslash +Kdslash +Kat_symbol +Kchild +Kdescendant +Kattribute +Kself +Kdescendant_or_self +Kfollowing_sibling +Kfollowing +Kparent +Kancestor +Kpreceding_sibling +Kpreceding +Kancestor_or_self +Knode +Kbinary +Kdocument +Kdocument_node +Ktext +Kpi +Knamespace_node +Kschema_attribute +Kschema_element +Karray_node +Kboolean_node +Knull_node +Knumber_node +Kobject_node +Kcomment +Karray +Kmap STRING ESC UNICODE @@ -452,4 +554,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 146, 1198, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 7, 134, 1084, 10, 134, 12, 134, 14, 134, 1087, 11, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 5, 135, 1094, 10, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 5, 141, 1116, 10, 141, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 7, 143, 1125, 10, 143, 12, 143, 14, 143, 1128, 11, 143, 5, 143, 1130, 10, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 7, 144, 1137, 10, 144, 12, 144, 14, 144, 1140, 11, 144, 5, 144, 1142, 10, 144, 5, 144, 1144, 10, 144, 3, 144, 3, 144, 5, 144, 1148, 10, 144, 3, 144, 3, 144, 3, 145, 6, 145, 1153, 10, 145, 13, 145, 14, 145, 1154, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 7, 147, 1163, 10, 147, 12, 147, 14, 147, 1166, 11, 147, 3, 148, 5, 148, 1169, 10, 148, 3, 149, 3, 149, 5, 149, 1173, 10, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 7, 150, 1183, 10, 150, 12, 150, 14, 150, 1186, 11, 150, 3, 150, 6, 150, 1189, 10, 150, 13, 150, 14, 150, 1190, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 2, 2, 152, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 110, 219, 111, 221, 112, 223, 113, 225, 114, 227, 115, 229, 116, 231, 117, 233, 118, 235, 119, 237, 120, 239, 121, 241, 122, 243, 123, 245, 124, 247, 125, 249, 126, 251, 127, 253, 128, 255, 129, 257, 130, 259, 131, 261, 132, 263, 133, 265, 134, 267, 135, 269, 2, 271, 2, 273, 2, 275, 136, 277, 137, 279, 138, 281, 139, 283, 140, 285, 141, 287, 142, 289, 2, 291, 143, 293, 144, 295, 2, 297, 2, 299, 145, 301, 146, 3, 2, 15, 4, 2, 36, 36, 94, 94, 10, 2, 36, 36, 49, 49, 94, 94, 100, 100, 104, 104, 112, 112, 116, 116, 118, 118, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 50, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 5, 2, 11, 12, 15, 15, 34, 34, 16, 2, 67, 92, 97, 97, 99, 124, 194, 216, 218, 248, 250, 769, 882, 895, 897, 8193, 8206, 8207, 8306, 8593, 11266, 12273, 12291, 55297, 63746, 64977, 65010, 65535, 7, 2, 47, 47, 50, 59, 185, 185, 770, 881, 8257, 8258, 3, 2, 60, 60, 3, 2, 43, 43, 4, 2, 42, 42, 60, 60, 7, 2, 36, 36, 40, 41, 62, 62, 125, 125, 127, 127, 2, 1210, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 267, 3, 2, 2, 2, 2, 275, 3, 2, 2, 2, 2, 277, 3, 2, 2, 2, 2, 279, 3, 2, 2, 2, 2, 281, 3, 2, 2, 2, 2, 283, 3, 2, 2, 2, 2, 285, 3, 2, 2, 2, 2, 287, 3, 2, 2, 2, 2, 291, 3, 2, 2, 2, 2, 293, 3, 2, 2, 2, 2, 299, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 3, 303, 3, 2, 2, 2, 5, 305, 3, 2, 2, 2, 7, 312, 3, 2, 2, 2, 9, 322, 3, 2, 2, 2, 11, 324, 3, 2, 2, 2, 13, 326, 3, 2, 2, 2, 15, 329, 3, 2, 2, 2, 17, 331, 3, 2, 2, 2, 19, 333, 3, 2, 2, 2, 21, 335, 3, 2, 2, 2, 23, 337, 3, 2, 2, 2, 25, 339, 3, 2, 2, 2, 27, 341, 3, 2, 2, 2, 29, 343, 3, 2, 2, 2, 31, 345, 3, 2, 2, 2, 33, 354, 3, 2, 2, 2, 35, 362, 3, 2, 2, 2, 37, 377, 3, 2, 2, 2, 39, 379, 3, 2, 2, 2, 41, 397, 3, 2, 2, 2, 43, 416, 3, 2, 2, 2, 45, 425, 3, 2, 2, 2, 47, 436, 3, 2, 2, 2, 49, 440, 3, 2, 2, 2, 51, 448, 3, 2, 2, 2, 53, 458, 3, 2, 2, 2, 55, 469, 3, 2, 2, 2, 57, 475, 3, 2, 2, 2, 59, 493, 3, 2, 2, 2, 61, 500, 3, 2, 2, 2, 63, 509, 3, 2, 2, 2, 65, 518, 3, 2, 2, 2, 67, 525, 3, 2, 2, 2, 69, 533, 3, 2, 2, 2, 71, 541, 3, 2, 2, 2, 73, 548, 3, 2, 2, 2, 75, 551, 3, 2, 2, 2, 77, 554, 3, 2, 2, 2, 79, 557, 3, 2, 2, 2, 81, 560, 3, 2, 2, 2, 83, 563, 3, 2, 2, 2, 85, 566, 3, 2, 2, 2, 87, 569, 3, 2, 2, 2, 89, 571, 3, 2, 2, 2, 91, 574, 3, 2, 2, 2, 93, 576, 3, 2, 2, 2, 95, 579, 3, 2, 2, 2, 97, 582, 3, 2, 2, 2, 99, 584, 3, 2, 2, 2, 101, 586, 3, 2, 2, 2, 103, 590, 3, 2, 2, 2, 105, 595, 3, 2, 2, 2, 107, 599, 3, 2, 2, 2, 109, 601, 3, 2, 2, 2, 111, 603, 3, 2, 2, 2, 113, 605, 3, 2, 2, 2, 115, 607, 3, 2, 2, 2, 117, 610, 3, 2, 2, 2, 119, 612, 3, 2, 2, 2, 121, 615, 3, 2, 2, 2, 123, 618, 3, 2, 2, 2, 125, 622, 3, 2, 2, 2, 127, 626, 3, 2, 2, 2, 129, 632, 3, 2, 2, 2, 131, 638, 3, 2, 2, 2, 133, 641, 3, 2, 2, 2, 135, 647, 3, 2, 2, 2, 137, 654, 3, 2, 2, 2, 139, 657, 3, 2, 2, 2, 141, 660, 3, 2, 2, 2, 143, 663, 3, 2, 2, 2, 145, 666, 3, 2, 2, 2, 147, 675, 3, 2, 2, 2, 149, 681, 3, 2, 2, 2, 151, 687, 3, 2, 2, 2, 153, 694, 3, 2, 2, 2, 155, 704, 3, 2, 2, 2, 157, 715, 3, 2, 2, 2, 159, 720, 3, 2, 2, 2, 161, 726, 3, 2, 2, 2, 163, 736, 3, 2, 2, 2, 165, 746, 3, 2, 2, 2, 167, 755, 3, 2, 2, 2, 169, 761, 3, 2, 2, 2, 171, 768, 3, 2, 2, 2, 173, 773, 3, 2, 2, 2, 175, 777, 3, 2, 2, 2, 177, 783, 3, 2, 2, 2, 179, 791, 3, 2, 2, 2, 181, 796, 3, 2, 2, 2, 183, 801, 3, 2, 2, 2, 185, 812, 3, 2, 2, 2, 187, 815, 3, 2, 2, 2, 189, 819, 3, 2, 2, 2, 191, 823, 3, 2, 2, 2, 193, 826, 3, 2, 2, 2, 195, 835, 3, 2, 2, 2, 197, 838, 3, 2, 2, 2, 199, 849, 3, 2, 2, 2, 201, 852, 3, 2, 2, 2, 203, 858, 3, 2, 2, 2, 205, 863, 3, 2, 2, 2, 207, 872, 3, 2, 2, 2, 209, 880, 3, 2, 2, 2, 211, 887, 3, 2, 2, 2, 213, 897, 3, 2, 2, 2, 215, 902, 3, 2, 2, 2, 217, 908, 3, 2, 2, 2, 219, 913, 3, 2, 2, 2, 221, 922, 3, 2, 2, 2, 223, 931, 3, 2, 2, 2, 225, 939, 3, 2, 2, 2, 227, 947, 3, 2, 2, 2, 229, 952, 3, 2, 2, 2, 231, 961, 3, 2, 2, 2, 233, 968, 3, 2, 2, 2, 235, 975, 3, 2, 2, 2, 237, 982, 3, 2, 2, 2, 239, 990, 3, 2, 2, 2, 241, 995, 3, 2, 2, 2, 243, 1002, 3, 2, 2, 2, 245, 1009, 3, 2, 2, 2, 247, 1014, 3, 2, 2, 2, 249, 1020, 3, 2, 2, 2, 251, 1025, 3, 2, 2, 2, 253, 1030, 3, 2, 2, 2, 255, 1039, 3, 2, 2, 2, 257, 1045, 3, 2, 2, 2, 259, 1050, 3, 2, 2, 2, 261, 1059, 3, 2, 2, 2, 263, 1064, 3, 2, 2, 2, 265, 1074, 3, 2, 2, 2, 267, 1080, 3, 2, 2, 2, 269, 1090, 3, 2, 2, 2, 271, 1095, 3, 2, 2, 2, 273, 1101, 3, 2, 2, 2, 275, 1103, 3, 2, 2, 2, 277, 1105, 3, 2, 2, 2, 279, 1110, 3, 2, 2, 2, 281, 1115, 3, 2, 2, 2, 283, 1117, 3, 2, 2, 2, 285, 1129, 3, 2, 2, 2, 287, 1143, 3, 2, 2, 2, 289, 1152, 3, 2, 2, 2, 291, 1156, 3, 2, 2, 2, 293, 1160, 3, 2, 2, 2, 295, 1168, 3, 2, 2, 2, 297, 1172, 3, 2, 2, 2, 299, 1174, 3, 2, 2, 2, 301, 1196, 3, 2, 2, 2, 303, 304, 7, 61, 2, 2, 304, 4, 3, 2, 2, 2, 305, 306, 7, 111, 2, 2, 306, 307, 7, 113, 2, 2, 307, 308, 7, 102, 2, 2, 308, 309, 7, 119, 2, 2, 309, 310, 7, 110, 2, 2, 310, 311, 7, 103, 2, 2, 311, 6, 3, 2, 2, 2, 312, 313, 7, 112, 2, 2, 313, 314, 7, 99, 2, 2, 314, 315, 7, 111, 2, 2, 315, 316, 7, 103, 2, 2, 316, 317, 7, 117, 2, 2, 317, 318, 7, 114, 2, 2, 318, 319, 7, 99, 2, 2, 319, 320, 7, 101, 2, 2, 320, 321, 7, 103, 2, 2, 321, 8, 3, 2, 2, 2, 322, 323, 7, 63, 2, 2, 323, 10, 3, 2, 2, 2, 324, 325, 7, 38, 2, 2, 325, 12, 3, 2, 2, 2, 326, 327, 7, 60, 2, 2, 327, 328, 7, 63, 2, 2, 328, 14, 3, 2, 2, 2, 329, 330, 7, 125, 2, 2, 330, 16, 3, 2, 2, 2, 331, 332, 7, 127, 2, 2, 332, 18, 3, 2, 2, 2, 333, 334, 7, 42, 2, 2, 334, 20, 3, 2, 2, 2, 335, 336, 7, 43, 2, 2, 336, 22, 3, 2, 2, 2, 337, 338, 7, 44, 2, 2, 338, 24, 3, 2, 2, 2, 339, 340, 7, 126, 2, 2, 340, 26, 3, 2, 2, 2, 341, 342, 7, 39, 2, 2, 342, 28, 3, 2, 2, 2, 343, 344, 7, 46, 2, 2, 344, 30, 3, 2, 2, 2, 345, 346, 7, 113, 2, 2, 346, 347, 7, 116, 2, 2, 347, 348, 7, 102, 2, 2, 348, 349, 7, 103, 2, 2, 349, 350, 7, 116, 2, 2, 350, 351, 7, 107, 2, 2, 351, 352, 7, 112, 2, 2, 352, 353, 7, 105, 2, 2, 353, 32, 3, 2, 2, 2, 354, 355, 7, 113, 2, 2, 355, 356, 7, 116, 2, 2, 356, 357, 7, 102, 2, 2, 357, 358, 7, 103, 2, 2, 358, 359, 7, 116, 2, 2, 359, 360, 7, 103, 2, 2, 360, 361, 7, 102, 2, 2, 361, 34, 3, 2, 2, 2, 362, 363, 7, 102, 2, 2, 363, 364, 7, 103, 2, 2, 364, 365, 7, 101, 2, 2, 365, 366, 7, 107, 2, 2, 366, 367, 7, 111, 2, 2, 367, 368, 7, 99, 2, 2, 368, 369, 7, 110, 2, 2, 369, 370, 7, 47, 2, 2, 370, 371, 7, 104, 2, 2, 371, 372, 7, 113, 2, 2, 372, 373, 7, 116, 2, 2, 373, 374, 7, 111, 2, 2, 374, 375, 7, 99, 2, 2, 375, 376, 7, 118, 2, 2, 376, 36, 3, 2, 2, 2, 377, 378, 7, 60, 2, 2, 378, 38, 3, 2, 2, 2, 379, 380, 7, 102, 2, 2, 380, 381, 7, 103, 2, 2, 381, 382, 7, 101, 2, 2, 382, 383, 7, 107, 2, 2, 383, 384, 7, 111, 2, 2, 384, 385, 7, 99, 2, 2, 385, 386, 7, 110, 2, 2, 386, 387, 7, 47, 2, 2, 387, 388, 7, 117, 2, 2, 388, 389, 7, 103, 2, 2, 389, 390, 7, 114, 2, 2, 390, 391, 7, 99, 2, 2, 391, 392, 7, 116, 2, 2, 392, 393, 7, 99, 2, 2, 393, 394, 7, 118, 2, 2, 394, 395, 7, 113, 2, 2, 395, 396, 7, 116, 2, 2, 396, 40, 3, 2, 2, 2, 397, 398, 7, 105, 2, 2, 398, 399, 7, 116, 2, 2, 399, 400, 7, 113, 2, 2, 400, 401, 7, 119, 2, 2, 401, 402, 7, 114, 2, 2, 402, 403, 7, 107, 2, 2, 403, 404, 7, 112, 2, 2, 404, 405, 7, 105, 2, 2, 405, 406, 7, 47, 2, 2, 406, 407, 7, 117, 2, 2, 407, 408, 7, 103, 2, 2, 408, 409, 7, 114, 2, 2, 409, 410, 7, 99, 2, 2, 410, 411, 7, 116, 2, 2, 411, 412, 7, 99, 2, 2, 412, 413, 7, 118, 2, 2, 413, 414, 7, 113, 2, 2, 414, 415, 7, 116, 2, 2, 415, 42, 3, 2, 2, 2, 416, 417, 7, 107, 2, 2, 417, 418, 7, 112, 2, 2, 418, 419, 7, 104, 2, 2, 419, 420, 7, 107, 2, 2, 420, 421, 7, 112, 2, 2, 421, 422, 7, 107, 2, 2, 422, 423, 7, 118, 2, 2, 423, 424, 7, 123, 2, 2, 424, 44, 3, 2, 2, 2, 425, 426, 7, 111, 2, 2, 426, 427, 7, 107, 2, 2, 427, 428, 7, 112, 2, 2, 428, 429, 7, 119, 2, 2, 429, 430, 7, 117, 2, 2, 430, 431, 7, 47, 2, 2, 431, 432, 7, 117, 2, 2, 432, 433, 7, 107, 2, 2, 433, 434, 7, 105, 2, 2, 434, 435, 7, 112, 2, 2, 435, 46, 3, 2, 2, 2, 436, 437, 7, 80, 2, 2, 437, 438, 7, 99, 2, 2, 438, 439, 7, 80, 2, 2, 439, 48, 3, 2, 2, 2, 440, 441, 7, 114, 2, 2, 441, 442, 7, 103, 2, 2, 442, 443, 7, 116, 2, 2, 443, 444, 7, 101, 2, 2, 444, 445, 7, 103, 2, 2, 445, 446, 7, 112, 2, 2, 446, 447, 7, 118, 2, 2, 447, 50, 3, 2, 2, 2, 448, 449, 7, 114, 2, 2, 449, 450, 7, 103, 2, 2, 450, 451, 7, 116, 2, 2, 451, 452, 7, 47, 2, 2, 452, 453, 7, 111, 2, 2, 453, 454, 7, 107, 2, 2, 454, 455, 7, 110, 2, 2, 455, 456, 7, 110, 2, 2, 456, 457, 7, 103, 2, 2, 457, 52, 3, 2, 2, 2, 458, 459, 7, 124, 2, 2, 459, 460, 7, 103, 2, 2, 460, 461, 7, 116, 2, 2, 461, 462, 7, 113, 2, 2, 462, 463, 7, 47, 2, 2, 463, 464, 7, 102, 2, 2, 464, 465, 7, 107, 2, 2, 465, 466, 7, 105, 2, 2, 466, 467, 7, 107, 2, 2, 467, 468, 7, 118, 2, 2, 468, 54, 3, 2, 2, 2, 469, 470, 7, 102, 2, 2, 470, 471, 7, 107, 2, 2, 471, 472, 7, 105, 2, 2, 472, 473, 7, 107, 2, 2, 473, 474, 7, 118, 2, 2, 474, 56, 3, 2, 2, 2, 475, 476, 7, 114, 2, 2, 476, 477, 7, 99, 2, 2, 477, 478, 7, 118, 2, 2, 478, 479, 7, 118, 2, 2, 479, 480, 7, 103, 2, 2, 480, 481, 7, 116, 2, 2, 481, 482, 7, 112, 2, 2, 482, 483, 7, 47, 2, 2, 483, 484, 7, 117, 2, 2, 484, 485, 7, 103, 2, 2, 485, 486, 7, 114, 2, 2, 486, 487, 7, 99, 2, 2, 487, 488, 7, 116, 2, 2, 488, 489, 7, 99, 2, 2, 489, 490, 7, 118, 2, 2, 490, 491, 7, 113, 2, 2, 491, 492, 7, 116, 2, 2, 492, 58, 3, 2, 2, 2, 493, 494, 7, 107, 2, 2, 494, 495, 7, 111, 2, 2, 495, 496, 7, 114, 2, 2, 496, 497, 7, 113, 2, 2, 497, 498, 7, 116, 2, 2, 498, 499, 7, 118, 2, 2, 499, 60, 3, 2, 2, 2, 500, 501, 7, 103, 2, 2, 501, 502, 7, 122, 2, 2, 502, 503, 7, 118, 2, 2, 503, 504, 7, 103, 2, 2, 504, 505, 7, 116, 2, 2, 505, 506, 7, 112, 2, 2, 506, 507, 7, 99, 2, 2, 507, 508, 7, 110, 2, 2, 508, 62, 3, 2, 2, 2, 509, 510, 7, 104, 2, 2, 510, 511, 7, 119, 2, 2, 511, 512, 7, 112, 2, 2, 512, 513, 7, 101, 2, 2, 513, 514, 7, 118, 2, 2, 514, 515, 7, 107, 2, 2, 515, 516, 7, 113, 2, 2, 516, 517, 7, 112, 2, 2, 517, 64, 3, 2, 2, 2, 518, 519, 7, 108, 2, 2, 519, 520, 7, 117, 2, 2, 520, 521, 7, 113, 2, 2, 521, 522, 7, 119, 2, 2, 522, 523, 7, 112, 2, 2, 523, 524, 7, 102, 2, 2, 524, 66, 3, 2, 2, 2, 525, 526, 7, 101, 2, 2, 526, 527, 7, 113, 2, 2, 527, 528, 7, 111, 2, 2, 528, 529, 7, 114, 2, 2, 529, 530, 7, 99, 2, 2, 530, 531, 7, 101, 2, 2, 531, 532, 7, 118, 2, 2, 532, 68, 3, 2, 2, 2, 533, 534, 7, 120, 2, 2, 534, 535, 7, 103, 2, 2, 535, 536, 7, 116, 2, 2, 536, 537, 7, 100, 2, 2, 537, 538, 7, 113, 2, 2, 538, 539, 7, 117, 2, 2, 539, 540, 7, 103, 2, 2, 540, 70, 3, 2, 2, 2, 541, 542, 7, 117, 2, 2, 542, 543, 7, 101, 2, 2, 543, 544, 7, 106, 2, 2, 544, 545, 7, 103, 2, 2, 545, 546, 7, 111, 2, 2, 546, 547, 7, 99, 2, 2, 547, 72, 3, 2, 2, 2, 548, 549, 7, 103, 2, 2, 549, 550, 7, 115, 2, 2, 550, 74, 3, 2, 2, 2, 551, 552, 7, 112, 2, 2, 552, 553, 7, 103, 2, 2, 553, 76, 3, 2, 2, 2, 554, 555, 7, 110, 2, 2, 555, 556, 7, 118, 2, 2, 556, 78, 3, 2, 2, 2, 557, 558, 7, 110, 2, 2, 558, 559, 7, 103, 2, 2, 559, 80, 3, 2, 2, 2, 560, 561, 7, 105, 2, 2, 561, 562, 7, 118, 2, 2, 562, 82, 3, 2, 2, 2, 563, 564, 7, 105, 2, 2, 564, 565, 7, 103, 2, 2, 565, 84, 3, 2, 2, 2, 566, 567, 7, 35, 2, 2, 567, 568, 7, 63, 2, 2, 568, 86, 3, 2, 2, 2, 569, 570, 7, 62, 2, 2, 570, 88, 3, 2, 2, 2, 571, 572, 7, 62, 2, 2, 572, 573, 7, 63, 2, 2, 573, 90, 3, 2, 2, 2, 574, 575, 7, 64, 2, 2, 575, 92, 3, 2, 2, 2, 576, 577, 7, 64, 2, 2, 577, 578, 7, 63, 2, 2, 578, 94, 3, 2, 2, 2, 579, 580, 7, 126, 2, 2, 580, 581, 7, 126, 2, 2, 581, 96, 3, 2, 2, 2, 582, 583, 7, 45, 2, 2, 583, 98, 3, 2, 2, 2, 584, 585, 7, 47, 2, 2, 585, 100, 3, 2, 2, 2, 586, 587, 7, 102, 2, 2, 587, 588, 7, 107, 2, 2, 588, 589, 7, 120, 2, 2, 589, 102, 3, 2, 2, 2, 590, 591, 7, 107, 2, 2, 591, 592, 7, 102, 2, 2, 592, 593, 7, 107, 2, 2, 593, 594, 7, 120, 2, 2, 594, 104, 3, 2, 2, 2, 595, 596, 7, 111, 2, 2, 596, 597, 7, 113, 2, 2, 597, 598, 7, 102, 2, 2, 598, 106, 3, 2, 2, 2, 599, 600, 7, 35, 2, 2, 600, 108, 3, 2, 2, 2, 601, 602, 7, 93, 2, 2, 602, 110, 3, 2, 2, 2, 603, 604, 7, 95, 2, 2, 604, 112, 3, 2, 2, 2, 605, 606, 7, 48, 2, 2, 606, 114, 3, 2, 2, 2, 607, 608, 7, 38, 2, 2, 608, 609, 7, 38, 2, 2, 609, 116, 3, 2, 2, 2, 610, 611, 7, 37, 2, 2, 611, 118, 3, 2, 2, 2, 612, 613, 7, 125, 2, 2, 613, 614, 7, 126, 2, 2, 614, 120, 3, 2, 2, 2, 615, 616, 7, 126, 2, 2, 616, 617, 7, 127, 2, 2, 617, 122, 3, 2, 2, 2, 618, 619, 7, 104, 2, 2, 619, 620, 7, 113, 2, 2, 620, 621, 7, 116, 2, 2, 621, 124, 3, 2, 2, 2, 622, 623, 7, 110, 2, 2, 623, 624, 7, 103, 2, 2, 624, 625, 7, 118, 2, 2, 625, 126, 3, 2, 2, 2, 626, 627, 7, 121, 2, 2, 627, 628, 7, 106, 2, 2, 628, 629, 7, 103, 2, 2, 629, 630, 7, 116, 2, 2, 630, 631, 7, 103, 2, 2, 631, 128, 3, 2, 2, 2, 632, 633, 7, 105, 2, 2, 633, 634, 7, 116, 2, 2, 634, 635, 7, 113, 2, 2, 635, 636, 7, 119, 2, 2, 636, 637, 7, 114, 2, 2, 637, 130, 3, 2, 2, 2, 638, 639, 7, 100, 2, 2, 639, 640, 7, 123, 2, 2, 640, 132, 3, 2, 2, 2, 641, 642, 7, 113, 2, 2, 642, 643, 7, 116, 2, 2, 643, 644, 7, 102, 2, 2, 644, 645, 7, 103, 2, 2, 645, 646, 7, 116, 2, 2, 646, 134, 3, 2, 2, 2, 647, 648, 7, 116, 2, 2, 648, 649, 7, 103, 2, 2, 649, 650, 7, 118, 2, 2, 650, 651, 7, 119, 2, 2, 651, 652, 7, 116, 2, 2, 652, 653, 7, 112, 2, 2, 653, 136, 3, 2, 2, 2, 654, 655, 7, 107, 2, 2, 655, 656, 7, 104, 2, 2, 656, 138, 3, 2, 2, 2, 657, 658, 7, 107, 2, 2, 658, 659, 7, 112, 2, 2, 659, 140, 3, 2, 2, 2, 660, 661, 7, 99, 2, 2, 661, 662, 7, 117, 2, 2, 662, 142, 3, 2, 2, 2, 663, 664, 7, 99, 2, 2, 664, 665, 7, 118, 2, 2, 665, 144, 3, 2, 2, 2, 666, 667, 7, 99, 2, 2, 667, 668, 7, 110, 2, 2, 668, 669, 7, 110, 2, 2, 669, 670, 7, 113, 2, 2, 670, 671, 7, 121, 2, 2, 671, 672, 7, 107, 2, 2, 672, 673, 7, 112, 2, 2, 673, 674, 7, 105, 2, 2, 674, 146, 3, 2, 2, 2, 675, 676, 7, 103, 2, 2, 676, 677, 7, 111, 2, 2, 677, 678, 7, 114, 2, 2, 678, 679, 7, 118, 2, 2, 679, 680, 7, 123, 2, 2, 680, 148, 3, 2, 2, 2, 681, 682, 7, 101, 2, 2, 682, 683, 7, 113, 2, 2, 683, 684, 7, 119, 2, 2, 684, 685, 7, 112, 2, 2, 685, 686, 7, 118, 2, 2, 686, 150, 3, 2, 2, 2, 687, 688, 7, 117, 2, 2, 688, 689, 7, 118, 2, 2, 689, 690, 7, 99, 2, 2, 690, 691, 7, 100, 2, 2, 691, 692, 7, 110, 2, 2, 692, 693, 7, 103, 2, 2, 693, 152, 3, 2, 2, 2, 694, 695, 7, 99, 2, 2, 695, 696, 7, 117, 2, 2, 696, 697, 7, 101, 2, 2, 697, 698, 7, 103, 2, 2, 698, 699, 7, 112, 2, 2, 699, 700, 7, 102, 2, 2, 700, 701, 7, 107, 2, 2, 701, 702, 7, 112, 2, 2, 702, 703, 7, 105, 2, 2, 703, 154, 3, 2, 2, 2, 704, 705, 7, 102, 2, 2, 705, 706, 7, 103, 2, 2, 706, 707, 7, 117, 2, 2, 707, 708, 7, 101, 2, 2, 708, 709, 7, 103, 2, 2, 709, 710, 7, 112, 2, 2, 710, 711, 7, 102, 2, 2, 711, 712, 7, 107, 2, 2, 712, 713, 7, 112, 2, 2, 713, 714, 7, 105, 2, 2, 714, 156, 3, 2, 2, 2, 715, 716, 7, 117, 2, 2, 716, 717, 7, 113, 2, 2, 717, 718, 7, 111, 2, 2, 718, 719, 7, 103, 2, 2, 719, 158, 3, 2, 2, 2, 720, 721, 7, 103, 2, 2, 721, 722, 7, 120, 2, 2, 722, 723, 7, 103, 2, 2, 723, 724, 7, 116, 2, 2, 724, 725, 7, 123, 2, 2, 725, 160, 3, 2, 2, 2, 726, 727, 7, 117, 2, 2, 727, 728, 7, 99, 2, 2, 728, 729, 7, 118, 2, 2, 729, 730, 7, 107, 2, 2, 730, 731, 7, 117, 2, 2, 731, 732, 7, 104, 2, 2, 732, 733, 7, 107, 2, 2, 733, 734, 7, 103, 2, 2, 734, 735, 7, 117, 2, 2, 735, 162, 3, 2, 2, 2, 736, 737, 7, 101, 2, 2, 737, 738, 7, 113, 2, 2, 738, 739, 7, 110, 2, 2, 739, 740, 7, 110, 2, 2, 740, 741, 7, 99, 2, 2, 741, 742, 7, 118, 2, 2, 742, 743, 7, 107, 2, 2, 743, 744, 7, 113, 2, 2, 744, 745, 7, 112, 2, 2, 745, 164, 3, 2, 2, 2, 746, 747, 7, 105, 2, 2, 747, 748, 7, 116, 2, 2, 748, 749, 7, 103, 2, 2, 749, 750, 7, 99, 2, 2, 750, 751, 7, 118, 2, 2, 751, 752, 7, 103, 2, 2, 752, 753, 7, 117, 2, 2, 753, 754, 7, 118, 2, 2, 754, 166, 3, 2, 2, 2, 755, 756, 7, 110, 2, 2, 756, 757, 7, 103, 2, 2, 757, 758, 7, 99, 2, 2, 758, 759, 7, 117, 2, 2, 759, 760, 7, 118, 2, 2, 760, 168, 3, 2, 2, 2, 761, 762, 7, 117, 2, 2, 762, 763, 7, 121, 2, 2, 763, 764, 7, 107, 2, 2, 764, 765, 7, 118, 2, 2, 765, 766, 7, 101, 2, 2, 766, 767, 7, 106, 2, 2, 767, 170, 3, 2, 2, 2, 768, 769, 7, 101, 2, 2, 769, 770, 7, 99, 2, 2, 770, 771, 7, 117, 2, 2, 771, 772, 7, 103, 2, 2, 772, 172, 3, 2, 2, 2, 773, 774, 7, 118, 2, 2, 774, 775, 7, 116, 2, 2, 775, 776, 7, 123, 2, 2, 776, 174, 3, 2, 2, 2, 777, 778, 7, 101, 2, 2, 778, 779, 7, 99, 2, 2, 779, 780, 7, 118, 2, 2, 780, 781, 7, 101, 2, 2, 781, 782, 7, 106, 2, 2, 782, 176, 3, 2, 2, 2, 783, 784, 7, 102, 2, 2, 784, 785, 7, 103, 2, 2, 785, 786, 7, 104, 2, 2, 786, 787, 7, 99, 2, 2, 787, 788, 7, 119, 2, 2, 788, 789, 7, 110, 2, 2, 789, 790, 7, 118, 2, 2, 790, 178, 3, 2, 2, 2, 791, 792, 7, 118, 2, 2, 792, 793, 7, 106, 2, 2, 793, 794, 7, 103, 2, 2, 794, 795, 7, 112, 2, 2, 795, 180, 3, 2, 2, 2, 796, 797, 7, 103, 2, 2, 797, 798, 7, 110, 2, 2, 798, 799, 7, 117, 2, 2, 799, 800, 7, 103, 2, 2, 800, 182, 3, 2, 2, 2, 801, 802, 7, 118, 2, 2, 802, 803, 7, 123, 2, 2, 803, 804, 7, 114, 2, 2, 804, 805, 7, 103, 2, 2, 805, 806, 7, 117, 2, 2, 806, 807, 7, 121, 2, 2, 807, 808, 7, 107, 2, 2, 808, 809, 7, 118, 2, 2, 809, 810, 7, 101, 2, 2, 810, 811, 7, 106, 2, 2, 811, 184, 3, 2, 2, 2, 812, 813, 7, 113, 2, 2, 813, 814, 7, 116, 2, 2, 814, 186, 3, 2, 2, 2, 815, 816, 7, 99, 2, 2, 816, 817, 7, 112, 2, 2, 817, 818, 7, 102, 2, 2, 818, 188, 3, 2, 2, 2, 819, 820, 7, 112, 2, 2, 820, 821, 7, 113, 2, 2, 821, 822, 7, 118, 2, 2, 822, 190, 3, 2, 2, 2, 823, 824, 7, 118, 2, 2, 824, 825, 7, 113, 2, 2, 825, 192, 3, 2, 2, 2, 826, 827, 7, 107, 2, 2, 827, 828, 7, 112, 2, 2, 828, 829, 7, 117, 2, 2, 829, 830, 7, 118, 2, 2, 830, 831, 7, 99, 2, 2, 831, 832, 7, 112, 2, 2, 832, 833, 7, 101, 2, 2, 833, 834, 7, 103, 2, 2, 834, 194, 3, 2, 2, 2, 835, 836, 7, 113, 2, 2, 836, 837, 7, 104, 2, 2, 837, 196, 3, 2, 2, 2, 838, 839, 7, 117, 2, 2, 839, 840, 7, 118, 2, 2, 840, 841, 7, 99, 2, 2, 841, 842, 7, 118, 2, 2, 842, 843, 7, 107, 2, 2, 843, 844, 7, 101, 2, 2, 844, 845, 7, 99, 2, 2, 845, 846, 7, 110, 2, 2, 846, 847, 7, 110, 2, 2, 847, 848, 7, 123, 2, 2, 848, 198, 3, 2, 2, 2, 849, 850, 7, 107, 2, 2, 850, 851, 7, 117, 2, 2, 851, 200, 3, 2, 2, 2, 852, 853, 7, 118, 2, 2, 853, 854, 7, 116, 2, 2, 854, 855, 7, 103, 2, 2, 855, 856, 7, 99, 2, 2, 856, 857, 7, 118, 2, 2, 857, 202, 3, 2, 2, 2, 858, 859, 7, 101, 2, 2, 859, 860, 7, 99, 2, 2, 860, 861, 7, 117, 2, 2, 861, 862, 7, 118, 2, 2, 862, 204, 3, 2, 2, 2, 863, 864, 7, 101, 2, 2, 864, 865, 7, 99, 2, 2, 865, 866, 7, 117, 2, 2, 866, 867, 7, 118, 2, 2, 867, 868, 7, 99, 2, 2, 868, 869, 7, 100, 2, 2, 869, 870, 7, 110, 2, 2, 870, 871, 7, 103, 2, 2, 871, 206, 3, 2, 2, 2, 872, 873, 7, 120, 2, 2, 873, 874, 7, 103, 2, 2, 874, 875, 7, 116, 2, 2, 875, 876, 7, 117, 2, 2, 876, 877, 7, 107, 2, 2, 877, 878, 7, 113, 2, 2, 878, 879, 7, 112, 2, 2, 879, 208, 3, 2, 2, 2, 880, 881, 7, 108, 2, 2, 881, 882, 7, 117, 2, 2, 882, 883, 7, 113, 2, 2, 883, 884, 7, 112, 2, 2, 884, 885, 7, 107, 2, 2, 885, 886, 7, 115, 2, 2, 886, 210, 3, 2, 2, 2, 887, 888, 7, 119, 2, 2, 888, 889, 7, 112, 2, 2, 889, 890, 7, 113, 2, 2, 890, 891, 7, 116, 2, 2, 891, 892, 7, 102, 2, 2, 892, 893, 7, 103, 2, 2, 893, 894, 7, 116, 2, 2, 894, 895, 7, 103, 2, 2, 895, 896, 7, 102, 2, 2, 896, 212, 3, 2, 2, 2, 897, 898, 7, 118, 2, 2, 898, 899, 7, 116, 2, 2, 899, 900, 7, 119, 2, 2, 900, 901, 7, 103, 2, 2, 901, 214, 3, 2, 2, 2, 902, 903, 7, 104, 2, 2, 903, 904, 7, 99, 2, 2, 904, 905, 7, 110, 2, 2, 905, 906, 7, 117, 2, 2, 906, 907, 7, 103, 2, 2, 907, 216, 3, 2, 2, 2, 908, 909, 7, 118, 2, 2, 909, 910, 7, 123, 2, 2, 910, 911, 7, 114, 2, 2, 911, 912, 7, 103, 2, 2, 912, 218, 3, 2, 2, 2, 913, 914, 7, 120, 2, 2, 914, 915, 7, 99, 2, 2, 915, 916, 7, 110, 2, 2, 916, 917, 7, 107, 2, 2, 917, 918, 7, 102, 2, 2, 918, 919, 7, 99, 2, 2, 919, 920, 7, 118, 2, 2, 920, 921, 7, 103, 2, 2, 921, 220, 3, 2, 2, 2, 922, 923, 7, 99, 2, 2, 923, 924, 7, 112, 2, 2, 924, 925, 7, 112, 2, 2, 925, 926, 7, 113, 2, 2, 926, 927, 7, 118, 2, 2, 927, 928, 7, 99, 2, 2, 928, 929, 7, 118, 2, 2, 929, 930, 7, 103, 2, 2, 930, 222, 3, 2, 2, 2, 931, 932, 7, 102, 2, 2, 932, 933, 7, 103, 2, 2, 933, 934, 7, 101, 2, 2, 934, 935, 7, 110, 2, 2, 935, 936, 7, 99, 2, 2, 936, 937, 7, 116, 2, 2, 937, 938, 7, 103, 2, 2, 938, 224, 3, 2, 2, 2, 939, 940, 7, 101, 2, 2, 940, 941, 7, 113, 2, 2, 941, 942, 7, 112, 2, 2, 942, 943, 7, 118, 2, 2, 943, 944, 7, 103, 2, 2, 944, 945, 7, 122, 2, 2, 945, 946, 7, 118, 2, 2, 946, 226, 3, 2, 2, 2, 947, 948, 7, 107, 2, 2, 948, 949, 7, 118, 2, 2, 949, 950, 7, 103, 2, 2, 950, 951, 7, 111, 2, 2, 951, 228, 3, 2, 2, 2, 952, 953, 7, 120, 2, 2, 953, 954, 7, 99, 2, 2, 954, 955, 7, 116, 2, 2, 955, 956, 7, 107, 2, 2, 956, 957, 7, 99, 2, 2, 957, 958, 7, 100, 2, 2, 958, 959, 7, 110, 2, 2, 959, 960, 7, 103, 2, 2, 960, 230, 3, 2, 2, 2, 961, 962, 7, 107, 2, 2, 962, 963, 7, 112, 2, 2, 963, 964, 7, 117, 2, 2, 964, 965, 7, 103, 2, 2, 965, 966, 7, 116, 2, 2, 966, 967, 7, 118, 2, 2, 967, 232, 3, 2, 2, 2, 968, 969, 7, 102, 2, 2, 969, 970, 7, 103, 2, 2, 970, 971, 7, 110, 2, 2, 971, 972, 7, 103, 2, 2, 972, 973, 7, 118, 2, 2, 973, 974, 7, 103, 2, 2, 974, 234, 3, 2, 2, 2, 975, 976, 7, 116, 2, 2, 976, 977, 7, 103, 2, 2, 977, 978, 7, 112, 2, 2, 978, 979, 7, 99, 2, 2, 979, 980, 7, 111, 2, 2, 980, 981, 7, 103, 2, 2, 981, 236, 3, 2, 2, 2, 982, 983, 7, 116, 2, 2, 983, 984, 7, 103, 2, 2, 984, 985, 7, 114, 2, 2, 985, 986, 7, 110, 2, 2, 986, 987, 7, 99, 2, 2, 987, 988, 7, 101, 2, 2, 988, 989, 7, 103, 2, 2, 989, 238, 3, 2, 2, 2, 990, 991, 7, 101, 2, 2, 991, 992, 7, 113, 2, 2, 992, 993, 7, 114, 2, 2, 993, 994, 7, 123, 2, 2, 994, 240, 3, 2, 2, 2, 995, 996, 7, 111, 2, 2, 996, 997, 7, 113, 2, 2, 997, 998, 7, 102, 2, 2, 998, 999, 7, 107, 2, 2, 999, 1000, 7, 104, 2, 2, 1000, 1001, 7, 123, 2, 2, 1001, 242, 3, 2, 2, 2, 1002, 1003, 7, 99, 2, 2, 1003, 1004, 7, 114, 2, 2, 1004, 1005, 7, 114, 2, 2, 1005, 1006, 7, 103, 2, 2, 1006, 1007, 7, 112, 2, 2, 1007, 1008, 7, 102, 2, 2, 1008, 244, 3, 2, 2, 2, 1009, 1010, 7, 107, 2, 2, 1010, 1011, 7, 112, 2, 2, 1011, 1012, 7, 118, 2, 2, 1012, 1013, 7, 113, 2, 2, 1013, 246, 3, 2, 2, 2, 1014, 1015, 7, 120, 2, 2, 1015, 1016, 7, 99, 2, 2, 1016, 1017, 7, 110, 2, 2, 1017, 1018, 7, 119, 2, 2, 1018, 1019, 7, 103, 2, 2, 1019, 248, 3, 2, 2, 2, 1020, 1021, 7, 108, 2, 2, 1021, 1022, 7, 117, 2, 2, 1022, 1023, 7, 113, 2, 2, 1023, 1024, 7, 112, 2, 2, 1024, 250, 3, 2, 2, 2, 1025, 1026, 7, 121, 2, 2, 1026, 1027, 7, 107, 2, 2, 1027, 1028, 7, 118, 2, 2, 1028, 1029, 7, 106, 2, 2, 1029, 252, 3, 2, 2, 2, 1030, 1031, 7, 114, 2, 2, 1031, 1032, 7, 113, 2, 2, 1032, 1033, 7, 117, 2, 2, 1033, 1034, 7, 107, 2, 2, 1034, 1035, 7, 118, 2, 2, 1035, 1036, 7, 107, 2, 2, 1036, 1037, 7, 113, 2, 2, 1037, 1038, 7, 112, 2, 2, 1038, 254, 3, 2, 2, 2, 1039, 1040, 7, 100, 2, 2, 1040, 1041, 7, 116, 2, 2, 1041, 1042, 7, 103, 2, 2, 1042, 1043, 7, 99, 2, 2, 1043, 1044, 7, 109, 2, 2, 1044, 256, 3, 2, 2, 2, 1045, 1046, 7, 110, 2, 2, 1046, 1047, 7, 113, 2, 2, 1047, 1048, 7, 113, 2, 2, 1048, 1049, 7, 114, 2, 2, 1049, 258, 3, 2, 2, 2, 1050, 1051, 7, 101, 2, 2, 1051, 1052, 7, 113, 2, 2, 1052, 1053, 7, 112, 2, 2, 1053, 1054, 7, 118, 2, 2, 1054, 1055, 7, 107, 2, 2, 1055, 1056, 7, 112, 2, 2, 1056, 1057, 7, 119, 2, 2, 1057, 1058, 7, 103, 2, 2, 1058, 260, 3, 2, 2, 2, 1059, 1060, 7, 103, 2, 2, 1060, 1061, 7, 122, 2, 2, 1061, 1062, 7, 107, 2, 2, 1062, 1063, 7, 118, 2, 2, 1063, 262, 3, 2, 2, 2, 1064, 1065, 7, 116, 2, 2, 1065, 1066, 7, 103, 2, 2, 1066, 1067, 7, 118, 2, 2, 1067, 1068, 7, 119, 2, 2, 1068, 1069, 7, 116, 2, 2, 1069, 1070, 7, 112, 2, 2, 1070, 1071, 7, 107, 2, 2, 1071, 1072, 7, 112, 2, 2, 1072, 1073, 7, 105, 2, 2, 1073, 264, 3, 2, 2, 2, 1074, 1075, 7, 121, 2, 2, 1075, 1076, 7, 106, 2, 2, 1076, 1077, 7, 107, 2, 2, 1077, 1078, 7, 110, 2, 2, 1078, 1079, 7, 103, 2, 2, 1079, 266, 3, 2, 2, 2, 1080, 1085, 7, 36, 2, 2, 1081, 1084, 5, 269, 135, 2, 1082, 1084, 10, 2, 2, 2, 1083, 1081, 3, 2, 2, 2, 1083, 1082, 3, 2, 2, 2, 1084, 1087, 3, 2, 2, 2, 1085, 1083, 3, 2, 2, 2, 1085, 1086, 3, 2, 2, 2, 1086, 1088, 3, 2, 2, 2, 1087, 1085, 3, 2, 2, 2, 1088, 1089, 7, 36, 2, 2, 1089, 268, 3, 2, 2, 2, 1090, 1093, 7, 94, 2, 2, 1091, 1094, 9, 3, 2, 2, 1092, 1094, 5, 271, 136, 2, 1093, 1091, 3, 2, 2, 2, 1093, 1092, 3, 2, 2, 2, 1094, 270, 3, 2, 2, 2, 1095, 1096, 7, 119, 2, 2, 1096, 1097, 5, 273, 137, 2, 1097, 1098, 5, 273, 137, 2, 1098, 1099, 5, 273, 137, 2, 1099, 1100, 5, 273, 137, 2, 1100, 272, 3, 2, 2, 2, 1101, 1102, 9, 4, 2, 2, 1102, 274, 3, 2, 2, 2, 1103, 1104, 7, 65, 2, 2, 1104, 276, 3, 2, 2, 2, 1105, 1106, 7, 112, 2, 2, 1106, 1107, 7, 119, 2, 2, 1107, 1108, 7, 110, 2, 2, 1108, 1109, 7, 110, 2, 2, 1109, 278, 3, 2, 2, 2, 1110, 1111, 5, 281, 141, 2, 1111, 280, 3, 2, 2, 2, 1112, 1116, 5, 283, 142, 2, 1113, 1116, 5, 285, 143, 2, 1114, 1116, 5, 287, 144, 2, 1115, 1112, 3, 2, 2, 2, 1115, 1113, 3, 2, 2, 2, 1115, 1114, 3, 2, 2, 2, 1116, 282, 3, 2, 2, 2, 1117, 1118, 5, 289, 145, 2, 1118, 284, 3, 2, 2, 2, 1119, 1120, 7, 48, 2, 2, 1120, 1130, 5, 289, 145, 2, 1121, 1122, 5, 289, 145, 2, 1122, 1126, 7, 48, 2, 2, 1123, 1125, 9, 5, 2, 2, 1124, 1123, 3, 2, 2, 2, 1125, 1128, 3, 2, 2, 2, 1126, 1124, 3, 2, 2, 2, 1126, 1127, 3, 2, 2, 2, 1127, 1130, 3, 2, 2, 2, 1128, 1126, 3, 2, 2, 2, 1129, 1119, 3, 2, 2, 2, 1129, 1121, 3, 2, 2, 2, 1130, 286, 3, 2, 2, 2, 1131, 1132, 7, 48, 2, 2, 1132, 1144, 5, 289, 145, 2, 1133, 1141, 5, 289, 145, 2, 1134, 1138, 7, 48, 2, 2, 1135, 1137, 9, 5, 2, 2, 1136, 1135, 3, 2, 2, 2, 1137, 1140, 3, 2, 2, 2, 1138, 1136, 3, 2, 2, 2, 1138, 1139, 3, 2, 2, 2, 1139, 1142, 3, 2, 2, 2, 1140, 1138, 3, 2, 2, 2, 1141, 1134, 3, 2, 2, 2, 1141, 1142, 3, 2, 2, 2, 1142, 1144, 3, 2, 2, 2, 1143, 1131, 3, 2, 2, 2, 1143, 1133, 3, 2, 2, 2, 1144, 1145, 3, 2, 2, 2, 1145, 1147, 9, 6, 2, 2, 1146, 1148, 9, 7, 2, 2, 1147, 1146, 3, 2, 2, 2, 1147, 1148, 3, 2, 2, 2, 1148, 1149, 3, 2, 2, 2, 1149, 1150, 5, 289, 145, 2, 1150, 288, 3, 2, 2, 2, 1151, 1153, 9, 5, 2, 2, 1152, 1151, 3, 2, 2, 2, 1153, 1154, 3, 2, 2, 2, 1154, 1152, 3, 2, 2, 2, 1154, 1155, 3, 2, 2, 2, 1155, 290, 3, 2, 2, 2, 1156, 1157, 9, 8, 2, 2, 1157, 1158, 3, 2, 2, 2, 1158, 1159, 8, 146, 2, 2, 1159, 292, 3, 2, 2, 2, 1160, 1164, 5, 295, 148, 2, 1161, 1163, 5, 297, 149, 2, 1162, 1161, 3, 2, 2, 2, 1163, 1166, 3, 2, 2, 2, 1164, 1162, 3, 2, 2, 2, 1164, 1165, 3, 2, 2, 2, 1165, 294, 3, 2, 2, 2, 1166, 1164, 3, 2, 2, 2, 1167, 1169, 9, 9, 2, 2, 1168, 1167, 3, 2, 2, 2, 1169, 296, 3, 2, 2, 2, 1170, 1173, 5, 295, 148, 2, 1171, 1173, 9, 10, 2, 2, 1172, 1170, 3, 2, 2, 2, 1172, 1171, 3, 2, 2, 2, 1173, 298, 3, 2, 2, 2, 1174, 1175, 7, 42, 2, 2, 1175, 1184, 7, 60, 2, 2, 1176, 1183, 5, 299, 150, 2, 1177, 1178, 7, 42, 2, 2, 1178, 1183, 10, 11, 2, 2, 1179, 1180, 7, 60, 2, 2, 1180, 1183, 10, 12, 2, 2, 1181, 1183, 10, 13, 2, 2, 1182, 1176, 3, 2, 2, 2, 1182, 1177, 3, 2, 2, 2, 1182, 1179, 3, 2, 2, 2, 1182, 1181, 3, 2, 2, 2, 1183, 1186, 3, 2, 2, 2, 1184, 1182, 3, 2, 2, 2, 1184, 1185, 3, 2, 2, 2, 1185, 1188, 3, 2, 2, 2, 1186, 1184, 3, 2, 2, 2, 1187, 1189, 7, 60, 2, 2, 1188, 1187, 3, 2, 2, 2, 1189, 1190, 3, 2, 2, 2, 1190, 1188, 3, 2, 2, 2, 1190, 1191, 3, 2, 2, 2, 1191, 1192, 3, 2, 2, 2, 1192, 1193, 7, 43, 2, 2, 1193, 1194, 3, 2, 2, 2, 1194, 1195, 8, 150, 2, 2, 1195, 300, 3, 2, 2, 2, 1196, 1197, 10, 14, 2, 2, 1197, 302, 3, 2, 2, 2, 20, 2, 1083, 1085, 1093, 1115, 1126, 1129, 1138, 1141, 1143, 1147, 1154, 1164, 1168, 1172, 1182, 1184, 1190, 3, 2, 3, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 180, 1610, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 4, 181, 9, 181, 4, 182, 9, 182, 4, 183, 9, 183, 4, 184, 9, 184, 4, 185, 9, 185, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 7, 168, 1496, 10, 168, 12, 168, 14, 168, 1499, 11, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 5, 169, 1506, 10, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 171, 3, 171, 3, 172, 3, 172, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 174, 3, 174, 3, 175, 3, 175, 3, 175, 5, 175, 1528, 10, 175, 3, 176, 3, 176, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 7, 177, 1537, 10, 177, 12, 177, 14, 177, 1540, 11, 177, 5, 177, 1542, 10, 177, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 7, 178, 1549, 10, 178, 12, 178, 14, 178, 1552, 11, 178, 5, 178, 1554, 10, 178, 5, 178, 1556, 10, 178, 3, 178, 3, 178, 5, 178, 1560, 10, 178, 3, 178, 3, 178, 3, 179, 6, 179, 1565, 10, 179, 13, 179, 14, 179, 1566, 3, 180, 3, 180, 3, 180, 3, 180, 3, 181, 3, 181, 7, 181, 1575, 10, 181, 12, 181, 14, 181, 1578, 11, 181, 3, 182, 5, 182, 1581, 10, 182, 3, 183, 3, 183, 5, 183, 1585, 10, 183, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 7, 184, 1595, 10, 184, 12, 184, 14, 184, 1598, 11, 184, 3, 184, 6, 184, 1601, 10, 184, 13, 184, 14, 184, 1602, 3, 184, 3, 184, 3, 184, 3, 184, 3, 185, 3, 185, 2, 2, 186, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 110, 219, 111, 221, 112, 223, 113, 225, 114, 227, 115, 229, 116, 231, 117, 233, 118, 235, 119, 237, 120, 239, 121, 241, 122, 243, 123, 245, 124, 247, 125, 249, 126, 251, 127, 253, 128, 255, 129, 257, 130, 259, 131, 261, 132, 263, 133, 265, 134, 267, 135, 269, 136, 271, 137, 273, 138, 275, 139, 277, 140, 279, 141, 281, 142, 283, 143, 285, 144, 287, 145, 289, 146, 291, 147, 293, 148, 295, 149, 297, 150, 299, 151, 301, 152, 303, 153, 305, 154, 307, 155, 309, 156, 311, 157, 313, 158, 315, 159, 317, 160, 319, 161, 321, 162, 323, 163, 325, 164, 327, 165, 329, 166, 331, 167, 333, 168, 335, 169, 337, 2, 339, 2, 341, 2, 343, 170, 345, 171, 347, 172, 349, 173, 351, 174, 353, 175, 355, 176, 357, 2, 359, 177, 361, 178, 363, 2, 365, 2, 367, 179, 369, 180, 3, 2, 15, 4, 2, 36, 36, 94, 94, 10, 2, 36, 36, 49, 49, 94, 94, 100, 100, 104, 104, 112, 112, 116, 116, 118, 118, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 50, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 5, 2, 11, 12, 15, 15, 34, 34, 16, 2, 67, 92, 97, 97, 99, 124, 194, 216, 218, 248, 250, 769, 882, 895, 897, 8193, 8206, 8207, 8306, 8593, 11266, 12273, 12291, 55297, 63746, 64977, 65010, 65535, 7, 2, 47, 47, 50, 59, 185, 185, 770, 881, 8257, 8258, 3, 2, 60, 60, 3, 2, 43, 43, 4, 2, 42, 42, 60, 60, 7, 2, 36, 36, 40, 41, 62, 62, 125, 125, 127, 127, 2, 1622, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 267, 3, 2, 2, 2, 2, 269, 3, 2, 2, 2, 2, 271, 3, 2, 2, 2, 2, 273, 3, 2, 2, 2, 2, 275, 3, 2, 2, 2, 2, 277, 3, 2, 2, 2, 2, 279, 3, 2, 2, 2, 2, 281, 3, 2, 2, 2, 2, 283, 3, 2, 2, 2, 2, 285, 3, 2, 2, 2, 2, 287, 3, 2, 2, 2, 2, 289, 3, 2, 2, 2, 2, 291, 3, 2, 2, 2, 2, 293, 3, 2, 2, 2, 2, 295, 3, 2, 2, 2, 2, 297, 3, 2, 2, 2, 2, 299, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 2, 303, 3, 2, 2, 2, 2, 305, 3, 2, 2, 2, 2, 307, 3, 2, 2, 2, 2, 309, 3, 2, 2, 2, 2, 311, 3, 2, 2, 2, 2, 313, 3, 2, 2, 2, 2, 315, 3, 2, 2, 2, 2, 317, 3, 2, 2, 2, 2, 319, 3, 2, 2, 2, 2, 321, 3, 2, 2, 2, 2, 323, 3, 2, 2, 2, 2, 325, 3, 2, 2, 2, 2, 327, 3, 2, 2, 2, 2, 329, 3, 2, 2, 2, 2, 331, 3, 2, 2, 2, 2, 333, 3, 2, 2, 2, 2, 335, 3, 2, 2, 2, 2, 343, 3, 2, 2, 2, 2, 345, 3, 2, 2, 2, 2, 347, 3, 2, 2, 2, 2, 349, 3, 2, 2, 2, 2, 351, 3, 2, 2, 2, 2, 353, 3, 2, 2, 2, 2, 355, 3, 2, 2, 2, 2, 359, 3, 2, 2, 2, 2, 361, 3, 2, 2, 2, 2, 367, 3, 2, 2, 2, 2, 369, 3, 2, 2, 2, 3, 371, 3, 2, 2, 2, 5, 373, 3, 2, 2, 2, 7, 380, 3, 2, 2, 2, 9, 382, 3, 2, 2, 2, 11, 384, 3, 2, 2, 2, 13, 387, 3, 2, 2, 2, 15, 389, 3, 2, 2, 2, 17, 391, 3, 2, 2, 2, 19, 393, 3, 2, 2, 2, 21, 395, 3, 2, 2, 2, 23, 397, 3, 2, 2, 2, 25, 399, 3, 2, 2, 2, 27, 401, 3, 2, 2, 2, 29, 403, 3, 2, 2, 2, 31, 412, 3, 2, 2, 2, 33, 420, 3, 2, 2, 2, 35, 435, 3, 2, 2, 2, 37, 437, 3, 2, 2, 2, 39, 455, 3, 2, 2, 2, 41, 474, 3, 2, 2, 2, 43, 483, 3, 2, 2, 2, 45, 494, 3, 2, 2, 2, 47, 498, 3, 2, 2, 2, 49, 506, 3, 2, 2, 2, 51, 516, 3, 2, 2, 2, 53, 527, 3, 2, 2, 2, 55, 533, 3, 2, 2, 2, 57, 551, 3, 2, 2, 2, 59, 560, 3, 2, 2, 2, 61, 569, 3, 2, 2, 2, 63, 576, 3, 2, 2, 2, 65, 584, 3, 2, 2, 2, 67, 592, 3, 2, 2, 2, 69, 595, 3, 2, 2, 2, 71, 598, 3, 2, 2, 2, 73, 601, 3, 2, 2, 2, 75, 604, 3, 2, 2, 2, 77, 607, 3, 2, 2, 2, 79, 610, 3, 2, 2, 2, 81, 613, 3, 2, 2, 2, 83, 615, 3, 2, 2, 2, 85, 618, 3, 2, 2, 2, 87, 620, 3, 2, 2, 2, 89, 623, 3, 2, 2, 2, 91, 626, 3, 2, 2, 2, 93, 628, 3, 2, 2, 2, 95, 630, 3, 2, 2, 2, 97, 634, 3, 2, 2, 2, 99, 639, 3, 2, 2, 2, 101, 643, 3, 2, 2, 2, 103, 645, 3, 2, 2, 2, 105, 647, 3, 2, 2, 2, 107, 649, 3, 2, 2, 2, 109, 651, 3, 2, 2, 2, 111, 654, 3, 2, 2, 2, 113, 656, 3, 2, 2, 2, 115, 659, 3, 2, 2, 2, 117, 662, 3, 2, 2, 2, 119, 665, 3, 2, 2, 2, 121, 669, 3, 2, 2, 2, 123, 673, 3, 2, 2, 2, 125, 679, 3, 2, 2, 2, 127, 685, 3, 2, 2, 2, 129, 688, 3, 2, 2, 2, 131, 694, 3, 2, 2, 2, 133, 701, 3, 2, 2, 2, 135, 704, 3, 2, 2, 2, 137, 707, 3, 2, 2, 2, 139, 710, 3, 2, 2, 2, 141, 713, 3, 2, 2, 2, 143, 722, 3, 2, 2, 2, 145, 728, 3, 2, 2, 2, 147, 734, 3, 2, 2, 2, 149, 741, 3, 2, 2, 2, 151, 751, 3, 2, 2, 2, 153, 762, 3, 2, 2, 2, 155, 767, 3, 2, 2, 2, 157, 773, 3, 2, 2, 2, 159, 783, 3, 2, 2, 2, 161, 793, 3, 2, 2, 2, 163, 802, 3, 2, 2, 2, 165, 808, 3, 2, 2, 2, 167, 815, 3, 2, 2, 2, 169, 820, 3, 2, 2, 2, 171, 824, 3, 2, 2, 2, 173, 830, 3, 2, 2, 2, 175, 838, 3, 2, 2, 2, 177, 843, 3, 2, 2, 2, 179, 848, 3, 2, 2, 2, 181, 859, 3, 2, 2, 2, 183, 862, 3, 2, 2, 2, 185, 866, 3, 2, 2, 2, 187, 870, 3, 2, 2, 2, 189, 873, 3, 2, 2, 2, 191, 882, 3, 2, 2, 2, 193, 885, 3, 2, 2, 2, 195, 896, 3, 2, 2, 2, 197, 899, 3, 2, 2, 2, 199, 905, 3, 2, 2, 2, 201, 910, 3, 2, 2, 2, 203, 919, 3, 2, 2, 2, 205, 927, 3, 2, 2, 2, 207, 934, 3, 2, 2, 2, 209, 944, 3, 2, 2, 2, 211, 949, 3, 2, 2, 2, 213, 955, 3, 2, 2, 2, 215, 960, 3, 2, 2, 2, 217, 969, 3, 2, 2, 2, 219, 978, 3, 2, 2, 2, 221, 986, 3, 2, 2, 2, 223, 994, 3, 2, 2, 2, 225, 999, 3, 2, 2, 2, 227, 1008, 3, 2, 2, 2, 229, 1015, 3, 2, 2, 2, 231, 1022, 3, 2, 2, 2, 233, 1029, 3, 2, 2, 2, 235, 1037, 3, 2, 2, 2, 237, 1042, 3, 2, 2, 2, 239, 1049, 3, 2, 2, 2, 241, 1056, 3, 2, 2, 2, 243, 1061, 3, 2, 2, 2, 245, 1067, 3, 2, 2, 2, 247, 1072, 3, 2, 2, 2, 249, 1077, 3, 2, 2, 2, 251, 1086, 3, 2, 2, 2, 253, 1092, 3, 2, 2, 2, 255, 1097, 3, 2, 2, 2, 257, 1106, 3, 2, 2, 2, 259, 1111, 3, 2, 2, 2, 261, 1121, 3, 2, 2, 2, 263, 1127, 3, 2, 2, 2, 265, 1134, 3, 2, 2, 2, 267, 1141, 3, 2, 2, 2, 269, 1151, 3, 2, 2, 2, 271, 1159, 3, 2, 2, 2, 273, 1161, 3, 2, 2, 2, 275, 1164, 3, 2, 2, 2, 277, 1166, 3, 2, 2, 2, 279, 1172, 3, 2, 2, 2, 281, 1183, 3, 2, 2, 2, 283, 1193, 3, 2, 2, 2, 285, 1198, 3, 2, 2, 2, 287, 1217, 3, 2, 2, 2, 289, 1235, 3, 2, 2, 2, 291, 1245, 3, 2, 2, 2, 293, 1252, 3, 2, 2, 2, 295, 1261, 3, 2, 2, 2, 297, 1279, 3, 2, 2, 2, 299, 1289, 3, 2, 2, 2, 301, 1306, 3, 2, 2, 2, 303, 1311, 3, 2, 2, 2, 305, 1318, 3, 2, 2, 2, 307, 1327, 3, 2, 2, 2, 309, 1341, 3, 2, 2, 2, 311, 1346, 3, 2, 2, 2, 313, 1369, 3, 2, 2, 2, 315, 1384, 3, 2, 2, 2, 317, 1401, 3, 2, 2, 2, 319, 1416, 3, 2, 2, 2, 321, 1427, 3, 2, 2, 2, 323, 1440, 3, 2, 2, 2, 325, 1450, 3, 2, 2, 2, 327, 1462, 3, 2, 2, 2, 329, 1474, 3, 2, 2, 2, 331, 1482, 3, 2, 2, 2, 333, 1488, 3, 2, 2, 2, 335, 1492, 3, 2, 2, 2, 337, 1502, 3, 2, 2, 2, 339, 1507, 3, 2, 2, 2, 341, 1513, 3, 2, 2, 2, 343, 1515, 3, 2, 2, 2, 345, 1517, 3, 2, 2, 2, 347, 1522, 3, 2, 2, 2, 349, 1527, 3, 2, 2, 2, 351, 1529, 3, 2, 2, 2, 353, 1541, 3, 2, 2, 2, 355, 1555, 3, 2, 2, 2, 357, 1564, 3, 2, 2, 2, 359, 1568, 3, 2, 2, 2, 361, 1572, 3, 2, 2, 2, 363, 1580, 3, 2, 2, 2, 365, 1584, 3, 2, 2, 2, 367, 1586, 3, 2, 2, 2, 369, 1608, 3, 2, 2, 2, 371, 372, 7, 61, 2, 2, 372, 4, 3, 2, 2, 2, 373, 374, 7, 111, 2, 2, 374, 375, 7, 113, 2, 2, 375, 376, 7, 102, 2, 2, 376, 377, 7, 119, 2, 2, 377, 378, 7, 110, 2, 2, 378, 379, 7, 103, 2, 2, 379, 6, 3, 2, 2, 2, 380, 381, 7, 63, 2, 2, 381, 8, 3, 2, 2, 2, 382, 383, 7, 38, 2, 2, 383, 10, 3, 2, 2, 2, 384, 385, 7, 60, 2, 2, 385, 386, 7, 63, 2, 2, 386, 12, 3, 2, 2, 2, 387, 388, 7, 125, 2, 2, 388, 14, 3, 2, 2, 2, 389, 390, 7, 127, 2, 2, 390, 16, 3, 2, 2, 2, 391, 392, 7, 42, 2, 2, 392, 18, 3, 2, 2, 2, 393, 394, 7, 43, 2, 2, 394, 20, 3, 2, 2, 2, 395, 396, 7, 44, 2, 2, 396, 22, 3, 2, 2, 2, 397, 398, 7, 126, 2, 2, 398, 24, 3, 2, 2, 2, 399, 400, 7, 39, 2, 2, 400, 26, 3, 2, 2, 2, 401, 402, 7, 46, 2, 2, 402, 28, 3, 2, 2, 2, 403, 404, 7, 113, 2, 2, 404, 405, 7, 116, 2, 2, 405, 406, 7, 102, 2, 2, 406, 407, 7, 103, 2, 2, 407, 408, 7, 116, 2, 2, 408, 409, 7, 107, 2, 2, 409, 410, 7, 112, 2, 2, 410, 411, 7, 105, 2, 2, 411, 30, 3, 2, 2, 2, 412, 413, 7, 113, 2, 2, 413, 414, 7, 116, 2, 2, 414, 415, 7, 102, 2, 2, 415, 416, 7, 103, 2, 2, 416, 417, 7, 116, 2, 2, 417, 418, 7, 103, 2, 2, 418, 419, 7, 102, 2, 2, 419, 32, 3, 2, 2, 2, 420, 421, 7, 102, 2, 2, 421, 422, 7, 103, 2, 2, 422, 423, 7, 101, 2, 2, 423, 424, 7, 107, 2, 2, 424, 425, 7, 111, 2, 2, 425, 426, 7, 99, 2, 2, 426, 427, 7, 110, 2, 2, 427, 428, 7, 47, 2, 2, 428, 429, 7, 104, 2, 2, 429, 430, 7, 113, 2, 2, 430, 431, 7, 116, 2, 2, 431, 432, 7, 111, 2, 2, 432, 433, 7, 99, 2, 2, 433, 434, 7, 118, 2, 2, 434, 34, 3, 2, 2, 2, 435, 436, 7, 60, 2, 2, 436, 36, 3, 2, 2, 2, 437, 438, 7, 102, 2, 2, 438, 439, 7, 103, 2, 2, 439, 440, 7, 101, 2, 2, 440, 441, 7, 107, 2, 2, 441, 442, 7, 111, 2, 2, 442, 443, 7, 99, 2, 2, 443, 444, 7, 110, 2, 2, 444, 445, 7, 47, 2, 2, 445, 446, 7, 117, 2, 2, 446, 447, 7, 103, 2, 2, 447, 448, 7, 114, 2, 2, 448, 449, 7, 99, 2, 2, 449, 450, 7, 116, 2, 2, 450, 451, 7, 99, 2, 2, 451, 452, 7, 118, 2, 2, 452, 453, 7, 113, 2, 2, 453, 454, 7, 116, 2, 2, 454, 38, 3, 2, 2, 2, 455, 456, 7, 105, 2, 2, 456, 457, 7, 116, 2, 2, 457, 458, 7, 113, 2, 2, 458, 459, 7, 119, 2, 2, 459, 460, 7, 114, 2, 2, 460, 461, 7, 107, 2, 2, 461, 462, 7, 112, 2, 2, 462, 463, 7, 105, 2, 2, 463, 464, 7, 47, 2, 2, 464, 465, 7, 117, 2, 2, 465, 466, 7, 103, 2, 2, 466, 467, 7, 114, 2, 2, 467, 468, 7, 99, 2, 2, 468, 469, 7, 116, 2, 2, 469, 470, 7, 99, 2, 2, 470, 471, 7, 118, 2, 2, 471, 472, 7, 113, 2, 2, 472, 473, 7, 116, 2, 2, 473, 40, 3, 2, 2, 2, 474, 475, 7, 107, 2, 2, 475, 476, 7, 112, 2, 2, 476, 477, 7, 104, 2, 2, 477, 478, 7, 107, 2, 2, 478, 479, 7, 112, 2, 2, 479, 480, 7, 107, 2, 2, 480, 481, 7, 118, 2, 2, 481, 482, 7, 123, 2, 2, 482, 42, 3, 2, 2, 2, 483, 484, 7, 111, 2, 2, 484, 485, 7, 107, 2, 2, 485, 486, 7, 112, 2, 2, 486, 487, 7, 119, 2, 2, 487, 488, 7, 117, 2, 2, 488, 489, 7, 47, 2, 2, 489, 490, 7, 117, 2, 2, 490, 491, 7, 107, 2, 2, 491, 492, 7, 105, 2, 2, 492, 493, 7, 112, 2, 2, 493, 44, 3, 2, 2, 2, 494, 495, 7, 80, 2, 2, 495, 496, 7, 99, 2, 2, 496, 497, 7, 80, 2, 2, 497, 46, 3, 2, 2, 2, 498, 499, 7, 114, 2, 2, 499, 500, 7, 103, 2, 2, 500, 501, 7, 116, 2, 2, 501, 502, 7, 101, 2, 2, 502, 503, 7, 103, 2, 2, 503, 504, 7, 112, 2, 2, 504, 505, 7, 118, 2, 2, 505, 48, 3, 2, 2, 2, 506, 507, 7, 114, 2, 2, 507, 508, 7, 103, 2, 2, 508, 509, 7, 116, 2, 2, 509, 510, 7, 47, 2, 2, 510, 511, 7, 111, 2, 2, 511, 512, 7, 107, 2, 2, 512, 513, 7, 110, 2, 2, 513, 514, 7, 110, 2, 2, 514, 515, 7, 103, 2, 2, 515, 50, 3, 2, 2, 2, 516, 517, 7, 124, 2, 2, 517, 518, 7, 103, 2, 2, 518, 519, 7, 116, 2, 2, 519, 520, 7, 113, 2, 2, 520, 521, 7, 47, 2, 2, 521, 522, 7, 102, 2, 2, 522, 523, 7, 107, 2, 2, 523, 524, 7, 105, 2, 2, 524, 525, 7, 107, 2, 2, 525, 526, 7, 118, 2, 2, 526, 52, 3, 2, 2, 2, 527, 528, 7, 102, 2, 2, 528, 529, 7, 107, 2, 2, 529, 530, 7, 105, 2, 2, 530, 531, 7, 107, 2, 2, 531, 532, 7, 118, 2, 2, 532, 54, 3, 2, 2, 2, 533, 534, 7, 114, 2, 2, 534, 535, 7, 99, 2, 2, 535, 536, 7, 118, 2, 2, 536, 537, 7, 118, 2, 2, 537, 538, 7, 103, 2, 2, 538, 539, 7, 116, 2, 2, 539, 540, 7, 112, 2, 2, 540, 541, 7, 47, 2, 2, 541, 542, 7, 117, 2, 2, 542, 543, 7, 103, 2, 2, 543, 544, 7, 114, 2, 2, 544, 545, 7, 99, 2, 2, 545, 546, 7, 116, 2, 2, 546, 547, 7, 99, 2, 2, 547, 548, 7, 118, 2, 2, 548, 549, 7, 113, 2, 2, 549, 550, 7, 116, 2, 2, 550, 56, 3, 2, 2, 2, 551, 552, 7, 103, 2, 2, 552, 553, 7, 122, 2, 2, 553, 554, 7, 118, 2, 2, 554, 555, 7, 103, 2, 2, 555, 556, 7, 116, 2, 2, 556, 557, 7, 112, 2, 2, 557, 558, 7, 99, 2, 2, 558, 559, 7, 110, 2, 2, 559, 58, 3, 2, 2, 2, 560, 561, 7, 104, 2, 2, 561, 562, 7, 119, 2, 2, 562, 563, 7, 112, 2, 2, 563, 564, 7, 101, 2, 2, 564, 565, 7, 118, 2, 2, 565, 566, 7, 107, 2, 2, 566, 567, 7, 113, 2, 2, 567, 568, 7, 112, 2, 2, 568, 60, 3, 2, 2, 2, 569, 570, 7, 108, 2, 2, 570, 571, 7, 117, 2, 2, 571, 572, 7, 113, 2, 2, 572, 573, 7, 119, 2, 2, 573, 574, 7, 112, 2, 2, 574, 575, 7, 102, 2, 2, 575, 62, 3, 2, 2, 2, 576, 577, 7, 101, 2, 2, 577, 578, 7, 113, 2, 2, 578, 579, 7, 111, 2, 2, 579, 580, 7, 114, 2, 2, 580, 581, 7, 99, 2, 2, 581, 582, 7, 101, 2, 2, 582, 583, 7, 118, 2, 2, 583, 64, 3, 2, 2, 2, 584, 585, 7, 120, 2, 2, 585, 586, 7, 103, 2, 2, 586, 587, 7, 116, 2, 2, 587, 588, 7, 100, 2, 2, 588, 589, 7, 113, 2, 2, 589, 590, 7, 117, 2, 2, 590, 591, 7, 103, 2, 2, 591, 66, 3, 2, 2, 2, 592, 593, 7, 103, 2, 2, 593, 594, 7, 115, 2, 2, 594, 68, 3, 2, 2, 2, 595, 596, 7, 112, 2, 2, 596, 597, 7, 103, 2, 2, 597, 70, 3, 2, 2, 2, 598, 599, 7, 110, 2, 2, 599, 600, 7, 118, 2, 2, 600, 72, 3, 2, 2, 2, 601, 602, 7, 110, 2, 2, 602, 603, 7, 103, 2, 2, 603, 74, 3, 2, 2, 2, 604, 605, 7, 105, 2, 2, 605, 606, 7, 118, 2, 2, 606, 76, 3, 2, 2, 2, 607, 608, 7, 105, 2, 2, 608, 609, 7, 103, 2, 2, 609, 78, 3, 2, 2, 2, 610, 611, 7, 35, 2, 2, 611, 612, 7, 63, 2, 2, 612, 80, 3, 2, 2, 2, 613, 614, 7, 62, 2, 2, 614, 82, 3, 2, 2, 2, 615, 616, 7, 62, 2, 2, 616, 617, 7, 63, 2, 2, 617, 84, 3, 2, 2, 2, 618, 619, 7, 64, 2, 2, 619, 86, 3, 2, 2, 2, 620, 621, 7, 64, 2, 2, 621, 622, 7, 63, 2, 2, 622, 88, 3, 2, 2, 2, 623, 624, 7, 126, 2, 2, 624, 625, 7, 126, 2, 2, 625, 90, 3, 2, 2, 2, 626, 627, 7, 45, 2, 2, 627, 92, 3, 2, 2, 2, 628, 629, 7, 47, 2, 2, 629, 94, 3, 2, 2, 2, 630, 631, 7, 102, 2, 2, 631, 632, 7, 107, 2, 2, 632, 633, 7, 120, 2, 2, 633, 96, 3, 2, 2, 2, 634, 635, 7, 107, 2, 2, 635, 636, 7, 102, 2, 2, 636, 637, 7, 107, 2, 2, 637, 638, 7, 120, 2, 2, 638, 98, 3, 2, 2, 2, 639, 640, 7, 111, 2, 2, 640, 641, 7, 113, 2, 2, 641, 642, 7, 102, 2, 2, 642, 100, 3, 2, 2, 2, 643, 644, 7, 35, 2, 2, 644, 102, 3, 2, 2, 2, 645, 646, 7, 93, 2, 2, 646, 104, 3, 2, 2, 2, 647, 648, 7, 95, 2, 2, 648, 106, 3, 2, 2, 2, 649, 650, 7, 48, 2, 2, 650, 108, 3, 2, 2, 2, 651, 652, 7, 38, 2, 2, 652, 653, 7, 38, 2, 2, 653, 110, 3, 2, 2, 2, 654, 655, 7, 37, 2, 2, 655, 112, 3, 2, 2, 2, 656, 657, 7, 48, 2, 2, 657, 658, 7, 48, 2, 2, 658, 114, 3, 2, 2, 2, 659, 660, 7, 125, 2, 2, 660, 661, 7, 126, 2, 2, 661, 116, 3, 2, 2, 2, 662, 663, 7, 126, 2, 2, 663, 664, 7, 127, 2, 2, 664, 118, 3, 2, 2, 2, 665, 666, 7, 104, 2, 2, 666, 667, 7, 113, 2, 2, 667, 668, 7, 116, 2, 2, 668, 120, 3, 2, 2, 2, 669, 670, 7, 110, 2, 2, 670, 671, 7, 103, 2, 2, 671, 672, 7, 118, 2, 2, 672, 122, 3, 2, 2, 2, 673, 674, 7, 121, 2, 2, 674, 675, 7, 106, 2, 2, 675, 676, 7, 103, 2, 2, 676, 677, 7, 116, 2, 2, 677, 678, 7, 103, 2, 2, 678, 124, 3, 2, 2, 2, 679, 680, 7, 105, 2, 2, 680, 681, 7, 116, 2, 2, 681, 682, 7, 113, 2, 2, 682, 683, 7, 119, 2, 2, 683, 684, 7, 114, 2, 2, 684, 126, 3, 2, 2, 2, 685, 686, 7, 100, 2, 2, 686, 687, 7, 123, 2, 2, 687, 128, 3, 2, 2, 2, 688, 689, 7, 113, 2, 2, 689, 690, 7, 116, 2, 2, 690, 691, 7, 102, 2, 2, 691, 692, 7, 103, 2, 2, 692, 693, 7, 116, 2, 2, 693, 130, 3, 2, 2, 2, 694, 695, 7, 116, 2, 2, 695, 696, 7, 103, 2, 2, 696, 697, 7, 118, 2, 2, 697, 698, 7, 119, 2, 2, 698, 699, 7, 116, 2, 2, 699, 700, 7, 112, 2, 2, 700, 132, 3, 2, 2, 2, 701, 702, 7, 107, 2, 2, 702, 703, 7, 104, 2, 2, 703, 134, 3, 2, 2, 2, 704, 705, 7, 107, 2, 2, 705, 706, 7, 112, 2, 2, 706, 136, 3, 2, 2, 2, 707, 708, 7, 99, 2, 2, 708, 709, 7, 117, 2, 2, 709, 138, 3, 2, 2, 2, 710, 711, 7, 99, 2, 2, 711, 712, 7, 118, 2, 2, 712, 140, 3, 2, 2, 2, 713, 714, 7, 99, 2, 2, 714, 715, 7, 110, 2, 2, 715, 716, 7, 110, 2, 2, 716, 717, 7, 113, 2, 2, 717, 718, 7, 121, 2, 2, 718, 719, 7, 107, 2, 2, 719, 720, 7, 112, 2, 2, 720, 721, 7, 105, 2, 2, 721, 142, 3, 2, 2, 2, 722, 723, 7, 103, 2, 2, 723, 724, 7, 111, 2, 2, 724, 725, 7, 114, 2, 2, 725, 726, 7, 118, 2, 2, 726, 727, 7, 123, 2, 2, 727, 144, 3, 2, 2, 2, 728, 729, 7, 101, 2, 2, 729, 730, 7, 113, 2, 2, 730, 731, 7, 119, 2, 2, 731, 732, 7, 112, 2, 2, 732, 733, 7, 118, 2, 2, 733, 146, 3, 2, 2, 2, 734, 735, 7, 117, 2, 2, 735, 736, 7, 118, 2, 2, 736, 737, 7, 99, 2, 2, 737, 738, 7, 100, 2, 2, 738, 739, 7, 110, 2, 2, 739, 740, 7, 103, 2, 2, 740, 148, 3, 2, 2, 2, 741, 742, 7, 99, 2, 2, 742, 743, 7, 117, 2, 2, 743, 744, 7, 101, 2, 2, 744, 745, 7, 103, 2, 2, 745, 746, 7, 112, 2, 2, 746, 747, 7, 102, 2, 2, 747, 748, 7, 107, 2, 2, 748, 749, 7, 112, 2, 2, 749, 750, 7, 105, 2, 2, 750, 150, 3, 2, 2, 2, 751, 752, 7, 102, 2, 2, 752, 753, 7, 103, 2, 2, 753, 754, 7, 117, 2, 2, 754, 755, 7, 101, 2, 2, 755, 756, 7, 103, 2, 2, 756, 757, 7, 112, 2, 2, 757, 758, 7, 102, 2, 2, 758, 759, 7, 107, 2, 2, 759, 760, 7, 112, 2, 2, 760, 761, 7, 105, 2, 2, 761, 152, 3, 2, 2, 2, 762, 763, 7, 117, 2, 2, 763, 764, 7, 113, 2, 2, 764, 765, 7, 111, 2, 2, 765, 766, 7, 103, 2, 2, 766, 154, 3, 2, 2, 2, 767, 768, 7, 103, 2, 2, 768, 769, 7, 120, 2, 2, 769, 770, 7, 103, 2, 2, 770, 771, 7, 116, 2, 2, 771, 772, 7, 123, 2, 2, 772, 156, 3, 2, 2, 2, 773, 774, 7, 117, 2, 2, 774, 775, 7, 99, 2, 2, 775, 776, 7, 118, 2, 2, 776, 777, 7, 107, 2, 2, 777, 778, 7, 117, 2, 2, 778, 779, 7, 104, 2, 2, 779, 780, 7, 107, 2, 2, 780, 781, 7, 103, 2, 2, 781, 782, 7, 117, 2, 2, 782, 158, 3, 2, 2, 2, 783, 784, 7, 101, 2, 2, 784, 785, 7, 113, 2, 2, 785, 786, 7, 110, 2, 2, 786, 787, 7, 110, 2, 2, 787, 788, 7, 99, 2, 2, 788, 789, 7, 118, 2, 2, 789, 790, 7, 107, 2, 2, 790, 791, 7, 113, 2, 2, 791, 792, 7, 112, 2, 2, 792, 160, 3, 2, 2, 2, 793, 794, 7, 105, 2, 2, 794, 795, 7, 116, 2, 2, 795, 796, 7, 103, 2, 2, 796, 797, 7, 99, 2, 2, 797, 798, 7, 118, 2, 2, 798, 799, 7, 103, 2, 2, 799, 800, 7, 117, 2, 2, 800, 801, 7, 118, 2, 2, 801, 162, 3, 2, 2, 2, 802, 803, 7, 110, 2, 2, 803, 804, 7, 103, 2, 2, 804, 805, 7, 99, 2, 2, 805, 806, 7, 117, 2, 2, 806, 807, 7, 118, 2, 2, 807, 164, 3, 2, 2, 2, 808, 809, 7, 117, 2, 2, 809, 810, 7, 121, 2, 2, 810, 811, 7, 107, 2, 2, 811, 812, 7, 118, 2, 2, 812, 813, 7, 101, 2, 2, 813, 814, 7, 106, 2, 2, 814, 166, 3, 2, 2, 2, 815, 816, 7, 101, 2, 2, 816, 817, 7, 99, 2, 2, 817, 818, 7, 117, 2, 2, 818, 819, 7, 103, 2, 2, 819, 168, 3, 2, 2, 2, 820, 821, 7, 118, 2, 2, 821, 822, 7, 116, 2, 2, 822, 823, 7, 123, 2, 2, 823, 170, 3, 2, 2, 2, 824, 825, 7, 101, 2, 2, 825, 826, 7, 99, 2, 2, 826, 827, 7, 118, 2, 2, 827, 828, 7, 101, 2, 2, 828, 829, 7, 106, 2, 2, 829, 172, 3, 2, 2, 2, 830, 831, 7, 102, 2, 2, 831, 832, 7, 103, 2, 2, 832, 833, 7, 104, 2, 2, 833, 834, 7, 99, 2, 2, 834, 835, 7, 119, 2, 2, 835, 836, 7, 110, 2, 2, 836, 837, 7, 118, 2, 2, 837, 174, 3, 2, 2, 2, 838, 839, 7, 118, 2, 2, 839, 840, 7, 106, 2, 2, 840, 841, 7, 103, 2, 2, 841, 842, 7, 112, 2, 2, 842, 176, 3, 2, 2, 2, 843, 844, 7, 103, 2, 2, 844, 845, 7, 110, 2, 2, 845, 846, 7, 117, 2, 2, 846, 847, 7, 103, 2, 2, 847, 178, 3, 2, 2, 2, 848, 849, 7, 118, 2, 2, 849, 850, 7, 123, 2, 2, 850, 851, 7, 114, 2, 2, 851, 852, 7, 103, 2, 2, 852, 853, 7, 117, 2, 2, 853, 854, 7, 121, 2, 2, 854, 855, 7, 107, 2, 2, 855, 856, 7, 118, 2, 2, 856, 857, 7, 101, 2, 2, 857, 858, 7, 106, 2, 2, 858, 180, 3, 2, 2, 2, 859, 860, 7, 113, 2, 2, 860, 861, 7, 116, 2, 2, 861, 182, 3, 2, 2, 2, 862, 863, 7, 99, 2, 2, 863, 864, 7, 112, 2, 2, 864, 865, 7, 102, 2, 2, 865, 184, 3, 2, 2, 2, 866, 867, 7, 112, 2, 2, 867, 868, 7, 113, 2, 2, 868, 869, 7, 118, 2, 2, 869, 186, 3, 2, 2, 2, 870, 871, 7, 118, 2, 2, 871, 872, 7, 113, 2, 2, 872, 188, 3, 2, 2, 2, 873, 874, 7, 107, 2, 2, 874, 875, 7, 112, 2, 2, 875, 876, 7, 117, 2, 2, 876, 877, 7, 118, 2, 2, 877, 878, 7, 99, 2, 2, 878, 879, 7, 112, 2, 2, 879, 880, 7, 101, 2, 2, 880, 881, 7, 103, 2, 2, 881, 190, 3, 2, 2, 2, 882, 883, 7, 113, 2, 2, 883, 884, 7, 104, 2, 2, 884, 192, 3, 2, 2, 2, 885, 886, 7, 117, 2, 2, 886, 887, 7, 118, 2, 2, 887, 888, 7, 99, 2, 2, 888, 889, 7, 118, 2, 2, 889, 890, 7, 107, 2, 2, 890, 891, 7, 101, 2, 2, 891, 892, 7, 99, 2, 2, 892, 893, 7, 110, 2, 2, 893, 894, 7, 110, 2, 2, 894, 895, 7, 123, 2, 2, 895, 194, 3, 2, 2, 2, 896, 897, 7, 107, 2, 2, 897, 898, 7, 117, 2, 2, 898, 196, 3, 2, 2, 2, 899, 900, 7, 118, 2, 2, 900, 901, 7, 116, 2, 2, 901, 902, 7, 103, 2, 2, 902, 903, 7, 99, 2, 2, 903, 904, 7, 118, 2, 2, 904, 198, 3, 2, 2, 2, 905, 906, 7, 101, 2, 2, 906, 907, 7, 99, 2, 2, 907, 908, 7, 117, 2, 2, 908, 909, 7, 118, 2, 2, 909, 200, 3, 2, 2, 2, 910, 911, 7, 101, 2, 2, 911, 912, 7, 99, 2, 2, 912, 913, 7, 117, 2, 2, 913, 914, 7, 118, 2, 2, 914, 915, 7, 99, 2, 2, 915, 916, 7, 100, 2, 2, 916, 917, 7, 110, 2, 2, 917, 918, 7, 103, 2, 2, 918, 202, 3, 2, 2, 2, 919, 920, 7, 120, 2, 2, 920, 921, 7, 103, 2, 2, 921, 922, 7, 116, 2, 2, 922, 923, 7, 117, 2, 2, 923, 924, 7, 107, 2, 2, 924, 925, 7, 113, 2, 2, 925, 926, 7, 112, 2, 2, 926, 204, 3, 2, 2, 2, 927, 928, 7, 108, 2, 2, 928, 929, 7, 117, 2, 2, 929, 930, 7, 113, 2, 2, 930, 931, 7, 112, 2, 2, 931, 932, 7, 107, 2, 2, 932, 933, 7, 115, 2, 2, 933, 206, 3, 2, 2, 2, 934, 935, 7, 119, 2, 2, 935, 936, 7, 112, 2, 2, 936, 937, 7, 113, 2, 2, 937, 938, 7, 116, 2, 2, 938, 939, 7, 102, 2, 2, 939, 940, 7, 103, 2, 2, 940, 941, 7, 116, 2, 2, 941, 942, 7, 103, 2, 2, 942, 943, 7, 102, 2, 2, 943, 208, 3, 2, 2, 2, 944, 945, 7, 118, 2, 2, 945, 946, 7, 116, 2, 2, 946, 947, 7, 119, 2, 2, 947, 948, 7, 103, 2, 2, 948, 210, 3, 2, 2, 2, 949, 950, 7, 104, 2, 2, 950, 951, 7, 99, 2, 2, 951, 952, 7, 110, 2, 2, 952, 953, 7, 117, 2, 2, 953, 954, 7, 103, 2, 2, 954, 212, 3, 2, 2, 2, 955, 956, 7, 118, 2, 2, 956, 957, 7, 123, 2, 2, 957, 958, 7, 114, 2, 2, 958, 959, 7, 103, 2, 2, 959, 214, 3, 2, 2, 2, 960, 961, 7, 120, 2, 2, 961, 962, 7, 99, 2, 2, 962, 963, 7, 110, 2, 2, 963, 964, 7, 107, 2, 2, 964, 965, 7, 102, 2, 2, 965, 966, 7, 99, 2, 2, 966, 967, 7, 118, 2, 2, 967, 968, 7, 103, 2, 2, 968, 216, 3, 2, 2, 2, 969, 970, 7, 99, 2, 2, 970, 971, 7, 112, 2, 2, 971, 972, 7, 112, 2, 2, 972, 973, 7, 113, 2, 2, 973, 974, 7, 118, 2, 2, 974, 975, 7, 99, 2, 2, 975, 976, 7, 118, 2, 2, 976, 977, 7, 103, 2, 2, 977, 218, 3, 2, 2, 2, 978, 979, 7, 102, 2, 2, 979, 980, 7, 103, 2, 2, 980, 981, 7, 101, 2, 2, 981, 982, 7, 110, 2, 2, 982, 983, 7, 99, 2, 2, 983, 984, 7, 116, 2, 2, 984, 985, 7, 103, 2, 2, 985, 220, 3, 2, 2, 2, 986, 987, 7, 101, 2, 2, 987, 988, 7, 113, 2, 2, 988, 989, 7, 112, 2, 2, 989, 990, 7, 118, 2, 2, 990, 991, 7, 103, 2, 2, 991, 992, 7, 122, 2, 2, 992, 993, 7, 118, 2, 2, 993, 222, 3, 2, 2, 2, 994, 995, 7, 107, 2, 2, 995, 996, 7, 118, 2, 2, 996, 997, 7, 103, 2, 2, 997, 998, 7, 111, 2, 2, 998, 224, 3, 2, 2, 2, 999, 1000, 7, 120, 2, 2, 1000, 1001, 7, 99, 2, 2, 1001, 1002, 7, 116, 2, 2, 1002, 1003, 7, 107, 2, 2, 1003, 1004, 7, 99, 2, 2, 1004, 1005, 7, 100, 2, 2, 1005, 1006, 7, 110, 2, 2, 1006, 1007, 7, 103, 2, 2, 1007, 226, 3, 2, 2, 2, 1008, 1009, 7, 107, 2, 2, 1009, 1010, 7, 112, 2, 2, 1010, 1011, 7, 117, 2, 2, 1011, 1012, 7, 103, 2, 2, 1012, 1013, 7, 116, 2, 2, 1013, 1014, 7, 118, 2, 2, 1014, 228, 3, 2, 2, 2, 1015, 1016, 7, 102, 2, 2, 1016, 1017, 7, 103, 2, 2, 1017, 1018, 7, 110, 2, 2, 1018, 1019, 7, 103, 2, 2, 1019, 1020, 7, 118, 2, 2, 1020, 1021, 7, 103, 2, 2, 1021, 230, 3, 2, 2, 2, 1022, 1023, 7, 116, 2, 2, 1023, 1024, 7, 103, 2, 2, 1024, 1025, 7, 112, 2, 2, 1025, 1026, 7, 99, 2, 2, 1026, 1027, 7, 111, 2, 2, 1027, 1028, 7, 103, 2, 2, 1028, 232, 3, 2, 2, 2, 1029, 1030, 7, 116, 2, 2, 1030, 1031, 7, 103, 2, 2, 1031, 1032, 7, 114, 2, 2, 1032, 1033, 7, 110, 2, 2, 1033, 1034, 7, 99, 2, 2, 1034, 1035, 7, 101, 2, 2, 1035, 1036, 7, 103, 2, 2, 1036, 234, 3, 2, 2, 2, 1037, 1038, 7, 101, 2, 2, 1038, 1039, 7, 113, 2, 2, 1039, 1040, 7, 114, 2, 2, 1040, 1041, 7, 123, 2, 2, 1041, 236, 3, 2, 2, 2, 1042, 1043, 7, 111, 2, 2, 1043, 1044, 7, 113, 2, 2, 1044, 1045, 7, 102, 2, 2, 1045, 1046, 7, 107, 2, 2, 1046, 1047, 7, 104, 2, 2, 1047, 1048, 7, 123, 2, 2, 1048, 238, 3, 2, 2, 2, 1049, 1050, 7, 99, 2, 2, 1050, 1051, 7, 114, 2, 2, 1051, 1052, 7, 114, 2, 2, 1052, 1053, 7, 103, 2, 2, 1053, 1054, 7, 112, 2, 2, 1054, 1055, 7, 102, 2, 2, 1055, 240, 3, 2, 2, 2, 1056, 1057, 7, 107, 2, 2, 1057, 1058, 7, 112, 2, 2, 1058, 1059, 7, 118, 2, 2, 1059, 1060, 7, 113, 2, 2, 1060, 242, 3, 2, 2, 2, 1061, 1062, 7, 120, 2, 2, 1062, 1063, 7, 99, 2, 2, 1063, 1064, 7, 110, 2, 2, 1064, 1065, 7, 119, 2, 2, 1065, 1066, 7, 103, 2, 2, 1066, 244, 3, 2, 2, 2, 1067, 1068, 7, 108, 2, 2, 1068, 1069, 7, 117, 2, 2, 1069, 1070, 7, 113, 2, 2, 1070, 1071, 7, 112, 2, 2, 1071, 246, 3, 2, 2, 2, 1072, 1073, 7, 121, 2, 2, 1073, 1074, 7, 107, 2, 2, 1074, 1075, 7, 118, 2, 2, 1075, 1076, 7, 106, 2, 2, 1076, 248, 3, 2, 2, 2, 1077, 1078, 7, 114, 2, 2, 1078, 1079, 7, 113, 2, 2, 1079, 1080, 7, 117, 2, 2, 1080, 1081, 7, 107, 2, 2, 1081, 1082, 7, 118, 2, 2, 1082, 1083, 7, 107, 2, 2, 1083, 1084, 7, 113, 2, 2, 1084, 1085, 7, 112, 2, 2, 1085, 250, 3, 2, 2, 2, 1086, 1087, 7, 100, 2, 2, 1087, 1088, 7, 116, 2, 2, 1088, 1089, 7, 103, 2, 2, 1089, 1090, 7, 99, 2, 2, 1090, 1091, 7, 109, 2, 2, 1091, 252, 3, 2, 2, 2, 1092, 1093, 7, 110, 2, 2, 1093, 1094, 7, 113, 2, 2, 1094, 1095, 7, 113, 2, 2, 1095, 1096, 7, 114, 2, 2, 1096, 254, 3, 2, 2, 2, 1097, 1098, 7, 101, 2, 2, 1098, 1099, 7, 113, 2, 2, 1099, 1100, 7, 112, 2, 2, 1100, 1101, 7, 118, 2, 2, 1101, 1102, 7, 107, 2, 2, 1102, 1103, 7, 112, 2, 2, 1103, 1104, 7, 119, 2, 2, 1104, 1105, 7, 103, 2, 2, 1105, 256, 3, 2, 2, 2, 1106, 1107, 7, 103, 2, 2, 1107, 1108, 7, 122, 2, 2, 1108, 1109, 7, 107, 2, 2, 1109, 1110, 7, 118, 2, 2, 1110, 258, 3, 2, 2, 2, 1111, 1112, 7, 116, 2, 2, 1112, 1113, 7, 103, 2, 2, 1113, 1114, 7, 118, 2, 2, 1114, 1115, 7, 119, 2, 2, 1115, 1116, 7, 116, 2, 2, 1116, 1117, 7, 112, 2, 2, 1117, 1118, 7, 107, 2, 2, 1118, 1119, 7, 112, 2, 2, 1119, 1120, 7, 105, 2, 2, 1120, 260, 3, 2, 2, 2, 1121, 1122, 7, 121, 2, 2, 1122, 1123, 7, 106, 2, 2, 1123, 1124, 7, 107, 2, 2, 1124, 1125, 7, 110, 2, 2, 1125, 1126, 7, 103, 2, 2, 1126, 262, 3, 2, 2, 2, 1127, 1128, 7, 107, 2, 2, 1128, 1129, 7, 111, 2, 2, 1129, 1130, 7, 114, 2, 2, 1130, 1131, 7, 113, 2, 2, 1131, 1132, 7, 116, 2, 2, 1132, 1133, 7, 118, 2, 2, 1133, 264, 3, 2, 2, 2, 1134, 1135, 7, 117, 2, 2, 1135, 1136, 7, 101, 2, 2, 1136, 1137, 7, 106, 2, 2, 1137, 1138, 7, 103, 2, 2, 1138, 1139, 7, 111, 2, 2, 1139, 1140, 7, 99, 2, 2, 1140, 266, 3, 2, 2, 2, 1141, 1142, 7, 112, 2, 2, 1142, 1143, 7, 99, 2, 2, 1143, 1144, 7, 111, 2, 2, 1144, 1145, 7, 103, 2, 2, 1145, 1146, 7, 117, 2, 2, 1146, 1147, 7, 114, 2, 2, 1147, 1148, 7, 99, 2, 2, 1148, 1149, 7, 101, 2, 2, 1149, 1150, 7, 103, 2, 2, 1150, 268, 3, 2, 2, 2, 1151, 1152, 7, 103, 2, 2, 1152, 1153, 7, 110, 2, 2, 1153, 1154, 7, 103, 2, 2, 1154, 1155, 7, 111, 2, 2, 1155, 1156, 7, 103, 2, 2, 1156, 1157, 7, 112, 2, 2, 1157, 1158, 7, 118, 2, 2, 1158, 270, 3, 2, 2, 2, 1159, 1160, 7, 49, 2, 2, 1160, 272, 3, 2, 2, 2, 1161, 1162, 7, 49, 2, 2, 1162, 1163, 7, 49, 2, 2, 1163, 274, 3, 2, 2, 2, 1164, 1165, 7, 66, 2, 2, 1165, 276, 3, 2, 2, 2, 1166, 1167, 7, 101, 2, 2, 1167, 1168, 7, 106, 2, 2, 1168, 1169, 7, 107, 2, 2, 1169, 1170, 7, 110, 2, 2, 1170, 1171, 7, 102, 2, 2, 1171, 278, 3, 2, 2, 2, 1172, 1173, 7, 102, 2, 2, 1173, 1174, 7, 103, 2, 2, 1174, 1175, 7, 117, 2, 2, 1175, 1176, 7, 101, 2, 2, 1176, 1177, 7, 103, 2, 2, 1177, 1178, 7, 112, 2, 2, 1178, 1179, 7, 102, 2, 2, 1179, 1180, 7, 99, 2, 2, 1180, 1181, 7, 112, 2, 2, 1181, 1182, 7, 118, 2, 2, 1182, 280, 3, 2, 2, 2, 1183, 1184, 7, 99, 2, 2, 1184, 1185, 7, 118, 2, 2, 1185, 1186, 7, 118, 2, 2, 1186, 1187, 7, 116, 2, 2, 1187, 1188, 7, 107, 2, 2, 1188, 1189, 7, 100, 2, 2, 1189, 1190, 7, 119, 2, 2, 1190, 1191, 7, 118, 2, 2, 1191, 1192, 7, 103, 2, 2, 1192, 282, 3, 2, 2, 2, 1193, 1194, 7, 117, 2, 2, 1194, 1195, 7, 103, 2, 2, 1195, 1196, 7, 110, 2, 2, 1196, 1197, 7, 104, 2, 2, 1197, 284, 3, 2, 2, 2, 1198, 1199, 7, 102, 2, 2, 1199, 1200, 7, 103, 2, 2, 1200, 1201, 7, 117, 2, 2, 1201, 1202, 7, 101, 2, 2, 1202, 1203, 7, 103, 2, 2, 1203, 1204, 7, 112, 2, 2, 1204, 1205, 7, 102, 2, 2, 1205, 1206, 7, 99, 2, 2, 1206, 1207, 7, 112, 2, 2, 1207, 1208, 7, 118, 2, 2, 1208, 1209, 7, 47, 2, 2, 1209, 1210, 7, 113, 2, 2, 1210, 1211, 7, 116, 2, 2, 1211, 1212, 7, 47, 2, 2, 1212, 1213, 7, 117, 2, 2, 1213, 1214, 7, 103, 2, 2, 1214, 1215, 7, 110, 2, 2, 1215, 1216, 7, 104, 2, 2, 1216, 286, 3, 2, 2, 2, 1217, 1218, 7, 104, 2, 2, 1218, 1219, 7, 113, 2, 2, 1219, 1220, 7, 110, 2, 2, 1220, 1221, 7, 110, 2, 2, 1221, 1222, 7, 113, 2, 2, 1222, 1223, 7, 121, 2, 2, 1223, 1224, 7, 107, 2, 2, 1224, 1225, 7, 112, 2, 2, 1225, 1226, 7, 105, 2, 2, 1226, 1227, 7, 47, 2, 2, 1227, 1228, 7, 117, 2, 2, 1228, 1229, 7, 107, 2, 2, 1229, 1230, 7, 100, 2, 2, 1230, 1231, 7, 110, 2, 2, 1231, 1232, 7, 107, 2, 2, 1232, 1233, 7, 112, 2, 2, 1233, 1234, 7, 105, 2, 2, 1234, 288, 3, 2, 2, 2, 1235, 1236, 7, 104, 2, 2, 1236, 1237, 7, 113, 2, 2, 1237, 1238, 7, 110, 2, 2, 1238, 1239, 7, 110, 2, 2, 1239, 1240, 7, 113, 2, 2, 1240, 1241, 7, 121, 2, 2, 1241, 1242, 7, 107, 2, 2, 1242, 1243, 7, 112, 2, 2, 1243, 1244, 7, 105, 2, 2, 1244, 290, 3, 2, 2, 2, 1245, 1246, 7, 114, 2, 2, 1246, 1247, 7, 99, 2, 2, 1247, 1248, 7, 116, 2, 2, 1248, 1249, 7, 103, 2, 2, 1249, 1250, 7, 112, 2, 2, 1250, 1251, 7, 118, 2, 2, 1251, 292, 3, 2, 2, 2, 1252, 1253, 7, 99, 2, 2, 1253, 1254, 7, 112, 2, 2, 1254, 1255, 7, 101, 2, 2, 1255, 1256, 7, 103, 2, 2, 1256, 1257, 7, 117, 2, 2, 1257, 1258, 7, 118, 2, 2, 1258, 1259, 7, 113, 2, 2, 1259, 1260, 7, 116, 2, 2, 1260, 294, 3, 2, 2, 2, 1261, 1262, 7, 114, 2, 2, 1262, 1263, 7, 116, 2, 2, 1263, 1264, 7, 103, 2, 2, 1264, 1265, 7, 101, 2, 2, 1265, 1266, 7, 103, 2, 2, 1266, 1267, 7, 102, 2, 2, 1267, 1268, 7, 107, 2, 2, 1268, 1269, 7, 112, 2, 2, 1269, 1270, 7, 105, 2, 2, 1270, 1271, 7, 47, 2, 2, 1271, 1272, 7, 117, 2, 2, 1272, 1273, 7, 107, 2, 2, 1273, 1274, 7, 100, 2, 2, 1274, 1275, 7, 110, 2, 2, 1275, 1276, 7, 107, 2, 2, 1276, 1277, 7, 112, 2, 2, 1277, 1278, 7, 105, 2, 2, 1278, 296, 3, 2, 2, 2, 1279, 1280, 7, 114, 2, 2, 1280, 1281, 7, 116, 2, 2, 1281, 1282, 7, 103, 2, 2, 1282, 1283, 7, 101, 2, 2, 1283, 1284, 7, 103, 2, 2, 1284, 1285, 7, 102, 2, 2, 1285, 1286, 7, 107, 2, 2, 1286, 1287, 7, 112, 2, 2, 1287, 1288, 7, 105, 2, 2, 1288, 298, 3, 2, 2, 2, 1289, 1290, 7, 99, 2, 2, 1290, 1291, 7, 112, 2, 2, 1291, 1292, 7, 101, 2, 2, 1292, 1293, 7, 103, 2, 2, 1293, 1294, 7, 117, 2, 2, 1294, 1295, 7, 118, 2, 2, 1295, 1296, 7, 113, 2, 2, 1296, 1297, 7, 116, 2, 2, 1297, 1298, 7, 47, 2, 2, 1298, 1299, 7, 113, 2, 2, 1299, 1300, 7, 116, 2, 2, 1300, 1301, 7, 47, 2, 2, 1301, 1302, 7, 117, 2, 2, 1302, 1303, 7, 103, 2, 2, 1303, 1304, 7, 110, 2, 2, 1304, 1305, 7, 104, 2, 2, 1305, 300, 3, 2, 2, 2, 1306, 1307, 7, 112, 2, 2, 1307, 1308, 7, 113, 2, 2, 1308, 1309, 7, 102, 2, 2, 1309, 1310, 7, 103, 2, 2, 1310, 302, 3, 2, 2, 2, 1311, 1312, 7, 100, 2, 2, 1312, 1313, 7, 107, 2, 2, 1313, 1314, 7, 112, 2, 2, 1314, 1315, 7, 99, 2, 2, 1315, 1316, 7, 116, 2, 2, 1316, 1317, 7, 123, 2, 2, 1317, 304, 3, 2, 2, 2, 1318, 1319, 7, 102, 2, 2, 1319, 1320, 7, 113, 2, 2, 1320, 1321, 7, 101, 2, 2, 1321, 1322, 7, 119, 2, 2, 1322, 1323, 7, 111, 2, 2, 1323, 1324, 7, 103, 2, 2, 1324, 1325, 7, 112, 2, 2, 1325, 1326, 7, 118, 2, 2, 1326, 306, 3, 2, 2, 2, 1327, 1328, 7, 102, 2, 2, 1328, 1329, 7, 113, 2, 2, 1329, 1330, 7, 101, 2, 2, 1330, 1331, 7, 119, 2, 2, 1331, 1332, 7, 111, 2, 2, 1332, 1333, 7, 103, 2, 2, 1333, 1334, 7, 112, 2, 2, 1334, 1335, 7, 118, 2, 2, 1335, 1336, 7, 47, 2, 2, 1336, 1337, 7, 112, 2, 2, 1337, 1338, 7, 113, 2, 2, 1338, 1339, 7, 102, 2, 2, 1339, 1340, 7, 103, 2, 2, 1340, 308, 3, 2, 2, 2, 1341, 1342, 7, 118, 2, 2, 1342, 1343, 7, 103, 2, 2, 1343, 1344, 7, 122, 2, 2, 1344, 1345, 7, 118, 2, 2, 1345, 310, 3, 2, 2, 2, 1346, 1347, 7, 114, 2, 2, 1347, 1348, 7, 116, 2, 2, 1348, 1349, 7, 113, 2, 2, 1349, 1350, 7, 101, 2, 2, 1350, 1351, 7, 103, 2, 2, 1351, 1352, 7, 117, 2, 2, 1352, 1353, 7, 117, 2, 2, 1353, 1354, 7, 107, 2, 2, 1354, 1355, 7, 112, 2, 2, 1355, 1356, 7, 105, 2, 2, 1356, 1357, 7, 47, 2, 2, 1357, 1358, 7, 107, 2, 2, 1358, 1359, 7, 112, 2, 2, 1359, 1360, 7, 117, 2, 2, 1360, 1361, 7, 118, 2, 2, 1361, 1362, 7, 116, 2, 2, 1362, 1363, 7, 119, 2, 2, 1363, 1364, 7, 101, 2, 2, 1364, 1365, 7, 118, 2, 2, 1365, 1366, 7, 107, 2, 2, 1366, 1367, 7, 113, 2, 2, 1367, 1368, 7, 112, 2, 2, 1368, 312, 3, 2, 2, 2, 1369, 1370, 7, 112, 2, 2, 1370, 1371, 7, 99, 2, 2, 1371, 1372, 7, 111, 2, 2, 1372, 1373, 7, 103, 2, 2, 1373, 1374, 7, 117, 2, 2, 1374, 1375, 7, 114, 2, 2, 1375, 1376, 7, 99, 2, 2, 1376, 1377, 7, 101, 2, 2, 1377, 1378, 7, 103, 2, 2, 1378, 1379, 7, 47, 2, 2, 1379, 1380, 7, 112, 2, 2, 1380, 1381, 7, 113, 2, 2, 1381, 1382, 7, 102, 2, 2, 1382, 1383, 7, 103, 2, 2, 1383, 314, 3, 2, 2, 2, 1384, 1385, 7, 117, 2, 2, 1385, 1386, 7, 101, 2, 2, 1386, 1387, 7, 106, 2, 2, 1387, 1388, 7, 103, 2, 2, 1388, 1389, 7, 111, 2, 2, 1389, 1390, 7, 99, 2, 2, 1390, 1391, 7, 47, 2, 2, 1391, 1392, 7, 99, 2, 2, 1392, 1393, 7, 118, 2, 2, 1393, 1394, 7, 118, 2, 2, 1394, 1395, 7, 116, 2, 2, 1395, 1396, 7, 107, 2, 2, 1396, 1397, 7, 100, 2, 2, 1397, 1398, 7, 119, 2, 2, 1398, 1399, 7, 118, 2, 2, 1399, 1400, 7, 103, 2, 2, 1400, 316, 3, 2, 2, 2, 1401, 1402, 7, 117, 2, 2, 1402, 1403, 7, 101, 2, 2, 1403, 1404, 7, 106, 2, 2, 1404, 1405, 7, 103, 2, 2, 1405, 1406, 7, 111, 2, 2, 1406, 1407, 7, 99, 2, 2, 1407, 1408, 7, 47, 2, 2, 1408, 1409, 7, 103, 2, 2, 1409, 1410, 7, 110, 2, 2, 1410, 1411, 7, 103, 2, 2, 1411, 1412, 7, 111, 2, 2, 1412, 1413, 7, 103, 2, 2, 1413, 1414, 7, 112, 2, 2, 1414, 1415, 7, 118, 2, 2, 1415, 318, 3, 2, 2, 2, 1416, 1417, 7, 99, 2, 2, 1417, 1418, 7, 116, 2, 2, 1418, 1419, 7, 116, 2, 2, 1419, 1420, 7, 99, 2, 2, 1420, 1421, 7, 123, 2, 2, 1421, 1422, 7, 47, 2, 2, 1422, 1423, 7, 112, 2, 2, 1423, 1424, 7, 113, 2, 2, 1424, 1425, 7, 102, 2, 2, 1425, 1426, 7, 103, 2, 2, 1426, 320, 3, 2, 2, 2, 1427, 1428, 7, 100, 2, 2, 1428, 1429, 7, 113, 2, 2, 1429, 1430, 7, 113, 2, 2, 1430, 1431, 7, 110, 2, 2, 1431, 1432, 7, 103, 2, 2, 1432, 1433, 7, 99, 2, 2, 1433, 1434, 7, 112, 2, 2, 1434, 1435, 7, 47, 2, 2, 1435, 1436, 7, 112, 2, 2, 1436, 1437, 7, 113, 2, 2, 1437, 1438, 7, 102, 2, 2, 1438, 1439, 7, 103, 2, 2, 1439, 322, 3, 2, 2, 2, 1440, 1441, 7, 112, 2, 2, 1441, 1442, 7, 119, 2, 2, 1442, 1443, 7, 110, 2, 2, 1443, 1444, 7, 110, 2, 2, 1444, 1445, 7, 47, 2, 2, 1445, 1446, 7, 112, 2, 2, 1446, 1447, 7, 113, 2, 2, 1447, 1448, 7, 102, 2, 2, 1448, 1449, 7, 103, 2, 2, 1449, 324, 3, 2, 2, 2, 1450, 1451, 7, 112, 2, 2, 1451, 1452, 7, 119, 2, 2, 1452, 1453, 7, 111, 2, 2, 1453, 1454, 7, 100, 2, 2, 1454, 1455, 7, 103, 2, 2, 1455, 1456, 7, 116, 2, 2, 1456, 1457, 7, 47, 2, 2, 1457, 1458, 7, 112, 2, 2, 1458, 1459, 7, 113, 2, 2, 1459, 1460, 7, 102, 2, 2, 1460, 1461, 7, 103, 2, 2, 1461, 326, 3, 2, 2, 2, 1462, 1463, 7, 113, 2, 2, 1463, 1464, 7, 100, 2, 2, 1464, 1465, 7, 108, 2, 2, 1465, 1466, 7, 103, 2, 2, 1466, 1467, 7, 101, 2, 2, 1467, 1468, 7, 118, 2, 2, 1468, 1469, 7, 47, 2, 2, 1469, 1470, 7, 112, 2, 2, 1470, 1471, 7, 113, 2, 2, 1471, 1472, 7, 102, 2, 2, 1472, 1473, 7, 103, 2, 2, 1473, 328, 3, 2, 2, 2, 1474, 1475, 7, 101, 2, 2, 1475, 1476, 7, 113, 2, 2, 1476, 1477, 7, 111, 2, 2, 1477, 1478, 7, 111, 2, 2, 1478, 1479, 7, 103, 2, 2, 1479, 1480, 7, 112, 2, 2, 1480, 1481, 7, 118, 2, 2, 1481, 330, 3, 2, 2, 2, 1482, 1483, 7, 99, 2, 2, 1483, 1484, 7, 116, 2, 2, 1484, 1485, 7, 116, 2, 2, 1485, 1486, 7, 99, 2, 2, 1486, 1487, 7, 123, 2, 2, 1487, 332, 3, 2, 2, 2, 1488, 1489, 7, 111, 2, 2, 1489, 1490, 7, 99, 2, 2, 1490, 1491, 7, 114, 2, 2, 1491, 334, 3, 2, 2, 2, 1492, 1497, 7, 36, 2, 2, 1493, 1496, 5, 337, 169, 2, 1494, 1496, 10, 2, 2, 2, 1495, 1493, 3, 2, 2, 2, 1495, 1494, 3, 2, 2, 2, 1496, 1499, 3, 2, 2, 2, 1497, 1495, 3, 2, 2, 2, 1497, 1498, 3, 2, 2, 2, 1498, 1500, 3, 2, 2, 2, 1499, 1497, 3, 2, 2, 2, 1500, 1501, 7, 36, 2, 2, 1501, 336, 3, 2, 2, 2, 1502, 1505, 7, 94, 2, 2, 1503, 1506, 9, 3, 2, 2, 1504, 1506, 5, 339, 170, 2, 1505, 1503, 3, 2, 2, 2, 1505, 1504, 3, 2, 2, 2, 1506, 338, 3, 2, 2, 2, 1507, 1508, 7, 119, 2, 2, 1508, 1509, 5, 341, 171, 2, 1509, 1510, 5, 341, 171, 2, 1510, 1511, 5, 341, 171, 2, 1511, 1512, 5, 341, 171, 2, 1512, 340, 3, 2, 2, 2, 1513, 1514, 9, 4, 2, 2, 1514, 342, 3, 2, 2, 2, 1515, 1516, 7, 65, 2, 2, 1516, 344, 3, 2, 2, 2, 1517, 1518, 7, 112, 2, 2, 1518, 1519, 7, 119, 2, 2, 1519, 1520, 7, 110, 2, 2, 1520, 1521, 7, 110, 2, 2, 1521, 346, 3, 2, 2, 2, 1522, 1523, 5, 349, 175, 2, 1523, 348, 3, 2, 2, 2, 1524, 1528, 5, 351, 176, 2, 1525, 1528, 5, 353, 177, 2, 1526, 1528, 5, 355, 178, 2, 1527, 1524, 3, 2, 2, 2, 1527, 1525, 3, 2, 2, 2, 1527, 1526, 3, 2, 2, 2, 1528, 350, 3, 2, 2, 2, 1529, 1530, 5, 357, 179, 2, 1530, 352, 3, 2, 2, 2, 1531, 1532, 7, 48, 2, 2, 1532, 1542, 5, 357, 179, 2, 1533, 1534, 5, 357, 179, 2, 1534, 1538, 7, 48, 2, 2, 1535, 1537, 9, 5, 2, 2, 1536, 1535, 3, 2, 2, 2, 1537, 1540, 3, 2, 2, 2, 1538, 1536, 3, 2, 2, 2, 1538, 1539, 3, 2, 2, 2, 1539, 1542, 3, 2, 2, 2, 1540, 1538, 3, 2, 2, 2, 1541, 1531, 3, 2, 2, 2, 1541, 1533, 3, 2, 2, 2, 1542, 354, 3, 2, 2, 2, 1543, 1544, 7, 48, 2, 2, 1544, 1556, 5, 357, 179, 2, 1545, 1553, 5, 357, 179, 2, 1546, 1550, 7, 48, 2, 2, 1547, 1549, 9, 5, 2, 2, 1548, 1547, 3, 2, 2, 2, 1549, 1552, 3, 2, 2, 2, 1550, 1548, 3, 2, 2, 2, 1550, 1551, 3, 2, 2, 2, 1551, 1554, 3, 2, 2, 2, 1552, 1550, 3, 2, 2, 2, 1553, 1546, 3, 2, 2, 2, 1553, 1554, 3, 2, 2, 2, 1554, 1556, 3, 2, 2, 2, 1555, 1543, 3, 2, 2, 2, 1555, 1545, 3, 2, 2, 2, 1556, 1557, 3, 2, 2, 2, 1557, 1559, 9, 6, 2, 2, 1558, 1560, 9, 7, 2, 2, 1559, 1558, 3, 2, 2, 2, 1559, 1560, 3, 2, 2, 2, 1560, 1561, 3, 2, 2, 2, 1561, 1562, 5, 357, 179, 2, 1562, 356, 3, 2, 2, 2, 1563, 1565, 9, 5, 2, 2, 1564, 1563, 3, 2, 2, 2, 1565, 1566, 3, 2, 2, 2, 1566, 1564, 3, 2, 2, 2, 1566, 1567, 3, 2, 2, 2, 1567, 358, 3, 2, 2, 2, 1568, 1569, 9, 8, 2, 2, 1569, 1570, 3, 2, 2, 2, 1570, 1571, 8, 180, 2, 2, 1571, 360, 3, 2, 2, 2, 1572, 1576, 5, 363, 182, 2, 1573, 1575, 5, 365, 183, 2, 1574, 1573, 3, 2, 2, 2, 1575, 1578, 3, 2, 2, 2, 1576, 1574, 3, 2, 2, 2, 1576, 1577, 3, 2, 2, 2, 1577, 362, 3, 2, 2, 2, 1578, 1576, 3, 2, 2, 2, 1579, 1581, 9, 9, 2, 2, 1580, 1579, 3, 2, 2, 2, 1581, 364, 3, 2, 2, 2, 1582, 1585, 5, 363, 182, 2, 1583, 1585, 9, 10, 2, 2, 1584, 1582, 3, 2, 2, 2, 1584, 1583, 3, 2, 2, 2, 1585, 366, 3, 2, 2, 2, 1586, 1587, 7, 42, 2, 2, 1587, 1596, 7, 60, 2, 2, 1588, 1595, 5, 367, 184, 2, 1589, 1590, 7, 42, 2, 2, 1590, 1595, 10, 11, 2, 2, 1591, 1592, 7, 60, 2, 2, 1592, 1595, 10, 12, 2, 2, 1593, 1595, 10, 13, 2, 2, 1594, 1588, 3, 2, 2, 2, 1594, 1589, 3, 2, 2, 2, 1594, 1591, 3, 2, 2, 2, 1594, 1593, 3, 2, 2, 2, 1595, 1598, 3, 2, 2, 2, 1596, 1594, 3, 2, 2, 2, 1596, 1597, 3, 2, 2, 2, 1597, 1600, 3, 2, 2, 2, 1598, 1596, 3, 2, 2, 2, 1599, 1601, 7, 60, 2, 2, 1600, 1599, 3, 2, 2, 2, 1601, 1602, 3, 2, 2, 2, 1602, 1600, 3, 2, 2, 2, 1602, 1603, 3, 2, 2, 2, 1603, 1604, 3, 2, 2, 2, 1604, 1605, 7, 43, 2, 2, 1605, 1606, 3, 2, 2, 2, 1606, 1607, 8, 184, 2, 2, 1607, 368, 3, 2, 2, 2, 1608, 1609, 10, 14, 2, 2, 1609, 370, 3, 2, 2, 2, 20, 2, 1495, 1497, 1505, 1527, 1538, 1541, 1550, 1553, 1555, 1559, 1566, 1576, 1580, 1584, 1594, 1596, 1602, 3, 2, 3, 2] \ No newline at end of file diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.java b/src/main/java/org/rumbledb/parser/JsoniqLexer.java index 0c9ba8d75..562da73a5 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.java +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.java @@ -27,21 +27,28 @@ public class JsoniqLexer extends Lexer { T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38, T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45, T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52, - T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59, - T__59=60, Kfor=61, Klet=62, Kwhere=63, Kgroup=64, Kby=65, Korder=66, Kreturn=67, - Kif=68, Kin=69, Kas=70, Kat=71, Kallowing=72, Kempty=73, Kcount=74, Kstable=75, - Kascending=76, Kdescending=77, Ksome=78, Kevery=79, Ksatisfies=80, Kcollation=81, - Kgreatest=82, Kleast=83, Kswitch=84, Kcase=85, Ktry=86, Kcatch=87, Kdefault=88, - Kthen=89, Kelse=90, Ktypeswitch=91, Kor=92, Kand=93, Knot=94, Kto=95, - Kinstance=96, Kof=97, Kstatically=98, Kis=99, Ktreat=100, Kcast=101, Kcastable=102, - Kversion=103, Kjsoniq=104, Kunordered=105, Ktrue=106, Kfalse=107, Ktype=108, - Kvalidate=109, Kannotate=110, Kdeclare=111, Kcontext=112, Kitem=113, Kvariable=114, - Kinsert=115, Kdelete=116, Krename=117, Kreplace=118, Kcopy=119, Kmodify=120, - Kappend=121, Kinto=122, Kvalue=123, Kjson=124, Kwith=125, Kposition=126, - Kbreak=127, Kloop=128, Kcontinue=129, Kexit=130, Kreturning=131, Kwhile=132, - STRING=133, ArgumentPlaceholder=134, NullLiteral=135, Literal=136, NumericLiteral=137, - IntegerLiteral=138, DecimalLiteral=139, DoubleLiteral=140, WS=141, NCName=142, - XQComment=143, ContentChar=144; + T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, Kfor=59, Klet=60, + Kwhere=61, Kgroup=62, Kby=63, Korder=64, Kreturn=65, Kif=66, Kin=67, Kas=68, + Kat=69, Kallowing=70, Kempty=71, Kcount=72, Kstable=73, Kascending=74, + Kdescending=75, Ksome=76, Kevery=77, Ksatisfies=78, Kcollation=79, Kgreatest=80, + Kleast=81, Kswitch=82, Kcase=83, Ktry=84, Kcatch=85, Kdefault=86, Kthen=87, + Kelse=88, Ktypeswitch=89, Kor=90, Kand=91, Knot=92, Kto=93, Kinstance=94, + Kof=95, Kstatically=96, Kis=97, Ktreat=98, Kcast=99, Kcastable=100, Kversion=101, + Kjsoniq=102, Kunordered=103, Ktrue=104, Kfalse=105, Ktype=106, Kvalidate=107, + Kannotate=108, Kdeclare=109, Kcontext=110, Kitem=111, Kvariable=112, Kinsert=113, + Kdelete=114, Krename=115, Kreplace=116, Kcopy=117, Kmodify=118, Kappend=119, + Kinto=120, Kvalue=121, Kjson=122, Kwith=123, Kposition=124, Kbreak=125, + Kloop=126, Kcontinue=127, Kexit=128, Kreturning=129, Kwhile=130, Kimport=131, + Kschema=132, Knamespace=133, Kelement=134, Kslash=135, Kdslash=136, Kat_symbol=137, + Kchild=138, Kdescendant=139, Kattribute=140, Kself=141, Kdescendant_or_self=142, + Kfollowing_sibling=143, Kfollowing=144, Kparent=145, Kancestor=146, Kpreceding_sibling=147, + Kpreceding=148, Kancestor_or_self=149, Knode=150, Kbinary=151, Kdocument=152, + Kdocument_node=153, Ktext=154, Kpi=155, Knamespace_node=156, Kschema_attribute=157, + Kschema_element=158, Karray_node=159, Kboolean_node=160, Knull_node=161, + Knumber_node=162, Kobject_node=163, Kcomment=164, Karray=165, Kmap=166, + STRING=167, ArgumentPlaceholder=168, NullLiteral=169, Literal=170, NumericLiteral=171, + IntegerLiteral=172, DecimalLiteral=173, DoubleLiteral=174, WS=175, NCName=176, + XQComment=177, ContentChar=178; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -59,46 +66,59 @@ private static String[] makeRuleNames() { "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40", "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48", "T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56", - "T__57", "T__58", "T__59", "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", - "Korder", "Kreturn", "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", - "Kcount", "Kstable", "Kascending", "Kdescending", "Ksome", "Kevery", - "Ksatisfies", "Kcollation", "Kgreatest", "Kleast", "Kswitch", "Kcase", - "Ktry", "Kcatch", "Kdefault", "Kthen", "Kelse", "Ktypeswitch", "Kor", - "Kand", "Knot", "Kto", "Kinstance", "Kof", "Kstatically", "Kis", "Ktreat", - "Kcast", "Kcastable", "Kversion", "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", - "Ktype", "Kvalidate", "Kannotate", "Kdeclare", "Kcontext", "Kitem", "Kvariable", - "Kinsert", "Kdelete", "Krename", "Kreplace", "Kcopy", "Kmodify", "Kappend", - "Kinto", "Kvalue", "Kjson", "Kwith", "Kposition", "Kbreak", "Kloop", - "Kcontinue", "Kexit", "Kreturning", "Kwhile", "STRING", "ESC", "UNICODE", - "HEX", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral", - "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "Digits", "WS", - "NCName", "NameStartChar", "NameChar", "XQComment", "ContentChar" + "T__57", "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", + "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", + "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", + "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", + "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", + "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", + "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", + "Kdeclare", "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename", + "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson", + "Kwith", "Kposition", "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning", + "Kwhile", "Kimport", "Kschema", "Knamespace", "Kelement", "Kslash", "Kdslash", + "Kat_symbol", "Kchild", "Kdescendant", "Kattribute", "Kself", "Kdescendant_or_self", + "Kfollowing_sibling", "Kfollowing", "Kparent", "Kancestor", "Kpreceding_sibling", + "Kpreceding", "Kancestor_or_self", "Knode", "Kbinary", "Kdocument", "Kdocument_node", + "Ktext", "Kpi", "Knamespace_node", "Kschema_attribute", "Kschema_element", + "Karray_node", "Kboolean_node", "Knull_node", "Knumber_node", "Kobject_node", + "Kcomment", "Karray", "Kmap", "STRING", "ESC", "UNICODE", "HEX", "ArgumentPlaceholder", + "NullLiteral", "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", + "DoubleLiteral", "Digits", "WS", "NCName", "NameStartChar", "NameChar", + "XQComment", "ContentChar" }; } public static final String[] ruleNames = makeRuleNames(); private static String[] makeLiteralNames() { return new String[] { - null, "';'", "'module'", "'namespace'", "'='", "'$'", "':='", "'{'", - "'}'", "'('", "')'", "'*'", "'|'", "'%'", "','", "'ordering'", "'ordered'", - "'decimal-format'", "':'", "'decimal-separator'", "'grouping-separator'", - "'infinity'", "'minus-sign'", "'NaN'", "'percent'", "'per-mille'", "'zero-digit'", - "'digit'", "'pattern-separator'", "'import'", "'external'", "'function'", - "'jsound'", "'compact'", "'verbose'", "'schema'", "'eq'", "'ne'", "'lt'", - "'le'", "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'", "'>='", "'||'", - "'+'", "'-'", "'div'", "'idiv'", "'mod'", "'!'", "'['", "']'", "'.'", - "'$$'", "'#'", "'{|'", "'|}'", "'for'", "'let'", "'where'", "'group'", - "'by'", "'order'", "'return'", "'if'", "'in'", "'as'", "'at'", "'allowing'", - "'empty'", "'count'", "'stable'", "'ascending'", "'descending'", "'some'", - "'every'", "'satisfies'", "'collation'", "'greatest'", "'least'", "'switch'", - "'case'", "'try'", "'catch'", "'default'", "'then'", "'else'", "'typeswitch'", - "'or'", "'and'", "'not'", "'to'", "'instance'", "'of'", "'statically'", - "'is'", "'treat'", "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'", - "'true'", "'false'", "'type'", "'validate'", "'annotate'", "'declare'", - "'context'", "'item'", "'variable'", "'insert'", "'delete'", "'rename'", - "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'json'", - "'with'", "'position'", "'break'", "'loop'", "'continue'", "'exit'", - "'returning'", "'while'", null, "'?'", "'null'" + null, "';'", "'module'", "'='", "'$'", "':='", "'{'", "'}'", "'('", "')'", + "'*'", "'|'", "'%'", "','", "'ordering'", "'ordered'", "'decimal-format'", + "':'", "'decimal-separator'", "'grouping-separator'", "'infinity'", "'minus-sign'", + "'NaN'", "'percent'", "'per-mille'", "'zero-digit'", "'digit'", "'pattern-separator'", + "'external'", "'function'", "'jsound'", "'compact'", "'verbose'", "'eq'", + "'ne'", "'lt'", "'le'", "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'", + "'>='", "'||'", "'+'", "'-'", "'div'", "'idiv'", "'mod'", "'!'", "'['", + "']'", "'.'", "'$$'", "'#'", "'..'", "'{|'", "'|}'", "'for'", "'let'", + "'where'", "'group'", "'by'", "'order'", "'return'", "'if'", "'in'", + "'as'", "'at'", "'allowing'", "'empty'", "'count'", "'stable'", "'ascending'", + "'descending'", "'some'", "'every'", "'satisfies'", "'collation'", "'greatest'", + "'least'", "'switch'", "'case'", "'try'", "'catch'", "'default'", "'then'", + "'else'", "'typeswitch'", "'or'", "'and'", "'not'", "'to'", "'instance'", + "'of'", "'statically'", "'is'", "'treat'", "'cast'", "'castable'", "'version'", + "'jsoniq'", "'unordered'", "'true'", "'false'", "'type'", "'validate'", + "'annotate'", "'declare'", "'context'", "'item'", "'variable'", "'insert'", + "'delete'", "'rename'", "'replace'", "'copy'", "'modify'", "'append'", + "'into'", "'value'", "'json'", "'with'", "'position'", "'break'", "'loop'", + "'continue'", "'exit'", "'returning'", "'while'", "'import'", "'schema'", + "'namespace'", "'element'", "'/'", "'//'", "'@'", "'child'", "'descendant'", + "'attribute'", "'self'", "'descendant-or-self'", "'following-sibling'", + "'following'", "'parent'", "'ancestor'", "'preceding-sibling'", "'preceding'", + "'ancestor-or-self'", "'node'", "'binary'", "'document'", "'document-node'", + "'text'", "'processing-instruction'", "'namespace-node'", "'schema-attribute'", + "'schema-element'", "'array-node'", "'boolean-node'", "'null-node'", + "'number-node'", "'object-node'", "'comment'", "'array'", "'map'", null, + "'?'", "'null'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -108,19 +128,25 @@ private static String[] makeSymbolicNames() { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", - "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", - "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", - "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", - "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", - "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", - "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", - "Kdeclare", "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename", - "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson", - "Kwith", "Kposition", "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning", - "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral", "Literal", - "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", + null, null, null, null, null, null, null, null, null, null, null, "Kfor", + "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", "Kif", "Kin", + "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", "Kascending", + "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", "Kgreatest", + "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", "Kthen", + "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", "Kof", + "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", "Kjsoniq", + "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", "Kdeclare", + "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename", "Kreplace", + "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson", "Kwith", "Kposition", + "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning", "Kwhile", "Kimport", + "Kschema", "Knamespace", "Kelement", "Kslash", "Kdslash", "Kat_symbol", + "Kchild", "Kdescendant", "Kattribute", "Kself", "Kdescendant_or_self", + "Kfollowing_sibling", "Kfollowing", "Kparent", "Kancestor", "Kpreceding_sibling", + "Kpreceding", "Kancestor_or_self", "Knode", "Kbinary", "Kdocument", "Kdocument_node", + "Ktext", "Kpi", "Knamespace_node", "Kschema_attribute", "Kschema_element", + "Karray_node", "Kboolean_node", "Knull_node", "Knumber_node", "Kobject_node", + "Kcomment", "Karray", "Kmap", "STRING", "ArgumentPlaceholder", "NullLiteral", + "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "WS", "NCName", "XQComment", "ContentChar" }; } @@ -183,7 +209,7 @@ public JsoniqLexer(CharStream input) { public ATN getATN() { return _ATN; } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u0092\u04ae\b\1\4"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00b4\u064a\b\1\4"+ "\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n"+ "\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+ "\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+ @@ -202,401 +228,564 @@ public JsoniqLexer(CharStream input) { "\t\u0089\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d"+ "\4\u008e\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092"+ "\t\u0092\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096"+ - "\4\u0097\t\u0097\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3"+ - "\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\7\3\b\3\b\3\t\3\t\3\n"+ - "\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\17\3\17\3\20\3\20\3\20\3\20"+ - "\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22"+ - "\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+ - "\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ - "\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+ - "\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26"+ - "\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27"+ - "\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31"+ - "\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33"+ - "\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34"+ - "\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+ - "\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37"+ - "\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!"+ - "\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3$\3"+ - "$\3$\3$\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3)\3*\3"+ - "*\3*\3+\3+\3+\3,\3,\3-\3-\3-\3.\3.\3/\3/\3/\3\60\3\60\3\60\3\61\3\61\3"+ - "\62\3\62\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3"+ - "\65\3\66\3\66\3\67\3\67\38\38\39\39\3:\3:\3:\3;\3;\3<\3<\3<\3=\3=\3=\3"+ - ">\3>\3>\3>\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3B\3B\3B\3"+ - "C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3H\3"+ - "H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3"+ - "L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3"+ - "N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3"+ - "Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\3T\3"+ - "T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3X\3X\3"+ - "X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3\\\3"+ - "\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_\3"+ - "_\3`\3`\3`\3a\3a\3a\3a\3a\3a\3a\3a\3a\3b\3b\3b\3c\3c\3c\3c\3c\3c\3c\3"+ - "c\3c\3c\3c\3d\3d\3d\3e\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3"+ - "g\3g\3g\3g\3h\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i\3i\3i\3j\3j\3j\3j\3"+ - "j\3j\3j\3j\3j\3j\3k\3k\3k\3k\3k\3l\3l\3l\3l\3l\3l\3m\3m\3m\3m\3m\3n\3"+ - "n\3n\3n\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3o\3o\3o\3p\3p\3p\3p\3p\3p\3"+ - "p\3p\3q\3q\3q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3s\3s\3s\3s\3s\3s\3s\3s\3"+ - "s\3t\3t\3t\3t\3t\3t\3t\3u\3u\3u\3u\3u\3u\3u\3v\3v\3v\3v\3v\3v\3v\3w\3"+ - "w\3w\3w\3w\3w\3w\3w\3x\3x\3x\3x\3x\3y\3y\3y\3y\3y\3y\3y\3z\3z\3z\3z\3"+ - "z\3z\3z\3{\3{\3{\3{\3{\3|\3|\3|\3|\3|\3|\3}\3}\3}\3}\3}\3~\3~\3~\3~\3"+ - "~\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\u0080\3\u0080"+ - "\3\u0080\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081"+ - "\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082"+ - "\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0084\3\u0084"+ - "\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085"+ - "\3\u0085\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\7\u0086\u043c\n\u0086"+ - "\f\u0086\16\u0086\u043f\13\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087"+ - "\5\u0087\u0446\n\u0087\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088"+ - "\3\u0089\3\u0089\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b"+ - "\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\5\u008d\u045c\n\u008d\3\u008e"+ - "\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\7\u008f\u0465\n\u008f"+ - "\f\u008f\16\u008f\u0468\13\u008f\5\u008f\u046a\n\u008f\3\u0090\3\u0090"+ - "\3\u0090\3\u0090\3\u0090\7\u0090\u0471\n\u0090\f\u0090\16\u0090\u0474"+ - "\13\u0090\5\u0090\u0476\n\u0090\5\u0090\u0478\n\u0090\3\u0090\3\u0090"+ - "\5\u0090\u047c\n\u0090\3\u0090\3\u0090\3\u0091\6\u0091\u0481\n\u0091\r"+ - "\u0091\16\u0091\u0482\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093"+ - "\7\u0093\u048b\n\u0093\f\u0093\16\u0093\u048e\13\u0093\3\u0094\5\u0094"+ - "\u0491\n\u0094\3\u0095\3\u0095\5\u0095\u0495\n\u0095\3\u0096\3\u0096\3"+ - "\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\7\u0096\u049f\n\u0096\f"+ - "\u0096\16\u0096\u04a2\13\u0096\3\u0096\6\u0096\u04a5\n\u0096\r\u0096\16"+ - "\u0096\u04a6\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\2\2\u0098"+ - "\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20"+ - "\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37"+ - "= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o"+ - "9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH"+ - "\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1"+ - "R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5"+ - "\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9"+ - "f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00dd"+ - "p\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00ebw\u00edx\u00efy\u00f1"+ - "z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb\177\u00fd\u0080\u00ff\u0081\u0101"+ - "\u0082\u0103\u0083\u0105\u0084\u0107\u0085\u0109\u0086\u010b\u0087\u010d"+ - "\2\u010f\2\u0111\2\u0113\u0088\u0115\u0089\u0117\u008a\u0119\u008b\u011b"+ - "\u008c\u011d\u008d\u011f\u008e\u0121\2\u0123\u008f\u0125\u0090\u0127\2"+ - "\u0129\2\u012b\u0091\u012d\u0092\3\2\17\4\2$$^^\n\2$$\61\61^^ddhhpptt"+ - "vv\5\2\62;CHch\3\2\62;\4\2GGgg\4\2--//\5\2\13\f\17\17\"\"\20\2C\\aac|"+ - "\u00c2\u00d8\u00da\u00f8\u00fa\u0301\u0372\u037f\u0381\u2001\u200e\u200f"+ - "\u2072\u2191\u2c02\u2ff1\u3003\ud801\uf902\ufdd1\ufdf2\uffff\7\2//\62"+ - ";\u00b9\u00b9\u0302\u0371\u2041\u2042\3\2<<\3\2++\4\2**<<\7\2$$()>>}}"+ - "\177\177\2\u04ba\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13"+ - "\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2"+ - "\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2"+ - "!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3"+ - "\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2"+ - "\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E"+ - "\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2"+ - "\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2"+ - "\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k"+ - "\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2"+ - "\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2"+ - "\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b"+ - "\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2"+ - "\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d"+ - "\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2"+ - "\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af"+ - "\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2"+ - "\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1"+ - "\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2"+ - "\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3"+ - "\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2"+ - "\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5"+ - "\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2"+ - "\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7"+ - "\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff\3\2\2"+ - "\2\2\u0101\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\2\u0109"+ - "\3\2\2\2\2\u010b\3\2\2\2\2\u0113\3\2\2\2\2\u0115\3\2\2\2\2\u0117\3\2\2"+ - "\2\2\u0119\3\2\2\2\2\u011b\3\2\2\2\2\u011d\3\2\2\2\2\u011f\3\2\2\2\2\u0123"+ - "\3\2\2\2\2\u0125\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2\2\3\u012f\3\2\2"+ - "\2\5\u0131\3\2\2\2\7\u0138\3\2\2\2\t\u0142\3\2\2\2\13\u0144\3\2\2\2\r"+ - "\u0146\3\2\2\2\17\u0149\3\2\2\2\21\u014b\3\2\2\2\23\u014d\3\2\2\2\25\u014f"+ - "\3\2\2\2\27\u0151\3\2\2\2\31\u0153\3\2\2\2\33\u0155\3\2\2\2\35\u0157\3"+ - "\2\2\2\37\u0159\3\2\2\2!\u0162\3\2\2\2#\u016a\3\2\2\2%\u0179\3\2\2\2\'"+ - "\u017b\3\2\2\2)\u018d\3\2\2\2+\u01a0\3\2\2\2-\u01a9\3\2\2\2/\u01b4\3\2"+ - "\2\2\61\u01b8\3\2\2\2\63\u01c0\3\2\2\2\65\u01ca\3\2\2\2\67\u01d5\3\2\2"+ - "\29\u01db\3\2\2\2;\u01ed\3\2\2\2=\u01f4\3\2\2\2?\u01fd\3\2\2\2A\u0206"+ - "\3\2\2\2C\u020d\3\2\2\2E\u0215\3\2\2\2G\u021d\3\2\2\2I\u0224\3\2\2\2K"+ - "\u0227\3\2\2\2M\u022a\3\2\2\2O\u022d\3\2\2\2Q\u0230\3\2\2\2S\u0233\3\2"+ - "\2\2U\u0236\3\2\2\2W\u0239\3\2\2\2Y\u023b\3\2\2\2[\u023e\3\2\2\2]\u0240"+ - "\3\2\2\2_\u0243\3\2\2\2a\u0246\3\2\2\2c\u0248\3\2\2\2e\u024a\3\2\2\2g"+ - "\u024e\3\2\2\2i\u0253\3\2\2\2k\u0257\3\2\2\2m\u0259\3\2\2\2o\u025b\3\2"+ - "\2\2q\u025d\3\2\2\2s\u025f\3\2\2\2u\u0262\3\2\2\2w\u0264\3\2\2\2y\u0267"+ - "\3\2\2\2{\u026a\3\2\2\2}\u026e\3\2\2\2\177\u0272\3\2\2\2\u0081\u0278\3"+ - "\2\2\2\u0083\u027e\3\2\2\2\u0085\u0281\3\2\2\2\u0087\u0287\3\2\2\2\u0089"+ - "\u028e\3\2\2\2\u008b\u0291\3\2\2\2\u008d\u0294\3\2\2\2\u008f\u0297\3\2"+ - "\2\2\u0091\u029a\3\2\2\2\u0093\u02a3\3\2\2\2\u0095\u02a9\3\2\2\2\u0097"+ - "\u02af\3\2\2\2\u0099\u02b6\3\2\2\2\u009b\u02c0\3\2\2\2\u009d\u02cb\3\2"+ - "\2\2\u009f\u02d0\3\2\2\2\u00a1\u02d6\3\2\2\2\u00a3\u02e0\3\2\2\2\u00a5"+ - "\u02ea\3\2\2\2\u00a7\u02f3\3\2\2\2\u00a9\u02f9\3\2\2\2\u00ab\u0300\3\2"+ - "\2\2\u00ad\u0305\3\2\2\2\u00af\u0309\3\2\2\2\u00b1\u030f\3\2\2\2\u00b3"+ - "\u0317\3\2\2\2\u00b5\u031c\3\2\2\2\u00b7\u0321\3\2\2\2\u00b9\u032c\3\2"+ - "\2\2\u00bb\u032f\3\2\2\2\u00bd\u0333\3\2\2\2\u00bf\u0337\3\2\2\2\u00c1"+ - "\u033a\3\2\2\2\u00c3\u0343\3\2\2\2\u00c5\u0346\3\2\2\2\u00c7\u0351\3\2"+ - "\2\2\u00c9\u0354\3\2\2\2\u00cb\u035a\3\2\2\2\u00cd\u035f\3\2\2\2\u00cf"+ - "\u0368\3\2\2\2\u00d1\u0370\3\2\2\2\u00d3\u0377\3\2\2\2\u00d5\u0381\3\2"+ - "\2\2\u00d7\u0386\3\2\2\2\u00d9\u038c\3\2\2\2\u00db\u0391\3\2\2\2\u00dd"+ - "\u039a\3\2\2\2\u00df\u03a3\3\2\2\2\u00e1\u03ab\3\2\2\2\u00e3\u03b3\3\2"+ - "\2\2\u00e5\u03b8\3\2\2\2\u00e7\u03c1\3\2\2\2\u00e9\u03c8\3\2\2\2\u00eb"+ - "\u03cf\3\2\2\2\u00ed\u03d6\3\2\2\2\u00ef\u03de\3\2\2\2\u00f1\u03e3\3\2"+ - "\2\2\u00f3\u03ea\3\2\2\2\u00f5\u03f1\3\2\2\2\u00f7\u03f6\3\2\2\2\u00f9"+ - "\u03fc\3\2\2\2\u00fb\u0401\3\2\2\2\u00fd\u0406\3\2\2\2\u00ff\u040f\3\2"+ - "\2\2\u0101\u0415\3\2\2\2\u0103\u041a\3\2\2\2\u0105\u0423\3\2\2\2\u0107"+ - "\u0428\3\2\2\2\u0109\u0432\3\2\2\2\u010b\u0438\3\2\2\2\u010d\u0442\3\2"+ - "\2\2\u010f\u0447\3\2\2\2\u0111\u044d\3\2\2\2\u0113\u044f\3\2\2\2\u0115"+ - "\u0451\3\2\2\2\u0117\u0456\3\2\2\2\u0119\u045b\3\2\2\2\u011b\u045d\3\2"+ - "\2\2\u011d\u0469\3\2\2\2\u011f\u0477\3\2\2\2\u0121\u0480\3\2\2\2\u0123"+ - "\u0484\3\2\2\2\u0125\u0488\3\2\2\2\u0127\u0490\3\2\2\2\u0129\u0494\3\2"+ - "\2\2\u012b\u0496\3\2\2\2\u012d\u04ac\3\2\2\2\u012f\u0130\7=\2\2\u0130"+ - "\4\3\2\2\2\u0131\u0132\7o\2\2\u0132\u0133\7q\2\2\u0133\u0134\7f\2\2\u0134"+ - "\u0135\7w\2\2\u0135\u0136\7n\2\2\u0136\u0137\7g\2\2\u0137\6\3\2\2\2\u0138"+ - "\u0139\7p\2\2\u0139\u013a\7c\2\2\u013a\u013b\7o\2\2\u013b\u013c\7g\2\2"+ - "\u013c\u013d\7u\2\2\u013d\u013e\7r\2\2\u013e\u013f\7c\2\2\u013f\u0140"+ - "\7e\2\2\u0140\u0141\7g\2\2\u0141\b\3\2\2\2\u0142\u0143\7?\2\2\u0143\n"+ - "\3\2\2\2\u0144\u0145\7&\2\2\u0145\f\3\2\2\2\u0146\u0147\7<\2\2\u0147\u0148"+ - "\7?\2\2\u0148\16\3\2\2\2\u0149\u014a\7}\2\2\u014a\20\3\2\2\2\u014b\u014c"+ - "\7\177\2\2\u014c\22\3\2\2\2\u014d\u014e\7*\2\2\u014e\24\3\2\2\2\u014f"+ - "\u0150\7+\2\2\u0150\26\3\2\2\2\u0151\u0152\7,\2\2\u0152\30\3\2\2\2\u0153"+ - "\u0154\7~\2\2\u0154\32\3\2\2\2\u0155\u0156\7\'\2\2\u0156\34\3\2\2\2\u0157"+ - "\u0158\7.\2\2\u0158\36\3\2\2\2\u0159\u015a\7q\2\2\u015a\u015b\7t\2\2\u015b"+ - "\u015c\7f\2\2\u015c\u015d\7g\2\2\u015d\u015e\7t\2\2\u015e\u015f\7k\2\2"+ - "\u015f\u0160\7p\2\2\u0160\u0161\7i\2\2\u0161 \3\2\2\2\u0162\u0163\7q\2"+ - "\2\u0163\u0164\7t\2\2\u0164\u0165\7f\2\2\u0165\u0166\7g\2\2\u0166\u0167"+ - "\7t\2\2\u0167\u0168\7g\2\2\u0168\u0169\7f\2\2\u0169\"\3\2\2\2\u016a\u016b"+ - "\7f\2\2\u016b\u016c\7g\2\2\u016c\u016d\7e\2\2\u016d\u016e\7k\2\2\u016e"+ - "\u016f\7o\2\2\u016f\u0170\7c\2\2\u0170\u0171\7n\2\2\u0171\u0172\7/\2\2"+ - "\u0172\u0173\7h\2\2\u0173\u0174\7q\2\2\u0174\u0175\7t\2\2\u0175\u0176"+ - "\7o\2\2\u0176\u0177\7c\2\2\u0177\u0178\7v\2\2\u0178$\3\2\2\2\u0179\u017a"+ - "\7<\2\2\u017a&\3\2\2\2\u017b\u017c\7f\2\2\u017c\u017d\7g\2\2\u017d\u017e"+ - "\7e\2\2\u017e\u017f\7k\2\2\u017f\u0180\7o\2\2\u0180\u0181\7c\2\2\u0181"+ - "\u0182\7n\2\2\u0182\u0183\7/\2\2\u0183\u0184\7u\2\2\u0184\u0185\7g\2\2"+ - "\u0185\u0186\7r\2\2\u0186\u0187\7c\2\2\u0187\u0188\7t\2\2\u0188\u0189"+ - "\7c\2\2\u0189\u018a\7v\2\2\u018a\u018b\7q\2\2\u018b\u018c\7t\2\2\u018c"+ - "(\3\2\2\2\u018d\u018e\7i\2\2\u018e\u018f\7t\2\2\u018f\u0190\7q\2\2\u0190"+ - "\u0191\7w\2\2\u0191\u0192\7r\2\2\u0192\u0193\7k\2\2\u0193\u0194\7p\2\2"+ - "\u0194\u0195\7i\2\2\u0195\u0196\7/\2\2\u0196\u0197\7u\2\2\u0197\u0198"+ - "\7g\2\2\u0198\u0199\7r\2\2\u0199\u019a\7c\2\2\u019a\u019b\7t\2\2\u019b"+ - "\u019c\7c\2\2\u019c\u019d\7v\2\2\u019d\u019e\7q\2\2\u019e\u019f\7t\2\2"+ - "\u019f*\3\2\2\2\u01a0\u01a1\7k\2\2\u01a1\u01a2\7p\2\2\u01a2\u01a3\7h\2"+ - "\2\u01a3\u01a4\7k\2\2\u01a4\u01a5\7p\2\2\u01a5\u01a6\7k\2\2\u01a6\u01a7"+ - "\7v\2\2\u01a7\u01a8\7{\2\2\u01a8,\3\2\2\2\u01a9\u01aa\7o\2\2\u01aa\u01ab"+ - "\7k\2\2\u01ab\u01ac\7p\2\2\u01ac\u01ad\7w\2\2\u01ad\u01ae\7u\2\2\u01ae"+ - "\u01af\7/\2\2\u01af\u01b0\7u\2\2\u01b0\u01b1\7k\2\2\u01b1\u01b2\7i\2\2"+ - "\u01b2\u01b3\7p\2\2\u01b3.\3\2\2\2\u01b4\u01b5\7P\2\2\u01b5\u01b6\7c\2"+ - "\2\u01b6\u01b7\7P\2\2\u01b7\60\3\2\2\2\u01b8\u01b9\7r\2\2\u01b9\u01ba"+ - "\7g\2\2\u01ba\u01bb\7t\2\2\u01bb\u01bc\7e\2\2\u01bc\u01bd\7g\2\2\u01bd"+ - "\u01be\7p\2\2\u01be\u01bf\7v\2\2\u01bf\62\3\2\2\2\u01c0\u01c1\7r\2\2\u01c1"+ - "\u01c2\7g\2\2\u01c2\u01c3\7t\2\2\u01c3\u01c4\7/\2\2\u01c4\u01c5\7o\2\2"+ - "\u01c5\u01c6\7k\2\2\u01c6\u01c7\7n\2\2\u01c7\u01c8\7n\2\2\u01c8\u01c9"+ - "\7g\2\2\u01c9\64\3\2\2\2\u01ca\u01cb\7|\2\2\u01cb\u01cc\7g\2\2\u01cc\u01cd"+ - "\7t\2\2\u01cd\u01ce\7q\2\2\u01ce\u01cf\7/\2\2\u01cf\u01d0\7f\2\2\u01d0"+ - "\u01d1\7k\2\2\u01d1\u01d2\7i\2\2\u01d2\u01d3\7k\2\2\u01d3\u01d4\7v\2\2"+ - "\u01d4\66\3\2\2\2\u01d5\u01d6\7f\2\2\u01d6\u01d7\7k\2\2\u01d7\u01d8\7"+ - "i\2\2\u01d8\u01d9\7k\2\2\u01d9\u01da\7v\2\2\u01da8\3\2\2\2\u01db\u01dc"+ - "\7r\2\2\u01dc\u01dd\7c\2\2\u01dd\u01de\7v\2\2\u01de\u01df\7v\2\2\u01df"+ - "\u01e0\7g\2\2\u01e0\u01e1\7t\2\2\u01e1\u01e2\7p\2\2\u01e2\u01e3\7/\2\2"+ - "\u01e3\u01e4\7u\2\2\u01e4\u01e5\7g\2\2\u01e5\u01e6\7r\2\2\u01e6\u01e7"+ - "\7c\2\2\u01e7\u01e8\7t\2\2\u01e8\u01e9\7c\2\2\u01e9\u01ea\7v\2\2\u01ea"+ - "\u01eb\7q\2\2\u01eb\u01ec\7t\2\2\u01ec:\3\2\2\2\u01ed\u01ee\7k\2\2\u01ee"+ - "\u01ef\7o\2\2\u01ef\u01f0\7r\2\2\u01f0\u01f1\7q\2\2\u01f1\u01f2\7t\2\2"+ - "\u01f2\u01f3\7v\2\2\u01f3<\3\2\2\2\u01f4\u01f5\7g\2\2\u01f5\u01f6\7z\2"+ - "\2\u01f6\u01f7\7v\2\2\u01f7\u01f8\7g\2\2\u01f8\u01f9\7t\2\2\u01f9\u01fa"+ - "\7p\2\2\u01fa\u01fb\7c\2\2\u01fb\u01fc\7n\2\2\u01fc>\3\2\2\2\u01fd\u01fe"+ - "\7h\2\2\u01fe\u01ff\7w\2\2\u01ff\u0200\7p\2\2\u0200\u0201\7e\2\2\u0201"+ - "\u0202\7v\2\2\u0202\u0203\7k\2\2\u0203\u0204\7q\2\2\u0204\u0205\7p\2\2"+ - "\u0205@\3\2\2\2\u0206\u0207\7l\2\2\u0207\u0208\7u\2\2\u0208\u0209\7q\2"+ - "\2\u0209\u020a\7w\2\2\u020a\u020b\7p\2\2\u020b\u020c\7f\2\2\u020cB\3\2"+ - "\2\2\u020d\u020e\7e\2\2\u020e\u020f\7q\2\2\u020f\u0210\7o\2\2\u0210\u0211"+ - "\7r\2\2\u0211\u0212\7c\2\2\u0212\u0213\7e\2\2\u0213\u0214\7v\2\2\u0214"+ - "D\3\2\2\2\u0215\u0216\7x\2\2\u0216\u0217\7g\2\2\u0217\u0218\7t\2\2\u0218"+ - "\u0219\7d\2\2\u0219\u021a\7q\2\2\u021a\u021b\7u\2\2\u021b\u021c\7g\2\2"+ - "\u021cF\3\2\2\2\u021d\u021e\7u\2\2\u021e\u021f\7e\2\2\u021f\u0220\7j\2"+ - "\2\u0220\u0221\7g\2\2\u0221\u0222\7o\2\2\u0222\u0223\7c\2\2\u0223H\3\2"+ - "\2\2\u0224\u0225\7g\2\2\u0225\u0226\7s\2\2\u0226J\3\2\2\2\u0227\u0228"+ - "\7p\2\2\u0228\u0229\7g\2\2\u0229L\3\2\2\2\u022a\u022b\7n\2\2\u022b\u022c"+ - "\7v\2\2\u022cN\3\2\2\2\u022d\u022e\7n\2\2\u022e\u022f\7g\2\2\u022fP\3"+ - "\2\2\2\u0230\u0231\7i\2\2\u0231\u0232\7v\2\2\u0232R\3\2\2\2\u0233\u0234"+ - "\7i\2\2\u0234\u0235\7g\2\2\u0235T\3\2\2\2\u0236\u0237\7#\2\2\u0237\u0238"+ - "\7?\2\2\u0238V\3\2\2\2\u0239\u023a\7>\2\2\u023aX\3\2\2\2\u023b\u023c\7"+ - ">\2\2\u023c\u023d\7?\2\2\u023dZ\3\2\2\2\u023e\u023f\7@\2\2\u023f\\\3\2"+ - "\2\2\u0240\u0241\7@\2\2\u0241\u0242\7?\2\2\u0242^\3\2\2\2\u0243\u0244"+ - "\7~\2\2\u0244\u0245\7~\2\2\u0245`\3\2\2\2\u0246\u0247\7-\2\2\u0247b\3"+ - "\2\2\2\u0248\u0249\7/\2\2\u0249d\3\2\2\2\u024a\u024b\7f\2\2\u024b\u024c"+ - "\7k\2\2\u024c\u024d\7x\2\2\u024df\3\2\2\2\u024e\u024f\7k\2\2\u024f\u0250"+ - "\7f\2\2\u0250\u0251\7k\2\2\u0251\u0252\7x\2\2\u0252h\3\2\2\2\u0253\u0254"+ - "\7o\2\2\u0254\u0255\7q\2\2\u0255\u0256\7f\2\2\u0256j\3\2\2\2\u0257\u0258"+ - "\7#\2\2\u0258l\3\2\2\2\u0259\u025a\7]\2\2\u025an\3\2\2\2\u025b\u025c\7"+ - "_\2\2\u025cp\3\2\2\2\u025d\u025e\7\60\2\2\u025er\3\2\2\2\u025f\u0260\7"+ - "&\2\2\u0260\u0261\7&\2\2\u0261t\3\2\2\2\u0262\u0263\7%\2\2\u0263v\3\2"+ - "\2\2\u0264\u0265\7}\2\2\u0265\u0266\7~\2\2\u0266x\3\2\2\2\u0267\u0268"+ - "\7~\2\2\u0268\u0269\7\177\2\2\u0269z\3\2\2\2\u026a\u026b\7h\2\2\u026b"+ - "\u026c\7q\2\2\u026c\u026d\7t\2\2\u026d|\3\2\2\2\u026e\u026f\7n\2\2\u026f"+ - "\u0270\7g\2\2\u0270\u0271\7v\2\2\u0271~\3\2\2\2\u0272\u0273\7y\2\2\u0273"+ - "\u0274\7j\2\2\u0274\u0275\7g\2\2\u0275\u0276\7t\2\2\u0276\u0277\7g\2\2"+ - "\u0277\u0080\3\2\2\2\u0278\u0279\7i\2\2\u0279\u027a\7t\2\2\u027a\u027b"+ - "\7q\2\2\u027b\u027c\7w\2\2\u027c\u027d\7r\2\2\u027d\u0082\3\2\2\2\u027e"+ - "\u027f\7d\2\2\u027f\u0280\7{\2\2\u0280\u0084\3\2\2\2\u0281\u0282\7q\2"+ - "\2\u0282\u0283\7t\2\2\u0283\u0284\7f\2\2\u0284\u0285\7g\2\2\u0285\u0286"+ - "\7t\2\2\u0286\u0086\3\2\2\2\u0287\u0288\7t\2\2\u0288\u0289\7g\2\2\u0289"+ - "\u028a\7v\2\2\u028a\u028b\7w\2\2\u028b\u028c\7t\2\2\u028c\u028d\7p\2\2"+ - "\u028d\u0088\3\2\2\2\u028e\u028f\7k\2\2\u028f\u0290\7h\2\2\u0290\u008a"+ - "\3\2\2\2\u0291\u0292\7k\2\2\u0292\u0293\7p\2\2\u0293\u008c\3\2\2\2\u0294"+ - "\u0295\7c\2\2\u0295\u0296\7u\2\2\u0296\u008e\3\2\2\2\u0297\u0298\7c\2"+ - "\2\u0298\u0299\7v\2\2\u0299\u0090\3\2\2\2\u029a\u029b\7c\2\2\u029b\u029c"+ - "\7n\2\2\u029c\u029d\7n\2\2\u029d\u029e\7q\2\2\u029e\u029f\7y\2\2\u029f"+ - "\u02a0\7k\2\2\u02a0\u02a1\7p\2\2\u02a1\u02a2\7i\2\2\u02a2\u0092\3\2\2"+ - "\2\u02a3\u02a4\7g\2\2\u02a4\u02a5\7o\2\2\u02a5\u02a6\7r\2\2\u02a6\u02a7"+ - "\7v\2\2\u02a7\u02a8\7{\2\2\u02a8\u0094\3\2\2\2\u02a9\u02aa\7e\2\2\u02aa"+ - "\u02ab\7q\2\2\u02ab\u02ac\7w\2\2\u02ac\u02ad\7p\2\2\u02ad\u02ae\7v\2\2"+ - "\u02ae\u0096\3\2\2\2\u02af\u02b0\7u\2\2\u02b0\u02b1\7v\2\2\u02b1\u02b2"+ - "\7c\2\2\u02b2\u02b3\7d\2\2\u02b3\u02b4\7n\2\2\u02b4\u02b5\7g\2\2\u02b5"+ - "\u0098\3\2\2\2\u02b6\u02b7\7c\2\2\u02b7\u02b8\7u\2\2\u02b8\u02b9\7e\2"+ - "\2\u02b9\u02ba\7g\2\2\u02ba\u02bb\7p\2\2\u02bb\u02bc\7f\2\2\u02bc\u02bd"+ - "\7k\2\2\u02bd\u02be\7p\2\2\u02be\u02bf\7i\2\2\u02bf\u009a\3\2\2\2\u02c0"+ - "\u02c1\7f\2\2\u02c1\u02c2\7g\2\2\u02c2\u02c3\7u\2\2\u02c3\u02c4\7e\2\2"+ - "\u02c4\u02c5\7g\2\2\u02c5\u02c6\7p\2\2\u02c6\u02c7\7f\2\2\u02c7\u02c8"+ - "\7k\2\2\u02c8\u02c9\7p\2\2\u02c9\u02ca\7i\2\2\u02ca\u009c\3\2\2\2\u02cb"+ - "\u02cc\7u\2\2\u02cc\u02cd\7q\2\2\u02cd\u02ce\7o\2\2\u02ce\u02cf\7g\2\2"+ - "\u02cf\u009e\3\2\2\2\u02d0\u02d1\7g\2\2\u02d1\u02d2\7x\2\2\u02d2\u02d3"+ - "\7g\2\2\u02d3\u02d4\7t\2\2\u02d4\u02d5\7{\2\2\u02d5\u00a0\3\2\2\2\u02d6"+ - "\u02d7\7u\2\2\u02d7\u02d8\7c\2\2\u02d8\u02d9\7v\2\2\u02d9\u02da\7k\2\2"+ - "\u02da\u02db\7u\2\2\u02db\u02dc\7h\2\2\u02dc\u02dd\7k\2\2\u02dd\u02de"+ - "\7g\2\2\u02de\u02df\7u\2\2\u02df\u00a2\3\2\2\2\u02e0\u02e1\7e\2\2\u02e1"+ - "\u02e2\7q\2\2\u02e2\u02e3\7n\2\2\u02e3\u02e4\7n\2\2\u02e4\u02e5\7c\2\2"+ - "\u02e5\u02e6\7v\2\2\u02e6\u02e7\7k\2\2\u02e7\u02e8\7q\2\2\u02e8\u02e9"+ - "\7p\2\2\u02e9\u00a4\3\2\2\2\u02ea\u02eb\7i\2\2\u02eb\u02ec\7t\2\2\u02ec"+ - "\u02ed\7g\2\2\u02ed\u02ee\7c\2\2\u02ee\u02ef\7v\2\2\u02ef\u02f0\7g\2\2"+ - "\u02f0\u02f1\7u\2\2\u02f1\u02f2\7v\2\2\u02f2\u00a6\3\2\2\2\u02f3\u02f4"+ - "\7n\2\2\u02f4\u02f5\7g\2\2\u02f5\u02f6\7c\2\2\u02f6\u02f7\7u\2\2\u02f7"+ - "\u02f8\7v\2\2\u02f8\u00a8\3\2\2\2\u02f9\u02fa\7u\2\2\u02fa\u02fb\7y\2"+ - "\2\u02fb\u02fc\7k\2\2\u02fc\u02fd\7v\2\2\u02fd\u02fe\7e\2\2\u02fe\u02ff"+ - "\7j\2\2\u02ff\u00aa\3\2\2\2\u0300\u0301\7e\2\2\u0301\u0302\7c\2\2\u0302"+ - "\u0303\7u\2\2\u0303\u0304\7g\2\2\u0304\u00ac\3\2\2\2\u0305\u0306\7v\2"+ - "\2\u0306\u0307\7t\2\2\u0307\u0308\7{\2\2\u0308\u00ae\3\2\2\2\u0309\u030a"+ - "\7e\2\2\u030a\u030b\7c\2\2\u030b\u030c\7v\2\2\u030c\u030d\7e\2\2\u030d"+ - "\u030e\7j\2\2\u030e\u00b0\3\2\2\2\u030f\u0310\7f\2\2\u0310\u0311\7g\2"+ - "\2\u0311\u0312\7h\2\2\u0312\u0313\7c\2\2\u0313\u0314\7w\2\2\u0314\u0315"+ - "\7n\2\2\u0315\u0316\7v\2\2\u0316\u00b2\3\2\2\2\u0317\u0318\7v\2\2\u0318"+ - "\u0319\7j\2\2\u0319\u031a\7g\2\2\u031a\u031b\7p\2\2\u031b\u00b4\3\2\2"+ - "\2\u031c\u031d\7g\2\2\u031d\u031e\7n\2\2\u031e\u031f\7u\2\2\u031f\u0320"+ - "\7g\2\2\u0320\u00b6\3\2\2\2\u0321\u0322\7v\2\2\u0322\u0323\7{\2\2\u0323"+ - "\u0324\7r\2\2\u0324\u0325\7g\2\2\u0325\u0326\7u\2\2\u0326\u0327\7y\2\2"+ - "\u0327\u0328\7k\2\2\u0328\u0329\7v\2\2\u0329\u032a\7e\2\2\u032a\u032b"+ - "\7j\2\2\u032b\u00b8\3\2\2\2\u032c\u032d\7q\2\2\u032d\u032e\7t\2\2\u032e"+ - "\u00ba\3\2\2\2\u032f\u0330\7c\2\2\u0330\u0331\7p\2\2\u0331\u0332\7f\2"+ - "\2\u0332\u00bc\3\2\2\2\u0333\u0334\7p\2\2\u0334\u0335\7q\2\2\u0335\u0336"+ - "\7v\2\2\u0336\u00be\3\2\2\2\u0337\u0338\7v\2\2\u0338\u0339\7q\2\2\u0339"+ - "\u00c0\3\2\2\2\u033a\u033b\7k\2\2\u033b\u033c\7p\2\2\u033c\u033d\7u\2"+ - "\2\u033d\u033e\7v\2\2\u033e\u033f\7c\2\2\u033f\u0340\7p\2\2\u0340\u0341"+ - "\7e\2\2\u0341\u0342\7g\2\2\u0342\u00c2\3\2\2\2\u0343\u0344\7q\2\2\u0344"+ - "\u0345\7h\2\2\u0345\u00c4\3\2\2\2\u0346\u0347\7u\2\2\u0347\u0348\7v\2"+ - "\2\u0348\u0349\7c\2\2\u0349\u034a\7v\2\2\u034a\u034b\7k\2\2\u034b\u034c"+ - "\7e\2\2\u034c\u034d\7c\2\2\u034d\u034e\7n\2\2\u034e\u034f\7n\2\2\u034f"+ - "\u0350\7{\2\2\u0350\u00c6\3\2\2\2\u0351\u0352\7k\2\2\u0352\u0353\7u\2"+ - "\2\u0353\u00c8\3\2\2\2\u0354\u0355\7v\2\2\u0355\u0356\7t\2\2\u0356\u0357"+ - "\7g\2\2\u0357\u0358\7c\2\2\u0358\u0359\7v\2\2\u0359\u00ca\3\2\2\2\u035a"+ - "\u035b\7e\2\2\u035b\u035c\7c\2\2\u035c\u035d\7u\2\2\u035d\u035e\7v\2\2"+ - "\u035e\u00cc\3\2\2\2\u035f\u0360\7e\2\2\u0360\u0361\7c\2\2\u0361\u0362"+ - "\7u\2\2\u0362\u0363\7v\2\2\u0363\u0364\7c\2\2\u0364\u0365\7d\2\2\u0365"+ - "\u0366\7n\2\2\u0366\u0367\7g\2\2\u0367\u00ce\3\2\2\2\u0368\u0369\7x\2"+ - "\2\u0369\u036a\7g\2\2\u036a\u036b\7t\2\2\u036b\u036c\7u\2\2\u036c\u036d"+ - "\7k\2\2\u036d\u036e\7q\2\2\u036e\u036f\7p\2\2\u036f\u00d0\3\2\2\2\u0370"+ - "\u0371\7l\2\2\u0371\u0372\7u\2\2\u0372\u0373\7q\2\2\u0373\u0374\7p\2\2"+ - "\u0374\u0375\7k\2\2\u0375\u0376\7s\2\2\u0376\u00d2\3\2\2\2\u0377\u0378"+ - "\7w\2\2\u0378\u0379\7p\2\2\u0379\u037a\7q\2\2\u037a\u037b\7t\2\2\u037b"+ - "\u037c\7f\2\2\u037c\u037d\7g\2\2\u037d\u037e\7t\2\2\u037e\u037f\7g\2\2"+ - "\u037f\u0380\7f\2\2\u0380\u00d4\3\2\2\2\u0381\u0382\7v\2\2\u0382\u0383"+ - "\7t\2\2\u0383\u0384\7w\2\2\u0384\u0385\7g\2\2\u0385\u00d6\3\2\2\2\u0386"+ - "\u0387\7h\2\2\u0387\u0388\7c\2\2\u0388\u0389\7n\2\2\u0389\u038a\7u\2\2"+ - "\u038a\u038b\7g\2\2\u038b\u00d8\3\2\2\2\u038c\u038d\7v\2\2\u038d\u038e"+ - "\7{\2\2\u038e\u038f\7r\2\2\u038f\u0390\7g\2\2\u0390\u00da\3\2\2\2\u0391"+ - "\u0392\7x\2\2\u0392\u0393\7c\2\2\u0393\u0394\7n\2\2\u0394\u0395\7k\2\2"+ - "\u0395\u0396\7f\2\2\u0396\u0397\7c\2\2\u0397\u0398\7v\2\2\u0398\u0399"+ - "\7g\2\2\u0399\u00dc\3\2\2\2\u039a\u039b\7c\2\2\u039b\u039c\7p\2\2\u039c"+ - "\u039d\7p\2\2\u039d\u039e\7q\2\2\u039e\u039f\7v\2\2\u039f\u03a0\7c\2\2"+ - "\u03a0\u03a1\7v\2\2\u03a1\u03a2\7g\2\2\u03a2\u00de\3\2\2\2\u03a3\u03a4"+ - "\7f\2\2\u03a4\u03a5\7g\2\2\u03a5\u03a6\7e\2\2\u03a6\u03a7\7n\2\2\u03a7"+ - "\u03a8\7c\2\2\u03a8\u03a9\7t\2\2\u03a9\u03aa\7g\2\2\u03aa\u00e0\3\2\2"+ - "\2\u03ab\u03ac\7e\2\2\u03ac\u03ad\7q\2\2\u03ad\u03ae\7p\2\2\u03ae\u03af"+ - "\7v\2\2\u03af\u03b0\7g\2\2\u03b0\u03b1\7z\2\2\u03b1\u03b2\7v\2\2\u03b2"+ - "\u00e2\3\2\2\2\u03b3\u03b4\7k\2\2\u03b4\u03b5\7v\2\2\u03b5\u03b6\7g\2"+ - "\2\u03b6\u03b7\7o\2\2\u03b7\u00e4\3\2\2\2\u03b8\u03b9\7x\2\2\u03b9\u03ba"+ - "\7c\2\2\u03ba\u03bb\7t\2\2\u03bb\u03bc\7k\2\2\u03bc\u03bd\7c\2\2\u03bd"+ - "\u03be\7d\2\2\u03be\u03bf\7n\2\2\u03bf\u03c0\7g\2\2\u03c0\u00e6\3\2\2"+ - "\2\u03c1\u03c2\7k\2\2\u03c2\u03c3\7p\2\2\u03c3\u03c4\7u\2\2\u03c4\u03c5"+ - "\7g\2\2\u03c5\u03c6\7t\2\2\u03c6\u03c7\7v\2\2\u03c7\u00e8\3\2\2\2\u03c8"+ - "\u03c9\7f\2\2\u03c9\u03ca\7g\2\2\u03ca\u03cb\7n\2\2\u03cb\u03cc\7g\2\2"+ - "\u03cc\u03cd\7v\2\2\u03cd\u03ce\7g\2\2\u03ce\u00ea\3\2\2\2\u03cf\u03d0"+ - "\7t\2\2\u03d0\u03d1\7g\2\2\u03d1\u03d2\7p\2\2\u03d2\u03d3\7c\2\2\u03d3"+ - "\u03d4\7o\2\2\u03d4\u03d5\7g\2\2\u03d5\u00ec\3\2\2\2\u03d6\u03d7\7t\2"+ - "\2\u03d7\u03d8\7g\2\2\u03d8\u03d9\7r\2\2\u03d9\u03da\7n\2\2\u03da\u03db"+ - "\7c\2\2\u03db\u03dc\7e\2\2\u03dc\u03dd\7g\2\2\u03dd\u00ee\3\2\2\2\u03de"+ - "\u03df\7e\2\2\u03df\u03e0\7q\2\2\u03e0\u03e1\7r\2\2\u03e1\u03e2\7{\2\2"+ - "\u03e2\u00f0\3\2\2\2\u03e3\u03e4\7o\2\2\u03e4\u03e5\7q\2\2\u03e5\u03e6"+ - "\7f\2\2\u03e6\u03e7\7k\2\2\u03e7\u03e8\7h\2\2\u03e8\u03e9\7{\2\2\u03e9"+ - "\u00f2\3\2\2\2\u03ea\u03eb\7c\2\2\u03eb\u03ec\7r\2\2\u03ec\u03ed\7r\2"+ - "\2\u03ed\u03ee\7g\2\2\u03ee\u03ef\7p\2\2\u03ef\u03f0\7f\2\2\u03f0\u00f4"+ - "\3\2\2\2\u03f1\u03f2\7k\2\2\u03f2\u03f3\7p\2\2\u03f3\u03f4\7v\2\2\u03f4"+ - "\u03f5\7q\2\2\u03f5\u00f6\3\2\2\2\u03f6\u03f7\7x\2\2\u03f7\u03f8\7c\2"+ - "\2\u03f8\u03f9\7n\2\2\u03f9\u03fa\7w\2\2\u03fa\u03fb\7g\2\2\u03fb\u00f8"+ - "\3\2\2\2\u03fc\u03fd\7l\2\2\u03fd\u03fe\7u\2\2\u03fe\u03ff\7q\2\2\u03ff"+ - "\u0400\7p\2\2\u0400\u00fa\3\2\2\2\u0401\u0402\7y\2\2\u0402\u0403\7k\2"+ - "\2\u0403\u0404\7v\2\2\u0404\u0405\7j\2\2\u0405\u00fc\3\2\2\2\u0406\u0407"+ - "\7r\2\2\u0407\u0408\7q\2\2\u0408\u0409\7u\2\2\u0409\u040a\7k\2\2\u040a"+ - "\u040b\7v\2\2\u040b\u040c\7k\2\2\u040c\u040d\7q\2\2\u040d\u040e\7p\2\2"+ - "\u040e\u00fe\3\2\2\2\u040f\u0410\7d\2\2\u0410\u0411\7t\2\2\u0411\u0412"+ - "\7g\2\2\u0412\u0413\7c\2\2\u0413\u0414\7m\2\2\u0414\u0100\3\2\2\2\u0415"+ - "\u0416\7n\2\2\u0416\u0417\7q\2\2\u0417\u0418\7q\2\2\u0418\u0419\7r\2\2"+ - "\u0419\u0102\3\2\2\2\u041a\u041b\7e\2\2\u041b\u041c\7q\2\2\u041c\u041d"+ - "\7p\2\2\u041d\u041e\7v\2\2\u041e\u041f\7k\2\2\u041f\u0420\7p\2\2\u0420"+ - "\u0421\7w\2\2\u0421\u0422\7g\2\2\u0422\u0104\3\2\2\2\u0423\u0424\7g\2"+ - "\2\u0424\u0425\7z\2\2\u0425\u0426\7k\2\2\u0426\u0427\7v\2\2\u0427\u0106"+ - "\3\2\2\2\u0428\u0429\7t\2\2\u0429\u042a\7g\2\2\u042a\u042b\7v\2\2\u042b"+ - "\u042c\7w\2\2\u042c\u042d\7t\2\2\u042d\u042e\7p\2\2\u042e\u042f\7k\2\2"+ - "\u042f\u0430\7p\2\2\u0430\u0431\7i\2\2\u0431\u0108\3\2\2\2\u0432\u0433"+ - "\7y\2\2\u0433\u0434\7j\2\2\u0434\u0435\7k\2\2\u0435\u0436\7n\2\2\u0436"+ - "\u0437\7g\2\2\u0437\u010a\3\2\2\2\u0438\u043d\7$\2\2\u0439\u043c\5\u010d"+ - "\u0087\2\u043a\u043c\n\2\2\2\u043b\u0439\3\2\2\2\u043b\u043a\3\2\2\2\u043c"+ - "\u043f\3\2\2\2\u043d\u043b\3\2\2\2\u043d\u043e\3\2\2\2\u043e\u0440\3\2"+ - "\2\2\u043f\u043d\3\2\2\2\u0440\u0441\7$\2\2\u0441\u010c\3\2\2\2\u0442"+ - "\u0445\7^\2\2\u0443\u0446\t\3\2\2\u0444\u0446\5\u010f\u0088\2\u0445\u0443"+ - "\3\2\2\2\u0445\u0444\3\2\2\2\u0446\u010e\3\2\2\2\u0447\u0448\7w\2\2\u0448"+ - "\u0449\5\u0111\u0089\2\u0449\u044a\5\u0111\u0089\2\u044a\u044b\5\u0111"+ - "\u0089\2\u044b\u044c\5\u0111\u0089\2\u044c\u0110\3\2\2\2\u044d\u044e\t"+ - "\4\2\2\u044e\u0112\3\2\2\2\u044f\u0450\7A\2\2\u0450\u0114\3\2\2\2\u0451"+ - "\u0452\7p\2\2\u0452\u0453\7w\2\2\u0453\u0454\7n\2\2\u0454\u0455\7n\2\2"+ - "\u0455\u0116\3\2\2\2\u0456\u0457\5\u0119\u008d\2\u0457\u0118\3\2\2\2\u0458"+ - "\u045c\5\u011b\u008e\2\u0459\u045c\5\u011d\u008f\2\u045a\u045c\5\u011f"+ - "\u0090\2\u045b\u0458\3\2\2\2\u045b\u0459\3\2\2\2\u045b\u045a\3\2\2\2\u045c"+ - "\u011a\3\2\2\2\u045d\u045e\5\u0121\u0091\2\u045e\u011c\3\2\2\2\u045f\u0460"+ - "\7\60\2\2\u0460\u046a\5\u0121\u0091\2\u0461\u0462\5\u0121\u0091\2\u0462"+ - "\u0466\7\60\2\2\u0463\u0465\t\5\2\2\u0464\u0463\3\2\2\2\u0465\u0468\3"+ - "\2\2\2\u0466\u0464\3\2\2\2\u0466\u0467\3\2\2\2\u0467\u046a\3\2\2\2\u0468"+ - "\u0466\3\2\2\2\u0469\u045f\3\2\2\2\u0469\u0461\3\2\2\2\u046a\u011e\3\2"+ - "\2\2\u046b\u046c\7\60\2\2\u046c\u0478\5\u0121\u0091\2\u046d\u0475\5\u0121"+ - "\u0091\2\u046e\u0472\7\60\2\2\u046f\u0471\t\5\2\2\u0470\u046f\3\2\2\2"+ - "\u0471\u0474\3\2\2\2\u0472\u0470\3\2\2\2\u0472\u0473\3\2\2\2\u0473\u0476"+ - "\3\2\2\2\u0474\u0472\3\2\2\2\u0475\u046e\3\2\2\2\u0475\u0476\3\2\2\2\u0476"+ - "\u0478\3\2\2\2\u0477\u046b\3\2\2\2\u0477\u046d\3\2\2\2\u0478\u0479\3\2"+ - "\2\2\u0479\u047b\t\6\2\2\u047a\u047c\t\7\2\2\u047b\u047a\3\2\2\2\u047b"+ - "\u047c\3\2\2\2\u047c\u047d\3\2\2\2\u047d\u047e\5\u0121\u0091\2\u047e\u0120"+ - "\3\2\2\2\u047f\u0481\t\5\2\2\u0480\u047f\3\2\2\2\u0481\u0482\3\2\2\2\u0482"+ - "\u0480\3\2\2\2\u0482\u0483\3\2\2\2\u0483\u0122\3\2\2\2\u0484\u0485\t\b"+ - "\2\2\u0485\u0486\3\2\2\2\u0486\u0487\b\u0092\2\2\u0487\u0124\3\2\2\2\u0488"+ - "\u048c\5\u0127\u0094\2\u0489\u048b\5\u0129\u0095\2\u048a\u0489\3\2\2\2"+ - "\u048b\u048e\3\2\2\2\u048c\u048a\3\2\2\2\u048c\u048d\3\2\2\2\u048d\u0126"+ - "\3\2\2\2\u048e\u048c\3\2\2\2\u048f\u0491\t\t\2\2\u0490\u048f\3\2\2\2\u0491"+ - "\u0128\3\2\2\2\u0492\u0495\5\u0127\u0094\2\u0493\u0495\t\n\2\2\u0494\u0492"+ - "\3\2\2\2\u0494\u0493\3\2\2\2\u0495\u012a\3\2\2\2\u0496\u0497\7*\2\2\u0497"+ - "\u04a0\7<\2\2\u0498\u049f\5\u012b\u0096\2\u0499\u049a\7*\2\2\u049a\u049f"+ - "\n\13\2\2\u049b\u049c\7<\2\2\u049c\u049f\n\f\2\2\u049d\u049f\n\r\2\2\u049e"+ - "\u0498\3\2\2\2\u049e\u0499\3\2\2\2\u049e\u049b\3\2\2\2\u049e\u049d\3\2"+ - "\2\2\u049f\u04a2\3\2\2\2\u04a0\u049e\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1"+ - "\u04a4\3\2\2\2\u04a2\u04a0\3\2\2\2\u04a3\u04a5\7<\2\2\u04a4\u04a3\3\2"+ - "\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a4\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7"+ - "\u04a8\3\2\2\2\u04a8\u04a9\7+\2\2\u04a9\u04aa\3\2\2\2\u04aa\u04ab\b\u0096"+ - "\2\2\u04ab\u012c\3\2\2\2\u04ac\u04ad\n\16\2\2\u04ad\u012e\3\2\2\2\24\2"+ - "\u043b\u043d\u0445\u045b\u0466\u0469\u0472\u0475\u0477\u047b\u0482\u048c"+ - "\u0490\u0494\u049e\u04a0\u04a6\3\2\3\2"; + "\4\u0097\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b"+ + "\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f"+ + "\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+ + "\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+ + "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad"+ + "\t\u00ad\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1\t\u00b1"+ + "\4\u00b2\t\u00b2\4\u00b3\t\u00b3\4\u00b4\t\u00b4\4\u00b5\t\u00b5\4\u00b6"+ + "\t\u00b6\4\u00b7\t\u00b7\4\u00b8\t\u00b8\4\u00b9\t\u00b9\3\2\3\2\3\3\3"+ + "\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\7\3\7\3\b\3\b\3\t"+ + "\3\t\3\n\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\17\3\17\3\17\3\17\3"+ + "\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3"+ + "\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3"+ + "\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3"+ + "\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3"+ + "\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3"+ + "\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3"+ + "\26\3\26\3\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3"+ + "\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3"+ + "\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3"+ + "\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3"+ + "\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3"+ + "\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3"+ + "\37\3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3#\3#"+ + "\3#\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3*\3*\3*\3+"+ + "\3+\3,\3,\3,\3-\3-\3-\3.\3.\3/\3/\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3"+ + "\61\3\61\3\62\3\62\3\62\3\62\3\63\3\63\3\64\3\64\3\65\3\65\3\66\3\66\3"+ + "\67\3\67\3\67\38\38\39\39\39\3:\3:\3:\3;\3;\3;\3<\3<\3<\3<\3=\3=\3=\3"+ + "=\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3@\3@\3@\3A\3A\3A\3A\3A\3A\3B\3"+ + "B\3B\3B\3B\3B\3B\3C\3C\3C\3D\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3G\3G\3"+ + "G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3"+ + "K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3"+ + "M\3M\3M\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3"+ + "P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3S\3S\3"+ + "S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3V\3V\3V\3V\3V\3V\3W\3W\3W\3"+ + "W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3"+ + "Z\3Z\3Z\3[\3[\3[\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3^\3^\3^\3_\3_\3_\3_\3_\3"+ + "_\3_\3_\3_\3`\3`\3`\3a\3a\3a\3a\3a\3a\3a\3a\3a\3a\3a\3b\3b\3b\3c\3c\3"+ + "c\3c\3c\3c\3d\3d\3d\3d\3d\3e\3e\3e\3e\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3"+ + "f\3f\3f\3g\3g\3g\3g\3g\3g\3g\3h\3h\3h\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3"+ + "i\3i\3j\3j\3j\3j\3j\3j\3k\3k\3k\3k\3k\3l\3l\3l\3l\3l\3l\3l\3l\3l\3m\3"+ + "m\3m\3m\3m\3m\3m\3m\3m\3n\3n\3n\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3o\3"+ + "o\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3r\3r\3s\3"+ + "s\3s\3s\3s\3s\3s\3t\3t\3t\3t\3t\3t\3t\3u\3u\3u\3u\3u\3u\3u\3u\3v\3v\3"+ + "v\3v\3v\3w\3w\3w\3w\3w\3w\3w\3x\3x\3x\3x\3x\3x\3x\3y\3y\3y\3y\3y\3z\3"+ + "z\3z\3z\3z\3z\3{\3{\3{\3{\3{\3|\3|\3|\3|\3|\3}\3}\3}\3}\3}\3}\3}\3}\3"+ + "}\3~\3~\3~\3~\3~\3~\3\177\3\177\3\177\3\177\3\177\3\u0080\3\u0080\3\u0080"+ + "\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081"+ + "\3\u0081\3\u0081\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082"+ + "\3\u0082\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083"+ + "\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085"+ + "\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\3\u0086"+ + "\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087"+ + "\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0088\3\u0088\3\u0089\3\u0089"+ + "\3\u0089\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b"+ + "\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c"+ + "\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d"+ + "\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f"+ + "\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f"+ + "\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f"+ + "\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090"+ + "\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090"+ + "\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091"+ + "\3\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093"+ + "\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094"+ + "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094"+ + "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095"+ + "\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095"+ + "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+ + "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097"+ + "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098"+ + "\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+ + "\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a"+ + "\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009b\3\u009b"+ + "\3\u009b\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c"+ + "\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c"+ + "\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009d"+ + "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d"+ + "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+ + "\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+ + "\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0"+ + "\3\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1"+ + "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2"+ + "\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a3"+ + "\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3"+ + "\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4"+ + "\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5"+ + "\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6"+ + "\3\u00a6\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8\7\u00a8"+ + "\u05d8\n\u00a8\f\u00a8\16\u00a8\u05db\13\u00a8\3\u00a8\3\u00a8\3\u00a9"+ + "\3\u00a9\3\u00a9\5\u00a9\u05e2\n\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa"+ + "\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad"+ + "\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00af\5\u00af\u05f8"+ + "\n\u00af\3\u00b0\3\u00b0\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b1\7\u00b1"+ + "\u0601\n\u00b1\f\u00b1\16\u00b1\u0604\13\u00b1\5\u00b1\u0606\n\u00b1\3"+ + "\u00b2\3\u00b2\3\u00b2\3\u00b2\3\u00b2\7\u00b2\u060d\n\u00b2\f\u00b2\16"+ + "\u00b2\u0610\13\u00b2\5\u00b2\u0612\n\u00b2\5\u00b2\u0614\n\u00b2\3\u00b2"+ + "\3\u00b2\5\u00b2\u0618\n\u00b2\3\u00b2\3\u00b2\3\u00b3\6\u00b3\u061d\n"+ + "\u00b3\r\u00b3\16\u00b3\u061e\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b5"+ + "\3\u00b5\7\u00b5\u0627\n\u00b5\f\u00b5\16\u00b5\u062a\13\u00b5\3\u00b6"+ + "\5\u00b6\u062d\n\u00b6\3\u00b7\3\u00b7\5\u00b7\u0631\n\u00b7\3\u00b8\3"+ + "\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b8\7\u00b8\u063b\n"+ + "\u00b8\f\u00b8\16\u00b8\u063e\13\u00b8\3\u00b8\6\u00b8\u0641\n\u00b8\r"+ + "\u00b8\16\u00b8\u0642\3\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b9\3\u00b9"+ + "\2\2\u00ba\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33"+ + "\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67"+ + "\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65"+ + "i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008b"+ + "G\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009f"+ + "Q\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3"+ + "[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7"+ + "e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00db"+ + "o\u00ddp\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00ebw\u00edx\u00ef"+ + "y\u00f1z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb\177\u00fd\u0080\u00ff\u0081"+ + "\u0101\u0082\u0103\u0083\u0105\u0084\u0107\u0085\u0109\u0086\u010b\u0087"+ + "\u010d\u0088\u010f\u0089\u0111\u008a\u0113\u008b\u0115\u008c\u0117\u008d"+ + "\u0119\u008e\u011b\u008f\u011d\u0090\u011f\u0091\u0121\u0092\u0123\u0093"+ + "\u0125\u0094\u0127\u0095\u0129\u0096\u012b\u0097\u012d\u0098\u012f\u0099"+ + "\u0131\u009a\u0133\u009b\u0135\u009c\u0137\u009d\u0139\u009e\u013b\u009f"+ + "\u013d\u00a0\u013f\u00a1\u0141\u00a2\u0143\u00a3\u0145\u00a4\u0147\u00a5"+ + "\u0149\u00a6\u014b\u00a7\u014d\u00a8\u014f\u00a9\u0151\2\u0153\2\u0155"+ + "\2\u0157\u00aa\u0159\u00ab\u015b\u00ac\u015d\u00ad\u015f\u00ae\u0161\u00af"+ + "\u0163\u00b0\u0165\2\u0167\u00b1\u0169\u00b2\u016b\2\u016d\2\u016f\u00b3"+ + "\u0171\u00b4\3\2\17\4\2$$^^\n\2$$\61\61^^ddhhppttvv\5\2\62;CHch\3\2\62"+ + ";\4\2GGgg\4\2--//\5\2\13\f\17\17\"\"\20\2C\\aac|\u00c2\u00d8\u00da\u00f8"+ + "\u00fa\u0301\u0372\u037f\u0381\u2001\u200e\u200f\u2072\u2191\u2c02\u2ff1"+ + "\u3003\ud801\uf902\ufdd1\ufdf2\uffff\7\2//\62;\u00b9\u00b9\u0302\u0371"+ + "\u2041\u2042\3\2<<\3\2++\4\2**<<\7\2$$()>>}}\177\177\2\u0656\2\3\3\2\2"+ + "\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3"+ + "\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2"+ + "\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2"+ + "\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2"+ + "\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3"+ + "\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2"+ + "\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2"+ + "W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3"+ + "\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2"+ + "\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2"+ + "}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2"+ + "\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f"+ + "\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2"+ + "\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1"+ + "\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2"+ + "\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3"+ + "\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2"+ + "\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5"+ + "\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2"+ + "\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7"+ + "\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2"+ + "\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9"+ + "\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2"+ + "\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb"+ + "\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff\3\2\2\2\2\u0101\3\2\2\2\2\u0103\3\2\2"+ + "\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\2\u0109\3\2\2\2\2\u010b\3\2\2\2\2\u010d"+ + "\3\2\2\2\2\u010f\3\2\2\2\2\u0111\3\2\2\2\2\u0113\3\2\2\2\2\u0115\3\2\2"+ + "\2\2\u0117\3\2\2\2\2\u0119\3\2\2\2\2\u011b\3\2\2\2\2\u011d\3\2\2\2\2\u011f"+ + "\3\2\2\2\2\u0121\3\2\2\2\2\u0123\3\2\2\2\2\u0125\3\2\2\2\2\u0127\3\2\2"+ + "\2\2\u0129\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2\2\2\u012f\3\2\2\2\2\u0131"+ + "\3\2\2\2\2\u0133\3\2\2\2\2\u0135\3\2\2\2\2\u0137\3\2\2\2\2\u0139\3\2\2"+ + "\2\2\u013b\3\2\2\2\2\u013d\3\2\2\2\2\u013f\3\2\2\2\2\u0141\3\2\2\2\2\u0143"+ + "\3\2\2\2\2\u0145\3\2\2\2\2\u0147\3\2\2\2\2\u0149\3\2\2\2\2\u014b\3\2\2"+ + "\2\2\u014d\3\2\2\2\2\u014f\3\2\2\2\2\u0157\3\2\2\2\2\u0159\3\2\2\2\2\u015b"+ + "\3\2\2\2\2\u015d\3\2\2\2\2\u015f\3\2\2\2\2\u0161\3\2\2\2\2\u0163\3\2\2"+ + "\2\2\u0167\3\2\2\2\2\u0169\3\2\2\2\2\u016f\3\2\2\2\2\u0171\3\2\2\2\3\u0173"+ + "\3\2\2\2\5\u0175\3\2\2\2\7\u017c\3\2\2\2\t\u017e\3\2\2\2\13\u0180\3\2"+ + "\2\2\r\u0183\3\2\2\2\17\u0185\3\2\2\2\21\u0187\3\2\2\2\23\u0189\3\2\2"+ + "\2\25\u018b\3\2\2\2\27\u018d\3\2\2\2\31\u018f\3\2\2\2\33\u0191\3\2\2\2"+ + "\35\u0193\3\2\2\2\37\u019c\3\2\2\2!\u01a4\3\2\2\2#\u01b3\3\2\2\2%\u01b5"+ + "\3\2\2\2\'\u01c7\3\2\2\2)\u01da\3\2\2\2+\u01e3\3\2\2\2-\u01ee\3\2\2\2"+ + "/\u01f2\3\2\2\2\61\u01fa\3\2\2\2\63\u0204\3\2\2\2\65\u020f\3\2\2\2\67"+ + "\u0215\3\2\2\29\u0227\3\2\2\2;\u0230\3\2\2\2=\u0239\3\2\2\2?\u0240\3\2"+ + "\2\2A\u0248\3\2\2\2C\u0250\3\2\2\2E\u0253\3\2\2\2G\u0256\3\2\2\2I\u0259"+ + "\3\2\2\2K\u025c\3\2\2\2M\u025f\3\2\2\2O\u0262\3\2\2\2Q\u0265\3\2\2\2S"+ + "\u0267\3\2\2\2U\u026a\3\2\2\2W\u026c\3\2\2\2Y\u026f\3\2\2\2[\u0272\3\2"+ + "\2\2]\u0274\3\2\2\2_\u0276\3\2\2\2a\u027a\3\2\2\2c\u027f\3\2\2\2e\u0283"+ + "\3\2\2\2g\u0285\3\2\2\2i\u0287\3\2\2\2k\u0289\3\2\2\2m\u028b\3\2\2\2o"+ + "\u028e\3\2\2\2q\u0290\3\2\2\2s\u0293\3\2\2\2u\u0296\3\2\2\2w\u0299\3\2"+ + "\2\2y\u029d\3\2\2\2{\u02a1\3\2\2\2}\u02a7\3\2\2\2\177\u02ad\3\2\2\2\u0081"+ + "\u02b0\3\2\2\2\u0083\u02b6\3\2\2\2\u0085\u02bd\3\2\2\2\u0087\u02c0\3\2"+ + "\2\2\u0089\u02c3\3\2\2\2\u008b\u02c6\3\2\2\2\u008d\u02c9\3\2\2\2\u008f"+ + "\u02d2\3\2\2\2\u0091\u02d8\3\2\2\2\u0093\u02de\3\2\2\2\u0095\u02e5\3\2"+ + "\2\2\u0097\u02ef\3\2\2\2\u0099\u02fa\3\2\2\2\u009b\u02ff\3\2\2\2\u009d"+ + "\u0305\3\2\2\2\u009f\u030f\3\2\2\2\u00a1\u0319\3\2\2\2\u00a3\u0322\3\2"+ + "\2\2\u00a5\u0328\3\2\2\2\u00a7\u032f\3\2\2\2\u00a9\u0334\3\2\2\2\u00ab"+ + "\u0338\3\2\2\2\u00ad\u033e\3\2\2\2\u00af\u0346\3\2\2\2\u00b1\u034b\3\2"+ + "\2\2\u00b3\u0350\3\2\2\2\u00b5\u035b\3\2\2\2\u00b7\u035e\3\2\2\2\u00b9"+ + "\u0362\3\2\2\2\u00bb\u0366\3\2\2\2\u00bd\u0369\3\2\2\2\u00bf\u0372\3\2"+ + "\2\2\u00c1\u0375\3\2\2\2\u00c3\u0380\3\2\2\2\u00c5\u0383\3\2\2\2\u00c7"+ + "\u0389\3\2\2\2\u00c9\u038e\3\2\2\2\u00cb\u0397\3\2\2\2\u00cd\u039f\3\2"+ + "\2\2\u00cf\u03a6\3\2\2\2\u00d1\u03b0\3\2\2\2\u00d3\u03b5\3\2\2\2\u00d5"+ + "\u03bb\3\2\2\2\u00d7\u03c0\3\2\2\2\u00d9\u03c9\3\2\2\2\u00db\u03d2\3\2"+ + "\2\2\u00dd\u03da\3\2\2\2\u00df\u03e2\3\2\2\2\u00e1\u03e7\3\2\2\2\u00e3"+ + "\u03f0\3\2\2\2\u00e5\u03f7\3\2\2\2\u00e7\u03fe\3\2\2\2\u00e9\u0405\3\2"+ + "\2\2\u00eb\u040d\3\2\2\2\u00ed\u0412\3\2\2\2\u00ef\u0419\3\2\2\2\u00f1"+ + "\u0420\3\2\2\2\u00f3\u0425\3\2\2\2\u00f5\u042b\3\2\2\2\u00f7\u0430\3\2"+ + "\2\2\u00f9\u0435\3\2\2\2\u00fb\u043e\3\2\2\2\u00fd\u0444\3\2\2\2\u00ff"+ + "\u0449\3\2\2\2\u0101\u0452\3\2\2\2\u0103\u0457\3\2\2\2\u0105\u0461\3\2"+ + "\2\2\u0107\u0467\3\2\2\2\u0109\u046e\3\2\2\2\u010b\u0475\3\2\2\2\u010d"+ + "\u047f\3\2\2\2\u010f\u0487\3\2\2\2\u0111\u0489\3\2\2\2\u0113\u048c\3\2"+ + "\2\2\u0115\u048e\3\2\2\2\u0117\u0494\3\2\2\2\u0119\u049f\3\2\2\2\u011b"+ + "\u04a9\3\2\2\2\u011d\u04ae\3\2\2\2\u011f\u04c1\3\2\2\2\u0121\u04d3\3\2"+ + "\2\2\u0123\u04dd\3\2\2\2\u0125\u04e4\3\2\2\2\u0127\u04ed\3\2\2\2\u0129"+ + "\u04ff\3\2\2\2\u012b\u0509\3\2\2\2\u012d\u051a\3\2\2\2\u012f\u051f\3\2"+ + "\2\2\u0131\u0526\3\2\2\2\u0133\u052f\3\2\2\2\u0135\u053d\3\2\2\2\u0137"+ + "\u0542\3\2\2\2\u0139\u0559\3\2\2\2\u013b\u0568\3\2\2\2\u013d\u0579\3\2"+ + "\2\2\u013f\u0588\3\2\2\2\u0141\u0593\3\2\2\2\u0143\u05a0\3\2\2\2\u0145"+ + "\u05aa\3\2\2\2\u0147\u05b6\3\2\2\2\u0149\u05c2\3\2\2\2\u014b\u05ca\3\2"+ + "\2\2\u014d\u05d0\3\2\2\2\u014f\u05d4\3\2\2\2\u0151\u05de\3\2\2\2\u0153"+ + "\u05e3\3\2\2\2\u0155\u05e9\3\2\2\2\u0157\u05eb\3\2\2\2\u0159\u05ed\3\2"+ + "\2\2\u015b\u05f2\3\2\2\2\u015d\u05f7\3\2\2\2\u015f\u05f9\3\2\2\2\u0161"+ + "\u0605\3\2\2\2\u0163\u0613\3\2\2\2\u0165\u061c\3\2\2\2\u0167\u0620\3\2"+ + "\2\2\u0169\u0624\3\2\2\2\u016b\u062c\3\2\2\2\u016d\u0630\3\2\2\2\u016f"+ + "\u0632\3\2\2\2\u0171\u0648\3\2\2\2\u0173\u0174\7=\2\2\u0174\4\3\2\2\2"+ + "\u0175\u0176\7o\2\2\u0176\u0177\7q\2\2\u0177\u0178\7f\2\2\u0178\u0179"+ + "\7w\2\2\u0179\u017a\7n\2\2\u017a\u017b\7g\2\2\u017b\6\3\2\2\2\u017c\u017d"+ + "\7?\2\2\u017d\b\3\2\2\2\u017e\u017f\7&\2\2\u017f\n\3\2\2\2\u0180\u0181"+ + "\7<\2\2\u0181\u0182\7?\2\2\u0182\f\3\2\2\2\u0183\u0184\7}\2\2\u0184\16"+ + "\3\2\2\2\u0185\u0186\7\177\2\2\u0186\20\3\2\2\2\u0187\u0188\7*\2\2\u0188"+ + "\22\3\2\2\2\u0189\u018a\7+\2\2\u018a\24\3\2\2\2\u018b\u018c\7,\2\2\u018c"+ + "\26\3\2\2\2\u018d\u018e\7~\2\2\u018e\30\3\2\2\2\u018f\u0190\7\'\2\2\u0190"+ + "\32\3\2\2\2\u0191\u0192\7.\2\2\u0192\34\3\2\2\2\u0193\u0194\7q\2\2\u0194"+ + "\u0195\7t\2\2\u0195\u0196\7f\2\2\u0196\u0197\7g\2\2\u0197\u0198\7t\2\2"+ + "\u0198\u0199\7k\2\2\u0199\u019a\7p\2\2\u019a\u019b\7i\2\2\u019b\36\3\2"+ + "\2\2\u019c\u019d\7q\2\2\u019d\u019e\7t\2\2\u019e\u019f\7f\2\2\u019f\u01a0"+ + "\7g\2\2\u01a0\u01a1\7t\2\2\u01a1\u01a2\7g\2\2\u01a2\u01a3\7f\2\2\u01a3"+ + " \3\2\2\2\u01a4\u01a5\7f\2\2\u01a5\u01a6\7g\2\2\u01a6\u01a7\7e\2\2\u01a7"+ + "\u01a8\7k\2\2\u01a8\u01a9\7o\2\2\u01a9\u01aa\7c\2\2\u01aa\u01ab\7n\2\2"+ + "\u01ab\u01ac\7/\2\2\u01ac\u01ad\7h\2\2\u01ad\u01ae\7q\2\2\u01ae\u01af"+ + "\7t\2\2\u01af\u01b0\7o\2\2\u01b0\u01b1\7c\2\2\u01b1\u01b2\7v\2\2\u01b2"+ + "\"\3\2\2\2\u01b3\u01b4\7<\2\2\u01b4$\3\2\2\2\u01b5\u01b6\7f\2\2\u01b6"+ + "\u01b7\7g\2\2\u01b7\u01b8\7e\2\2\u01b8\u01b9\7k\2\2\u01b9\u01ba\7o\2\2"+ + "\u01ba\u01bb\7c\2\2\u01bb\u01bc\7n\2\2\u01bc\u01bd\7/\2\2\u01bd\u01be"+ + "\7u\2\2\u01be\u01bf\7g\2\2\u01bf\u01c0\7r\2\2\u01c0\u01c1\7c\2\2\u01c1"+ + "\u01c2\7t\2\2\u01c2\u01c3\7c\2\2\u01c3\u01c4\7v\2\2\u01c4\u01c5\7q\2\2"+ + "\u01c5\u01c6\7t\2\2\u01c6&\3\2\2\2\u01c7\u01c8\7i\2\2\u01c8\u01c9\7t\2"+ + "\2\u01c9\u01ca\7q\2\2\u01ca\u01cb\7w\2\2\u01cb\u01cc\7r\2\2\u01cc\u01cd"+ + "\7k\2\2\u01cd\u01ce\7p\2\2\u01ce\u01cf\7i\2\2\u01cf\u01d0\7/\2\2\u01d0"+ + "\u01d1\7u\2\2\u01d1\u01d2\7g\2\2\u01d2\u01d3\7r\2\2\u01d3\u01d4\7c\2\2"+ + "\u01d4\u01d5\7t\2\2\u01d5\u01d6\7c\2\2\u01d6\u01d7\7v\2\2\u01d7\u01d8"+ + "\7q\2\2\u01d8\u01d9\7t\2\2\u01d9(\3\2\2\2\u01da\u01db\7k\2\2\u01db\u01dc"+ + "\7p\2\2\u01dc\u01dd\7h\2\2\u01dd\u01de\7k\2\2\u01de\u01df\7p\2\2\u01df"+ + "\u01e0\7k\2\2\u01e0\u01e1\7v\2\2\u01e1\u01e2\7{\2\2\u01e2*\3\2\2\2\u01e3"+ + "\u01e4\7o\2\2\u01e4\u01e5\7k\2\2\u01e5\u01e6\7p\2\2\u01e6\u01e7\7w\2\2"+ + "\u01e7\u01e8\7u\2\2\u01e8\u01e9\7/\2\2\u01e9\u01ea\7u\2\2\u01ea\u01eb"+ + "\7k\2\2\u01eb\u01ec\7i\2\2\u01ec\u01ed\7p\2\2\u01ed,\3\2\2\2\u01ee\u01ef"+ + "\7P\2\2\u01ef\u01f0\7c\2\2\u01f0\u01f1\7P\2\2\u01f1.\3\2\2\2\u01f2\u01f3"+ + "\7r\2\2\u01f3\u01f4\7g\2\2\u01f4\u01f5\7t\2\2\u01f5\u01f6\7e\2\2\u01f6"+ + "\u01f7\7g\2\2\u01f7\u01f8\7p\2\2\u01f8\u01f9\7v\2\2\u01f9\60\3\2\2\2\u01fa"+ + "\u01fb\7r\2\2\u01fb\u01fc\7g\2\2\u01fc\u01fd\7t\2\2\u01fd\u01fe\7/\2\2"+ + "\u01fe\u01ff\7o\2\2\u01ff\u0200\7k\2\2\u0200\u0201\7n\2\2\u0201\u0202"+ + "\7n\2\2\u0202\u0203\7g\2\2\u0203\62\3\2\2\2\u0204\u0205\7|\2\2\u0205\u0206"+ + "\7g\2\2\u0206\u0207\7t\2\2\u0207\u0208\7q\2\2\u0208\u0209\7/\2\2\u0209"+ + "\u020a\7f\2\2\u020a\u020b\7k\2\2\u020b\u020c\7i\2\2\u020c\u020d\7k\2\2"+ + "\u020d\u020e\7v\2\2\u020e\64\3\2\2\2\u020f\u0210\7f\2\2\u0210\u0211\7"+ + "k\2\2\u0211\u0212\7i\2\2\u0212\u0213\7k\2\2\u0213\u0214\7v\2\2\u0214\66"+ + "\3\2\2\2\u0215\u0216\7r\2\2\u0216\u0217\7c\2\2\u0217\u0218\7v\2\2\u0218"+ + "\u0219\7v\2\2\u0219\u021a\7g\2\2\u021a\u021b\7t\2\2\u021b\u021c\7p\2\2"+ + "\u021c\u021d\7/\2\2\u021d\u021e\7u\2\2\u021e\u021f\7g\2\2\u021f\u0220"+ + "\7r\2\2\u0220\u0221\7c\2\2\u0221\u0222\7t\2\2\u0222\u0223\7c\2\2\u0223"+ + "\u0224\7v\2\2\u0224\u0225\7q\2\2\u0225\u0226\7t\2\2\u02268\3\2\2\2\u0227"+ + "\u0228\7g\2\2\u0228\u0229\7z\2\2\u0229\u022a\7v\2\2\u022a\u022b\7g\2\2"+ + "\u022b\u022c\7t\2\2\u022c\u022d\7p\2\2\u022d\u022e\7c\2\2\u022e\u022f"+ + "\7n\2\2\u022f:\3\2\2\2\u0230\u0231\7h\2\2\u0231\u0232\7w\2\2\u0232\u0233"+ + "\7p\2\2\u0233\u0234\7e\2\2\u0234\u0235\7v\2\2\u0235\u0236\7k\2\2\u0236"+ + "\u0237\7q\2\2\u0237\u0238\7p\2\2\u0238<\3\2\2\2\u0239\u023a\7l\2\2\u023a"+ + "\u023b\7u\2\2\u023b\u023c\7q\2\2\u023c\u023d\7w\2\2\u023d\u023e\7p\2\2"+ + "\u023e\u023f\7f\2\2\u023f>\3\2\2\2\u0240\u0241\7e\2\2\u0241\u0242\7q\2"+ + "\2\u0242\u0243\7o\2\2\u0243\u0244\7r\2\2\u0244\u0245\7c\2\2\u0245\u0246"+ + "\7e\2\2\u0246\u0247\7v\2\2\u0247@\3\2\2\2\u0248\u0249\7x\2\2\u0249\u024a"+ + "\7g\2\2\u024a\u024b\7t\2\2\u024b\u024c\7d\2\2\u024c\u024d\7q\2\2\u024d"+ + "\u024e\7u\2\2\u024e\u024f\7g\2\2\u024fB\3\2\2\2\u0250\u0251\7g\2\2\u0251"+ + "\u0252\7s\2\2\u0252D\3\2\2\2\u0253\u0254\7p\2\2\u0254\u0255\7g\2\2\u0255"+ + "F\3\2\2\2\u0256\u0257\7n\2\2\u0257\u0258\7v\2\2\u0258H\3\2\2\2\u0259\u025a"+ + "\7n\2\2\u025a\u025b\7g\2\2\u025bJ\3\2\2\2\u025c\u025d\7i\2\2\u025d\u025e"+ + "\7v\2\2\u025eL\3\2\2\2\u025f\u0260\7i\2\2\u0260\u0261\7g\2\2\u0261N\3"+ + "\2\2\2\u0262\u0263\7#\2\2\u0263\u0264\7?\2\2\u0264P\3\2\2\2\u0265\u0266"+ + "\7>\2\2\u0266R\3\2\2\2\u0267\u0268\7>\2\2\u0268\u0269\7?\2\2\u0269T\3"+ + "\2\2\2\u026a\u026b\7@\2\2\u026bV\3\2\2\2\u026c\u026d\7@\2\2\u026d\u026e"+ + "\7?\2\2\u026eX\3\2\2\2\u026f\u0270\7~\2\2\u0270\u0271\7~\2\2\u0271Z\3"+ + "\2\2\2\u0272\u0273\7-\2\2\u0273\\\3\2\2\2\u0274\u0275\7/\2\2\u0275^\3"+ + "\2\2\2\u0276\u0277\7f\2\2\u0277\u0278\7k\2\2\u0278\u0279\7x\2\2\u0279"+ + "`\3\2\2\2\u027a\u027b\7k\2\2\u027b\u027c\7f\2\2\u027c\u027d\7k\2\2\u027d"+ + "\u027e\7x\2\2\u027eb\3\2\2\2\u027f\u0280\7o\2\2\u0280\u0281\7q\2\2\u0281"+ + "\u0282\7f\2\2\u0282d\3\2\2\2\u0283\u0284\7#\2\2\u0284f\3\2\2\2\u0285\u0286"+ + "\7]\2\2\u0286h\3\2\2\2\u0287\u0288\7_\2\2\u0288j\3\2\2\2\u0289\u028a\7"+ + "\60\2\2\u028al\3\2\2\2\u028b\u028c\7&\2\2\u028c\u028d\7&\2\2\u028dn\3"+ + "\2\2\2\u028e\u028f\7%\2\2\u028fp\3\2\2\2\u0290\u0291\7\60\2\2\u0291\u0292"+ + "\7\60\2\2\u0292r\3\2\2\2\u0293\u0294\7}\2\2\u0294\u0295\7~\2\2\u0295t"+ + "\3\2\2\2\u0296\u0297\7~\2\2\u0297\u0298\7\177\2\2\u0298v\3\2\2\2\u0299"+ + "\u029a\7h\2\2\u029a\u029b\7q\2\2\u029b\u029c\7t\2\2\u029cx\3\2\2\2\u029d"+ + "\u029e\7n\2\2\u029e\u029f\7g\2\2\u029f\u02a0\7v\2\2\u02a0z\3\2\2\2\u02a1"+ + "\u02a2\7y\2\2\u02a2\u02a3\7j\2\2\u02a3\u02a4\7g\2\2\u02a4\u02a5\7t\2\2"+ + "\u02a5\u02a6\7g\2\2\u02a6|\3\2\2\2\u02a7\u02a8\7i\2\2\u02a8\u02a9\7t\2"+ + "\2\u02a9\u02aa\7q\2\2\u02aa\u02ab\7w\2\2\u02ab\u02ac\7r\2\2\u02ac~\3\2"+ + "\2\2\u02ad\u02ae\7d\2\2\u02ae\u02af\7{\2\2\u02af\u0080\3\2\2\2\u02b0\u02b1"+ + "\7q\2\2\u02b1\u02b2\7t\2\2\u02b2\u02b3\7f\2\2\u02b3\u02b4\7g\2\2\u02b4"+ + "\u02b5\7t\2\2\u02b5\u0082\3\2\2\2\u02b6\u02b7\7t\2\2\u02b7\u02b8\7g\2"+ + "\2\u02b8\u02b9\7v\2\2\u02b9\u02ba\7w\2\2\u02ba\u02bb\7t\2\2\u02bb\u02bc"+ + "\7p\2\2\u02bc\u0084\3\2\2\2\u02bd\u02be\7k\2\2\u02be\u02bf\7h\2\2\u02bf"+ + "\u0086\3\2\2\2\u02c0\u02c1\7k\2\2\u02c1\u02c2\7p\2\2\u02c2\u0088\3\2\2"+ + "\2\u02c3\u02c4\7c\2\2\u02c4\u02c5\7u\2\2\u02c5\u008a\3\2\2\2\u02c6\u02c7"+ + "\7c\2\2\u02c7\u02c8\7v\2\2\u02c8\u008c\3\2\2\2\u02c9\u02ca\7c\2\2\u02ca"+ + "\u02cb\7n\2\2\u02cb\u02cc\7n\2\2\u02cc\u02cd\7q\2\2\u02cd\u02ce\7y\2\2"+ + "\u02ce\u02cf\7k\2\2\u02cf\u02d0\7p\2\2\u02d0\u02d1\7i\2\2\u02d1\u008e"+ + "\3\2\2\2\u02d2\u02d3\7g\2\2\u02d3\u02d4\7o\2\2\u02d4\u02d5\7r\2\2\u02d5"+ + "\u02d6\7v\2\2\u02d6\u02d7\7{\2\2\u02d7\u0090\3\2\2\2\u02d8\u02d9\7e\2"+ + "\2\u02d9\u02da\7q\2\2\u02da\u02db\7w\2\2\u02db\u02dc\7p\2\2\u02dc\u02dd"+ + "\7v\2\2\u02dd\u0092\3\2\2\2\u02de\u02df\7u\2\2\u02df\u02e0\7v\2\2\u02e0"+ + "\u02e1\7c\2\2\u02e1\u02e2\7d\2\2\u02e2\u02e3\7n\2\2\u02e3\u02e4\7g\2\2"+ + "\u02e4\u0094\3\2\2\2\u02e5\u02e6\7c\2\2\u02e6\u02e7\7u\2\2\u02e7\u02e8"+ + "\7e\2\2\u02e8\u02e9\7g\2\2\u02e9\u02ea\7p\2\2\u02ea\u02eb\7f\2\2\u02eb"+ + "\u02ec\7k\2\2\u02ec\u02ed\7p\2\2\u02ed\u02ee\7i\2\2\u02ee\u0096\3\2\2"+ + "\2\u02ef\u02f0\7f\2\2\u02f0\u02f1\7g\2\2\u02f1\u02f2\7u\2\2\u02f2\u02f3"+ + "\7e\2\2\u02f3\u02f4\7g\2\2\u02f4\u02f5\7p\2\2\u02f5\u02f6\7f\2\2\u02f6"+ + "\u02f7\7k\2\2\u02f7\u02f8\7p\2\2\u02f8\u02f9\7i\2\2\u02f9\u0098\3\2\2"+ + "\2\u02fa\u02fb\7u\2\2\u02fb\u02fc\7q\2\2\u02fc\u02fd\7o\2\2\u02fd\u02fe"+ + "\7g\2\2\u02fe\u009a\3\2\2\2\u02ff\u0300\7g\2\2\u0300\u0301\7x\2\2\u0301"+ + "\u0302\7g\2\2\u0302\u0303\7t\2\2\u0303\u0304\7{\2\2\u0304\u009c\3\2\2"+ + "\2\u0305\u0306\7u\2\2\u0306\u0307\7c\2\2\u0307\u0308\7v\2\2\u0308\u0309"+ + "\7k\2\2\u0309\u030a\7u\2\2\u030a\u030b\7h\2\2\u030b\u030c\7k\2\2\u030c"+ + "\u030d\7g\2\2\u030d\u030e\7u\2\2\u030e\u009e\3\2\2\2\u030f\u0310\7e\2"+ + "\2\u0310\u0311\7q\2\2\u0311\u0312\7n\2\2\u0312\u0313\7n\2\2\u0313\u0314"+ + "\7c\2\2\u0314\u0315\7v\2\2\u0315\u0316\7k\2\2\u0316\u0317\7q\2\2\u0317"+ + "\u0318\7p\2\2\u0318\u00a0\3\2\2\2\u0319\u031a\7i\2\2\u031a\u031b\7t\2"+ + "\2\u031b\u031c\7g\2\2\u031c\u031d\7c\2\2\u031d\u031e\7v\2\2\u031e\u031f"+ + "\7g\2\2\u031f\u0320\7u\2\2\u0320\u0321\7v\2\2\u0321\u00a2\3\2\2\2\u0322"+ + "\u0323\7n\2\2\u0323\u0324\7g\2\2\u0324\u0325\7c\2\2\u0325\u0326\7u\2\2"+ + "\u0326\u0327\7v\2\2\u0327\u00a4\3\2\2\2\u0328\u0329\7u\2\2\u0329\u032a"+ + "\7y\2\2\u032a\u032b\7k\2\2\u032b\u032c\7v\2\2\u032c\u032d\7e\2\2\u032d"+ + "\u032e\7j\2\2\u032e\u00a6\3\2\2\2\u032f\u0330\7e\2\2\u0330\u0331\7c\2"+ + "\2\u0331\u0332\7u\2\2\u0332\u0333\7g\2\2\u0333\u00a8\3\2\2\2\u0334\u0335"+ + "\7v\2\2\u0335\u0336\7t\2\2\u0336\u0337\7{\2\2\u0337\u00aa\3\2\2\2\u0338"+ + "\u0339\7e\2\2\u0339\u033a\7c\2\2\u033a\u033b\7v\2\2\u033b\u033c\7e\2\2"+ + "\u033c\u033d\7j\2\2\u033d\u00ac\3\2\2\2\u033e\u033f\7f\2\2\u033f\u0340"+ + "\7g\2\2\u0340\u0341\7h\2\2\u0341\u0342\7c\2\2\u0342\u0343\7w\2\2\u0343"+ + "\u0344\7n\2\2\u0344\u0345\7v\2\2\u0345\u00ae\3\2\2\2\u0346\u0347\7v\2"+ + "\2\u0347\u0348\7j\2\2\u0348\u0349\7g\2\2\u0349\u034a\7p\2\2\u034a\u00b0"+ + "\3\2\2\2\u034b\u034c\7g\2\2\u034c\u034d\7n\2\2\u034d\u034e\7u\2\2\u034e"+ + "\u034f\7g\2\2\u034f\u00b2\3\2\2\2\u0350\u0351\7v\2\2\u0351\u0352\7{\2"+ + "\2\u0352\u0353\7r\2\2\u0353\u0354\7g\2\2\u0354\u0355\7u\2\2\u0355\u0356"+ + "\7y\2\2\u0356\u0357\7k\2\2\u0357\u0358\7v\2\2\u0358\u0359\7e\2\2\u0359"+ + "\u035a\7j\2\2\u035a\u00b4\3\2\2\2\u035b\u035c\7q\2\2\u035c\u035d\7t\2"+ + "\2\u035d\u00b6\3\2\2\2\u035e\u035f\7c\2\2\u035f\u0360\7p\2\2\u0360\u0361"+ + "\7f\2\2\u0361\u00b8\3\2\2\2\u0362\u0363\7p\2\2\u0363\u0364\7q\2\2\u0364"+ + "\u0365\7v\2\2\u0365\u00ba\3\2\2\2\u0366\u0367\7v\2\2\u0367\u0368\7q\2"+ + "\2\u0368\u00bc\3\2\2\2\u0369\u036a\7k\2\2\u036a\u036b\7p\2\2\u036b\u036c"+ + "\7u\2\2\u036c\u036d\7v\2\2\u036d\u036e\7c\2\2\u036e\u036f\7p\2\2\u036f"+ + "\u0370\7e\2\2\u0370\u0371\7g\2\2\u0371\u00be\3\2\2\2\u0372\u0373\7q\2"+ + "\2\u0373\u0374\7h\2\2\u0374\u00c0\3\2\2\2\u0375\u0376\7u\2\2\u0376\u0377"+ + "\7v\2\2\u0377\u0378\7c\2\2\u0378\u0379\7v\2\2\u0379\u037a\7k\2\2\u037a"+ + "\u037b\7e\2\2\u037b\u037c\7c\2\2\u037c\u037d\7n\2\2\u037d\u037e\7n\2\2"+ + "\u037e\u037f\7{\2\2\u037f\u00c2\3\2\2\2\u0380\u0381\7k\2\2\u0381\u0382"+ + "\7u\2\2\u0382\u00c4\3\2\2\2\u0383\u0384\7v\2\2\u0384\u0385\7t\2\2\u0385"+ + "\u0386\7g\2\2\u0386\u0387\7c\2\2\u0387\u0388\7v\2\2\u0388\u00c6\3\2\2"+ + "\2\u0389\u038a\7e\2\2\u038a\u038b\7c\2\2\u038b\u038c\7u\2\2\u038c\u038d"+ + "\7v\2\2\u038d\u00c8\3\2\2\2\u038e\u038f\7e\2\2\u038f\u0390\7c\2\2\u0390"+ + "\u0391\7u\2\2\u0391\u0392\7v\2\2\u0392\u0393\7c\2\2\u0393\u0394\7d\2\2"+ + "\u0394\u0395\7n\2\2\u0395\u0396\7g\2\2\u0396\u00ca\3\2\2\2\u0397\u0398"+ + "\7x\2\2\u0398\u0399\7g\2\2\u0399\u039a\7t\2\2\u039a\u039b\7u\2\2\u039b"+ + "\u039c\7k\2\2\u039c\u039d\7q\2\2\u039d\u039e\7p\2\2\u039e\u00cc\3\2\2"+ + "\2\u039f\u03a0\7l\2\2\u03a0\u03a1\7u\2\2\u03a1\u03a2\7q\2\2\u03a2\u03a3"+ + "\7p\2\2\u03a3\u03a4\7k\2\2\u03a4\u03a5\7s\2\2\u03a5\u00ce\3\2\2\2\u03a6"+ + "\u03a7\7w\2\2\u03a7\u03a8\7p\2\2\u03a8\u03a9\7q\2\2\u03a9\u03aa\7t\2\2"+ + "\u03aa\u03ab\7f\2\2\u03ab\u03ac\7g\2\2\u03ac\u03ad\7t\2\2\u03ad\u03ae"+ + "\7g\2\2\u03ae\u03af\7f\2\2\u03af\u00d0\3\2\2\2\u03b0\u03b1\7v\2\2\u03b1"+ + "\u03b2\7t\2\2\u03b2\u03b3\7w\2\2\u03b3\u03b4\7g\2\2\u03b4\u00d2\3\2\2"+ + "\2\u03b5\u03b6\7h\2\2\u03b6\u03b7\7c\2\2\u03b7\u03b8\7n\2\2\u03b8\u03b9"+ + "\7u\2\2\u03b9\u03ba\7g\2\2\u03ba\u00d4\3\2\2\2\u03bb\u03bc\7v\2\2\u03bc"+ + "\u03bd\7{\2\2\u03bd\u03be\7r\2\2\u03be\u03bf\7g\2\2\u03bf\u00d6\3\2\2"+ + "\2\u03c0\u03c1\7x\2\2\u03c1\u03c2\7c\2\2\u03c2\u03c3\7n\2\2\u03c3\u03c4"+ + "\7k\2\2\u03c4\u03c5\7f\2\2\u03c5\u03c6\7c\2\2\u03c6\u03c7\7v\2\2\u03c7"+ + "\u03c8\7g\2\2\u03c8\u00d8\3\2\2\2\u03c9\u03ca\7c\2\2\u03ca\u03cb\7p\2"+ + "\2\u03cb\u03cc\7p\2\2\u03cc\u03cd\7q\2\2\u03cd\u03ce\7v\2\2\u03ce\u03cf"+ + "\7c\2\2\u03cf\u03d0\7v\2\2\u03d0\u03d1\7g\2\2\u03d1\u00da\3\2\2\2\u03d2"+ + "\u03d3\7f\2\2\u03d3\u03d4\7g\2\2\u03d4\u03d5\7e\2\2\u03d5\u03d6\7n\2\2"+ + "\u03d6\u03d7\7c\2\2\u03d7\u03d8\7t\2\2\u03d8\u03d9\7g\2\2\u03d9\u00dc"+ + "\3\2\2\2\u03da\u03db\7e\2\2\u03db\u03dc\7q\2\2\u03dc\u03dd\7p\2\2\u03dd"+ + "\u03de\7v\2\2\u03de\u03df\7g\2\2\u03df\u03e0\7z\2\2\u03e0\u03e1\7v\2\2"+ + "\u03e1\u00de\3\2\2\2\u03e2\u03e3\7k\2\2\u03e3\u03e4\7v\2\2\u03e4\u03e5"+ + "\7g\2\2\u03e5\u03e6\7o\2\2\u03e6\u00e0\3\2\2\2\u03e7\u03e8\7x\2\2\u03e8"+ + "\u03e9\7c\2\2\u03e9\u03ea\7t\2\2\u03ea\u03eb\7k\2\2\u03eb\u03ec\7c\2\2"+ + "\u03ec\u03ed\7d\2\2\u03ed\u03ee\7n\2\2\u03ee\u03ef\7g\2\2\u03ef\u00e2"+ + "\3\2\2\2\u03f0\u03f1\7k\2\2\u03f1\u03f2\7p\2\2\u03f2\u03f3\7u\2\2\u03f3"+ + "\u03f4\7g\2\2\u03f4\u03f5\7t\2\2\u03f5\u03f6\7v\2\2\u03f6\u00e4\3\2\2"+ + "\2\u03f7\u03f8\7f\2\2\u03f8\u03f9\7g\2\2\u03f9\u03fa\7n\2\2\u03fa\u03fb"+ + "\7g\2\2\u03fb\u03fc\7v\2\2\u03fc\u03fd\7g\2\2\u03fd\u00e6\3\2\2\2\u03fe"+ + "\u03ff\7t\2\2\u03ff\u0400\7g\2\2\u0400\u0401\7p\2\2\u0401\u0402\7c\2\2"+ + "\u0402\u0403\7o\2\2\u0403\u0404\7g\2\2\u0404\u00e8\3\2\2\2\u0405\u0406"+ + "\7t\2\2\u0406\u0407\7g\2\2\u0407\u0408\7r\2\2\u0408\u0409\7n\2\2\u0409"+ + "\u040a\7c\2\2\u040a\u040b\7e\2\2\u040b\u040c\7g\2\2\u040c\u00ea\3\2\2"+ + "\2\u040d\u040e\7e\2\2\u040e\u040f\7q\2\2\u040f\u0410\7r\2\2\u0410\u0411"+ + "\7{\2\2\u0411\u00ec\3\2\2\2\u0412\u0413\7o\2\2\u0413\u0414\7q\2\2\u0414"+ + "\u0415\7f\2\2\u0415\u0416\7k\2\2\u0416\u0417\7h\2\2\u0417\u0418\7{\2\2"+ + "\u0418\u00ee\3\2\2\2\u0419\u041a\7c\2\2\u041a\u041b\7r\2\2\u041b\u041c"+ + "\7r\2\2\u041c\u041d\7g\2\2\u041d\u041e\7p\2\2\u041e\u041f\7f\2\2\u041f"+ + "\u00f0\3\2\2\2\u0420\u0421\7k\2\2\u0421\u0422\7p\2\2\u0422\u0423\7v\2"+ + "\2\u0423\u0424\7q\2\2\u0424\u00f2\3\2\2\2\u0425\u0426\7x\2\2\u0426\u0427"+ + "\7c\2\2\u0427\u0428\7n\2\2\u0428\u0429\7w\2\2\u0429\u042a\7g\2\2\u042a"+ + "\u00f4\3\2\2\2\u042b\u042c\7l\2\2\u042c\u042d\7u\2\2\u042d\u042e\7q\2"+ + "\2\u042e\u042f\7p\2\2\u042f\u00f6\3\2\2\2\u0430\u0431\7y\2\2\u0431\u0432"+ + "\7k\2\2\u0432\u0433\7v\2\2\u0433\u0434\7j\2\2\u0434\u00f8\3\2\2\2\u0435"+ + "\u0436\7r\2\2\u0436\u0437\7q\2\2\u0437\u0438\7u\2\2\u0438\u0439\7k\2\2"+ + "\u0439\u043a\7v\2\2\u043a\u043b\7k\2\2\u043b\u043c\7q\2\2\u043c\u043d"+ + "\7p\2\2\u043d\u00fa\3\2\2\2\u043e\u043f\7d\2\2\u043f\u0440\7t\2\2\u0440"+ + "\u0441\7g\2\2\u0441\u0442\7c\2\2\u0442\u0443\7m\2\2\u0443\u00fc\3\2\2"+ + "\2\u0444\u0445\7n\2\2\u0445\u0446\7q\2\2\u0446\u0447\7q\2\2\u0447\u0448"+ + "\7r\2\2\u0448\u00fe\3\2\2\2\u0449\u044a\7e\2\2\u044a\u044b\7q\2\2\u044b"+ + "\u044c\7p\2\2\u044c\u044d\7v\2\2\u044d\u044e\7k\2\2\u044e\u044f\7p\2\2"+ + "\u044f\u0450\7w\2\2\u0450\u0451\7g\2\2\u0451\u0100\3\2\2\2\u0452\u0453"+ + "\7g\2\2\u0453\u0454\7z\2\2\u0454\u0455\7k\2\2\u0455\u0456\7v\2\2\u0456"+ + "\u0102\3\2\2\2\u0457\u0458\7t\2\2\u0458\u0459\7g\2\2\u0459\u045a\7v\2"+ + "\2\u045a\u045b\7w\2\2\u045b\u045c\7t\2\2\u045c\u045d\7p\2\2\u045d\u045e"+ + "\7k\2\2\u045e\u045f\7p\2\2\u045f\u0460\7i\2\2\u0460\u0104\3\2\2\2\u0461"+ + "\u0462\7y\2\2\u0462\u0463\7j\2\2\u0463\u0464\7k\2\2\u0464\u0465\7n\2\2"+ + "\u0465\u0466\7g\2\2\u0466\u0106\3\2\2\2\u0467\u0468\7k\2\2\u0468\u0469"+ + "\7o\2\2\u0469\u046a\7r\2\2\u046a\u046b\7q\2\2\u046b\u046c\7t\2\2\u046c"+ + "\u046d\7v\2\2\u046d\u0108\3\2\2\2\u046e\u046f\7u\2\2\u046f\u0470\7e\2"+ + "\2\u0470\u0471\7j\2\2\u0471\u0472\7g\2\2\u0472\u0473\7o\2\2\u0473\u0474"+ + "\7c\2\2\u0474\u010a\3\2\2\2\u0475\u0476\7p\2\2\u0476\u0477\7c\2\2\u0477"+ + "\u0478\7o\2\2\u0478\u0479\7g\2\2\u0479\u047a\7u\2\2\u047a\u047b\7r\2\2"+ + "\u047b\u047c\7c\2\2\u047c\u047d\7e\2\2\u047d\u047e\7g\2\2\u047e\u010c"+ + "\3\2\2\2\u047f\u0480\7g\2\2\u0480\u0481\7n\2\2\u0481\u0482\7g\2\2\u0482"+ + "\u0483\7o\2\2\u0483\u0484\7g\2\2\u0484\u0485\7p\2\2\u0485\u0486\7v\2\2"+ + "\u0486\u010e\3\2\2\2\u0487\u0488\7\61\2\2\u0488\u0110\3\2\2\2\u0489\u048a"+ + "\7\61\2\2\u048a\u048b\7\61\2\2\u048b\u0112\3\2\2\2\u048c\u048d\7B\2\2"+ + "\u048d\u0114\3\2\2\2\u048e\u048f\7e\2\2\u048f\u0490\7j\2\2\u0490\u0491"+ + "\7k\2\2\u0491\u0492\7n\2\2\u0492\u0493\7f\2\2\u0493\u0116\3\2\2\2\u0494"+ + "\u0495\7f\2\2\u0495\u0496\7g\2\2\u0496\u0497\7u\2\2\u0497\u0498\7e\2\2"+ + "\u0498\u0499\7g\2\2\u0499\u049a\7p\2\2\u049a\u049b\7f\2\2\u049b\u049c"+ + "\7c\2\2\u049c\u049d\7p\2\2\u049d\u049e\7v\2\2\u049e\u0118\3\2\2\2\u049f"+ + "\u04a0\7c\2\2\u04a0\u04a1\7v\2\2\u04a1\u04a2\7v\2\2\u04a2\u04a3\7t\2\2"+ + "\u04a3\u04a4\7k\2\2\u04a4\u04a5\7d\2\2\u04a5\u04a6\7w\2\2\u04a6\u04a7"+ + "\7v\2\2\u04a7\u04a8\7g\2\2\u04a8\u011a\3\2\2\2\u04a9\u04aa\7u\2\2\u04aa"+ + "\u04ab\7g\2\2\u04ab\u04ac\7n\2\2\u04ac\u04ad\7h\2\2\u04ad\u011c\3\2\2"+ + "\2\u04ae\u04af\7f\2\2\u04af\u04b0\7g\2\2\u04b0\u04b1\7u\2\2\u04b1\u04b2"+ + "\7e\2\2\u04b2\u04b3\7g\2\2\u04b3\u04b4\7p\2\2\u04b4\u04b5\7f\2\2\u04b5"+ + "\u04b6\7c\2\2\u04b6\u04b7\7p\2\2\u04b7\u04b8\7v\2\2\u04b8\u04b9\7/\2\2"+ + "\u04b9\u04ba\7q\2\2\u04ba\u04bb\7t\2\2\u04bb\u04bc\7/\2\2\u04bc\u04bd"+ + "\7u\2\2\u04bd\u04be\7g\2\2\u04be\u04bf\7n\2\2\u04bf\u04c0\7h\2\2\u04c0"+ + "\u011e\3\2\2\2\u04c1\u04c2\7h\2\2\u04c2\u04c3\7q\2\2\u04c3\u04c4\7n\2"+ + "\2\u04c4\u04c5\7n\2\2\u04c5\u04c6\7q\2\2\u04c6\u04c7\7y\2\2\u04c7\u04c8"+ + "\7k\2\2\u04c8\u04c9\7p\2\2\u04c9\u04ca\7i\2\2\u04ca\u04cb\7/\2\2\u04cb"+ + "\u04cc\7u\2\2\u04cc\u04cd\7k\2\2\u04cd\u04ce\7d\2\2\u04ce\u04cf\7n\2\2"+ + "\u04cf\u04d0\7k\2\2\u04d0\u04d1\7p\2\2\u04d1\u04d2\7i\2\2\u04d2\u0120"+ + "\3\2\2\2\u04d3\u04d4\7h\2\2\u04d4\u04d5\7q\2\2\u04d5\u04d6\7n\2\2\u04d6"+ + "\u04d7\7n\2\2\u04d7\u04d8\7q\2\2\u04d8\u04d9\7y\2\2\u04d9\u04da\7k\2\2"+ + "\u04da\u04db\7p\2\2\u04db\u04dc\7i\2\2\u04dc\u0122\3\2\2\2\u04dd\u04de"+ + "\7r\2\2\u04de\u04df\7c\2\2\u04df\u04e0\7t\2\2\u04e0\u04e1\7g\2\2\u04e1"+ + "\u04e2\7p\2\2\u04e2\u04e3\7v\2\2\u04e3\u0124\3\2\2\2\u04e4\u04e5\7c\2"+ + "\2\u04e5\u04e6\7p\2\2\u04e6\u04e7\7e\2\2\u04e7\u04e8\7g\2\2\u04e8\u04e9"+ + "\7u\2\2\u04e9\u04ea\7v\2\2\u04ea\u04eb\7q\2\2\u04eb\u04ec\7t\2\2\u04ec"+ + "\u0126\3\2\2\2\u04ed\u04ee\7r\2\2\u04ee\u04ef\7t\2\2\u04ef\u04f0\7g\2"+ + "\2\u04f0\u04f1\7e\2\2\u04f1\u04f2\7g\2\2\u04f2\u04f3\7f\2\2\u04f3\u04f4"+ + "\7k\2\2\u04f4\u04f5\7p\2\2\u04f5\u04f6\7i\2\2\u04f6\u04f7\7/\2\2\u04f7"+ + "\u04f8\7u\2\2\u04f8\u04f9\7k\2\2\u04f9\u04fa\7d\2\2\u04fa\u04fb\7n\2\2"+ + "\u04fb\u04fc\7k\2\2\u04fc\u04fd\7p\2\2\u04fd\u04fe\7i\2\2\u04fe\u0128"+ + "\3\2\2\2\u04ff\u0500\7r\2\2\u0500\u0501\7t\2\2\u0501\u0502\7g\2\2\u0502"+ + "\u0503\7e\2\2\u0503\u0504\7g\2\2\u0504\u0505\7f\2\2\u0505\u0506\7k\2\2"+ + "\u0506\u0507\7p\2\2\u0507\u0508\7i\2\2\u0508\u012a\3\2\2\2\u0509\u050a"+ + "\7c\2\2\u050a\u050b\7p\2\2\u050b\u050c\7e\2\2\u050c\u050d\7g\2\2\u050d"+ + "\u050e\7u\2\2\u050e\u050f\7v\2\2\u050f\u0510\7q\2\2\u0510\u0511\7t\2\2"+ + "\u0511\u0512\7/\2\2\u0512\u0513\7q\2\2\u0513\u0514\7t\2\2\u0514\u0515"+ + "\7/\2\2\u0515\u0516\7u\2\2\u0516\u0517\7g\2\2\u0517\u0518\7n\2\2\u0518"+ + "\u0519\7h\2\2\u0519\u012c\3\2\2\2\u051a\u051b\7p\2\2\u051b\u051c\7q\2"+ + "\2\u051c\u051d\7f\2\2\u051d\u051e\7g\2\2\u051e\u012e\3\2\2\2\u051f\u0520"+ + "\7d\2\2\u0520\u0521\7k\2\2\u0521\u0522\7p\2\2\u0522\u0523\7c\2\2\u0523"+ + "\u0524\7t\2\2\u0524\u0525\7{\2\2\u0525\u0130\3\2\2\2\u0526\u0527\7f\2"+ + "\2\u0527\u0528\7q\2\2\u0528\u0529\7e\2\2\u0529\u052a\7w\2\2\u052a\u052b"+ + "\7o\2\2\u052b\u052c\7g\2\2\u052c\u052d\7p\2\2\u052d\u052e\7v\2\2\u052e"+ + "\u0132\3\2\2\2\u052f\u0530\7f\2\2\u0530\u0531\7q\2\2\u0531\u0532\7e\2"+ + "\2\u0532\u0533\7w\2\2\u0533\u0534\7o\2\2\u0534\u0535\7g\2\2\u0535\u0536"+ + "\7p\2\2\u0536\u0537\7v\2\2\u0537\u0538\7/\2\2\u0538\u0539\7p\2\2\u0539"+ + "\u053a\7q\2\2\u053a\u053b\7f\2\2\u053b\u053c\7g\2\2\u053c\u0134\3\2\2"+ + "\2\u053d\u053e\7v\2\2\u053e\u053f\7g\2\2\u053f\u0540\7z\2\2\u0540\u0541"+ + "\7v\2\2\u0541\u0136\3\2\2\2\u0542\u0543\7r\2\2\u0543\u0544\7t\2\2\u0544"+ + "\u0545\7q\2\2\u0545\u0546\7e\2\2\u0546\u0547\7g\2\2\u0547\u0548\7u\2\2"+ + "\u0548\u0549\7u\2\2\u0549\u054a\7k\2\2\u054a\u054b\7p\2\2\u054b\u054c"+ + "\7i\2\2\u054c\u054d\7/\2\2\u054d\u054e\7k\2\2\u054e\u054f\7p\2\2\u054f"+ + "\u0550\7u\2\2\u0550\u0551\7v\2\2\u0551\u0552\7t\2\2\u0552\u0553\7w\2\2"+ + "\u0553\u0554\7e\2\2\u0554\u0555\7v\2\2\u0555\u0556\7k\2\2\u0556\u0557"+ + "\7q\2\2\u0557\u0558\7p\2\2\u0558\u0138\3\2\2\2\u0559\u055a\7p\2\2\u055a"+ + "\u055b\7c\2\2\u055b\u055c\7o\2\2\u055c\u055d\7g\2\2\u055d\u055e\7u\2\2"+ + "\u055e\u055f\7r\2\2\u055f\u0560\7c\2\2\u0560\u0561\7e\2\2\u0561\u0562"+ + "\7g\2\2\u0562\u0563\7/\2\2\u0563\u0564\7p\2\2\u0564\u0565\7q\2\2\u0565"+ + "\u0566\7f\2\2\u0566\u0567\7g\2\2\u0567\u013a\3\2\2\2\u0568\u0569\7u\2"+ + "\2\u0569\u056a\7e\2\2\u056a\u056b\7j\2\2\u056b\u056c\7g\2\2\u056c\u056d"+ + "\7o\2\2\u056d\u056e\7c\2\2\u056e\u056f\7/\2\2\u056f\u0570\7c\2\2\u0570"+ + "\u0571\7v\2\2\u0571\u0572\7v\2\2\u0572\u0573\7t\2\2\u0573\u0574\7k\2\2"+ + "\u0574\u0575\7d\2\2\u0575\u0576\7w\2\2\u0576\u0577\7v\2\2\u0577\u0578"+ + "\7g\2\2\u0578\u013c\3\2\2\2\u0579\u057a\7u\2\2\u057a\u057b\7e\2\2\u057b"+ + "\u057c\7j\2\2\u057c\u057d\7g\2\2\u057d\u057e\7o\2\2\u057e\u057f\7c\2\2"+ + "\u057f\u0580\7/\2\2\u0580\u0581\7g\2\2\u0581\u0582\7n\2\2\u0582\u0583"+ + "\7g\2\2\u0583\u0584\7o\2\2\u0584\u0585\7g\2\2\u0585\u0586\7p\2\2\u0586"+ + "\u0587\7v\2\2\u0587\u013e\3\2\2\2\u0588\u0589\7c\2\2\u0589\u058a\7t\2"+ + "\2\u058a\u058b\7t\2\2\u058b\u058c\7c\2\2\u058c\u058d\7{\2\2\u058d\u058e"+ + "\7/\2\2\u058e\u058f\7p\2\2\u058f\u0590\7q\2\2\u0590\u0591\7f\2\2\u0591"+ + "\u0592\7g\2\2\u0592\u0140\3\2\2\2\u0593\u0594\7d\2\2\u0594\u0595\7q\2"+ + "\2\u0595\u0596\7q\2\2\u0596\u0597\7n\2\2\u0597\u0598\7g\2\2\u0598\u0599"+ + "\7c\2\2\u0599\u059a\7p\2\2\u059a\u059b\7/\2\2\u059b\u059c\7p\2\2\u059c"+ + "\u059d\7q\2\2\u059d\u059e\7f\2\2\u059e\u059f\7g\2\2\u059f\u0142\3\2\2"+ + "\2\u05a0\u05a1\7p\2\2\u05a1\u05a2\7w\2\2\u05a2\u05a3\7n\2\2\u05a3\u05a4"+ + "\7n\2\2\u05a4\u05a5\7/\2\2\u05a5\u05a6\7p\2\2\u05a6\u05a7\7q\2\2\u05a7"+ + "\u05a8\7f\2\2\u05a8\u05a9\7g\2\2\u05a9\u0144\3\2\2\2\u05aa\u05ab\7p\2"+ + "\2\u05ab\u05ac\7w\2\2\u05ac\u05ad\7o\2\2\u05ad\u05ae\7d\2\2\u05ae\u05af"+ + "\7g\2\2\u05af\u05b0\7t\2\2\u05b0\u05b1\7/\2\2\u05b1\u05b2\7p\2\2\u05b2"+ + "\u05b3\7q\2\2\u05b3\u05b4\7f\2\2\u05b4\u05b5\7g\2\2\u05b5\u0146\3\2\2"+ + "\2\u05b6\u05b7\7q\2\2\u05b7\u05b8\7d\2\2\u05b8\u05b9\7l\2\2\u05b9\u05ba"+ + "\7g\2\2\u05ba\u05bb\7e\2\2\u05bb\u05bc\7v\2\2\u05bc\u05bd\7/\2\2\u05bd"+ + "\u05be\7p\2\2\u05be\u05bf\7q\2\2\u05bf\u05c0\7f\2\2\u05c0\u05c1\7g\2\2"+ + "\u05c1\u0148\3\2\2\2\u05c2\u05c3\7e\2\2\u05c3\u05c4\7q\2\2\u05c4\u05c5"+ + "\7o\2\2\u05c5\u05c6\7o\2\2\u05c6\u05c7\7g\2\2\u05c7\u05c8\7p\2\2\u05c8"+ + "\u05c9\7v\2\2\u05c9\u014a\3\2\2\2\u05ca\u05cb\7c\2\2\u05cb\u05cc\7t\2"+ + "\2\u05cc\u05cd\7t\2\2\u05cd\u05ce\7c\2\2\u05ce\u05cf\7{\2\2\u05cf\u014c"+ + "\3\2\2\2\u05d0\u05d1\7o\2\2\u05d1\u05d2\7c\2\2\u05d2\u05d3\7r\2\2\u05d3"+ + "\u014e\3\2\2\2\u05d4\u05d9\7$\2\2\u05d5\u05d8\5\u0151\u00a9\2\u05d6\u05d8"+ + "\n\2\2\2\u05d7\u05d5\3\2\2\2\u05d7\u05d6\3\2\2\2\u05d8\u05db\3\2\2\2\u05d9"+ + "\u05d7\3\2\2\2\u05d9\u05da\3\2\2\2\u05da\u05dc\3\2\2\2\u05db\u05d9\3\2"+ + "\2\2\u05dc\u05dd\7$\2\2\u05dd\u0150\3\2\2\2\u05de\u05e1\7^\2\2\u05df\u05e2"+ + "\t\3\2\2\u05e0\u05e2\5\u0153\u00aa\2\u05e1\u05df\3\2\2\2\u05e1\u05e0\3"+ + "\2\2\2\u05e2\u0152\3\2\2\2\u05e3\u05e4\7w\2\2\u05e4\u05e5\5\u0155\u00ab"+ + "\2\u05e5\u05e6\5\u0155\u00ab\2\u05e6\u05e7\5\u0155\u00ab\2\u05e7\u05e8"+ + "\5\u0155\u00ab\2\u05e8\u0154\3\2\2\2\u05e9\u05ea\t\4\2\2\u05ea\u0156\3"+ + "\2\2\2\u05eb\u05ec\7A\2\2\u05ec\u0158\3\2\2\2\u05ed\u05ee\7p\2\2\u05ee"+ + "\u05ef\7w\2\2\u05ef\u05f0\7n\2\2\u05f0\u05f1\7n\2\2\u05f1\u015a\3\2\2"+ + "\2\u05f2\u05f3\5\u015d\u00af\2\u05f3\u015c\3\2\2\2\u05f4\u05f8\5\u015f"+ + "\u00b0\2\u05f5\u05f8\5\u0161\u00b1\2\u05f6\u05f8\5\u0163\u00b2\2\u05f7"+ + "\u05f4\3\2\2\2\u05f7\u05f5\3\2\2\2\u05f7\u05f6\3\2\2\2\u05f8\u015e\3\2"+ + "\2\2\u05f9\u05fa\5\u0165\u00b3\2\u05fa\u0160\3\2\2\2\u05fb\u05fc\7\60"+ + "\2\2\u05fc\u0606\5\u0165\u00b3\2\u05fd\u05fe\5\u0165\u00b3\2\u05fe\u0602"+ + "\7\60\2\2\u05ff\u0601\t\5\2\2\u0600\u05ff\3\2\2\2\u0601\u0604\3\2\2\2"+ + "\u0602\u0600\3\2\2\2\u0602\u0603\3\2\2\2\u0603\u0606\3\2\2\2\u0604\u0602"+ + "\3\2\2\2\u0605\u05fb\3\2\2\2\u0605\u05fd\3\2\2\2\u0606\u0162\3\2\2\2\u0607"+ + "\u0608\7\60\2\2\u0608\u0614\5\u0165\u00b3\2\u0609\u0611\5\u0165\u00b3"+ + "\2\u060a\u060e\7\60\2\2\u060b\u060d\t\5\2\2\u060c\u060b\3\2\2\2\u060d"+ + "\u0610\3\2\2\2\u060e\u060c\3\2\2\2\u060e\u060f\3\2\2\2\u060f\u0612\3\2"+ + "\2\2\u0610\u060e\3\2\2\2\u0611\u060a\3\2\2\2\u0611\u0612\3\2\2\2\u0612"+ + "\u0614\3\2\2\2\u0613\u0607\3\2\2\2\u0613\u0609\3\2\2\2\u0614\u0615\3\2"+ + "\2\2\u0615\u0617\t\6\2\2\u0616\u0618\t\7\2\2\u0617\u0616\3\2\2\2\u0617"+ + "\u0618\3\2\2\2\u0618\u0619\3\2\2\2\u0619\u061a\5\u0165\u00b3\2\u061a\u0164"+ + "\3\2\2\2\u061b\u061d\t\5\2\2\u061c\u061b\3\2\2\2\u061d\u061e\3\2\2\2\u061e"+ + "\u061c\3\2\2\2\u061e\u061f\3\2\2\2\u061f\u0166\3\2\2\2\u0620\u0621\t\b"+ + "\2\2\u0621\u0622\3\2\2\2\u0622\u0623\b\u00b4\2\2\u0623\u0168\3\2\2\2\u0624"+ + "\u0628\5\u016b\u00b6\2\u0625\u0627\5\u016d\u00b7\2\u0626\u0625\3\2\2\2"+ + "\u0627\u062a\3\2\2\2\u0628\u0626\3\2\2\2\u0628\u0629\3\2\2\2\u0629\u016a"+ + "\3\2\2\2\u062a\u0628\3\2\2\2\u062b\u062d\t\t\2\2\u062c\u062b\3\2\2\2\u062d"+ + "\u016c\3\2\2\2\u062e\u0631\5\u016b\u00b6\2\u062f\u0631\t\n\2\2\u0630\u062e"+ + "\3\2\2\2\u0630\u062f\3\2\2\2\u0631\u016e\3\2\2\2\u0632\u0633\7*\2\2\u0633"+ + "\u063c\7<\2\2\u0634\u063b\5\u016f\u00b8\2\u0635\u0636\7*\2\2\u0636\u063b"+ + "\n\13\2\2\u0637\u0638\7<\2\2\u0638\u063b\n\f\2\2\u0639\u063b\n\r\2\2\u063a"+ + "\u0634\3\2\2\2\u063a\u0635\3\2\2\2\u063a\u0637\3\2\2\2\u063a\u0639\3\2"+ + "\2\2\u063b\u063e\3\2\2\2\u063c\u063a\3\2\2\2\u063c\u063d\3\2\2\2\u063d"+ + "\u0640\3\2\2\2\u063e\u063c\3\2\2\2\u063f\u0641\7<\2\2\u0640\u063f\3\2"+ + "\2\2\u0641\u0642\3\2\2\2\u0642\u0640\3\2\2\2\u0642\u0643\3\2\2\2\u0643"+ + "\u0644\3\2\2\2\u0644\u0645\7+\2\2\u0645\u0646\3\2\2\2\u0646\u0647\b\u00b8"+ + "\2\2\u0647\u0170\3\2\2\2\u0648\u0649\n\16\2\2\u0649\u0172\3\2\2\2\24\2"+ + "\u05d7\u05d9\u05e1\u05f7\u0602\u0605\u060e\u0611\u0613\u0617\u061e\u0628"+ + "\u062c\u0630\u063a\u063c\u0642\3\2\3\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens b/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens index 74d3a280c..ee3ace15f 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens @@ -56,223 +56,291 @@ T__54=55 T__55=56 T__56=57 T__57=58 -T__58=59 -T__59=60 -Kfor=61 -Klet=62 -Kwhere=63 -Kgroup=64 -Kby=65 -Korder=66 -Kreturn=67 -Kif=68 -Kin=69 -Kas=70 -Kat=71 -Kallowing=72 -Kempty=73 -Kcount=74 -Kstable=75 -Kascending=76 -Kdescending=77 -Ksome=78 -Kevery=79 -Ksatisfies=80 -Kcollation=81 -Kgreatest=82 -Kleast=83 -Kswitch=84 -Kcase=85 -Ktry=86 -Kcatch=87 -Kdefault=88 -Kthen=89 -Kelse=90 -Ktypeswitch=91 -Kor=92 -Kand=93 -Knot=94 -Kto=95 -Kinstance=96 -Kof=97 -Kstatically=98 -Kis=99 -Ktreat=100 -Kcast=101 -Kcastable=102 -Kversion=103 -Kjsoniq=104 -Kunordered=105 -Ktrue=106 -Kfalse=107 -Ktype=108 -Kvalidate=109 -Kannotate=110 -Kdeclare=111 -Kcontext=112 -Kitem=113 -Kvariable=114 -Kinsert=115 -Kdelete=116 -Krename=117 -Kreplace=118 -Kcopy=119 -Kmodify=120 -Kappend=121 -Kinto=122 -Kvalue=123 -Kjson=124 -Kwith=125 -Kposition=126 -Kbreak=127 -Kloop=128 -Kcontinue=129 -Kexit=130 -Kreturning=131 -Kwhile=132 -STRING=133 -ArgumentPlaceholder=134 -NullLiteral=135 -Literal=136 -NumericLiteral=137 -IntegerLiteral=138 -DecimalLiteral=139 -DoubleLiteral=140 -WS=141 -NCName=142 -XQComment=143 -ContentChar=144 +Kfor=59 +Klet=60 +Kwhere=61 +Kgroup=62 +Kby=63 +Korder=64 +Kreturn=65 +Kif=66 +Kin=67 +Kas=68 +Kat=69 +Kallowing=70 +Kempty=71 +Kcount=72 +Kstable=73 +Kascending=74 +Kdescending=75 +Ksome=76 +Kevery=77 +Ksatisfies=78 +Kcollation=79 +Kgreatest=80 +Kleast=81 +Kswitch=82 +Kcase=83 +Ktry=84 +Kcatch=85 +Kdefault=86 +Kthen=87 +Kelse=88 +Ktypeswitch=89 +Kor=90 +Kand=91 +Knot=92 +Kto=93 +Kinstance=94 +Kof=95 +Kstatically=96 +Kis=97 +Ktreat=98 +Kcast=99 +Kcastable=100 +Kversion=101 +Kjsoniq=102 +Kunordered=103 +Ktrue=104 +Kfalse=105 +Ktype=106 +Kvalidate=107 +Kannotate=108 +Kdeclare=109 +Kcontext=110 +Kitem=111 +Kvariable=112 +Kinsert=113 +Kdelete=114 +Krename=115 +Kreplace=116 +Kcopy=117 +Kmodify=118 +Kappend=119 +Kinto=120 +Kvalue=121 +Kjson=122 +Kwith=123 +Kposition=124 +Kbreak=125 +Kloop=126 +Kcontinue=127 +Kexit=128 +Kreturning=129 +Kwhile=130 +Kimport=131 +Kschema=132 +Knamespace=133 +Kelement=134 +Kslash=135 +Kdslash=136 +Kat_symbol=137 +Kchild=138 +Kdescendant=139 +Kattribute=140 +Kself=141 +Kdescendant_or_self=142 +Kfollowing_sibling=143 +Kfollowing=144 +Kparent=145 +Kancestor=146 +Kpreceding_sibling=147 +Kpreceding=148 +Kancestor_or_self=149 +Knode=150 +Kbinary=151 +Kdocument=152 +Kdocument_node=153 +Ktext=154 +Kpi=155 +Knamespace_node=156 +Kschema_attribute=157 +Kschema_element=158 +Karray_node=159 +Kboolean_node=160 +Knull_node=161 +Knumber_node=162 +Kobject_node=163 +Kcomment=164 +Karray=165 +Kmap=166 +STRING=167 +ArgumentPlaceholder=168 +NullLiteral=169 +Literal=170 +NumericLiteral=171 +IntegerLiteral=172 +DecimalLiteral=173 +DoubleLiteral=174 +WS=175 +NCName=176 +XQComment=177 +ContentChar=178 ';'=1 'module'=2 -'namespace'=3 -'='=4 -'$'=5 -':='=6 -'{'=7 -'}'=8 -'('=9 -')'=10 -'*'=11 -'|'=12 -'%'=13 -','=14 -'ordering'=15 -'ordered'=16 -'decimal-format'=17 -':'=18 -'decimal-separator'=19 -'grouping-separator'=20 -'infinity'=21 -'minus-sign'=22 -'NaN'=23 -'percent'=24 -'per-mille'=25 -'zero-digit'=26 -'digit'=27 -'pattern-separator'=28 -'import'=29 -'external'=30 -'function'=31 -'jsound'=32 -'compact'=33 -'verbose'=34 -'schema'=35 -'eq'=36 -'ne'=37 -'lt'=38 -'le'=39 -'gt'=40 -'ge'=41 -'!='=42 -'<'=43 -'<='=44 -'>'=45 -'>='=46 -'||'=47 -'+'=48 -'-'=49 -'div'=50 -'idiv'=51 -'mod'=52 -'!'=53 -'['=54 -']'=55 -'.'=56 -'$$'=57 -'#'=58 -'{|'=59 -'|}'=60 -'for'=61 -'let'=62 -'where'=63 -'group'=64 -'by'=65 -'order'=66 -'return'=67 -'if'=68 -'in'=69 -'as'=70 -'at'=71 -'allowing'=72 -'empty'=73 -'count'=74 -'stable'=75 -'ascending'=76 -'descending'=77 -'some'=78 -'every'=79 -'satisfies'=80 -'collation'=81 -'greatest'=82 -'least'=83 -'switch'=84 -'case'=85 -'try'=86 -'catch'=87 -'default'=88 -'then'=89 -'else'=90 -'typeswitch'=91 -'or'=92 -'and'=93 -'not'=94 -'to'=95 -'instance'=96 -'of'=97 -'statically'=98 -'is'=99 -'treat'=100 -'cast'=101 -'castable'=102 -'version'=103 -'jsoniq'=104 -'unordered'=105 -'true'=106 -'false'=107 -'type'=108 -'validate'=109 -'annotate'=110 -'declare'=111 -'context'=112 -'item'=113 -'variable'=114 -'insert'=115 -'delete'=116 -'rename'=117 -'replace'=118 -'copy'=119 -'modify'=120 -'append'=121 -'into'=122 -'value'=123 -'json'=124 -'with'=125 -'position'=126 -'break'=127 -'loop'=128 -'continue'=129 -'exit'=130 -'returning'=131 -'while'=132 -'?'=134 -'null'=135 +'='=3 +'$'=4 +':='=5 +'{'=6 +'}'=7 +'('=8 +')'=9 +'*'=10 +'|'=11 +'%'=12 +','=13 +'ordering'=14 +'ordered'=15 +'decimal-format'=16 +':'=17 +'decimal-separator'=18 +'grouping-separator'=19 +'infinity'=20 +'minus-sign'=21 +'NaN'=22 +'percent'=23 +'per-mille'=24 +'zero-digit'=25 +'digit'=26 +'pattern-separator'=27 +'external'=28 +'function'=29 +'jsound'=30 +'compact'=31 +'verbose'=32 +'eq'=33 +'ne'=34 +'lt'=35 +'le'=36 +'gt'=37 +'ge'=38 +'!='=39 +'<'=40 +'<='=41 +'>'=42 +'>='=43 +'||'=44 +'+'=45 +'-'=46 +'div'=47 +'idiv'=48 +'mod'=49 +'!'=50 +'['=51 +']'=52 +'.'=53 +'$$'=54 +'#'=55 +'..'=56 +'{|'=57 +'|}'=58 +'for'=59 +'let'=60 +'where'=61 +'group'=62 +'by'=63 +'order'=64 +'return'=65 +'if'=66 +'in'=67 +'as'=68 +'at'=69 +'allowing'=70 +'empty'=71 +'count'=72 +'stable'=73 +'ascending'=74 +'descending'=75 +'some'=76 +'every'=77 +'satisfies'=78 +'collation'=79 +'greatest'=80 +'least'=81 +'switch'=82 +'case'=83 +'try'=84 +'catch'=85 +'default'=86 +'then'=87 +'else'=88 +'typeswitch'=89 +'or'=90 +'and'=91 +'not'=92 +'to'=93 +'instance'=94 +'of'=95 +'statically'=96 +'is'=97 +'treat'=98 +'cast'=99 +'castable'=100 +'version'=101 +'jsoniq'=102 +'unordered'=103 +'true'=104 +'false'=105 +'type'=106 +'validate'=107 +'annotate'=108 +'declare'=109 +'context'=110 +'item'=111 +'variable'=112 +'insert'=113 +'delete'=114 +'rename'=115 +'replace'=116 +'copy'=117 +'modify'=118 +'append'=119 +'into'=120 +'value'=121 +'json'=122 +'with'=123 +'position'=124 +'break'=125 +'loop'=126 +'continue'=127 +'exit'=128 +'returning'=129 +'while'=130 +'import'=131 +'schema'=132 +'namespace'=133 +'element'=134 +'/'=135 +'//'=136 +'@'=137 +'child'=138 +'descendant'=139 +'attribute'=140 +'self'=141 +'descendant-or-self'=142 +'following-sibling'=143 +'following'=144 +'parent'=145 +'ancestor'=146 +'preceding-sibling'=147 +'preceding'=148 +'ancestor-or-self'=149 +'node'=150 +'binary'=151 +'document'=152 +'document-node'=153 +'text'=154 +'processing-instruction'=155 +'namespace-node'=156 +'schema-attribute'=157 +'schema-element'=158 +'array-node'=159 +'boolean-node'=160 +'null-node'=161 +'number-node'=162 +'object-node'=163 +'comment'=164 +'array'=165 +'map'=166 +'?'=168 +'null'=169 diff --git a/src/main/java/org/rumbledb/parser/JsoniqParser.java b/src/main/java/org/rumbledb/parser/JsoniqParser.java index 7f42078f0..5d31a5c45 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqParser.java +++ b/src/main/java/org/rumbledb/parser/JsoniqParser.java @@ -27,21 +27,28 @@ public class JsoniqParser extends Parser { T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38, T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45, T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52, - T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59, - T__59=60, Kfor=61, Klet=62, Kwhere=63, Kgroup=64, Kby=65, Korder=66, Kreturn=67, - Kif=68, Kin=69, Kas=70, Kat=71, Kallowing=72, Kempty=73, Kcount=74, Kstable=75, - Kascending=76, Kdescending=77, Ksome=78, Kevery=79, Ksatisfies=80, Kcollation=81, - Kgreatest=82, Kleast=83, Kswitch=84, Kcase=85, Ktry=86, Kcatch=87, Kdefault=88, - Kthen=89, Kelse=90, Ktypeswitch=91, Kor=92, Kand=93, Knot=94, Kto=95, - Kinstance=96, Kof=97, Kstatically=98, Kis=99, Ktreat=100, Kcast=101, Kcastable=102, - Kversion=103, Kjsoniq=104, Kunordered=105, Ktrue=106, Kfalse=107, Ktype=108, - Kvalidate=109, Kannotate=110, Kdeclare=111, Kcontext=112, Kitem=113, Kvariable=114, - Kinsert=115, Kdelete=116, Krename=117, Kreplace=118, Kcopy=119, Kmodify=120, - Kappend=121, Kinto=122, Kvalue=123, Kjson=124, Kwith=125, Kposition=126, - Kbreak=127, Kloop=128, Kcontinue=129, Kexit=130, Kreturning=131, Kwhile=132, - STRING=133, ArgumentPlaceholder=134, NullLiteral=135, Literal=136, NumericLiteral=137, - IntegerLiteral=138, DecimalLiteral=139, DoubleLiteral=140, WS=141, NCName=142, - XQComment=143, ContentChar=144; + T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, Kfor=59, Klet=60, + Kwhere=61, Kgroup=62, Kby=63, Korder=64, Kreturn=65, Kif=66, Kin=67, Kas=68, + Kat=69, Kallowing=70, Kempty=71, Kcount=72, Kstable=73, Kascending=74, + Kdescending=75, Ksome=76, Kevery=77, Ksatisfies=78, Kcollation=79, Kgreatest=80, + Kleast=81, Kswitch=82, Kcase=83, Ktry=84, Kcatch=85, Kdefault=86, Kthen=87, + Kelse=88, Ktypeswitch=89, Kor=90, Kand=91, Knot=92, Kto=93, Kinstance=94, + Kof=95, Kstatically=96, Kis=97, Ktreat=98, Kcast=99, Kcastable=100, Kversion=101, + Kjsoniq=102, Kunordered=103, Ktrue=104, Kfalse=105, Ktype=106, Kvalidate=107, + Kannotate=108, Kdeclare=109, Kcontext=110, Kitem=111, Kvariable=112, Kinsert=113, + Kdelete=114, Krename=115, Kreplace=116, Kcopy=117, Kmodify=118, Kappend=119, + Kinto=120, Kvalue=121, Kjson=122, Kwith=123, Kposition=124, Kbreak=125, + Kloop=126, Kcontinue=127, Kexit=128, Kreturning=129, Kwhile=130, Kimport=131, + Kschema=132, Knamespace=133, Kelement=134, Kslash=135, Kdslash=136, Kat_symbol=137, + Kchild=138, Kdescendant=139, Kattribute=140, Kself=141, Kdescendant_or_self=142, + Kfollowing_sibling=143, Kfollowing=144, Kparent=145, Kancestor=146, Kpreceding_sibling=147, + Kpreceding=148, Kancestor_or_self=149, Knode=150, Kbinary=151, Kdocument=152, + Kdocument_node=153, Ktext=154, Kpi=155, Knamespace_node=156, Kschema_attribute=157, + Kschema_element=158, Karray_node=159, Kboolean_node=160, Knull_node=161, + Knumber_node=162, Kobject_node=163, Kcomment=164, Karray=165, Kmap=166, + STRING=167, ArgumentPlaceholder=168, NullLiteral=169, Literal=170, NumericLiteral=171, + IntegerLiteral=172, DecimalLiteral=173, DoubleLiteral=174, WS=175, NCName=176, + XQComment=177, ContentChar=178; public static final int RULE_moduleAndThisIsIt = 0, RULE_module = 1, RULE_mainModule = 2, RULE_libraryModule = 3, RULE_prolog = 4, RULE_program = 5, RULE_statements = 6, RULE_statementsAndExpr = 7, @@ -77,11 +84,27 @@ public class JsoniqParser extends Parser { RULE_functionItemExpr = 104, RULE_namedFunctionRef = 105, RULE_inlineFunctionExpr = 106, RULE_insertExpr = 107, RULE_deleteExpr = 108, RULE_renameExpr = 109, RULE_replaceExpr = 110, RULE_transformExpr = 111, RULE_appendExpr = 112, RULE_updateLocator = 113, - RULE_copyDecl = 114, RULE_sequenceType = 115, RULE_objectConstructor = 116, - RULE_itemType = 117, RULE_functionTest = 118, RULE_anyFunctionTest = 119, - RULE_typedFunctionTest = 120, RULE_singleType = 121, RULE_pairConstructor = 122, - RULE_arrayConstructor = 123, RULE_uriLiteral = 124, RULE_stringLiteral = 125, - RULE_keyWords = 126; + RULE_copyDecl = 114, RULE_schemaImport = 115, RULE_schemaPrefix = 116, + RULE_pathExpr = 117, RULE_relativePathExpr = 118, RULE_stepExpr = 119, + RULE_axisStep = 120, RULE_forwardStep = 121, RULE_forwardAxis = 122, RULE_abbrevForwardStep = 123, + RULE_reverseStep = 124, RULE_reverseAxis = 125, RULE_abbrevReverseStep = 126, + RULE_nodeTest = 127, RULE_nameTest = 128, RULE_wildcard = 129, RULE_nCNameWithLocalWildcard = 130, + RULE_nCNameWithPrefixWildcard = 131, RULE_predicateList = 132, RULE_itemType = 133, + RULE_atomicOrUnionType = 134, RULE_kindTest = 135, RULE_anyKindTest = 136, + RULE_binaryNodeTest = 137, RULE_documentTest = 138, RULE_textTest = 139, + RULE_commentTest = 140, RULE_namespaceNodeTest = 141, RULE_piTest = 142, + RULE_attributeTest = 143, RULE_attributeNameOrWildcard = 144, RULE_schemaAttributeTest = 145, + RULE_elementTest = 146, RULE_elementNameOrWildcard = 147, RULE_schemaElementTest = 148, + RULE_elementDeclaration = 149, RULE_attributeName = 150, RULE_elementName = 151, + RULE_simpleTypeName = 152, RULE_typeName = 153, RULE_mapTest = 154, RULE_anyMapTest = 155, + RULE_typedMapTest = 156, RULE_arrayTest = 157, RULE_anyArrayTest = 158, + RULE_typedArrayTest = 159, RULE_parenthesizedItemTest = 160, RULE_attributeDeclaration = 161, + RULE_mlNodeTest = 162, RULE_mlArrayNodeTest = 163, RULE_mlObjectNodeTest = 164, + RULE_mlNumberNodeTest = 165, RULE_mlBooleanNodeTest = 166, RULE_mlNullNodeTest = 167, + RULE_sequenceType = 168, RULE_objectConstructor = 169, RULE_functionTest = 170, + RULE_anyFunctionTest = 171, RULE_typedFunctionTest = 172, RULE_singleType = 173, + RULE_pairConstructor = 174, RULE_arrayConstructor = 175, RULE_uriLiteral = 176, + RULE_stringLiteral = 177, RULE_keyWords = 178; private static String[] makeRuleNames() { return new String[] { "moduleAndThisIsIt", "module", "mainModule", "libraryModule", "prolog", @@ -108,35 +131,54 @@ private static String[] makeRuleNames() { "unorderedExpr", "functionCall", "argumentList", "argument", "functionItemExpr", "namedFunctionRef", "inlineFunctionExpr", "insertExpr", "deleteExpr", "renameExpr", "replaceExpr", "transformExpr", "appendExpr", "updateLocator", - "copyDecl", "sequenceType", "objectConstructor", "itemType", "functionTest", - "anyFunctionTest", "typedFunctionTest", "singleType", "pairConstructor", - "arrayConstructor", "uriLiteral", "stringLiteral", "keyWords" + "copyDecl", "schemaImport", "schemaPrefix", "pathExpr", "relativePathExpr", + "stepExpr", "axisStep", "forwardStep", "forwardAxis", "abbrevForwardStep", + "reverseStep", "reverseAxis", "abbrevReverseStep", "nodeTest", "nameTest", + "wildcard", "nCNameWithLocalWildcard", "nCNameWithPrefixWildcard", "predicateList", + "itemType", "atomicOrUnionType", "kindTest", "anyKindTest", "binaryNodeTest", + "documentTest", "textTest", "commentTest", "namespaceNodeTest", "piTest", + "attributeTest", "attributeNameOrWildcard", "schemaAttributeTest", "elementTest", + "elementNameOrWildcard", "schemaElementTest", "elementDeclaration", "attributeName", + "elementName", "simpleTypeName", "typeName", "mapTest", "anyMapTest", + "typedMapTest", "arrayTest", "anyArrayTest", "typedArrayTest", "parenthesizedItemTest", + "attributeDeclaration", "mlNodeTest", "mlArrayNodeTest", "mlObjectNodeTest", + "mlNumberNodeTest", "mlBooleanNodeTest", "mlNullNodeTest", "sequenceType", + "objectConstructor", "functionTest", "anyFunctionTest", "typedFunctionTest", + "singleType", "pairConstructor", "arrayConstructor", "uriLiteral", "stringLiteral", + "keyWords" }; } public static final String[] ruleNames = makeRuleNames(); private static String[] makeLiteralNames() { return new String[] { - null, "';'", "'module'", "'namespace'", "'='", "'$'", "':='", "'{'", - "'}'", "'('", "')'", "'*'", "'|'", "'%'", "','", "'ordering'", "'ordered'", - "'decimal-format'", "':'", "'decimal-separator'", "'grouping-separator'", - "'infinity'", "'minus-sign'", "'NaN'", "'percent'", "'per-mille'", "'zero-digit'", - "'digit'", "'pattern-separator'", "'import'", "'external'", "'function'", - "'jsound'", "'compact'", "'verbose'", "'schema'", "'eq'", "'ne'", "'lt'", - "'le'", "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'", "'>='", "'||'", - "'+'", "'-'", "'div'", "'idiv'", "'mod'", "'!'", "'['", "']'", "'.'", - "'$$'", "'#'", "'{|'", "'|}'", "'for'", "'let'", "'where'", "'group'", - "'by'", "'order'", "'return'", "'if'", "'in'", "'as'", "'at'", "'allowing'", - "'empty'", "'count'", "'stable'", "'ascending'", "'descending'", "'some'", - "'every'", "'satisfies'", "'collation'", "'greatest'", "'least'", "'switch'", - "'case'", "'try'", "'catch'", "'default'", "'then'", "'else'", "'typeswitch'", - "'or'", "'and'", "'not'", "'to'", "'instance'", "'of'", "'statically'", - "'is'", "'treat'", "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'", - "'true'", "'false'", "'type'", "'validate'", "'annotate'", "'declare'", - "'context'", "'item'", "'variable'", "'insert'", "'delete'", "'rename'", - "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'json'", - "'with'", "'position'", "'break'", "'loop'", "'continue'", "'exit'", - "'returning'", "'while'", null, "'?'", "'null'" + null, "';'", "'module'", "'='", "'$'", "':='", "'{'", "'}'", "'('", "')'", + "'*'", "'|'", "'%'", "','", "'ordering'", "'ordered'", "'decimal-format'", + "':'", "'decimal-separator'", "'grouping-separator'", "'infinity'", "'minus-sign'", + "'NaN'", "'percent'", "'per-mille'", "'zero-digit'", "'digit'", "'pattern-separator'", + "'external'", "'function'", "'jsound'", "'compact'", "'verbose'", "'eq'", + "'ne'", "'lt'", "'le'", "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'", + "'>='", "'||'", "'+'", "'-'", "'div'", "'idiv'", "'mod'", "'!'", "'['", + "']'", "'.'", "'$$'", "'#'", "'..'", "'{|'", "'|}'", "'for'", "'let'", + "'where'", "'group'", "'by'", "'order'", "'return'", "'if'", "'in'", + "'as'", "'at'", "'allowing'", "'empty'", "'count'", "'stable'", "'ascending'", + "'descending'", "'some'", "'every'", "'satisfies'", "'collation'", "'greatest'", + "'least'", "'switch'", "'case'", "'try'", "'catch'", "'default'", "'then'", + "'else'", "'typeswitch'", "'or'", "'and'", "'not'", "'to'", "'instance'", + "'of'", "'statically'", "'is'", "'treat'", "'cast'", "'castable'", "'version'", + "'jsoniq'", "'unordered'", "'true'", "'false'", "'type'", "'validate'", + "'annotate'", "'declare'", "'context'", "'item'", "'variable'", "'insert'", + "'delete'", "'rename'", "'replace'", "'copy'", "'modify'", "'append'", + "'into'", "'value'", "'json'", "'with'", "'position'", "'break'", "'loop'", + "'continue'", "'exit'", "'returning'", "'while'", "'import'", "'schema'", + "'namespace'", "'element'", "'/'", "'//'", "'@'", "'child'", "'descendant'", + "'attribute'", "'self'", "'descendant-or-self'", "'following-sibling'", + "'following'", "'parent'", "'ancestor'", "'preceding-sibling'", "'preceding'", + "'ancestor-or-self'", "'node'", "'binary'", "'document'", "'document-node'", + "'text'", "'processing-instruction'", "'namespace-node'", "'schema-attribute'", + "'schema-element'", "'array-node'", "'boolean-node'", "'null-node'", + "'number-node'", "'object-node'", "'comment'", "'array'", "'map'", null, + "'?'", "'null'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -146,19 +188,25 @@ private static String[] makeSymbolicNames() { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", - "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", - "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", - "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", - "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", - "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", - "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", - "Kdeclare", "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename", - "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson", - "Kwith", "Kposition", "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning", - "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral", "Literal", - "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", + null, null, null, null, null, null, null, null, null, null, null, "Kfor", + "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", "Kif", "Kin", + "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", "Kascending", + "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", "Kgreatest", + "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", "Kthen", + "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", "Kof", + "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", "Kjsoniq", + "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", "Kdeclare", + "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename", "Kreplace", + "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson", "Kwith", "Kposition", + "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning", "Kwhile", "Kimport", + "Kschema", "Knamespace", "Kelement", "Kslash", "Kdslash", "Kat_symbol", + "Kchild", "Kdescendant", "Kattribute", "Kself", "Kdescendant_or_self", + "Kfollowing_sibling", "Kfollowing", "Kparent", "Kancestor", "Kpreceding_sibling", + "Kpreceding", "Kancestor_or_self", "Knode", "Kbinary", "Kdocument", "Kdocument_node", + "Ktext", "Kpi", "Knamespace_node", "Kschema_attribute", "Kschema_element", + "Karray_node", "Kboolean_node", "Knull_node", "Knumber_node", "Kobject_node", + "Kcomment", "Karray", "Kmap", "STRING", "ArgumentPlaceholder", "NullLiteral", + "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "WS", "NCName", "XQComment", "ContentChar" }; } @@ -235,9 +283,9 @@ public final ModuleAndThisIsItContext moduleAndThisIsIt() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(254); + setState(358); module(); - setState(255); + setState(359); match(EOF); } } @@ -283,44 +331,43 @@ public final ModuleContext module() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(262); + setState(366); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,0,_ctx) ) { case 1: { - setState(257); + setState(361); match(Kjsoniq); - setState(258); + setState(362); match(Kversion); - setState(259); + setState(363); ((ModuleContext)_localctx).vers = stringLiteral(); - setState(260); + setState(364); match(T__0); } break; } - setState(266); + setState(370); _errHandler.sync(this); switch (_input.LA(1)) { case T__1: { - setState(264); + setState(368); libraryModule(); } break; case EOF: - case T__4: - case T__6: - case T__8: - case T__12: - case T__15: + case T__3: + case T__5: + case T__7: + case T__11: + case T__14: case T__28: - case T__30: - case T__47: - case T__48: + case T__44: + case T__45: + case T__50: case T__53: case T__56: - case T__58: case Kfor: case Klet: case Kwhere: @@ -393,12 +440,13 @@ public final ModuleContext module() throws RecognitionException { case Kexit: case Kreturning: case Kwhile: + case Kimport: case STRING: case NullLiteral: case Literal: case NCName: { - setState(265); + setState(369); ((ModuleContext)_localctx).main = mainModule(); } break; @@ -442,9 +490,9 @@ public final MainModuleContext mainModule() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(268); + setState(372); prolog(); - setState(269); + setState(373); program(); } } @@ -460,6 +508,7 @@ public final MainModuleContext mainModule() throws RecognitionException { } public static class LibraryModuleContext extends ParserRuleContext { + public TerminalNode Knamespace() { return getToken(JsoniqParser.Knamespace, 0); } public TerminalNode NCName() { return getToken(JsoniqParser.NCName, 0); } public UriLiteralContext uriLiteral() { return getRuleContext(UriLiteralContext.class,0); @@ -484,19 +533,19 @@ public final LibraryModuleContext libraryModule() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(271); + setState(375); match(T__1); - setState(272); - match(T__2); - setState(273); + setState(376); + match(Knamespace); + setState(377); match(NCName); - setState(274); - match(T__3); - setState(275); + setState(378); + match(T__2); + setState(379); uriLiteral(); - setState(276); + setState(380); match(T__0); - setState(277); + setState(381); prolog(); } } @@ -554,59 +603,59 @@ public final PrologContext prolog() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(288); + setState(392); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,3,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(282); + setState(386); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { case 1: { - setState(279); + setState(383); setter(); } break; case 2: { - setState(280); + setState(384); namespaceDecl(); } break; case 3: { - setState(281); + setState(385); moduleImport(); } break; } - setState(284); + setState(388); match(T__0); } } } - setState(290); + setState(394); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,3,_ctx); } - setState(296); + setState(400); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,4,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(291); + setState(395); annotatedDecl(); - setState(292); + setState(396); match(T__0); } } } - setState(298); + setState(402); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,4,_ctx); } @@ -644,7 +693,7 @@ public final ProgramContext program() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(299); + setState(403); statementsAndOptionalExpr(); } } @@ -684,19 +733,19 @@ public final StatementsContext statements() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(304); + setState(408); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,5,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(301); + setState(405); statement(); } } } - setState(306); + setState(410); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,5,_ctx); } @@ -737,9 +786,9 @@ public final StatementsAndExprContext statementsAndExpr() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(307); + setState(411); statements(); - setState(308); + setState(412); expr(); } } @@ -779,14 +828,14 @@ public final StatementsAndOptionalExprContext statementsAndOptionalExpr() throws try { enterOuterAlt(_localctx, 1); { - setState(310); + setState(414); statements(); - setState(312); + setState(416); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(311); + setState(415); expr(); } } @@ -859,97 +908,97 @@ public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 18, RULE_statement); try { - setState(327); + setState(431); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(314); + setState(418); applyStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(315); + setState(419); assignStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(316); + setState(420); blockStatement(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(317); + setState(421); breakStatement(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(318); + setState(422); continueStatement(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(319); + setState(423); exitStatement(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(320); + setState(424); flowrStatement(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(321); + setState(425); ifStatement(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(322); + setState(426); switchStatement(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(323); + setState(427); tryCatchStatement(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(324); + setState(428); typeSwitchStatement(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(325); + setState(429); varDeclStatement(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(326); + setState(430); whileStatement(); } break; @@ -987,9 +1036,9 @@ public final ApplyStatementContext applyStatement() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(329); + setState(433); exprSimple(); - setState(330); + setState(434); match(T__0); } } @@ -1028,15 +1077,15 @@ public final AssignStatementContext assignStatement() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(332); - match(T__4); - setState(333); + setState(436); + match(T__3); + setState(437); qname(); - setState(334); - match(T__5); - setState(335); + setState(438); + match(T__4); + setState(439); exprSingle(); - setState(336); + setState(440); match(T__0); } } @@ -1072,12 +1121,12 @@ public final BlockStatementContext blockStatement() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(338); - match(T__6); - setState(339); + setState(442); + match(T__5); + setState(443); statements(); - setState(340); - match(T__7); + setState(444); + match(T__6); } } catch (RecognitionException re) { @@ -1111,11 +1160,11 @@ public final BreakStatementContext breakStatement() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(342); + setState(446); match(Kbreak); - setState(343); + setState(447); match(Kloop); - setState(344); + setState(448); match(T__0); } } @@ -1150,11 +1199,11 @@ public final ContinueStatementContext continueStatement() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(346); + setState(450); match(Kcontinue); - setState(347); + setState(451); match(Kloop); - setState(348); + setState(452); match(T__0); } } @@ -1192,13 +1241,13 @@ public final ExitStatementContext exitStatement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(350); + setState(454); match(Kexit); - setState(351); + setState(455); match(Kreturning); - setState(352); + setState(456); exprSingle(); - setState(353); + setState(457); match(T__0); } } @@ -1275,66 +1324,66 @@ public final FlowrStatementContext flowrStatement() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(357); + setState(461); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: { - setState(355); + setState(459); ((FlowrStatementContext)_localctx).start_for = forClause(); } break; case Klet: { - setState(356); + setState(460); ((FlowrStatementContext)_localctx).start_let = letClause(); } break; default: throw new NoViableAltException(this); } - setState(367); + setState(471); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & ((1L << (Kfor - 61)) | (1L << (Klet - 61)) | (1L << (Kwhere - 61)) | (1L << (Kgroup - 61)) | (1L << (Korder - 61)) | (1L << (Kcount - 61)) | (1L << (Kstable - 61)))) != 0)) { + while (((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (Kfor - 59)) | (1L << (Klet - 59)) | (1L << (Kwhere - 59)) | (1L << (Kgroup - 59)) | (1L << (Korder - 59)) | (1L << (Kcount - 59)) | (1L << (Kstable - 59)))) != 0)) { { - setState(365); + setState(469); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: { - setState(359); + setState(463); forClause(); } break; case Klet: { - setState(360); + setState(464); letClause(); } break; case Kwhere: { - setState(361); + setState(465); whereClause(); } break; case Kgroup: { - setState(362); + setState(466); groupByClause(); } break; case Korder: case Kstable: { - setState(363); + setState(467); orderByClause(); } break; case Kcount: { - setState(364); + setState(468); countClause(); } break; @@ -1342,13 +1391,13 @@ public final FlowrStatementContext flowrStatement() throws RecognitionException throw new NoViableAltException(this); } } - setState(369); + setState(473); _errHandler.sync(this); _la = _input.LA(1); } - setState(370); + setState(474); match(Kreturn); - setState(371); + setState(475); ((FlowrStatementContext)_localctx).returnStmt = statement(); } } @@ -1396,21 +1445,21 @@ public final IfStatementContext ifStatement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(373); + setState(477); match(Kif); - setState(374); - match(T__8); - setState(375); + setState(478); + match(T__7); + setState(479); ((IfStatementContext)_localctx).test_expr = expr(); - setState(376); - match(T__9); - setState(377); + setState(480); + match(T__8); + setState(481); match(Kthen); - setState(378); + setState(482); ((IfStatementContext)_localctx).branch = statement(); - setState(379); + setState(483); match(Kelse); - setState(380); + setState(484); ((IfStatementContext)_localctx).else_branch = statement(); } } @@ -1463,34 +1512,34 @@ public final SwitchStatementContext switchStatement() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(382); + setState(486); match(Kswitch); - setState(383); - match(T__8); - setState(384); + setState(487); + match(T__7); + setState(488); ((SwitchStatementContext)_localctx).condExpr = expr(); - setState(385); - match(T__9); - setState(387); + setState(489); + match(T__8); + setState(491); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(386); + setState(490); ((SwitchStatementContext)_localctx).switchCaseStatement = switchCaseStatement(); ((SwitchStatementContext)_localctx).cases.add(((SwitchStatementContext)_localctx).switchCaseStatement); } } - setState(389); + setState(493); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(391); + setState(495); match(Kdefault); - setState(392); + setState(496); match(Kreturn); - setState(393); + setState(497); ((SwitchStatementContext)_localctx).def = statement(); } } @@ -1541,26 +1590,26 @@ public final SwitchCaseStatementContext switchCaseStatement() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(397); + setState(501); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(395); + setState(499); match(Kcase); - setState(396); + setState(500); ((SwitchCaseStatementContext)_localctx).exprSingle = exprSingle(); ((SwitchCaseStatementContext)_localctx).cond.add(((SwitchCaseStatementContext)_localctx).exprSingle); } } - setState(399); + setState(503); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(401); + setState(505); match(Kreturn); - setState(402); + setState(506); ((SwitchCaseStatementContext)_localctx).ret = statement(); } } @@ -1607,11 +1656,11 @@ public final TryCatchStatementContext tryCatchStatement() throws RecognitionExce int _alt; enterOuterAlt(_localctx, 1); { - setState(404); + setState(508); match(Ktry); - setState(405); + setState(509); ((TryCatchStatementContext)_localctx).try_block = blockStatement(); - setState(407); + setState(511); _errHandler.sync(this); _alt = 1; do { @@ -1619,7 +1668,7 @@ public final TryCatchStatementContext tryCatchStatement() throws RecognitionExce case 1: { { - setState(406); + setState(510); ((TryCatchStatementContext)_localctx).catchCaseStatement = catchCaseStatement(); ((TryCatchStatementContext)_localctx).catches.add(((TryCatchStatementContext)_localctx).catchCaseStatement); } @@ -1628,7 +1677,7 @@ public final TryCatchStatementContext tryCatchStatement() throws RecognitionExce default: throw new NoViableAltException(this); } - setState(409); + setState(513); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,13,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -1646,7 +1695,7 @@ public final TryCatchStatementContext tryCatchStatement() throws RecognitionExce } public static class CatchCaseStatementContext extends ParserRuleContext { - public Token s11; + public Token s10; public List jokers = new ArrayList(); public QnameContext qname; public List errors = new ArrayList(); @@ -1679,16 +1728,16 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(411); + setState(515); match(Kcatch); - setState(414); + setState(518); _errHandler.sync(this); switch (_input.LA(1)) { - case T__10: + case T__9: { - setState(412); - ((CatchCaseStatementContext)_localctx).s11 = match(T__10); - ((CatchCaseStatementContext)_localctx).jokers.add(((CatchCaseStatementContext)_localctx).s11); + setState(516); + ((CatchCaseStatementContext)_localctx).s10 = match(T__9); + ((CatchCaseStatementContext)_localctx).jokers.add(((CatchCaseStatementContext)_localctx).s10); } break; case Kfor: @@ -1766,7 +1815,7 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx case NullLiteral: case NCName: { - setState(413); + setState(517); ((CatchCaseStatementContext)_localctx).qname = qname(); ((CatchCaseStatementContext)_localctx).errors.add(((CatchCaseStatementContext)_localctx).qname); } @@ -1774,22 +1823,22 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx default: throw new NoViableAltException(this); } - setState(423); + setState(527); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__11) { + while (_la==T__10) { { { - setState(416); - match(T__11); - setState(419); + setState(520); + match(T__10); + setState(523); _errHandler.sync(this); switch (_input.LA(1)) { - case T__10: + case T__9: { - setState(417); - ((CatchCaseStatementContext)_localctx).s11 = match(T__10); - ((CatchCaseStatementContext)_localctx).jokers.add(((CatchCaseStatementContext)_localctx).s11); + setState(521); + ((CatchCaseStatementContext)_localctx).s10 = match(T__9); + ((CatchCaseStatementContext)_localctx).jokers.add(((CatchCaseStatementContext)_localctx).s10); } break; case Kfor: @@ -1867,7 +1916,7 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx case NullLiteral: case NCName: { - setState(418); + setState(522); ((CatchCaseStatementContext)_localctx).qname = qname(); ((CatchCaseStatementContext)_localctx).errors.add(((CatchCaseStatementContext)_localctx).qname); } @@ -1877,11 +1926,11 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx } } } - setState(425); + setState(529); _errHandler.sync(this); _la = _input.LA(1); } - setState(426); + setState(530); ((CatchCaseStatementContext)_localctx).catch_block = blockStatement(); } } @@ -1938,44 +1987,44 @@ public final TypeSwitchStatementContext typeSwitchStatement() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(428); + setState(532); match(Ktypeswitch); - setState(429); - match(T__8); - setState(430); + setState(533); + match(T__7); + setState(534); ((TypeSwitchStatementContext)_localctx).cond = expr(); - setState(431); - match(T__9); - setState(433); + setState(535); + match(T__8); + setState(537); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(432); + setState(536); ((TypeSwitchStatementContext)_localctx).caseStatement = caseStatement(); ((TypeSwitchStatementContext)_localctx).cases.add(((TypeSwitchStatementContext)_localctx).caseStatement); } } - setState(435); + setState(539); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(437); + setState(541); match(Kdefault); - setState(439); + setState(543); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__4) { + if (_la==T__3) { { - setState(438); + setState(542); ((TypeSwitchStatementContext)_localctx).var_ref = varRef(); } } - setState(441); + setState(545); match(Kreturn); - setState(442); + setState(546); ((TypeSwitchStatementContext)_localctx).def = statement(); } } @@ -2028,43 +2077,43 @@ public final CaseStatementContext caseStatement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(444); + setState(548); match(Kcase); - setState(448); + setState(552); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__4) { + if (_la==T__3) { { - setState(445); + setState(549); ((CaseStatementContext)_localctx).var_ref = varRef(); - setState(446); + setState(550); match(Kas); } } - setState(450); + setState(554); ((CaseStatementContext)_localctx).sequenceType = sequenceType(); ((CaseStatementContext)_localctx).union.add(((CaseStatementContext)_localctx).sequenceType); - setState(455); + setState(559); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__11) { + while (_la==T__10) { { { - setState(451); - match(T__11); - setState(452); + setState(555); + match(T__10); + setState(556); ((CaseStatementContext)_localctx).sequenceType = sequenceType(); ((CaseStatementContext)_localctx).union.add(((CaseStatementContext)_localctx).sequenceType); } } - setState(457); + setState(561); _errHandler.sync(this); _la = _input.LA(1); } - setState(458); + setState(562); match(Kreturn); - setState(459); + setState(563); ((CaseStatementContext)_localctx).ret = statement(); } } @@ -2106,37 +2155,37 @@ public final AnnotationContext annotation() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(461); - match(T__12); - setState(462); + setState(565); + match(T__11); + setState(566); ((AnnotationContext)_localctx).name = qname(); - setState(473); + setState(577); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__8) { + if (_la==T__7) { { - setState(463); - match(T__8); - setState(464); + setState(567); + match(T__7); + setState(568); match(Literal); - setState(469); + setState(573); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + while (_la==T__12) { { { - setState(465); - match(T__13); - setState(466); + setState(569); + match(T__12); + setState(570); match(Literal); } } - setState(471); + setState(575); _errHandler.sync(this); _la = _input.LA(1); } - setState(472); - match(T__9); + setState(576); + match(T__8); } } @@ -2178,17 +2227,17 @@ public final AnnotationsContext annotations() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(478); + setState(582); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__12) { + while (_la==T__11) { { { - setState(475); + setState(579); annotation(); } } - setState(480); + setState(584); _errHandler.sync(this); _la = _input.LA(1); } @@ -2234,29 +2283,29 @@ public final VarDeclStatementContext varDeclStatement() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(481); + setState(585); annotations(); - setState(482); + setState(586); match(Kvariable); - setState(483); + setState(587); varDeclForStatement(); - setState(488); + setState(592); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + while (_la==T__12) { { { - setState(484); - match(T__13); - setState(485); + setState(588); + match(T__12); + setState(589); varDeclForStatement(); } } - setState(490); + setState(594); _errHandler.sync(this); _la = _input.LA(1); } - setState(491); + setState(595); match(T__0); } } @@ -2303,28 +2352,28 @@ public final VarDeclForStatementContext varDeclForStatement() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(493); + setState(597); ((VarDeclForStatementContext)_localctx).var_ref = varRef(); - setState(496); + setState(600); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(494); + setState(598); match(Kas); - setState(495); + setState(599); sequenceType(); } } - setState(500); + setState(604); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__5) { + if (_la==T__4) { { - setState(498); - match(T__5); - setState(499); + setState(602); + match(T__4); + setState(603); ((VarDeclForStatementContext)_localctx).exprSingle = exprSingle(); ((VarDeclForStatementContext)_localctx).expr_vals.add(((VarDeclForStatementContext)_localctx).exprSingle); } @@ -2370,15 +2419,15 @@ public final WhileStatementContext whileStatement() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(502); + setState(606); match(Kwhile); - setState(503); - match(T__8); - setState(504); + setState(607); + match(T__7); + setState(608); ((WhileStatementContext)_localctx).test_expr = expr(); - setState(505); - match(T__9); - setState(506); + setState(609); + match(T__8); + setState(610); ((WhileStatementContext)_localctx).stmt = statement(); } } @@ -2421,34 +2470,34 @@ public final SetterContext setter() throws RecognitionException { SetterContext _localctx = new SetterContext(_ctx, getState()); enterRule(_localctx, 58, RULE_setter); try { - setState(512); + setState(616); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(508); + setState(612); defaultCollationDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(509); + setState(613); orderingModeDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(510); + setState(614); emptyOrderDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(511); + setState(615); decimalFormatDecl(); } break; @@ -2467,6 +2516,7 @@ public final SetterContext setter() throws RecognitionException { public static class NamespaceDeclContext extends ParserRuleContext { public TerminalNode Kdeclare() { return getToken(JsoniqParser.Kdeclare, 0); } + public TerminalNode Knamespace() { return getToken(JsoniqParser.Knamespace, 0); } public TerminalNode NCName() { return getToken(JsoniqParser.NCName, 0); } public UriLiteralContext uriLiteral() { return getRuleContext(UriLiteralContext.class,0); @@ -2488,15 +2538,15 @@ public final NamespaceDeclContext namespaceDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(514); + setState(618); match(Kdeclare); - setState(515); - match(T__2); - setState(516); + setState(619); + match(Knamespace); + setState(620); match(NCName); - setState(517); - match(T__3); - setState(518); + setState(621); + match(T__2); + setState(622); uriLiteral(); } } @@ -2539,34 +2589,34 @@ public final AnnotatedDeclContext annotatedDecl() throws RecognitionException { AnnotatedDeclContext _localctx = new AnnotatedDeclContext(_ctx, getState()); enterRule(_localctx, 62, RULE_annotatedDecl); try { - setState(524); + setState(628); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(520); + setState(624); functionDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(521); + setState(625); varDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(522); + setState(626); typeDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(523); + setState(627); contextItemDecl(); } break; @@ -2607,13 +2657,13 @@ public final DefaultCollationDeclContext defaultCollationDecl() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(526); + setState(630); match(Kdeclare); - setState(527); + setState(631); match(Kdefault); - setState(528); + setState(632); match(Kcollation); - setState(529); + setState(633); uriLiteral(); } } @@ -2649,13 +2699,13 @@ public final OrderingModeDeclContext orderingModeDecl() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(531); + setState(635); match(Kdeclare); - setState(532); - match(T__14); - setState(533); + setState(636); + match(T__13); + setState(637); _la = _input.LA(1); - if ( !(_la==T__15 || _la==Kunordered) ) { + if ( !(_la==T__14 || _la==Kunordered) ) { _errHandler.recoverInline(this); } else { @@ -2702,16 +2752,16 @@ public final EmptyOrderDeclContext emptyOrderDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(535); + setState(639); match(Kdeclare); - setState(536); + setState(640); match(Kdefault); - setState(537); + setState(641); match(Korder); - setState(538); + setState(642); match(Kempty); { - setState(539); + setState(643); ((EmptyOrderDeclContext)_localctx).emptySequenceOrder = _input.LT(1); _la = _input.LA(1); if ( !(_la==Kgreatest || _la==Kleast) ) { @@ -2772,17 +2822,17 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(541); + setState(645); match(Kdeclare); - setState(546); + setState(650); _errHandler.sync(this); switch (_input.LA(1)) { - case T__16: + case T__15: { { - setState(542); - match(T__16); - setState(543); + setState(646); + match(T__15); + setState(647); qname(); } } @@ -2790,31 +2840,31 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce case Kdefault: { { - setState(544); + setState(648); match(Kdefault); - setState(545); - match(T__16); + setState(649); + match(T__15); } } break; default: throw new NoViableAltException(this); } - setState(554); + setState(658); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26))) != 0)) { { { - setState(548); + setState(652); dfPropertyName(); - setState(549); - match(T__3); - setState(550); + setState(653); + match(T__2); + setState(654); stringLiteral(); } } - setState(556); + setState(660); _errHandler.sync(this); _la = _input.LA(1); } @@ -2863,17 +2913,17 @@ public final QnameContext qname() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(562); + setState(666); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { case 1: { - setState(559); + setState(663); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(557); + setState(661); ((QnameContext)_localctx).ns = match(NCName); } break; @@ -2951,24 +3001,24 @@ public final QnameContext qname() throws RecognitionException { case Kwhile: case NullLiteral: { - setState(558); + setState(662); ((QnameContext)_localctx).nskw = keyWords(); } break; default: throw new NoViableAltException(this); } - setState(561); - match(T__17); + setState(665); + match(T__16); } break; } - setState(566); + setState(670); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(564); + setState(668); ((QnameContext)_localctx).local_name = match(NCName); } break; @@ -3046,7 +3096,7 @@ public final QnameContext qname() throws RecognitionException { case Kwhile: case NullLiteral: { - setState(565); + setState(669); ((QnameContext)_localctx).local_namekw = keyWords(); } break; @@ -3085,9 +3135,9 @@ public final DfPropertyNameContext dfPropertyName() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(568); + setState(672); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -3111,12 +3161,14 @@ public final DfPropertyNameContext dfPropertyName() throws RecognitionException public static class ModuleImportContext extends ParserRuleContext { public Token prefix; public UriLiteralContext targetNamespace; + public TerminalNode Kimport() { return getToken(JsoniqParser.Kimport, 0); } public List uriLiteral() { return getRuleContexts(UriLiteralContext.class); } public UriLiteralContext uriLiteral(int i) { return getRuleContext(UriLiteralContext.class,i); } + public TerminalNode Knamespace() { return getToken(JsoniqParser.Knamespace, 0); } public TerminalNode Kat() { return getToken(JsoniqParser.Kat, 0); } public TerminalNode NCName() { return getToken(JsoniqParser.NCName, 0); } public ModuleImportContext(ParserRuleContext parent, int invokingState) { @@ -3137,48 +3189,48 @@ public final ModuleImportContext moduleImport() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(570); - match(T__28); - setState(571); + setState(674); + match(Kimport); + setState(675); match(T__1); - setState(575); + setState(679); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__2) { + if (_la==Knamespace) { { - setState(572); - match(T__2); - setState(573); + setState(676); + match(Knamespace); + setState(677); ((ModuleImportContext)_localctx).prefix = match(NCName); - setState(574); - match(T__3); + setState(678); + match(T__2); } } - setState(577); + setState(681); ((ModuleImportContext)_localctx).targetNamespace = uriLiteral(); - setState(587); + setState(691); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kat) { { - setState(578); + setState(682); match(Kat); - setState(579); + setState(683); uriLiteral(); - setState(584); + setState(688); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + while (_la==T__12) { { { - setState(580); - match(T__13); - setState(581); + setState(684); + match(T__12); + setState(685); uriLiteral(); } } - setState(586); + setState(690); _errHandler.sync(this); _la = _input.LA(1); } @@ -3233,52 +3285,52 @@ public final VarDeclContext varDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(589); + setState(693); match(Kdeclare); - setState(590); + setState(694); annotations(); - setState(591); + setState(695); match(Kvariable); - setState(592); + setState(696); varRef(); - setState(595); + setState(699); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(593); + setState(697); match(Kas); - setState(594); + setState(698); sequenceType(); } } - setState(604); + setState(708); _errHandler.sync(this); switch (_input.LA(1)) { - case T__5: + case T__4: { { - setState(597); - match(T__5); - setState(598); + setState(701); + match(T__4); + setState(702); exprSingle(); } } break; - case T__29: + case T__27: { { - setState(599); - ((VarDeclContext)_localctx).external = match(T__29); - setState(602); + setState(703); + ((VarDeclContext)_localctx).external = match(T__27); + setState(706); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__5) { + if (_la==T__4) { { - setState(600); - match(T__5); - setState(601); + setState(704); + match(T__4); + setState(705); exprSingle(); } } @@ -3332,50 +3384,50 @@ public final ContextItemDeclContext contextItemDecl() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(606); + setState(710); match(Kdeclare); - setState(607); + setState(711); match(Kcontext); - setState(608); + setState(712); match(Kitem); - setState(611); + setState(715); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(609); + setState(713); match(Kas); - setState(610); + setState(714); sequenceType(); } } - setState(620); + setState(724); _errHandler.sync(this); switch (_input.LA(1)) { - case T__5: + case T__4: { { - setState(613); - match(T__5); - setState(614); + setState(717); + match(T__4); + setState(718); exprSingle(); } } break; - case T__29: + case T__27: { { - setState(615); - ((ContextItemDeclContext)_localctx).external = match(T__29); - setState(618); + setState(719); + ((ContextItemDeclContext)_localctx).external = match(T__27); + setState(722); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__5) { + if (_la==T__4) { { - setState(616); - match(T__5); - setState(617); + setState(720); + match(T__4); + setState(721); exprSingle(); } } @@ -3438,59 +3490,59 @@ public final FunctionDeclContext functionDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(622); + setState(726); match(Kdeclare); - setState(623); + setState(727); annotations(); - setState(624); - match(T__30); - setState(625); + setState(728); + match(T__28); + setState(729); ((FunctionDeclContext)_localctx).fn_name = qname(); - setState(626); - match(T__8); - setState(628); + setState(730); + match(T__7); + setState(732); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__4) { + if (_la==T__3) { { - setState(627); + setState(731); paramList(); } } - setState(630); - match(T__9); - setState(633); + setState(734); + match(T__8); + setState(737); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(631); + setState(735); match(Kas); - setState(632); + setState(736); ((FunctionDeclContext)_localctx).return_type = sequenceType(); } } - setState(640); + setState(744); _errHandler.sync(this); switch (_input.LA(1)) { - case T__6: + case T__5: { - setState(635); - match(T__6); + setState(739); + match(T__5); { - setState(636); + setState(740); ((FunctionDeclContext)_localctx).fn_body = statementsAndOptionalExpr(); } - setState(637); - match(T__7); + setState(741); + match(T__6); } break; - case T__29: + case T__27: { - setState(639); - match(T__29); + setState(743); + match(T__27); } break; default: @@ -3542,25 +3594,25 @@ public final TypeDeclContext typeDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(642); + setState(746); match(Kdeclare); - setState(643); + setState(747); match(Ktype); - setState(644); + setState(748); ((TypeDeclContext)_localctx).type_name = qname(); - setState(645); + setState(749); match(Kas); - setState(647); + setState(751); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { case 1: { - setState(646); + setState(750); ((TypeDeclContext)_localctx).schema = schemaLanguage(); } break; } - setState(649); + setState(753); ((TypeDeclContext)_localctx).type_definition = exprSingle(); } } @@ -3577,6 +3629,7 @@ public final TypeDeclContext typeDecl() throws RecognitionException { public static class SchemaLanguageContext extends ParserRuleContext { public TerminalNode Kjson() { return getToken(JsoniqParser.Kjson, 0); } + public TerminalNode Kschema() { return getToken(JsoniqParser.Kschema, 0); } public SchemaLanguageContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -3592,34 +3645,34 @@ public final SchemaLanguageContext schemaLanguage() throws RecognitionException SchemaLanguageContext _localctx = new SchemaLanguageContext(_ctx, getState()); enterRule(_localctx, 86, RULE_schemaLanguage); try { - setState(657); + setState(761); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(651); - match(T__31); - setState(652); - match(T__32); + setState(755); + match(T__29); + setState(756); + match(T__30); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(653); + setState(757); + match(T__29); + setState(758); match(T__31); - setState(654); - match(T__33); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(655); + setState(759); match(Kjson); - setState(656); - match(T__34); + setState(760); + match(Kschema); } break; } @@ -3660,21 +3713,21 @@ public final ParamListContext paramList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(659); + setState(763); param(); - setState(664); + setState(768); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + while (_la==T__12) { { { - setState(660); - match(T__13); - setState(661); + setState(764); + match(T__12); + setState(765); param(); } } - setState(666); + setState(770); _errHandler.sync(this); _la = _input.LA(1); } @@ -3717,18 +3770,18 @@ public final ParamContext param() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(667); - match(T__4); - setState(668); + setState(771); + match(T__3); + setState(772); qname(); - setState(671); + setState(775); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(669); + setState(773); match(Kas); - setState(670); + setState(774); sequenceType(); } } @@ -3771,21 +3824,21 @@ public final ExprContext expr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(673); + setState(777); exprSingle(); - setState(678); + setState(782); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + while (_la==T__12) { { { - setState(674); - match(T__13); - setState(675); + setState(778); + match(T__12); + setState(779); exprSingle(); } } - setState(680); + setState(784); _errHandler.sync(this); _la = _input.LA(1); } @@ -3836,48 +3889,48 @@ public final ExprSingleContext exprSingle() throws RecognitionException { ExprSingleContext _localctx = new ExprSingleContext(_ctx, getState()); enterRule(_localctx, 94, RULE_exprSingle); try { - setState(687); + setState(791); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(681); + setState(785); exprSimple(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(682); + setState(786); flowrExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(683); + setState(787); switchExpr(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(684); + setState(788); typeSwitchExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(685); + setState(789); ifExpr(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(686); + setState(790); tryCatchExpr(); } break; @@ -3934,62 +3987,62 @@ public final ExprSimpleContext exprSimple() throws RecognitionException { ExprSimpleContext _localctx = new ExprSimpleContext(_ctx, getState()); enterRule(_localctx, 96, RULE_exprSimple); try { - setState(697); + setState(801); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(689); + setState(793); quantifiedExpr(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(690); + setState(794); orExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(691); + setState(795); insertExpr(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(692); + setState(796); deleteExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(693); + setState(797); renameExpr(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(694); + setState(798); replaceExpr(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(695); + setState(799); transformExpr(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(696); + setState(800); appendExpr(); } break; @@ -4068,66 +4121,66 @@ public final FlowrExprContext flowrExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(701); + setState(805); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: { - setState(699); + setState(803); ((FlowrExprContext)_localctx).start_for = forClause(); } break; case Klet: { - setState(700); + setState(804); ((FlowrExprContext)_localctx).start_let = letClause(); } break; default: throw new NoViableAltException(this); } - setState(711); + setState(815); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & ((1L << (Kfor - 61)) | (1L << (Klet - 61)) | (1L << (Kwhere - 61)) | (1L << (Kgroup - 61)) | (1L << (Korder - 61)) | (1L << (Kcount - 61)) | (1L << (Kstable - 61)))) != 0)) { + while (((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (Kfor - 59)) | (1L << (Klet - 59)) | (1L << (Kwhere - 59)) | (1L << (Kgroup - 59)) | (1L << (Korder - 59)) | (1L << (Kcount - 59)) | (1L << (Kstable - 59)))) != 0)) { { - setState(709); + setState(813); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: { - setState(703); + setState(807); forClause(); } break; case Klet: { - setState(704); + setState(808); letClause(); } break; case Kwhere: { - setState(705); + setState(809); whereClause(); } break; case Kgroup: { - setState(706); + setState(810); groupByClause(); } break; case Korder: case Kstable: { - setState(707); + setState(811); orderByClause(); } break; case Kcount: { - setState(708); + setState(812); countClause(); } break; @@ -4135,13 +4188,13 @@ public final FlowrExprContext flowrExpr() throws RecognitionException { throw new NoViableAltException(this); } } - setState(713); + setState(817); _errHandler.sync(this); _la = _input.LA(1); } - setState(714); + setState(818); match(Kreturn); - setState(715); + setState(819); ((FlowrExprContext)_localctx).return_expr = exprSingle(); } } @@ -4184,25 +4237,25 @@ public final ForClauseContext forClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(717); + setState(821); match(Kfor); - setState(718); + setState(822); ((ForClauseContext)_localctx).forVar = forVar(); ((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar); - setState(723); + setState(827); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + while (_la==T__12) { { { - setState(719); - match(T__13); - setState(720); + setState(823); + match(T__12); + setState(824); ((ForClauseContext)_localctx).forVar = forVar(); ((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar); } } - setState(725); + setState(829); _errHandler.sync(this); _la = _input.LA(1); } @@ -4260,47 +4313,47 @@ public final ForVarContext forVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(726); + setState(830); ((ForVarContext)_localctx).var_ref = varRef(); - setState(729); + setState(833); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(727); + setState(831); match(Kas); - setState(728); + setState(832); ((ForVarContext)_localctx).seq = sequenceType(); } } - setState(733); + setState(837); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kallowing) { { - setState(731); + setState(835); ((ForVarContext)_localctx).flag = match(Kallowing); - setState(732); + setState(836); match(Kempty); } } - setState(737); + setState(841); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kat) { { - setState(735); + setState(839); match(Kat); - setState(736); + setState(840); ((ForVarContext)_localctx).at = varRef(); } } - setState(739); + setState(843); match(Kin); - setState(740); + setState(844); ((ForVarContext)_localctx).ex = exprSingle(); } } @@ -4343,25 +4396,25 @@ public final LetClauseContext letClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(742); + setState(846); match(Klet); - setState(743); + setState(847); ((LetClauseContext)_localctx).letVar = letVar(); ((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar); - setState(748); + setState(852); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + while (_la==T__12) { { { - setState(744); - match(T__13); - setState(745); + setState(848); + match(T__12); + setState(849); ((LetClauseContext)_localctx).letVar = letVar(); ((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar); } } - setState(750); + setState(854); _errHandler.sync(this); _la = _input.LA(1); } @@ -4410,23 +4463,23 @@ public final LetVarContext letVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(751); + setState(855); ((LetVarContext)_localctx).var_ref = varRef(); - setState(754); + setState(858); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(752); + setState(856); match(Kas); - setState(753); + setState(857); ((LetVarContext)_localctx).seq = sequenceType(); } } - setState(756); - match(T__5); - setState(757); + setState(860); + match(T__4); + setState(861); ((LetVarContext)_localctx).ex = exprSingle(); } } @@ -4463,9 +4516,9 @@ public final WhereClauseContext whereClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(759); + setState(863); match(Kwhere); - setState(760); + setState(864); exprSingle(); } } @@ -4509,27 +4562,27 @@ public final GroupByClauseContext groupByClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(762); + setState(866); match(Kgroup); - setState(763); + setState(867); match(Kby); - setState(764); + setState(868); ((GroupByClauseContext)_localctx).groupByVar = groupByVar(); ((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar); - setState(769); + setState(873); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + while (_la==T__12) { { { - setState(765); - match(T__13); - setState(766); + setState(869); + match(T__12); + setState(870); ((GroupByClauseContext)_localctx).groupByVar = groupByVar(); ((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar); } } - setState(771); + setState(875); _errHandler.sync(this); _la = _input.LA(1); } @@ -4584,40 +4637,40 @@ public final GroupByVarContext groupByVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(772); + setState(876); ((GroupByVarContext)_localctx).var_ref = varRef(); - setState(779); + setState(883); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__5 || _la==Kas) { + if (_la==T__4 || _la==Kas) { { - setState(775); + setState(879); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(773); + setState(877); match(Kas); - setState(774); + setState(878); ((GroupByVarContext)_localctx).seq = sequenceType(); } } - setState(777); - ((GroupByVarContext)_localctx).decl = match(T__5); - setState(778); + setState(881); + ((GroupByVarContext)_localctx).decl = match(T__4); + setState(882); ((GroupByVarContext)_localctx).ex = exprSingle(); } } - setState(783); + setState(887); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kcollation) { { - setState(781); + setState(885); match(Kcollation); - setState(782); + setState(886); ((GroupByVarContext)_localctx).uri = uriLiteral(); } } @@ -4664,15 +4717,15 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(790); + setState(894); _errHandler.sync(this); switch (_input.LA(1)) { case Korder: { { - setState(785); + setState(889); match(Korder); - setState(786); + setState(890); match(Kby); } } @@ -4680,11 +4733,11 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { case Kstable: { { - setState(787); + setState(891); ((OrderByClauseContext)_localctx).stb = match(Kstable); - setState(788); + setState(892); match(Korder); - setState(789); + setState(893); match(Kby); } } @@ -4692,21 +4745,21 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(792); + setState(896); orderByExpr(); - setState(797); + setState(901); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + while (_la==T__12) { { { - setState(793); - match(T__13); - setState(794); + setState(897); + match(T__12); + setState(898); orderByExpr(); } } - setState(799); + setState(903); _errHandler.sync(this); _la = _input.LA(1); } @@ -4759,24 +4812,24 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(800); + setState(904); ((OrderByExprContext)_localctx).ex = exprSingle(); - setState(803); + setState(907); _errHandler.sync(this); switch (_input.LA(1)) { case Kascending: { - setState(801); + setState(905); match(Kascending); } break; case Kdescending: { - setState(802); + setState(906); ((OrderByExprContext)_localctx).desc = match(Kdescending); } break; - case T__13: + case T__12: case Kfor: case Klet: case Kwhere: @@ -4791,25 +4844,25 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { default: break; } - setState(810); + setState(914); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kempty) { { - setState(805); + setState(909); match(Kempty); - setState(808); + setState(912); _errHandler.sync(this); switch (_input.LA(1)) { case Kgreatest: { - setState(806); + setState(910); ((OrderByExprContext)_localctx).gr = match(Kgreatest); } break; case Kleast: { - setState(807); + setState(911); ((OrderByExprContext)_localctx).ls = match(Kleast); } break; @@ -4819,14 +4872,14 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { } } - setState(814); + setState(918); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kcollation) { { - setState(812); + setState(916); match(Kcollation); - setState(813); + setState(917); ((OrderByExprContext)_localctx).uril = uriLiteral(); } } @@ -4866,9 +4919,9 @@ public final CountClauseContext countClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(816); + setState(920); match(Kcount); - setState(817); + setState(921); varRef(); } } @@ -4918,47 +4971,47 @@ public final QuantifiedExprContext quantifiedExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(821); + setState(925); _errHandler.sync(this); switch (_input.LA(1)) { case Ksome: { - setState(819); + setState(923); ((QuantifiedExprContext)_localctx).so = match(Ksome); } break; case Kevery: { - setState(820); + setState(924); ((QuantifiedExprContext)_localctx).ev = match(Kevery); } break; default: throw new NoViableAltException(this); } - setState(823); + setState(927); ((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar(); ((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar); - setState(828); + setState(932); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + while (_la==T__12) { { { - setState(824); - match(T__13); - setState(825); + setState(928); + match(T__12); + setState(929); ((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar(); ((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar); } } - setState(830); + setState(934); _errHandler.sync(this); _la = _input.LA(1); } - setState(831); + setState(935); match(Ksatisfies); - setState(832); + setState(936); exprSingle(); } } @@ -5003,23 +5056,23 @@ public final QuantifiedExprVarContext quantifiedExprVar() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(834); + setState(938); varRef(); - setState(837); + setState(941); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(835); + setState(939); match(Kas); - setState(836); + setState(940); sequenceType(); } } - setState(839); + setState(943); match(Kin); - setState(840); + setState(944); exprSingle(); } } @@ -5072,34 +5125,34 @@ public final SwitchExprContext switchExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(842); + setState(946); match(Kswitch); - setState(843); - match(T__8); - setState(844); + setState(947); + match(T__7); + setState(948); ((SwitchExprContext)_localctx).cond = expr(); - setState(845); - match(T__9); - setState(847); + setState(949); + match(T__8); + setState(951); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(846); + setState(950); ((SwitchExprContext)_localctx).switchCaseClause = switchCaseClause(); ((SwitchExprContext)_localctx).cases.add(((SwitchExprContext)_localctx).switchCaseClause); } } - setState(849); + setState(953); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(851); + setState(955); match(Kdefault); - setState(852); + setState(956); match(Kreturn); - setState(853); + setState(957); ((SwitchExprContext)_localctx).def = exprSingle(); } } @@ -5147,26 +5200,26 @@ public final SwitchCaseClauseContext switchCaseClause() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(857); + setState(961); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(855); + setState(959); match(Kcase); - setState(856); + setState(960); ((SwitchCaseClauseContext)_localctx).exprSingle = exprSingle(); ((SwitchCaseClauseContext)_localctx).cond.add(((SwitchCaseClauseContext)_localctx).exprSingle); } } - setState(859); + setState(963); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(861); + setState(965); match(Kreturn); - setState(862); + setState(966); ((SwitchCaseClauseContext)_localctx).ret = exprSingle(); } } @@ -5223,44 +5276,44 @@ public final TypeSwitchExprContext typeSwitchExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(864); + setState(968); match(Ktypeswitch); - setState(865); - match(T__8); - setState(866); + setState(969); + match(T__7); + setState(970); ((TypeSwitchExprContext)_localctx).cond = expr(); - setState(867); - match(T__9); - setState(869); + setState(971); + match(T__8); + setState(973); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(868); + setState(972); ((TypeSwitchExprContext)_localctx).caseClause = caseClause(); ((TypeSwitchExprContext)_localctx).cses.add(((TypeSwitchExprContext)_localctx).caseClause); } } - setState(871); + setState(975); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(873); + setState(977); match(Kdefault); - setState(875); + setState(979); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__4) { + if (_la==T__3) { { - setState(874); + setState(978); ((TypeSwitchExprContext)_localctx).var_ref = varRef(); } } - setState(877); + setState(981); match(Kreturn); - setState(878); + setState(982); ((TypeSwitchExprContext)_localctx).def = exprSingle(); } } @@ -5313,43 +5366,43 @@ public final CaseClauseContext caseClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(880); + setState(984); match(Kcase); - setState(884); + setState(988); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__4) { + if (_la==T__3) { { - setState(881); + setState(985); ((CaseClauseContext)_localctx).var_ref = varRef(); - setState(882); + setState(986); match(Kas); } } - setState(886); + setState(990); ((CaseClauseContext)_localctx).sequenceType = sequenceType(); ((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType); - setState(891); + setState(995); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__11) { + while (_la==T__10) { { { - setState(887); - match(T__11); - setState(888); + setState(991); + match(T__10); + setState(992); ((CaseClauseContext)_localctx).sequenceType = sequenceType(); ((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType); } } - setState(893); + setState(997); _errHandler.sync(this); _la = _input.LA(1); } - setState(894); + setState(998); match(Kreturn); - setState(895); + setState(999); ((CaseClauseContext)_localctx).ret = exprSingle(); } } @@ -5397,21 +5450,21 @@ public final IfExprContext ifExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(897); + setState(1001); match(Kif); - setState(898); - match(T__8); - setState(899); + setState(1002); + match(T__7); + setState(1003); ((IfExprContext)_localctx).test_condition = expr(); - setState(900); - match(T__9); - setState(901); + setState(1004); + match(T__8); + setState(1005); match(Kthen); - setState(902); + setState(1006); ((IfExprContext)_localctx).branch = exprSingle(); - setState(903); + setState(1007); match(Kelse); - setState(904); + setState(1008); ((IfExprContext)_localctx).else_branch = exprSingle(); } } @@ -5458,15 +5511,15 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(906); + setState(1010); match(Ktry); - setState(907); - match(T__6); - setState(908); + setState(1011); + match(T__5); + setState(1012); ((TryCatchExprContext)_localctx).try_expression = expr(); - setState(909); - match(T__7); - setState(911); + setState(1013); + match(T__6); + setState(1015); _errHandler.sync(this); _alt = 1; do { @@ -5474,7 +5527,7 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { case 1: { { - setState(910); + setState(1014); ((TryCatchExprContext)_localctx).catchClause = catchClause(); ((TryCatchExprContext)_localctx).catches.add(((TryCatchExprContext)_localctx).catchClause); } @@ -5483,7 +5536,7 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(913); + setState(1017); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,81,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -5501,7 +5554,7 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { } public static class CatchClauseContext extends ParserRuleContext { - public Token s11; + public Token s10; public List jokers = new ArrayList(); public QnameContext qname; public List errors = new ArrayList(); @@ -5534,16 +5587,16 @@ public final CatchClauseContext catchClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(915); + setState(1019); match(Kcatch); - setState(918); + setState(1022); _errHandler.sync(this); switch (_input.LA(1)) { - case T__10: + case T__9: { - setState(916); - ((CatchClauseContext)_localctx).s11 = match(T__10); - ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s11); + setState(1020); + ((CatchClauseContext)_localctx).s10 = match(T__9); + ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s10); } break; case Kfor: @@ -5621,7 +5674,7 @@ public final CatchClauseContext catchClause() throws RecognitionException { case NullLiteral: case NCName: { - setState(917); + setState(1021); ((CatchClauseContext)_localctx).qname = qname(); ((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname); } @@ -5629,22 +5682,22 @@ public final CatchClauseContext catchClause() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(927); + setState(1031); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__11) { + while (_la==T__10) { { { - setState(920); - match(T__11); - setState(923); + setState(1024); + match(T__10); + setState(1027); _errHandler.sync(this); switch (_input.LA(1)) { - case T__10: + case T__9: { - setState(921); - ((CatchClauseContext)_localctx).s11 = match(T__10); - ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s11); + setState(1025); + ((CatchClauseContext)_localctx).s10 = match(T__9); + ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s10); } break; case Kfor: @@ -5722,7 +5775,7 @@ public final CatchClauseContext catchClause() throws RecognitionException { case NullLiteral: case NCName: { - setState(922); + setState(1026); ((CatchClauseContext)_localctx).qname = qname(); ((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname); } @@ -5732,16 +5785,16 @@ public final CatchClauseContext catchClause() throws RecognitionException { } } } - setState(929); + setState(1033); _errHandler.sync(this); _la = _input.LA(1); } - setState(930); - match(T__6); - setState(931); + setState(1034); + match(T__5); + setState(1035); ((CatchClauseContext)_localctx).catch_expression = expr(); - setState(932); - match(T__7); + setState(1036); + match(T__6); } } catch (RecognitionException re) { @@ -5787,24 +5840,24 @@ public final OrExprContext orExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(934); + setState(1038); ((OrExprContext)_localctx).main_expr = andExpr(); - setState(939); + setState(1043); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,85,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(935); + setState(1039); match(Kor); - setState(936); + setState(1040); ((OrExprContext)_localctx).andExpr = andExpr(); ((OrExprContext)_localctx).rhs.add(((OrExprContext)_localctx).andExpr); } } } - setState(941); + setState(1045); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,85,_ctx); } @@ -5853,24 +5906,24 @@ public final AndExprContext andExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(942); + setState(1046); ((AndExprContext)_localctx).main_expr = notExpr(); - setState(947); + setState(1051); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,86,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(943); + setState(1047); match(Kand); - setState(944); + setState(1048); ((AndExprContext)_localctx).notExpr = notExpr(); ((AndExprContext)_localctx).rhs.add(((AndExprContext)_localctx).notExpr); } } } - setState(949); + setState(1053); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,86,_ctx); } @@ -5912,18 +5965,18 @@ public final NotExprContext notExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(951); + setState(1055); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: { - setState(950); + setState(1054); ((NotExprContext)_localctx).Knot = match(Knot); ((NotExprContext)_localctx).op.add(((NotExprContext)_localctx).Knot); } break; } - setState(953); + setState(1057); ((NotExprContext)_localctx).main_expr = comparisonExpr(); } } @@ -5940,19 +5993,19 @@ public final NotExprContext notExpr() throws RecognitionException { public static class ComparisonExprContext extends ParserRuleContext { public StringConcatExprContext main_expr; - public Token s36; + public Token s33; public List op = new ArrayList(); + public Token s34; + public Token s35; + public Token s36; public Token s37; public Token s38; + public Token s3; public Token s39; public Token s40; public Token s41; - public Token s4; public Token s42; public Token s43; - public Token s44; - public Token s45; - public Token s46; public Token _tset1828; public StringConcatExprContext stringConcatExpr; public List rhs = new ArrayList(); @@ -5980,17 +6033,17 @@ public final ComparisonExprContext comparisonExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(955); + setState(1059); ((ComparisonExprContext)_localctx).main_expr = stringConcatExpr(); - setState(958); + setState(1062); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42))) != 0)) { { - setState(956); + setState(1060); ((ComparisonExprContext)_localctx)._tset1828 = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42))) != 0)) ) { ((ComparisonExprContext)_localctx)._tset1828 = (Token)_errHandler.recoverInline(this); } else { @@ -5999,7 +6052,7 @@ public final ComparisonExprContext comparisonExpr() throws RecognitionException consume(); } ((ComparisonExprContext)_localctx).op.add(((ComparisonExprContext)_localctx)._tset1828); - setState(957); + setState(1061); ((ComparisonExprContext)_localctx).stringConcatExpr = stringConcatExpr(); ((ComparisonExprContext)_localctx).rhs.add(((ComparisonExprContext)_localctx).stringConcatExpr); } @@ -6046,22 +6099,22 @@ public final StringConcatExprContext stringConcatExpr() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(960); + setState(1064); ((StringConcatExprContext)_localctx).main_expr = rangeExpr(); - setState(965); + setState(1069); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__46) { + while (_la==T__43) { { { - setState(961); - match(T__46); - setState(962); + setState(1065); + match(T__43); + setState(1066); ((StringConcatExprContext)_localctx).rangeExpr = rangeExpr(); ((StringConcatExprContext)_localctx).rhs.add(((StringConcatExprContext)_localctx).rangeExpr); } } - setState(967); + setState(1071); _errHandler.sync(this); _la = _input.LA(1); } @@ -6106,16 +6159,16 @@ public final RangeExprContext rangeExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(968); + setState(1072); ((RangeExprContext)_localctx).main_expr = additiveExpr(); - setState(971); + setState(1075); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: { - setState(969); + setState(1073); match(Kto); - setState(970); + setState(1074); ((RangeExprContext)_localctx).additiveExpr = additiveExpr(); ((RangeExprContext)_localctx).rhs.add(((RangeExprContext)_localctx).additiveExpr); } @@ -6136,9 +6189,9 @@ public final RangeExprContext rangeExpr() throws RecognitionException { public static class AdditiveExprContext extends ParserRuleContext { public MultiplicativeExprContext main_expr; - public Token s48; + public Token s45; public List op = new ArrayList(); - public Token s49; + public Token s46; public Token _tset1937; public MultiplicativeExprContext multiplicativeExpr; public List rhs = new ArrayList(); @@ -6167,19 +6220,19 @@ public final AdditiveExprContext additiveExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(973); + setState(1077); ((AdditiveExprContext)_localctx).main_expr = multiplicativeExpr(); - setState(978); + setState(1082); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,91,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(974); + setState(1078); ((AdditiveExprContext)_localctx)._tset1937 = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__47 || _la==T__48) ) { + if ( !(_la==T__44 || _la==T__45) ) { ((AdditiveExprContext)_localctx)._tset1937 = (Token)_errHandler.recoverInline(this); } else { @@ -6188,13 +6241,13 @@ public final AdditiveExprContext additiveExpr() throws RecognitionException { consume(); } ((AdditiveExprContext)_localctx).op.add(((AdditiveExprContext)_localctx)._tset1937); - setState(975); + setState(1079); ((AdditiveExprContext)_localctx).multiplicativeExpr = multiplicativeExpr(); ((AdditiveExprContext)_localctx).rhs.add(((AdditiveExprContext)_localctx).multiplicativeExpr); } } } - setState(980); + setState(1084); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,91,_ctx); } @@ -6213,11 +6266,11 @@ public final AdditiveExprContext additiveExpr() throws RecognitionException { public static class MultiplicativeExprContext extends ParserRuleContext { public InstanceOfExprContext main_expr; - public Token s11; + public Token s10; public List op = new ArrayList(); - public Token s50; - public Token s51; - public Token s52; + public Token s47; + public Token s48; + public Token s49; public Token _tset1965; public InstanceOfExprContext instanceOfExpr; public List rhs = new ArrayList(); @@ -6245,18 +6298,18 @@ public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(981); + setState(1085); ((MultiplicativeExprContext)_localctx).main_expr = instanceOfExpr(); - setState(986); + setState(1090); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__49) | (1L << T__50) | (1L << T__51))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) { { { - setState(982); + setState(1086); ((MultiplicativeExprContext)_localctx)._tset1965 = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__49) | (1L << T__50) | (1L << T__51))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) ) { ((MultiplicativeExprContext)_localctx)._tset1965 = (Token)_errHandler.recoverInline(this); } else { @@ -6265,12 +6318,12 @@ public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionEx consume(); } ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1965); - setState(983); + setState(1087); ((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr(); ((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr); } } - setState(988); + setState(1092); _errHandler.sync(this); _la = _input.LA(1); } @@ -6315,18 +6368,18 @@ public final InstanceOfExprContext instanceOfExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(989); + setState(1093); ((InstanceOfExprContext)_localctx).main_expr = isStaticallyExpr(); - setState(993); + setState(1097); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: { - setState(990); + setState(1094); match(Kinstance); - setState(991); + setState(1095); match(Kof); - setState(992); + setState(1096); ((InstanceOfExprContext)_localctx).seq = sequenceType(); } break; @@ -6372,18 +6425,18 @@ public final IsStaticallyExprContext isStaticallyExpr() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(995); + setState(1099); ((IsStaticallyExprContext)_localctx).main_expr = treatExpr(); - setState(999); + setState(1103); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) { case 1: { - setState(996); + setState(1100); match(Kis); - setState(997); + setState(1101); match(Kstatically); - setState(998); + setState(1102); ((IsStaticallyExprContext)_localctx).seq = sequenceType(); } break; @@ -6429,18 +6482,18 @@ public final TreatExprContext treatExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1001); + setState(1105); ((TreatExprContext)_localctx).main_expr = castableExpr(); - setState(1005); + setState(1109); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { case 1: { - setState(1002); + setState(1106); match(Ktreat); - setState(1003); + setState(1107); match(Kas); - setState(1004); + setState(1108); ((TreatExprContext)_localctx).seq = sequenceType(); } break; @@ -6486,18 +6539,18 @@ public final CastableExprContext castableExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1007); + setState(1111); ((CastableExprContext)_localctx).main_expr = castExpr(); - setState(1011); + setState(1115); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { case 1: { - setState(1008); + setState(1112); match(Kcastable); - setState(1009); + setState(1113); match(Kas); - setState(1010); + setState(1114); ((CastableExprContext)_localctx).single = singleType(); } break; @@ -6543,18 +6596,18 @@ public final CastExprContext castExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1013); + setState(1117); ((CastExprContext)_localctx).main_expr = arrowExpr(); - setState(1017); + setState(1121); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { case 1: { - setState(1014); + setState(1118); match(Kcast); - setState(1015); + setState(1119); match(Kas); - setState(1016); + setState(1120); ((CastExprContext)_localctx).single = singleType(); } break; @@ -6611,9 +6664,9 @@ public final ArrowExprContext arrowExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1019); + setState(1123); ((ArrowExprContext)_localctx).main_expr = unaryExpr(); - setState(1028); + setState(1132); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,98,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -6621,21 +6674,21 @@ public final ArrowExprContext arrowExpr() throws RecognitionException { { { { - setState(1020); - match(T__3); - setState(1021); - match(T__44); + setState(1124); + match(T__2); + setState(1125); + match(T__41); } - setState(1023); + setState(1127); ((ArrowExprContext)_localctx).arrowFunctionSpecifier = arrowFunctionSpecifier(); ((ArrowExprContext)_localctx).function.add(((ArrowExprContext)_localctx).arrowFunctionSpecifier); - setState(1024); + setState(1128); ((ArrowExprContext)_localctx).argumentList = argumentList(); ((ArrowExprContext)_localctx).arguments.add(((ArrowExprContext)_localctx).argumentList); } } } - setState(1030); + setState(1134); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,98,_ctx); } @@ -6677,7 +6730,7 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog ArrowFunctionSpecifierContext _localctx = new ArrowFunctionSpecifierContext(_ctx, getState()); enterRule(_localctx, 166, RULE_arrowFunctionSpecifier); try { - setState(1034); + setState(1138); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -6756,21 +6809,21 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog case NCName: enterOuterAlt(_localctx, 1); { - setState(1031); + setState(1135); qname(); } break; - case T__4: + case T__3: enterOuterAlt(_localctx, 2); { - setState(1032); + setState(1136); varRef(); } break; - case T__8: + case T__7: enterOuterAlt(_localctx, 3); { - setState(1033); + setState(1137); parenthesizedExpr(); } break; @@ -6790,9 +6843,9 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog } public static class UnaryExprContext extends ParserRuleContext { - public Token s49; + public Token s46; public List op = new ArrayList(); - public Token s48; + public Token s45; public Token _tset2144; public ValueExprContext main_expr; public ValueExprContext valueExpr() { @@ -6816,16 +6869,16 @@ public final UnaryExprContext unaryExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1039); + setState(1143); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__47 || _la==T__48) { + while (_la==T__44 || _la==T__45) { { { - setState(1036); + setState(1140); ((UnaryExprContext)_localctx)._tset2144 = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__47 || _la==T__48) ) { + if ( !(_la==T__44 || _la==T__45) ) { ((UnaryExprContext)_localctx)._tset2144 = (Token)_errHandler.recoverInline(this); } else { @@ -6836,11 +6889,11 @@ public final UnaryExprContext unaryExpr() throws RecognitionException { ((UnaryExprContext)_localctx).op.add(((UnaryExprContext)_localctx)._tset2144); } } - setState(1041); + setState(1145); _errHandler.sync(this); _la = _input.LA(1); } - setState(1042); + setState(1146); ((UnaryExprContext)_localctx).main_expr = valueExpr(); } } @@ -6883,27 +6936,27 @@ public final ValueExprContext valueExpr() throws RecognitionException { ValueExprContext _localctx = new ValueExprContext(_ctx, getState()); enterRule(_localctx, 170, RULE_valueExpr); try { - setState(1047); + setState(1151); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1044); + setState(1148); ((ValueExprContext)_localctx).simpleMap_expr = simpleMapExpr(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1045); + setState(1149); ((ValueExprContext)_localctx).validate_expr = validateExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1046); + setState(1150); ((ValueExprContext)_localctx).annotate_expr = annotateExpr(); } break; @@ -6946,18 +6999,18 @@ public final ValidateExprContext validateExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1049); + setState(1153); match(Kvalidate); - setState(1050); + setState(1154); match(Ktype); - setState(1051); + setState(1155); sequenceType(); - setState(1052); - match(T__6); - setState(1053); + setState(1156); + match(T__5); + setState(1157); expr(); - setState(1054); - match(T__7); + setState(1158); + match(T__6); } } catch (RecognitionException re) { @@ -6997,18 +7050,18 @@ public final AnnotateExprContext annotateExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1056); + setState(1160); match(Kannotate); - setState(1057); + setState(1161); match(Ktype); - setState(1058); + setState(1162); sequenceType(); - setState(1059); - match(T__6); - setState(1060); + setState(1163); + match(T__5); + setState(1164); expr(); - setState(1061); - match(T__7); + setState(1165); + match(T__6); } } catch (RecognitionException re) { @@ -7050,22 +7103,22 @@ public final SimpleMapExprContext simpleMapExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1063); + setState(1167); ((SimpleMapExprContext)_localctx).main_expr = postFixExpr(); - setState(1068); + setState(1172); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__52) { + while (_la==T__49) { { { - setState(1064); - match(T__52); - setState(1065); + setState(1168); + match(T__49); + setState(1169); ((SimpleMapExprContext)_localctx).postFixExpr = postFixExpr(); ((SimpleMapExprContext)_localctx).map_expr.add(((SimpleMapExprContext)_localctx).postFixExpr); } } - setState(1070); + setState(1174); _errHandler.sync(this); _la = _input.LA(1); } @@ -7135,51 +7188,51 @@ public final PostFixExprContext postFixExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1071); + setState(1175); ((PostFixExprContext)_localctx).main_expr = primaryExpr(); - setState(1079); + setState(1183); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,104,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { - setState(1077); + setState(1181); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { case 1: { - setState(1072); + setState(1176); arrayLookup(); } break; case 2: { - setState(1073); + setState(1177); predicate(); } break; case 3: { - setState(1074); + setState(1178); objectLookup(); } break; case 4: { - setState(1075); + setState(1179); arrayUnboxing(); } break; case 5: { - setState(1076); + setState(1180); argumentList(); } break; } } } - setState(1081); + setState(1185); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,104,_ctx); } @@ -7217,16 +7270,16 @@ public final ArrayLookupContext arrayLookup() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1082); - match(T__53); - setState(1083); - match(T__53); - setState(1084); + setState(1186); + match(T__50); + setState(1187); + match(T__50); + setState(1188); expr(); - setState(1085); - match(T__54); - setState(1086); - match(T__54); + setState(1189); + match(T__51); + setState(1190); + match(T__51); } } catch (RecognitionException re) { @@ -7258,10 +7311,10 @@ public final ArrayUnboxingContext arrayUnboxing() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1088); - match(T__53); - setState(1089); - match(T__54); + setState(1192); + match(T__50); + setState(1193); + match(T__51); } } catch (RecognitionException re) { @@ -7296,12 +7349,12 @@ public final PredicateContext predicate() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1091); - match(T__53); - setState(1092); + setState(1195); + match(T__50); + setState(1196); expr(); - setState(1093); - match(T__54); + setState(1197); + match(T__51); } } catch (RecognitionException re) { @@ -7355,9 +7408,9 @@ public final ObjectLookupContext objectLookup() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1095); - match(T__55); - setState(1102); + setState(1199); + match(T__52); + setState(1206); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -7434,37 +7487,37 @@ public final ObjectLookupContext objectLookup() throws RecognitionException { case Kwhile: case NullLiteral: { - setState(1096); + setState(1200); ((ObjectLookupContext)_localctx).kw = keyWords(); } break; case STRING: { - setState(1097); + setState(1201); ((ObjectLookupContext)_localctx).lt = stringLiteral(); } break; case NCName: { - setState(1098); + setState(1202); ((ObjectLookupContext)_localctx).nc = match(NCName); } break; - case T__8: + case T__7: { - setState(1099); + setState(1203); ((ObjectLookupContext)_localctx).pe = parenthesizedExpr(); } break; - case T__4: + case T__3: { - setState(1100); + setState(1204); ((ObjectLookupContext)_localctx).vr = varRef(); } break; - case T__56: + case T__53: { - setState(1101); + setState(1205); ((ObjectLookupContext)_localctx).ci = contextItemExpr(); } break; @@ -7537,111 +7590,111 @@ public final PrimaryExprContext primaryExpr() throws RecognitionException { PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, getState()); enterRule(_localctx, 188, RULE_primaryExpr); try { - setState(1119); + setState(1223); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1104); + setState(1208); match(NullLiteral); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1105); + setState(1209); match(Ktrue); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1106); + setState(1210); match(Kfalse); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1107); + setState(1211); match(Literal); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1108); + setState(1212); stringLiteral(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1109); + setState(1213); varRef(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1110); + setState(1214); parenthesizedExpr(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1111); + setState(1215); contextItemExpr(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1112); + setState(1216); objectConstructor(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1113); + setState(1217); functionCall(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1114); + setState(1218); orderedExpr(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1115); + setState(1219); unorderedExpr(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1116); + setState(1220); arrayConstructor(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1117); + setState(1221); functionItemExpr(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1118); + setState(1222); blockExpr(); } break; @@ -7679,12 +7732,12 @@ public final BlockExprContext blockExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1121); - match(T__6); - setState(1122); + setState(1225); + match(T__5); + setState(1226); statementsAndExpr(); - setState(1123); - match(T__7); + setState(1227); + match(T__6); } } catch (RecognitionException re) { @@ -7720,9 +7773,9 @@ public final VarRefContext varRef() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1125); - match(T__4); - setState(1126); + setState(1229); + match(T__3); + setState(1230); ((VarRefContext)_localctx).var_name = qname(); } } @@ -7759,20 +7812,20 @@ public final ParenthesizedExprContext parenthesizedExpr() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1128); - match(T__8); - setState(1130); + setState(1232); + match(T__7); + setState(1234); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1129); + setState(1233); expr(); } } - setState(1132); - match(T__9); + setState(1236); + match(T__8); } } catch (RecognitionException re) { @@ -7804,8 +7857,8 @@ public final ContextItemExprContext contextItemExpr() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1134); - match(T__56); + setState(1238); + match(T__53); } } catch (RecognitionException re) { @@ -7840,14 +7893,14 @@ public final OrderedExprContext orderedExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1136); - match(T__15); - setState(1137); - match(T__6); - setState(1138); + setState(1240); + match(T__14); + setState(1241); + match(T__5); + setState(1242); expr(); - setState(1139); - match(T__7); + setState(1243); + match(T__6); } } catch (RecognitionException re) { @@ -7883,14 +7936,14 @@ public final UnorderedExprContext unorderedExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1141); + setState(1245); match(Kunordered); - setState(1142); - match(T__6); - setState(1143); + setState(1246); + match(T__5); + setState(1247); expr(); - setState(1144); - match(T__7); + setState(1248); + match(T__6); } } catch (RecognitionException re) { @@ -7929,9 +7982,9 @@ public final FunctionCallContext functionCall() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1146); + setState(1250); ((FunctionCallContext)_localctx).fn_name = qname(); - setState(1147); + setState(1251); argumentList(); } } @@ -7973,35 +8026,35 @@ public final ArgumentListContext argumentList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1149); - match(T__8); - setState(1156); + setState(1253); + match(T__7); + setState(1260); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (ArgumentPlaceholder - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (ArgumentPlaceholder - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { { - setState(1150); + setState(1254); ((ArgumentListContext)_localctx).argument = argument(); ((ArgumentListContext)_localctx).args.add(((ArgumentListContext)_localctx).argument); - setState(1152); + setState(1256); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__13) { + if (_la==T__12) { { - setState(1151); - match(T__13); + setState(1255); + match(T__12); } } } } - setState(1158); + setState(1262); _errHandler.sync(this); _la = _input.LA(1); } - setState(1159); - match(T__9); + setState(1263); + match(T__8); } } catch (RecognitionException re) { @@ -8035,20 +8088,20 @@ public final ArgumentContext argument() throws RecognitionException { ArgumentContext _localctx = new ArgumentContext(_ctx, getState()); enterRule(_localctx, 206, RULE_argument); try { - setState(1163); + setState(1267); _errHandler.sync(this); switch (_input.LA(1)) { - case T__4: - case T__6: - case T__8: - case T__12: - case T__15: - case T__30: - case T__47: - case T__48: + case T__3: + case T__5: + case T__7: + case T__11: + case T__14: + case T__28: + case T__44: + case T__45: + case T__50: case T__53: case T__56: - case T__58: case Kfor: case Klet: case Kwhere: @@ -8127,14 +8180,14 @@ public final ArgumentContext argument() throws RecognitionException { case NCName: enterOuterAlt(_localctx, 1); { - setState(1161); + setState(1265); exprSingle(); } break; case ArgumentPlaceholder: enterOuterAlt(_localctx, 2); { - setState(1162); + setState(1266); match(ArgumentPlaceholder); } break; @@ -8175,7 +8228,7 @@ public final FunctionItemExprContext functionItemExpr() throws RecognitionExcept FunctionItemExprContext _localctx = new FunctionItemExprContext(_ctx, getState()); enterRule(_localctx, 208, RULE_functionItemExpr); try { - setState(1167); + setState(1271); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -8254,15 +8307,15 @@ public final FunctionItemExprContext functionItemExpr() throws RecognitionExcept case NCName: enterOuterAlt(_localctx, 1); { - setState(1165); + setState(1269); namedFunctionRef(); } break; - case T__12: - case T__30: + case T__11: + case T__28: enterOuterAlt(_localctx, 2); { - setState(1166); + setState(1270); inlineFunctionExpr(); } break; @@ -8305,11 +8358,11 @@ public final NamedFunctionRefContext namedFunctionRef() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1169); + setState(1273); ((NamedFunctionRefContext)_localctx).fn_name = qname(); - setState(1170); - match(T__57); - setState(1171); + setState(1274); + match(T__54); + setState(1275); ((NamedFunctionRefContext)_localctx).arity = match(Literal); } } @@ -8358,45 +8411,45 @@ public final InlineFunctionExprContext inlineFunctionExpr() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(1173); + setState(1277); annotations(); - setState(1174); - match(T__30); - setState(1175); - match(T__8); - setState(1177); + setState(1278); + match(T__28); + setState(1279); + match(T__7); + setState(1281); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__4) { + if (_la==T__3) { { - setState(1176); + setState(1280); paramList(); } } - setState(1179); - match(T__9); - setState(1182); + setState(1283); + match(T__8); + setState(1286); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(1180); + setState(1284); match(Kas); - setState(1181); + setState(1285); ((InlineFunctionExprContext)_localctx).return_type = sequenceType(); } } { - setState(1184); - match(T__6); + setState(1288); + match(T__5); { - setState(1185); + setState(1289); ((InlineFunctionExprContext)_localctx).fn_body = statementsAndOptionalExpr(); } - setState(1186); - match(T__7); + setState(1290); + match(T__6); } } } @@ -8448,32 +8501,32 @@ public final InsertExprContext insertExpr() throws RecognitionException { enterRule(_localctx, 214, RULE_insertExpr); int _la; try { - setState(1211); + setState(1315); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1188); + setState(1292); match(Kinsert); - setState(1189); + setState(1293); match(Kjson); - setState(1190); + setState(1294); ((InsertExprContext)_localctx).to_insert_expr = exprSingle(); - setState(1191); + setState(1295); match(Kinto); - setState(1192); + setState(1296); ((InsertExprContext)_localctx).main_expr = exprSingle(); - setState(1196); + setState(1300); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) { case 1: { - setState(1193); + setState(1297); match(Kat); - setState(1194); + setState(1298); match(Kposition); - setState(1195); + setState(1299); ((InsertExprContext)_localctx).pos_expr = exprSingle(); } break; @@ -8483,31 +8536,31 @@ public final InsertExprContext insertExpr() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(1198); + setState(1302); match(Kinsert); - setState(1199); + setState(1303); match(Kjson); - setState(1200); + setState(1304); pairConstructor(); - setState(1205); + setState(1309); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + while (_la==T__12) { { { - setState(1201); - match(T__13); - setState(1202); + setState(1305); + match(T__12); + setState(1306); pairConstructor(); } } - setState(1207); + setState(1311); _errHandler.sync(this); _la = _input.LA(1); } - setState(1208); + setState(1312); match(Kinto); - setState(1209); + setState(1313); ((InsertExprContext)_localctx).main_expr = exprSingle(); } break; @@ -8547,11 +8600,11 @@ public final DeleteExprContext deleteExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1213); + setState(1317); match(Kdelete); - setState(1214); + setState(1318); match(Kjson); - setState(1215); + setState(1319); updateLocator(); } } @@ -8594,15 +8647,15 @@ public final RenameExprContext renameExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1217); + setState(1321); match(Krename); - setState(1218); + setState(1322); match(Kjson); - setState(1219); + setState(1323); updateLocator(); - setState(1220); + setState(1324); match(Kas); - setState(1221); + setState(1325); ((RenameExprContext)_localctx).name_expr = exprSingle(); } } @@ -8647,19 +8700,19 @@ public final ReplaceExprContext replaceExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1223); + setState(1327); match(Kreplace); - setState(1224); + setState(1328); match(Kjson); - setState(1225); + setState(1329); match(Kvalue); - setState(1226); + setState(1330); match(Kof); - setState(1227); + setState(1331); updateLocator(); - setState(1228); + setState(1332); match(Kwith); - setState(1229); + setState(1333); ((ReplaceExprContext)_localctx).replacer_expr = exprSingle(); } } @@ -8711,35 +8764,35 @@ public final TransformExprContext transformExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1231); + setState(1335); match(Kcopy); - setState(1232); + setState(1336); match(Kjson); - setState(1233); + setState(1337); copyDecl(); - setState(1238); + setState(1342); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + while (_la==T__12) { { { - setState(1234); - match(T__13); - setState(1235); + setState(1338); + match(T__12); + setState(1339); copyDecl(); } } - setState(1240); + setState(1344); _errHandler.sync(this); _la = _input.LA(1); } - setState(1241); + setState(1345); match(Kmodify); - setState(1242); + setState(1346); ((TransformExprContext)_localctx).mod_expr = exprSingle(); - setState(1243); + setState(1347); match(Kreturn); - setState(1244); + setState(1348); ((TransformExprContext)_localctx).ret_expr = exprSingle(); } } @@ -8783,15 +8836,15 @@ public final AppendExprContext appendExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1246); + setState(1350); match(Kappend); - setState(1247); + setState(1351); match(Kjson); - setState(1248); + setState(1352); ((AppendExprContext)_localctx).to_append_expr = exprSingle(); - setState(1249); + setState(1353); match(Kinto); - setState(1250); + setState(1354); ((AppendExprContext)_localctx).array_expr = exprSingle(); } } @@ -8841,27 +8894,27 @@ public final UpdateLocatorContext updateLocator() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1252); + setState(1356); ((UpdateLocatorContext)_localctx).main_expr = primaryExpr(); - setState(1255); + setState(1359); _errHandler.sync(this); _alt = 1; do { switch (_alt) { case 1: { - setState(1255); + setState(1359); _errHandler.sync(this); switch (_input.LA(1)) { - case T__53: + case T__50: { - setState(1253); + setState(1357); arrayLookup(); } break; - case T__55: + case T__52: { - setState(1254); + setState(1358); objectLookup(); } break; @@ -8873,7 +8926,7 @@ public final UpdateLocatorContext updateLocator() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1257); + setState(1361); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,119,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -8916,11 +8969,11 @@ public final CopyDeclContext copyDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1259); + setState(1363); ((CopyDeclContext)_localctx).var_ref = varRef(); - setState(1260); - match(T__5); - setState(1261); + setState(1364); + match(T__4); + setState(1365); ((CopyDeclContext)_localctx).src_expr = exprSingle(); } } @@ -8935,79 +8988,261 @@ public final CopyDeclContext copyDecl() throws RecognitionException { return _localctx; } - public static class SequenceTypeContext extends ParserRuleContext { - public ItemTypeContext item; - public Token s134; - public List question = new ArrayList(); - public Token s11; - public List star = new ArrayList(); - public Token s48; - public List plus = new ArrayList(); - public ItemTypeContext itemType() { - return getRuleContext(ItemTypeContext.class,0); + public static class SchemaImportContext extends ParserRuleContext { + public UriLiteralContext nsURI; + public UriLiteralContext uriLiteral; + public List locations = new ArrayList(); + public TerminalNode Kimport() { return getToken(JsoniqParser.Kimport, 0); } + public TerminalNode Kschema() { return getToken(JsoniqParser.Kschema, 0); } + public List uriLiteral() { + return getRuleContexts(UriLiteralContext.class); } - public TerminalNode ArgumentPlaceholder() { return getToken(JsoniqParser.ArgumentPlaceholder, 0); } - public SequenceTypeContext(ParserRuleContext parent, int invokingState) { + public UriLiteralContext uriLiteral(int i) { + return getRuleContext(UriLiteralContext.class,i); + } + public SchemaPrefixContext schemaPrefix() { + return getRuleContext(SchemaPrefixContext.class,0); + } + public TerminalNode Kat() { return getToken(JsoniqParser.Kat, 0); } + public SchemaImportContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_sequenceType; } + @Override public int getRuleIndex() { return RULE_schemaImport; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitSequenceType(this); + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitSchemaImport(this); else return visitor.visitChildren(this); } } - public final SequenceTypeContext sequenceType() throws RecognitionException { - SequenceTypeContext _localctx = new SequenceTypeContext(_ctx, getState()); - enterRule(_localctx, 230, RULE_sequenceType); + public final SchemaImportContext schemaImport() throws RecognitionException { + SchemaImportContext _localctx = new SchemaImportContext(_ctx, getState()); + enterRule(_localctx, 230, RULE_schemaImport); + int _la; try { - setState(1271); + enterOuterAlt(_localctx, 1); + { + setState(1367); + match(Kimport); + setState(1368); + match(Kschema); + setState(1370); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==Kdefault || _la==Knamespace) { + { + setState(1369); + schemaPrefix(); + } + } + + setState(1372); + ((SchemaImportContext)_localctx).nsURI = uriLiteral(); + setState(1382); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==Kat) { + { + setState(1373); + match(Kat); + setState(1374); + ((SchemaImportContext)_localctx).uriLiteral = uriLiteral(); + ((SchemaImportContext)_localctx).locations.add(((SchemaImportContext)_localctx).uriLiteral); + setState(1379); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==T__12) { + { + { + setState(1375); + match(T__12); + setState(1376); + ((SchemaImportContext)_localctx).uriLiteral = uriLiteral(); + ((SchemaImportContext)_localctx).locations.add(((SchemaImportContext)_localctx).uriLiteral); + } + } + setState(1381); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SchemaPrefixContext extends ParserRuleContext { + public TerminalNode Knamespace() { return getToken(JsoniqParser.Knamespace, 0); } + public TerminalNode NCName() { return getToken(JsoniqParser.NCName, 0); } + public TerminalNode Kdefault() { return getToken(JsoniqParser.Kdefault, 0); } + public TerminalNode Kelement() { return getToken(JsoniqParser.Kelement, 0); } + public SchemaPrefixContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_schemaPrefix; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitSchemaPrefix(this); + else return visitor.visitChildren(this); + } + } + + public final SchemaPrefixContext schemaPrefix() throws RecognitionException { + SchemaPrefixContext _localctx = new SchemaPrefixContext(_ctx, getState()); + enterRule(_localctx, 232, RULE_schemaPrefix); + try { + enterOuterAlt(_localctx, 1); + { + setState(1390); _errHandler.sync(this); switch (_input.LA(1)) { - case T__8: - enterOuterAlt(_localctx, 1); + case Knamespace: { - setState(1263); - match(T__8); - setState(1264); - match(T__9); + setState(1384); + match(Knamespace); + setState(1385); + match(NCName); + setState(1386); + match(T__2); } break; - case T__30: - case Kfor: - case Klet: - case Kwhere: - case Kgroup: - case Kby: - case Korder: - case Kreturn: - case Kif: - case Kin: - case Kas: - case Kat: - case Kallowing: - case Kempty: - case Kcount: - case Kstable: - case Kascending: - case Kdescending: - case Ksome: - case Kevery: - case Ksatisfies: - case Kcollation: - case Kgreatest: - case Kleast: - case Kswitch: - case Kcase: - case Ktry: - case Kcatch: case Kdefault: - case Kthen: - case Kelse: - case Ktypeswitch: - case Kor: - case Kand: + { + setState(1387); + match(Kdefault); + setState(1388); + match(Kelement); + setState(1389); + match(Knamespace); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PathExprContext extends ParserRuleContext { + public RelativePathExprContext singleslash; + public RelativePathExprContext doubleslash; + public RelativePathExprContext relative; + public TerminalNode Kslash() { return getToken(JsoniqParser.Kslash, 0); } + public RelativePathExprContext relativePathExpr() { + return getRuleContext(RelativePathExprContext.class,0); + } + public TerminalNode Kdslash() { return getToken(JsoniqParser.Kdslash, 0); } + public PathExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_pathExpr; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitPathExpr(this); + else return visitor.visitChildren(this); + } + } + + public final PathExprContext pathExpr() throws RecognitionException { + PathExprContext _localctx = new PathExprContext(_ctx, getState()); + enterRule(_localctx, 234, RULE_pathExpr); + int _la; + try { + setState(1399); + _errHandler.sync(this); + switch (_input.LA(1)) { + case Kslash: + enterOuterAlt(_localctx, 1); + { + { + setState(1392); + match(Kslash); + setState(1394); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + { + setState(1393); + ((PathExprContext)_localctx).singleslash = relativePathExpr(); + } + } + + } + } + break; + case Kdslash: + enterOuterAlt(_localctx, 2); + { + { + setState(1396); + match(Kdslash); + setState(1397); + ((PathExprContext)_localctx).doubleslash = relativePathExpr(); + } + } + break; + case T__3: + case T__5: + case T__7: + case T__11: + case T__14: + case T__28: + case T__50: + case T__53: + case T__55: + case T__56: + case Kfor: + case Klet: + case Kwhere: + case Kgroup: + case Kby: + case Korder: + case Kreturn: + case Kif: + case Kin: + case Kas: + case Kat: + case Kallowing: + case Kempty: + case Kcount: + case Kstable: + case Kascending: + case Kdescending: + case Ksome: + case Kevery: + case Ksatisfies: + case Kcollation: + case Kgreatest: + case Kleast: + case Kswitch: + case Kcase: + case Ktry: + case Kcatch: + case Kdefault: + case Kthen: + case Kelse: + case Ktypeswitch: + case Kor: + case Kand: case Knot: case Kto: case Kinstance: @@ -9047,41 +9282,3123 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { case Kexit: case Kreturning: case Kwhile: + case Kelement: + case Kat_symbol: + case Kchild: + case Kdescendant: + case Kattribute: + case Kself: + case Kdescendant_or_self: + case Kfollowing_sibling: + case Kfollowing: + case Kparent: + case Kancestor: + case Kpreceding_sibling: + case Kpreceding: + case Kancestor_or_self: + case Knode: + case Kbinary: + case Kdocument_node: + case Ktext: + case Kpi: + case Knamespace_node: + case Kschema_attribute: + case Kschema_element: + case Karray_node: + case Kboolean_node: + case Knull_node: + case Knumber_node: + case Kobject_node: + case Kcomment: + case STRING: case NullLiteral: + case Literal: case NCName: + enterOuterAlt(_localctx, 3); + { + setState(1398); + ((PathExprContext)_localctx).relative = relativePathExpr(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class RelativePathExprContext extends ParserRuleContext { + public Token sep; + public List stepExpr() { + return getRuleContexts(StepExprContext.class); + } + public StepExprContext stepExpr(int i) { + return getRuleContext(StepExprContext.class,i); + } + public List Kslash() { return getTokens(JsoniqParser.Kslash); } + public TerminalNode Kslash(int i) { + return getToken(JsoniqParser.Kslash, i); + } + public List Kdslash() { return getTokens(JsoniqParser.Kdslash); } + public TerminalNode Kdslash(int i) { + return getToken(JsoniqParser.Kdslash, i); + } + public RelativePathExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_relativePathExpr; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitRelativePathExpr(this); + else return visitor.visitChildren(this); + } + } + + public final RelativePathExprContext relativePathExpr() throws RecognitionException { + RelativePathExprContext _localctx = new RelativePathExprContext(_ctx, getState()); + enterRule(_localctx, 236, RULE_relativePathExpr); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1401); + stepExpr(); + setState(1406); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==Kslash || _la==Kdslash) { + { + { + setState(1402); + ((RelativePathExprContext)_localctx).sep = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==Kslash || _la==Kdslash) ) { + ((RelativePathExprContext)_localctx).sep = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(1403); + stepExpr(); + } + } + setState(1408); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class StepExprContext extends ParserRuleContext { + public PostFixExprContext postFixExpr() { + return getRuleContext(PostFixExprContext.class,0); + } + public AxisStepContext axisStep() { + return getRuleContext(AxisStepContext.class,0); + } + public StepExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_stepExpr; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitStepExpr(this); + else return visitor.visitChildren(this); + } + } + + public final StepExprContext stepExpr() throws RecognitionException { + StepExprContext _localctx = new StepExprContext(_ctx, getState()); + enterRule(_localctx, 238, RULE_stepExpr); + try { + setState(1411); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1409); + postFixExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1410); + axisStep(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AxisStepContext extends ParserRuleContext { + public PredicateListContext predicateList() { + return getRuleContext(PredicateListContext.class,0); + } + public ReverseStepContext reverseStep() { + return getRuleContext(ReverseStepContext.class,0); + } + public ForwardStepContext forwardStep() { + return getRuleContext(ForwardStepContext.class,0); + } + public AxisStepContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_axisStep; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAxisStep(this); + else return visitor.visitChildren(this); + } + } + + public final AxisStepContext axisStep() throws RecognitionException { + AxisStepContext _localctx = new AxisStepContext(_ctx, getState()); + enterRule(_localctx, 240, RULE_axisStep); + try { + enterOuterAlt(_localctx, 1); + { + setState(1415); + _errHandler.sync(this); + switch (_input.LA(1)) { + case T__55: + case Kparent: + case Kancestor: + case Kpreceding_sibling: + case Kpreceding: + case Kancestor_or_self: + { + setState(1413); + reverseStep(); + } + break; + case Kfor: + case Klet: + case Kwhere: + case Kgroup: + case Kby: + case Korder: + case Kreturn: + case Kif: + case Kin: + case Kas: + case Kat: + case Kallowing: + case Kempty: + case Kcount: + case Kstable: + case Kascending: + case Kdescending: + case Ksome: + case Kevery: + case Ksatisfies: + case Kcollation: + case Kgreatest: + case Kleast: + case Kswitch: + case Kcase: + case Ktry: + case Kcatch: + case Kdefault: + case Kthen: + case Kelse: + case Ktypeswitch: + case Kor: + case Kand: + case Knot: + case Kto: + case Kinstance: + case Kof: + case Kstatically: + case Kis: + case Ktreat: + case Kcast: + case Kcastable: + case Kversion: + case Kjsoniq: + case Kunordered: + case Ktrue: + case Kfalse: + case Ktype: + case Kvalidate: + case Kannotate: + case Kdeclare: + case Kcontext: + case Kitem: + case Kvariable: + case Kinsert: + case Kdelete: + case Krename: + case Kreplace: + case Kcopy: + case Kmodify: + case Kappend: + case Kinto: + case Kvalue: + case Kjson: + case Kwith: + case Kposition: + case Kbreak: + case Kloop: + case Kcontinue: + case Kexit: + case Kreturning: + case Kwhile: + case Kelement: + case Kat_symbol: + case Kchild: + case Kdescendant: + case Kattribute: + case Kself: + case Kdescendant_or_self: + case Kfollowing_sibling: + case Kfollowing: + case Knode: + case Kbinary: + case Kdocument_node: + case Ktext: + case Kpi: + case Knamespace_node: + case Kschema_attribute: + case Kschema_element: + case Karray_node: + case Kboolean_node: + case Knull_node: + case Knumber_node: + case Kobject_node: + case Kcomment: + case NullLiteral: + case NCName: + { + setState(1414); + forwardStep(); + } + break; + default: + throw new NoViableAltException(this); + } + setState(1417); + predicateList(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ForwardStepContext extends ParserRuleContext { + public ForwardAxisContext forwardAxis() { + return getRuleContext(ForwardAxisContext.class,0); + } + public NodeTestContext nodeTest() { + return getRuleContext(NodeTestContext.class,0); + } + public AbbrevForwardStepContext abbrevForwardStep() { + return getRuleContext(AbbrevForwardStepContext.class,0); + } + public ForwardStepContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_forwardStep; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitForwardStep(this); + else return visitor.visitChildren(this); + } + } + + public final ForwardStepContext forwardStep() throws RecognitionException { + ForwardStepContext _localctx = new ForwardStepContext(_ctx, getState()); + enterRule(_localctx, 242, RULE_forwardStep); + try { + setState(1423); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1419); + forwardAxis(); + setState(1420); + nodeTest(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1422); + abbrevForwardStep(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ForwardAxisContext extends ParserRuleContext { + public TerminalNode Kchild() { return getToken(JsoniqParser.Kchild, 0); } + public TerminalNode Kdescendant() { return getToken(JsoniqParser.Kdescendant, 0); } + public TerminalNode Kattribute() { return getToken(JsoniqParser.Kattribute, 0); } + public TerminalNode Kself() { return getToken(JsoniqParser.Kself, 0); } + public TerminalNode Kdescendant_or_self() { return getToken(JsoniqParser.Kdescendant_or_self, 0); } + public TerminalNode Kfollowing_sibling() { return getToken(JsoniqParser.Kfollowing_sibling, 0); } + public TerminalNode Kfollowing() { return getToken(JsoniqParser.Kfollowing, 0); } + public ForwardAxisContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_forwardAxis; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitForwardAxis(this); + else return visitor.visitChildren(this); + } + } + + public final ForwardAxisContext forwardAxis() throws RecognitionException { + ForwardAxisContext _localctx = new ForwardAxisContext(_ctx, getState()); + enterRule(_localctx, 244, RULE_forwardAxis); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1425); + _la = _input.LA(1); + if ( !(((((_la - 138)) & ~0x3f) == 0 && ((1L << (_la - 138)) & ((1L << (Kchild - 138)) | (1L << (Kdescendant - 138)) | (1L << (Kattribute - 138)) | (1L << (Kself - 138)) | (1L << (Kdescendant_or_self - 138)) | (1L << (Kfollowing_sibling - 138)) | (1L << (Kfollowing - 138)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(1426); + match(T__16); + setState(1427); + match(T__16); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AbbrevForwardStepContext extends ParserRuleContext { + public NodeTestContext nodeTest() { + return getRuleContext(NodeTestContext.class,0); + } + public TerminalNode Kat_symbol() { return getToken(JsoniqParser.Kat_symbol, 0); } + public AbbrevForwardStepContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_abbrevForwardStep; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAbbrevForwardStep(this); + else return visitor.visitChildren(this); + } + } + + public final AbbrevForwardStepContext abbrevForwardStep() throws RecognitionException { + AbbrevForwardStepContext _localctx = new AbbrevForwardStepContext(_ctx, getState()); + enterRule(_localctx, 246, RULE_abbrevForwardStep); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1430); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==Kat_symbol) { + { + setState(1429); + match(Kat_symbol); + } + } + + setState(1432); + nodeTest(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ReverseStepContext extends ParserRuleContext { + public ReverseAxisContext reverseAxis() { + return getRuleContext(ReverseAxisContext.class,0); + } + public NodeTestContext nodeTest() { + return getRuleContext(NodeTestContext.class,0); + } + public AbbrevReverseStepContext abbrevReverseStep() { + return getRuleContext(AbbrevReverseStepContext.class,0); + } + public ReverseStepContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_reverseStep; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitReverseStep(this); + else return visitor.visitChildren(this); + } + } + + public final ReverseStepContext reverseStep() throws RecognitionException { + ReverseStepContext _localctx = new ReverseStepContext(_ctx, getState()); + enterRule(_localctx, 248, RULE_reverseStep); + try { + setState(1438); + _errHandler.sync(this); + switch (_input.LA(1)) { + case Kparent: + case Kancestor: + case Kpreceding_sibling: + case Kpreceding: + case Kancestor_or_self: + enterOuterAlt(_localctx, 1); + { + setState(1434); + reverseAxis(); + setState(1435); + nodeTest(); + } + break; + case T__55: + enterOuterAlt(_localctx, 2); + { + setState(1437); + abbrevReverseStep(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ReverseAxisContext extends ParserRuleContext { + public TerminalNode Kparent() { return getToken(JsoniqParser.Kparent, 0); } + public TerminalNode Kancestor() { return getToken(JsoniqParser.Kancestor, 0); } + public TerminalNode Kpreceding_sibling() { return getToken(JsoniqParser.Kpreceding_sibling, 0); } + public TerminalNode Kpreceding() { return getToken(JsoniqParser.Kpreceding, 0); } + public TerminalNode Kancestor_or_self() { return getToken(JsoniqParser.Kancestor_or_self, 0); } + public ReverseAxisContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_reverseAxis; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitReverseAxis(this); + else return visitor.visitChildren(this); + } + } + + public final ReverseAxisContext reverseAxis() throws RecognitionException { + ReverseAxisContext _localctx = new ReverseAxisContext(_ctx, getState()); + enterRule(_localctx, 250, RULE_reverseAxis); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1440); + _la = _input.LA(1); + if ( !(((((_la - 145)) & ~0x3f) == 0 && ((1L << (_la - 145)) & ((1L << (Kparent - 145)) | (1L << (Kancestor - 145)) | (1L << (Kpreceding_sibling - 145)) | (1L << (Kpreceding - 145)) | (1L << (Kancestor_or_self - 145)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(1441); + match(T__16); + setState(1442); + match(T__16); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AbbrevReverseStepContext extends ParserRuleContext { + public AbbrevReverseStepContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_abbrevReverseStep; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAbbrevReverseStep(this); + else return visitor.visitChildren(this); + } + } + + public final AbbrevReverseStepContext abbrevReverseStep() throws RecognitionException { + AbbrevReverseStepContext _localctx = new AbbrevReverseStepContext(_ctx, getState()); + enterRule(_localctx, 252, RULE_abbrevReverseStep); + try { + enterOuterAlt(_localctx, 1); + { + setState(1444); + match(T__55); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NodeTestContext extends ParserRuleContext { + public NameTestContext nameTest() { + return getRuleContext(NameTestContext.class,0); + } + public KindTestContext kindTest() { + return getRuleContext(KindTestContext.class,0); + } + public NodeTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nodeTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitNodeTest(this); + else return visitor.visitChildren(this); + } + } + + public final NodeTestContext nodeTest() throws RecognitionException { + NodeTestContext _localctx = new NodeTestContext(_ctx, getState()); + enterRule(_localctx, 254, RULE_nodeTest); + try { + setState(1448); + _errHandler.sync(this); + switch (_input.LA(1)) { + case Kfor: + case Klet: + case Kwhere: + case Kgroup: + case Kby: + case Korder: + case Kreturn: + case Kif: + case Kin: + case Kas: + case Kat: + case Kallowing: + case Kempty: + case Kcount: + case Kstable: + case Kascending: + case Kdescending: + case Ksome: + case Kevery: + case Ksatisfies: + case Kcollation: + case Kgreatest: + case Kleast: + case Kswitch: + case Kcase: + case Ktry: + case Kcatch: + case Kdefault: + case Kthen: + case Kelse: + case Ktypeswitch: + case Kor: + case Kand: + case Knot: + case Kto: + case Kinstance: + case Kof: + case Kstatically: + case Kis: + case Ktreat: + case Kcast: + case Kcastable: + case Kversion: + case Kjsoniq: + case Kunordered: + case Ktrue: + case Kfalse: + case Ktype: + case Kvalidate: + case Kannotate: + case Kdeclare: + case Kcontext: + case Kitem: + case Kvariable: + case Kinsert: + case Kdelete: + case Krename: + case Kreplace: + case Kcopy: + case Kmodify: + case Kappend: + case Kinto: + case Kvalue: + case Kjson: + case Kwith: + case Kposition: + case Kbreak: + case Kloop: + case Kcontinue: + case Kexit: + case Kreturning: + case Kwhile: + case NullLiteral: + case NCName: + enterOuterAlt(_localctx, 1); + { + setState(1446); + nameTest(); + } + break; + case Kelement: + case Kattribute: + case Knode: + case Kbinary: + case Kdocument_node: + case Ktext: + case Kpi: + case Knamespace_node: + case Kschema_attribute: + case Kschema_element: + case Karray_node: + case Kboolean_node: + case Knull_node: + case Knumber_node: + case Kobject_node: + case Kcomment: + enterOuterAlt(_localctx, 2); + { + setState(1447); + kindTest(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NameTestContext extends ParserRuleContext { + public QnameContext qname() { + return getRuleContext(QnameContext.class,0); + } + public WildcardContext wildcard() { + return getRuleContext(WildcardContext.class,0); + } + public NameTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nameTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitNameTest(this); + else return visitor.visitChildren(this); + } + } + + public final NameTestContext nameTest() throws RecognitionException { + NameTestContext _localctx = new NameTestContext(_ctx, getState()); + enterRule(_localctx, 256, RULE_nameTest); + try { + enterOuterAlt(_localctx, 1); + { + setState(1450); + qname(); + setState(1451); + wildcard(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class WildcardContext extends ParserRuleContext { + public WildcardContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_wildcard; } + + public WildcardContext() { } + public void copyFrom(WildcardContext ctx) { + super.copyFrom(ctx); + } + } + public static class AllNamesContext extends WildcardContext { + public AllNamesContext(WildcardContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAllNames(this); + else return visitor.visitChildren(this); + } + } + public static class AllWithLocalContext extends WildcardContext { + public NCNameWithPrefixWildcardContext nCNameWithPrefixWildcard() { + return getRuleContext(NCNameWithPrefixWildcardContext.class,0); + } + public AllWithLocalContext(WildcardContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAllWithLocal(this); + else return visitor.visitChildren(this); + } + } + public static class AllWithNSContext extends WildcardContext { + public NCNameWithLocalWildcardContext nCNameWithLocalWildcard() { + return getRuleContext(NCNameWithLocalWildcardContext.class,0); + } + public AllWithNSContext(WildcardContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAllWithNS(this); + else return visitor.visitChildren(this); + } + } + + public final WildcardContext wildcard() throws RecognitionException { + WildcardContext _localctx = new WildcardContext(_ctx, getState()); + enterRule(_localctx, 258, RULE_wildcard); + try { + setState(1456); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { + case 1: + _localctx = new AllNamesContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(1453); + match(T__9); + } + break; + case 2: + _localctx = new AllWithNSContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(1454); + nCNameWithLocalWildcard(); + } + break; + case 3: + _localctx = new AllWithLocalContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(1455); + nCNameWithPrefixWildcard(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NCNameWithLocalWildcardContext extends ParserRuleContext { + public TerminalNode NCName() { return getToken(JsoniqParser.NCName, 0); } + public NCNameWithLocalWildcardContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nCNameWithLocalWildcard; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitNCNameWithLocalWildcard(this); + else return visitor.visitChildren(this); + } + } + + public final NCNameWithLocalWildcardContext nCNameWithLocalWildcard() throws RecognitionException { + NCNameWithLocalWildcardContext _localctx = new NCNameWithLocalWildcardContext(_ctx, getState()); + enterRule(_localctx, 260, RULE_nCNameWithLocalWildcard); + try { + enterOuterAlt(_localctx, 1); + { + setState(1458); + match(NCName); + setState(1459); + match(T__16); + setState(1460); + match(T__9); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NCNameWithPrefixWildcardContext extends ParserRuleContext { + public TerminalNode NCName() { return getToken(JsoniqParser.NCName, 0); } + public NCNameWithPrefixWildcardContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nCNameWithPrefixWildcard; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitNCNameWithPrefixWildcard(this); + else return visitor.visitChildren(this); + } + } + + public final NCNameWithPrefixWildcardContext nCNameWithPrefixWildcard() throws RecognitionException { + NCNameWithPrefixWildcardContext _localctx = new NCNameWithPrefixWildcardContext(_ctx, getState()); + enterRule(_localctx, 262, RULE_nCNameWithPrefixWildcard); + try { + enterOuterAlt(_localctx, 1); + { + setState(1462); + match(T__9); + setState(1463); + match(T__16); + setState(1464); + match(NCName); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PredicateListContext extends ParserRuleContext { + public List predicate() { + return getRuleContexts(PredicateContext.class); + } + public PredicateContext predicate(int i) { + return getRuleContext(PredicateContext.class,i); + } + public PredicateListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_predicateList; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitPredicateList(this); + else return visitor.visitChildren(this); + } + } + + public final PredicateListContext predicateList() throws RecognitionException { + PredicateListContext _localctx = new PredicateListContext(_ctx, getState()); + enterRule(_localctx, 264, RULE_predicateList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1469); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==T__50) { + { + { + setState(1466); + predicate(); + } + } + setState(1471); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ItemTypeContext extends ParserRuleContext { + public QnameContext qname() { + return getRuleContext(QnameContext.class,0); + } + public TerminalNode NullLiteral() { return getToken(JsoniqParser.NullLiteral, 0); } + public KindTestContext kindTest() { + return getRuleContext(KindTestContext.class,0); + } + public TerminalNode Kitem() { return getToken(JsoniqParser.Kitem, 0); } + public FunctionTestContext functionTest() { + return getRuleContext(FunctionTestContext.class,0); + } + public MapTestContext mapTest() { + return getRuleContext(MapTestContext.class,0); + } + public ArrayTestContext arrayTest() { + return getRuleContext(ArrayTestContext.class,0); + } + public AtomicOrUnionTypeContext atomicOrUnionType() { + return getRuleContext(AtomicOrUnionTypeContext.class,0); + } + public ParenthesizedItemTestContext parenthesizedItemTest() { + return getRuleContext(ParenthesizedItemTestContext.class,0); + } + public ItemTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_itemType; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitItemType(this); + else return visitor.visitChildren(this); + } + } + + public final ItemTypeContext itemType() throws RecognitionException { + ItemTypeContext _localctx = new ItemTypeContext(_ctx, getState()); + enterRule(_localctx, 266, RULE_itemType); + try { + setState(1483); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1472); + qname(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1473); + match(NullLiteral); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1474); + kindTest(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + { + setState(1475); + match(Kitem); + setState(1476); + match(T__7); + setState(1477); + match(T__8); + } + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(1478); + functionTest(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(1479); + mapTest(); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(1480); + arrayTest(); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(1481); + atomicOrUnionType(); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(1482); + parenthesizedItemTest(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AtomicOrUnionTypeContext extends ParserRuleContext { + public QnameContext qname() { + return getRuleContext(QnameContext.class,0); + } + public AtomicOrUnionTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_atomicOrUnionType; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAtomicOrUnionType(this); + else return visitor.visitChildren(this); + } + } + + public final AtomicOrUnionTypeContext atomicOrUnionType() throws RecognitionException { + AtomicOrUnionTypeContext _localctx = new AtomicOrUnionTypeContext(_ctx, getState()); + enterRule(_localctx, 268, RULE_atomicOrUnionType); + try { + enterOuterAlt(_localctx, 1); + { + setState(1485); + qname(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class KindTestContext extends ParserRuleContext { + public DocumentTestContext documentTest() { + return getRuleContext(DocumentTestContext.class,0); + } + public ElementTestContext elementTest() { + return getRuleContext(ElementTestContext.class,0); + } + public AttributeTestContext attributeTest() { + return getRuleContext(AttributeTestContext.class,0); + } + public SchemaElementTestContext schemaElementTest() { + return getRuleContext(SchemaElementTestContext.class,0); + } + public SchemaAttributeTestContext schemaAttributeTest() { + return getRuleContext(SchemaAttributeTestContext.class,0); + } + public PiTestContext piTest() { + return getRuleContext(PiTestContext.class,0); + } + public CommentTestContext commentTest() { + return getRuleContext(CommentTestContext.class,0); + } + public TextTestContext textTest() { + return getRuleContext(TextTestContext.class,0); + } + public NamespaceNodeTestContext namespaceNodeTest() { + return getRuleContext(NamespaceNodeTestContext.class,0); + } + public MlNodeTestContext mlNodeTest() { + return getRuleContext(MlNodeTestContext.class,0); + } + public BinaryNodeTestContext binaryNodeTest() { + return getRuleContext(BinaryNodeTestContext.class,0); + } + public AnyKindTestContext anyKindTest() { + return getRuleContext(AnyKindTestContext.class,0); + } + public KindTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_kindTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitKindTest(this); + else return visitor.visitChildren(this); + } + } + + public final KindTestContext kindTest() throws RecognitionException { + KindTestContext _localctx = new KindTestContext(_ctx, getState()); + enterRule(_localctx, 270, RULE_kindTest); + try { + setState(1499); + _errHandler.sync(this); + switch (_input.LA(1)) { + case Kdocument_node: + enterOuterAlt(_localctx, 1); + { + setState(1487); + documentTest(); + } + break; + case Kelement: + enterOuterAlt(_localctx, 2); + { + setState(1488); + elementTest(); + } + break; + case Kattribute: + enterOuterAlt(_localctx, 3); + { + setState(1489); + attributeTest(); + } + break; + case Kschema_element: + enterOuterAlt(_localctx, 4); + { + setState(1490); + schemaElementTest(); + } + break; + case Kschema_attribute: + enterOuterAlt(_localctx, 5); + { + setState(1491); + schemaAttributeTest(); + } + break; + case Kpi: + enterOuterAlt(_localctx, 6); + { + setState(1492); + piTest(); + } + break; + case Kcomment: + enterOuterAlt(_localctx, 7); + { + setState(1493); + commentTest(); + } + break; + case Ktext: + enterOuterAlt(_localctx, 8); + { + setState(1494); + textTest(); + } + break; + case Knamespace_node: + enterOuterAlt(_localctx, 9); + { + setState(1495); + namespaceNodeTest(); + } + break; + case Karray_node: + case Kboolean_node: + case Knull_node: + case Knumber_node: + case Kobject_node: + enterOuterAlt(_localctx, 10); + { + setState(1496); + mlNodeTest(); + } + break; + case Kbinary: + enterOuterAlt(_localctx, 11); + { + setState(1497); + binaryNodeTest(); + } + break; + case Knode: + enterOuterAlt(_localctx, 12); + { + setState(1498); + anyKindTest(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AnyKindTestContext extends ParserRuleContext { + public TerminalNode Knode() { return getToken(JsoniqParser.Knode, 0); } + public AnyKindTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_anyKindTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAnyKindTest(this); + else return visitor.visitChildren(this); + } + } + + public final AnyKindTestContext anyKindTest() throws RecognitionException { + AnyKindTestContext _localctx = new AnyKindTestContext(_ctx, getState()); + enterRule(_localctx, 272, RULE_anyKindTest); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1501); + match(Knode); + setState(1502); + match(T__7); + setState(1504); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==T__9) { + { + setState(1503); + match(T__9); + } + } + + setState(1506); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BinaryNodeTestContext extends ParserRuleContext { + public TerminalNode Kbinary() { return getToken(JsoniqParser.Kbinary, 0); } + public BinaryNodeTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_binaryNodeTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitBinaryNodeTest(this); + else return visitor.visitChildren(this); + } + } + + public final BinaryNodeTestContext binaryNodeTest() throws RecognitionException { + BinaryNodeTestContext _localctx = new BinaryNodeTestContext(_ctx, getState()); + enterRule(_localctx, 274, RULE_binaryNodeTest); + try { + enterOuterAlt(_localctx, 1); + { + setState(1508); + match(Kbinary); + setState(1509); + match(T__7); + setState(1510); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class DocumentTestContext extends ParserRuleContext { + public TerminalNode Kdocument_node() { return getToken(JsoniqParser.Kdocument_node, 0); } + public ElementTestContext elementTest() { + return getRuleContext(ElementTestContext.class,0); + } + public SchemaElementTestContext schemaElementTest() { + return getRuleContext(SchemaElementTestContext.class,0); + } + public DocumentTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_documentTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitDocumentTest(this); + else return visitor.visitChildren(this); + } + } + + public final DocumentTestContext documentTest() throws RecognitionException { + DocumentTestContext _localctx = new DocumentTestContext(_ctx, getState()); + enterRule(_localctx, 276, RULE_documentTest); + try { + enterOuterAlt(_localctx, 1); + { + setState(1512); + match(Kdocument_node); + setState(1513); + match(T__7); + setState(1516); + _errHandler.sync(this); + switch (_input.LA(1)) { + case Kelement: + { + setState(1514); + elementTest(); + } + break; + case Kschema_element: + { + setState(1515); + schemaElementTest(); + } + break; + case T__8: + break; + default: + break; + } + setState(1518); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TextTestContext extends ParserRuleContext { + public TerminalNode Ktext() { return getToken(JsoniqParser.Ktext, 0); } + public TextTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_textTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitTextTest(this); + else return visitor.visitChildren(this); + } + } + + public final TextTestContext textTest() throws RecognitionException { + TextTestContext _localctx = new TextTestContext(_ctx, getState()); + enterRule(_localctx, 278, RULE_textTest); + try { + enterOuterAlt(_localctx, 1); + { + setState(1520); + match(Ktext); + setState(1521); + match(T__7); + setState(1522); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class CommentTestContext extends ParserRuleContext { + public TerminalNode Kcomment() { return getToken(JsoniqParser.Kcomment, 0); } + public CommentTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_commentTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitCommentTest(this); + else return visitor.visitChildren(this); + } + } + + public final CommentTestContext commentTest() throws RecognitionException { + CommentTestContext _localctx = new CommentTestContext(_ctx, getState()); + enterRule(_localctx, 280, RULE_commentTest); + try { + enterOuterAlt(_localctx, 1); + { + setState(1524); + match(Kcomment); + setState(1525); + match(T__7); + setState(1526); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NamespaceNodeTestContext extends ParserRuleContext { + public TerminalNode Knamespace_node() { return getToken(JsoniqParser.Knamespace_node, 0); } + public NamespaceNodeTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namespaceNodeTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitNamespaceNodeTest(this); + else return visitor.visitChildren(this); + } + } + + public final NamespaceNodeTestContext namespaceNodeTest() throws RecognitionException { + NamespaceNodeTestContext _localctx = new NamespaceNodeTestContext(_ctx, getState()); + enterRule(_localctx, 282, RULE_namespaceNodeTest); + try { + enterOuterAlt(_localctx, 1); + { + setState(1528); + match(Knamespace_node); + setState(1529); + match(T__7); + setState(1530); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PiTestContext extends ParserRuleContext { + public TerminalNode Kpi() { return getToken(JsoniqParser.Kpi, 0); } + public TerminalNode NCName() { return getToken(JsoniqParser.NCName, 0); } + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public PiTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_piTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitPiTest(this); + else return visitor.visitChildren(this); + } + } + + public final PiTestContext piTest() throws RecognitionException { + PiTestContext _localctx = new PiTestContext(_ctx, getState()); + enterRule(_localctx, 284, RULE_piTest); + try { + enterOuterAlt(_localctx, 1); + { + setState(1532); + match(Kpi); + setState(1533); + match(T__7); + setState(1536); + _errHandler.sync(this); + switch (_input.LA(1)) { + case NCName: + { + setState(1534); + match(NCName); + } + break; + case STRING: + { + setState(1535); + stringLiteral(); + } + break; + case T__8: + break; + default: + break; + } + setState(1538); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AttributeTestContext extends ParserRuleContext { + public TypeNameContext type; + public TerminalNode Kattribute() { return getToken(JsoniqParser.Kattribute, 0); } + public AttributeNameOrWildcardContext attributeNameOrWildcard() { + return getRuleContext(AttributeNameOrWildcardContext.class,0); + } + public TypeNameContext typeName() { + return getRuleContext(TypeNameContext.class,0); + } + public AttributeTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_attributeTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAttributeTest(this); + else return visitor.visitChildren(this); + } + } + + public final AttributeTestContext attributeTest() throws RecognitionException { + AttributeTestContext _localctx = new AttributeTestContext(_ctx, getState()); + enterRule(_localctx, 286, RULE_attributeTest); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1540); + match(Kattribute); + setState(1541); + match(T__7); + setState(1547); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { + { + setState(1542); + attributeNameOrWildcard(); + setState(1545); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==T__12) { + { + setState(1543); + match(T__12); + setState(1544); + ((AttributeTestContext)_localctx).type = typeName(); + } + } + + } + } + + setState(1549); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AttributeNameOrWildcardContext extends ParserRuleContext { + public AttributeNameContext attributeName() { + return getRuleContext(AttributeNameContext.class,0); + } + public AttributeNameOrWildcardContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_attributeNameOrWildcard; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAttributeNameOrWildcard(this); + else return visitor.visitChildren(this); + } + } + + public final AttributeNameOrWildcardContext attributeNameOrWildcard() throws RecognitionException { + AttributeNameOrWildcardContext _localctx = new AttributeNameOrWildcardContext(_ctx, getState()); + enterRule(_localctx, 288, RULE_attributeNameOrWildcard); + try { + setState(1553); + _errHandler.sync(this); + switch (_input.LA(1)) { + case Kfor: + case Klet: + case Kwhere: + case Kgroup: + case Kby: + case Korder: + case Kreturn: + case Kif: + case Kin: + case Kas: + case Kat: + case Kallowing: + case Kempty: + case Kcount: + case Kstable: + case Kascending: + case Kdescending: + case Ksome: + case Kevery: + case Ksatisfies: + case Kcollation: + case Kgreatest: + case Kleast: + case Kswitch: + case Kcase: + case Ktry: + case Kcatch: + case Kdefault: + case Kthen: + case Kelse: + case Ktypeswitch: + case Kor: + case Kand: + case Knot: + case Kto: + case Kinstance: + case Kof: + case Kstatically: + case Kis: + case Ktreat: + case Kcast: + case Kcastable: + case Kversion: + case Kjsoniq: + case Kunordered: + case Ktrue: + case Kfalse: + case Ktype: + case Kvalidate: + case Kannotate: + case Kdeclare: + case Kcontext: + case Kitem: + case Kvariable: + case Kinsert: + case Kdelete: + case Krename: + case Kreplace: + case Kcopy: + case Kmodify: + case Kappend: + case Kinto: + case Kvalue: + case Kjson: + case Kwith: + case Kposition: + case Kbreak: + case Kloop: + case Kcontinue: + case Kexit: + case Kreturning: + case Kwhile: + case NullLiteral: + case NCName: + enterOuterAlt(_localctx, 1); + { + setState(1551); + attributeName(); + } + break; + case T__9: + enterOuterAlt(_localctx, 2); + { + setState(1552); + match(T__9); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SchemaAttributeTestContext extends ParserRuleContext { + public TerminalNode Kschema_attribute() { return getToken(JsoniqParser.Kschema_attribute, 0); } + public AttributeDeclarationContext attributeDeclaration() { + return getRuleContext(AttributeDeclarationContext.class,0); + } + public SchemaAttributeTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_schemaAttributeTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitSchemaAttributeTest(this); + else return visitor.visitChildren(this); + } + } + + public final SchemaAttributeTestContext schemaAttributeTest() throws RecognitionException { + SchemaAttributeTestContext _localctx = new SchemaAttributeTestContext(_ctx, getState()); + enterRule(_localctx, 290, RULE_schemaAttributeTest); + try { + enterOuterAlt(_localctx, 1); + { + setState(1555); + match(Kschema_attribute); + setState(1556); + match(T__7); + setState(1557); + attributeDeclaration(); + setState(1558); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ElementTestContext extends ParserRuleContext { + public TypeNameContext type; + public Token optional; + public TerminalNode Kelement() { return getToken(JsoniqParser.Kelement, 0); } + public ElementNameOrWildcardContext elementNameOrWildcard() { + return getRuleContext(ElementNameOrWildcardContext.class,0); + } + public TypeNameContext typeName() { + return getRuleContext(TypeNameContext.class,0); + } + public TerminalNode ArgumentPlaceholder() { return getToken(JsoniqParser.ArgumentPlaceholder, 0); } + public ElementTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_elementTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitElementTest(this); + else return visitor.visitChildren(this); + } + } + + public final ElementTestContext elementTest() throws RecognitionException { + ElementTestContext _localctx = new ElementTestContext(_ctx, getState()); + enterRule(_localctx, 292, RULE_elementTest); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1560); + match(Kelement); + setState(1561); + match(T__7); + setState(1570); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { + { + setState(1562); + elementNameOrWildcard(); + setState(1568); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==T__12) { + { + setState(1563); + match(T__12); + setState(1564); + ((ElementTestContext)_localctx).type = typeName(); + setState(1566); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ArgumentPlaceholder) { + { + setState(1565); + ((ElementTestContext)_localctx).optional = match(ArgumentPlaceholder); + } + } + + } + } + + } + } + + setState(1572); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ElementNameOrWildcardContext extends ParserRuleContext { + public ElementNameContext elementName() { + return getRuleContext(ElementNameContext.class,0); + } + public ElementNameOrWildcardContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_elementNameOrWildcard; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitElementNameOrWildcard(this); + else return visitor.visitChildren(this); + } + } + + public final ElementNameOrWildcardContext elementNameOrWildcard() throws RecognitionException { + ElementNameOrWildcardContext _localctx = new ElementNameOrWildcardContext(_ctx, getState()); + enterRule(_localctx, 294, RULE_elementNameOrWildcard); + try { + setState(1576); + _errHandler.sync(this); + switch (_input.LA(1)) { + case Kfor: + case Klet: + case Kwhere: + case Kgroup: + case Kby: + case Korder: + case Kreturn: + case Kif: + case Kin: + case Kas: + case Kat: + case Kallowing: + case Kempty: + case Kcount: + case Kstable: + case Kascending: + case Kdescending: + case Ksome: + case Kevery: + case Ksatisfies: + case Kcollation: + case Kgreatest: + case Kleast: + case Kswitch: + case Kcase: + case Ktry: + case Kcatch: + case Kdefault: + case Kthen: + case Kelse: + case Ktypeswitch: + case Kor: + case Kand: + case Knot: + case Kto: + case Kinstance: + case Kof: + case Kstatically: + case Kis: + case Ktreat: + case Kcast: + case Kcastable: + case Kversion: + case Kjsoniq: + case Kunordered: + case Ktrue: + case Kfalse: + case Ktype: + case Kvalidate: + case Kannotate: + case Kdeclare: + case Kcontext: + case Kitem: + case Kvariable: + case Kinsert: + case Kdelete: + case Krename: + case Kreplace: + case Kcopy: + case Kmodify: + case Kappend: + case Kinto: + case Kvalue: + case Kjson: + case Kwith: + case Kposition: + case Kbreak: + case Kloop: + case Kcontinue: + case Kexit: + case Kreturning: + case Kwhile: + case NullLiteral: + case NCName: + enterOuterAlt(_localctx, 1); + { + setState(1574); + elementName(); + } + break; + case T__9: + enterOuterAlt(_localctx, 2); + { + setState(1575); + match(T__9); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SchemaElementTestContext extends ParserRuleContext { + public TerminalNode Kschema_element() { return getToken(JsoniqParser.Kschema_element, 0); } + public ElementDeclarationContext elementDeclaration() { + return getRuleContext(ElementDeclarationContext.class,0); + } + public SchemaElementTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_schemaElementTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitSchemaElementTest(this); + else return visitor.visitChildren(this); + } + } + + public final SchemaElementTestContext schemaElementTest() throws RecognitionException { + SchemaElementTestContext _localctx = new SchemaElementTestContext(_ctx, getState()); + enterRule(_localctx, 296, RULE_schemaElementTest); + try { + enterOuterAlt(_localctx, 1); + { + setState(1578); + match(Kschema_element); + setState(1579); + match(T__7); + setState(1580); + elementDeclaration(); + setState(1581); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ElementDeclarationContext extends ParserRuleContext { + public ElementNameContext elementName() { + return getRuleContext(ElementNameContext.class,0); + } + public ElementDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_elementDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitElementDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final ElementDeclarationContext elementDeclaration() throws RecognitionException { + ElementDeclarationContext _localctx = new ElementDeclarationContext(_ctx, getState()); + enterRule(_localctx, 298, RULE_elementDeclaration); + try { + enterOuterAlt(_localctx, 1); + { + setState(1583); + elementName(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AttributeNameContext extends ParserRuleContext { + public QnameContext qname() { + return getRuleContext(QnameContext.class,0); + } + public AttributeNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_attributeName; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAttributeName(this); + else return visitor.visitChildren(this); + } + } + + public final AttributeNameContext attributeName() throws RecognitionException { + AttributeNameContext _localctx = new AttributeNameContext(_ctx, getState()); + enterRule(_localctx, 300, RULE_attributeName); + try { + enterOuterAlt(_localctx, 1); + { + setState(1585); + qname(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ElementNameContext extends ParserRuleContext { + public QnameContext qname() { + return getRuleContext(QnameContext.class,0); + } + public ElementNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_elementName; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitElementName(this); + else return visitor.visitChildren(this); + } + } + + public final ElementNameContext elementName() throws RecognitionException { + ElementNameContext _localctx = new ElementNameContext(_ctx, getState()); + enterRule(_localctx, 302, RULE_elementName); + try { + enterOuterAlt(_localctx, 1); + { + setState(1587); + qname(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SimpleTypeNameContext extends ParserRuleContext { + public TypeNameContext typeName() { + return getRuleContext(TypeNameContext.class,0); + } + public SimpleTypeNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_simpleTypeName; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitSimpleTypeName(this); + else return visitor.visitChildren(this); + } + } + + public final SimpleTypeNameContext simpleTypeName() throws RecognitionException { + SimpleTypeNameContext _localctx = new SimpleTypeNameContext(_ctx, getState()); + enterRule(_localctx, 304, RULE_simpleTypeName); + try { + enterOuterAlt(_localctx, 1); + { + setState(1589); + typeName(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TypeNameContext extends ParserRuleContext { + public QnameContext qname() { + return getRuleContext(QnameContext.class,0); + } + public TypeNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typeName; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitTypeName(this); + else return visitor.visitChildren(this); + } + } + + public final TypeNameContext typeName() throws RecognitionException { + TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); + enterRule(_localctx, 306, RULE_typeName); + try { + enterOuterAlt(_localctx, 1); + { + setState(1591); + qname(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MapTestContext extends ParserRuleContext { + public AnyMapTestContext anyMapTest() { + return getRuleContext(AnyMapTestContext.class,0); + } + public TypedMapTestContext typedMapTest() { + return getRuleContext(TypedMapTestContext.class,0); + } + public MapTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_mapTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitMapTest(this); + else return visitor.visitChildren(this); + } + } + + public final MapTestContext mapTest() throws RecognitionException { + MapTestContext _localctx = new MapTestContext(_ctx, getState()); + enterRule(_localctx, 308, RULE_mapTest); + try { + setState(1595); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1593); + anyMapTest(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1594); + typedMapTest(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AnyMapTestContext extends ParserRuleContext { + public TerminalNode Kmap() { return getToken(JsoniqParser.Kmap, 0); } + public AnyMapTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_anyMapTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAnyMapTest(this); + else return visitor.visitChildren(this); + } + } + + public final AnyMapTestContext anyMapTest() throws RecognitionException { + AnyMapTestContext _localctx = new AnyMapTestContext(_ctx, getState()); + enterRule(_localctx, 310, RULE_anyMapTest); + try { + enterOuterAlt(_localctx, 1); + { + setState(1597); + match(Kmap); + setState(1598); + match(T__7); + setState(1599); + match(T__9); + setState(1600); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TypedMapTestContext extends ParserRuleContext { + public TerminalNode Kmap() { return getToken(JsoniqParser.Kmap, 0); } + public QnameContext qname() { + return getRuleContext(QnameContext.class,0); + } + public SequenceTypeContext sequenceType() { + return getRuleContext(SequenceTypeContext.class,0); + } + public TypedMapTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typedMapTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitTypedMapTest(this); + else return visitor.visitChildren(this); + } + } + + public final TypedMapTestContext typedMapTest() throws RecognitionException { + TypedMapTestContext _localctx = new TypedMapTestContext(_ctx, getState()); + enterRule(_localctx, 312, RULE_typedMapTest); + try { + enterOuterAlt(_localctx, 1); + { + setState(1602); + match(Kmap); + setState(1603); + match(T__7); + setState(1604); + qname(); + setState(1605); + match(T__12); + setState(1606); + sequenceType(); + setState(1607); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ArrayTestContext extends ParserRuleContext { + public AnyArrayTestContext anyArrayTest() { + return getRuleContext(AnyArrayTestContext.class,0); + } + public TypedArrayTestContext typedArrayTest() { + return getRuleContext(TypedArrayTestContext.class,0); + } + public ArrayTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arrayTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitArrayTest(this); + else return visitor.visitChildren(this); + } + } + + public final ArrayTestContext arrayTest() throws RecognitionException { + ArrayTestContext _localctx = new ArrayTestContext(_ctx, getState()); + enterRule(_localctx, 314, RULE_arrayTest); + try { + setState(1611); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1609); + anyArrayTest(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1610); + typedArrayTest(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AnyArrayTestContext extends ParserRuleContext { + public TerminalNode Karray() { return getToken(JsoniqParser.Karray, 0); } + public AnyArrayTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_anyArrayTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAnyArrayTest(this); + else return visitor.visitChildren(this); + } + } + + public final AnyArrayTestContext anyArrayTest() throws RecognitionException { + AnyArrayTestContext _localctx = new AnyArrayTestContext(_ctx, getState()); + enterRule(_localctx, 316, RULE_anyArrayTest); + try { + enterOuterAlt(_localctx, 1); + { + setState(1613); + match(Karray); + setState(1614); + match(T__7); + setState(1615); + match(T__9); + setState(1616); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TypedArrayTestContext extends ParserRuleContext { + public TerminalNode Karray() { return getToken(JsoniqParser.Karray, 0); } + public SequenceTypeContext sequenceType() { + return getRuleContext(SequenceTypeContext.class,0); + } + public TypedArrayTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typedArrayTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitTypedArrayTest(this); + else return visitor.visitChildren(this); + } + } + + public final TypedArrayTestContext typedArrayTest() throws RecognitionException { + TypedArrayTestContext _localctx = new TypedArrayTestContext(_ctx, getState()); + enterRule(_localctx, 318, RULE_typedArrayTest); + try { + enterOuterAlt(_localctx, 1); + { + setState(1618); + match(Karray); + setState(1619); + match(T__7); + setState(1620); + sequenceType(); + setState(1621); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ParenthesizedItemTestContext extends ParserRuleContext { + public ItemTypeContext itemType() { + return getRuleContext(ItemTypeContext.class,0); + } + public ParenthesizedItemTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_parenthesizedItemTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitParenthesizedItemTest(this); + else return visitor.visitChildren(this); + } + } + + public final ParenthesizedItemTestContext parenthesizedItemTest() throws RecognitionException { + ParenthesizedItemTestContext _localctx = new ParenthesizedItemTestContext(_ctx, getState()); + enterRule(_localctx, 320, RULE_parenthesizedItemTest); + try { + enterOuterAlt(_localctx, 1); + { + setState(1623); + match(T__7); + setState(1624); + itemType(); + setState(1625); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AttributeDeclarationContext extends ParserRuleContext { + public AttributeNameContext attributeName() { + return getRuleContext(AttributeNameContext.class,0); + } + public AttributeDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_attributeDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAttributeDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final AttributeDeclarationContext attributeDeclaration() throws RecognitionException { + AttributeDeclarationContext _localctx = new AttributeDeclarationContext(_ctx, getState()); + enterRule(_localctx, 322, RULE_attributeDeclaration); + try { + enterOuterAlt(_localctx, 1); + { + setState(1627); + attributeName(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MlNodeTestContext extends ParserRuleContext { + public MlArrayNodeTestContext mlArrayNodeTest() { + return getRuleContext(MlArrayNodeTestContext.class,0); + } + public MlObjectNodeTestContext mlObjectNodeTest() { + return getRuleContext(MlObjectNodeTestContext.class,0); + } + public MlNumberNodeTestContext mlNumberNodeTest() { + return getRuleContext(MlNumberNodeTestContext.class,0); + } + public MlBooleanNodeTestContext mlBooleanNodeTest() { + return getRuleContext(MlBooleanNodeTestContext.class,0); + } + public MlNullNodeTestContext mlNullNodeTest() { + return getRuleContext(MlNullNodeTestContext.class,0); + } + public MlNodeTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_mlNodeTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitMlNodeTest(this); + else return visitor.visitChildren(this); + } + } + + public final MlNodeTestContext mlNodeTest() throws RecognitionException { + MlNodeTestContext _localctx = new MlNodeTestContext(_ctx, getState()); + enterRule(_localctx, 324, RULE_mlNodeTest); + try { + setState(1634); + _errHandler.sync(this); + switch (_input.LA(1)) { + case Karray_node: + enterOuterAlt(_localctx, 1); + { + setState(1629); + mlArrayNodeTest(); + } + break; + case Kobject_node: + enterOuterAlt(_localctx, 2); + { + setState(1630); + mlObjectNodeTest(); + } + break; + case Knumber_node: + enterOuterAlt(_localctx, 3); + { + setState(1631); + mlNumberNodeTest(); + } + break; + case Kboolean_node: + enterOuterAlt(_localctx, 4); + { + setState(1632); + mlBooleanNodeTest(); + } + break; + case Knull_node: + enterOuterAlt(_localctx, 5); + { + setState(1633); + mlNullNodeTest(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MlArrayNodeTestContext extends ParserRuleContext { + public TerminalNode Karray_node() { return getToken(JsoniqParser.Karray_node, 0); } + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public MlArrayNodeTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_mlArrayNodeTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitMlArrayNodeTest(this); + else return visitor.visitChildren(this); + } + } + + public final MlArrayNodeTestContext mlArrayNodeTest() throws RecognitionException { + MlArrayNodeTestContext _localctx = new MlArrayNodeTestContext(_ctx, getState()); + enterRule(_localctx, 326, RULE_mlArrayNodeTest); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1636); + match(Karray_node); + setState(1637); + match(T__7); + setState(1639); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==STRING) { + { + setState(1638); + stringLiteral(); + } + } + + setState(1641); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MlObjectNodeTestContext extends ParserRuleContext { + public TerminalNode Kobject_node() { return getToken(JsoniqParser.Kobject_node, 0); } + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public MlObjectNodeTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_mlObjectNodeTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitMlObjectNodeTest(this); + else return visitor.visitChildren(this); + } + } + + public final MlObjectNodeTestContext mlObjectNodeTest() throws RecognitionException { + MlObjectNodeTestContext _localctx = new MlObjectNodeTestContext(_ctx, getState()); + enterRule(_localctx, 328, RULE_mlObjectNodeTest); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1643); + match(Kobject_node); + setState(1644); + match(T__7); + setState(1646); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==STRING) { + { + setState(1645); + stringLiteral(); + } + } + + setState(1648); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MlNumberNodeTestContext extends ParserRuleContext { + public TerminalNode Knumber_node() { return getToken(JsoniqParser.Knumber_node, 0); } + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public MlNumberNodeTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_mlNumberNodeTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitMlNumberNodeTest(this); + else return visitor.visitChildren(this); + } + } + + public final MlNumberNodeTestContext mlNumberNodeTest() throws RecognitionException { + MlNumberNodeTestContext _localctx = new MlNumberNodeTestContext(_ctx, getState()); + enterRule(_localctx, 330, RULE_mlNumberNodeTest); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1650); + match(Knumber_node); + setState(1651); + match(T__7); + setState(1653); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==STRING) { + { + setState(1652); + stringLiteral(); + } + } + + setState(1655); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MlBooleanNodeTestContext extends ParserRuleContext { + public TerminalNode Kboolean_node() { return getToken(JsoniqParser.Kboolean_node, 0); } + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public MlBooleanNodeTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_mlBooleanNodeTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitMlBooleanNodeTest(this); + else return visitor.visitChildren(this); + } + } + + public final MlBooleanNodeTestContext mlBooleanNodeTest() throws RecognitionException { + MlBooleanNodeTestContext _localctx = new MlBooleanNodeTestContext(_ctx, getState()); + enterRule(_localctx, 332, RULE_mlBooleanNodeTest); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1657); + match(Kboolean_node); + setState(1658); + match(T__7); + setState(1660); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==STRING) { + { + setState(1659); + stringLiteral(); + } + } + + setState(1662); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MlNullNodeTestContext extends ParserRuleContext { + public TerminalNode Knull_node() { return getToken(JsoniqParser.Knull_node, 0); } + public StringLiteralContext stringLiteral() { + return getRuleContext(StringLiteralContext.class,0); + } + public MlNullNodeTestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_mlNullNodeTest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitMlNullNodeTest(this); + else return visitor.visitChildren(this); + } + } + + public final MlNullNodeTestContext mlNullNodeTest() throws RecognitionException { + MlNullNodeTestContext _localctx = new MlNullNodeTestContext(_ctx, getState()); + enterRule(_localctx, 334, RULE_mlNullNodeTest); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1664); + match(Knull_node); + setState(1665); + match(T__7); + setState(1667); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==STRING) { + { + setState(1666); + stringLiteral(); + } + } + + setState(1669); + match(T__8); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SequenceTypeContext extends ParserRuleContext { + public ItemTypeContext item; + public Token s168; + public List question = new ArrayList(); + public Token s10; + public List star = new ArrayList(); + public Token s45; + public List plus = new ArrayList(); + public ItemTypeContext itemType() { + return getRuleContext(ItemTypeContext.class,0); + } + public TerminalNode ArgumentPlaceholder() { return getToken(JsoniqParser.ArgumentPlaceholder, 0); } + public SequenceTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_sequenceType; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitSequenceType(this); + else return visitor.visitChildren(this); + } + } + + public final SequenceTypeContext sequenceType() throws RecognitionException { + SequenceTypeContext _localctx = new SequenceTypeContext(_ctx, getState()); + enterRule(_localctx, 336, RULE_sequenceType); + try { + setState(1679); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1671); + match(T__7); + setState(1672); + match(T__8); + } + break; + case 2: enterOuterAlt(_localctx, 2); { - setState(1265); + setState(1673); ((SequenceTypeContext)_localctx).item = itemType(); - setState(1269); + setState(1677); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { case 1: { - setState(1266); - ((SequenceTypeContext)_localctx).s134 = match(ArgumentPlaceholder); - ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s134); + setState(1674); + ((SequenceTypeContext)_localctx).s168 = match(ArgumentPlaceholder); + ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s168); } break; case 2: { - setState(1267); - ((SequenceTypeContext)_localctx).s11 = match(T__10); - ((SequenceTypeContext)_localctx).star.add(((SequenceTypeContext)_localctx).s11); + setState(1675); + ((SequenceTypeContext)_localctx).s10 = match(T__9); + ((SequenceTypeContext)_localctx).star.add(((SequenceTypeContext)_localctx).s10); } break; case 3: { - setState(1268); - ((SequenceTypeContext)_localctx).s48 = match(T__47); - ((SequenceTypeContext)_localctx).plus.add(((SequenceTypeContext)_localctx).s48); + setState(1676); + ((SequenceTypeContext)_localctx).s45 = match(T__44); + ((SequenceTypeContext)_localctx).plus.add(((SequenceTypeContext)_localctx).s45); } break; } } break; - default: - throw new NoViableAltException(this); } } catch (RecognitionException re) { @@ -9096,7 +12413,7 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { } public static class ObjectConstructorContext extends ParserRuleContext { - public Token s59; + public Token s57; public List merge_operator = new ArrayList(); public List pairConstructor() { return getRuleContexts(PairConstructorContext.class); @@ -9120,57 +12437,57 @@ public T accept(ParseTreeVisitor visitor) { public final ObjectConstructorContext objectConstructor() throws RecognitionException { ObjectConstructorContext _localctx = new ObjectConstructorContext(_ctx, getState()); - enterRule(_localctx, 232, RULE_objectConstructor); + enterRule(_localctx, 338, RULE_objectConstructor); int _la; try { - setState(1289); + setState(1697); _errHandler.sync(this); switch (_input.LA(1)) { - case T__6: + case T__5: enterOuterAlt(_localctx, 1); { - setState(1273); - match(T__6); - setState(1282); + setState(1681); + match(T__5); + setState(1690); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1274); + setState(1682); pairConstructor(); - setState(1279); + setState(1687); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + while (_la==T__12) { { { - setState(1275); - match(T__13); - setState(1276); + setState(1683); + match(T__12); + setState(1684); pairConstructor(); } } - setState(1281); + setState(1689); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1284); - match(T__7); + setState(1692); + match(T__6); } break; - case T__58: + case T__56: enterOuterAlt(_localctx, 2); { - setState(1285); - ((ObjectConstructorContext)_localctx).s59 = match(T__58); - ((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s59); - setState(1286); + setState(1693); + ((ObjectConstructorContext)_localctx).s57 = match(T__56); + ((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s57); + setState(1694); expr(); - setState(1287); - match(T__59); + setState(1695); + match(T__57); } break; default: @@ -9188,66 +12505,6 @@ public final ObjectConstructorContext objectConstructor() throws RecognitionExce return _localctx; } - public static class ItemTypeContext extends ParserRuleContext { - public QnameContext qname() { - return getRuleContext(QnameContext.class,0); - } - public TerminalNode NullLiteral() { return getToken(JsoniqParser.NullLiteral, 0); } - public FunctionTestContext functionTest() { - return getRuleContext(FunctionTestContext.class,0); - } - public ItemTypeContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_itemType; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitItemType(this); - else return visitor.visitChildren(this); - } - } - - public final ItemTypeContext itemType() throws RecognitionException { - ItemTypeContext _localctx = new ItemTypeContext(_ctx, getState()); - enterRule(_localctx, 234, RULE_itemType); - try { - setState(1294); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(1291); - qname(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(1292); - match(NullLiteral); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(1293); - functionTest(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - public static class FunctionTestContext extends ParserRuleContext { public AnyFunctionTestContext anyFunctionTest() { return getRuleContext(AnyFunctionTestContext.class,0); @@ -9268,22 +12525,22 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTestContext functionTest() throws RecognitionException { FunctionTestContext _localctx = new FunctionTestContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_functionTest); + enterRule(_localctx, 340, RULE_functionTest); try { enterOuterAlt(_localctx, 1); { - setState(1298); + setState(1701); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: { - setState(1296); + setState(1699); anyFunctionTest(); } break; case 2: { - setState(1297); + setState(1700); typedFunctionTest(); } break; @@ -9315,18 +12572,18 @@ public T accept(ParseTreeVisitor visitor) { public final AnyFunctionTestContext anyFunctionTest() throws RecognitionException { AnyFunctionTestContext _localctx = new AnyFunctionTestContext(_ctx, getState()); - enterRule(_localctx, 238, RULE_anyFunctionTest); + enterRule(_localctx, 342, RULE_anyFunctionTest); try { enterOuterAlt(_localctx, 1); { - setState(1300); - match(T__30); - setState(1301); - match(T__8); - setState(1302); - match(T__10); - setState(1303); + setState(1703); + match(T__28); + setState(1704); + match(T__7); + setState(1705); match(T__9); + setState(1706); + match(T__8); } } catch (RecognitionException re) { @@ -9364,48 +12621,48 @@ public T accept(ParseTreeVisitor visitor) { public final TypedFunctionTestContext typedFunctionTest() throws RecognitionException { TypedFunctionTestContext _localctx = new TypedFunctionTestContext(_ctx, getState()); - enterRule(_localctx, 240, RULE_typedFunctionTest); + enterRule(_localctx, 344, RULE_typedFunctionTest); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1305); - match(T__30); - setState(1306); - match(T__8); - setState(1315); + setState(1708); + match(T__28); + setState(1709); + match(T__7); + setState(1718); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__30) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__7) | (1L << T__28) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kattribute - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (Karray - 128)) | (1L << (Kmap - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1307); + setState(1710); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); - setState(1312); + setState(1715); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { + while (_la==T__12) { { { - setState(1308); - match(T__13); - setState(1309); + setState(1711); + match(T__12); + setState(1712); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); } } - setState(1314); + setState(1717); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1317); - match(T__9); - setState(1318); + setState(1720); + match(T__8); + setState(1721); match(Kas); - setState(1319); + setState(1722); ((TypedFunctionTestContext)_localctx).rt = sequenceType(); } } @@ -9422,7 +12679,7 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce public static class SingleTypeContext extends ParserRuleContext { public ItemTypeContext item; - public Token s134; + public Token s168; public List question = new ArrayList(); public ItemTypeContext itemType() { return getRuleContext(ItemTypeContext.class,0); @@ -9441,20 +12698,20 @@ public T accept(ParseTreeVisitor visitor) { public final SingleTypeContext singleType() throws RecognitionException { SingleTypeContext _localctx = new SingleTypeContext(_ctx, getState()); - enterRule(_localctx, 242, RULE_singleType); + enterRule(_localctx, 346, RULE_singleType); try { enterOuterAlt(_localctx, 1); { - setState(1321); + setState(1724); ((SingleTypeContext)_localctx).item = itemType(); - setState(1323); + setState(1726); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { case 1: { - setState(1322); - ((SingleTypeContext)_localctx).s134 = match(ArgumentPlaceholder); - ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s134); + setState(1725); + ((SingleTypeContext)_localctx).s168 = match(ArgumentPlaceholder); + ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s168); } break; } @@ -9496,30 +12753,30 @@ public T accept(ParseTreeVisitor visitor) { public final PairConstructorContext pairConstructor() throws RecognitionException { PairConstructorContext _localctx = new PairConstructorContext(_ctx, getState()); - enterRule(_localctx, 244, RULE_pairConstructor); + enterRule(_localctx, 348, RULE_pairConstructor); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1327); + setState(1730); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { case 1: { - setState(1325); + setState(1728); ((PairConstructorContext)_localctx).lhs = exprSingle(); } break; case 2: { - setState(1326); + setState(1729); ((PairConstructorContext)_localctx).name = match(NCName); } break; } - setState(1329); + setState(1732); _la = _input.LA(1); - if ( !(_la==T__17 || _la==ArgumentPlaceholder) ) { + if ( !(_la==T__16 || _la==ArgumentPlaceholder) ) { _errHandler.recoverInline(this); } else { @@ -9527,7 +12784,7 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio _errHandler.reportMatch(this); consume(); } - setState(1330); + setState(1733); ((PairConstructorContext)_localctx).rhs = exprSingle(); } } @@ -9559,25 +12816,25 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayConstructorContext arrayConstructor() throws RecognitionException { ArrayConstructorContext _localctx = new ArrayConstructorContext(_ctx, getState()); - enterRule(_localctx, 246, RULE_arrayConstructor); + enterRule(_localctx, 350, RULE_arrayConstructor); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1332); - match(T__53); - setState(1334); + setState(1735); + match(T__50); + setState(1737); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1333); + setState(1736); expr(); } } - setState(1336); - match(T__54); + setState(1739); + match(T__51); } } catch (RecognitionException re) { @@ -9608,11 +12865,11 @@ public T accept(ParseTreeVisitor visitor) { public final UriLiteralContext uriLiteral() throws RecognitionException { UriLiteralContext _localctx = new UriLiteralContext(_ctx, getState()); - enterRule(_localctx, 248, RULE_uriLiteral); + enterRule(_localctx, 352, RULE_uriLiteral); try { enterOuterAlt(_localctx, 1); { - setState(1338); + setState(1741); stringLiteral(); } } @@ -9642,11 +12899,11 @@ public T accept(ParseTreeVisitor visitor) { public final StringLiteralContext stringLiteral() throws RecognitionException { StringLiteralContext _localctx = new StringLiteralContext(_ctx, getState()); - enterRule(_localctx, 250, RULE_stringLiteral); + enterRule(_localctx, 354, RULE_stringLiteral); try { enterOuterAlt(_localctx, 1); { - setState(1340); + setState(1743); match(STRING); } } @@ -9748,14 +13005,14 @@ public T accept(ParseTreeVisitor visitor) { public final KeyWordsContext keyWords() throws RecognitionException { KeyWordsContext _localctx = new KeyWordsContext(_ctx, getState()); - enterRule(_localctx, 252, RULE_keyWords); + enterRule(_localctx, 356, RULE_keyWords); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1342); + setState(1745); _la = _input.LA(1); - if ( !(((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & ((1L << (Kfor - 61)) | (1L << (Klet - 61)) | (1L << (Kwhere - 61)) | (1L << (Kgroup - 61)) | (1L << (Kby - 61)) | (1L << (Korder - 61)) | (1L << (Kreturn - 61)) | (1L << (Kif - 61)) | (1L << (Kin - 61)) | (1L << (Kas - 61)) | (1L << (Kat - 61)) | (1L << (Kallowing - 61)) | (1L << (Kempty - 61)) | (1L << (Kcount - 61)) | (1L << (Kstable - 61)) | (1L << (Kascending - 61)) | (1L << (Kdescending - 61)) | (1L << (Ksome - 61)) | (1L << (Kevery - 61)) | (1L << (Ksatisfies - 61)) | (1L << (Kcollation - 61)) | (1L << (Kgreatest - 61)) | (1L << (Kleast - 61)) | (1L << (Kswitch - 61)) | (1L << (Kcase - 61)) | (1L << (Ktry - 61)) | (1L << (Kcatch - 61)) | (1L << (Kdefault - 61)) | (1L << (Kthen - 61)) | (1L << (Kelse - 61)) | (1L << (Ktypeswitch - 61)) | (1L << (Kor - 61)) | (1L << (Kand - 61)) | (1L << (Knot - 61)) | (1L << (Kto - 61)) | (1L << (Kinstance - 61)) | (1L << (Kof - 61)) | (1L << (Kstatically - 61)) | (1L << (Kis - 61)) | (1L << (Ktreat - 61)) | (1L << (Kcast - 61)) | (1L << (Kcastable - 61)) | (1L << (Kversion - 61)) | (1L << (Kjsoniq - 61)) | (1L << (Kunordered - 61)) | (1L << (Ktrue - 61)) | (1L << (Kfalse - 61)) | (1L << (Ktype - 61)) | (1L << (Kvalidate - 61)) | (1L << (Kannotate - 61)) | (1L << (Kdeclare - 61)) | (1L << (Kcontext - 61)) | (1L << (Kitem - 61)) | (1L << (Kvariable - 61)) | (1L << (Kinsert - 61)) | (1L << (Kdelete - 61)) | (1L << (Krename - 61)) | (1L << (Kreplace - 61)) | (1L << (Kcopy - 61)) | (1L << (Kmodify - 61)) | (1L << (Kappend - 61)) | (1L << (Kinto - 61)) | (1L << (Kvalue - 61)) | (1L << (Kjson - 61)))) != 0) || ((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (Kwith - 125)) | (1L << (Kposition - 125)) | (1L << (Kbreak - 125)) | (1L << (Kloop - 125)) | (1L << (Kcontinue - 125)) | (1L << (Kexit - 125)) | (1L << (Kreturning - 125)) | (1L << (Kwhile - 125)) | (1L << (NullLiteral - 125)))) != 0)) ) { + if ( !(((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (Kfor - 59)) | (1L << (Klet - 59)) | (1L << (Kwhere - 59)) | (1L << (Kgroup - 59)) | (1L << (Kby - 59)) | (1L << (Korder - 59)) | (1L << (Kreturn - 59)) | (1L << (Kif - 59)) | (1L << (Kin - 59)) | (1L << (Kas - 59)) | (1L << (Kat - 59)) | (1L << (Kallowing - 59)) | (1L << (Kempty - 59)) | (1L << (Kcount - 59)) | (1L << (Kstable - 59)) | (1L << (Kascending - 59)) | (1L << (Kdescending - 59)) | (1L << (Ksome - 59)) | (1L << (Kevery - 59)) | (1L << (Ksatisfies - 59)) | (1L << (Kcollation - 59)) | (1L << (Kgreatest - 59)) | (1L << (Kleast - 59)) | (1L << (Kswitch - 59)) | (1L << (Kcase - 59)) | (1L << (Ktry - 59)) | (1L << (Kcatch - 59)) | (1L << (Kdefault - 59)) | (1L << (Kthen - 59)) | (1L << (Kelse - 59)) | (1L << (Ktypeswitch - 59)) | (1L << (Kor - 59)) | (1L << (Kand - 59)) | (1L << (Knot - 59)) | (1L << (Kto - 59)) | (1L << (Kinstance - 59)) | (1L << (Kof - 59)) | (1L << (Kstatically - 59)) | (1L << (Kis - 59)) | (1L << (Ktreat - 59)) | (1L << (Kcast - 59)) | (1L << (Kcastable - 59)) | (1L << (Kversion - 59)) | (1L << (Kjsoniq - 59)) | (1L << (Kunordered - 59)) | (1L << (Ktrue - 59)) | (1L << (Kfalse - 59)) | (1L << (Ktype - 59)) | (1L << (Kvalidate - 59)) | (1L << (Kannotate - 59)) | (1L << (Kdeclare - 59)) | (1L << (Kcontext - 59)) | (1L << (Kitem - 59)) | (1L << (Kvariable - 59)) | (1L << (Kinsert - 59)) | (1L << (Kdelete - 59)) | (1L << (Krename - 59)) | (1L << (Kreplace - 59)) | (1L << (Kcopy - 59)) | (1L << (Kmodify - 59)) | (1L << (Kappend - 59)) | (1L << (Kinto - 59)) | (1L << (Kvalue - 59)) | (1L << (Kjson - 59)))) != 0) || ((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (Kwith - 123)) | (1L << (Kposition - 123)) | (1L << (Kbreak - 123)) | (1L << (Kloop - 123)) | (1L << (Kcontinue - 123)) | (1L << (Kexit - 123)) | (1L << (Kreturning - 123)) | (1L << (Kwhile - 123)) | (1L << (NullLiteral - 123)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -9777,7 +13034,7 @@ public final KeyWordsContext keyWords() throws RecognitionException { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0092\u0543\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00b4\u06d6\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -9791,494 +13048,678 @@ public final KeyWordsContext keyWords() throws RecognitionException { "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k\t"+ "k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4"+ "w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080\t\u0080"+ - "\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\5\3\u0109\n\3\3\3\3\3\5\3\u010d\n\3\3"+ - "\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\5\6\u011d\n\6\3"+ - "\6\3\6\7\6\u0121\n\6\f\6\16\6\u0124\13\6\3\6\3\6\3\6\7\6\u0129\n\6\f\6"+ - "\16\6\u012c\13\6\3\7\3\7\3\b\7\b\u0131\n\b\f\b\16\b\u0134\13\b\3\t\3\t"+ - "\3\t\3\n\3\n\5\n\u013b\n\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+ - "\3\13\3\13\3\13\3\13\5\13\u014a\n\13\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3"+ - "\r\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\21\3"+ - "\21\3\21\3\21\3\21\3\22\3\22\5\22\u0168\n\22\3\22\3\22\3\22\3\22\3\22"+ - "\3\22\7\22\u0170\n\22\f\22\16\22\u0173\13\22\3\22\3\22\3\22\3\23\3\23"+ - "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\6\24\u0186"+ - "\n\24\r\24\16\24\u0187\3\24\3\24\3\24\3\24\3\25\3\25\6\25\u0190\n\25\r"+ - "\25\16\25\u0191\3\25\3\25\3\25\3\26\3\26\3\26\6\26\u019a\n\26\r\26\16"+ - "\26\u019b\3\27\3\27\3\27\5\27\u01a1\n\27\3\27\3\27\3\27\5\27\u01a6\n\27"+ - "\7\27\u01a8\n\27\f\27\16\27\u01ab\13\27\3\27\3\27\3\30\3\30\3\30\3\30"+ - "\3\30\6\30\u01b4\n\30\r\30\16\30\u01b5\3\30\3\30\5\30\u01ba\n\30\3\30"+ - "\3\30\3\30\3\31\3\31\3\31\3\31\5\31\u01c3\n\31\3\31\3\31\3\31\7\31\u01c8"+ - "\n\31\f\31\16\31\u01cb\13\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3"+ - "\32\7\32\u01d6\n\32\f\32\16\32\u01d9\13\32\3\32\5\32\u01dc\n\32\3\33\7"+ - "\33\u01df\n\33\f\33\16\33\u01e2\13\33\3\34\3\34\3\34\3\34\3\34\7\34\u01e9"+ - "\n\34\f\34\16\34\u01ec\13\34\3\34\3\34\3\35\3\35\3\35\5\35\u01f3\n\35"+ - "\3\35\3\35\5\35\u01f7\n\35\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37"+ - "\3\37\5\37\u0203\n\37\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\5!\u020f\n!\3\"\3"+ - "\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\5%\u0225\n"+ - "%\3%\3%\3%\3%\7%\u022b\n%\f%\16%\u022e\13%\3&\3&\5&\u0232\n&\3&\5&\u0235"+ - "\n&\3&\3&\5&\u0239\n&\3\'\3\'\3(\3(\3(\3(\3(\5(\u0242\n(\3(\3(\3(\3(\3"+ - "(\7(\u0249\n(\f(\16(\u024c\13(\5(\u024e\n(\3)\3)\3)\3)\3)\3)\5)\u0256"+ - "\n)\3)\3)\3)\3)\3)\5)\u025d\n)\5)\u025f\n)\3*\3*\3*\3*\3*\5*\u0266\n*"+ - "\3*\3*\3*\3*\3*\5*\u026d\n*\5*\u026f\n*\3+\3+\3+\3+\3+\3+\5+\u0277\n+"+ - "\3+\3+\3+\5+\u027c\n+\3+\3+\3+\3+\3+\5+\u0283\n+\3,\3,\3,\3,\3,\5,\u028a"+ - "\n,\3,\3,\3-\3-\3-\3-\3-\3-\5-\u0294\n-\3.\3.\3.\7.\u0299\n.\f.\16.\u029c"+ - "\13.\3/\3/\3/\3/\5/\u02a2\n/\3\60\3\60\3\60\7\60\u02a7\n\60\f\60\16\60"+ - "\u02aa\13\60\3\61\3\61\3\61\3\61\3\61\3\61\5\61\u02b2\n\61\3\62\3\62\3"+ - "\62\3\62\3\62\3\62\3\62\3\62\5\62\u02bc\n\62\3\63\3\63\5\63\u02c0\n\63"+ - "\3\63\3\63\3\63\3\63\3\63\3\63\7\63\u02c8\n\63\f\63\16\63\u02cb\13\63"+ - "\3\63\3\63\3\63\3\64\3\64\3\64\3\64\7\64\u02d4\n\64\f\64\16\64\u02d7\13"+ - "\64\3\65\3\65\3\65\5\65\u02dc\n\65\3\65\3\65\5\65\u02e0\n\65\3\65\3\65"+ - "\5\65\u02e4\n\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\7\66\u02ed\n\66\f"+ - "\66\16\66\u02f0\13\66\3\67\3\67\3\67\5\67\u02f5\n\67\3\67\3\67\3\67\3"+ - "8\38\38\39\39\39\39\39\79\u0302\n9\f9\169\u0305\139\3:\3:\3:\5:\u030a"+ - "\n:\3:\3:\5:\u030e\n:\3:\3:\5:\u0312\n:\3;\3;\3;\3;\3;\5;\u0319\n;\3;"+ - "\3;\3;\7;\u031e\n;\f;\16;\u0321\13;\3<\3<\3<\5<\u0326\n<\3<\3<\3<\5<\u032b"+ - "\n<\5<\u032d\n<\3<\3<\5<\u0331\n<\3=\3=\3=\3>\3>\5>\u0338\n>\3>\3>\3>"+ - "\7>\u033d\n>\f>\16>\u0340\13>\3>\3>\3>\3?\3?\3?\5?\u0348\n?\3?\3?\3?\3"+ - "@\3@\3@\3@\3@\6@\u0352\n@\r@\16@\u0353\3@\3@\3@\3@\3A\3A\6A\u035c\nA\r"+ - "A\16A\u035d\3A\3A\3A\3B\3B\3B\3B\3B\6B\u0368\nB\rB\16B\u0369\3B\3B\5B"+ - "\u036e\nB\3B\3B\3B\3C\3C\3C\3C\5C\u0377\nC\3C\3C\3C\7C\u037c\nC\fC\16"+ - "C\u037f\13C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\6E\u0392"+ - "\nE\rE\16E\u0393\3F\3F\3F\5F\u0399\nF\3F\3F\3F\5F\u039e\nF\7F\u03a0\n"+ - "F\fF\16F\u03a3\13F\3F\3F\3F\3F\3G\3G\3G\7G\u03ac\nG\fG\16G\u03af\13G\3"+ - "H\3H\3H\7H\u03b4\nH\fH\16H\u03b7\13H\3I\5I\u03ba\nI\3I\3I\3J\3J\3J\5J"+ - "\u03c1\nJ\3K\3K\3K\7K\u03c6\nK\fK\16K\u03c9\13K\3L\3L\3L\5L\u03ce\nL\3"+ - "M\3M\3M\7M\u03d3\nM\fM\16M\u03d6\13M\3N\3N\3N\7N\u03db\nN\fN\16N\u03de"+ - "\13N\3O\3O\3O\3O\5O\u03e4\nO\3P\3P\3P\3P\5P\u03ea\nP\3Q\3Q\3Q\3Q\5Q\u03f0"+ - "\nQ\3R\3R\3R\3R\5R\u03f6\nR\3S\3S\3S\3S\5S\u03fc\nS\3T\3T\3T\3T\3T\3T"+ - "\3T\7T\u0405\nT\fT\16T\u0408\13T\3U\3U\3U\5U\u040d\nU\3V\7V\u0410\nV\f"+ - "V\16V\u0413\13V\3V\3V\3W\3W\3W\5W\u041a\nW\3X\3X\3X\3X\3X\3X\3X\3Y\3Y"+ - "\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\7Z\u042d\nZ\fZ\16Z\u0430\13Z\3[\3[\3[\3[\3[\3"+ - "[\7[\u0438\n[\f[\16[\u043b\13[\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^"+ - "\3^\3^\3_\3_\3_\3_\3_\3_\3_\5_\u0451\n_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`"+ - "\3`\3`\3`\3`\3`\5`\u0462\n`\3a\3a\3a\3a\3b\3b\3b\3c\3c\5c\u046d\nc\3c"+ - "\3c\3d\3d\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3g\3g\3g\3h\3h\3h\5h\u0483\nh"+ - "\7h\u0485\nh\fh\16h\u0488\13h\3h\3h\3i\3i\5i\u048e\ni\3j\3j\5j\u0492\n"+ - "j\3k\3k\3k\3k\3l\3l\3l\3l\5l\u049c\nl\3l\3l\3l\5l\u04a1\nl\3l\3l\3l\3"+ - "l\3m\3m\3m\3m\3m\3m\3m\3m\5m\u04af\nm\3m\3m\3m\3m\3m\7m\u04b6\nm\fm\16"+ - "m\u04b9\13m\3m\3m\3m\5m\u04be\nm\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3p\3p\3"+ - "p\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\7q\u04d7\nq\fq\16q\u04da\13q\3q\3q\3q"+ - "\3q\3q\3r\3r\3r\3r\3r\3r\3s\3s\3s\6s\u04ea\ns\rs\16s\u04eb\3t\3t\3t\3"+ - "t\3u\3u\3u\3u\3u\3u\5u\u04f8\nu\5u\u04fa\nu\3v\3v\3v\3v\7v\u0500\nv\f"+ - "v\16v\u0503\13v\5v\u0505\nv\3v\3v\3v\3v\3v\5v\u050c\nv\3w\3w\3w\5w\u0511"+ - "\nw\3x\3x\5x\u0515\nx\3y\3y\3y\3y\3y\3z\3z\3z\3z\3z\7z\u0521\nz\fz\16"+ - "z\u0524\13z\5z\u0526\nz\3z\3z\3z\3z\3{\3{\5{\u052e\n{\3|\3|\5|\u0532\n"+ - "|\3|\3|\3|\3}\3}\5}\u0539\n}\3}\3}\3~\3~\3\177\3\177\3\u0080\3\u0080\3"+ - "\u0080\2\2\u0081\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62"+ - "\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088"+ - "\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0"+ - "\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8"+ - "\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0"+ - "\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8"+ - "\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\2\n"+ - "\4\2\22\22kk\3\2TU\3\2\25\36\4\2\6\6&\60\3\2\62\63\4\2\r\r\64\66\4\2\24"+ - "\24\u0088\u0088\4\2?\u0086\u0089\u0089\2\u0584\2\u0100\3\2\2\2\4\u0108"+ - "\3\2\2\2\6\u010e\3\2\2\2\b\u0111\3\2\2\2\n\u0122\3\2\2\2\f\u012d\3\2\2"+ - "\2\16\u0132\3\2\2\2\20\u0135\3\2\2\2\22\u0138\3\2\2\2\24\u0149\3\2\2\2"+ - "\26\u014b\3\2\2\2\30\u014e\3\2\2\2\32\u0154\3\2\2\2\34\u0158\3\2\2\2\36"+ - "\u015c\3\2\2\2 \u0160\3\2\2\2\"\u0167\3\2\2\2$\u0177\3\2\2\2&\u0180\3"+ - "\2\2\2(\u018f\3\2\2\2*\u0196\3\2\2\2,\u019d\3\2\2\2.\u01ae\3\2\2\2\60"+ - "\u01be\3\2\2\2\62\u01cf\3\2\2\2\64\u01e0\3\2\2\2\66\u01e3\3\2\2\28\u01ef"+ - "\3\2\2\2:\u01f8\3\2\2\2<\u0202\3\2\2\2>\u0204\3\2\2\2@\u020e\3\2\2\2B"+ - "\u0210\3\2\2\2D\u0215\3\2\2\2F\u0219\3\2\2\2H\u021f\3\2\2\2J\u0234\3\2"+ - "\2\2L\u023a\3\2\2\2N\u023c\3\2\2\2P\u024f\3\2\2\2R\u0260\3\2\2\2T\u0270"+ - "\3\2\2\2V\u0284\3\2\2\2X\u0293\3\2\2\2Z\u0295\3\2\2\2\\\u029d\3\2\2\2"+ - "^\u02a3\3\2\2\2`\u02b1\3\2\2\2b\u02bb\3\2\2\2d\u02bf\3\2\2\2f\u02cf\3"+ - "\2\2\2h\u02d8\3\2\2\2j\u02e8\3\2\2\2l\u02f1\3\2\2\2n\u02f9\3\2\2\2p\u02fc"+ - "\3\2\2\2r\u0306\3\2\2\2t\u0318\3\2\2\2v\u0322\3\2\2\2x\u0332\3\2\2\2z"+ - "\u0337\3\2\2\2|\u0344\3\2\2\2~\u034c\3\2\2\2\u0080\u035b\3\2\2\2\u0082"+ - "\u0362\3\2\2\2\u0084\u0372\3\2\2\2\u0086\u0383\3\2\2\2\u0088\u038c\3\2"+ - "\2\2\u008a\u0395\3\2\2\2\u008c\u03a8\3\2\2\2\u008e\u03b0\3\2\2\2\u0090"+ - "\u03b9\3\2\2\2\u0092\u03bd\3\2\2\2\u0094\u03c2\3\2\2\2\u0096\u03ca\3\2"+ - "\2\2\u0098\u03cf\3\2\2\2\u009a\u03d7\3\2\2\2\u009c\u03df\3\2\2\2\u009e"+ - "\u03e5\3\2\2\2\u00a0\u03eb\3\2\2\2\u00a2\u03f1\3\2\2\2\u00a4\u03f7\3\2"+ - "\2\2\u00a6\u03fd\3\2\2\2\u00a8\u040c\3\2\2\2\u00aa\u0411\3\2\2\2\u00ac"+ - "\u0419\3\2\2\2\u00ae\u041b\3\2\2\2\u00b0\u0422\3\2\2\2\u00b2\u0429\3\2"+ - "\2\2\u00b4\u0431\3\2\2\2\u00b6\u043c\3\2\2\2\u00b8\u0442\3\2\2\2\u00ba"+ - "\u0445\3\2\2\2\u00bc\u0449\3\2\2\2\u00be\u0461\3\2\2\2\u00c0\u0463\3\2"+ - "\2\2\u00c2\u0467\3\2\2\2\u00c4\u046a\3\2\2\2\u00c6\u0470\3\2\2\2\u00c8"+ - "\u0472\3\2\2\2\u00ca\u0477\3\2\2\2\u00cc\u047c\3\2\2\2\u00ce\u047f\3\2"+ - "\2\2\u00d0\u048d\3\2\2\2\u00d2\u0491\3\2\2\2\u00d4\u0493\3\2\2\2\u00d6"+ - "\u0497\3\2\2\2\u00d8\u04bd\3\2\2\2\u00da\u04bf\3\2\2\2\u00dc\u04c3\3\2"+ - "\2\2\u00de\u04c9\3\2\2\2\u00e0\u04d1\3\2\2\2\u00e2\u04e0\3\2\2\2\u00e4"+ - "\u04e6\3\2\2\2\u00e6\u04ed\3\2\2\2\u00e8\u04f9\3\2\2\2\u00ea\u050b\3\2"+ - "\2\2\u00ec\u0510\3\2\2\2\u00ee\u0514\3\2\2\2\u00f0\u0516\3\2\2\2\u00f2"+ - "\u051b\3\2\2\2\u00f4\u052b\3\2\2\2\u00f6\u0531\3\2\2\2\u00f8\u0536\3\2"+ - "\2\2\u00fa\u053c\3\2\2\2\u00fc\u053e\3\2\2\2\u00fe\u0540\3\2\2\2\u0100"+ - "\u0101\5\4\3\2\u0101\u0102\7\2\2\3\u0102\3\3\2\2\2\u0103\u0104\7j\2\2"+ - "\u0104\u0105\7i\2\2\u0105\u0106\5\u00fc\177\2\u0106\u0107\7\3\2\2\u0107"+ - "\u0109\3\2\2\2\u0108\u0103\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010c\3\2"+ - "\2\2\u010a\u010d\5\b\5\2\u010b\u010d\5\6\4\2\u010c\u010a\3\2\2\2\u010c"+ - "\u010b\3\2\2\2\u010d\5\3\2\2\2\u010e\u010f\5\n\6\2\u010f\u0110\5\f\7\2"+ - "\u0110\7\3\2\2\2\u0111\u0112\7\4\2\2\u0112\u0113\7\5\2\2\u0113\u0114\7"+ - "\u0090\2\2\u0114\u0115\7\6\2\2\u0115\u0116\5\u00fa~\2\u0116\u0117\7\3"+ - "\2\2\u0117\u0118\5\n\6\2\u0118\t\3\2\2\2\u0119\u011d\5<\37\2\u011a\u011d"+ - "\5> \2\u011b\u011d\5N(\2\u011c\u0119\3\2\2\2\u011c\u011a\3\2\2\2\u011c"+ - "\u011b\3\2\2\2\u011d\u011e\3\2\2\2\u011e\u011f\7\3\2\2\u011f\u0121\3\2"+ - "\2\2\u0120\u011c\3\2\2\2\u0121\u0124\3\2\2\2\u0122\u0120\3\2\2\2\u0122"+ - "\u0123\3\2\2\2\u0123\u012a\3\2\2\2\u0124\u0122\3\2\2\2\u0125\u0126\5@"+ - "!\2\u0126\u0127\7\3\2\2\u0127\u0129\3\2\2\2\u0128\u0125\3\2\2\2\u0129"+ - "\u012c\3\2\2\2\u012a\u0128\3\2\2\2\u012a\u012b\3\2\2\2\u012b\13\3\2\2"+ - "\2\u012c\u012a\3\2\2\2\u012d\u012e\5\22\n\2\u012e\r\3\2\2\2\u012f\u0131"+ - "\5\24\13\2\u0130\u012f\3\2\2\2\u0131\u0134\3\2\2\2\u0132\u0130\3\2\2\2"+ - "\u0132\u0133\3\2\2\2\u0133\17\3\2\2\2\u0134\u0132\3\2\2\2\u0135\u0136"+ - "\5\16\b\2\u0136\u0137\5^\60\2\u0137\21\3\2\2\2\u0138\u013a\5\16\b\2\u0139"+ - "\u013b\5^\60\2\u013a\u0139\3\2\2\2\u013a\u013b\3\2\2\2\u013b\23\3\2\2"+ - "\2\u013c\u014a\5\26\f\2\u013d\u014a\5\30\r\2\u013e\u014a\5\32\16\2\u013f"+ - "\u014a\5\34\17\2\u0140\u014a\5\36\20\2\u0141\u014a\5 \21\2\u0142\u014a"+ - "\5\"\22\2\u0143\u014a\5$\23\2\u0144\u014a\5&\24\2\u0145\u014a\5*\26\2"+ - "\u0146\u014a\5.\30\2\u0147\u014a\5\66\34\2\u0148\u014a\5:\36\2\u0149\u013c"+ - "\3\2\2\2\u0149\u013d\3\2\2\2\u0149\u013e\3\2\2\2\u0149\u013f\3\2\2\2\u0149"+ - "\u0140\3\2\2\2\u0149\u0141\3\2\2\2\u0149\u0142\3\2\2\2\u0149\u0143\3\2"+ - "\2\2\u0149\u0144\3\2\2\2\u0149\u0145\3\2\2\2\u0149\u0146\3\2\2\2\u0149"+ - "\u0147\3\2\2\2\u0149\u0148\3\2\2\2\u014a\25\3\2\2\2\u014b\u014c\5b\62"+ - "\2\u014c\u014d\7\3\2\2\u014d\27\3\2\2\2\u014e\u014f\7\7\2\2\u014f\u0150"+ - "\5J&\2\u0150\u0151\7\b\2\2\u0151\u0152\5`\61\2\u0152\u0153\7\3\2\2\u0153"+ - "\31\3\2\2\2\u0154\u0155\7\t\2\2\u0155\u0156\5\16\b\2\u0156\u0157\7\n\2"+ - "\2\u0157\33\3\2\2\2\u0158\u0159\7\u0081\2\2\u0159\u015a\7\u0082\2\2\u015a"+ - "\u015b\7\3\2\2\u015b\35\3\2\2\2\u015c\u015d\7\u0083\2\2\u015d\u015e\7"+ - "\u0082\2\2\u015e\u015f\7\3\2\2\u015f\37\3\2\2\2\u0160\u0161\7\u0084\2"+ - "\2\u0161\u0162\7\u0085\2\2\u0162\u0163\5`\61\2\u0163\u0164\7\3\2\2\u0164"+ - "!\3\2\2\2\u0165\u0168\5f\64\2\u0166\u0168\5j\66\2\u0167\u0165\3\2\2\2"+ - "\u0167\u0166\3\2\2\2\u0168\u0171\3\2\2\2\u0169\u0170\5f\64\2\u016a\u0170"+ - "\5j\66\2\u016b\u0170\5n8\2\u016c\u0170\5p9\2\u016d\u0170\5t;\2\u016e\u0170"+ - "\5x=\2\u016f\u0169\3\2\2\2\u016f\u016a\3\2\2\2\u016f\u016b\3\2\2\2\u016f"+ - "\u016c\3\2\2\2\u016f\u016d\3\2\2\2\u016f\u016e\3\2\2\2\u0170\u0173\3\2"+ - "\2\2\u0171\u016f\3\2\2\2\u0171\u0172\3\2\2\2\u0172\u0174\3\2\2\2\u0173"+ - "\u0171\3\2\2\2\u0174\u0175\7E\2\2\u0175\u0176\5\24\13\2\u0176#\3\2\2\2"+ - "\u0177\u0178\7F\2\2\u0178\u0179\7\13\2\2\u0179\u017a\5^\60\2\u017a\u017b"+ - "\7\f\2\2\u017b\u017c\7[\2\2\u017c\u017d\5\24\13\2\u017d\u017e\7\\\2\2"+ - "\u017e\u017f\5\24\13\2\u017f%\3\2\2\2\u0180\u0181\7V\2\2\u0181\u0182\7"+ - "\13\2\2\u0182\u0183\5^\60\2\u0183\u0185\7\f\2\2\u0184\u0186\5(\25\2\u0185"+ - "\u0184\3\2\2\2\u0186\u0187\3\2\2\2\u0187\u0185\3\2\2\2\u0187\u0188\3\2"+ - "\2\2\u0188\u0189\3\2\2\2\u0189\u018a\7Z\2\2\u018a\u018b\7E\2\2\u018b\u018c"+ - "\5\24\13\2\u018c\'\3\2\2\2\u018d\u018e\7W\2\2\u018e\u0190\5`\61\2\u018f"+ - "\u018d\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u018f\3\2\2\2\u0191\u0192\3\2"+ - "\2\2\u0192\u0193\3\2\2\2\u0193\u0194\7E\2\2\u0194\u0195\5\24\13\2\u0195"+ - ")\3\2\2\2\u0196\u0197\7X\2\2\u0197\u0199\5\32\16\2\u0198\u019a\5,\27\2"+ - "\u0199\u0198\3\2\2\2\u019a\u019b\3\2\2\2\u019b\u0199\3\2\2\2\u019b\u019c"+ - "\3\2\2\2\u019c+\3\2\2\2\u019d\u01a0\7Y\2\2\u019e\u01a1\7\r\2\2\u019f\u01a1"+ - "\5J&\2\u01a0\u019e\3\2\2\2\u01a0\u019f\3\2\2\2\u01a1\u01a9\3\2\2\2\u01a2"+ - "\u01a5\7\16\2\2\u01a3\u01a6\7\r\2\2\u01a4\u01a6\5J&\2\u01a5\u01a3\3\2"+ - "\2\2\u01a5\u01a4\3\2\2\2\u01a6\u01a8\3\2\2\2\u01a7\u01a2\3\2\2\2\u01a8"+ - "\u01ab\3\2\2\2\u01a9\u01a7\3\2\2\2\u01a9\u01aa\3\2\2\2\u01aa\u01ac\3\2"+ - "\2\2\u01ab\u01a9\3\2\2\2\u01ac\u01ad\5\32\16\2\u01ad-\3\2\2\2\u01ae\u01af"+ - "\7]\2\2\u01af\u01b0\7\13\2\2\u01b0\u01b1\5^\60\2\u01b1\u01b3\7\f\2\2\u01b2"+ - "\u01b4\5\60\31\2\u01b3\u01b2\3\2\2\2\u01b4\u01b5\3\2\2\2\u01b5\u01b3\3"+ - "\2\2\2\u01b5\u01b6\3\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01b9\7Z\2\2\u01b8"+ - "\u01ba\5\u00c2b\2\u01b9\u01b8\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bb"+ - "\3\2\2\2\u01bb\u01bc\7E\2\2\u01bc\u01bd\5\24\13\2\u01bd/\3\2\2\2\u01be"+ - "\u01c2\7W\2\2\u01bf\u01c0\5\u00c2b\2\u01c0\u01c1\7H\2\2\u01c1\u01c3\3"+ - "\2\2\2\u01c2\u01bf\3\2\2\2\u01c2\u01c3\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4"+ - "\u01c9\5\u00e8u\2\u01c5\u01c6\7\16\2\2\u01c6\u01c8\5\u00e8u\2\u01c7\u01c5"+ - "\3\2\2\2\u01c8\u01cb\3\2\2\2\u01c9\u01c7\3\2\2\2\u01c9\u01ca\3\2\2\2\u01ca"+ - "\u01cc\3\2\2\2\u01cb\u01c9\3\2\2\2\u01cc\u01cd\7E\2\2\u01cd\u01ce\5\24"+ - "\13\2\u01ce\61\3\2\2\2\u01cf\u01d0\7\17\2\2\u01d0\u01db\5J&\2\u01d1\u01d2"+ - "\7\13\2\2\u01d2\u01d7\7\u008a\2\2\u01d3\u01d4\7\20\2\2\u01d4\u01d6\7\u008a"+ - "\2\2\u01d5\u01d3\3\2\2\2\u01d6\u01d9\3\2\2\2\u01d7\u01d5\3\2\2\2\u01d7"+ - "\u01d8\3\2\2\2\u01d8\u01da\3\2\2\2\u01d9\u01d7\3\2\2\2\u01da\u01dc\7\f"+ - "\2\2\u01db\u01d1\3\2\2\2\u01db\u01dc\3\2\2\2\u01dc\63\3\2\2\2\u01dd\u01df"+ - "\5\62\32\2\u01de\u01dd\3\2\2\2\u01df\u01e2\3\2\2\2\u01e0\u01de\3\2\2\2"+ - "\u01e0\u01e1\3\2\2\2\u01e1\65\3\2\2\2\u01e2\u01e0\3\2\2\2\u01e3\u01e4"+ - "\5\64\33\2\u01e4\u01e5\7t\2\2\u01e5\u01ea\58\35\2\u01e6\u01e7\7\20\2\2"+ - "\u01e7\u01e9\58\35\2\u01e8\u01e6\3\2\2\2\u01e9\u01ec\3\2\2\2\u01ea\u01e8"+ - "\3\2\2\2\u01ea\u01eb\3\2\2\2\u01eb\u01ed\3\2\2\2\u01ec\u01ea\3\2\2\2\u01ed"+ - "\u01ee\7\3\2\2\u01ee\67\3\2\2\2\u01ef\u01f2\5\u00c2b\2\u01f0\u01f1\7H"+ - "\2\2\u01f1\u01f3\5\u00e8u\2\u01f2\u01f0\3\2\2\2\u01f2\u01f3\3\2\2\2\u01f3"+ - "\u01f6\3\2\2\2\u01f4\u01f5\7\b\2\2\u01f5\u01f7\5`\61\2\u01f6\u01f4\3\2"+ - "\2\2\u01f6\u01f7\3\2\2\2\u01f79\3\2\2\2\u01f8\u01f9\7\u0086\2\2\u01f9"+ - "\u01fa\7\13\2\2\u01fa\u01fb\5^\60\2\u01fb\u01fc\7\f\2\2\u01fc\u01fd\5"+ - "\24\13\2\u01fd;\3\2\2\2\u01fe\u0203\5B\"\2\u01ff\u0203\5D#\2\u0200\u0203"+ - "\5F$\2\u0201\u0203\5H%\2\u0202\u01fe\3\2\2\2\u0202\u01ff\3\2\2\2\u0202"+ - "\u0200\3\2\2\2\u0202\u0201\3\2\2\2\u0203=\3\2\2\2\u0204\u0205\7q\2\2\u0205"+ - "\u0206\7\5\2\2\u0206\u0207\7\u0090\2\2\u0207\u0208\7\6\2\2\u0208\u0209"+ - "\5\u00fa~\2\u0209?\3\2\2\2\u020a\u020f\5T+\2\u020b\u020f\5P)\2\u020c\u020f"+ - "\5V,\2\u020d\u020f\5R*\2\u020e\u020a\3\2\2\2\u020e\u020b\3\2\2\2\u020e"+ - "\u020c\3\2\2\2\u020e\u020d\3\2\2\2\u020fA\3\2\2\2\u0210\u0211\7q\2\2\u0211"+ - "\u0212\7Z\2\2\u0212\u0213\7S\2\2\u0213\u0214\5\u00fa~\2\u0214C\3\2\2\2"+ - "\u0215\u0216\7q\2\2\u0216\u0217\7\21\2\2\u0217\u0218\t\2\2\2\u0218E\3"+ - "\2\2\2\u0219\u021a\7q\2\2\u021a\u021b\7Z\2\2\u021b\u021c\7D\2\2\u021c"+ - "\u021d\7K\2\2\u021d\u021e\t\3\2\2\u021eG\3\2\2\2\u021f\u0224\7q\2\2\u0220"+ - "\u0221\7\23\2\2\u0221\u0225\5J&\2\u0222\u0223\7Z\2\2\u0223\u0225\7\23"+ - "\2\2\u0224\u0220\3\2\2\2\u0224\u0222\3\2\2\2\u0225\u022c\3\2\2\2\u0226"+ - "\u0227\5L\'\2\u0227\u0228\7\6\2\2\u0228\u0229\5\u00fc\177\2\u0229\u022b"+ - "\3\2\2\2\u022a\u0226\3\2\2\2\u022b\u022e\3\2\2\2\u022c\u022a\3\2\2\2\u022c"+ - "\u022d\3\2\2\2\u022dI\3\2\2\2\u022e\u022c\3\2\2\2\u022f\u0232\7\u0090"+ - "\2\2\u0230\u0232\5\u00fe\u0080\2\u0231\u022f\3\2\2\2\u0231\u0230\3\2\2"+ - "\2\u0232\u0233\3\2\2\2\u0233\u0235\7\24\2\2\u0234\u0231\3\2\2\2\u0234"+ - "\u0235\3\2\2\2\u0235\u0238\3\2\2\2\u0236\u0239\7\u0090\2\2\u0237\u0239"+ - "\5\u00fe\u0080\2\u0238\u0236\3\2\2\2\u0238\u0237\3\2\2\2\u0239K\3\2\2"+ - "\2\u023a\u023b\t\4\2\2\u023bM\3\2\2\2\u023c\u023d\7\37\2\2\u023d\u0241"+ - "\7\4\2\2\u023e\u023f\7\5\2\2\u023f\u0240\7\u0090\2\2\u0240\u0242\7\6\2"+ - "\2\u0241\u023e\3\2\2\2\u0241\u0242\3\2\2\2\u0242\u0243\3\2\2\2\u0243\u024d"+ - "\5\u00fa~\2\u0244\u0245\7I\2\2\u0245\u024a\5\u00fa~\2\u0246\u0247\7\20"+ - "\2\2\u0247\u0249\5\u00fa~\2\u0248\u0246\3\2\2\2\u0249\u024c\3\2\2\2\u024a"+ - "\u0248\3\2\2\2\u024a\u024b\3\2\2\2\u024b\u024e\3\2\2\2\u024c\u024a\3\2"+ - "\2\2\u024d\u0244\3\2\2\2\u024d\u024e\3\2\2\2\u024eO\3\2\2\2\u024f\u0250"+ - "\7q\2\2\u0250\u0251\5\64\33\2\u0251\u0252\7t\2\2\u0252\u0255\5\u00c2b"+ - "\2\u0253\u0254\7H\2\2\u0254\u0256\5\u00e8u\2\u0255\u0253\3\2\2\2\u0255"+ - "\u0256\3\2\2\2\u0256\u025e\3\2\2\2\u0257\u0258\7\b\2\2\u0258\u025f\5`"+ - "\61\2\u0259\u025c\7 \2\2\u025a\u025b\7\b\2\2\u025b\u025d\5`\61\2\u025c"+ - "\u025a\3\2\2\2\u025c\u025d\3\2\2\2\u025d\u025f\3\2\2\2\u025e\u0257\3\2"+ - "\2\2\u025e\u0259\3\2\2\2\u025fQ\3\2\2\2\u0260\u0261\7q\2\2\u0261\u0262"+ - "\7r\2\2\u0262\u0265\7s\2\2\u0263\u0264\7H\2\2\u0264\u0266\5\u00e8u\2\u0265"+ - "\u0263\3\2\2\2\u0265\u0266\3\2\2\2\u0266\u026e\3\2\2\2\u0267\u0268\7\b"+ - "\2\2\u0268\u026f\5`\61\2\u0269\u026c\7 \2\2\u026a\u026b\7\b\2\2\u026b"+ - "\u026d\5`\61\2\u026c\u026a\3\2\2\2\u026c\u026d\3\2\2\2\u026d\u026f\3\2"+ - "\2\2\u026e\u0267\3\2\2\2\u026e\u0269\3\2\2\2\u026fS\3\2\2\2\u0270\u0271"+ - "\7q\2\2\u0271\u0272\5\64\33\2\u0272\u0273\7!\2\2\u0273\u0274\5J&\2\u0274"+ - "\u0276\7\13\2\2\u0275\u0277\5Z.\2\u0276\u0275\3\2\2\2\u0276\u0277\3\2"+ - "\2\2\u0277\u0278\3\2\2\2\u0278\u027b\7\f\2\2\u0279\u027a\7H\2\2\u027a"+ - "\u027c\5\u00e8u\2\u027b\u0279\3\2\2\2\u027b\u027c\3\2\2\2\u027c\u0282"+ - "\3\2\2\2\u027d\u027e\7\t\2\2\u027e\u027f\5\22\n\2\u027f\u0280\7\n\2\2"+ - "\u0280\u0283\3\2\2\2\u0281\u0283\7 \2\2\u0282\u027d\3\2\2\2\u0282\u0281"+ - "\3\2\2\2\u0283U\3\2\2\2\u0284\u0285\7q\2\2\u0285\u0286\7n\2\2\u0286\u0287"+ - "\5J&\2\u0287\u0289\7H\2\2\u0288\u028a\5X-\2\u0289\u0288\3\2\2\2\u0289"+ - "\u028a\3\2\2\2\u028a\u028b\3\2\2\2\u028b\u028c\5`\61\2\u028cW\3\2\2\2"+ - "\u028d\u028e\7\"\2\2\u028e\u0294\7#\2\2\u028f\u0290\7\"\2\2\u0290\u0294"+ - "\7$\2\2\u0291\u0292\7~\2\2\u0292\u0294\7%\2\2\u0293\u028d\3\2\2\2\u0293"+ - "\u028f\3\2\2\2\u0293\u0291\3\2\2\2\u0294Y\3\2\2\2\u0295\u029a\5\\/\2\u0296"+ - "\u0297\7\20\2\2\u0297\u0299\5\\/\2\u0298\u0296\3\2\2\2\u0299\u029c\3\2"+ - "\2\2\u029a\u0298\3\2\2\2\u029a\u029b\3\2\2\2\u029b[\3\2\2\2\u029c\u029a"+ - "\3\2\2\2\u029d\u029e\7\7\2\2\u029e\u02a1\5J&\2\u029f\u02a0\7H\2\2\u02a0"+ - "\u02a2\5\u00e8u\2\u02a1\u029f\3\2\2\2\u02a1\u02a2\3\2\2\2\u02a2]\3\2\2"+ - "\2\u02a3\u02a8\5`\61\2\u02a4\u02a5\7\20\2\2\u02a5\u02a7\5`\61\2\u02a6"+ - "\u02a4\3\2\2\2\u02a7\u02aa\3\2\2\2\u02a8\u02a6\3\2\2\2\u02a8\u02a9\3\2"+ - "\2\2\u02a9_\3\2\2\2\u02aa\u02a8\3\2\2\2\u02ab\u02b2\5b\62\2\u02ac\u02b2"+ - "\5d\63\2\u02ad\u02b2\5~@\2\u02ae\u02b2\5\u0082B\2\u02af\u02b2\5\u0086"+ - "D\2\u02b0\u02b2\5\u0088E\2\u02b1\u02ab\3\2\2\2\u02b1\u02ac\3\2\2\2\u02b1"+ - "\u02ad\3\2\2\2\u02b1\u02ae\3\2\2\2\u02b1\u02af\3\2\2\2\u02b1\u02b0\3\2"+ - "\2\2\u02b2a\3\2\2\2\u02b3\u02bc\5z>\2\u02b4\u02bc\5\u008cG\2\u02b5\u02bc"+ - "\5\u00d8m\2\u02b6\u02bc\5\u00dan\2\u02b7\u02bc\5\u00dco\2\u02b8\u02bc"+ - "\5\u00dep\2\u02b9\u02bc\5\u00e0q\2\u02ba\u02bc\5\u00e2r\2\u02bb\u02b3"+ - "\3\2\2\2\u02bb\u02b4\3\2\2\2\u02bb\u02b5\3\2\2\2\u02bb\u02b6\3\2\2\2\u02bb"+ - "\u02b7\3\2\2\2\u02bb\u02b8\3\2\2\2\u02bb\u02b9\3\2\2\2\u02bb\u02ba\3\2"+ - "\2\2\u02bcc\3\2\2\2\u02bd\u02c0\5f\64\2\u02be\u02c0\5j\66\2\u02bf\u02bd"+ - "\3\2\2\2\u02bf\u02be\3\2\2\2\u02c0\u02c9\3\2\2\2\u02c1\u02c8\5f\64\2\u02c2"+ - "\u02c8\5j\66\2\u02c3\u02c8\5n8\2\u02c4\u02c8\5p9\2\u02c5\u02c8\5t;\2\u02c6"+ - "\u02c8\5x=\2\u02c7\u02c1\3\2\2\2\u02c7\u02c2\3\2\2\2\u02c7\u02c3\3\2\2"+ - "\2\u02c7\u02c4\3\2\2\2\u02c7\u02c5\3\2\2\2\u02c7\u02c6\3\2\2\2\u02c8\u02cb"+ - "\3\2\2\2\u02c9\u02c7\3\2\2\2\u02c9\u02ca\3\2\2\2\u02ca\u02cc\3\2\2\2\u02cb"+ - "\u02c9\3\2\2\2\u02cc\u02cd\7E\2\2\u02cd\u02ce\5`\61\2\u02cee\3\2\2\2\u02cf"+ - "\u02d0\7?\2\2\u02d0\u02d5\5h\65\2\u02d1\u02d2\7\20\2\2\u02d2\u02d4\5h"+ - "\65\2\u02d3\u02d1\3\2\2\2\u02d4\u02d7\3\2\2\2\u02d5\u02d3\3\2\2\2\u02d5"+ - "\u02d6\3\2\2\2\u02d6g\3\2\2\2\u02d7\u02d5\3\2\2\2\u02d8\u02db\5\u00c2"+ - "b\2\u02d9\u02da\7H\2\2\u02da\u02dc\5\u00e8u\2\u02db\u02d9\3\2\2\2\u02db"+ - "\u02dc\3\2\2\2\u02dc\u02df\3\2\2\2\u02dd\u02de\7J\2\2\u02de\u02e0\7K\2"+ - "\2\u02df\u02dd\3\2\2\2\u02df\u02e0\3\2\2\2\u02e0\u02e3\3\2\2\2\u02e1\u02e2"+ - "\7I\2\2\u02e2\u02e4\5\u00c2b\2\u02e3\u02e1\3\2\2\2\u02e3\u02e4\3\2\2\2"+ - "\u02e4\u02e5\3\2\2\2\u02e5\u02e6\7G\2\2\u02e6\u02e7\5`\61\2\u02e7i\3\2"+ - "\2\2\u02e8\u02e9\7@\2\2\u02e9\u02ee\5l\67\2\u02ea\u02eb\7\20\2\2\u02eb"+ - "\u02ed\5l\67\2\u02ec\u02ea\3\2\2\2\u02ed\u02f0\3\2\2\2\u02ee\u02ec\3\2"+ - "\2\2\u02ee\u02ef\3\2\2\2\u02efk\3\2\2\2\u02f0\u02ee\3\2\2\2\u02f1\u02f4"+ - "\5\u00c2b\2\u02f2\u02f3\7H\2\2\u02f3\u02f5\5\u00e8u\2\u02f4\u02f2\3\2"+ - "\2\2\u02f4\u02f5\3\2\2\2\u02f5\u02f6\3\2\2\2\u02f6\u02f7\7\b\2\2\u02f7"+ - "\u02f8\5`\61\2\u02f8m\3\2\2\2\u02f9\u02fa\7A\2\2\u02fa\u02fb\5`\61\2\u02fb"+ - "o\3\2\2\2\u02fc\u02fd\7B\2\2\u02fd\u02fe\7C\2\2\u02fe\u0303\5r:\2\u02ff"+ - "\u0300\7\20\2\2\u0300\u0302\5r:\2\u0301\u02ff\3\2\2\2\u0302\u0305\3\2"+ - "\2\2\u0303\u0301\3\2\2\2\u0303\u0304\3\2\2\2\u0304q\3\2\2\2\u0305\u0303"+ - "\3\2\2\2\u0306\u030d\5\u00c2b\2\u0307\u0308\7H\2\2\u0308\u030a\5\u00e8"+ - "u\2\u0309\u0307\3\2\2\2\u0309\u030a\3\2\2\2\u030a\u030b\3\2\2\2\u030b"+ - "\u030c\7\b\2\2\u030c\u030e\5`\61\2\u030d\u0309\3\2\2\2\u030d\u030e\3\2"+ - "\2\2\u030e\u0311\3\2\2\2\u030f\u0310\7S\2\2\u0310\u0312\5\u00fa~\2\u0311"+ - "\u030f\3\2\2\2\u0311\u0312\3\2\2\2\u0312s\3\2\2\2\u0313\u0314\7D\2\2\u0314"+ - "\u0319\7C\2\2\u0315\u0316\7M\2\2\u0316\u0317\7D\2\2\u0317\u0319\7C\2\2"+ - "\u0318\u0313\3\2\2\2\u0318\u0315\3\2\2\2\u0319\u031a\3\2\2\2\u031a\u031f"+ - "\5v<\2\u031b\u031c\7\20\2\2\u031c\u031e\5v<\2\u031d\u031b\3\2\2\2\u031e"+ - "\u0321\3\2\2\2\u031f\u031d\3\2\2\2\u031f\u0320\3\2\2\2\u0320u\3\2\2\2"+ - "\u0321\u031f\3\2\2\2\u0322\u0325\5`\61\2\u0323\u0326\7N\2\2\u0324\u0326"+ - "\7O\2\2\u0325\u0323\3\2\2\2\u0325\u0324\3\2\2\2\u0325\u0326\3\2\2\2\u0326"+ - "\u032c\3\2\2\2\u0327\u032a\7K\2\2\u0328\u032b\7T\2\2\u0329\u032b\7U\2"+ - "\2\u032a\u0328\3\2\2\2\u032a\u0329\3\2\2\2\u032b\u032d\3\2\2\2\u032c\u0327"+ - "\3\2\2\2\u032c\u032d\3\2\2\2\u032d\u0330\3\2\2\2\u032e\u032f\7S\2\2\u032f"+ - "\u0331\5\u00fa~\2\u0330\u032e\3\2\2\2\u0330\u0331\3\2\2\2\u0331w\3\2\2"+ - "\2\u0332\u0333\7L\2\2\u0333\u0334\5\u00c2b\2\u0334y\3\2\2\2\u0335\u0338"+ - "\7P\2\2\u0336\u0338\7Q\2\2\u0337\u0335\3\2\2\2\u0337\u0336\3\2\2\2\u0338"+ - "\u0339\3\2\2\2\u0339\u033e\5|?\2\u033a\u033b\7\20\2\2\u033b\u033d\5|?"+ - "\2\u033c\u033a\3\2\2\2\u033d\u0340\3\2\2\2\u033e\u033c\3\2\2\2\u033e\u033f"+ - "\3\2\2\2\u033f\u0341\3\2\2\2\u0340\u033e\3\2\2\2\u0341\u0342\7R\2\2\u0342"+ - "\u0343\5`\61\2\u0343{\3\2\2\2\u0344\u0347\5\u00c2b\2\u0345\u0346\7H\2"+ - "\2\u0346\u0348\5\u00e8u\2\u0347\u0345\3\2\2\2\u0347\u0348\3\2\2\2\u0348"+ - "\u0349\3\2\2\2\u0349\u034a\7G\2\2\u034a\u034b\5`\61\2\u034b}\3\2\2\2\u034c"+ - "\u034d\7V\2\2\u034d\u034e\7\13\2\2\u034e\u034f\5^\60\2\u034f\u0351\7\f"+ - "\2\2\u0350\u0352\5\u0080A\2\u0351\u0350\3\2\2\2\u0352\u0353\3\2\2\2\u0353"+ - "\u0351\3\2\2\2\u0353\u0354\3\2\2\2\u0354\u0355\3\2\2\2\u0355\u0356\7Z"+ - "\2\2\u0356\u0357\7E\2\2\u0357\u0358\5`\61\2\u0358\177\3\2\2\2\u0359\u035a"+ - "\7W\2\2\u035a\u035c\5`\61\2\u035b\u0359\3\2\2\2\u035c\u035d\3\2\2\2\u035d"+ - "\u035b\3\2\2\2\u035d\u035e\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0360\7E"+ - "\2\2\u0360\u0361\5`\61\2\u0361\u0081\3\2\2\2\u0362\u0363\7]\2\2\u0363"+ - "\u0364\7\13\2\2\u0364\u0365\5^\60\2\u0365\u0367\7\f\2\2\u0366\u0368\5"+ - "\u0084C\2\u0367\u0366\3\2\2\2\u0368\u0369\3\2\2\2\u0369\u0367\3\2\2\2"+ - "\u0369\u036a\3\2\2\2\u036a\u036b\3\2\2\2\u036b\u036d\7Z\2\2\u036c\u036e"+ - "\5\u00c2b\2\u036d\u036c\3\2\2\2\u036d\u036e\3\2\2\2\u036e\u036f\3\2\2"+ - "\2\u036f\u0370\7E\2\2\u0370\u0371\5`\61\2\u0371\u0083\3\2\2\2\u0372\u0376"+ - "\7W\2\2\u0373\u0374\5\u00c2b\2\u0374\u0375\7H\2\2\u0375\u0377\3\2\2\2"+ - "\u0376\u0373\3\2\2\2\u0376\u0377\3\2\2\2\u0377\u0378\3\2\2\2\u0378\u037d"+ - "\5\u00e8u\2\u0379\u037a\7\16\2\2\u037a\u037c\5\u00e8u\2\u037b\u0379\3"+ - "\2\2\2\u037c\u037f\3\2\2\2\u037d\u037b\3\2\2\2\u037d\u037e\3\2\2\2\u037e"+ - "\u0380\3\2\2\2\u037f\u037d\3\2\2\2\u0380\u0381\7E\2\2\u0381\u0382\5`\61"+ - "\2\u0382\u0085\3\2\2\2\u0383\u0384\7F\2\2\u0384\u0385\7\13\2\2\u0385\u0386"+ - "\5^\60\2\u0386\u0387\7\f\2\2\u0387\u0388\7[\2\2\u0388\u0389\5`\61\2\u0389"+ - "\u038a\7\\\2\2\u038a\u038b\5`\61\2\u038b\u0087\3\2\2\2\u038c\u038d\7X"+ - "\2\2\u038d\u038e\7\t\2\2\u038e\u038f\5^\60\2\u038f\u0391\7\n\2\2\u0390"+ - "\u0392\5\u008aF\2\u0391\u0390\3\2\2\2\u0392\u0393\3\2\2\2\u0393\u0391"+ - "\3\2\2\2\u0393\u0394\3\2\2\2\u0394\u0089\3\2\2\2\u0395\u0398\7Y\2\2\u0396"+ - "\u0399\7\r\2\2\u0397\u0399\5J&\2\u0398\u0396\3\2\2\2\u0398\u0397\3\2\2"+ - "\2\u0399\u03a1\3\2\2\2\u039a\u039d\7\16\2\2\u039b\u039e\7\r\2\2\u039c"+ - "\u039e\5J&\2\u039d\u039b\3\2\2\2\u039d\u039c\3\2\2\2\u039e\u03a0\3\2\2"+ - "\2\u039f\u039a\3\2\2\2\u03a0\u03a3\3\2\2\2\u03a1\u039f\3\2\2\2\u03a1\u03a2"+ - "\3\2\2\2\u03a2\u03a4\3\2\2\2\u03a3\u03a1\3\2\2\2\u03a4\u03a5\7\t\2\2\u03a5"+ - "\u03a6\5^\60\2\u03a6\u03a7\7\n\2\2\u03a7\u008b\3\2\2\2\u03a8\u03ad\5\u008e"+ - "H\2\u03a9\u03aa\7^\2\2\u03aa\u03ac\5\u008eH\2\u03ab\u03a9\3\2\2\2\u03ac"+ - "\u03af\3\2\2\2\u03ad\u03ab\3\2\2\2\u03ad\u03ae\3\2\2\2\u03ae\u008d\3\2"+ - "\2\2\u03af\u03ad\3\2\2\2\u03b0\u03b5\5\u0090I\2\u03b1\u03b2\7_\2\2\u03b2"+ - "\u03b4\5\u0090I\2\u03b3\u03b1\3\2\2\2\u03b4\u03b7\3\2\2\2\u03b5\u03b3"+ - "\3\2\2\2\u03b5\u03b6\3\2\2\2\u03b6\u008f\3\2\2\2\u03b7\u03b5\3\2\2\2\u03b8"+ - "\u03ba\7`\2\2\u03b9\u03b8\3\2\2\2\u03b9\u03ba\3\2\2\2\u03ba\u03bb\3\2"+ - "\2\2\u03bb\u03bc\5\u0092J\2\u03bc\u0091\3\2\2\2\u03bd\u03c0\5\u0094K\2"+ - "\u03be\u03bf\t\5\2\2\u03bf\u03c1\5\u0094K\2\u03c0\u03be\3\2\2\2\u03c0"+ - "\u03c1\3\2\2\2\u03c1\u0093\3\2\2\2\u03c2\u03c7\5\u0096L\2\u03c3\u03c4"+ - "\7\61\2\2\u03c4\u03c6\5\u0096L\2\u03c5\u03c3\3\2\2\2\u03c6\u03c9\3\2\2"+ - "\2\u03c7\u03c5\3\2\2\2\u03c7\u03c8\3\2\2\2\u03c8\u0095\3\2\2\2\u03c9\u03c7"+ - "\3\2\2\2\u03ca\u03cd\5\u0098M\2\u03cb\u03cc\7a\2\2\u03cc\u03ce\5\u0098"+ - "M\2\u03cd\u03cb\3\2\2\2\u03cd\u03ce\3\2\2\2\u03ce\u0097\3\2\2\2\u03cf"+ - "\u03d4\5\u009aN\2\u03d0\u03d1\t\6\2\2\u03d1\u03d3\5\u009aN\2\u03d2\u03d0"+ - "\3\2\2\2\u03d3\u03d6\3\2\2\2\u03d4\u03d2\3\2\2\2\u03d4\u03d5\3\2\2\2\u03d5"+ - "\u0099\3\2\2\2\u03d6\u03d4\3\2\2\2\u03d7\u03dc\5\u009cO\2\u03d8\u03d9"+ - "\t\7\2\2\u03d9\u03db\5\u009cO\2\u03da\u03d8\3\2\2\2\u03db\u03de\3\2\2"+ - "\2\u03dc\u03da\3\2\2\2\u03dc\u03dd\3\2\2\2\u03dd\u009b\3\2\2\2\u03de\u03dc"+ - "\3\2\2\2\u03df\u03e3\5\u009eP\2\u03e0\u03e1\7b\2\2\u03e1\u03e2\7c\2\2"+ - "\u03e2\u03e4\5\u00e8u\2\u03e3\u03e0\3\2\2\2\u03e3\u03e4\3\2\2\2\u03e4"+ - "\u009d\3\2\2\2\u03e5\u03e9\5\u00a0Q\2\u03e6\u03e7\7e\2\2\u03e7\u03e8\7"+ - "d\2\2\u03e8\u03ea\5\u00e8u\2\u03e9\u03e6\3\2\2\2\u03e9\u03ea\3\2\2\2\u03ea"+ - "\u009f\3\2\2\2\u03eb\u03ef\5\u00a2R\2\u03ec\u03ed\7f\2\2\u03ed\u03ee\7"+ - "H\2\2\u03ee\u03f0\5\u00e8u\2\u03ef\u03ec\3\2\2\2\u03ef\u03f0\3\2\2\2\u03f0"+ - "\u00a1\3\2\2\2\u03f1\u03f5\5\u00a4S\2\u03f2\u03f3\7h\2\2\u03f3\u03f4\7"+ - "H\2\2\u03f4\u03f6\5\u00f4{\2\u03f5\u03f2\3\2\2\2\u03f5\u03f6\3\2\2\2\u03f6"+ - "\u00a3\3\2\2\2\u03f7\u03fb\5\u00a6T\2\u03f8\u03f9\7g\2\2\u03f9\u03fa\7"+ - "H\2\2\u03fa\u03fc\5\u00f4{\2\u03fb\u03f8\3\2\2\2\u03fb\u03fc\3\2\2\2\u03fc"+ - "\u00a5\3\2\2\2\u03fd\u0406\5\u00aaV\2\u03fe\u03ff\7\6\2\2\u03ff\u0400"+ - "\7/\2\2\u0400\u0401\3\2\2\2\u0401\u0402\5\u00a8U\2\u0402\u0403\5\u00ce"+ - "h\2\u0403\u0405\3\2\2\2\u0404\u03fe\3\2\2\2\u0405\u0408\3\2\2\2\u0406"+ - "\u0404\3\2\2\2\u0406\u0407\3\2\2\2\u0407\u00a7\3\2\2\2\u0408\u0406\3\2"+ - "\2\2\u0409\u040d\5J&\2\u040a\u040d\5\u00c2b\2\u040b\u040d\5\u00c4c\2\u040c"+ - "\u0409\3\2\2\2\u040c\u040a\3\2\2\2\u040c\u040b\3\2\2\2\u040d\u00a9\3\2"+ - "\2\2\u040e\u0410\t\6\2\2\u040f\u040e\3\2\2\2\u0410\u0413\3\2\2\2\u0411"+ - "\u040f\3\2\2\2\u0411\u0412\3\2\2\2\u0412\u0414\3\2\2\2\u0413\u0411\3\2"+ - "\2\2\u0414\u0415\5\u00acW\2\u0415\u00ab\3\2\2\2\u0416\u041a\5\u00b2Z\2"+ - "\u0417\u041a\5\u00aeX\2\u0418\u041a\5\u00b0Y\2\u0419\u0416\3\2\2\2\u0419"+ - "\u0417\3\2\2\2\u0419\u0418\3\2\2\2\u041a\u00ad\3\2\2\2\u041b\u041c\7o"+ - "\2\2\u041c\u041d\7n\2\2\u041d\u041e\5\u00e8u\2\u041e\u041f\7\t\2\2\u041f"+ - "\u0420\5^\60\2\u0420\u0421\7\n\2\2\u0421\u00af\3\2\2\2\u0422\u0423\7p"+ - "\2\2\u0423\u0424\7n\2\2\u0424\u0425\5\u00e8u\2\u0425\u0426\7\t\2\2\u0426"+ - "\u0427\5^\60\2\u0427\u0428\7\n\2\2\u0428\u00b1\3\2\2\2\u0429\u042e\5\u00b4"+ - "[\2\u042a\u042b\7\67\2\2\u042b\u042d\5\u00b4[\2\u042c\u042a\3\2\2\2\u042d"+ - "\u0430\3\2\2\2\u042e\u042c\3\2\2\2\u042e\u042f\3\2\2\2\u042f\u00b3\3\2"+ - "\2\2\u0430\u042e\3\2\2\2\u0431\u0439\5\u00be`\2\u0432\u0438\5\u00b6\\"+ - "\2\u0433\u0438\5\u00ba^\2\u0434\u0438\5\u00bc_\2\u0435\u0438\5\u00b8]"+ - "\2\u0436\u0438\5\u00ceh\2\u0437\u0432\3\2\2\2\u0437\u0433\3\2\2\2\u0437"+ - "\u0434\3\2\2\2\u0437\u0435\3\2\2\2\u0437\u0436\3\2\2\2\u0438\u043b\3\2"+ - "\2\2\u0439\u0437\3\2\2\2\u0439\u043a\3\2\2\2\u043a\u00b5\3\2\2\2\u043b"+ - "\u0439\3\2\2\2\u043c\u043d\78\2\2\u043d\u043e\78\2\2\u043e\u043f\5^\60"+ - "\2\u043f\u0440\79\2\2\u0440\u0441\79\2\2\u0441\u00b7\3\2\2\2\u0442\u0443"+ - "\78\2\2\u0443\u0444\79\2\2\u0444\u00b9\3\2\2\2\u0445\u0446\78\2\2\u0446"+ - "\u0447\5^\60\2\u0447\u0448\79\2\2\u0448\u00bb\3\2\2\2\u0449\u0450\7:\2"+ - "\2\u044a\u0451\5\u00fe\u0080\2\u044b\u0451\5\u00fc\177\2\u044c\u0451\7"+ - "\u0090\2\2\u044d\u0451\5\u00c4c\2\u044e\u0451\5\u00c2b\2\u044f\u0451\5"+ - "\u00c6d\2\u0450\u044a\3\2\2\2\u0450\u044b\3\2\2\2\u0450\u044c\3\2\2\2"+ - "\u0450\u044d\3\2\2\2\u0450\u044e\3\2\2\2\u0450\u044f\3\2\2\2\u0451\u00bd"+ - "\3\2\2\2\u0452\u0462\7\u0089\2\2\u0453\u0462\7l\2\2\u0454\u0462\7m\2\2"+ - "\u0455\u0462\7\u008a\2\2\u0456\u0462\5\u00fc\177\2\u0457\u0462\5\u00c2"+ - "b\2\u0458\u0462\5\u00c4c\2\u0459\u0462\5\u00c6d\2\u045a\u0462\5\u00ea"+ - "v\2\u045b\u0462\5\u00ccg\2\u045c\u0462\5\u00c8e\2\u045d\u0462\5\u00ca"+ - "f\2\u045e\u0462\5\u00f8}\2\u045f\u0462\5\u00d2j\2\u0460\u0462\5\u00c0"+ - "a\2\u0461\u0452\3\2\2\2\u0461\u0453\3\2\2\2\u0461\u0454\3\2\2\2\u0461"+ - "\u0455\3\2\2\2\u0461\u0456\3\2\2\2\u0461\u0457\3\2\2\2\u0461\u0458\3\2"+ - "\2\2\u0461\u0459\3\2\2\2\u0461\u045a\3\2\2\2\u0461\u045b\3\2\2\2\u0461"+ - "\u045c\3\2\2\2\u0461\u045d\3\2\2\2\u0461\u045e\3\2\2\2\u0461\u045f\3\2"+ - "\2\2\u0461\u0460\3\2\2\2\u0462\u00bf\3\2\2\2\u0463\u0464\7\t\2\2\u0464"+ - "\u0465\5\20\t\2\u0465\u0466\7\n\2\2\u0466\u00c1\3\2\2\2\u0467\u0468\7"+ - "\7\2\2\u0468\u0469\5J&\2\u0469\u00c3\3\2\2\2\u046a\u046c\7\13\2\2\u046b"+ - "\u046d\5^\60\2\u046c\u046b\3\2\2\2\u046c\u046d\3\2\2\2\u046d\u046e\3\2"+ - "\2\2\u046e\u046f\7\f\2\2\u046f\u00c5\3\2\2\2\u0470\u0471\7;\2\2\u0471"+ - "\u00c7\3\2\2\2\u0472\u0473\7\22\2\2\u0473\u0474\7\t\2\2\u0474\u0475\5"+ - "^\60\2\u0475\u0476\7\n\2\2\u0476\u00c9\3\2\2\2\u0477\u0478\7k\2\2\u0478"+ - "\u0479\7\t\2\2\u0479\u047a\5^\60\2\u047a\u047b\7\n\2\2\u047b\u00cb\3\2"+ - "\2\2\u047c\u047d\5J&\2\u047d\u047e\5\u00ceh\2\u047e\u00cd\3\2\2\2\u047f"+ - "\u0486\7\13\2\2\u0480\u0482\5\u00d0i\2\u0481\u0483\7\20\2\2\u0482\u0481"+ - "\3\2\2\2\u0482\u0483\3\2\2\2\u0483\u0485\3\2\2\2\u0484\u0480\3\2\2\2\u0485"+ - "\u0488\3\2\2\2\u0486\u0484\3\2\2\2\u0486\u0487\3\2\2\2\u0487\u0489\3\2"+ - "\2\2\u0488\u0486\3\2\2\2\u0489\u048a\7\f\2\2\u048a\u00cf\3\2\2\2\u048b"+ - "\u048e\5`\61\2\u048c\u048e\7\u0088\2\2\u048d\u048b\3\2\2\2\u048d\u048c"+ - "\3\2\2\2\u048e\u00d1\3\2\2\2\u048f\u0492\5\u00d4k\2\u0490\u0492\5\u00d6"+ - "l\2\u0491\u048f\3\2\2\2\u0491\u0490\3\2\2\2\u0492\u00d3\3\2\2\2\u0493"+ - "\u0494\5J&\2\u0494\u0495\7<\2\2\u0495\u0496\7\u008a\2\2\u0496\u00d5\3"+ - "\2\2\2\u0497\u0498\5\64\33\2\u0498\u0499\7!\2\2\u0499\u049b\7\13\2\2\u049a"+ - "\u049c\5Z.\2\u049b\u049a\3\2\2\2\u049b\u049c\3\2\2\2\u049c\u049d\3\2\2"+ - "\2\u049d\u04a0\7\f\2\2\u049e\u049f\7H\2\2\u049f\u04a1\5\u00e8u\2\u04a0"+ - "\u049e\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a3\7\t"+ - "\2\2\u04a3\u04a4\5\22\n\2\u04a4\u04a5\7\n\2\2\u04a5\u00d7\3\2\2\2\u04a6"+ - "\u04a7\7u\2\2\u04a7\u04a8\7~\2\2\u04a8\u04a9\5`\61\2\u04a9\u04aa\7|\2"+ - "\2\u04aa\u04ae\5`\61\2\u04ab\u04ac\7I\2\2\u04ac\u04ad\7\u0080\2\2\u04ad"+ - "\u04af\5`\61\2\u04ae\u04ab\3\2\2\2\u04ae\u04af\3\2\2\2\u04af\u04be\3\2"+ - "\2\2\u04b0\u04b1\7u\2\2\u04b1\u04b2\7~\2\2\u04b2\u04b7\5\u00f6|\2\u04b3"+ - "\u04b4\7\20\2\2\u04b4\u04b6\5\u00f6|\2\u04b5\u04b3\3\2\2\2\u04b6\u04b9"+ - "\3\2\2\2\u04b7\u04b5\3\2\2\2\u04b7\u04b8\3\2\2\2\u04b8\u04ba\3\2\2\2\u04b9"+ - "\u04b7\3\2\2\2\u04ba\u04bb\7|\2\2\u04bb\u04bc\5`\61\2\u04bc\u04be\3\2"+ - "\2\2\u04bd\u04a6\3\2\2\2\u04bd\u04b0\3\2\2\2\u04be\u00d9\3\2\2\2\u04bf"+ - "\u04c0\7v\2\2\u04c0\u04c1\7~\2\2\u04c1\u04c2\5\u00e4s\2\u04c2\u00db\3"+ - "\2\2\2\u04c3\u04c4\7w\2\2\u04c4\u04c5\7~\2\2\u04c5\u04c6\5\u00e4s\2\u04c6"+ - "\u04c7\7H\2\2\u04c7\u04c8\5`\61\2\u04c8\u00dd\3\2\2\2\u04c9\u04ca\7x\2"+ - "\2\u04ca\u04cb\7~\2\2\u04cb\u04cc\7}\2\2\u04cc\u04cd\7c\2\2\u04cd\u04ce"+ - "\5\u00e4s\2\u04ce\u04cf\7\177\2\2\u04cf\u04d0\5`\61\2\u04d0\u00df\3\2"+ - "\2\2\u04d1\u04d2\7y\2\2\u04d2\u04d3\7~\2\2\u04d3\u04d8\5\u00e6t\2\u04d4"+ - "\u04d5\7\20\2\2\u04d5\u04d7\5\u00e6t\2\u04d6\u04d4\3\2\2\2\u04d7\u04da"+ - "\3\2\2\2\u04d8\u04d6\3\2\2\2\u04d8\u04d9\3\2\2\2\u04d9\u04db\3\2\2\2\u04da"+ - "\u04d8\3\2\2\2\u04db\u04dc\7z\2\2\u04dc\u04dd\5`\61\2\u04dd\u04de\7E\2"+ - "\2\u04de\u04df\5`\61\2\u04df\u00e1\3\2\2\2\u04e0\u04e1\7{\2\2\u04e1\u04e2"+ - "\7~\2\2\u04e2\u04e3\5`\61\2\u04e3\u04e4\7|\2\2\u04e4\u04e5\5`\61\2\u04e5"+ - "\u00e3\3\2\2\2\u04e6\u04e9\5\u00be`\2\u04e7\u04ea\5\u00b6\\\2\u04e8\u04ea"+ - "\5\u00bc_\2\u04e9\u04e7\3\2\2\2\u04e9\u04e8\3\2\2\2\u04ea\u04eb\3\2\2"+ - "\2\u04eb\u04e9\3\2\2\2\u04eb\u04ec\3\2\2\2\u04ec\u00e5\3\2\2\2\u04ed\u04ee"+ - "\5\u00c2b\2\u04ee\u04ef\7\b\2\2\u04ef\u04f0\5`\61\2\u04f0\u00e7\3\2\2"+ - "\2\u04f1\u04f2\7\13\2\2\u04f2\u04fa\7\f\2\2\u04f3\u04f7\5\u00ecw\2\u04f4"+ - "\u04f8\7\u0088\2\2\u04f5\u04f8\7\r\2\2\u04f6\u04f8\7\62\2\2\u04f7\u04f4"+ - "\3\2\2\2\u04f7\u04f5\3\2\2\2\u04f7\u04f6\3\2\2\2\u04f7\u04f8\3\2\2\2\u04f8"+ - "\u04fa\3\2\2\2\u04f9\u04f1\3\2\2\2\u04f9\u04f3\3\2\2\2\u04fa\u00e9\3\2"+ - "\2\2\u04fb\u0504\7\t\2\2\u04fc\u0501\5\u00f6|\2\u04fd\u04fe\7\20\2\2\u04fe"+ - "\u0500\5\u00f6|\2\u04ff\u04fd\3\2\2\2\u0500\u0503\3\2\2\2\u0501\u04ff"+ - "\3\2\2\2\u0501\u0502\3\2\2\2\u0502\u0505\3\2\2\2\u0503\u0501\3\2\2\2\u0504"+ - "\u04fc\3\2\2\2\u0504\u0505\3\2\2\2\u0505\u0506\3\2\2\2\u0506\u050c\7\n"+ - "\2\2\u0507\u0508\7=\2\2\u0508\u0509\5^\60\2\u0509\u050a\7>\2\2\u050a\u050c"+ - "\3\2\2\2\u050b\u04fb\3\2\2\2\u050b\u0507\3\2\2\2\u050c\u00eb\3\2\2\2\u050d"+ - "\u0511\5J&\2\u050e\u0511\7\u0089\2\2\u050f\u0511\5\u00eex\2\u0510\u050d"+ - "\3\2\2\2\u0510\u050e\3\2\2\2\u0510\u050f\3\2\2\2\u0511\u00ed\3\2\2\2\u0512"+ - "\u0515\5\u00f0y\2\u0513\u0515\5\u00f2z\2\u0514\u0512\3\2\2\2\u0514\u0513"+ - "\3\2\2\2\u0515\u00ef\3\2\2\2\u0516\u0517\7!\2\2\u0517\u0518\7\13\2\2\u0518"+ - "\u0519\7\r\2\2\u0519\u051a\7\f\2\2\u051a\u00f1\3\2\2\2\u051b\u051c\7!"+ - "\2\2\u051c\u0525\7\13\2\2\u051d\u0522\5\u00e8u\2\u051e\u051f\7\20\2\2"+ - "\u051f\u0521\5\u00e8u\2\u0520\u051e\3\2\2\2\u0521\u0524\3\2\2\2\u0522"+ - "\u0520\3\2\2\2\u0522\u0523\3\2\2\2\u0523\u0526\3\2\2\2\u0524\u0522\3\2"+ - "\2\2\u0525\u051d\3\2\2\2\u0525\u0526\3\2\2\2\u0526\u0527\3\2\2\2\u0527"+ - "\u0528\7\f\2\2\u0528\u0529\7H\2\2\u0529\u052a\5\u00e8u\2\u052a\u00f3\3"+ - "\2\2\2\u052b\u052d\5\u00ecw\2\u052c\u052e\7\u0088\2\2\u052d\u052c\3\2"+ - "\2\2\u052d\u052e\3\2\2\2\u052e\u00f5\3\2\2\2\u052f\u0532\5`\61\2\u0530"+ - "\u0532\7\u0090\2\2\u0531\u052f\3\2\2\2\u0531\u0530\3\2\2\2\u0532\u0533"+ - "\3\2\2\2\u0533\u0534\t\b\2\2\u0534\u0535\5`\61\2\u0535\u00f7\3\2\2\2\u0536"+ - "\u0538\78\2\2\u0537\u0539\5^\60\2\u0538\u0537\3\2\2\2\u0538\u0539\3\2"+ - "\2\2\u0539\u053a\3\2\2\2\u053a\u053b\79\2\2\u053b\u00f9\3\2\2\2\u053c"+ - "\u053d\5\u00fc\177\2\u053d\u00fb\3\2\2\2\u053e\u053f\7\u0087\2\2\u053f"+ - "\u00fd\3\2\2\2\u0540\u0541\t\t\2\2\u0541\u00ff\3\2\2\2\u0086\u0108\u010c"+ - "\u011c\u0122\u012a\u0132\u013a\u0149\u0167\u016f\u0171\u0187\u0191\u019b"+ - "\u01a0\u01a5\u01a9\u01b5\u01b9\u01c2\u01c9\u01d7\u01db\u01e0\u01ea\u01f2"+ - "\u01f6\u0202\u020e\u0224\u022c\u0231\u0234\u0238\u0241\u024a\u024d\u0255"+ - "\u025c\u025e\u0265\u026c\u026e\u0276\u027b\u0282\u0289\u0293\u029a\u02a1"+ - "\u02a8\u02b1\u02bb\u02bf\u02c7\u02c9\u02d5\u02db\u02df\u02e3\u02ee\u02f4"+ - "\u0303\u0309\u030d\u0311\u0318\u031f\u0325\u032a\u032c\u0330\u0337\u033e"+ - "\u0347\u0353\u035d\u0369\u036d\u0376\u037d\u0393\u0398\u039d\u03a1\u03ad"+ - "\u03b5\u03b9\u03c0\u03c7\u03cd\u03d4\u03dc\u03e3\u03e9\u03ef\u03f5\u03fb"+ - "\u0406\u040c\u0411\u0419\u042e\u0437\u0439\u0450\u0461\u046c\u0482\u0486"+ - "\u048d\u0491\u049b\u04a0\u04ae\u04b7\u04bd\u04d8\u04e9\u04eb\u04f7\u04f9"+ - "\u0501\u0504\u050b\u0510\u0514\u0522\u0525\u052d\u0531\u0538"; + "\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084\4\u0085"+ + "\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089\t\u0089"+ + "\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d\4\u008e"+ + "\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092\t\u0092"+ + "\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096\4\u0097"+ + "\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b\t\u009b"+ + "\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f\4\u00a0"+ + "\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4\t\u00a4"+ + "\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8\4\u00a9"+ + "\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad\t\u00ad"+ + "\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1\t\u00b1\4\u00b2"+ + "\t\u00b2\4\u00b3\t\u00b3\4\u00b4\t\u00b4\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3"+ + "\3\5\3\u0171\n\3\3\3\3\3\5\3\u0175\n\3\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5"+ + "\3\5\3\5\3\5\3\6\3\6\3\6\5\6\u0185\n\6\3\6\3\6\7\6\u0189\n\6\f\6\16\6"+ + "\u018c\13\6\3\6\3\6\3\6\7\6\u0191\n\6\f\6\16\6\u0194\13\6\3\7\3\7\3\b"+ + "\7\b\u0199\n\b\f\b\16\b\u019c\13\b\3\t\3\t\3\t\3\n\3\n\5\n\u01a3\n\n\3"+ + "\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\5\13\u01b2"+ + "\n\13\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\17\3\17"+ + "\3\17\3\17\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\22\3\22\5\22"+ + "\u01d0\n\22\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u01d8\n\22\f\22\16\22\u01db"+ + "\13\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24"+ + "\3\24\3\24\3\24\3\24\6\24\u01ee\n\24\r\24\16\24\u01ef\3\24\3\24\3\24\3"+ + "\24\3\25\3\25\6\25\u01f8\n\25\r\25\16\25\u01f9\3\25\3\25\3\25\3\26\3\26"+ + "\3\26\6\26\u0202\n\26\r\26\16\26\u0203\3\27\3\27\3\27\5\27\u0209\n\27"+ + "\3\27\3\27\3\27\5\27\u020e\n\27\7\27\u0210\n\27\f\27\16\27\u0213\13\27"+ + "\3\27\3\27\3\30\3\30\3\30\3\30\3\30\6\30\u021c\n\30\r\30\16\30\u021d\3"+ + "\30\3\30\5\30\u0222\n\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\5\31\u022b"+ + "\n\31\3\31\3\31\3\31\7\31\u0230\n\31\f\31\16\31\u0233\13\31\3\31\3\31"+ + "\3\31\3\32\3\32\3\32\3\32\3\32\3\32\7\32\u023e\n\32\f\32\16\32\u0241\13"+ + "\32\3\32\5\32\u0244\n\32\3\33\7\33\u0247\n\33\f\33\16\33\u024a\13\33\3"+ + "\34\3\34\3\34\3\34\3\34\7\34\u0251\n\34\f\34\16\34\u0254\13\34\3\34\3"+ + "\34\3\35\3\35\3\35\5\35\u025b\n\35\3\35\3\35\5\35\u025f\n\35\3\36\3\36"+ + "\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\5\37\u026b\n\37\3 \3 \3 \3 \3"+ + " \3 \3!\3!\3!\3!\5!\u0277\n!\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$"+ + "\3$\3$\3$\3%\3%\3%\3%\3%\5%\u028d\n%\3%\3%\3%\3%\7%\u0293\n%\f%\16%\u0296"+ + "\13%\3&\3&\5&\u029a\n&\3&\5&\u029d\n&\3&\3&\5&\u02a1\n&\3\'\3\'\3(\3("+ + "\3(\3(\3(\5(\u02aa\n(\3(\3(\3(\3(\3(\7(\u02b1\n(\f(\16(\u02b4\13(\5(\u02b6"+ + "\n(\3)\3)\3)\3)\3)\3)\5)\u02be\n)\3)\3)\3)\3)\3)\5)\u02c5\n)\5)\u02c7"+ + "\n)\3*\3*\3*\3*\3*\5*\u02ce\n*\3*\3*\3*\3*\3*\5*\u02d5\n*\5*\u02d7\n*"+ + "\3+\3+\3+\3+\3+\3+\5+\u02df\n+\3+\3+\3+\5+\u02e4\n+\3+\3+\3+\3+\3+\5+"+ + "\u02eb\n+\3,\3,\3,\3,\3,\5,\u02f2\n,\3,\3,\3-\3-\3-\3-\3-\3-\5-\u02fc"+ + "\n-\3.\3.\3.\7.\u0301\n.\f.\16.\u0304\13.\3/\3/\3/\3/\5/\u030a\n/\3\60"+ + "\3\60\3\60\7\60\u030f\n\60\f\60\16\60\u0312\13\60\3\61\3\61\3\61\3\61"+ + "\3\61\3\61\5\61\u031a\n\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\5\62"+ + "\u0324\n\62\3\63\3\63\5\63\u0328\n\63\3\63\3\63\3\63\3\63\3\63\3\63\7"+ + "\63\u0330\n\63\f\63\16\63\u0333\13\63\3\63\3\63\3\63\3\64\3\64\3\64\3"+ + "\64\7\64\u033c\n\64\f\64\16\64\u033f\13\64\3\65\3\65\3\65\5\65\u0344\n"+ + "\65\3\65\3\65\5\65\u0348\n\65\3\65\3\65\5\65\u034c\n\65\3\65\3\65\3\65"+ + "\3\66\3\66\3\66\3\66\7\66\u0355\n\66\f\66\16\66\u0358\13\66\3\67\3\67"+ + "\3\67\5\67\u035d\n\67\3\67\3\67\3\67\38\38\38\39\39\39\39\39\79\u036a"+ + "\n9\f9\169\u036d\139\3:\3:\3:\5:\u0372\n:\3:\3:\5:\u0376\n:\3:\3:\5:\u037a"+ + "\n:\3;\3;\3;\3;\3;\5;\u0381\n;\3;\3;\3;\7;\u0386\n;\f;\16;\u0389\13;\3"+ + "<\3<\3<\5<\u038e\n<\3<\3<\3<\5<\u0393\n<\5<\u0395\n<\3<\3<\5<\u0399\n"+ + "<\3=\3=\3=\3>\3>\5>\u03a0\n>\3>\3>\3>\7>\u03a5\n>\f>\16>\u03a8\13>\3>"+ + "\3>\3>\3?\3?\3?\5?\u03b0\n?\3?\3?\3?\3@\3@\3@\3@\3@\6@\u03ba\n@\r@\16"+ + "@\u03bb\3@\3@\3@\3@\3A\3A\6A\u03c4\nA\rA\16A\u03c5\3A\3A\3A\3B\3B\3B\3"+ + "B\3B\6B\u03d0\nB\rB\16B\u03d1\3B\3B\5B\u03d6\nB\3B\3B\3B\3C\3C\3C\3C\5"+ + "C\u03df\nC\3C\3C\3C\7C\u03e4\nC\fC\16C\u03e7\13C\3C\3C\3C\3D\3D\3D\3D"+ + "\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\6E\u03fa\nE\rE\16E\u03fb\3F\3F\3F\5F\u0401"+ + "\nF\3F\3F\3F\5F\u0406\nF\7F\u0408\nF\fF\16F\u040b\13F\3F\3F\3F\3F\3G\3"+ + "G\3G\7G\u0414\nG\fG\16G\u0417\13G\3H\3H\3H\7H\u041c\nH\fH\16H\u041f\13"+ + "H\3I\5I\u0422\nI\3I\3I\3J\3J\3J\5J\u0429\nJ\3K\3K\3K\7K\u042e\nK\fK\16"+ + "K\u0431\13K\3L\3L\3L\5L\u0436\nL\3M\3M\3M\7M\u043b\nM\fM\16M\u043e\13"+ + "M\3N\3N\3N\7N\u0443\nN\fN\16N\u0446\13N\3O\3O\3O\3O\5O\u044c\nO\3P\3P"+ + "\3P\3P\5P\u0452\nP\3Q\3Q\3Q\3Q\5Q\u0458\nQ\3R\3R\3R\3R\5R\u045e\nR\3S"+ + "\3S\3S\3S\5S\u0464\nS\3T\3T\3T\3T\3T\3T\3T\7T\u046d\nT\fT\16T\u0470\13"+ + "T\3U\3U\3U\5U\u0475\nU\3V\7V\u0478\nV\fV\16V\u047b\13V\3V\3V\3W\3W\3W"+ + "\5W\u0482\nW\3X\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\7Z\u0495"+ + "\nZ\fZ\16Z\u0498\13Z\3[\3[\3[\3[\3[\3[\7[\u04a0\n[\f[\16[\u04a3\13[\3"+ + "\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3_\5_\u04b9"+ + "\n_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\5`\u04ca\n`\3a\3a\3a"+ + "\3a\3b\3b\3b\3c\3c\5c\u04d5\nc\3c\3c\3d\3d\3e\3e\3e\3e\3e\3f\3f\3f\3f"+ + "\3f\3g\3g\3g\3h\3h\3h\5h\u04eb\nh\7h\u04ed\nh\fh\16h\u04f0\13h\3h\3h\3"+ + "i\3i\5i\u04f6\ni\3j\3j\5j\u04fa\nj\3k\3k\3k\3k\3l\3l\3l\3l\5l\u0504\n"+ + "l\3l\3l\3l\5l\u0509\nl\3l\3l\3l\3l\3m\3m\3m\3m\3m\3m\3m\3m\5m\u0517\n"+ + "m\3m\3m\3m\3m\3m\7m\u051e\nm\fm\16m\u0521\13m\3m\3m\3m\5m\u0526\nm\3n"+ + "\3n\3n\3n\3o\3o\3o\3o\3o\3o\3p\3p\3p\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\7q"+ + "\u053f\nq\fq\16q\u0542\13q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3r\3s\3s\3s\6"+ + "s\u0552\ns\rs\16s\u0553\3t\3t\3t\3t\3u\3u\3u\5u\u055d\nu\3u\3u\3u\3u\3"+ + "u\7u\u0564\nu\fu\16u\u0567\13u\5u\u0569\nu\3v\3v\3v\3v\3v\3v\5v\u0571"+ + "\nv\3w\3w\5w\u0575\nw\3w\3w\3w\5w\u057a\nw\3x\3x\3x\7x\u057f\nx\fx\16"+ + "x\u0582\13x\3y\3y\5y\u0586\ny\3z\3z\5z\u058a\nz\3z\3z\3{\3{\3{\3{\5{\u0592"+ + "\n{\3|\3|\3|\3|\3}\5}\u0599\n}\3}\3}\3~\3~\3~\3~\5~\u05a1\n~\3\177\3\177"+ + "\3\177\3\177\3\u0080\3\u0080\3\u0081\3\u0081\5\u0081\u05ab\n\u0081\3\u0082"+ + "\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083\5\u0083\u05b3\n\u0083\3\u0084"+ + "\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086\7\u0086"+ + "\u05be\n\u0086\f\u0086\16\u0086\u05c1\13\u0086\3\u0087\3\u0087\3\u0087"+ + "\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\5\u0087"+ + "\u05ce\n\u0087\3\u0088\3\u0088\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089"+ + "\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\5\u0089\u05de"+ + "\n\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u05e3\n\u008a\3\u008a\3\u008a"+ + "\3\u008b\3\u008b\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\5\u008c"+ + "\u05ef\n\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e"+ + "\3\u008e\3\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090"+ + "\3\u0090\3\u0090\5\u0090\u0603\n\u0090\3\u0090\3\u0090\3\u0091\3\u0091"+ + "\3\u0091\3\u0091\3\u0091\5\u0091\u060c\n\u0091\5\u0091\u060e\n\u0091\3"+ + "\u0091\3\u0091\3\u0092\3\u0092\5\u0092\u0614\n\u0092\3\u0093\3\u0093\3"+ + "\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094"+ + "\5\u0094\u0621\n\u0094\5\u0094\u0623\n\u0094\5\u0094\u0625\n\u0094\3\u0094"+ + "\3\u0094\3\u0095\3\u0095\5\u0095\u062b\n\u0095\3\u0096\3\u0096\3\u0096"+ + "\3\u0096\3\u0096\3\u0097\3\u0097\3\u0098\3\u0098\3\u0099\3\u0099\3\u009a"+ + "\3\u009a\3\u009b\3\u009b\3\u009c\3\u009c\5\u009c\u063e\n\u009c\3\u009d"+ + "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\3\u009e\3\u009e\3\u009f\3\u009f\5\u009f\u064e\n\u009f\3\u00a0\3\u00a0"+ + "\3\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a2"+ + "\3\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4"+ + "\3\u00a4\5\u00a4\u0665\n\u00a4\3\u00a5\3\u00a5\3\u00a5\5\u00a5\u066a\n"+ + "\u00a5\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a6\5\u00a6\u0671\n\u00a6\3"+ + "\u00a6\3\u00a6\3\u00a7\3\u00a7\3\u00a7\5\u00a7\u0678\n\u00a7\3\u00a7\3"+ + "\u00a7\3\u00a8\3\u00a8\3\u00a8\5\u00a8\u067f\n\u00a8\3\u00a8\3\u00a8\3"+ + "\u00a9\3\u00a9\3\u00a9\5\u00a9\u0686\n\u00a9\3\u00a9\3\u00a9\3\u00aa\3"+ + "\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u0690\n\u00aa\5\u00aa\u0692"+ + "\n\u00aa\3\u00ab\3\u00ab\3\u00ab\3\u00ab\7\u00ab\u0698\n\u00ab\f\u00ab"+ + "\16\u00ab\u069b\13\u00ab\5\u00ab\u069d\n\u00ab\3\u00ab\3\u00ab\3\u00ab"+ + "\3\u00ab\3\u00ab\5\u00ab\u06a4\n\u00ab\3\u00ac\3\u00ac\5\u00ac\u06a8\n"+ + "\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00ae"+ + "\3\u00ae\3\u00ae\7\u00ae\u06b4\n\u00ae\f\u00ae\16\u00ae\u06b7\13\u00ae"+ + "\5\u00ae\u06b9\n\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af"+ + "\5\u00af\u06c1\n\u00af\3\u00b0\3\u00b0\5\u00b0\u06c5\n\u00b0\3\u00b0\3"+ + "\u00b0\3\u00b0\3\u00b1\3\u00b1\5\u00b1\u06cc\n\u00b1\3\u00b1\3\u00b1\3"+ + "\u00b2\3\u00b2\3\u00b3\3\u00b3\3\u00b4\3\u00b4\3\u00b4\2\2\u00b5\2\4\6"+ + "\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRT"+ + "VXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e"+ + "\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6"+ + "\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be"+ + "\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6"+ + "\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee"+ + "\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106"+ + "\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e"+ + "\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136"+ + "\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c\u014e"+ + "\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166"+ + "\2\r\4\2\21\21ii\3\2RS\3\2\24\35\4\2\5\5#-\3\2/\60\4\2\f\f\61\63\3\2\u0089"+ + "\u008a\3\2\u008c\u0092\3\2\u0093\u0097\4\2\23\23\u00aa\u00aa\4\2=\u0084"+ + "\u00ab\u00ab\2\u071c\2\u0168\3\2\2\2\4\u0170\3\2\2\2\6\u0176\3\2\2\2\b"+ + "\u0179\3\2\2\2\n\u018a\3\2\2\2\f\u0195\3\2\2\2\16\u019a\3\2\2\2\20\u019d"+ + "\3\2\2\2\22\u01a0\3\2\2\2\24\u01b1\3\2\2\2\26\u01b3\3\2\2\2\30\u01b6\3"+ + "\2\2\2\32\u01bc\3\2\2\2\34\u01c0\3\2\2\2\36\u01c4\3\2\2\2 \u01c8\3\2\2"+ + "\2\"\u01cf\3\2\2\2$\u01df\3\2\2\2&\u01e8\3\2\2\2(\u01f7\3\2\2\2*\u01fe"+ + "\3\2\2\2,\u0205\3\2\2\2.\u0216\3\2\2\2\60\u0226\3\2\2\2\62\u0237\3\2\2"+ + "\2\64\u0248\3\2\2\2\66\u024b\3\2\2\28\u0257\3\2\2\2:\u0260\3\2\2\2<\u026a"+ + "\3\2\2\2>\u026c\3\2\2\2@\u0276\3\2\2\2B\u0278\3\2\2\2D\u027d\3\2\2\2F"+ + "\u0281\3\2\2\2H\u0287\3\2\2\2J\u029c\3\2\2\2L\u02a2\3\2\2\2N\u02a4\3\2"+ + "\2\2P\u02b7\3\2\2\2R\u02c8\3\2\2\2T\u02d8\3\2\2\2V\u02ec\3\2\2\2X\u02fb"+ + "\3\2\2\2Z\u02fd\3\2\2\2\\\u0305\3\2\2\2^\u030b\3\2\2\2`\u0319\3\2\2\2"+ + "b\u0323\3\2\2\2d\u0327\3\2\2\2f\u0337\3\2\2\2h\u0340\3\2\2\2j\u0350\3"+ + "\2\2\2l\u0359\3\2\2\2n\u0361\3\2\2\2p\u0364\3\2\2\2r\u036e\3\2\2\2t\u0380"+ + "\3\2\2\2v\u038a\3\2\2\2x\u039a\3\2\2\2z\u039f\3\2\2\2|\u03ac\3\2\2\2~"+ + "\u03b4\3\2\2\2\u0080\u03c3\3\2\2\2\u0082\u03ca\3\2\2\2\u0084\u03da\3\2"+ + "\2\2\u0086\u03eb\3\2\2\2\u0088\u03f4\3\2\2\2\u008a\u03fd\3\2\2\2\u008c"+ + "\u0410\3\2\2\2\u008e\u0418\3\2\2\2\u0090\u0421\3\2\2\2\u0092\u0425\3\2"+ + "\2\2\u0094\u042a\3\2\2\2\u0096\u0432\3\2\2\2\u0098\u0437\3\2\2\2\u009a"+ + "\u043f\3\2\2\2\u009c\u0447\3\2\2\2\u009e\u044d\3\2\2\2\u00a0\u0453\3\2"+ + "\2\2\u00a2\u0459\3\2\2\2\u00a4\u045f\3\2\2\2\u00a6\u0465\3\2\2\2\u00a8"+ + "\u0474\3\2\2\2\u00aa\u0479\3\2\2\2\u00ac\u0481\3\2\2\2\u00ae\u0483\3\2"+ + "\2\2\u00b0\u048a\3\2\2\2\u00b2\u0491\3\2\2\2\u00b4\u0499\3\2\2\2\u00b6"+ + "\u04a4\3\2\2\2\u00b8\u04aa\3\2\2\2\u00ba\u04ad\3\2\2\2\u00bc\u04b1\3\2"+ + "\2\2\u00be\u04c9\3\2\2\2\u00c0\u04cb\3\2\2\2\u00c2\u04cf\3\2\2\2\u00c4"+ + "\u04d2\3\2\2\2\u00c6\u04d8\3\2\2\2\u00c8\u04da\3\2\2\2\u00ca\u04df\3\2"+ + "\2\2\u00cc\u04e4\3\2\2\2\u00ce\u04e7\3\2\2\2\u00d0\u04f5\3\2\2\2\u00d2"+ + "\u04f9\3\2\2\2\u00d4\u04fb\3\2\2\2\u00d6\u04ff\3\2\2\2\u00d8\u0525\3\2"+ + "\2\2\u00da\u0527\3\2\2\2\u00dc\u052b\3\2\2\2\u00de\u0531\3\2\2\2\u00e0"+ + "\u0539\3\2\2\2\u00e2\u0548\3\2\2\2\u00e4\u054e\3\2\2\2\u00e6\u0555\3\2"+ + "\2\2\u00e8\u0559\3\2\2\2\u00ea\u0570\3\2\2\2\u00ec\u0579\3\2\2\2\u00ee"+ + "\u057b\3\2\2\2\u00f0\u0585\3\2\2\2\u00f2\u0589\3\2\2\2\u00f4\u0591\3\2"+ + "\2\2\u00f6\u0593\3\2\2\2\u00f8\u0598\3\2\2\2\u00fa\u05a0\3\2\2\2\u00fc"+ + "\u05a2\3\2\2\2\u00fe\u05a6\3\2\2\2\u0100\u05aa\3\2\2\2\u0102\u05ac\3\2"+ + "\2\2\u0104\u05b2\3\2\2\2\u0106\u05b4\3\2\2\2\u0108\u05b8\3\2\2\2\u010a"+ + "\u05bf\3\2\2\2\u010c\u05cd\3\2\2\2\u010e\u05cf\3\2\2\2\u0110\u05dd\3\2"+ + "\2\2\u0112\u05df\3\2\2\2\u0114\u05e6\3\2\2\2\u0116\u05ea\3\2\2\2\u0118"+ + "\u05f2\3\2\2\2\u011a\u05f6\3\2\2\2\u011c\u05fa\3\2\2\2\u011e\u05fe\3\2"+ + "\2\2\u0120\u0606\3\2\2\2\u0122\u0613\3\2\2\2\u0124\u0615\3\2\2\2\u0126"+ + "\u061a\3\2\2\2\u0128\u062a\3\2\2\2\u012a\u062c\3\2\2\2\u012c\u0631\3\2"+ + "\2\2\u012e\u0633\3\2\2\2\u0130\u0635\3\2\2\2\u0132\u0637\3\2\2\2\u0134"+ + "\u0639\3\2\2\2\u0136\u063d\3\2\2\2\u0138\u063f\3\2\2\2\u013a\u0644\3\2"+ + "\2\2\u013c\u064d\3\2\2\2\u013e\u064f\3\2\2\2\u0140\u0654\3\2\2\2\u0142"+ + "\u0659\3\2\2\2\u0144\u065d\3\2\2\2\u0146\u0664\3\2\2\2\u0148\u0666\3\2"+ + "\2\2\u014a\u066d\3\2\2\2\u014c\u0674\3\2\2\2\u014e\u067b\3\2\2\2\u0150"+ + "\u0682\3\2\2\2\u0152\u0691\3\2\2\2\u0154\u06a3\3\2\2\2\u0156\u06a7\3\2"+ + "\2\2\u0158\u06a9\3\2\2\2\u015a\u06ae\3\2\2\2\u015c\u06be\3\2\2\2\u015e"+ + "\u06c4\3\2\2\2\u0160\u06c9\3\2\2\2\u0162\u06cf\3\2\2\2\u0164\u06d1\3\2"+ + "\2\2\u0166\u06d3\3\2\2\2\u0168\u0169\5\4\3\2\u0169\u016a\7\2\2\3\u016a"+ + "\3\3\2\2\2\u016b\u016c\7h\2\2\u016c\u016d\7g\2\2\u016d\u016e\5\u0164\u00b3"+ + "\2\u016e\u016f\7\3\2\2\u016f\u0171\3\2\2\2\u0170\u016b\3\2\2\2\u0170\u0171"+ + "\3\2\2\2\u0171\u0174\3\2\2\2\u0172\u0175\5\b\5\2\u0173\u0175\5\6\4\2\u0174"+ + "\u0172\3\2\2\2\u0174\u0173\3\2\2\2\u0175\5\3\2\2\2\u0176\u0177\5\n\6\2"+ + "\u0177\u0178\5\f\7\2\u0178\7\3\2\2\2\u0179\u017a\7\4\2\2\u017a\u017b\7"+ + "\u0087\2\2\u017b\u017c\7\u00b2\2\2\u017c\u017d\7\5\2\2\u017d\u017e\5\u0162"+ + "\u00b2\2\u017e\u017f\7\3\2\2\u017f\u0180\5\n\6\2\u0180\t\3\2\2\2\u0181"+ + "\u0185\5<\37\2\u0182\u0185\5> \2\u0183\u0185\5N(\2\u0184\u0181\3\2\2\2"+ + "\u0184\u0182\3\2\2\2\u0184\u0183\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0187"+ + "\7\3\2\2\u0187\u0189\3\2\2\2\u0188\u0184\3\2\2\2\u0189\u018c\3\2\2\2\u018a"+ + "\u0188\3\2\2\2\u018a\u018b\3\2\2\2\u018b\u0192\3\2\2\2\u018c\u018a\3\2"+ + "\2\2\u018d\u018e\5@!\2\u018e\u018f\7\3\2\2\u018f\u0191\3\2\2\2\u0190\u018d"+ + "\3\2\2\2\u0191\u0194\3\2\2\2\u0192\u0190\3\2\2\2\u0192\u0193\3\2\2\2\u0193"+ + "\13\3\2\2\2\u0194\u0192\3\2\2\2\u0195\u0196\5\22\n\2\u0196\r\3\2\2\2\u0197"+ + "\u0199\5\24\13\2\u0198\u0197\3\2\2\2\u0199\u019c\3\2\2\2\u019a\u0198\3"+ + "\2\2\2\u019a\u019b\3\2\2\2\u019b\17\3\2\2\2\u019c\u019a\3\2\2\2\u019d"+ + "\u019e\5\16\b\2\u019e\u019f\5^\60\2\u019f\21\3\2\2\2\u01a0\u01a2\5\16"+ + "\b\2\u01a1\u01a3\5^\60\2\u01a2\u01a1\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3"+ + "\23\3\2\2\2\u01a4\u01b2\5\26\f\2\u01a5\u01b2\5\30\r\2\u01a6\u01b2\5\32"+ + "\16\2\u01a7\u01b2\5\34\17\2\u01a8\u01b2\5\36\20\2\u01a9\u01b2\5 \21\2"+ + "\u01aa\u01b2\5\"\22\2\u01ab\u01b2\5$\23\2\u01ac\u01b2\5&\24\2\u01ad\u01b2"+ + "\5*\26\2\u01ae\u01b2\5.\30\2\u01af\u01b2\5\66\34\2\u01b0\u01b2\5:\36\2"+ + "\u01b1\u01a4\3\2\2\2\u01b1\u01a5\3\2\2\2\u01b1\u01a6\3\2\2\2\u01b1\u01a7"+ + "\3\2\2\2\u01b1\u01a8\3\2\2\2\u01b1\u01a9\3\2\2\2\u01b1\u01aa\3\2\2\2\u01b1"+ + "\u01ab\3\2\2\2\u01b1\u01ac\3\2\2\2\u01b1\u01ad\3\2\2\2\u01b1\u01ae\3\2"+ + "\2\2\u01b1\u01af\3\2\2\2\u01b1\u01b0\3\2\2\2\u01b2\25\3\2\2\2\u01b3\u01b4"+ + "\5b\62\2\u01b4\u01b5\7\3\2\2\u01b5\27\3\2\2\2\u01b6\u01b7\7\6\2\2\u01b7"+ + "\u01b8\5J&\2\u01b8\u01b9\7\7\2\2\u01b9\u01ba\5`\61\2\u01ba\u01bb\7\3\2"+ + "\2\u01bb\31\3\2\2\2\u01bc\u01bd\7\b\2\2\u01bd\u01be\5\16\b\2\u01be\u01bf"+ + "\7\t\2\2\u01bf\33\3\2\2\2\u01c0\u01c1\7\177\2\2\u01c1\u01c2\7\u0080\2"+ + "\2\u01c2\u01c3\7\3\2\2\u01c3\35\3\2\2\2\u01c4\u01c5\7\u0081\2\2\u01c5"+ + "\u01c6\7\u0080\2\2\u01c6\u01c7\7\3\2\2\u01c7\37\3\2\2\2\u01c8\u01c9\7"+ + "\u0082\2\2\u01c9\u01ca\7\u0083\2\2\u01ca\u01cb\5`\61\2\u01cb\u01cc\7\3"+ + "\2\2\u01cc!\3\2\2\2\u01cd\u01d0\5f\64\2\u01ce\u01d0\5j\66\2\u01cf\u01cd"+ + "\3\2\2\2\u01cf\u01ce\3\2\2\2\u01d0\u01d9\3\2\2\2\u01d1\u01d8\5f\64\2\u01d2"+ + "\u01d8\5j\66\2\u01d3\u01d8\5n8\2\u01d4\u01d8\5p9\2\u01d5\u01d8\5t;\2\u01d6"+ + "\u01d8\5x=\2\u01d7\u01d1\3\2\2\2\u01d7\u01d2\3\2\2\2\u01d7\u01d3\3\2\2"+ + "\2\u01d7\u01d4\3\2\2\2\u01d7\u01d5\3\2\2\2\u01d7\u01d6\3\2\2\2\u01d8\u01db"+ + "\3\2\2\2\u01d9\u01d7\3\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01dc\3\2\2\2\u01db"+ + "\u01d9\3\2\2\2\u01dc\u01dd\7C\2\2\u01dd\u01de\5\24\13\2\u01de#\3\2\2\2"+ + "\u01df\u01e0\7D\2\2\u01e0\u01e1\7\n\2\2\u01e1\u01e2\5^\60\2\u01e2\u01e3"+ + "\7\13\2\2\u01e3\u01e4\7Y\2\2\u01e4\u01e5\5\24\13\2\u01e5\u01e6\7Z\2\2"+ + "\u01e6\u01e7\5\24\13\2\u01e7%\3\2\2\2\u01e8\u01e9\7T\2\2\u01e9\u01ea\7"+ + "\n\2\2\u01ea\u01eb\5^\60\2\u01eb\u01ed\7\13\2\2\u01ec\u01ee\5(\25\2\u01ed"+ + "\u01ec\3\2\2\2\u01ee\u01ef\3\2\2\2\u01ef\u01ed\3\2\2\2\u01ef\u01f0\3\2"+ + "\2\2\u01f0\u01f1\3\2\2\2\u01f1\u01f2\7X\2\2\u01f2\u01f3\7C\2\2\u01f3\u01f4"+ + "\5\24\13\2\u01f4\'\3\2\2\2\u01f5\u01f6\7U\2\2\u01f6\u01f8\5`\61\2\u01f7"+ + "\u01f5\3\2\2\2\u01f8\u01f9\3\2\2\2\u01f9\u01f7\3\2\2\2\u01f9\u01fa\3\2"+ + "\2\2\u01fa\u01fb\3\2\2\2\u01fb\u01fc\7C\2\2\u01fc\u01fd\5\24\13\2\u01fd"+ + ")\3\2\2\2\u01fe\u01ff\7V\2\2\u01ff\u0201\5\32\16\2\u0200\u0202\5,\27\2"+ + "\u0201\u0200\3\2\2\2\u0202\u0203\3\2\2\2\u0203\u0201\3\2\2\2\u0203\u0204"+ + "\3\2\2\2\u0204+\3\2\2\2\u0205\u0208\7W\2\2\u0206\u0209\7\f\2\2\u0207\u0209"+ + "\5J&\2\u0208\u0206\3\2\2\2\u0208\u0207\3\2\2\2\u0209\u0211\3\2\2\2\u020a"+ + "\u020d\7\r\2\2\u020b\u020e\7\f\2\2\u020c\u020e\5J&\2\u020d\u020b\3\2\2"+ + "\2\u020d\u020c\3\2\2\2\u020e\u0210\3\2\2\2\u020f\u020a\3\2\2\2\u0210\u0213"+ + "\3\2\2\2\u0211\u020f\3\2\2\2\u0211\u0212\3\2\2\2\u0212\u0214\3\2\2\2\u0213"+ + "\u0211\3\2\2\2\u0214\u0215\5\32\16\2\u0215-\3\2\2\2\u0216\u0217\7[\2\2"+ + "\u0217\u0218\7\n\2\2\u0218\u0219\5^\60\2\u0219\u021b\7\13\2\2\u021a\u021c"+ + "\5\60\31\2\u021b\u021a\3\2\2\2\u021c\u021d\3\2\2\2\u021d\u021b\3\2\2\2"+ + "\u021d\u021e\3\2\2\2\u021e\u021f\3\2\2\2\u021f\u0221\7X\2\2\u0220\u0222"+ + "\5\u00c2b\2\u0221\u0220\3\2\2\2\u0221\u0222\3\2\2\2\u0222\u0223\3\2\2"+ + "\2\u0223\u0224\7C\2\2\u0224\u0225\5\24\13\2\u0225/\3\2\2\2\u0226\u022a"+ + "\7U\2\2\u0227\u0228\5\u00c2b\2\u0228\u0229\7F\2\2\u0229\u022b\3\2\2\2"+ + "\u022a\u0227\3\2\2\2\u022a\u022b\3\2\2\2\u022b\u022c\3\2\2\2\u022c\u0231"+ + "\5\u0152\u00aa\2\u022d\u022e\7\r\2\2\u022e\u0230\5\u0152\u00aa\2\u022f"+ + "\u022d\3\2\2\2\u0230\u0233\3\2\2\2\u0231\u022f\3\2\2\2\u0231\u0232\3\2"+ + "\2\2\u0232\u0234\3\2\2\2\u0233\u0231\3\2\2\2\u0234\u0235\7C\2\2\u0235"+ + "\u0236\5\24\13\2\u0236\61\3\2\2\2\u0237\u0238\7\16\2\2\u0238\u0243\5J"+ + "&\2\u0239\u023a\7\n\2\2\u023a\u023f\7\u00ac\2\2\u023b\u023c\7\17\2\2\u023c"+ + "\u023e\7\u00ac\2\2\u023d\u023b\3\2\2\2\u023e\u0241\3\2\2\2\u023f\u023d"+ + "\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u0242\3\2\2\2\u0241\u023f\3\2\2\2\u0242"+ + "\u0244\7\13\2\2\u0243\u0239\3\2\2\2\u0243\u0244\3\2\2\2\u0244\63\3\2\2"+ + "\2\u0245\u0247\5\62\32\2\u0246\u0245\3\2\2\2\u0247\u024a\3\2\2\2\u0248"+ + "\u0246\3\2\2\2\u0248\u0249\3\2\2\2\u0249\65\3\2\2\2\u024a\u0248\3\2\2"+ + "\2\u024b\u024c\5\64\33\2\u024c\u024d\7r\2\2\u024d\u0252\58\35\2\u024e"+ + "\u024f\7\17\2\2\u024f\u0251\58\35\2\u0250\u024e\3\2\2\2\u0251\u0254\3"+ + "\2\2\2\u0252\u0250\3\2\2\2\u0252\u0253\3\2\2\2\u0253\u0255\3\2\2\2\u0254"+ + "\u0252\3\2\2\2\u0255\u0256\7\3\2\2\u0256\67\3\2\2\2\u0257\u025a\5\u00c2"+ + "b\2\u0258\u0259\7F\2\2\u0259\u025b\5\u0152\u00aa\2\u025a\u0258\3\2\2\2"+ + "\u025a\u025b\3\2\2\2\u025b\u025e\3\2\2\2\u025c\u025d\7\7\2\2\u025d\u025f"+ + "\5`\61\2\u025e\u025c\3\2\2\2\u025e\u025f\3\2\2\2\u025f9\3\2\2\2\u0260"+ + "\u0261\7\u0084\2\2\u0261\u0262\7\n\2\2\u0262\u0263\5^\60\2\u0263\u0264"+ + "\7\13\2\2\u0264\u0265\5\24\13\2\u0265;\3\2\2\2\u0266\u026b\5B\"\2\u0267"+ + "\u026b\5D#\2\u0268\u026b\5F$\2\u0269\u026b\5H%\2\u026a\u0266\3\2\2\2\u026a"+ + "\u0267\3\2\2\2\u026a\u0268\3\2\2\2\u026a\u0269\3\2\2\2\u026b=\3\2\2\2"+ + "\u026c\u026d\7o\2\2\u026d\u026e\7\u0087\2\2\u026e\u026f\7\u00b2\2\2\u026f"+ + "\u0270\7\5\2\2\u0270\u0271\5\u0162\u00b2\2\u0271?\3\2\2\2\u0272\u0277"+ + "\5T+\2\u0273\u0277\5P)\2\u0274\u0277\5V,\2\u0275\u0277\5R*\2\u0276\u0272"+ + "\3\2\2\2\u0276\u0273\3\2\2\2\u0276\u0274\3\2\2\2\u0276\u0275\3\2\2\2\u0277"+ + "A\3\2\2\2\u0278\u0279\7o\2\2\u0279\u027a\7X\2\2\u027a\u027b\7Q\2\2\u027b"+ + "\u027c\5\u0162\u00b2\2\u027cC\3\2\2\2\u027d\u027e\7o\2\2\u027e\u027f\7"+ + "\20\2\2\u027f\u0280\t\2\2\2\u0280E\3\2\2\2\u0281\u0282\7o\2\2\u0282\u0283"+ + "\7X\2\2\u0283\u0284\7B\2\2\u0284\u0285\7I\2\2\u0285\u0286\t\3\2\2\u0286"+ + "G\3\2\2\2\u0287\u028c\7o\2\2\u0288\u0289\7\22\2\2\u0289\u028d\5J&\2\u028a"+ + "\u028b\7X\2\2\u028b\u028d\7\22\2\2\u028c\u0288\3\2\2\2\u028c\u028a\3\2"+ + "\2\2\u028d\u0294\3\2\2\2\u028e\u028f\5L\'\2\u028f\u0290\7\5\2\2\u0290"+ + "\u0291\5\u0164\u00b3\2\u0291\u0293\3\2\2\2\u0292\u028e\3\2\2\2\u0293\u0296"+ + "\3\2\2\2\u0294\u0292\3\2\2\2\u0294\u0295\3\2\2\2\u0295I\3\2\2\2\u0296"+ + "\u0294\3\2\2\2\u0297\u029a\7\u00b2\2\2\u0298\u029a\5\u0166\u00b4\2\u0299"+ + "\u0297\3\2\2\2\u0299\u0298\3\2\2\2\u029a\u029b\3\2\2\2\u029b\u029d\7\23"+ + "\2\2\u029c\u0299\3\2\2\2\u029c\u029d\3\2\2\2\u029d\u02a0\3\2\2\2\u029e"+ + "\u02a1\7\u00b2\2\2\u029f\u02a1\5\u0166\u00b4\2\u02a0\u029e\3\2\2\2\u02a0"+ + "\u029f\3\2\2\2\u02a1K\3\2\2\2\u02a2\u02a3\t\4\2\2\u02a3M\3\2\2\2\u02a4"+ + "\u02a5\7\u0085\2\2\u02a5\u02a9\7\4\2\2\u02a6\u02a7\7\u0087\2\2\u02a7\u02a8"+ + "\7\u00b2\2\2\u02a8\u02aa\7\5\2\2\u02a9\u02a6\3\2\2\2\u02a9\u02aa\3\2\2"+ + "\2\u02aa\u02ab\3\2\2\2\u02ab\u02b5\5\u0162\u00b2\2\u02ac\u02ad\7G\2\2"+ + "\u02ad\u02b2\5\u0162\u00b2\2\u02ae\u02af\7\17\2\2\u02af\u02b1\5\u0162"+ + "\u00b2\2\u02b0\u02ae\3\2\2\2\u02b1\u02b4\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b2"+ + "\u02b3\3\2\2\2\u02b3\u02b6\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5\u02ac\3\2"+ + "\2\2\u02b5\u02b6\3\2\2\2\u02b6O\3\2\2\2\u02b7\u02b8\7o\2\2\u02b8\u02b9"+ + "\5\64\33\2\u02b9\u02ba\7r\2\2\u02ba\u02bd\5\u00c2b\2\u02bb\u02bc\7F\2"+ + "\2\u02bc\u02be\5\u0152\u00aa\2\u02bd\u02bb\3\2\2\2\u02bd\u02be\3\2\2\2"+ + "\u02be\u02c6\3\2\2\2\u02bf\u02c0\7\7\2\2\u02c0\u02c7\5`\61\2\u02c1\u02c4"+ + "\7\36\2\2\u02c2\u02c3\7\7\2\2\u02c3\u02c5\5`\61\2\u02c4\u02c2\3\2\2\2"+ + "\u02c4\u02c5\3\2\2\2\u02c5\u02c7\3\2\2\2\u02c6\u02bf\3\2\2\2\u02c6\u02c1"+ + "\3\2\2\2\u02c7Q\3\2\2\2\u02c8\u02c9\7o\2\2\u02c9\u02ca\7p\2\2\u02ca\u02cd"+ + "\7q\2\2\u02cb\u02cc\7F\2\2\u02cc\u02ce\5\u0152\u00aa\2\u02cd\u02cb\3\2"+ + "\2\2\u02cd\u02ce\3\2\2\2\u02ce\u02d6\3\2\2\2\u02cf\u02d0\7\7\2\2\u02d0"+ + "\u02d7\5`\61\2\u02d1\u02d4\7\36\2\2\u02d2\u02d3\7\7\2\2\u02d3\u02d5\5"+ + "`\61\2\u02d4\u02d2\3\2\2\2\u02d4\u02d5\3\2\2\2\u02d5\u02d7\3\2\2\2\u02d6"+ + "\u02cf\3\2\2\2\u02d6\u02d1\3\2\2\2\u02d7S\3\2\2\2\u02d8\u02d9\7o\2\2\u02d9"+ + "\u02da\5\64\33\2\u02da\u02db\7\37\2\2\u02db\u02dc\5J&\2\u02dc\u02de\7"+ + "\n\2\2\u02dd\u02df\5Z.\2\u02de\u02dd\3\2\2\2\u02de\u02df\3\2\2\2\u02df"+ + "\u02e0\3\2\2\2\u02e0\u02e3\7\13\2\2\u02e1\u02e2\7F\2\2\u02e2\u02e4\5\u0152"+ + "\u00aa\2\u02e3\u02e1\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4\u02ea\3\2\2\2\u02e5"+ + "\u02e6\7\b\2\2\u02e6\u02e7\5\22\n\2\u02e7\u02e8\7\t\2\2\u02e8\u02eb\3"+ + "\2\2\2\u02e9\u02eb\7\36\2\2\u02ea\u02e5\3\2\2\2\u02ea\u02e9\3\2\2\2\u02eb"+ + "U\3\2\2\2\u02ec\u02ed\7o\2\2\u02ed\u02ee\7l\2\2\u02ee\u02ef\5J&\2\u02ef"+ + "\u02f1\7F\2\2\u02f0\u02f2\5X-\2\u02f1\u02f0\3\2\2\2\u02f1\u02f2\3\2\2"+ + "\2\u02f2\u02f3\3\2\2\2\u02f3\u02f4\5`\61\2\u02f4W\3\2\2\2\u02f5\u02f6"+ + "\7 \2\2\u02f6\u02fc\7!\2\2\u02f7\u02f8\7 \2\2\u02f8\u02fc\7\"\2\2\u02f9"+ + "\u02fa\7|\2\2\u02fa\u02fc\7\u0086\2\2\u02fb\u02f5\3\2\2\2\u02fb\u02f7"+ + "\3\2\2\2\u02fb\u02f9\3\2\2\2\u02fcY\3\2\2\2\u02fd\u0302\5\\/\2\u02fe\u02ff"+ + "\7\17\2\2\u02ff\u0301\5\\/\2\u0300\u02fe\3\2\2\2\u0301\u0304\3\2\2\2\u0302"+ + "\u0300\3\2\2\2\u0302\u0303\3\2\2\2\u0303[\3\2\2\2\u0304\u0302\3\2\2\2"+ + "\u0305\u0306\7\6\2\2\u0306\u0309\5J&\2\u0307\u0308\7F\2\2\u0308\u030a"+ + "\5\u0152\u00aa\2\u0309\u0307\3\2\2\2\u0309\u030a\3\2\2\2\u030a]\3\2\2"+ + "\2\u030b\u0310\5`\61\2\u030c\u030d\7\17\2\2\u030d\u030f\5`\61\2\u030e"+ + "\u030c\3\2\2\2\u030f\u0312\3\2\2\2\u0310\u030e\3\2\2\2\u0310\u0311\3\2"+ + "\2\2\u0311_\3\2\2\2\u0312\u0310\3\2\2\2\u0313\u031a\5b\62\2\u0314\u031a"+ + "\5d\63\2\u0315\u031a\5~@\2\u0316\u031a\5\u0082B\2\u0317\u031a\5\u0086"+ + "D\2\u0318\u031a\5\u0088E\2\u0319\u0313\3\2\2\2\u0319\u0314\3\2\2\2\u0319"+ + "\u0315\3\2\2\2\u0319\u0316\3\2\2\2\u0319\u0317\3\2\2\2\u0319\u0318\3\2"+ + "\2\2\u031aa\3\2\2\2\u031b\u0324\5z>\2\u031c\u0324\5\u008cG\2\u031d\u0324"+ + "\5\u00d8m\2\u031e\u0324\5\u00dan\2\u031f\u0324\5\u00dco\2\u0320\u0324"+ + "\5\u00dep\2\u0321\u0324\5\u00e0q\2\u0322\u0324\5\u00e2r\2\u0323\u031b"+ + "\3\2\2\2\u0323\u031c\3\2\2\2\u0323\u031d\3\2\2\2\u0323\u031e\3\2\2\2\u0323"+ + "\u031f\3\2\2\2\u0323\u0320\3\2\2\2\u0323\u0321\3\2\2\2\u0323\u0322\3\2"+ + "\2\2\u0324c\3\2\2\2\u0325\u0328\5f\64\2\u0326\u0328\5j\66\2\u0327\u0325"+ + "\3\2\2\2\u0327\u0326\3\2\2\2\u0328\u0331\3\2\2\2\u0329\u0330\5f\64\2\u032a"+ + "\u0330\5j\66\2\u032b\u0330\5n8\2\u032c\u0330\5p9\2\u032d\u0330\5t;\2\u032e"+ + "\u0330\5x=\2\u032f\u0329\3\2\2\2\u032f\u032a\3\2\2\2\u032f\u032b\3\2\2"+ + "\2\u032f\u032c\3\2\2\2\u032f\u032d\3\2\2\2\u032f\u032e\3\2\2\2\u0330\u0333"+ + "\3\2\2\2\u0331\u032f\3\2\2\2\u0331\u0332\3\2\2\2\u0332\u0334\3\2\2\2\u0333"+ + "\u0331\3\2\2\2\u0334\u0335\7C\2\2\u0335\u0336\5`\61\2\u0336e\3\2\2\2\u0337"+ + "\u0338\7=\2\2\u0338\u033d\5h\65\2\u0339\u033a\7\17\2\2\u033a\u033c\5h"+ + "\65\2\u033b\u0339\3\2\2\2\u033c\u033f\3\2\2\2\u033d\u033b\3\2\2\2\u033d"+ + "\u033e\3\2\2\2\u033eg\3\2\2\2\u033f\u033d\3\2\2\2\u0340\u0343\5\u00c2"+ + "b\2\u0341\u0342\7F\2\2\u0342\u0344\5\u0152\u00aa\2\u0343\u0341\3\2\2\2"+ + "\u0343\u0344\3\2\2\2\u0344\u0347\3\2\2\2\u0345\u0346\7H\2\2\u0346\u0348"+ + "\7I\2\2\u0347\u0345\3\2\2\2\u0347\u0348\3\2\2\2\u0348\u034b\3\2\2\2\u0349"+ + "\u034a\7G\2\2\u034a\u034c\5\u00c2b\2\u034b\u0349\3\2\2\2\u034b\u034c\3"+ + "\2\2\2\u034c\u034d\3\2\2\2\u034d\u034e\7E\2\2\u034e\u034f\5`\61\2\u034f"+ + "i\3\2\2\2\u0350\u0351\7>\2\2\u0351\u0356\5l\67\2\u0352\u0353\7\17\2\2"+ + "\u0353\u0355\5l\67\2\u0354\u0352\3\2\2\2\u0355\u0358\3\2\2\2\u0356\u0354"+ + "\3\2\2\2\u0356\u0357\3\2\2\2\u0357k\3\2\2\2\u0358\u0356\3\2\2\2\u0359"+ + "\u035c\5\u00c2b\2\u035a\u035b\7F\2\2\u035b\u035d\5\u0152\u00aa\2\u035c"+ + "\u035a\3\2\2\2\u035c\u035d\3\2\2\2\u035d\u035e\3\2\2\2\u035e\u035f\7\7"+ + "\2\2\u035f\u0360\5`\61\2\u0360m\3\2\2\2\u0361\u0362\7?\2\2\u0362\u0363"+ + "\5`\61\2\u0363o\3\2\2\2\u0364\u0365\7@\2\2\u0365\u0366\7A\2\2\u0366\u036b"+ + "\5r:\2\u0367\u0368\7\17\2\2\u0368\u036a\5r:\2\u0369\u0367\3\2\2\2\u036a"+ + "\u036d\3\2\2\2\u036b\u0369\3\2\2\2\u036b\u036c\3\2\2\2\u036cq\3\2\2\2"+ + "\u036d\u036b\3\2\2\2\u036e\u0375\5\u00c2b\2\u036f\u0370\7F\2\2\u0370\u0372"+ + "\5\u0152\u00aa\2\u0371\u036f\3\2\2\2\u0371\u0372\3\2\2\2\u0372\u0373\3"+ + "\2\2\2\u0373\u0374\7\7\2\2\u0374\u0376\5`\61\2\u0375\u0371\3\2\2\2\u0375"+ + "\u0376\3\2\2\2\u0376\u0379\3\2\2\2\u0377\u0378\7Q\2\2\u0378\u037a\5\u0162"+ + "\u00b2\2\u0379\u0377\3\2\2\2\u0379\u037a\3\2\2\2\u037as\3\2\2\2\u037b"+ + "\u037c\7B\2\2\u037c\u0381\7A\2\2\u037d\u037e\7K\2\2\u037e\u037f\7B\2\2"+ + "\u037f\u0381\7A\2\2\u0380\u037b\3\2\2\2\u0380\u037d\3\2\2\2\u0381\u0382"+ + "\3\2\2\2\u0382\u0387\5v<\2\u0383\u0384\7\17\2\2\u0384\u0386\5v<\2\u0385"+ + "\u0383\3\2\2\2\u0386\u0389\3\2\2\2\u0387\u0385\3\2\2\2\u0387\u0388\3\2"+ + "\2\2\u0388u\3\2\2\2\u0389\u0387\3\2\2\2\u038a\u038d\5`\61\2\u038b\u038e"+ + "\7L\2\2\u038c\u038e\7M\2\2\u038d\u038b\3\2\2\2\u038d\u038c\3\2\2\2\u038d"+ + "\u038e\3\2\2\2\u038e\u0394\3\2\2\2\u038f\u0392\7I\2\2\u0390\u0393\7R\2"+ + "\2\u0391\u0393\7S\2\2\u0392\u0390\3\2\2\2\u0392\u0391\3\2\2\2\u0393\u0395"+ + "\3\2\2\2\u0394\u038f\3\2\2\2\u0394\u0395\3\2\2\2\u0395\u0398\3\2\2\2\u0396"+ + "\u0397\7Q\2\2\u0397\u0399\5\u0162\u00b2\2\u0398\u0396\3\2\2\2\u0398\u0399"+ + "\3\2\2\2\u0399w\3\2\2\2\u039a\u039b\7J\2\2\u039b\u039c\5\u00c2b\2\u039c"+ + "y\3\2\2\2\u039d\u03a0\7N\2\2\u039e\u03a0\7O\2\2\u039f\u039d\3\2\2\2\u039f"+ + "\u039e\3\2\2\2\u03a0\u03a1\3\2\2\2\u03a1\u03a6\5|?\2\u03a2\u03a3\7\17"+ + "\2\2\u03a3\u03a5\5|?\2\u03a4\u03a2\3\2\2\2\u03a5\u03a8\3\2\2\2\u03a6\u03a4"+ + "\3\2\2\2\u03a6\u03a7\3\2\2\2\u03a7\u03a9\3\2\2\2\u03a8\u03a6\3\2\2\2\u03a9"+ + "\u03aa\7P\2\2\u03aa\u03ab\5`\61\2\u03ab{\3\2\2\2\u03ac\u03af\5\u00c2b"+ + "\2\u03ad\u03ae\7F\2\2\u03ae\u03b0\5\u0152\u00aa\2\u03af\u03ad\3\2\2\2"+ + "\u03af\u03b0\3\2\2\2\u03b0\u03b1\3\2\2\2\u03b1\u03b2\7E\2\2\u03b2\u03b3"+ + "\5`\61\2\u03b3}\3\2\2\2\u03b4\u03b5\7T\2\2\u03b5\u03b6\7\n\2\2\u03b6\u03b7"+ + "\5^\60\2\u03b7\u03b9\7\13\2\2\u03b8\u03ba\5\u0080A\2\u03b9\u03b8\3\2\2"+ + "\2\u03ba\u03bb\3\2\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc\u03bd"+ + "\3\2\2\2\u03bd\u03be\7X\2\2\u03be\u03bf\7C\2\2\u03bf\u03c0\5`\61\2\u03c0"+ + "\177\3\2\2\2\u03c1\u03c2\7U\2\2\u03c2\u03c4\5`\61\2\u03c3\u03c1\3\2\2"+ + "\2\u03c4\u03c5\3\2\2\2\u03c5\u03c3\3\2\2\2\u03c5\u03c6\3\2\2\2\u03c6\u03c7"+ + "\3\2\2\2\u03c7\u03c8\7C\2\2\u03c8\u03c9\5`\61\2\u03c9\u0081\3\2\2\2\u03ca"+ + "\u03cb\7[\2\2\u03cb\u03cc\7\n\2\2\u03cc\u03cd\5^\60\2\u03cd\u03cf\7\13"+ + "\2\2\u03ce\u03d0\5\u0084C\2\u03cf\u03ce\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1"+ + "\u03cf\3\2\2\2\u03d1\u03d2\3\2\2\2\u03d2\u03d3\3\2\2\2\u03d3\u03d5\7X"+ + "\2\2\u03d4\u03d6\5\u00c2b\2\u03d5\u03d4\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6"+ + "\u03d7\3\2\2\2\u03d7\u03d8\7C\2\2\u03d8\u03d9\5`\61\2\u03d9\u0083\3\2"+ + "\2\2\u03da\u03de\7U\2\2\u03db\u03dc\5\u00c2b\2\u03dc\u03dd\7F\2\2\u03dd"+ + "\u03df\3\2\2\2\u03de\u03db\3\2\2\2\u03de\u03df\3\2\2\2\u03df\u03e0\3\2"+ + "\2\2\u03e0\u03e5\5\u0152\u00aa\2\u03e1\u03e2\7\r\2\2\u03e2\u03e4\5\u0152"+ + "\u00aa\2\u03e3\u03e1\3\2\2\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5"+ + "\u03e6\3\2\2\2\u03e6\u03e8\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7C"+ + "\2\2\u03e9\u03ea\5`\61\2\u03ea\u0085\3\2\2\2\u03eb\u03ec\7D\2\2\u03ec"+ + "\u03ed\7\n\2\2\u03ed\u03ee\5^\60\2\u03ee\u03ef\7\13\2\2\u03ef\u03f0\7"+ + "Y\2\2\u03f0\u03f1\5`\61\2\u03f1\u03f2\7Z\2\2\u03f2\u03f3\5`\61\2\u03f3"+ + "\u0087\3\2\2\2\u03f4\u03f5\7V\2\2\u03f5\u03f6\7\b\2\2\u03f6\u03f7\5^\60"+ + "\2\u03f7\u03f9\7\t\2\2\u03f8\u03fa\5\u008aF\2\u03f9\u03f8\3\2\2\2\u03fa"+ + "\u03fb\3\2\2\2\u03fb\u03f9\3\2\2\2\u03fb\u03fc\3\2\2\2\u03fc\u0089\3\2"+ + "\2\2\u03fd\u0400\7W\2\2\u03fe\u0401\7\f\2\2\u03ff\u0401\5J&\2\u0400\u03fe"+ + "\3\2\2\2\u0400\u03ff\3\2\2\2\u0401\u0409\3\2\2\2\u0402\u0405\7\r\2\2\u0403"+ + "\u0406\7\f\2\2\u0404\u0406\5J&\2\u0405\u0403\3\2\2\2\u0405\u0404\3\2\2"+ + "\2\u0406\u0408\3\2\2\2\u0407\u0402\3\2\2\2\u0408\u040b\3\2\2\2\u0409\u0407"+ + "\3\2\2\2\u0409\u040a\3\2\2\2\u040a\u040c\3\2\2\2\u040b\u0409\3\2\2\2\u040c"+ + "\u040d\7\b\2\2\u040d\u040e\5^\60\2\u040e\u040f\7\t\2\2\u040f\u008b\3\2"+ + "\2\2\u0410\u0415\5\u008eH\2\u0411\u0412\7\\\2\2\u0412\u0414\5\u008eH\2"+ + "\u0413\u0411\3\2\2\2\u0414\u0417\3\2\2\2\u0415\u0413\3\2\2\2\u0415\u0416"+ + "\3\2\2\2\u0416\u008d\3\2\2\2\u0417\u0415\3\2\2\2\u0418\u041d\5\u0090I"+ + "\2\u0419\u041a\7]\2\2\u041a\u041c\5\u0090I\2\u041b\u0419\3\2\2\2\u041c"+ + "\u041f\3\2\2\2\u041d\u041b\3\2\2\2\u041d\u041e\3\2\2\2\u041e\u008f\3\2"+ + "\2\2\u041f\u041d\3\2\2\2\u0420\u0422\7^\2\2\u0421\u0420\3\2\2\2\u0421"+ + "\u0422\3\2\2\2\u0422\u0423\3\2\2\2\u0423\u0424\5\u0092J\2\u0424\u0091"+ + "\3\2\2\2\u0425\u0428\5\u0094K\2\u0426\u0427\t\5\2\2\u0427\u0429\5\u0094"+ + "K\2\u0428\u0426\3\2\2\2\u0428\u0429\3\2\2\2\u0429\u0093\3\2\2\2\u042a"+ + "\u042f\5\u0096L\2\u042b\u042c\7.\2\2\u042c\u042e\5\u0096L\2\u042d\u042b"+ + "\3\2\2\2\u042e\u0431\3\2\2\2\u042f\u042d\3\2\2\2\u042f\u0430\3\2\2\2\u0430"+ + "\u0095\3\2\2\2\u0431\u042f\3\2\2\2\u0432\u0435\5\u0098M\2\u0433\u0434"+ + "\7_\2\2\u0434\u0436\5\u0098M\2\u0435\u0433\3\2\2\2\u0435\u0436\3\2\2\2"+ + "\u0436\u0097\3\2\2\2\u0437\u043c\5\u009aN\2\u0438\u0439\t\6\2\2\u0439"+ + "\u043b\5\u009aN\2\u043a\u0438\3\2\2\2\u043b\u043e\3\2\2\2\u043c\u043a"+ + "\3\2\2\2\u043c\u043d\3\2\2\2\u043d\u0099\3\2\2\2\u043e\u043c\3\2\2\2\u043f"+ + "\u0444\5\u009cO\2\u0440\u0441\t\7\2\2\u0441\u0443\5\u009cO\2\u0442\u0440"+ + "\3\2\2\2\u0443\u0446\3\2\2\2\u0444\u0442\3\2\2\2\u0444\u0445\3\2\2\2\u0445"+ + "\u009b\3\2\2\2\u0446\u0444\3\2\2\2\u0447\u044b\5\u009eP\2\u0448\u0449"+ + "\7`\2\2\u0449\u044a\7a\2\2\u044a\u044c\5\u0152\u00aa\2\u044b\u0448\3\2"+ + "\2\2\u044b\u044c\3\2\2\2\u044c\u009d\3\2\2\2\u044d\u0451\5\u00a0Q\2\u044e"+ + "\u044f\7c\2\2\u044f\u0450\7b\2\2\u0450\u0452\5\u0152\u00aa\2\u0451\u044e"+ + "\3\2\2\2\u0451\u0452\3\2\2\2\u0452\u009f\3\2\2\2\u0453\u0457\5\u00a2R"+ + "\2\u0454\u0455\7d\2\2\u0455\u0456\7F\2\2\u0456\u0458\5\u0152\u00aa\2\u0457"+ + "\u0454\3\2\2\2\u0457\u0458\3\2\2\2\u0458\u00a1\3\2\2\2\u0459\u045d\5\u00a4"+ + "S\2\u045a\u045b\7f\2\2\u045b\u045c\7F\2\2\u045c\u045e\5\u015c\u00af\2"+ + "\u045d\u045a\3\2\2\2\u045d\u045e\3\2\2\2\u045e\u00a3\3\2\2\2\u045f\u0463"+ + "\5\u00a6T\2\u0460\u0461\7e\2\2\u0461\u0462\7F\2\2\u0462\u0464\5\u015c"+ + "\u00af\2\u0463\u0460\3\2\2\2\u0463\u0464\3\2\2\2\u0464\u00a5\3\2\2\2\u0465"+ + "\u046e\5\u00aaV\2\u0466\u0467\7\5\2\2\u0467\u0468\7,\2\2\u0468\u0469\3"+ + "\2\2\2\u0469\u046a\5\u00a8U\2\u046a\u046b\5\u00ceh\2\u046b\u046d\3\2\2"+ + "\2\u046c\u0466\3\2\2\2\u046d\u0470\3\2\2\2\u046e\u046c\3\2\2\2\u046e\u046f"+ + "\3\2\2\2\u046f\u00a7\3\2\2\2\u0470\u046e\3\2\2\2\u0471\u0475\5J&\2\u0472"+ + "\u0475\5\u00c2b\2\u0473\u0475\5\u00c4c\2\u0474\u0471\3\2\2\2\u0474\u0472"+ + "\3\2\2\2\u0474\u0473\3\2\2\2\u0475\u00a9\3\2\2\2\u0476\u0478\t\6\2\2\u0477"+ + "\u0476\3\2\2\2\u0478\u047b\3\2\2\2\u0479\u0477\3\2\2\2\u0479\u047a\3\2"+ + "\2\2\u047a\u047c\3\2\2\2\u047b\u0479\3\2\2\2\u047c\u047d\5\u00acW\2\u047d"+ + "\u00ab\3\2\2\2\u047e\u0482\5\u00b2Z\2\u047f\u0482\5\u00aeX\2\u0480\u0482"+ + "\5\u00b0Y\2\u0481\u047e\3\2\2\2\u0481\u047f\3\2\2\2\u0481\u0480\3\2\2"+ + "\2\u0482\u00ad\3\2\2\2\u0483\u0484\7m\2\2\u0484\u0485\7l\2\2\u0485\u0486"+ + "\5\u0152\u00aa\2\u0486\u0487\7\b\2\2\u0487\u0488\5^\60\2\u0488\u0489\7"+ + "\t\2\2\u0489\u00af\3\2\2\2\u048a\u048b\7n\2\2\u048b\u048c\7l\2\2\u048c"+ + "\u048d\5\u0152\u00aa\2\u048d\u048e\7\b\2\2\u048e\u048f\5^\60\2\u048f\u0490"+ + "\7\t\2\2\u0490\u00b1\3\2\2\2\u0491\u0496\5\u00b4[\2\u0492\u0493\7\64\2"+ + "\2\u0493\u0495\5\u00b4[\2\u0494\u0492\3\2\2\2\u0495\u0498\3\2\2\2\u0496"+ + "\u0494\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u00b3\3\2\2\2\u0498\u0496\3\2"+ + "\2\2\u0499\u04a1\5\u00be`\2\u049a\u04a0\5\u00b6\\\2\u049b\u04a0\5\u00ba"+ + "^\2\u049c\u04a0\5\u00bc_\2\u049d\u04a0\5\u00b8]\2\u049e\u04a0\5\u00ce"+ + "h\2\u049f\u049a\3\2\2\2\u049f\u049b\3\2\2\2\u049f\u049c\3\2\2\2\u049f"+ + "\u049d\3\2\2\2\u049f\u049e\3\2\2\2\u04a0\u04a3\3\2\2\2\u04a1\u049f\3\2"+ + "\2\2\u04a1\u04a2\3\2\2\2\u04a2\u00b5\3\2\2\2\u04a3\u04a1\3\2\2\2\u04a4"+ + "\u04a5\7\65\2\2\u04a5\u04a6\7\65\2\2\u04a6\u04a7\5^\60\2\u04a7\u04a8\7"+ + "\66\2\2\u04a8\u04a9\7\66\2\2\u04a9\u00b7\3\2\2\2\u04aa\u04ab\7\65\2\2"+ + "\u04ab\u04ac\7\66\2\2\u04ac\u00b9\3\2\2\2\u04ad\u04ae\7\65\2\2\u04ae\u04af"+ + "\5^\60\2\u04af\u04b0\7\66\2\2\u04b0\u00bb\3\2\2\2\u04b1\u04b8\7\67\2\2"+ + "\u04b2\u04b9\5\u0166\u00b4\2\u04b3\u04b9\5\u0164\u00b3\2\u04b4\u04b9\7"+ + "\u00b2\2\2\u04b5\u04b9\5\u00c4c\2\u04b6\u04b9\5\u00c2b\2\u04b7\u04b9\5"+ + "\u00c6d\2\u04b8\u04b2\3\2\2\2\u04b8\u04b3\3\2\2\2\u04b8\u04b4\3\2\2\2"+ + "\u04b8\u04b5\3\2\2\2\u04b8\u04b6\3\2\2\2\u04b8\u04b7\3\2\2\2\u04b9\u00bd"+ + "\3\2\2\2\u04ba\u04ca\7\u00ab\2\2\u04bb\u04ca\7j\2\2\u04bc\u04ca\7k\2\2"+ + "\u04bd\u04ca\7\u00ac\2\2\u04be\u04ca\5\u0164\u00b3\2\u04bf\u04ca\5\u00c2"+ + "b\2\u04c0\u04ca\5\u00c4c\2\u04c1\u04ca\5\u00c6d\2\u04c2\u04ca\5\u0154"+ + "\u00ab\2\u04c3\u04ca\5\u00ccg\2\u04c4\u04ca\5\u00c8e\2\u04c5\u04ca\5\u00ca"+ + "f\2\u04c6\u04ca\5\u0160\u00b1\2\u04c7\u04ca\5\u00d2j\2\u04c8\u04ca\5\u00c0"+ + "a\2\u04c9\u04ba\3\2\2\2\u04c9\u04bb\3\2\2\2\u04c9\u04bc\3\2\2\2\u04c9"+ + "\u04bd\3\2\2\2\u04c9\u04be\3\2\2\2\u04c9\u04bf\3\2\2\2\u04c9\u04c0\3\2"+ + "\2\2\u04c9\u04c1\3\2\2\2\u04c9\u04c2\3\2\2\2\u04c9\u04c3\3\2\2\2\u04c9"+ + "\u04c4\3\2\2\2\u04c9\u04c5\3\2\2\2\u04c9\u04c6\3\2\2\2\u04c9\u04c7\3\2"+ + "\2\2\u04c9\u04c8\3\2\2\2\u04ca\u00bf\3\2\2\2\u04cb\u04cc\7\b\2\2\u04cc"+ + "\u04cd\5\20\t\2\u04cd\u04ce\7\t\2\2\u04ce\u00c1\3\2\2\2\u04cf\u04d0\7"+ + "\6\2\2\u04d0\u04d1\5J&\2\u04d1\u00c3\3\2\2\2\u04d2\u04d4\7\n\2\2\u04d3"+ + "\u04d5\5^\60\2\u04d4\u04d3\3\2\2\2\u04d4\u04d5\3\2\2\2\u04d5\u04d6\3\2"+ + "\2\2\u04d6\u04d7\7\13\2\2\u04d7\u00c5\3\2\2\2\u04d8\u04d9\78\2\2\u04d9"+ + "\u00c7\3\2\2\2\u04da\u04db\7\21\2\2\u04db\u04dc\7\b\2\2\u04dc\u04dd\5"+ + "^\60\2\u04dd\u04de\7\t\2\2\u04de\u00c9\3\2\2\2\u04df\u04e0\7i\2\2\u04e0"+ + "\u04e1\7\b\2\2\u04e1\u04e2\5^\60\2\u04e2\u04e3\7\t\2\2\u04e3\u00cb\3\2"+ + "\2\2\u04e4\u04e5\5J&\2\u04e5\u04e6\5\u00ceh\2\u04e6\u00cd\3\2\2\2\u04e7"+ + "\u04ee\7\n\2\2\u04e8\u04ea\5\u00d0i\2\u04e9\u04eb\7\17\2\2\u04ea\u04e9"+ + "\3\2\2\2\u04ea\u04eb\3\2\2\2\u04eb\u04ed\3\2\2\2\u04ec\u04e8\3\2\2\2\u04ed"+ + "\u04f0\3\2\2\2\u04ee\u04ec\3\2\2\2\u04ee\u04ef\3\2\2\2\u04ef\u04f1\3\2"+ + "\2\2\u04f0\u04ee\3\2\2\2\u04f1\u04f2\7\13\2\2\u04f2\u00cf\3\2\2\2\u04f3"+ + "\u04f6\5`\61\2\u04f4\u04f6\7\u00aa\2\2\u04f5\u04f3\3\2\2\2\u04f5\u04f4"+ + "\3\2\2\2\u04f6\u00d1\3\2\2\2\u04f7\u04fa\5\u00d4k\2\u04f8\u04fa\5\u00d6"+ + "l\2\u04f9\u04f7\3\2\2\2\u04f9\u04f8\3\2\2\2\u04fa\u00d3\3\2\2\2\u04fb"+ + "\u04fc\5J&\2\u04fc\u04fd\79\2\2\u04fd\u04fe\7\u00ac\2\2\u04fe\u00d5\3"+ + "\2\2\2\u04ff\u0500\5\64\33\2\u0500\u0501\7\37\2\2\u0501\u0503\7\n\2\2"+ + "\u0502\u0504\5Z.\2\u0503\u0502\3\2\2\2\u0503\u0504\3\2\2\2\u0504\u0505"+ + "\3\2\2\2\u0505\u0508\7\13\2\2\u0506\u0507\7F\2\2\u0507\u0509\5\u0152\u00aa"+ + "\2\u0508\u0506\3\2\2\2\u0508\u0509\3\2\2\2\u0509\u050a\3\2\2\2\u050a\u050b"+ + "\7\b\2\2\u050b\u050c\5\22\n\2\u050c\u050d\7\t\2\2\u050d\u00d7\3\2\2\2"+ + "\u050e\u050f\7s\2\2\u050f\u0510\7|\2\2\u0510\u0511\5`\61\2\u0511\u0512"+ + "\7z\2\2\u0512\u0516\5`\61\2\u0513\u0514\7G\2\2\u0514\u0515\7~\2\2\u0515"+ + "\u0517\5`\61\2\u0516\u0513\3\2\2\2\u0516\u0517\3\2\2\2\u0517\u0526\3\2"+ + "\2\2\u0518\u0519\7s\2\2\u0519\u051a\7|\2\2\u051a\u051f\5\u015e\u00b0\2"+ + "\u051b\u051c\7\17\2\2\u051c\u051e\5\u015e\u00b0\2\u051d\u051b\3\2\2\2"+ + "\u051e\u0521\3\2\2\2\u051f\u051d\3\2\2\2\u051f\u0520\3\2\2\2\u0520\u0522"+ + "\3\2\2\2\u0521\u051f\3\2\2\2\u0522\u0523\7z\2\2\u0523\u0524\5`\61\2\u0524"+ + "\u0526\3\2\2\2\u0525\u050e\3\2\2\2\u0525\u0518\3\2\2\2\u0526\u00d9\3\2"+ + "\2\2\u0527\u0528\7t\2\2\u0528\u0529\7|\2\2\u0529\u052a\5\u00e4s\2\u052a"+ + "\u00db\3\2\2\2\u052b\u052c\7u\2\2\u052c\u052d\7|\2\2\u052d\u052e\5\u00e4"+ + "s\2\u052e\u052f\7F\2\2\u052f\u0530\5`\61\2\u0530\u00dd\3\2\2\2\u0531\u0532"+ + "\7v\2\2\u0532\u0533\7|\2\2\u0533\u0534\7{\2\2\u0534\u0535\7a\2\2\u0535"+ + "\u0536\5\u00e4s\2\u0536\u0537\7}\2\2\u0537\u0538\5`\61\2\u0538\u00df\3"+ + "\2\2\2\u0539\u053a\7w\2\2\u053a\u053b\7|\2\2\u053b\u0540\5\u00e6t\2\u053c"+ + "\u053d\7\17\2\2\u053d\u053f\5\u00e6t\2\u053e\u053c\3\2\2\2\u053f\u0542"+ + "\3\2\2\2\u0540\u053e\3\2\2\2\u0540\u0541\3\2\2\2\u0541\u0543\3\2\2\2\u0542"+ + "\u0540\3\2\2\2\u0543\u0544\7x\2\2\u0544\u0545\5`\61\2\u0545\u0546\7C\2"+ + "\2\u0546\u0547\5`\61\2\u0547\u00e1\3\2\2\2\u0548\u0549\7y\2\2\u0549\u054a"+ + "\7|\2\2\u054a\u054b\5`\61\2\u054b\u054c\7z\2\2\u054c\u054d\5`\61\2\u054d"+ + "\u00e3\3\2\2\2\u054e\u0551\5\u00be`\2\u054f\u0552\5\u00b6\\\2\u0550\u0552"+ + "\5\u00bc_\2\u0551\u054f\3\2\2\2\u0551\u0550\3\2\2\2\u0552\u0553\3\2\2"+ + "\2\u0553\u0551\3\2\2\2\u0553\u0554\3\2\2\2\u0554\u00e5\3\2\2\2\u0555\u0556"+ + "\5\u00c2b\2\u0556\u0557\7\7\2\2\u0557\u0558\5`\61\2\u0558\u00e7\3\2\2"+ + "\2\u0559\u055a\7\u0085\2\2\u055a\u055c\7\u0086\2\2\u055b\u055d\5\u00ea"+ + "v\2\u055c\u055b\3\2\2\2\u055c\u055d\3\2\2\2\u055d\u055e\3\2\2\2\u055e"+ + "\u0568\5\u0162\u00b2\2\u055f\u0560\7G\2\2\u0560\u0565\5\u0162\u00b2\2"+ + "\u0561\u0562\7\17\2\2\u0562\u0564\5\u0162\u00b2\2\u0563\u0561\3\2\2\2"+ + "\u0564\u0567\3\2\2\2\u0565\u0563\3\2\2\2\u0565\u0566\3\2\2\2\u0566\u0569"+ + "\3\2\2\2\u0567\u0565\3\2\2\2\u0568\u055f\3\2\2\2\u0568\u0569\3\2\2\2\u0569"+ + "\u00e9\3\2\2\2\u056a\u056b\7\u0087\2\2\u056b\u056c\7\u00b2\2\2\u056c\u0571"+ + "\7\5\2\2\u056d\u056e\7X\2\2\u056e\u056f\7\u0088\2\2\u056f\u0571\7\u0087"+ + "\2\2\u0570\u056a\3\2\2\2\u0570\u056d\3\2\2\2\u0571\u00eb\3\2\2\2\u0572"+ + "\u0574\7\u0089\2\2\u0573\u0575\5\u00eex\2\u0574\u0573\3\2\2\2\u0574\u0575"+ + "\3\2\2\2\u0575\u057a\3\2\2\2\u0576\u0577\7\u008a\2\2\u0577\u057a\5\u00ee"+ + "x\2\u0578\u057a\5\u00eex\2\u0579\u0572\3\2\2\2\u0579\u0576\3\2\2\2\u0579"+ + "\u0578\3\2\2\2\u057a\u00ed\3\2\2\2\u057b\u0580\5\u00f0y\2\u057c\u057d"+ + "\t\b\2\2\u057d\u057f\5\u00f0y\2\u057e\u057c\3\2\2\2\u057f\u0582\3\2\2"+ + "\2\u0580\u057e\3\2\2\2\u0580\u0581\3\2\2\2\u0581\u00ef\3\2\2\2\u0582\u0580"+ + "\3\2\2\2\u0583\u0586\5\u00b4[\2\u0584\u0586\5\u00f2z\2\u0585\u0583\3\2"+ + "\2\2\u0585\u0584\3\2\2\2\u0586\u00f1\3\2\2\2\u0587\u058a\5\u00fa~\2\u0588"+ + "\u058a\5\u00f4{\2\u0589\u0587\3\2\2\2\u0589\u0588\3\2\2\2\u058a\u058b"+ + "\3\2\2\2\u058b\u058c\5\u010a\u0086\2\u058c\u00f3\3\2\2\2\u058d\u058e\5"+ + "\u00f6|\2\u058e\u058f\5\u0100\u0081\2\u058f\u0592\3\2\2\2\u0590\u0592"+ + "\5\u00f8}\2\u0591\u058d\3\2\2\2\u0591\u0590\3\2\2\2\u0592\u00f5\3\2\2"+ + "\2\u0593\u0594\t\t\2\2\u0594\u0595\7\23\2\2\u0595\u0596\7\23\2\2\u0596"+ + "\u00f7\3\2\2\2\u0597\u0599\7\u008b\2\2\u0598\u0597\3\2\2\2\u0598\u0599"+ + "\3\2\2\2\u0599\u059a\3\2\2\2\u059a\u059b\5\u0100\u0081\2\u059b\u00f9\3"+ + "\2\2\2\u059c\u059d\5\u00fc\177\2\u059d\u059e\5\u0100\u0081\2\u059e\u05a1"+ + "\3\2\2\2\u059f\u05a1\5\u00fe\u0080\2\u05a0\u059c\3\2\2\2\u05a0\u059f\3"+ + "\2\2\2\u05a1\u00fb\3\2\2\2\u05a2\u05a3\t\n\2\2\u05a3\u05a4\7\23\2\2\u05a4"+ + "\u05a5\7\23\2\2\u05a5\u00fd\3\2\2\2\u05a6\u05a7\7:\2\2\u05a7\u00ff\3\2"+ + "\2\2\u05a8\u05ab\5\u0102\u0082\2\u05a9\u05ab\5\u0110\u0089\2\u05aa\u05a8"+ + "\3\2\2\2\u05aa\u05a9\3\2\2\2\u05ab\u0101\3\2\2\2\u05ac\u05ad\5J&\2\u05ad"+ + "\u05ae\5\u0104\u0083\2\u05ae\u0103\3\2\2\2\u05af\u05b3\7\f\2\2\u05b0\u05b3"+ + "\5\u0106\u0084\2\u05b1\u05b3\5\u0108\u0085\2\u05b2\u05af\3\2\2\2\u05b2"+ + "\u05b0\3\2\2\2\u05b2\u05b1\3\2\2\2\u05b3\u0105\3\2\2\2\u05b4\u05b5\7\u00b2"+ + "\2\2\u05b5\u05b6\7\23\2\2\u05b6\u05b7\7\f\2\2\u05b7\u0107\3\2\2\2\u05b8"+ + "\u05b9\7\f\2\2\u05b9\u05ba\7\23\2\2\u05ba\u05bb\7\u00b2\2\2\u05bb\u0109"+ + "\3\2\2\2\u05bc\u05be\5\u00ba^\2\u05bd\u05bc\3\2\2\2\u05be\u05c1\3\2\2"+ + "\2\u05bf\u05bd\3\2\2\2\u05bf\u05c0\3\2\2\2\u05c0\u010b\3\2\2\2\u05c1\u05bf"+ + "\3\2\2\2\u05c2\u05ce\5J&\2\u05c3\u05ce\7\u00ab\2\2\u05c4\u05ce\5\u0110"+ + "\u0089\2\u05c5\u05c6\7q\2\2\u05c6\u05c7\7\n\2\2\u05c7\u05ce\7\13\2\2\u05c8"+ + "\u05ce\5\u0156\u00ac\2\u05c9\u05ce\5\u0136\u009c\2\u05ca\u05ce\5\u013c"+ + "\u009f\2\u05cb\u05ce\5\u010e\u0088\2\u05cc\u05ce\5\u0142\u00a2\2\u05cd"+ + "\u05c2\3\2\2\2\u05cd\u05c3\3\2\2\2\u05cd\u05c4\3\2\2\2\u05cd\u05c5\3\2"+ + "\2\2\u05cd\u05c8\3\2\2\2\u05cd\u05c9\3\2\2\2\u05cd\u05ca\3\2\2\2\u05cd"+ + "\u05cb\3\2\2\2\u05cd\u05cc\3\2\2\2\u05ce\u010d\3\2\2\2\u05cf\u05d0\5J"+ + "&\2\u05d0\u010f\3\2\2\2\u05d1\u05de\5\u0116\u008c\2\u05d2\u05de\5\u0126"+ + "\u0094\2\u05d3\u05de\5\u0120\u0091\2\u05d4\u05de\5\u012a\u0096\2\u05d5"+ + "\u05de\5\u0124\u0093\2\u05d6\u05de\5\u011e\u0090\2\u05d7\u05de\5\u011a"+ + "\u008e\2\u05d8\u05de\5\u0118\u008d\2\u05d9\u05de\5\u011c\u008f\2\u05da"+ + "\u05de\5\u0146\u00a4\2\u05db\u05de\5\u0114\u008b\2\u05dc\u05de\5\u0112"+ + "\u008a\2\u05dd\u05d1\3\2\2\2\u05dd\u05d2\3\2\2\2\u05dd\u05d3\3\2\2\2\u05dd"+ + "\u05d4\3\2\2\2\u05dd\u05d5\3\2\2\2\u05dd\u05d6\3\2\2\2\u05dd\u05d7\3\2"+ + "\2\2\u05dd\u05d8\3\2\2\2\u05dd\u05d9\3\2\2\2\u05dd\u05da\3\2\2\2\u05dd"+ + "\u05db\3\2\2\2\u05dd\u05dc\3\2\2\2\u05de\u0111\3\2\2\2\u05df\u05e0\7\u0098"+ + "\2\2\u05e0\u05e2\7\n\2\2\u05e1\u05e3\7\f\2\2\u05e2\u05e1\3\2\2\2\u05e2"+ + "\u05e3\3\2\2\2\u05e3\u05e4\3\2\2\2\u05e4\u05e5\7\13\2\2\u05e5\u0113\3"+ + "\2\2\2\u05e6\u05e7\7\u0099\2\2\u05e7\u05e8\7\n\2\2\u05e8\u05e9\7\13\2"+ + "\2\u05e9\u0115\3\2\2\2\u05ea\u05eb\7\u009b\2\2\u05eb\u05ee\7\n\2\2\u05ec"+ + "\u05ef\5\u0126\u0094\2\u05ed\u05ef\5\u012a\u0096\2\u05ee\u05ec\3\2\2\2"+ + "\u05ee\u05ed\3\2\2\2\u05ee\u05ef\3\2\2\2\u05ef\u05f0\3\2\2\2\u05f0\u05f1"+ + "\7\13\2\2\u05f1\u0117\3\2\2\2\u05f2\u05f3\7\u009c\2\2\u05f3\u05f4\7\n"+ + "\2\2\u05f4\u05f5\7\13\2\2\u05f5\u0119\3\2\2\2\u05f6\u05f7\7\u00a6\2\2"+ + "\u05f7\u05f8\7\n\2\2\u05f8\u05f9\7\13\2\2\u05f9\u011b\3\2\2\2\u05fa\u05fb"+ + "\7\u009e\2\2\u05fb\u05fc\7\n\2\2\u05fc\u05fd\7\13\2\2\u05fd\u011d\3\2"+ + "\2\2\u05fe\u05ff\7\u009d\2\2\u05ff\u0602\7\n\2\2\u0600\u0603\7\u00b2\2"+ + "\2\u0601\u0603\5\u0164\u00b3\2\u0602\u0600\3\2\2\2\u0602\u0601\3\2\2\2"+ + "\u0602\u0603\3\2\2\2\u0603\u0604\3\2\2\2\u0604\u0605\7\13\2\2\u0605\u011f"+ + "\3\2\2\2\u0606\u0607\7\u008e\2\2\u0607\u060d\7\n\2\2\u0608\u060b\5\u0122"+ + "\u0092\2\u0609\u060a\7\17\2\2\u060a\u060c\5\u0134\u009b\2\u060b\u0609"+ + "\3\2\2\2\u060b\u060c\3\2\2\2\u060c\u060e\3\2\2\2\u060d\u0608\3\2\2\2\u060d"+ + "\u060e\3\2\2\2\u060e\u060f\3\2\2\2\u060f\u0610\7\13\2\2\u0610\u0121\3"+ + "\2\2\2\u0611\u0614\5\u012e\u0098\2\u0612\u0614\7\f\2\2\u0613\u0611\3\2"+ + "\2\2\u0613\u0612\3\2\2\2\u0614\u0123\3\2\2\2\u0615\u0616\7\u009f\2\2\u0616"+ + "\u0617\7\n\2\2\u0617\u0618\5\u0144\u00a3\2\u0618\u0619\7\13\2\2\u0619"+ + "\u0125\3\2\2\2\u061a\u061b\7\u0088\2\2\u061b\u0624\7\n\2\2\u061c\u0622"+ + "\5\u0128\u0095\2\u061d\u061e\7\17\2\2\u061e\u0620\5\u0134\u009b\2\u061f"+ + "\u0621\7\u00aa\2\2\u0620\u061f\3\2\2\2\u0620\u0621\3\2\2\2\u0621\u0623"+ + "\3\2\2\2\u0622\u061d\3\2\2\2\u0622\u0623\3\2\2\2\u0623\u0625\3\2\2\2\u0624"+ + "\u061c\3\2\2\2\u0624\u0625\3\2\2\2\u0625\u0626\3\2\2\2\u0626\u0627\7\13"+ + "\2\2\u0627\u0127\3\2\2\2\u0628\u062b\5\u0130\u0099\2\u0629\u062b\7\f\2"+ + "\2\u062a\u0628\3\2\2\2\u062a\u0629\3\2\2\2\u062b\u0129\3\2\2\2\u062c\u062d"+ + "\7\u00a0\2\2\u062d\u062e\7\n\2\2\u062e\u062f\5\u012c\u0097\2\u062f\u0630"+ + "\7\13\2\2\u0630\u012b\3\2\2\2\u0631\u0632\5\u0130\u0099\2\u0632\u012d"+ + "\3\2\2\2\u0633\u0634\5J&\2\u0634\u012f\3\2\2\2\u0635\u0636\5J&\2\u0636"+ + "\u0131\3\2\2\2\u0637\u0638\5\u0134\u009b\2\u0638\u0133\3\2\2\2\u0639\u063a"+ + "\5J&\2\u063a\u0135\3\2\2\2\u063b\u063e\5\u0138\u009d\2\u063c\u063e\5\u013a"+ + "\u009e\2\u063d\u063b\3\2\2\2\u063d\u063c\3\2\2\2\u063e\u0137\3\2\2\2\u063f"+ + "\u0640\7\u00a8\2\2\u0640\u0641\7\n\2\2\u0641\u0642\7\f\2\2\u0642\u0643"+ + "\7\13\2\2\u0643\u0139\3\2\2\2\u0644\u0645\7\u00a8\2\2\u0645\u0646\7\n"+ + "\2\2\u0646\u0647\5J&\2\u0647\u0648\7\17\2\2\u0648\u0649\5\u0152\u00aa"+ + "\2\u0649\u064a\7\13\2\2\u064a\u013b\3\2\2\2\u064b\u064e\5\u013e\u00a0"+ + "\2\u064c\u064e\5\u0140\u00a1\2\u064d\u064b\3\2\2\2\u064d\u064c\3\2\2\2"+ + "\u064e\u013d\3\2\2\2\u064f\u0650\7\u00a7\2\2\u0650\u0651\7\n\2\2\u0651"+ + "\u0652\7\f\2\2\u0652\u0653\7\13\2\2\u0653\u013f\3\2\2\2\u0654\u0655\7"+ + "\u00a7\2\2\u0655\u0656\7\n\2\2\u0656\u0657\5\u0152\u00aa\2\u0657\u0658"+ + "\7\13\2\2\u0658\u0141\3\2\2\2\u0659\u065a\7\n\2\2\u065a\u065b\5\u010c"+ + "\u0087\2\u065b\u065c\7\13\2\2\u065c\u0143\3\2\2\2\u065d\u065e\5\u012e"+ + "\u0098\2\u065e\u0145\3\2\2\2\u065f\u0665\5\u0148\u00a5\2\u0660\u0665\5"+ + "\u014a\u00a6\2\u0661\u0665\5\u014c\u00a7\2\u0662\u0665\5\u014e\u00a8\2"+ + "\u0663\u0665\5\u0150\u00a9\2\u0664\u065f\3\2\2\2\u0664\u0660\3\2\2\2\u0664"+ + "\u0661\3\2\2\2\u0664\u0662\3\2\2\2\u0664\u0663\3\2\2\2\u0665\u0147\3\2"+ + "\2\2\u0666\u0667\7\u00a1\2\2\u0667\u0669\7\n\2\2\u0668\u066a\5\u0164\u00b3"+ + "\2\u0669\u0668\3\2\2\2\u0669\u066a\3\2\2\2\u066a\u066b\3\2\2\2\u066b\u066c"+ + "\7\13\2\2\u066c\u0149\3\2\2\2\u066d\u066e\7\u00a5\2\2\u066e\u0670\7\n"+ + "\2\2\u066f\u0671\5\u0164\u00b3\2\u0670\u066f\3\2\2\2\u0670\u0671\3\2\2"+ + "\2\u0671\u0672\3\2\2\2\u0672\u0673\7\13\2\2\u0673\u014b\3\2\2\2\u0674"+ + "\u0675\7\u00a4\2\2\u0675\u0677\7\n\2\2\u0676\u0678\5\u0164\u00b3\2\u0677"+ + "\u0676\3\2\2\2\u0677\u0678\3\2\2\2\u0678\u0679\3\2\2\2\u0679\u067a\7\13"+ + "\2\2\u067a\u014d\3\2\2\2\u067b\u067c\7\u00a2\2\2\u067c\u067e\7\n\2\2\u067d"+ + "\u067f\5\u0164\u00b3\2\u067e\u067d\3\2\2\2\u067e\u067f\3\2\2\2\u067f\u0680"+ + "\3\2\2\2\u0680\u0681\7\13\2\2\u0681\u014f\3\2\2\2\u0682\u0683\7\u00a3"+ + "\2\2\u0683\u0685\7\n\2\2\u0684\u0686\5\u0164\u00b3\2\u0685\u0684\3\2\2"+ + "\2\u0685\u0686\3\2\2\2\u0686\u0687\3\2\2\2\u0687\u0688\7\13\2\2\u0688"+ + "\u0151\3\2\2\2\u0689\u068a\7\n\2\2\u068a\u0692\7\13\2\2\u068b\u068f\5"+ + "\u010c\u0087\2\u068c\u0690\7\u00aa\2\2\u068d\u0690\7\f\2\2\u068e\u0690"+ + "\7/\2\2\u068f\u068c\3\2\2\2\u068f\u068d\3\2\2\2\u068f\u068e\3\2\2\2\u068f"+ + "\u0690\3\2\2\2\u0690\u0692\3\2\2\2\u0691\u0689\3\2\2\2\u0691\u068b\3\2"+ + "\2\2\u0692\u0153\3\2\2\2\u0693\u069c\7\b\2\2\u0694\u0699\5\u015e\u00b0"+ + "\2\u0695\u0696\7\17\2\2\u0696\u0698\5\u015e\u00b0\2\u0697\u0695\3\2\2"+ + "\2\u0698\u069b\3\2\2\2\u0699\u0697\3\2\2\2\u0699\u069a\3\2\2\2\u069a\u069d"+ + "\3\2\2\2\u069b\u0699\3\2\2\2\u069c\u0694\3\2\2\2\u069c\u069d\3\2\2\2\u069d"+ + "\u069e\3\2\2\2\u069e\u06a4\7\t\2\2\u069f\u06a0\7;\2\2\u06a0\u06a1\5^\60"+ + "\2\u06a1\u06a2\7<\2\2\u06a2\u06a4\3\2\2\2\u06a3\u0693\3\2\2\2\u06a3\u069f"+ + "\3\2\2\2\u06a4\u0155\3\2\2\2\u06a5\u06a8\5\u0158\u00ad\2\u06a6\u06a8\5"+ + "\u015a\u00ae\2\u06a7\u06a5\3\2\2\2\u06a7\u06a6\3\2\2\2\u06a8\u0157\3\2"+ + "\2\2\u06a9\u06aa\7\37\2\2\u06aa\u06ab\7\n\2\2\u06ab\u06ac\7\f\2\2\u06ac"+ + "\u06ad\7\13\2\2\u06ad\u0159\3\2\2\2\u06ae\u06af\7\37\2\2\u06af\u06b8\7"+ + "\n\2\2\u06b0\u06b5\5\u0152\u00aa\2\u06b1\u06b2\7\17\2\2\u06b2\u06b4\5"+ + "\u0152\u00aa\2\u06b3\u06b1\3\2\2\2\u06b4\u06b7\3\2\2\2\u06b5\u06b3\3\2"+ + "\2\2\u06b5\u06b6\3\2\2\2\u06b6\u06b9\3\2\2\2\u06b7\u06b5\3\2\2\2\u06b8"+ + "\u06b0\3\2\2\2\u06b8\u06b9\3\2\2\2\u06b9\u06ba\3\2\2\2\u06ba\u06bb\7\13"+ + "\2\2\u06bb\u06bc\7F\2\2\u06bc\u06bd\5\u0152\u00aa\2\u06bd\u015b\3\2\2"+ + "\2\u06be\u06c0\5\u010c\u0087\2\u06bf\u06c1\7\u00aa\2\2\u06c0\u06bf\3\2"+ + "\2\2\u06c0\u06c1\3\2\2\2\u06c1\u015d\3\2\2\2\u06c2\u06c5\5`\61\2\u06c3"+ + "\u06c5\7\u00b2\2\2\u06c4\u06c2\3\2\2\2\u06c4\u06c3\3\2\2\2\u06c5\u06c6"+ + "\3\2\2\2\u06c6\u06c7\t\13\2\2\u06c7\u06c8\5`\61\2\u06c8\u015f\3\2\2\2"+ + "\u06c9\u06cb\7\65\2\2\u06ca\u06cc\5^\60\2\u06cb\u06ca\3\2\2\2\u06cb\u06cc"+ + "\3\2\2\2\u06cc\u06cd\3\2\2\2\u06cd\u06ce\7\66\2\2\u06ce\u0161\3\2\2\2"+ + "\u06cf\u06d0\5\u0164\u00b3\2\u06d0\u0163\3\2\2\2\u06d1\u06d2\7\u00a9\2"+ + "\2\u06d2\u0165\3\2\2\2\u06d3\u06d4\t\f\2\2\u06d4\u0167\3\2\2\2\u00a8\u0170"+ + "\u0174\u0184\u018a\u0192\u019a\u01a2\u01b1\u01cf\u01d7\u01d9\u01ef\u01f9"+ + "\u0203\u0208\u020d\u0211\u021d\u0221\u022a\u0231\u023f\u0243\u0248\u0252"+ + "\u025a\u025e\u026a\u0276\u028c\u0294\u0299\u029c\u02a0\u02a9\u02b2\u02b5"+ + "\u02bd\u02c4\u02c6\u02cd\u02d4\u02d6\u02de\u02e3\u02ea\u02f1\u02fb\u0302"+ + "\u0309\u0310\u0319\u0323\u0327\u032f\u0331\u033d\u0343\u0347\u034b\u0356"+ + "\u035c\u036b\u0371\u0375\u0379\u0380\u0387\u038d\u0392\u0394\u0398\u039f"+ + "\u03a6\u03af\u03bb\u03c5\u03d1\u03d5\u03de\u03e5\u03fb\u0400\u0405\u0409"+ + "\u0415\u041d\u0421\u0428\u042f\u0435\u043c\u0444\u044b\u0451\u0457\u045d"+ + "\u0463\u046e\u0474\u0479\u0481\u0496\u049f\u04a1\u04b8\u04c9\u04d4\u04ea"+ + "\u04ee\u04f5\u04f9\u0503\u0508\u0516\u051f\u0525\u0540\u0551\u0553\u055c"+ + "\u0565\u0568\u0570\u0574\u0579\u0580\u0585\u0589\u0591\u0598\u05a0\u05aa"+ + "\u05b2\u05bf\u05cd\u05dd\u05e2\u05ee\u0602\u060b\u060d\u0613\u0620\u0622"+ + "\u0624\u062a\u063d\u064d\u0664\u0669\u0670\u0677\u067e\u0685\u068f\u0691"+ + "\u0699\u069c\u06a3\u06a7\u06b5\u06b8\u06c0\u06c4\u06cb"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/org/rumbledb/parser/JsoniqVisitor.java b/src/main/java/org/rumbledb/parser/JsoniqVisitor.java index 2cc8359d7..46a22436a 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqVisitor.java +++ b/src/main/java/org/rumbledb/parser/JsoniqVisitor.java @@ -704,23 +704,350 @@ public interface JsoniqVisitor extends ParseTreeVisitor { */ T visitCopyDecl(JsoniqParser.CopyDeclContext ctx); /** - * Visit a parse tree produced by {@link JsoniqParser#sequenceType}. + * Visit a parse tree produced by {@link JsoniqParser#schemaImport}. * @param ctx the parse tree * @return the visitor result */ - T visitSequenceType(JsoniqParser.SequenceTypeContext ctx); + T visitSchemaImport(JsoniqParser.SchemaImportContext ctx); /** - * Visit a parse tree produced by {@link JsoniqParser#objectConstructor}. + * Visit a parse tree produced by {@link JsoniqParser#schemaPrefix}. * @param ctx the parse tree * @return the visitor result */ - T visitObjectConstructor(JsoniqParser.ObjectConstructorContext ctx); + T visitSchemaPrefix(JsoniqParser.SchemaPrefixContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#pathExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPathExpr(JsoniqParser.PathExprContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#relativePathExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRelativePathExpr(JsoniqParser.RelativePathExprContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#stepExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStepExpr(JsoniqParser.StepExprContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#axisStep}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAxisStep(JsoniqParser.AxisStepContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#forwardStep}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitForwardStep(JsoniqParser.ForwardStepContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#forwardAxis}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitForwardAxis(JsoniqParser.ForwardAxisContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#abbrevForwardStep}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAbbrevForwardStep(JsoniqParser.AbbrevForwardStepContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#reverseStep}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitReverseStep(JsoniqParser.ReverseStepContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#reverseAxis}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitReverseAxis(JsoniqParser.ReverseAxisContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#abbrevReverseStep}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAbbrevReverseStep(JsoniqParser.AbbrevReverseStepContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#nodeTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNodeTest(JsoniqParser.NodeTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#nameTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNameTest(JsoniqParser.NameTestContext ctx); + /** + * Visit a parse tree produced by the {@code allNames} + * labeled alternative in {@link JsoniqParser#wildcard}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAllNames(JsoniqParser.AllNamesContext ctx); + /** + * Visit a parse tree produced by the {@code allWithNS} + * labeled alternative in {@link JsoniqParser#wildcard}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAllWithNS(JsoniqParser.AllWithNSContext ctx); + /** + * Visit a parse tree produced by the {@code allWithLocal} + * labeled alternative in {@link JsoniqParser#wildcard}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAllWithLocal(JsoniqParser.AllWithLocalContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#nCNameWithLocalWildcard}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNCNameWithLocalWildcard(JsoniqParser.NCNameWithLocalWildcardContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#nCNameWithPrefixWildcard}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNCNameWithPrefixWildcard(JsoniqParser.NCNameWithPrefixWildcardContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#predicateList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPredicateList(JsoniqParser.PredicateListContext ctx); /** * Visit a parse tree produced by {@link JsoniqParser#itemType}. * @param ctx the parse tree * @return the visitor result */ T visitItemType(JsoniqParser.ItemTypeContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#atomicOrUnionType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAtomicOrUnionType(JsoniqParser.AtomicOrUnionTypeContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#kindTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitKindTest(JsoniqParser.KindTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#anyKindTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAnyKindTest(JsoniqParser.AnyKindTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#binaryNodeTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBinaryNodeTest(JsoniqParser.BinaryNodeTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#documentTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDocumentTest(JsoniqParser.DocumentTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#textTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTextTest(JsoniqParser.TextTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#commentTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCommentTest(JsoniqParser.CommentTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#namespaceNodeTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNamespaceNodeTest(JsoniqParser.NamespaceNodeTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#piTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPiTest(JsoniqParser.PiTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#attributeTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAttributeTest(JsoniqParser.AttributeTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#attributeNameOrWildcard}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAttributeNameOrWildcard(JsoniqParser.AttributeNameOrWildcardContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#schemaAttributeTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSchemaAttributeTest(JsoniqParser.SchemaAttributeTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#elementTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitElementTest(JsoniqParser.ElementTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#elementNameOrWildcard}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitElementNameOrWildcard(JsoniqParser.ElementNameOrWildcardContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#schemaElementTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSchemaElementTest(JsoniqParser.SchemaElementTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#elementDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitElementDeclaration(JsoniqParser.ElementDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#attributeName}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAttributeName(JsoniqParser.AttributeNameContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#elementName}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitElementName(JsoniqParser.ElementNameContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#simpleTypeName}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSimpleTypeName(JsoniqParser.SimpleTypeNameContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#typeName}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeName(JsoniqParser.TypeNameContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#mapTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMapTest(JsoniqParser.MapTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#anyMapTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAnyMapTest(JsoniqParser.AnyMapTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#typedMapTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypedMapTest(JsoniqParser.TypedMapTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#arrayTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArrayTest(JsoniqParser.ArrayTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#anyArrayTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAnyArrayTest(JsoniqParser.AnyArrayTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#typedArrayTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypedArrayTest(JsoniqParser.TypedArrayTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#parenthesizedItemTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitParenthesizedItemTest(JsoniqParser.ParenthesizedItemTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#attributeDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAttributeDeclaration(JsoniqParser.AttributeDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#mlNodeTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMlNodeTest(JsoniqParser.MlNodeTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#mlArrayNodeTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMlArrayNodeTest(JsoniqParser.MlArrayNodeTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#mlObjectNodeTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMlObjectNodeTest(JsoniqParser.MlObjectNodeTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#mlNumberNodeTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMlNumberNodeTest(JsoniqParser.MlNumberNodeTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#mlBooleanNodeTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMlBooleanNodeTest(JsoniqParser.MlBooleanNodeTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#mlNullNodeTest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMlNullNodeTest(JsoniqParser.MlNullNodeTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#sequenceType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSequenceType(JsoniqParser.SequenceTypeContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#objectConstructor}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitObjectConstructor(JsoniqParser.ObjectConstructorContext ctx); /** * Visit a parse tree produced by {@link JsoniqParser#functionTest}. * @param ctx the parse tree From 29293dc12ee3144cdf25ad6257f4b51db3a1a2f7 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Sun, 21 Jul 2024 20:01:14 +0200 Subject: [PATCH 36/56] Added skeleton for XML nodes --- .../expressions/AbstractNodeVisitor.java | 5 ++ .../org/rumbledb/expressions/xml/Dash.java | 16 ++++++ .../rumbledb/expressions/xml/PathExpr.java | 54 +++++++++++++++++++ .../rumbledb/expressions/xml/StepExpr.java | 28 ++++++++++ .../expressions/xml/axis/AxisStep.java | 10 ++++ .../expressions/xml/axis/ForwardAxis.java | 21 ++++++++ .../expressions/xml/axis/ForwardStep.java | 8 +++ .../expressions/xml/axis/ReverseAxis.java | 19 +++++++ .../expressions/xml/axis/ReverseStep.java | 9 ++++ .../rumbledb/expressions/xml/axis/Step.java | 4 ++ .../xml/node_test/AnyKindTest.java | 4 ++ .../xml/node_test/AttributeTest.java | 21 ++++++++ .../xml/node_test/DocumentTest.java | 10 ++++ .../xml/node_test/ElementTest.java | 25 +++++++++ .../expressions/xml/node_test/NameTest.java | 14 +++++ .../expressions/xml/node_test/NodeTest.java | 4 ++ .../expressions/xml/node_test/TextTest.java | 4 ++ 17 files changed, 256 insertions(+) create mode 100644 src/main/java/org/rumbledb/expressions/xml/Dash.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/PathExpr.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/StepExpr.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/axis/Step.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/node_test/AnyKindTest.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/node_test/NodeTest.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/node_test/TextTest.java diff --git a/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java b/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java index 85a08deb1..dbfecf2f8 100644 --- a/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java +++ b/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java @@ -97,6 +97,7 @@ import org.rumbledb.expressions.update.RenameExpression; import org.rumbledb.expressions.update.ReplaceExpression; import org.rumbledb.expressions.update.TransformExpression; +import org.rumbledb.expressions.xml.PathExpr; public abstract class AbstractNodeVisitor { @@ -453,4 +454,8 @@ public T visitBlockExpr(BlockExpression expression, T argument) { public T visitCommaVariableDeclStatement(CommaVariableDeclStatement statement, T argument) { return defaultAction(statement, argument); } + + public T visitPathExpr(PathExpr pathExpr, T argument) { + return defaultAction(pathExpr, argument); + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/Dash.java b/src/main/java/org/rumbledb/expressions/xml/Dash.java new file mode 100644 index 000000000..4e135ea76 --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/Dash.java @@ -0,0 +1,16 @@ +package org.rumbledb.expressions.xml; + +public enum Dash { + SINGLE_DASH("/"), + DOUBLE_DASH("//"); + + private final String dashValue; + + Dash(String dashValue) { + this.dashValue = dashValue; + } + + public String getDashValue() { + return dashValue; + } +} diff --git a/src/main/java/org/rumbledb/expressions/xml/PathExpr.java b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java new file mode 100644 index 000000000..7ab64f98f --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java @@ -0,0 +1,54 @@ +package org.rumbledb.expressions.xml; + +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.expressions.AbstractNodeVisitor; +import org.rumbledb.expressions.Node; + +import java.util.ArrayList; +import java.util.List; + +public class PathExpr extends Node { + private boolean startsWithDash; + private List relativePathExpr; + private List dashes; + + public PathExpr( + boolean startsWithDash, + List relativePathExpr, + List dashes, + ExceptionMetadata metadata + ) { + super(metadata); + this.startsWithDash = startsWithDash; + this.relativePathExpr = relativePathExpr; + this.dashes = dashes; + } + + @Override + public T accept(AbstractNodeVisitor visitor, T argument) { + return visitor.visitPathExpr(this, argument); + } + + @Override + public List getChildren() { + return new ArrayList<>(this.relativePathExpr); + } + + @Override + public void serializeToJSONiq(StringBuffer sb, int indent) { + int dashPathCounter = 0; + indentIt(sb, indent); + if (startsWithDash) { + sb.append(this.dashes.get(dashPathCounter).getDashValue()); + } + dashPathCounter++; + while (dashPathCounter < this.dashes.size()) { + sb.append(this.dashes.get(dashPathCounter).getDashValue()); + this.relativePathExpr.get(dashPathCounter).serializeToJSONiq(sb, indent); + } + if (dashPathCounter < this.relativePathExpr.size()) { + this.relativePathExpr.get(dashPathCounter).serializeToJSONiq(sb, indent); + } + sb.append("\n"); + } +} diff --git a/src/main/java/org/rumbledb/expressions/xml/StepExpr.java b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java new file mode 100644 index 000000000..ebbc21943 --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java @@ -0,0 +1,28 @@ +package org.rumbledb.expressions.xml; + +import org.rumbledb.expressions.AbstractNodeVisitor; +import org.rumbledb.expressions.Expression; +import org.rumbledb.expressions.Node; +import org.rumbledb.expressions.xml.axis.AxisStep; + +import java.util.List; + +public class StepExpr extends Node { + private Expression postFixExpr; + private AxisStep axisStep; + + @Override + public T accept(AbstractNodeVisitor visitor, T argument) { + return null; + } + + @Override + public List getChildren() { + return List.of(); + } + + @Override + public void serializeToJSONiq(StringBuffer sb, int indent) { + + } +} diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java new file mode 100644 index 000000000..d54fb7360 --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java @@ -0,0 +1,10 @@ +package org.rumbledb.expressions.xml.axis; + +import org.rumbledb.expressions.Expression; + +import java.util.List; + +public class AxisStep { + private Step step; + private List predicates; +} diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java new file mode 100644 index 000000000..cee4d4a38 --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java @@ -0,0 +1,21 @@ +package org.rumbledb.expressions.xml.axis; + +public enum ForwardAxis { + CHILD("child"), + DESCENDANT("descendant"), + ATTRIBUTE("attribute"), + SELF("self"), + DESCENDANT_OR_SELF("descendant-or-self"), + FOLLOWING_SIBLING("following-sibling"), + FOLLOWING("following"); + + private final String axisValue; + + ForwardAxis(String axisValue) { + this.axisValue = axisValue; + } + + public String getAxisValue() { + return axisValue; + } +} diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java new file mode 100644 index 000000000..a2806c165 --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java @@ -0,0 +1,8 @@ +package org.rumbledb.expressions.xml.axis; + +import org.rumbledb.expressions.xml.node_test.NodeTest; + +public class ForwardStep { + private ForwardAxis forwardAxis; + private NodeTest nodeTest; // used also for abbreviated syntax +} diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java new file mode 100644 index 000000000..f949af70f --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java @@ -0,0 +1,19 @@ +package org.rumbledb.expressions.xml.axis; + +public enum ReverseAxis { + PARENT("parent"), + ANCESTOR("ancestor"), + PRECEDING_SIBLING("preceding-sibling"), + PRECEDING("preceding"), + ANCESTOR_OR_SELF("ancestor-or-self"); + + private final String axisValue; + + ReverseAxis(String axisValue) { + this.axisValue = axisValue; + } + + public String getAxisValue() { + return axisValue; + } +} diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java new file mode 100644 index 000000000..f8e766c4e --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java @@ -0,0 +1,9 @@ +package org.rumbledb.expressions.xml.axis; + +import org.rumbledb.expressions.xml.node_test.NodeTest; + +public class ReverseStep { + private ReverseAxis reverseAxis; + private NodeTest nodeTest; + // TODO: how to handle '..' in abbreviated syntax +} diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/Step.java b/src/main/java/org/rumbledb/expressions/xml/axis/Step.java new file mode 100644 index 000000000..ef717fb61 --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/axis/Step.java @@ -0,0 +1,4 @@ +package org.rumbledb.expressions.xml.axis; + +public interface Step { +} diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/AnyKindTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/AnyKindTest.java new file mode 100644 index 000000000..8fc8b150b --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/AnyKindTest.java @@ -0,0 +1,4 @@ +package org.rumbledb.expressions.xml.node_test; + +public class AnyKindTest implements NodeTest { +} diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java new file mode 100644 index 000000000..7a25e3e57 --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java @@ -0,0 +1,21 @@ +package org.rumbledb.expressions.xml.node_test; + +import org.rumbledb.context.Name; + +public class AttributeTest implements NodeTest { + private Name attributeName; + private boolean hasWildcard; + private Name typeName; + + public AttributeTest(Name attributeName, Name typeName) { + this.attributeName = attributeName; + this.typeName = typeName; + this.hasWildcard = false; + } + + public AttributeTest(Name typeName) { + this.attributeName = null; + this.typeName = typeName; + this.hasWildcard = true; + } +} diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java new file mode 100644 index 000000000..6ef9592ea --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java @@ -0,0 +1,10 @@ +package org.rumbledb.expressions.xml.node_test; + +public class DocumentTest implements NodeTest { + // TODO: schemaElement test unsupported yet. + private NodeTest nodeTest; + + public DocumentTest(NodeTest nodeTest) { + this.nodeTest = nodeTest; + } +} diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java new file mode 100644 index 000000000..30053f3a7 --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java @@ -0,0 +1,25 @@ +package org.rumbledb.expressions.xml.node_test; + +import org.rumbledb.context.Name; + +public class ElementTest implements NodeTest { + private Name elementName; + private boolean hasWildcard; + private Name typeName; + private boolean hasOptional; + + + public ElementTest(Name elementName, Name typeName, boolean hasOptional) { + this.elementName = elementName; + this.typeName = typeName; + this.hasOptional = hasOptional; + this.hasWildcard = false; + } + + public ElementTest(Name typeName, boolean hasOptional) { + this.elementName = null; + this.typeName = typeName; + this.hasOptional = hasOptional; + this.hasWildcard = true; + } +} diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java new file mode 100644 index 000000000..b63e3e37e --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java @@ -0,0 +1,14 @@ +package org.rumbledb.expressions.xml.node_test; + +import org.rumbledb.context.Name; + +// TODO: Add support for name test +public class NameTest implements NodeTest { + private Name qname; + private String ncName; + + public NameTest(Name qname, String ncName) { + this.qname = qname; + this.ncName = ncName; + } +} diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/NodeTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/NodeTest.java new file mode 100644 index 000000000..3a4babc07 --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/NodeTest.java @@ -0,0 +1,4 @@ +package org.rumbledb.expressions.xml.node_test; + +public interface NodeTest { +} diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/TextTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/TextTest.java new file mode 100644 index 000000000..fefea51d9 --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/TextTest.java @@ -0,0 +1,4 @@ +package org.rumbledb.expressions.xml.node_test; + +public class TextTest implements NodeTest { +} From c91b76d13aa7baa50ad3c0cb351a07364524122d Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Mon, 22 Jul 2024 13:46:55 +0200 Subject: [PATCH 37/56] Added translation visitor --- .../rumbledb/compiler/TranslationVisitor.java | 162 ++++++++++++++++++ .../expressions/AbstractNodeVisitor.java | 10 ++ .../rumbledb/expressions/xml/AxisStep.java | 41 +++++ .../rumbledb/expressions/xml/StepExpr.java | 27 ++- .../expressions/xml/axis/AxisStep.java | 10 -- .../expressions/xml/axis/ForwardAxis.java | 14 +- .../expressions/xml/axis/ForwardStep.java | 16 +- .../expressions/xml/axis/ReverseAxis.java | 10 +- .../expressions/xml/axis/ReverseStep.java | 16 +- .../xml/node_test/ElementTest.java | 8 +- src/main/java/org/rumbledb/parser/Jsoniq.g4 | 6 +- .../org/rumbledb/parser/JsoniqParser.java | 14 +- 12 files changed, 293 insertions(+), 41 deletions(-) create mode 100644 src/main/java/org/rumbledb/expressions/xml/AxisStep.java delete mode 100644 src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java index f758f2913..dc9cce792 100644 --- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java @@ -138,6 +138,22 @@ import org.rumbledb.expressions.update.RenameExpression; import org.rumbledb.expressions.update.ReplaceExpression; import org.rumbledb.expressions.update.TransformExpression; +import org.rumbledb.expressions.xml.AxisStep; +import org.rumbledb.expressions.xml.Dash; +import org.rumbledb.expressions.xml.PathExpr; +import org.rumbledb.expressions.xml.StepExpr; +import org.rumbledb.expressions.xml.axis.ForwardAxis; +import org.rumbledb.expressions.xml.axis.ForwardStep; +import org.rumbledb.expressions.xml.axis.ReverseAxis; +import org.rumbledb.expressions.xml.axis.ReverseStep; +import org.rumbledb.expressions.xml.axis.Step; +import org.rumbledb.expressions.xml.node_test.AnyKindTest; +import org.rumbledb.expressions.xml.node_test.AttributeTest; +import org.rumbledb.expressions.xml.node_test.DocumentTest; +import org.rumbledb.expressions.xml.node_test.ElementTest; +import org.rumbledb.expressions.xml.node_test.NameTest; +import org.rumbledb.expressions.xml.node_test.NodeTest; +import org.rumbledb.expressions.xml.node_test.TextTest; import org.rumbledb.items.parsing.ItemParser; import org.rumbledb.parser.JsoniqParser; import org.rumbledb.parser.JsoniqParser.DefaultCollationDeclContext; @@ -2274,6 +2290,152 @@ public Node visitVarDeclStatement(JsoniqParser.VarDeclStatementContext ctx) { // end declaration + // start xml + + @Override + public Node visitPathExpr(JsoniqParser.PathExprContext ctx) { + if (!ctx.singleslash.isEmpty()) { + Dash singleDash = Dash.SINGLE_DASH; + List dashes = getDashes(ctx.singleslash, singleDash); + List stepExprs = getStepExpr(ctx.singleslash); + return new PathExpr(true, stepExprs, dashes, createMetadataFromContext(ctx)); + } else if (!ctx.doubleslash.isEmpty()) { + Dash doubleDash = Dash.DOUBLE_DASH; + List dashes = getDashes(ctx.singleslash, doubleDash); + List stepExprs = getStepExpr(ctx.singleslash); + return new PathExpr(true, stepExprs, dashes, createMetadataFromContext(ctx)); + } + List dashes = getDashes(ctx.singleslash, null); + List stepExprs = getStepExpr(ctx.singleslash); + return new PathExpr(false, stepExprs, dashes, createMetadataFromContext(ctx)); + + } + + @Override + public Node visitStepExpr(JsoniqParser.StepExprContext ctx) { + if (ctx.postFixExpr().isEmpty()) { + return new StepExpr((AxisStep) this.visitAxisStep(ctx.axisStep())); + } + return new StepExpr((Expression) this.visitPostFixExpr(ctx.postFixExpr())); + } + + @Override + public Node visitAxisStep(JsoniqParser.AxisStepContext ctx) { + List predicates = new ArrayList<>(); + Step step = getStep(ctx); + for (JsoniqParser.PredicateContext predicateContext : ctx.predicateList().predicate()) { + predicates.add((Expression) this.visitPredicate(predicateContext)); + } + return new AxisStep(step, predicates); + } + + private Step getStep(JsoniqParser.AxisStepContext ctx) { + if (ctx.forwardStep().isEmpty()) { + return getReverseStep(ctx.reverseStep()); + } + return getForwardStep(ctx.forwardStep()); + } + + private Step getForwardStep(JsoniqParser.ForwardStepContext ctx) { + if (ctx.nodeTest().isEmpty()) { + NodeTest nodeTest = getNodeTest(ctx.abbrevForwardStep().nodeTest()); + return new ForwardStep(nodeTest); + } + ForwardAxis forwardAxis = ForwardAxis.valueOf(ctx.forwardAxis().getText()); + NodeTest nodeTest = getNodeTest(ctx.nodeTest()); + return new ForwardStep(forwardAxis, nodeTest); + } + + private Step getReverseStep(JsoniqParser.ReverseStepContext ctx) { + if (ctx.nodeTest().isEmpty()) { + return new ReverseStep(); + } + ReverseAxis reverseAxis = ReverseAxis.valueOf(ctx.reverseAxis().getText()); + NodeTest nodeTest = getNodeTest(ctx.nodeTest()); + return new ReverseStep(reverseAxis, nodeTest); + } + + private NodeTest getNodeTest(JsoniqParser.NodeTestContext nodeTestContext) { + if (nodeTestContext.nameTest().isEmpty()) { + // kind test + return getKindTest(nodeTestContext.kindTest()); + } + Name name = parseName(nodeTestContext.nameTest().qname(), false, false); + String wildcard = nodeTestContext.nameTest().wildcard().getText(); + return new NameTest(name, wildcard); + } + + private NodeTest getKindTest(ParseTree kindTestContext) { + if (kindTestContext instanceof JsoniqParser.DocumentTestContext) { + JsoniqParser.DocumentTestContext docContext = (JsoniqParser.DocumentTestContext) kindTestContext; + if (docContext.elementTest().isEmpty()) { + throw new UnsupportedFeatureException( + "Kind tests of type document, element, attribute, text and any are supported at the moment", + createMetadataFromContext((ParserRuleContext) kindTestContext) + ); + } + return new DocumentTest(getKindTest(docContext.elementTest())); + } else if (kindTestContext instanceof JsoniqParser.ElementTestContext) { + JsoniqParser.ElementTestContext elementContext = (JsoniqParser.ElementTestContext) kindTestContext; + boolean hasWildcard = elementContext.elementNameOrWildcard().elementName().isEmpty(); + Name typeName = parseName(elementContext.typeName().qname(), false, false); + Name elementName; + if (!hasWildcard) { + elementName = parseName(elementContext.elementNameOrWildcard().elementName().qname(), false, false); + return new ElementTest(elementName, typeName); + } + return new ElementTest(typeName); + } else if (kindTestContext instanceof JsoniqParser.AttributeTestContext) { + JsoniqParser.AttributeTestContext attributeTestContext = + (JsoniqParser.AttributeTestContext) kindTestContext; + boolean hasWildcard = attributeTestContext.attributeNameOrWildcard().attributeName().isEmpty(); + Name typeName = parseName(attributeTestContext.typeName().qname(), false, false); + Name elementName; + if (!hasWildcard) { + elementName = parseName( + attributeTestContext.attributeNameOrWildcard().attributeName().qname(), + false, + false + ); + return new AttributeTest(elementName, typeName); + } + return new AttributeTest(typeName); + } else if (kindTestContext instanceof JsoniqParser.TextTestContext) { + return new TextTest(); + } else if (kindTestContext instanceof JsoniqParser.AnyKindTestContext) { + return new AnyKindTest(); + } else { + throw new UnsupportedFeatureException( + "Kind tests of type document, element, attribute, text and any are supported at the moment", + createMetadataFromContext((ParserRuleContext) kindTestContext) + ); + } + } + + private List getStepExpr(JsoniqParser.RelativePathExprContext relativePathExprContext) { + List stepExprs = new ArrayList<>(); + for (JsoniqParser.StepExprContext stepExprContext : relativePathExprContext.stepExpr()) { + stepExprs.add((StepExpr) this.visitStepExpr(stepExprContext)); + } + return stepExprs; + } + + + private List getDashes(JsoniqParser.RelativePathExprContext relativePathExprContext, Dash initialDash) { + List dashes = new ArrayList<>(); + if (initialDash != null) { + dashes.add(initialDash); + } + if (relativePathExprContext.isEmpty()) { + return dashes; + } + for (Token dash : relativePathExprContext.sep) { + dashes.add(Dash.valueOf(dash.getText())); + } + return dashes; + } + + // end region public void processNamespaceDecl(JsoniqParser.NamespaceDeclContext ctx) { diff --git a/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java b/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java index dbfecf2f8..6f461fad8 100644 --- a/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java +++ b/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java @@ -97,7 +97,9 @@ import org.rumbledb.expressions.update.RenameExpression; import org.rumbledb.expressions.update.ReplaceExpression; import org.rumbledb.expressions.update.TransformExpression; +import org.rumbledb.expressions.xml.AxisStep; import org.rumbledb.expressions.xml.PathExpr; +import org.rumbledb.expressions.xml.StepExpr; public abstract class AbstractNodeVisitor { @@ -458,4 +460,12 @@ public T visitCommaVariableDeclStatement(CommaVariableDeclStatement statement, T public T visitPathExpr(PathExpr pathExpr, T argument) { return defaultAction(pathExpr, argument); } + + public T visitStepExpr(StepExpr stepExpr, T argument) { + return defaultAction(stepExpr, argument); + } + + public T visitAxisStep(AxisStep axisStep, T argument) { + return defaultAction(axisStep, argument); + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/AxisStep.java b/src/main/java/org/rumbledb/expressions/xml/AxisStep.java new file mode 100644 index 000000000..33112bd43 --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/AxisStep.java @@ -0,0 +1,41 @@ +package org.rumbledb.expressions.xml; + +import org.rumbledb.expressions.AbstractNodeVisitor; +import org.rumbledb.expressions.Expression; +import org.rumbledb.expressions.Node; +import org.rumbledb.expressions.xml.axis.Step; + +import java.util.ArrayList; +import java.util.List; + +public class AxisStep extends Node { + private Step step; + private List predicates; + + public AxisStep(Step step, List predicates) { + this.step = step; + this.predicates = predicates; + } + + @Override + public T accept(AbstractNodeVisitor visitor, T argument) { + return visitor.visitAxisStep(this, argument); + } + + @Override + public List getChildren() { + return new ArrayList<>(predicates); + } + + @Override + public void serializeToJSONiq(StringBuffer sb, int indent) { + // TODO: serialize step + indentIt(sb, indent); + for (Expression predicate : predicates) { + sb.append("[ "); + predicate.serializeToJSONiq(sb, indent); + sb.append(" ], "); + } + sb.append("\n"); + } +} diff --git a/src/main/java/org/rumbledb/expressions/xml/StepExpr.java b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java index ebbc21943..87f097f6f 100644 --- a/src/main/java/org/rumbledb/expressions/xml/StepExpr.java +++ b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java @@ -3,26 +3,45 @@ import org.rumbledb.expressions.AbstractNodeVisitor; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; -import org.rumbledb.expressions.xml.axis.AxisStep; +import java.util.Collections; import java.util.List; public class StepExpr extends Node { private Expression postFixExpr; private AxisStep axisStep; + public StepExpr(Expression postFixExpr) { + this.postFixExpr = postFixExpr; + this.axisStep = null; + } + + public StepExpr(AxisStep axisStep) { + this.postFixExpr = null; + this.axisStep = axisStep; + } + @Override public T accept(AbstractNodeVisitor visitor, T argument) { - return null; + return visitor.visitStepExpr(this, argument); } @Override public List getChildren() { - return List.of(); + if (this.postFixExpr != null) { + return Collections.singletonList(this.postFixExpr); + } + return Collections.singletonList(this.axisStep); } @Override public void serializeToJSONiq(StringBuffer sb, int indent) { - + indentIt(sb, indent); + if (this.postFixExpr != null) { + this.postFixExpr.serializeToJSONiq(sb, indent); + } else { + this.axisStep.serializeToJSONiq(sb, indent); + } + sb.append("\n"); } } diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java deleted file mode 100644 index d54fb7360..000000000 --- a/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.rumbledb.expressions.xml.axis; - -import org.rumbledb.expressions.Expression; - -import java.util.List; - -public class AxisStep { - private Step step; - private List predicates; -} diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java index cee4d4a38..b065a9857 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java @@ -1,13 +1,13 @@ package org.rumbledb.expressions.xml.axis; public enum ForwardAxis { - CHILD("child"), - DESCENDANT("descendant"), - ATTRIBUTE("attribute"), - SELF("self"), - DESCENDANT_OR_SELF("descendant-or-self"), - FOLLOWING_SIBLING("following-sibling"), - FOLLOWING("following"); + CHILD("child::"), + DESCENDANT("descendant::"), + ATTRIBUTE("attribute::"), + SELF("self::"), + DESCENDANT_OR_SELF("descendant-or-self::"), + FOLLOWING_SIBLING("following-sibling::"), + FOLLOWING("following::"); private final String axisValue; diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java index a2806c165..e3beb573b 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java @@ -2,7 +2,19 @@ import org.rumbledb.expressions.xml.node_test.NodeTest; -public class ForwardStep { +public class ForwardStep implements Step { private ForwardAxis forwardAxis; - private NodeTest nodeTest; // used also for abbreviated syntax + private NodeTest nodeTest; + private boolean hasAbbreviatedForwardStep; + + public ForwardStep(NodeTest nodeTest) { + this.forwardAxis = null; + this.nodeTest = nodeTest; + this.hasAbbreviatedForwardStep = true; + } + + public ForwardStep(ForwardAxis forwardAxis, NodeTest nodeTest) { + this.forwardAxis = forwardAxis; + this.nodeTest = nodeTest; + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java index f949af70f..3c5cdf3a6 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java @@ -1,11 +1,11 @@ package org.rumbledb.expressions.xml.axis; public enum ReverseAxis { - PARENT("parent"), - ANCESTOR("ancestor"), - PRECEDING_SIBLING("preceding-sibling"), - PRECEDING("preceding"), - ANCESTOR_OR_SELF("ancestor-or-self"); + PARENT("parent::"), + ANCESTOR("ancestor::"), + PRECEDING_SIBLING("preceding-sibling::"), + PRECEDING("preceding::"), + ANCESTOR_OR_SELF("ancestor-or-self::"); private final String axisValue; diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java index f8e766c4e..289a53913 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java @@ -2,8 +2,20 @@ import org.rumbledb.expressions.xml.node_test.NodeTest; -public class ReverseStep { +public class ReverseStep implements Step { private ReverseAxis reverseAxis; private NodeTest nodeTest; - // TODO: how to handle '..' in abbreviated syntax + private boolean hasAbbreviatedReverseStep; + + public ReverseStep() { + reverseAxis = null; + nodeTest = null; + hasAbbreviatedReverseStep = true; + } + + public ReverseStep(ReverseAxis reverseAxis, NodeTest nodeTest) { + this.reverseAxis = reverseAxis; + this.nodeTest = nodeTest; + this.hasAbbreviatedReverseStep = false; + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java index 30053f3a7..75766696b 100644 --- a/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java @@ -6,20 +6,18 @@ public class ElementTest implements NodeTest { private Name elementName; private boolean hasWildcard; private Name typeName; - private boolean hasOptional; + // TODO: add support for optional type - public ElementTest(Name elementName, Name typeName, boolean hasOptional) { + public ElementTest(Name elementName, Name typeName) { this.elementName = elementName; this.typeName = typeName; - this.hasOptional = hasOptional; this.hasWildcard = false; } - public ElementTest(Name typeName, boolean hasOptional) { + public ElementTest(Name typeName) { this.elementName = null; this.typeName = typeName; - this.hasOptional = hasOptional; this.hasWildcard = true; } } diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.g4 b/src/main/java/org/rumbledb/parser/Jsoniq.g4 index c2a2ebe29..410bebb04 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.g4 +++ b/src/main/java/org/rumbledb/parser/Jsoniq.g4 @@ -371,13 +371,13 @@ schemaPrefix: (Knamespace NCName '=' | Kdefault Kelement Knamespace) ; pathExpr: (Kslash singleslash=relativePathExpr?) | (Kdslash doubleslash=relativePathExpr) | relative=relativePathExpr ; -relativePathExpr: stepExpr (sep=(Kslash|Kdslash) stepExpr)* ; +relativePathExpr: stepExpr (sep+=(Kslash|Kdslash) stepExpr)* ; stepExpr: postFixExpr | axisStep ; axisStep: (reverseStep | forwardStep) predicateList ; -forwardStep: forwardAxis nodeTest | abbrevForwardStep ; +forwardStep: (forwardAxis nodeTest) | abbrevForwardStep ; forwardAxis: ( Kchild | Kdescendant @@ -389,7 +389,7 @@ forwardAxis: ( Kchild abbrevForwardStep: Kat_symbol ? nodeTest ; -reverseStep: reverseAxis nodeTest | abbrevReverseStep ; +reverseStep: (reverseAxis nodeTest) | abbrevReverseStep ; reverseAxis: ( Kparent | Kancestor diff --git a/src/main/java/org/rumbledb/parser/JsoniqParser.java b/src/main/java/org/rumbledb/parser/JsoniqParser.java index 5d31a5c45..8aeaba0ec 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqParser.java +++ b/src/main/java/org/rumbledb/parser/JsoniqParser.java @@ -9336,7 +9336,10 @@ public final PathExprContext pathExpr() throws RecognitionException { } public static class RelativePathExprContext extends ParserRuleContext { - public Token sep; + public Token Kslash; + public List sep = new ArrayList(); + public Token Kdslash; + public Token _tset2889; public List stepExpr() { return getRuleContexts(StepExprContext.class); } @@ -9378,16 +9381,17 @@ public final RelativePathExprContext relativePathExpr() throws RecognitionExcept { { setState(1402); - ((RelativePathExprContext)_localctx).sep = _input.LT(1); + ((RelativePathExprContext)_localctx)._tset2889 = _input.LT(1); _la = _input.LA(1); if ( !(_la==Kslash || _la==Kdslash) ) { - ((RelativePathExprContext)_localctx).sep = (Token)_errHandler.recoverInline(this); + ((RelativePathExprContext)_localctx)._tset2889 = (Token)_errHandler.recoverInline(this); } else { if ( _input.LA(1)==Token.EOF ) matchedEOF = true; _errHandler.reportMatch(this); consume(); } + ((RelativePathExprContext)_localctx).sep.add(((RelativePathExprContext)_localctx)._tset2889); setState(1403); stepExpr(); } @@ -9653,11 +9657,13 @@ public final ForwardStepContext forwardStep() throws RecognitionException { case 1: enterOuterAlt(_localctx, 1); { + { setState(1419); forwardAxis(); setState(1420); nodeTest(); } + } break; case 2: enterOuterAlt(_localctx, 2); @@ -9815,11 +9821,13 @@ public final ReverseStepContext reverseStep() throws RecognitionException { case Kancestor_or_self: enterOuterAlt(_localctx, 1); { + { setState(1434); reverseAxis(); setState(1435); nodeTest(); } + } break; case T__55: enterOuterAlt(_localctx, 2); From 3267417dec57203b6f176f30f61031394b2f316c Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Mon, 22 Jul 2024 16:19:58 +0200 Subject: [PATCH 38/56] Minor adjustments to class types and visitor --- .../rumbledb/compiler/TranslationVisitor.java | 75 +- .../expressions/AbstractNodeVisitor.java | 2 +- .../org/rumbledb/expressions/xml/Dash.java | 16 - .../rumbledb/expressions/xml/PathExpr.java | 18 +- .../rumbledb/expressions/xml/StepExpr.java | 10 +- .../expressions/xml/{ => axis}/AxisStep.java | 3 +- .../expressions/xml/axis/ForwardStep.java | 7 - .../expressions/xml/axis/ReverseStep.java | 8 - .../expressions/xml/node_test/NameTest.java | 11 +- src/main/java/org/rumbledb/parser/Jsoniq.g4 | 4 +- .../java/org/rumbledb/parser/Jsoniq.interp | 2 +- .../org/rumbledb/parser/JsoniqParser.java | 1374 +++++++++-------- .../runtime/xml/PathExprIterator.java | 31 + 13 files changed, 786 insertions(+), 775 deletions(-) delete mode 100644 src/main/java/org/rumbledb/expressions/xml/Dash.java rename src/main/java/org/rumbledb/expressions/xml/{ => axis}/AxisStep.java (92%) create mode 100644 src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java index dc9cce792..5b128c1f4 100644 --- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java @@ -138,10 +138,9 @@ import org.rumbledb.expressions.update.RenameExpression; import org.rumbledb.expressions.update.ReplaceExpression; import org.rumbledb.expressions.update.TransformExpression; -import org.rumbledb.expressions.xml.AxisStep; -import org.rumbledb.expressions.xml.Dash; import org.rumbledb.expressions.xml.PathExpr; import org.rumbledb.expressions.xml.StepExpr; +import org.rumbledb.expressions.xml.axis.AxisStep; import org.rumbledb.expressions.xml.axis.ForwardAxis; import org.rumbledb.expressions.xml.axis.ForwardStep; import org.rumbledb.expressions.xml.axis.ReverseAxis; @@ -2295,28 +2294,23 @@ public Node visitVarDeclStatement(JsoniqParser.VarDeclStatementContext ctx) { @Override public Node visitPathExpr(JsoniqParser.PathExprContext ctx) { if (!ctx.singleslash.isEmpty()) { - Dash singleDash = Dash.SINGLE_DASH; - List dashes = getDashes(ctx.singleslash, singleDash); - List stepExprs = getStepExpr(ctx.singleslash); - return new PathExpr(true, stepExprs, dashes, createMetadataFromContext(ctx)); + List stepExprs = getStepExpr(ctx.singleslash, ctx.Kslash()); + return new PathExpr(true, stepExprs, createMetadataFromContext(ctx)); } else if (!ctx.doubleslash.isEmpty()) { - Dash doubleDash = Dash.DOUBLE_DASH; - List dashes = getDashes(ctx.singleslash, doubleDash); - List stepExprs = getStepExpr(ctx.singleslash); - return new PathExpr(true, stepExprs, dashes, createMetadataFromContext(ctx)); + List stepExprs = getStepExpr(ctx.doubleslash, ctx.Kdslash()); + return new PathExpr(true, stepExprs, createMetadataFromContext(ctx)); } - List dashes = getDashes(ctx.singleslash, null); - List stepExprs = getStepExpr(ctx.singleslash); - return new PathExpr(false, stepExprs, dashes, createMetadataFromContext(ctx)); + List stepExprs = getStepExpr(ctx.relative, null); + return new PathExpr(false, stepExprs, createMetadataFromContext(ctx)); } @Override public Node visitStepExpr(JsoniqParser.StepExprContext ctx) { if (ctx.postFixExpr().isEmpty()) { - return new StepExpr((AxisStep) this.visitAxisStep(ctx.axisStep())); + return new StepExpr((AxisStep) this.visitAxisStep(ctx.axisStep()), createMetadataFromContext(ctx)); } - return new StepExpr((Expression) this.visitPostFixExpr(ctx.postFixExpr())); + return new StepExpr((Expression) this.visitPostFixExpr(ctx.postFixExpr()), createMetadataFromContext(ctx)); } @Override @@ -2337,18 +2331,32 @@ private Step getStep(JsoniqParser.AxisStepContext ctx) { } private Step getForwardStep(JsoniqParser.ForwardStepContext ctx) { + ForwardAxis forwardAxis; + NodeTest nodeTest; if (ctx.nodeTest().isEmpty()) { - NodeTest nodeTest = getNodeTest(ctx.abbrevForwardStep().nodeTest()); - return new ForwardStep(nodeTest); + nodeTest = getNodeTest(ctx.abbrevForwardStep().nodeTest()); + if (ctx.abbrevForwardStep().Kat_symbol() != null) { + // @ equivalent with 'attribute::' + forwardAxis = ForwardAxis.ATTRIBUTE; + } else if (nodeTest instanceof AttributeTest) { + // @ equivalent with 'attribute::' + forwardAxis = ForwardAxis.ATTRIBUTE; + } else { + forwardAxis = ForwardAxis.CHILD; + } + return new ForwardStep(forwardAxis, nodeTest); } - ForwardAxis forwardAxis = ForwardAxis.valueOf(ctx.forwardAxis().getText()); - NodeTest nodeTest = getNodeTest(ctx.nodeTest()); + forwardAxis = ForwardAxis.valueOf(ctx.forwardAxis().getText()); + nodeTest = getNodeTest(ctx.nodeTest()); return new ForwardStep(forwardAxis, nodeTest); } private Step getReverseStep(JsoniqParser.ReverseStepContext ctx) { if (ctx.nodeTest().isEmpty()) { - return new ReverseStep(); + // .. equivalent with 'parent::node()' + ReverseAxis reverseAxis = ReverseAxis.PARENT; + NodeTest nodeTest = new AnyKindTest(); + return new ReverseStep(reverseAxis, nodeTest); } ReverseAxis reverseAxis = ReverseAxis.valueOf(ctx.reverseAxis().getText()); NodeTest nodeTest = getNodeTest(ctx.nodeTest()); @@ -2360,9 +2368,13 @@ private NodeTest getNodeTest(JsoniqParser.NodeTestContext nodeTestContext) { // kind test return getKindTest(nodeTestContext.kindTest()); } - Name name = parseName(nodeTestContext.nameTest().qname(), false, false); - String wildcard = nodeTestContext.nameTest().wildcard().getText(); - return new NameTest(name, wildcard); + if (nodeTestContext.nameTest().wildcard().isEmpty()) { + Name name = parseName(nodeTestContext.nameTest().qname(), false, false); + return new NameTest(name); + } else { + String wildcard = nodeTestContext.nameTest().wildcard().getText(); + return new NameTest(wildcard); + } } private NodeTest getKindTest(ParseTree kindTestContext) { @@ -2412,7 +2424,7 @@ private NodeTest getKindTest(ParseTree kindTestContext) { } } - private List getStepExpr(JsoniqParser.RelativePathExprContext relativePathExprContext) { + private List getStepExpr(JsoniqParser.RelativePathExprContext relativePathExprContext, TerminalNode startDash) { List stepExprs = new ArrayList<>(); for (JsoniqParser.StepExprContext stepExprContext : relativePathExprContext.stepExpr()) { stepExprs.add((StepExpr) this.visitStepExpr(stepExprContext)); @@ -2421,21 +2433,6 @@ private List getStepExpr(JsoniqParser.RelativePathExprContext relative } - private List getDashes(JsoniqParser.RelativePathExprContext relativePathExprContext, Dash initialDash) { - List dashes = new ArrayList<>(); - if (initialDash != null) { - dashes.add(initialDash); - } - if (relativePathExprContext.isEmpty()) { - return dashes; - } - for (Token dash : relativePathExprContext.sep) { - dashes.add(Dash.valueOf(dash.getText())); - } - return dashes; - } - - // end region public void processNamespaceDecl(JsoniqParser.NamespaceDeclContext ctx) { diff --git a/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java b/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java index 6f461fad8..ae983bf13 100644 --- a/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java +++ b/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java @@ -97,9 +97,9 @@ import org.rumbledb.expressions.update.RenameExpression; import org.rumbledb.expressions.update.ReplaceExpression; import org.rumbledb.expressions.update.TransformExpression; -import org.rumbledb.expressions.xml.AxisStep; import org.rumbledb.expressions.xml.PathExpr; import org.rumbledb.expressions.xml.StepExpr; +import org.rumbledb.expressions.xml.axis.AxisStep; public abstract class AbstractNodeVisitor { diff --git a/src/main/java/org/rumbledb/expressions/xml/Dash.java b/src/main/java/org/rumbledb/expressions/xml/Dash.java deleted file mode 100644 index 4e135ea76..000000000 --- a/src/main/java/org/rumbledb/expressions/xml/Dash.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.rumbledb.expressions.xml; - -public enum Dash { - SINGLE_DASH("/"), - DOUBLE_DASH("//"); - - private final String dashValue; - - Dash(String dashValue) { - this.dashValue = dashValue; - } - - public String getDashValue() { - return dashValue; - } -} diff --git a/src/main/java/org/rumbledb/expressions/xml/PathExpr.java b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java index 7ab64f98f..b65180723 100644 --- a/src/main/java/org/rumbledb/expressions/xml/PathExpr.java +++ b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java @@ -2,26 +2,24 @@ import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.expressions.AbstractNodeVisitor; +import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; import java.util.ArrayList; import java.util.List; -public class PathExpr extends Node { +public class PathExpr extends Expression { private boolean startsWithDash; private List relativePathExpr; - private List dashes; public PathExpr( boolean startsWithDash, List relativePathExpr, - List dashes, ExceptionMetadata metadata ) { super(metadata); this.startsWithDash = startsWithDash; this.relativePathExpr = relativePathExpr; - this.dashes = dashes; } @Override @@ -38,16 +36,8 @@ public List getChildren() { public void serializeToJSONiq(StringBuffer sb, int indent) { int dashPathCounter = 0; indentIt(sb, indent); - if (startsWithDash) { - sb.append(this.dashes.get(dashPathCounter).getDashValue()); - } - dashPathCounter++; - while (dashPathCounter < this.dashes.size()) { - sb.append(this.dashes.get(dashPathCounter).getDashValue()); - this.relativePathExpr.get(dashPathCounter).serializeToJSONiq(sb, indent); - } - if (dashPathCounter < this.relativePathExpr.size()) { - this.relativePathExpr.get(dashPathCounter).serializeToJSONiq(sb, indent); + for (StepExpr relativePathExp : this.relativePathExpr) { + relativePathExp.serializeToJSONiq(sb, indent); } sb.append("\n"); } diff --git a/src/main/java/org/rumbledb/expressions/xml/StepExpr.java b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java index 87f097f6f..59567434e 100644 --- a/src/main/java/org/rumbledb/expressions/xml/StepExpr.java +++ b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java @@ -1,22 +1,26 @@ package org.rumbledb.expressions.xml; +import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.expressions.AbstractNodeVisitor; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; +import org.rumbledb.expressions.xml.axis.AxisStep; import java.util.Collections; import java.util.List; -public class StepExpr extends Node { +public class StepExpr extends Expression { private Expression postFixExpr; private AxisStep axisStep; - public StepExpr(Expression postFixExpr) { + public StepExpr(Expression postFixExpr, ExceptionMetadata exceptionMetadata) { + super(exceptionMetadata); this.postFixExpr = postFixExpr; this.axisStep = null; } - public StepExpr(AxisStep axisStep) { + public StepExpr(AxisStep axisStep, ExceptionMetadata exceptionMetadata) { + super(exceptionMetadata); this.postFixExpr = null; this.axisStep = axisStep; } diff --git a/src/main/java/org/rumbledb/expressions/xml/AxisStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java similarity index 92% rename from src/main/java/org/rumbledb/expressions/xml/AxisStep.java rename to src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java index 33112bd43..7d08b9090 100644 --- a/src/main/java/org/rumbledb/expressions/xml/AxisStep.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java @@ -1,9 +1,8 @@ -package org.rumbledb.expressions.xml; +package org.rumbledb.expressions.xml.axis; import org.rumbledb.expressions.AbstractNodeVisitor; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; -import org.rumbledb.expressions.xml.axis.Step; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java index e3beb573b..3d590e0d2 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java @@ -5,13 +5,6 @@ public class ForwardStep implements Step { private ForwardAxis forwardAxis; private NodeTest nodeTest; - private boolean hasAbbreviatedForwardStep; - - public ForwardStep(NodeTest nodeTest) { - this.forwardAxis = null; - this.nodeTest = nodeTest; - this.hasAbbreviatedForwardStep = true; - } public ForwardStep(ForwardAxis forwardAxis, NodeTest nodeTest) { this.forwardAxis = forwardAxis; diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java index 289a53913..d694995d6 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java @@ -5,17 +5,9 @@ public class ReverseStep implements Step { private ReverseAxis reverseAxis; private NodeTest nodeTest; - private boolean hasAbbreviatedReverseStep; - - public ReverseStep() { - reverseAxis = null; - nodeTest = null; - hasAbbreviatedReverseStep = true; - } public ReverseStep(ReverseAxis reverseAxis, NodeTest nodeTest) { this.reverseAxis = reverseAxis; this.nodeTest = nodeTest; - this.hasAbbreviatedReverseStep = false; } } diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java index b63e3e37e..3c50d6b89 100644 --- a/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java @@ -5,10 +5,15 @@ // TODO: Add support for name test public class NameTest implements NodeTest { private Name qname; - private String ncName; + private String wildcardWithNCName; - public NameTest(Name qname, String ncName) { + public NameTest(Name qname) { this.qname = qname; - this.ncName = ncName; + this.wildcardWithNCName = null; + } + + public NameTest(String wildcardWithNCName) { + this.qname = null; + this.wildcardWithNCName = wildcardWithNCName; } } diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.g4 b/src/main/java/org/rumbledb/parser/Jsoniq.g4 index 410bebb04..396db7a68 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.g4 +++ b/src/main/java/org/rumbledb/parser/Jsoniq.g4 @@ -387,7 +387,7 @@ forwardAxis: ( Kchild | Kfollowing_sibling | Kfollowing ) ':' ':' ; -abbrevForwardStep: Kat_symbol ? nodeTest ; +abbrevForwardStep: Kat_symbol? nodeTest ; reverseStep: (reverseAxis nodeTest) | abbrevReverseStep ; @@ -401,7 +401,7 @@ abbrevReverseStep: '..' ; nodeTest: nameTest | kindTest ; -nameTest: qname wildcard ; +nameTest: qname | wildcard ; wildcard: '*' # allNames | nCNameWithLocalWildcard # allWithNS // walkers must strip out the trailing :* diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.interp b/src/main/java/org/rumbledb/parser/Jsoniq.interp index 453c6f6cd..ca28d7970 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.interp +++ b/src/main/java/org/rumbledb/parser/Jsoniq.interp @@ -543,4 +543,4 @@ keyWords atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 180, 1750, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 369, 10, 3, 3, 3, 3, 3, 5, 3, 373, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 389, 10, 6, 3, 6, 3, 6, 7, 6, 393, 10, 6, 12, 6, 14, 6, 396, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 401, 10, 6, 12, 6, 14, 6, 404, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 409, 10, 8, 12, 8, 14, 8, 412, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 419, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 434, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 464, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 472, 10, 18, 12, 18, 14, 18, 475, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 494, 10, 20, 13, 20, 14, 20, 495, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 504, 10, 21, 13, 21, 14, 21, 505, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 514, 10, 22, 13, 22, 14, 22, 515, 3, 23, 3, 23, 3, 23, 5, 23, 521, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 526, 10, 23, 7, 23, 528, 10, 23, 12, 23, 14, 23, 531, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 540, 10, 24, 13, 24, 14, 24, 541, 3, 24, 3, 24, 5, 24, 546, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 555, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 560, 10, 25, 12, 25, 14, 25, 563, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 574, 10, 26, 12, 26, 14, 26, 577, 11, 26, 3, 26, 5, 26, 580, 10, 26, 3, 27, 7, 27, 583, 10, 27, 12, 27, 14, 27, 586, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 593, 10, 28, 12, 28, 14, 28, 596, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 603, 10, 29, 3, 29, 3, 29, 5, 29, 607, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 619, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 631, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 653, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 659, 10, 37, 12, 37, 14, 37, 662, 11, 37, 3, 38, 3, 38, 5, 38, 666, 10, 38, 3, 38, 5, 38, 669, 10, 38, 3, 38, 3, 38, 5, 38, 673, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 682, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 689, 10, 40, 12, 40, 14, 40, 692, 11, 40, 5, 40, 694, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 702, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 709, 10, 41, 5, 41, 711, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 718, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 725, 10, 42, 5, 42, 727, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 735, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 740, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 747, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 754, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 764, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 769, 10, 46, 12, 46, 14, 46, 772, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 778, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 783, 10, 48, 12, 48, 14, 48, 786, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 794, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 804, 10, 50, 3, 51, 3, 51, 5, 51, 808, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 816, 10, 51, 12, 51, 14, 51, 819, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 828, 10, 52, 12, 52, 14, 52, 831, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 836, 10, 53, 3, 53, 3, 53, 5, 53, 840, 10, 53, 3, 53, 3, 53, 5, 53, 844, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 853, 10, 54, 12, 54, 14, 54, 856, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 861, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 874, 10, 57, 12, 57, 14, 57, 877, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 882, 10, 58, 3, 58, 3, 58, 5, 58, 886, 10, 58, 3, 58, 3, 58, 5, 58, 890, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 897, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 902, 10, 59, 12, 59, 14, 59, 905, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 910, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 915, 10, 60, 5, 60, 917, 10, 60, 3, 60, 3, 60, 5, 60, 921, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 928, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 933, 10, 62, 12, 62, 14, 62, 936, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 944, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 954, 10, 64, 13, 64, 14, 64, 955, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 964, 10, 65, 13, 65, 14, 65, 965, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 976, 10, 66, 13, 66, 14, 66, 977, 3, 66, 3, 66, 5, 66, 982, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 991, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 996, 10, 67, 12, 67, 14, 67, 999, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 1018, 10, 69, 13, 69, 14, 69, 1019, 3, 70, 3, 70, 3, 70, 5, 70, 1025, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 1030, 10, 70, 7, 70, 1032, 10, 70, 12, 70, 14, 70, 1035, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 1044, 10, 71, 12, 71, 14, 71, 1047, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 1052, 10, 72, 12, 72, 14, 72, 1055, 11, 72, 3, 73, 5, 73, 1058, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 1065, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 1070, 10, 75, 12, 75, 14, 75, 1073, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 1078, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 1083, 10, 77, 12, 77, 14, 77, 1086, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 1091, 10, 78, 12, 78, 14, 78, 1094, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 1100, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1106, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1112, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1118, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1124, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1133, 10, 84, 12, 84, 14, 84, 1136, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1141, 10, 85, 3, 86, 7, 86, 1144, 10, 86, 12, 86, 14, 86, 1147, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1154, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1173, 10, 90, 12, 90, 14, 90, 1176, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1184, 10, 91, 12, 91, 14, 91, 1187, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1209, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1226, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1237, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1259, 10, 104, 7, 104, 1261, 10, 104, 12, 104, 14, 104, 1264, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1270, 10, 105, 3, 106, 3, 106, 5, 106, 1274, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1284, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1289, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1303, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1310, 10, 109, 12, 109, 14, 109, 1313, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1318, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1343, 10, 113, 12, 113, 14, 113, 1346, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1362, 10, 115, 13, 115, 14, 115, 1363, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 5, 117, 1373, 10, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 7, 117, 1380, 10, 117, 12, 117, 14, 117, 1383, 11, 117, 5, 117, 1385, 10, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 5, 118, 1393, 10, 118, 3, 119, 3, 119, 5, 119, 1397, 10, 119, 3, 119, 3, 119, 3, 119, 5, 119, 1402, 10, 119, 3, 120, 3, 120, 3, 120, 7, 120, 1407, 10, 120, 12, 120, 14, 120, 1410, 11, 120, 3, 121, 3, 121, 5, 121, 1414, 10, 121, 3, 122, 3, 122, 5, 122, 1418, 10, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 5, 123, 1426, 10, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 5, 125, 1433, 10, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 5, 126, 1441, 10, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 129, 3, 129, 5, 129, 1451, 10, 129, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 5, 131, 1459, 10, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 7, 134, 1470, 10, 134, 12, 134, 14, 134, 1473, 11, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 5, 135, 1486, 10, 135, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 5, 137, 1502, 10, 137, 3, 138, 3, 138, 3, 138, 5, 138, 1507, 10, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 5, 140, 1519, 10, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 5, 144, 1539, 10, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 5, 145, 1548, 10, 145, 5, 145, 1550, 10, 145, 3, 145, 3, 145, 3, 146, 3, 146, 5, 146, 1556, 10, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 5, 148, 1569, 10, 148, 5, 148, 1571, 10, 148, 5, 148, 1573, 10, 148, 3, 148, 3, 148, 3, 149, 3, 149, 5, 149, 1579, 10, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 153, 3, 153, 3, 154, 3, 154, 3, 155, 3, 155, 3, 156, 3, 156, 5, 156, 1598, 10, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 5, 159, 1614, 10, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 5, 164, 1637, 10, 164, 3, 165, 3, 165, 3, 165, 5, 165, 1642, 10, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 5, 166, 1649, 10, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 5, 167, 1656, 10, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 5, 168, 1663, 10, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 5, 169, 1670, 10, 169, 3, 169, 3, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 5, 170, 1680, 10, 170, 5, 170, 1682, 10, 170, 3, 171, 3, 171, 3, 171, 3, 171, 7, 171, 1688, 10, 171, 12, 171, 14, 171, 1691, 11, 171, 5, 171, 1693, 10, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 5, 171, 1700, 10, 171, 3, 172, 3, 172, 5, 172, 1704, 10, 172, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 7, 174, 1716, 10, 174, 12, 174, 14, 174, 1719, 11, 174, 5, 174, 1721, 10, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 175, 3, 175, 5, 175, 1729, 10, 175, 3, 176, 3, 176, 5, 176, 1733, 10, 176, 3, 176, 3, 176, 3, 176, 3, 177, 3, 177, 5, 177, 1740, 10, 177, 3, 177, 3, 177, 3, 178, 3, 178, 3, 179, 3, 179, 3, 180, 3, 180, 3, 180, 2, 2, 181, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 2, 13, 4, 2, 17, 17, 105, 105, 3, 2, 82, 83, 3, 2, 20, 29, 4, 2, 5, 5, 35, 45, 3, 2, 47, 48, 4, 2, 12, 12, 49, 51, 3, 2, 137, 138, 3, 2, 140, 146, 3, 2, 147, 151, 4, 2, 19, 19, 170, 170, 4, 2, 61, 132, 171, 171, 2, 1820, 2, 360, 3, 2, 2, 2, 4, 368, 3, 2, 2, 2, 6, 374, 3, 2, 2, 2, 8, 377, 3, 2, 2, 2, 10, 394, 3, 2, 2, 2, 12, 405, 3, 2, 2, 2, 14, 410, 3, 2, 2, 2, 16, 413, 3, 2, 2, 2, 18, 416, 3, 2, 2, 2, 20, 433, 3, 2, 2, 2, 22, 435, 3, 2, 2, 2, 24, 438, 3, 2, 2, 2, 26, 444, 3, 2, 2, 2, 28, 448, 3, 2, 2, 2, 30, 452, 3, 2, 2, 2, 32, 456, 3, 2, 2, 2, 34, 463, 3, 2, 2, 2, 36, 479, 3, 2, 2, 2, 38, 488, 3, 2, 2, 2, 40, 503, 3, 2, 2, 2, 42, 510, 3, 2, 2, 2, 44, 517, 3, 2, 2, 2, 46, 534, 3, 2, 2, 2, 48, 550, 3, 2, 2, 2, 50, 567, 3, 2, 2, 2, 52, 584, 3, 2, 2, 2, 54, 587, 3, 2, 2, 2, 56, 599, 3, 2, 2, 2, 58, 608, 3, 2, 2, 2, 60, 618, 3, 2, 2, 2, 62, 620, 3, 2, 2, 2, 64, 630, 3, 2, 2, 2, 66, 632, 3, 2, 2, 2, 68, 637, 3, 2, 2, 2, 70, 641, 3, 2, 2, 2, 72, 647, 3, 2, 2, 2, 74, 668, 3, 2, 2, 2, 76, 674, 3, 2, 2, 2, 78, 676, 3, 2, 2, 2, 80, 695, 3, 2, 2, 2, 82, 712, 3, 2, 2, 2, 84, 728, 3, 2, 2, 2, 86, 748, 3, 2, 2, 2, 88, 763, 3, 2, 2, 2, 90, 765, 3, 2, 2, 2, 92, 773, 3, 2, 2, 2, 94, 779, 3, 2, 2, 2, 96, 793, 3, 2, 2, 2, 98, 803, 3, 2, 2, 2, 100, 807, 3, 2, 2, 2, 102, 823, 3, 2, 2, 2, 104, 832, 3, 2, 2, 2, 106, 848, 3, 2, 2, 2, 108, 857, 3, 2, 2, 2, 110, 865, 3, 2, 2, 2, 112, 868, 3, 2, 2, 2, 114, 878, 3, 2, 2, 2, 116, 896, 3, 2, 2, 2, 118, 906, 3, 2, 2, 2, 120, 922, 3, 2, 2, 2, 122, 927, 3, 2, 2, 2, 124, 940, 3, 2, 2, 2, 126, 948, 3, 2, 2, 2, 128, 963, 3, 2, 2, 2, 130, 970, 3, 2, 2, 2, 132, 986, 3, 2, 2, 2, 134, 1003, 3, 2, 2, 2, 136, 1012, 3, 2, 2, 2, 138, 1021, 3, 2, 2, 2, 140, 1040, 3, 2, 2, 2, 142, 1048, 3, 2, 2, 2, 144, 1057, 3, 2, 2, 2, 146, 1061, 3, 2, 2, 2, 148, 1066, 3, 2, 2, 2, 150, 1074, 3, 2, 2, 2, 152, 1079, 3, 2, 2, 2, 154, 1087, 3, 2, 2, 2, 156, 1095, 3, 2, 2, 2, 158, 1101, 3, 2, 2, 2, 160, 1107, 3, 2, 2, 2, 162, 1113, 3, 2, 2, 2, 164, 1119, 3, 2, 2, 2, 166, 1125, 3, 2, 2, 2, 168, 1140, 3, 2, 2, 2, 170, 1145, 3, 2, 2, 2, 172, 1153, 3, 2, 2, 2, 174, 1155, 3, 2, 2, 2, 176, 1162, 3, 2, 2, 2, 178, 1169, 3, 2, 2, 2, 180, 1177, 3, 2, 2, 2, 182, 1188, 3, 2, 2, 2, 184, 1194, 3, 2, 2, 2, 186, 1197, 3, 2, 2, 2, 188, 1201, 3, 2, 2, 2, 190, 1225, 3, 2, 2, 2, 192, 1227, 3, 2, 2, 2, 194, 1231, 3, 2, 2, 2, 196, 1234, 3, 2, 2, 2, 198, 1240, 3, 2, 2, 2, 200, 1242, 3, 2, 2, 2, 202, 1247, 3, 2, 2, 2, 204, 1252, 3, 2, 2, 2, 206, 1255, 3, 2, 2, 2, 208, 1269, 3, 2, 2, 2, 210, 1273, 3, 2, 2, 2, 212, 1275, 3, 2, 2, 2, 214, 1279, 3, 2, 2, 2, 216, 1317, 3, 2, 2, 2, 218, 1319, 3, 2, 2, 2, 220, 1323, 3, 2, 2, 2, 222, 1329, 3, 2, 2, 2, 224, 1337, 3, 2, 2, 2, 226, 1352, 3, 2, 2, 2, 228, 1358, 3, 2, 2, 2, 230, 1365, 3, 2, 2, 2, 232, 1369, 3, 2, 2, 2, 234, 1392, 3, 2, 2, 2, 236, 1401, 3, 2, 2, 2, 238, 1403, 3, 2, 2, 2, 240, 1413, 3, 2, 2, 2, 242, 1417, 3, 2, 2, 2, 244, 1425, 3, 2, 2, 2, 246, 1427, 3, 2, 2, 2, 248, 1432, 3, 2, 2, 2, 250, 1440, 3, 2, 2, 2, 252, 1442, 3, 2, 2, 2, 254, 1446, 3, 2, 2, 2, 256, 1450, 3, 2, 2, 2, 258, 1452, 3, 2, 2, 2, 260, 1458, 3, 2, 2, 2, 262, 1460, 3, 2, 2, 2, 264, 1464, 3, 2, 2, 2, 266, 1471, 3, 2, 2, 2, 268, 1485, 3, 2, 2, 2, 270, 1487, 3, 2, 2, 2, 272, 1501, 3, 2, 2, 2, 274, 1503, 3, 2, 2, 2, 276, 1510, 3, 2, 2, 2, 278, 1514, 3, 2, 2, 2, 280, 1522, 3, 2, 2, 2, 282, 1526, 3, 2, 2, 2, 284, 1530, 3, 2, 2, 2, 286, 1534, 3, 2, 2, 2, 288, 1542, 3, 2, 2, 2, 290, 1555, 3, 2, 2, 2, 292, 1557, 3, 2, 2, 2, 294, 1562, 3, 2, 2, 2, 296, 1578, 3, 2, 2, 2, 298, 1580, 3, 2, 2, 2, 300, 1585, 3, 2, 2, 2, 302, 1587, 3, 2, 2, 2, 304, 1589, 3, 2, 2, 2, 306, 1591, 3, 2, 2, 2, 308, 1593, 3, 2, 2, 2, 310, 1597, 3, 2, 2, 2, 312, 1599, 3, 2, 2, 2, 314, 1604, 3, 2, 2, 2, 316, 1613, 3, 2, 2, 2, 318, 1615, 3, 2, 2, 2, 320, 1620, 3, 2, 2, 2, 322, 1625, 3, 2, 2, 2, 324, 1629, 3, 2, 2, 2, 326, 1636, 3, 2, 2, 2, 328, 1638, 3, 2, 2, 2, 330, 1645, 3, 2, 2, 2, 332, 1652, 3, 2, 2, 2, 334, 1659, 3, 2, 2, 2, 336, 1666, 3, 2, 2, 2, 338, 1681, 3, 2, 2, 2, 340, 1699, 3, 2, 2, 2, 342, 1703, 3, 2, 2, 2, 344, 1705, 3, 2, 2, 2, 346, 1710, 3, 2, 2, 2, 348, 1726, 3, 2, 2, 2, 350, 1732, 3, 2, 2, 2, 352, 1737, 3, 2, 2, 2, 354, 1743, 3, 2, 2, 2, 356, 1745, 3, 2, 2, 2, 358, 1747, 3, 2, 2, 2, 360, 361, 5, 4, 3, 2, 361, 362, 7, 2, 2, 3, 362, 3, 3, 2, 2, 2, 363, 364, 7, 104, 2, 2, 364, 365, 7, 103, 2, 2, 365, 366, 5, 356, 179, 2, 366, 367, 7, 3, 2, 2, 367, 369, 3, 2, 2, 2, 368, 363, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 373, 5, 8, 5, 2, 371, 373, 5, 6, 4, 2, 372, 370, 3, 2, 2, 2, 372, 371, 3, 2, 2, 2, 373, 5, 3, 2, 2, 2, 374, 375, 5, 10, 6, 2, 375, 376, 5, 12, 7, 2, 376, 7, 3, 2, 2, 2, 377, 378, 7, 4, 2, 2, 378, 379, 7, 135, 2, 2, 379, 380, 7, 178, 2, 2, 380, 381, 7, 5, 2, 2, 381, 382, 5, 354, 178, 2, 382, 383, 7, 3, 2, 2, 383, 384, 5, 10, 6, 2, 384, 9, 3, 2, 2, 2, 385, 389, 5, 60, 31, 2, 386, 389, 5, 62, 32, 2, 387, 389, 5, 78, 40, 2, 388, 385, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 388, 387, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 3, 2, 2, 391, 393, 3, 2, 2, 2, 392, 388, 3, 2, 2, 2, 393, 396, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 402, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 397, 398, 5, 64, 33, 2, 398, 399, 7, 3, 2, 2, 399, 401, 3, 2, 2, 2, 400, 397, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 11, 3, 2, 2, 2, 404, 402, 3, 2, 2, 2, 405, 406, 5, 18, 10, 2, 406, 13, 3, 2, 2, 2, 407, 409, 5, 20, 11, 2, 408, 407, 3, 2, 2, 2, 409, 412, 3, 2, 2, 2, 410, 408, 3, 2, 2, 2, 410, 411, 3, 2, 2, 2, 411, 15, 3, 2, 2, 2, 412, 410, 3, 2, 2, 2, 413, 414, 5, 14, 8, 2, 414, 415, 5, 94, 48, 2, 415, 17, 3, 2, 2, 2, 416, 418, 5, 14, 8, 2, 417, 419, 5, 94, 48, 2, 418, 417, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 19, 3, 2, 2, 2, 420, 434, 5, 22, 12, 2, 421, 434, 5, 24, 13, 2, 422, 434, 5, 26, 14, 2, 423, 434, 5, 28, 15, 2, 424, 434, 5, 30, 16, 2, 425, 434, 5, 32, 17, 2, 426, 434, 5, 34, 18, 2, 427, 434, 5, 36, 19, 2, 428, 434, 5, 38, 20, 2, 429, 434, 5, 42, 22, 2, 430, 434, 5, 46, 24, 2, 431, 434, 5, 54, 28, 2, 432, 434, 5, 58, 30, 2, 433, 420, 3, 2, 2, 2, 433, 421, 3, 2, 2, 2, 433, 422, 3, 2, 2, 2, 433, 423, 3, 2, 2, 2, 433, 424, 3, 2, 2, 2, 433, 425, 3, 2, 2, 2, 433, 426, 3, 2, 2, 2, 433, 427, 3, 2, 2, 2, 433, 428, 3, 2, 2, 2, 433, 429, 3, 2, 2, 2, 433, 430, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 432, 3, 2, 2, 2, 434, 21, 3, 2, 2, 2, 435, 436, 5, 98, 50, 2, 436, 437, 7, 3, 2, 2, 437, 23, 3, 2, 2, 2, 438, 439, 7, 6, 2, 2, 439, 440, 5, 74, 38, 2, 440, 441, 7, 7, 2, 2, 441, 442, 5, 96, 49, 2, 442, 443, 7, 3, 2, 2, 443, 25, 3, 2, 2, 2, 444, 445, 7, 8, 2, 2, 445, 446, 5, 14, 8, 2, 446, 447, 7, 9, 2, 2, 447, 27, 3, 2, 2, 2, 448, 449, 7, 127, 2, 2, 449, 450, 7, 128, 2, 2, 450, 451, 7, 3, 2, 2, 451, 29, 3, 2, 2, 2, 452, 453, 7, 129, 2, 2, 453, 454, 7, 128, 2, 2, 454, 455, 7, 3, 2, 2, 455, 31, 3, 2, 2, 2, 456, 457, 7, 130, 2, 2, 457, 458, 7, 131, 2, 2, 458, 459, 5, 96, 49, 2, 459, 460, 7, 3, 2, 2, 460, 33, 3, 2, 2, 2, 461, 464, 5, 102, 52, 2, 462, 464, 5, 106, 54, 2, 463, 461, 3, 2, 2, 2, 463, 462, 3, 2, 2, 2, 464, 473, 3, 2, 2, 2, 465, 472, 5, 102, 52, 2, 466, 472, 5, 106, 54, 2, 467, 472, 5, 110, 56, 2, 468, 472, 5, 112, 57, 2, 469, 472, 5, 116, 59, 2, 470, 472, 5, 120, 61, 2, 471, 465, 3, 2, 2, 2, 471, 466, 3, 2, 2, 2, 471, 467, 3, 2, 2, 2, 471, 468, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 470, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 477, 7, 67, 2, 2, 477, 478, 5, 20, 11, 2, 478, 35, 3, 2, 2, 2, 479, 480, 7, 68, 2, 2, 480, 481, 7, 10, 2, 2, 481, 482, 5, 94, 48, 2, 482, 483, 7, 11, 2, 2, 483, 484, 7, 89, 2, 2, 484, 485, 5, 20, 11, 2, 485, 486, 7, 90, 2, 2, 486, 487, 5, 20, 11, 2, 487, 37, 3, 2, 2, 2, 488, 489, 7, 84, 2, 2, 489, 490, 7, 10, 2, 2, 490, 491, 5, 94, 48, 2, 491, 493, 7, 11, 2, 2, 492, 494, 5, 40, 21, 2, 493, 492, 3, 2, 2, 2, 494, 495, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 495, 496, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 7, 88, 2, 2, 498, 499, 7, 67, 2, 2, 499, 500, 5, 20, 11, 2, 500, 39, 3, 2, 2, 2, 501, 502, 7, 85, 2, 2, 502, 504, 5, 96, 49, 2, 503, 501, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 503, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 7, 67, 2, 2, 508, 509, 5, 20, 11, 2, 509, 41, 3, 2, 2, 2, 510, 511, 7, 86, 2, 2, 511, 513, 5, 26, 14, 2, 512, 514, 5, 44, 23, 2, 513, 512, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 43, 3, 2, 2, 2, 517, 520, 7, 87, 2, 2, 518, 521, 7, 12, 2, 2, 519, 521, 5, 74, 38, 2, 520, 518, 3, 2, 2, 2, 520, 519, 3, 2, 2, 2, 521, 529, 3, 2, 2, 2, 522, 525, 7, 13, 2, 2, 523, 526, 7, 12, 2, 2, 524, 526, 5, 74, 38, 2, 525, 523, 3, 2, 2, 2, 525, 524, 3, 2, 2, 2, 526, 528, 3, 2, 2, 2, 527, 522, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 532, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 533, 5, 26, 14, 2, 533, 45, 3, 2, 2, 2, 534, 535, 7, 91, 2, 2, 535, 536, 7, 10, 2, 2, 536, 537, 5, 94, 48, 2, 537, 539, 7, 11, 2, 2, 538, 540, 5, 48, 25, 2, 539, 538, 3, 2, 2, 2, 540, 541, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 545, 7, 88, 2, 2, 544, 546, 5, 194, 98, 2, 545, 544, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 547, 3, 2, 2, 2, 547, 548, 7, 67, 2, 2, 548, 549, 5, 20, 11, 2, 549, 47, 3, 2, 2, 2, 550, 554, 7, 85, 2, 2, 551, 552, 5, 194, 98, 2, 552, 553, 7, 70, 2, 2, 553, 555, 3, 2, 2, 2, 554, 551, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 561, 5, 338, 170, 2, 557, 558, 7, 13, 2, 2, 558, 560, 5, 338, 170, 2, 559, 557, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 561, 562, 3, 2, 2, 2, 562, 564, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 564, 565, 7, 67, 2, 2, 565, 566, 5, 20, 11, 2, 566, 49, 3, 2, 2, 2, 567, 568, 7, 14, 2, 2, 568, 579, 5, 74, 38, 2, 569, 570, 7, 10, 2, 2, 570, 575, 7, 172, 2, 2, 571, 572, 7, 15, 2, 2, 572, 574, 7, 172, 2, 2, 573, 571, 3, 2, 2, 2, 574, 577, 3, 2, 2, 2, 575, 573, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 578, 3, 2, 2, 2, 577, 575, 3, 2, 2, 2, 578, 580, 7, 11, 2, 2, 579, 569, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 51, 3, 2, 2, 2, 581, 583, 5, 50, 26, 2, 582, 581, 3, 2, 2, 2, 583, 586, 3, 2, 2, 2, 584, 582, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 53, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 587, 588, 5, 52, 27, 2, 588, 589, 7, 114, 2, 2, 589, 594, 5, 56, 29, 2, 590, 591, 7, 15, 2, 2, 591, 593, 5, 56, 29, 2, 592, 590, 3, 2, 2, 2, 593, 596, 3, 2, 2, 2, 594, 592, 3, 2, 2, 2, 594, 595, 3, 2, 2, 2, 595, 597, 3, 2, 2, 2, 596, 594, 3, 2, 2, 2, 597, 598, 7, 3, 2, 2, 598, 55, 3, 2, 2, 2, 599, 602, 5, 194, 98, 2, 600, 601, 7, 70, 2, 2, 601, 603, 5, 338, 170, 2, 602, 600, 3, 2, 2, 2, 602, 603, 3, 2, 2, 2, 603, 606, 3, 2, 2, 2, 604, 605, 7, 7, 2, 2, 605, 607, 5, 96, 49, 2, 606, 604, 3, 2, 2, 2, 606, 607, 3, 2, 2, 2, 607, 57, 3, 2, 2, 2, 608, 609, 7, 132, 2, 2, 609, 610, 7, 10, 2, 2, 610, 611, 5, 94, 48, 2, 611, 612, 7, 11, 2, 2, 612, 613, 5, 20, 11, 2, 613, 59, 3, 2, 2, 2, 614, 619, 5, 66, 34, 2, 615, 619, 5, 68, 35, 2, 616, 619, 5, 70, 36, 2, 617, 619, 5, 72, 37, 2, 618, 614, 3, 2, 2, 2, 618, 615, 3, 2, 2, 2, 618, 616, 3, 2, 2, 2, 618, 617, 3, 2, 2, 2, 619, 61, 3, 2, 2, 2, 620, 621, 7, 111, 2, 2, 621, 622, 7, 135, 2, 2, 622, 623, 7, 178, 2, 2, 623, 624, 7, 5, 2, 2, 624, 625, 5, 354, 178, 2, 625, 63, 3, 2, 2, 2, 626, 631, 5, 84, 43, 2, 627, 631, 5, 80, 41, 2, 628, 631, 5, 86, 44, 2, 629, 631, 5, 82, 42, 2, 630, 626, 3, 2, 2, 2, 630, 627, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 630, 629, 3, 2, 2, 2, 631, 65, 3, 2, 2, 2, 632, 633, 7, 111, 2, 2, 633, 634, 7, 88, 2, 2, 634, 635, 7, 81, 2, 2, 635, 636, 5, 354, 178, 2, 636, 67, 3, 2, 2, 2, 637, 638, 7, 111, 2, 2, 638, 639, 7, 16, 2, 2, 639, 640, 9, 2, 2, 2, 640, 69, 3, 2, 2, 2, 641, 642, 7, 111, 2, 2, 642, 643, 7, 88, 2, 2, 643, 644, 7, 66, 2, 2, 644, 645, 7, 73, 2, 2, 645, 646, 9, 3, 2, 2, 646, 71, 3, 2, 2, 2, 647, 652, 7, 111, 2, 2, 648, 649, 7, 18, 2, 2, 649, 653, 5, 74, 38, 2, 650, 651, 7, 88, 2, 2, 651, 653, 7, 18, 2, 2, 652, 648, 3, 2, 2, 2, 652, 650, 3, 2, 2, 2, 653, 660, 3, 2, 2, 2, 654, 655, 5, 76, 39, 2, 655, 656, 7, 5, 2, 2, 656, 657, 5, 356, 179, 2, 657, 659, 3, 2, 2, 2, 658, 654, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 73, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 666, 7, 178, 2, 2, 664, 666, 5, 358, 180, 2, 665, 663, 3, 2, 2, 2, 665, 664, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 669, 7, 19, 2, 2, 668, 665, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 672, 3, 2, 2, 2, 670, 673, 7, 178, 2, 2, 671, 673, 5, 358, 180, 2, 672, 670, 3, 2, 2, 2, 672, 671, 3, 2, 2, 2, 673, 75, 3, 2, 2, 2, 674, 675, 9, 4, 2, 2, 675, 77, 3, 2, 2, 2, 676, 677, 7, 133, 2, 2, 677, 681, 7, 4, 2, 2, 678, 679, 7, 135, 2, 2, 679, 680, 7, 178, 2, 2, 680, 682, 7, 5, 2, 2, 681, 678, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 693, 5, 354, 178, 2, 684, 685, 7, 71, 2, 2, 685, 690, 5, 354, 178, 2, 686, 687, 7, 15, 2, 2, 687, 689, 5, 354, 178, 2, 688, 686, 3, 2, 2, 2, 689, 692, 3, 2, 2, 2, 690, 688, 3, 2, 2, 2, 690, 691, 3, 2, 2, 2, 691, 694, 3, 2, 2, 2, 692, 690, 3, 2, 2, 2, 693, 684, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 79, 3, 2, 2, 2, 695, 696, 7, 111, 2, 2, 696, 697, 5, 52, 27, 2, 697, 698, 7, 114, 2, 2, 698, 701, 5, 194, 98, 2, 699, 700, 7, 70, 2, 2, 700, 702, 5, 338, 170, 2, 701, 699, 3, 2, 2, 2, 701, 702, 3, 2, 2, 2, 702, 710, 3, 2, 2, 2, 703, 704, 7, 7, 2, 2, 704, 711, 5, 96, 49, 2, 705, 708, 7, 30, 2, 2, 706, 707, 7, 7, 2, 2, 707, 709, 5, 96, 49, 2, 708, 706, 3, 2, 2, 2, 708, 709, 3, 2, 2, 2, 709, 711, 3, 2, 2, 2, 710, 703, 3, 2, 2, 2, 710, 705, 3, 2, 2, 2, 711, 81, 3, 2, 2, 2, 712, 713, 7, 111, 2, 2, 713, 714, 7, 112, 2, 2, 714, 717, 7, 113, 2, 2, 715, 716, 7, 70, 2, 2, 716, 718, 5, 338, 170, 2, 717, 715, 3, 2, 2, 2, 717, 718, 3, 2, 2, 2, 718, 726, 3, 2, 2, 2, 719, 720, 7, 7, 2, 2, 720, 727, 5, 96, 49, 2, 721, 724, 7, 30, 2, 2, 722, 723, 7, 7, 2, 2, 723, 725, 5, 96, 49, 2, 724, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 727, 3, 2, 2, 2, 726, 719, 3, 2, 2, 2, 726, 721, 3, 2, 2, 2, 727, 83, 3, 2, 2, 2, 728, 729, 7, 111, 2, 2, 729, 730, 5, 52, 27, 2, 730, 731, 7, 31, 2, 2, 731, 732, 5, 74, 38, 2, 732, 734, 7, 10, 2, 2, 733, 735, 5, 90, 46, 2, 734, 733, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 739, 7, 11, 2, 2, 737, 738, 7, 70, 2, 2, 738, 740, 5, 338, 170, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 746, 3, 2, 2, 2, 741, 742, 7, 8, 2, 2, 742, 743, 5, 18, 10, 2, 743, 744, 7, 9, 2, 2, 744, 747, 3, 2, 2, 2, 745, 747, 7, 30, 2, 2, 746, 741, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 85, 3, 2, 2, 2, 748, 749, 7, 111, 2, 2, 749, 750, 7, 108, 2, 2, 750, 751, 5, 74, 38, 2, 751, 753, 7, 70, 2, 2, 752, 754, 5, 88, 45, 2, 753, 752, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 755, 3, 2, 2, 2, 755, 756, 5, 96, 49, 2, 756, 87, 3, 2, 2, 2, 757, 758, 7, 32, 2, 2, 758, 764, 7, 33, 2, 2, 759, 760, 7, 32, 2, 2, 760, 764, 7, 34, 2, 2, 761, 762, 7, 124, 2, 2, 762, 764, 7, 134, 2, 2, 763, 757, 3, 2, 2, 2, 763, 759, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 764, 89, 3, 2, 2, 2, 765, 770, 5, 92, 47, 2, 766, 767, 7, 15, 2, 2, 767, 769, 5, 92, 47, 2, 768, 766, 3, 2, 2, 2, 769, 772, 3, 2, 2, 2, 770, 768, 3, 2, 2, 2, 770, 771, 3, 2, 2, 2, 771, 91, 3, 2, 2, 2, 772, 770, 3, 2, 2, 2, 773, 774, 7, 6, 2, 2, 774, 777, 5, 74, 38, 2, 775, 776, 7, 70, 2, 2, 776, 778, 5, 338, 170, 2, 777, 775, 3, 2, 2, 2, 777, 778, 3, 2, 2, 2, 778, 93, 3, 2, 2, 2, 779, 784, 5, 96, 49, 2, 780, 781, 7, 15, 2, 2, 781, 783, 5, 96, 49, 2, 782, 780, 3, 2, 2, 2, 783, 786, 3, 2, 2, 2, 784, 782, 3, 2, 2, 2, 784, 785, 3, 2, 2, 2, 785, 95, 3, 2, 2, 2, 786, 784, 3, 2, 2, 2, 787, 794, 5, 98, 50, 2, 788, 794, 5, 100, 51, 2, 789, 794, 5, 126, 64, 2, 790, 794, 5, 130, 66, 2, 791, 794, 5, 134, 68, 2, 792, 794, 5, 136, 69, 2, 793, 787, 3, 2, 2, 2, 793, 788, 3, 2, 2, 2, 793, 789, 3, 2, 2, 2, 793, 790, 3, 2, 2, 2, 793, 791, 3, 2, 2, 2, 793, 792, 3, 2, 2, 2, 794, 97, 3, 2, 2, 2, 795, 804, 5, 122, 62, 2, 796, 804, 5, 140, 71, 2, 797, 804, 5, 216, 109, 2, 798, 804, 5, 218, 110, 2, 799, 804, 5, 220, 111, 2, 800, 804, 5, 222, 112, 2, 801, 804, 5, 224, 113, 2, 802, 804, 5, 226, 114, 2, 803, 795, 3, 2, 2, 2, 803, 796, 3, 2, 2, 2, 803, 797, 3, 2, 2, 2, 803, 798, 3, 2, 2, 2, 803, 799, 3, 2, 2, 2, 803, 800, 3, 2, 2, 2, 803, 801, 3, 2, 2, 2, 803, 802, 3, 2, 2, 2, 804, 99, 3, 2, 2, 2, 805, 808, 5, 102, 52, 2, 806, 808, 5, 106, 54, 2, 807, 805, 3, 2, 2, 2, 807, 806, 3, 2, 2, 2, 808, 817, 3, 2, 2, 2, 809, 816, 5, 102, 52, 2, 810, 816, 5, 106, 54, 2, 811, 816, 5, 110, 56, 2, 812, 816, 5, 112, 57, 2, 813, 816, 5, 116, 59, 2, 814, 816, 5, 120, 61, 2, 815, 809, 3, 2, 2, 2, 815, 810, 3, 2, 2, 2, 815, 811, 3, 2, 2, 2, 815, 812, 3, 2, 2, 2, 815, 813, 3, 2, 2, 2, 815, 814, 3, 2, 2, 2, 816, 819, 3, 2, 2, 2, 817, 815, 3, 2, 2, 2, 817, 818, 3, 2, 2, 2, 818, 820, 3, 2, 2, 2, 819, 817, 3, 2, 2, 2, 820, 821, 7, 67, 2, 2, 821, 822, 5, 96, 49, 2, 822, 101, 3, 2, 2, 2, 823, 824, 7, 61, 2, 2, 824, 829, 5, 104, 53, 2, 825, 826, 7, 15, 2, 2, 826, 828, 5, 104, 53, 2, 827, 825, 3, 2, 2, 2, 828, 831, 3, 2, 2, 2, 829, 827, 3, 2, 2, 2, 829, 830, 3, 2, 2, 2, 830, 103, 3, 2, 2, 2, 831, 829, 3, 2, 2, 2, 832, 835, 5, 194, 98, 2, 833, 834, 7, 70, 2, 2, 834, 836, 5, 338, 170, 2, 835, 833, 3, 2, 2, 2, 835, 836, 3, 2, 2, 2, 836, 839, 3, 2, 2, 2, 837, 838, 7, 72, 2, 2, 838, 840, 7, 73, 2, 2, 839, 837, 3, 2, 2, 2, 839, 840, 3, 2, 2, 2, 840, 843, 3, 2, 2, 2, 841, 842, 7, 71, 2, 2, 842, 844, 5, 194, 98, 2, 843, 841, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 845, 3, 2, 2, 2, 845, 846, 7, 69, 2, 2, 846, 847, 5, 96, 49, 2, 847, 105, 3, 2, 2, 2, 848, 849, 7, 62, 2, 2, 849, 854, 5, 108, 55, 2, 850, 851, 7, 15, 2, 2, 851, 853, 5, 108, 55, 2, 852, 850, 3, 2, 2, 2, 853, 856, 3, 2, 2, 2, 854, 852, 3, 2, 2, 2, 854, 855, 3, 2, 2, 2, 855, 107, 3, 2, 2, 2, 856, 854, 3, 2, 2, 2, 857, 860, 5, 194, 98, 2, 858, 859, 7, 70, 2, 2, 859, 861, 5, 338, 170, 2, 860, 858, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 862, 3, 2, 2, 2, 862, 863, 7, 7, 2, 2, 863, 864, 5, 96, 49, 2, 864, 109, 3, 2, 2, 2, 865, 866, 7, 63, 2, 2, 866, 867, 5, 96, 49, 2, 867, 111, 3, 2, 2, 2, 868, 869, 7, 64, 2, 2, 869, 870, 7, 65, 2, 2, 870, 875, 5, 114, 58, 2, 871, 872, 7, 15, 2, 2, 872, 874, 5, 114, 58, 2, 873, 871, 3, 2, 2, 2, 874, 877, 3, 2, 2, 2, 875, 873, 3, 2, 2, 2, 875, 876, 3, 2, 2, 2, 876, 113, 3, 2, 2, 2, 877, 875, 3, 2, 2, 2, 878, 885, 5, 194, 98, 2, 879, 880, 7, 70, 2, 2, 880, 882, 5, 338, 170, 2, 881, 879, 3, 2, 2, 2, 881, 882, 3, 2, 2, 2, 882, 883, 3, 2, 2, 2, 883, 884, 7, 7, 2, 2, 884, 886, 5, 96, 49, 2, 885, 881, 3, 2, 2, 2, 885, 886, 3, 2, 2, 2, 886, 889, 3, 2, 2, 2, 887, 888, 7, 81, 2, 2, 888, 890, 5, 354, 178, 2, 889, 887, 3, 2, 2, 2, 889, 890, 3, 2, 2, 2, 890, 115, 3, 2, 2, 2, 891, 892, 7, 66, 2, 2, 892, 897, 7, 65, 2, 2, 893, 894, 7, 75, 2, 2, 894, 895, 7, 66, 2, 2, 895, 897, 7, 65, 2, 2, 896, 891, 3, 2, 2, 2, 896, 893, 3, 2, 2, 2, 897, 898, 3, 2, 2, 2, 898, 903, 5, 118, 60, 2, 899, 900, 7, 15, 2, 2, 900, 902, 5, 118, 60, 2, 901, 899, 3, 2, 2, 2, 902, 905, 3, 2, 2, 2, 903, 901, 3, 2, 2, 2, 903, 904, 3, 2, 2, 2, 904, 117, 3, 2, 2, 2, 905, 903, 3, 2, 2, 2, 906, 909, 5, 96, 49, 2, 907, 910, 7, 76, 2, 2, 908, 910, 7, 77, 2, 2, 909, 907, 3, 2, 2, 2, 909, 908, 3, 2, 2, 2, 909, 910, 3, 2, 2, 2, 910, 916, 3, 2, 2, 2, 911, 914, 7, 73, 2, 2, 912, 915, 7, 82, 2, 2, 913, 915, 7, 83, 2, 2, 914, 912, 3, 2, 2, 2, 914, 913, 3, 2, 2, 2, 915, 917, 3, 2, 2, 2, 916, 911, 3, 2, 2, 2, 916, 917, 3, 2, 2, 2, 917, 920, 3, 2, 2, 2, 918, 919, 7, 81, 2, 2, 919, 921, 5, 354, 178, 2, 920, 918, 3, 2, 2, 2, 920, 921, 3, 2, 2, 2, 921, 119, 3, 2, 2, 2, 922, 923, 7, 74, 2, 2, 923, 924, 5, 194, 98, 2, 924, 121, 3, 2, 2, 2, 925, 928, 7, 78, 2, 2, 926, 928, 7, 79, 2, 2, 927, 925, 3, 2, 2, 2, 927, 926, 3, 2, 2, 2, 928, 929, 3, 2, 2, 2, 929, 934, 5, 124, 63, 2, 930, 931, 7, 15, 2, 2, 931, 933, 5, 124, 63, 2, 932, 930, 3, 2, 2, 2, 933, 936, 3, 2, 2, 2, 934, 932, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 937, 3, 2, 2, 2, 936, 934, 3, 2, 2, 2, 937, 938, 7, 80, 2, 2, 938, 939, 5, 96, 49, 2, 939, 123, 3, 2, 2, 2, 940, 943, 5, 194, 98, 2, 941, 942, 7, 70, 2, 2, 942, 944, 5, 338, 170, 2, 943, 941, 3, 2, 2, 2, 943, 944, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 946, 7, 69, 2, 2, 946, 947, 5, 96, 49, 2, 947, 125, 3, 2, 2, 2, 948, 949, 7, 84, 2, 2, 949, 950, 7, 10, 2, 2, 950, 951, 5, 94, 48, 2, 951, 953, 7, 11, 2, 2, 952, 954, 5, 128, 65, 2, 953, 952, 3, 2, 2, 2, 954, 955, 3, 2, 2, 2, 955, 953, 3, 2, 2, 2, 955, 956, 3, 2, 2, 2, 956, 957, 3, 2, 2, 2, 957, 958, 7, 88, 2, 2, 958, 959, 7, 67, 2, 2, 959, 960, 5, 96, 49, 2, 960, 127, 3, 2, 2, 2, 961, 962, 7, 85, 2, 2, 962, 964, 5, 96, 49, 2, 963, 961, 3, 2, 2, 2, 964, 965, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 967, 3, 2, 2, 2, 967, 968, 7, 67, 2, 2, 968, 969, 5, 96, 49, 2, 969, 129, 3, 2, 2, 2, 970, 971, 7, 91, 2, 2, 971, 972, 7, 10, 2, 2, 972, 973, 5, 94, 48, 2, 973, 975, 7, 11, 2, 2, 974, 976, 5, 132, 67, 2, 975, 974, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 975, 3, 2, 2, 2, 977, 978, 3, 2, 2, 2, 978, 979, 3, 2, 2, 2, 979, 981, 7, 88, 2, 2, 980, 982, 5, 194, 98, 2, 981, 980, 3, 2, 2, 2, 981, 982, 3, 2, 2, 2, 982, 983, 3, 2, 2, 2, 983, 984, 7, 67, 2, 2, 984, 985, 5, 96, 49, 2, 985, 131, 3, 2, 2, 2, 986, 990, 7, 85, 2, 2, 987, 988, 5, 194, 98, 2, 988, 989, 7, 70, 2, 2, 989, 991, 3, 2, 2, 2, 990, 987, 3, 2, 2, 2, 990, 991, 3, 2, 2, 2, 991, 992, 3, 2, 2, 2, 992, 997, 5, 338, 170, 2, 993, 994, 7, 13, 2, 2, 994, 996, 5, 338, 170, 2, 995, 993, 3, 2, 2, 2, 996, 999, 3, 2, 2, 2, 997, 995, 3, 2, 2, 2, 997, 998, 3, 2, 2, 2, 998, 1000, 3, 2, 2, 2, 999, 997, 3, 2, 2, 2, 1000, 1001, 7, 67, 2, 2, 1001, 1002, 5, 96, 49, 2, 1002, 133, 3, 2, 2, 2, 1003, 1004, 7, 68, 2, 2, 1004, 1005, 7, 10, 2, 2, 1005, 1006, 5, 94, 48, 2, 1006, 1007, 7, 11, 2, 2, 1007, 1008, 7, 89, 2, 2, 1008, 1009, 5, 96, 49, 2, 1009, 1010, 7, 90, 2, 2, 1010, 1011, 5, 96, 49, 2, 1011, 135, 3, 2, 2, 2, 1012, 1013, 7, 86, 2, 2, 1013, 1014, 7, 8, 2, 2, 1014, 1015, 5, 94, 48, 2, 1015, 1017, 7, 9, 2, 2, 1016, 1018, 5, 138, 70, 2, 1017, 1016, 3, 2, 2, 2, 1018, 1019, 3, 2, 2, 2, 1019, 1017, 3, 2, 2, 2, 1019, 1020, 3, 2, 2, 2, 1020, 137, 3, 2, 2, 2, 1021, 1024, 7, 87, 2, 2, 1022, 1025, 7, 12, 2, 2, 1023, 1025, 5, 74, 38, 2, 1024, 1022, 3, 2, 2, 2, 1024, 1023, 3, 2, 2, 2, 1025, 1033, 3, 2, 2, 2, 1026, 1029, 7, 13, 2, 2, 1027, 1030, 7, 12, 2, 2, 1028, 1030, 5, 74, 38, 2, 1029, 1027, 3, 2, 2, 2, 1029, 1028, 3, 2, 2, 2, 1030, 1032, 3, 2, 2, 2, 1031, 1026, 3, 2, 2, 2, 1032, 1035, 3, 2, 2, 2, 1033, 1031, 3, 2, 2, 2, 1033, 1034, 3, 2, 2, 2, 1034, 1036, 3, 2, 2, 2, 1035, 1033, 3, 2, 2, 2, 1036, 1037, 7, 8, 2, 2, 1037, 1038, 5, 94, 48, 2, 1038, 1039, 7, 9, 2, 2, 1039, 139, 3, 2, 2, 2, 1040, 1045, 5, 142, 72, 2, 1041, 1042, 7, 92, 2, 2, 1042, 1044, 5, 142, 72, 2, 1043, 1041, 3, 2, 2, 2, 1044, 1047, 3, 2, 2, 2, 1045, 1043, 3, 2, 2, 2, 1045, 1046, 3, 2, 2, 2, 1046, 141, 3, 2, 2, 2, 1047, 1045, 3, 2, 2, 2, 1048, 1053, 5, 144, 73, 2, 1049, 1050, 7, 93, 2, 2, 1050, 1052, 5, 144, 73, 2, 1051, 1049, 3, 2, 2, 2, 1052, 1055, 3, 2, 2, 2, 1053, 1051, 3, 2, 2, 2, 1053, 1054, 3, 2, 2, 2, 1054, 143, 3, 2, 2, 2, 1055, 1053, 3, 2, 2, 2, 1056, 1058, 7, 94, 2, 2, 1057, 1056, 3, 2, 2, 2, 1057, 1058, 3, 2, 2, 2, 1058, 1059, 3, 2, 2, 2, 1059, 1060, 5, 146, 74, 2, 1060, 145, 3, 2, 2, 2, 1061, 1064, 5, 148, 75, 2, 1062, 1063, 9, 5, 2, 2, 1063, 1065, 5, 148, 75, 2, 1064, 1062, 3, 2, 2, 2, 1064, 1065, 3, 2, 2, 2, 1065, 147, 3, 2, 2, 2, 1066, 1071, 5, 150, 76, 2, 1067, 1068, 7, 46, 2, 2, 1068, 1070, 5, 150, 76, 2, 1069, 1067, 3, 2, 2, 2, 1070, 1073, 3, 2, 2, 2, 1071, 1069, 3, 2, 2, 2, 1071, 1072, 3, 2, 2, 2, 1072, 149, 3, 2, 2, 2, 1073, 1071, 3, 2, 2, 2, 1074, 1077, 5, 152, 77, 2, 1075, 1076, 7, 95, 2, 2, 1076, 1078, 5, 152, 77, 2, 1077, 1075, 3, 2, 2, 2, 1077, 1078, 3, 2, 2, 2, 1078, 151, 3, 2, 2, 2, 1079, 1084, 5, 154, 78, 2, 1080, 1081, 9, 6, 2, 2, 1081, 1083, 5, 154, 78, 2, 1082, 1080, 3, 2, 2, 2, 1083, 1086, 3, 2, 2, 2, 1084, 1082, 3, 2, 2, 2, 1084, 1085, 3, 2, 2, 2, 1085, 153, 3, 2, 2, 2, 1086, 1084, 3, 2, 2, 2, 1087, 1092, 5, 156, 79, 2, 1088, 1089, 9, 7, 2, 2, 1089, 1091, 5, 156, 79, 2, 1090, 1088, 3, 2, 2, 2, 1091, 1094, 3, 2, 2, 2, 1092, 1090, 3, 2, 2, 2, 1092, 1093, 3, 2, 2, 2, 1093, 155, 3, 2, 2, 2, 1094, 1092, 3, 2, 2, 2, 1095, 1099, 5, 158, 80, 2, 1096, 1097, 7, 96, 2, 2, 1097, 1098, 7, 97, 2, 2, 1098, 1100, 5, 338, 170, 2, 1099, 1096, 3, 2, 2, 2, 1099, 1100, 3, 2, 2, 2, 1100, 157, 3, 2, 2, 2, 1101, 1105, 5, 160, 81, 2, 1102, 1103, 7, 99, 2, 2, 1103, 1104, 7, 98, 2, 2, 1104, 1106, 5, 338, 170, 2, 1105, 1102, 3, 2, 2, 2, 1105, 1106, 3, 2, 2, 2, 1106, 159, 3, 2, 2, 2, 1107, 1111, 5, 162, 82, 2, 1108, 1109, 7, 100, 2, 2, 1109, 1110, 7, 70, 2, 2, 1110, 1112, 5, 338, 170, 2, 1111, 1108, 3, 2, 2, 2, 1111, 1112, 3, 2, 2, 2, 1112, 161, 3, 2, 2, 2, 1113, 1117, 5, 164, 83, 2, 1114, 1115, 7, 102, 2, 2, 1115, 1116, 7, 70, 2, 2, 1116, 1118, 5, 348, 175, 2, 1117, 1114, 3, 2, 2, 2, 1117, 1118, 3, 2, 2, 2, 1118, 163, 3, 2, 2, 2, 1119, 1123, 5, 166, 84, 2, 1120, 1121, 7, 101, 2, 2, 1121, 1122, 7, 70, 2, 2, 1122, 1124, 5, 348, 175, 2, 1123, 1120, 3, 2, 2, 2, 1123, 1124, 3, 2, 2, 2, 1124, 165, 3, 2, 2, 2, 1125, 1134, 5, 170, 86, 2, 1126, 1127, 7, 5, 2, 2, 1127, 1128, 7, 44, 2, 2, 1128, 1129, 3, 2, 2, 2, 1129, 1130, 5, 168, 85, 2, 1130, 1131, 5, 206, 104, 2, 1131, 1133, 3, 2, 2, 2, 1132, 1126, 3, 2, 2, 2, 1133, 1136, 3, 2, 2, 2, 1134, 1132, 3, 2, 2, 2, 1134, 1135, 3, 2, 2, 2, 1135, 167, 3, 2, 2, 2, 1136, 1134, 3, 2, 2, 2, 1137, 1141, 5, 74, 38, 2, 1138, 1141, 5, 194, 98, 2, 1139, 1141, 5, 196, 99, 2, 1140, 1137, 3, 2, 2, 2, 1140, 1138, 3, 2, 2, 2, 1140, 1139, 3, 2, 2, 2, 1141, 169, 3, 2, 2, 2, 1142, 1144, 9, 6, 2, 2, 1143, 1142, 3, 2, 2, 2, 1144, 1147, 3, 2, 2, 2, 1145, 1143, 3, 2, 2, 2, 1145, 1146, 3, 2, 2, 2, 1146, 1148, 3, 2, 2, 2, 1147, 1145, 3, 2, 2, 2, 1148, 1149, 5, 172, 87, 2, 1149, 171, 3, 2, 2, 2, 1150, 1154, 5, 178, 90, 2, 1151, 1154, 5, 174, 88, 2, 1152, 1154, 5, 176, 89, 2, 1153, 1150, 3, 2, 2, 2, 1153, 1151, 3, 2, 2, 2, 1153, 1152, 3, 2, 2, 2, 1154, 173, 3, 2, 2, 2, 1155, 1156, 7, 109, 2, 2, 1156, 1157, 7, 108, 2, 2, 1157, 1158, 5, 338, 170, 2, 1158, 1159, 7, 8, 2, 2, 1159, 1160, 5, 94, 48, 2, 1160, 1161, 7, 9, 2, 2, 1161, 175, 3, 2, 2, 2, 1162, 1163, 7, 110, 2, 2, 1163, 1164, 7, 108, 2, 2, 1164, 1165, 5, 338, 170, 2, 1165, 1166, 7, 8, 2, 2, 1166, 1167, 5, 94, 48, 2, 1167, 1168, 7, 9, 2, 2, 1168, 177, 3, 2, 2, 2, 1169, 1174, 5, 180, 91, 2, 1170, 1171, 7, 52, 2, 2, 1171, 1173, 5, 180, 91, 2, 1172, 1170, 3, 2, 2, 2, 1173, 1176, 3, 2, 2, 2, 1174, 1172, 3, 2, 2, 2, 1174, 1175, 3, 2, 2, 2, 1175, 179, 3, 2, 2, 2, 1176, 1174, 3, 2, 2, 2, 1177, 1185, 5, 190, 96, 2, 1178, 1184, 5, 182, 92, 2, 1179, 1184, 5, 186, 94, 2, 1180, 1184, 5, 188, 95, 2, 1181, 1184, 5, 184, 93, 2, 1182, 1184, 5, 206, 104, 2, 1183, 1178, 3, 2, 2, 2, 1183, 1179, 3, 2, 2, 2, 1183, 1180, 3, 2, 2, 2, 1183, 1181, 3, 2, 2, 2, 1183, 1182, 3, 2, 2, 2, 1184, 1187, 3, 2, 2, 2, 1185, 1183, 3, 2, 2, 2, 1185, 1186, 3, 2, 2, 2, 1186, 181, 3, 2, 2, 2, 1187, 1185, 3, 2, 2, 2, 1188, 1189, 7, 53, 2, 2, 1189, 1190, 7, 53, 2, 2, 1190, 1191, 5, 94, 48, 2, 1191, 1192, 7, 54, 2, 2, 1192, 1193, 7, 54, 2, 2, 1193, 183, 3, 2, 2, 2, 1194, 1195, 7, 53, 2, 2, 1195, 1196, 7, 54, 2, 2, 1196, 185, 3, 2, 2, 2, 1197, 1198, 7, 53, 2, 2, 1198, 1199, 5, 94, 48, 2, 1199, 1200, 7, 54, 2, 2, 1200, 187, 3, 2, 2, 2, 1201, 1208, 7, 55, 2, 2, 1202, 1209, 5, 358, 180, 2, 1203, 1209, 5, 356, 179, 2, 1204, 1209, 7, 178, 2, 2, 1205, 1209, 5, 196, 99, 2, 1206, 1209, 5, 194, 98, 2, 1207, 1209, 5, 198, 100, 2, 1208, 1202, 3, 2, 2, 2, 1208, 1203, 3, 2, 2, 2, 1208, 1204, 3, 2, 2, 2, 1208, 1205, 3, 2, 2, 2, 1208, 1206, 3, 2, 2, 2, 1208, 1207, 3, 2, 2, 2, 1209, 189, 3, 2, 2, 2, 1210, 1226, 7, 171, 2, 2, 1211, 1226, 7, 106, 2, 2, 1212, 1226, 7, 107, 2, 2, 1213, 1226, 7, 172, 2, 2, 1214, 1226, 5, 356, 179, 2, 1215, 1226, 5, 194, 98, 2, 1216, 1226, 5, 196, 99, 2, 1217, 1226, 5, 198, 100, 2, 1218, 1226, 5, 340, 171, 2, 1219, 1226, 5, 204, 103, 2, 1220, 1226, 5, 200, 101, 2, 1221, 1226, 5, 202, 102, 2, 1222, 1226, 5, 352, 177, 2, 1223, 1226, 5, 210, 106, 2, 1224, 1226, 5, 192, 97, 2, 1225, 1210, 3, 2, 2, 2, 1225, 1211, 3, 2, 2, 2, 1225, 1212, 3, 2, 2, 2, 1225, 1213, 3, 2, 2, 2, 1225, 1214, 3, 2, 2, 2, 1225, 1215, 3, 2, 2, 2, 1225, 1216, 3, 2, 2, 2, 1225, 1217, 3, 2, 2, 2, 1225, 1218, 3, 2, 2, 2, 1225, 1219, 3, 2, 2, 2, 1225, 1220, 3, 2, 2, 2, 1225, 1221, 3, 2, 2, 2, 1225, 1222, 3, 2, 2, 2, 1225, 1223, 3, 2, 2, 2, 1225, 1224, 3, 2, 2, 2, 1226, 191, 3, 2, 2, 2, 1227, 1228, 7, 8, 2, 2, 1228, 1229, 5, 16, 9, 2, 1229, 1230, 7, 9, 2, 2, 1230, 193, 3, 2, 2, 2, 1231, 1232, 7, 6, 2, 2, 1232, 1233, 5, 74, 38, 2, 1233, 195, 3, 2, 2, 2, 1234, 1236, 7, 10, 2, 2, 1235, 1237, 5, 94, 48, 2, 1236, 1235, 3, 2, 2, 2, 1236, 1237, 3, 2, 2, 2, 1237, 1238, 3, 2, 2, 2, 1238, 1239, 7, 11, 2, 2, 1239, 197, 3, 2, 2, 2, 1240, 1241, 7, 56, 2, 2, 1241, 199, 3, 2, 2, 2, 1242, 1243, 7, 17, 2, 2, 1243, 1244, 7, 8, 2, 2, 1244, 1245, 5, 94, 48, 2, 1245, 1246, 7, 9, 2, 2, 1246, 201, 3, 2, 2, 2, 1247, 1248, 7, 105, 2, 2, 1248, 1249, 7, 8, 2, 2, 1249, 1250, 5, 94, 48, 2, 1250, 1251, 7, 9, 2, 2, 1251, 203, 3, 2, 2, 2, 1252, 1253, 5, 74, 38, 2, 1253, 1254, 5, 206, 104, 2, 1254, 205, 3, 2, 2, 2, 1255, 1262, 7, 10, 2, 2, 1256, 1258, 5, 208, 105, 2, 1257, 1259, 7, 15, 2, 2, 1258, 1257, 3, 2, 2, 2, 1258, 1259, 3, 2, 2, 2, 1259, 1261, 3, 2, 2, 2, 1260, 1256, 3, 2, 2, 2, 1261, 1264, 3, 2, 2, 2, 1262, 1260, 3, 2, 2, 2, 1262, 1263, 3, 2, 2, 2, 1263, 1265, 3, 2, 2, 2, 1264, 1262, 3, 2, 2, 2, 1265, 1266, 7, 11, 2, 2, 1266, 207, 3, 2, 2, 2, 1267, 1270, 5, 96, 49, 2, 1268, 1270, 7, 170, 2, 2, 1269, 1267, 3, 2, 2, 2, 1269, 1268, 3, 2, 2, 2, 1270, 209, 3, 2, 2, 2, 1271, 1274, 5, 212, 107, 2, 1272, 1274, 5, 214, 108, 2, 1273, 1271, 3, 2, 2, 2, 1273, 1272, 3, 2, 2, 2, 1274, 211, 3, 2, 2, 2, 1275, 1276, 5, 74, 38, 2, 1276, 1277, 7, 57, 2, 2, 1277, 1278, 7, 172, 2, 2, 1278, 213, 3, 2, 2, 2, 1279, 1280, 5, 52, 27, 2, 1280, 1281, 7, 31, 2, 2, 1281, 1283, 7, 10, 2, 2, 1282, 1284, 5, 90, 46, 2, 1283, 1282, 3, 2, 2, 2, 1283, 1284, 3, 2, 2, 2, 1284, 1285, 3, 2, 2, 2, 1285, 1288, 7, 11, 2, 2, 1286, 1287, 7, 70, 2, 2, 1287, 1289, 5, 338, 170, 2, 1288, 1286, 3, 2, 2, 2, 1288, 1289, 3, 2, 2, 2, 1289, 1290, 3, 2, 2, 2, 1290, 1291, 7, 8, 2, 2, 1291, 1292, 5, 18, 10, 2, 1292, 1293, 7, 9, 2, 2, 1293, 215, 3, 2, 2, 2, 1294, 1295, 7, 115, 2, 2, 1295, 1296, 7, 124, 2, 2, 1296, 1297, 5, 96, 49, 2, 1297, 1298, 7, 122, 2, 2, 1298, 1302, 5, 96, 49, 2, 1299, 1300, 7, 71, 2, 2, 1300, 1301, 7, 126, 2, 2, 1301, 1303, 5, 96, 49, 2, 1302, 1299, 3, 2, 2, 2, 1302, 1303, 3, 2, 2, 2, 1303, 1318, 3, 2, 2, 2, 1304, 1305, 7, 115, 2, 2, 1305, 1306, 7, 124, 2, 2, 1306, 1311, 5, 350, 176, 2, 1307, 1308, 7, 15, 2, 2, 1308, 1310, 5, 350, 176, 2, 1309, 1307, 3, 2, 2, 2, 1310, 1313, 3, 2, 2, 2, 1311, 1309, 3, 2, 2, 2, 1311, 1312, 3, 2, 2, 2, 1312, 1314, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1314, 1315, 7, 122, 2, 2, 1315, 1316, 5, 96, 49, 2, 1316, 1318, 3, 2, 2, 2, 1317, 1294, 3, 2, 2, 2, 1317, 1304, 3, 2, 2, 2, 1318, 217, 3, 2, 2, 2, 1319, 1320, 7, 116, 2, 2, 1320, 1321, 7, 124, 2, 2, 1321, 1322, 5, 228, 115, 2, 1322, 219, 3, 2, 2, 2, 1323, 1324, 7, 117, 2, 2, 1324, 1325, 7, 124, 2, 2, 1325, 1326, 5, 228, 115, 2, 1326, 1327, 7, 70, 2, 2, 1327, 1328, 5, 96, 49, 2, 1328, 221, 3, 2, 2, 2, 1329, 1330, 7, 118, 2, 2, 1330, 1331, 7, 124, 2, 2, 1331, 1332, 7, 123, 2, 2, 1332, 1333, 7, 97, 2, 2, 1333, 1334, 5, 228, 115, 2, 1334, 1335, 7, 125, 2, 2, 1335, 1336, 5, 96, 49, 2, 1336, 223, 3, 2, 2, 2, 1337, 1338, 7, 119, 2, 2, 1338, 1339, 7, 124, 2, 2, 1339, 1344, 5, 230, 116, 2, 1340, 1341, 7, 15, 2, 2, 1341, 1343, 5, 230, 116, 2, 1342, 1340, 3, 2, 2, 2, 1343, 1346, 3, 2, 2, 2, 1344, 1342, 3, 2, 2, 2, 1344, 1345, 3, 2, 2, 2, 1345, 1347, 3, 2, 2, 2, 1346, 1344, 3, 2, 2, 2, 1347, 1348, 7, 120, 2, 2, 1348, 1349, 5, 96, 49, 2, 1349, 1350, 7, 67, 2, 2, 1350, 1351, 5, 96, 49, 2, 1351, 225, 3, 2, 2, 2, 1352, 1353, 7, 121, 2, 2, 1353, 1354, 7, 124, 2, 2, 1354, 1355, 5, 96, 49, 2, 1355, 1356, 7, 122, 2, 2, 1356, 1357, 5, 96, 49, 2, 1357, 227, 3, 2, 2, 2, 1358, 1361, 5, 190, 96, 2, 1359, 1362, 5, 182, 92, 2, 1360, 1362, 5, 188, 95, 2, 1361, 1359, 3, 2, 2, 2, 1361, 1360, 3, 2, 2, 2, 1362, 1363, 3, 2, 2, 2, 1363, 1361, 3, 2, 2, 2, 1363, 1364, 3, 2, 2, 2, 1364, 229, 3, 2, 2, 2, 1365, 1366, 5, 194, 98, 2, 1366, 1367, 7, 7, 2, 2, 1367, 1368, 5, 96, 49, 2, 1368, 231, 3, 2, 2, 2, 1369, 1370, 7, 133, 2, 2, 1370, 1372, 7, 134, 2, 2, 1371, 1373, 5, 234, 118, 2, 1372, 1371, 3, 2, 2, 2, 1372, 1373, 3, 2, 2, 2, 1373, 1374, 3, 2, 2, 2, 1374, 1384, 5, 354, 178, 2, 1375, 1376, 7, 71, 2, 2, 1376, 1381, 5, 354, 178, 2, 1377, 1378, 7, 15, 2, 2, 1378, 1380, 5, 354, 178, 2, 1379, 1377, 3, 2, 2, 2, 1380, 1383, 3, 2, 2, 2, 1381, 1379, 3, 2, 2, 2, 1381, 1382, 3, 2, 2, 2, 1382, 1385, 3, 2, 2, 2, 1383, 1381, 3, 2, 2, 2, 1384, 1375, 3, 2, 2, 2, 1384, 1385, 3, 2, 2, 2, 1385, 233, 3, 2, 2, 2, 1386, 1387, 7, 135, 2, 2, 1387, 1388, 7, 178, 2, 2, 1388, 1393, 7, 5, 2, 2, 1389, 1390, 7, 88, 2, 2, 1390, 1391, 7, 136, 2, 2, 1391, 1393, 7, 135, 2, 2, 1392, 1386, 3, 2, 2, 2, 1392, 1389, 3, 2, 2, 2, 1393, 235, 3, 2, 2, 2, 1394, 1396, 7, 137, 2, 2, 1395, 1397, 5, 238, 120, 2, 1396, 1395, 3, 2, 2, 2, 1396, 1397, 3, 2, 2, 2, 1397, 1402, 3, 2, 2, 2, 1398, 1399, 7, 138, 2, 2, 1399, 1402, 5, 238, 120, 2, 1400, 1402, 5, 238, 120, 2, 1401, 1394, 3, 2, 2, 2, 1401, 1398, 3, 2, 2, 2, 1401, 1400, 3, 2, 2, 2, 1402, 237, 3, 2, 2, 2, 1403, 1408, 5, 240, 121, 2, 1404, 1405, 9, 8, 2, 2, 1405, 1407, 5, 240, 121, 2, 1406, 1404, 3, 2, 2, 2, 1407, 1410, 3, 2, 2, 2, 1408, 1406, 3, 2, 2, 2, 1408, 1409, 3, 2, 2, 2, 1409, 239, 3, 2, 2, 2, 1410, 1408, 3, 2, 2, 2, 1411, 1414, 5, 180, 91, 2, 1412, 1414, 5, 242, 122, 2, 1413, 1411, 3, 2, 2, 2, 1413, 1412, 3, 2, 2, 2, 1414, 241, 3, 2, 2, 2, 1415, 1418, 5, 250, 126, 2, 1416, 1418, 5, 244, 123, 2, 1417, 1415, 3, 2, 2, 2, 1417, 1416, 3, 2, 2, 2, 1418, 1419, 3, 2, 2, 2, 1419, 1420, 5, 266, 134, 2, 1420, 243, 3, 2, 2, 2, 1421, 1422, 5, 246, 124, 2, 1422, 1423, 5, 256, 129, 2, 1423, 1426, 3, 2, 2, 2, 1424, 1426, 5, 248, 125, 2, 1425, 1421, 3, 2, 2, 2, 1425, 1424, 3, 2, 2, 2, 1426, 245, 3, 2, 2, 2, 1427, 1428, 9, 9, 2, 2, 1428, 1429, 7, 19, 2, 2, 1429, 1430, 7, 19, 2, 2, 1430, 247, 3, 2, 2, 2, 1431, 1433, 7, 139, 2, 2, 1432, 1431, 3, 2, 2, 2, 1432, 1433, 3, 2, 2, 2, 1433, 1434, 3, 2, 2, 2, 1434, 1435, 5, 256, 129, 2, 1435, 249, 3, 2, 2, 2, 1436, 1437, 5, 252, 127, 2, 1437, 1438, 5, 256, 129, 2, 1438, 1441, 3, 2, 2, 2, 1439, 1441, 5, 254, 128, 2, 1440, 1436, 3, 2, 2, 2, 1440, 1439, 3, 2, 2, 2, 1441, 251, 3, 2, 2, 2, 1442, 1443, 9, 10, 2, 2, 1443, 1444, 7, 19, 2, 2, 1444, 1445, 7, 19, 2, 2, 1445, 253, 3, 2, 2, 2, 1446, 1447, 7, 58, 2, 2, 1447, 255, 3, 2, 2, 2, 1448, 1451, 5, 258, 130, 2, 1449, 1451, 5, 272, 137, 2, 1450, 1448, 3, 2, 2, 2, 1450, 1449, 3, 2, 2, 2, 1451, 257, 3, 2, 2, 2, 1452, 1453, 5, 74, 38, 2, 1453, 1454, 5, 260, 131, 2, 1454, 259, 3, 2, 2, 2, 1455, 1459, 7, 12, 2, 2, 1456, 1459, 5, 262, 132, 2, 1457, 1459, 5, 264, 133, 2, 1458, 1455, 3, 2, 2, 2, 1458, 1456, 3, 2, 2, 2, 1458, 1457, 3, 2, 2, 2, 1459, 261, 3, 2, 2, 2, 1460, 1461, 7, 178, 2, 2, 1461, 1462, 7, 19, 2, 2, 1462, 1463, 7, 12, 2, 2, 1463, 263, 3, 2, 2, 2, 1464, 1465, 7, 12, 2, 2, 1465, 1466, 7, 19, 2, 2, 1466, 1467, 7, 178, 2, 2, 1467, 265, 3, 2, 2, 2, 1468, 1470, 5, 186, 94, 2, 1469, 1468, 3, 2, 2, 2, 1470, 1473, 3, 2, 2, 2, 1471, 1469, 3, 2, 2, 2, 1471, 1472, 3, 2, 2, 2, 1472, 267, 3, 2, 2, 2, 1473, 1471, 3, 2, 2, 2, 1474, 1486, 5, 74, 38, 2, 1475, 1486, 7, 171, 2, 2, 1476, 1486, 5, 272, 137, 2, 1477, 1478, 7, 113, 2, 2, 1478, 1479, 7, 10, 2, 2, 1479, 1486, 7, 11, 2, 2, 1480, 1486, 5, 342, 172, 2, 1481, 1486, 5, 310, 156, 2, 1482, 1486, 5, 316, 159, 2, 1483, 1486, 5, 270, 136, 2, 1484, 1486, 5, 322, 162, 2, 1485, 1474, 3, 2, 2, 2, 1485, 1475, 3, 2, 2, 2, 1485, 1476, 3, 2, 2, 2, 1485, 1477, 3, 2, 2, 2, 1485, 1480, 3, 2, 2, 2, 1485, 1481, 3, 2, 2, 2, 1485, 1482, 3, 2, 2, 2, 1485, 1483, 3, 2, 2, 2, 1485, 1484, 3, 2, 2, 2, 1486, 269, 3, 2, 2, 2, 1487, 1488, 5, 74, 38, 2, 1488, 271, 3, 2, 2, 2, 1489, 1502, 5, 278, 140, 2, 1490, 1502, 5, 294, 148, 2, 1491, 1502, 5, 288, 145, 2, 1492, 1502, 5, 298, 150, 2, 1493, 1502, 5, 292, 147, 2, 1494, 1502, 5, 286, 144, 2, 1495, 1502, 5, 282, 142, 2, 1496, 1502, 5, 280, 141, 2, 1497, 1502, 5, 284, 143, 2, 1498, 1502, 5, 326, 164, 2, 1499, 1502, 5, 276, 139, 2, 1500, 1502, 5, 274, 138, 2, 1501, 1489, 3, 2, 2, 2, 1501, 1490, 3, 2, 2, 2, 1501, 1491, 3, 2, 2, 2, 1501, 1492, 3, 2, 2, 2, 1501, 1493, 3, 2, 2, 2, 1501, 1494, 3, 2, 2, 2, 1501, 1495, 3, 2, 2, 2, 1501, 1496, 3, 2, 2, 2, 1501, 1497, 3, 2, 2, 2, 1501, 1498, 3, 2, 2, 2, 1501, 1499, 3, 2, 2, 2, 1501, 1500, 3, 2, 2, 2, 1502, 273, 3, 2, 2, 2, 1503, 1504, 7, 152, 2, 2, 1504, 1506, 7, 10, 2, 2, 1505, 1507, 7, 12, 2, 2, 1506, 1505, 3, 2, 2, 2, 1506, 1507, 3, 2, 2, 2, 1507, 1508, 3, 2, 2, 2, 1508, 1509, 7, 11, 2, 2, 1509, 275, 3, 2, 2, 2, 1510, 1511, 7, 153, 2, 2, 1511, 1512, 7, 10, 2, 2, 1512, 1513, 7, 11, 2, 2, 1513, 277, 3, 2, 2, 2, 1514, 1515, 7, 155, 2, 2, 1515, 1518, 7, 10, 2, 2, 1516, 1519, 5, 294, 148, 2, 1517, 1519, 5, 298, 150, 2, 1518, 1516, 3, 2, 2, 2, 1518, 1517, 3, 2, 2, 2, 1518, 1519, 3, 2, 2, 2, 1519, 1520, 3, 2, 2, 2, 1520, 1521, 7, 11, 2, 2, 1521, 279, 3, 2, 2, 2, 1522, 1523, 7, 156, 2, 2, 1523, 1524, 7, 10, 2, 2, 1524, 1525, 7, 11, 2, 2, 1525, 281, 3, 2, 2, 2, 1526, 1527, 7, 166, 2, 2, 1527, 1528, 7, 10, 2, 2, 1528, 1529, 7, 11, 2, 2, 1529, 283, 3, 2, 2, 2, 1530, 1531, 7, 158, 2, 2, 1531, 1532, 7, 10, 2, 2, 1532, 1533, 7, 11, 2, 2, 1533, 285, 3, 2, 2, 2, 1534, 1535, 7, 157, 2, 2, 1535, 1538, 7, 10, 2, 2, 1536, 1539, 7, 178, 2, 2, 1537, 1539, 5, 356, 179, 2, 1538, 1536, 3, 2, 2, 2, 1538, 1537, 3, 2, 2, 2, 1538, 1539, 3, 2, 2, 2, 1539, 1540, 3, 2, 2, 2, 1540, 1541, 7, 11, 2, 2, 1541, 287, 3, 2, 2, 2, 1542, 1543, 7, 142, 2, 2, 1543, 1549, 7, 10, 2, 2, 1544, 1547, 5, 290, 146, 2, 1545, 1546, 7, 15, 2, 2, 1546, 1548, 5, 308, 155, 2, 1547, 1545, 3, 2, 2, 2, 1547, 1548, 3, 2, 2, 2, 1548, 1550, 3, 2, 2, 2, 1549, 1544, 3, 2, 2, 2, 1549, 1550, 3, 2, 2, 2, 1550, 1551, 3, 2, 2, 2, 1551, 1552, 7, 11, 2, 2, 1552, 289, 3, 2, 2, 2, 1553, 1556, 5, 302, 152, 2, 1554, 1556, 7, 12, 2, 2, 1555, 1553, 3, 2, 2, 2, 1555, 1554, 3, 2, 2, 2, 1556, 291, 3, 2, 2, 2, 1557, 1558, 7, 159, 2, 2, 1558, 1559, 7, 10, 2, 2, 1559, 1560, 5, 324, 163, 2, 1560, 1561, 7, 11, 2, 2, 1561, 293, 3, 2, 2, 2, 1562, 1563, 7, 136, 2, 2, 1563, 1572, 7, 10, 2, 2, 1564, 1570, 5, 296, 149, 2, 1565, 1566, 7, 15, 2, 2, 1566, 1568, 5, 308, 155, 2, 1567, 1569, 7, 170, 2, 2, 1568, 1567, 3, 2, 2, 2, 1568, 1569, 3, 2, 2, 2, 1569, 1571, 3, 2, 2, 2, 1570, 1565, 3, 2, 2, 2, 1570, 1571, 3, 2, 2, 2, 1571, 1573, 3, 2, 2, 2, 1572, 1564, 3, 2, 2, 2, 1572, 1573, 3, 2, 2, 2, 1573, 1574, 3, 2, 2, 2, 1574, 1575, 7, 11, 2, 2, 1575, 295, 3, 2, 2, 2, 1576, 1579, 5, 304, 153, 2, 1577, 1579, 7, 12, 2, 2, 1578, 1576, 3, 2, 2, 2, 1578, 1577, 3, 2, 2, 2, 1579, 297, 3, 2, 2, 2, 1580, 1581, 7, 160, 2, 2, 1581, 1582, 7, 10, 2, 2, 1582, 1583, 5, 300, 151, 2, 1583, 1584, 7, 11, 2, 2, 1584, 299, 3, 2, 2, 2, 1585, 1586, 5, 304, 153, 2, 1586, 301, 3, 2, 2, 2, 1587, 1588, 5, 74, 38, 2, 1588, 303, 3, 2, 2, 2, 1589, 1590, 5, 74, 38, 2, 1590, 305, 3, 2, 2, 2, 1591, 1592, 5, 308, 155, 2, 1592, 307, 3, 2, 2, 2, 1593, 1594, 5, 74, 38, 2, 1594, 309, 3, 2, 2, 2, 1595, 1598, 5, 312, 157, 2, 1596, 1598, 5, 314, 158, 2, 1597, 1595, 3, 2, 2, 2, 1597, 1596, 3, 2, 2, 2, 1598, 311, 3, 2, 2, 2, 1599, 1600, 7, 168, 2, 2, 1600, 1601, 7, 10, 2, 2, 1601, 1602, 7, 12, 2, 2, 1602, 1603, 7, 11, 2, 2, 1603, 313, 3, 2, 2, 2, 1604, 1605, 7, 168, 2, 2, 1605, 1606, 7, 10, 2, 2, 1606, 1607, 5, 74, 38, 2, 1607, 1608, 7, 15, 2, 2, 1608, 1609, 5, 338, 170, 2, 1609, 1610, 7, 11, 2, 2, 1610, 315, 3, 2, 2, 2, 1611, 1614, 5, 318, 160, 2, 1612, 1614, 5, 320, 161, 2, 1613, 1611, 3, 2, 2, 2, 1613, 1612, 3, 2, 2, 2, 1614, 317, 3, 2, 2, 2, 1615, 1616, 7, 167, 2, 2, 1616, 1617, 7, 10, 2, 2, 1617, 1618, 7, 12, 2, 2, 1618, 1619, 7, 11, 2, 2, 1619, 319, 3, 2, 2, 2, 1620, 1621, 7, 167, 2, 2, 1621, 1622, 7, 10, 2, 2, 1622, 1623, 5, 338, 170, 2, 1623, 1624, 7, 11, 2, 2, 1624, 321, 3, 2, 2, 2, 1625, 1626, 7, 10, 2, 2, 1626, 1627, 5, 268, 135, 2, 1627, 1628, 7, 11, 2, 2, 1628, 323, 3, 2, 2, 2, 1629, 1630, 5, 302, 152, 2, 1630, 325, 3, 2, 2, 2, 1631, 1637, 5, 328, 165, 2, 1632, 1637, 5, 330, 166, 2, 1633, 1637, 5, 332, 167, 2, 1634, 1637, 5, 334, 168, 2, 1635, 1637, 5, 336, 169, 2, 1636, 1631, 3, 2, 2, 2, 1636, 1632, 3, 2, 2, 2, 1636, 1633, 3, 2, 2, 2, 1636, 1634, 3, 2, 2, 2, 1636, 1635, 3, 2, 2, 2, 1637, 327, 3, 2, 2, 2, 1638, 1639, 7, 161, 2, 2, 1639, 1641, 7, 10, 2, 2, 1640, 1642, 5, 356, 179, 2, 1641, 1640, 3, 2, 2, 2, 1641, 1642, 3, 2, 2, 2, 1642, 1643, 3, 2, 2, 2, 1643, 1644, 7, 11, 2, 2, 1644, 329, 3, 2, 2, 2, 1645, 1646, 7, 165, 2, 2, 1646, 1648, 7, 10, 2, 2, 1647, 1649, 5, 356, 179, 2, 1648, 1647, 3, 2, 2, 2, 1648, 1649, 3, 2, 2, 2, 1649, 1650, 3, 2, 2, 2, 1650, 1651, 7, 11, 2, 2, 1651, 331, 3, 2, 2, 2, 1652, 1653, 7, 164, 2, 2, 1653, 1655, 7, 10, 2, 2, 1654, 1656, 5, 356, 179, 2, 1655, 1654, 3, 2, 2, 2, 1655, 1656, 3, 2, 2, 2, 1656, 1657, 3, 2, 2, 2, 1657, 1658, 7, 11, 2, 2, 1658, 333, 3, 2, 2, 2, 1659, 1660, 7, 162, 2, 2, 1660, 1662, 7, 10, 2, 2, 1661, 1663, 5, 356, 179, 2, 1662, 1661, 3, 2, 2, 2, 1662, 1663, 3, 2, 2, 2, 1663, 1664, 3, 2, 2, 2, 1664, 1665, 7, 11, 2, 2, 1665, 335, 3, 2, 2, 2, 1666, 1667, 7, 163, 2, 2, 1667, 1669, 7, 10, 2, 2, 1668, 1670, 5, 356, 179, 2, 1669, 1668, 3, 2, 2, 2, 1669, 1670, 3, 2, 2, 2, 1670, 1671, 3, 2, 2, 2, 1671, 1672, 7, 11, 2, 2, 1672, 337, 3, 2, 2, 2, 1673, 1674, 7, 10, 2, 2, 1674, 1682, 7, 11, 2, 2, 1675, 1679, 5, 268, 135, 2, 1676, 1680, 7, 170, 2, 2, 1677, 1680, 7, 12, 2, 2, 1678, 1680, 7, 47, 2, 2, 1679, 1676, 3, 2, 2, 2, 1679, 1677, 3, 2, 2, 2, 1679, 1678, 3, 2, 2, 2, 1679, 1680, 3, 2, 2, 2, 1680, 1682, 3, 2, 2, 2, 1681, 1673, 3, 2, 2, 2, 1681, 1675, 3, 2, 2, 2, 1682, 339, 3, 2, 2, 2, 1683, 1692, 7, 8, 2, 2, 1684, 1689, 5, 350, 176, 2, 1685, 1686, 7, 15, 2, 2, 1686, 1688, 5, 350, 176, 2, 1687, 1685, 3, 2, 2, 2, 1688, 1691, 3, 2, 2, 2, 1689, 1687, 3, 2, 2, 2, 1689, 1690, 3, 2, 2, 2, 1690, 1693, 3, 2, 2, 2, 1691, 1689, 3, 2, 2, 2, 1692, 1684, 3, 2, 2, 2, 1692, 1693, 3, 2, 2, 2, 1693, 1694, 3, 2, 2, 2, 1694, 1700, 7, 9, 2, 2, 1695, 1696, 7, 59, 2, 2, 1696, 1697, 5, 94, 48, 2, 1697, 1698, 7, 60, 2, 2, 1698, 1700, 3, 2, 2, 2, 1699, 1683, 3, 2, 2, 2, 1699, 1695, 3, 2, 2, 2, 1700, 341, 3, 2, 2, 2, 1701, 1704, 5, 344, 173, 2, 1702, 1704, 5, 346, 174, 2, 1703, 1701, 3, 2, 2, 2, 1703, 1702, 3, 2, 2, 2, 1704, 343, 3, 2, 2, 2, 1705, 1706, 7, 31, 2, 2, 1706, 1707, 7, 10, 2, 2, 1707, 1708, 7, 12, 2, 2, 1708, 1709, 7, 11, 2, 2, 1709, 345, 3, 2, 2, 2, 1710, 1711, 7, 31, 2, 2, 1711, 1720, 7, 10, 2, 2, 1712, 1717, 5, 338, 170, 2, 1713, 1714, 7, 15, 2, 2, 1714, 1716, 5, 338, 170, 2, 1715, 1713, 3, 2, 2, 2, 1716, 1719, 3, 2, 2, 2, 1717, 1715, 3, 2, 2, 2, 1717, 1718, 3, 2, 2, 2, 1718, 1721, 3, 2, 2, 2, 1719, 1717, 3, 2, 2, 2, 1720, 1712, 3, 2, 2, 2, 1720, 1721, 3, 2, 2, 2, 1721, 1722, 3, 2, 2, 2, 1722, 1723, 7, 11, 2, 2, 1723, 1724, 7, 70, 2, 2, 1724, 1725, 5, 338, 170, 2, 1725, 347, 3, 2, 2, 2, 1726, 1728, 5, 268, 135, 2, 1727, 1729, 7, 170, 2, 2, 1728, 1727, 3, 2, 2, 2, 1728, 1729, 3, 2, 2, 2, 1729, 349, 3, 2, 2, 2, 1730, 1733, 5, 96, 49, 2, 1731, 1733, 7, 178, 2, 2, 1732, 1730, 3, 2, 2, 2, 1732, 1731, 3, 2, 2, 2, 1733, 1734, 3, 2, 2, 2, 1734, 1735, 9, 11, 2, 2, 1735, 1736, 5, 96, 49, 2, 1736, 351, 3, 2, 2, 2, 1737, 1739, 7, 53, 2, 2, 1738, 1740, 5, 94, 48, 2, 1739, 1738, 3, 2, 2, 2, 1739, 1740, 3, 2, 2, 2, 1740, 1741, 3, 2, 2, 2, 1741, 1742, 7, 54, 2, 2, 1742, 353, 3, 2, 2, 2, 1743, 1744, 5, 356, 179, 2, 1744, 355, 3, 2, 2, 2, 1745, 1746, 7, 169, 2, 2, 1746, 357, 3, 2, 2, 2, 1747, 1748, 9, 12, 2, 2, 1748, 359, 3, 2, 2, 2, 168, 368, 372, 388, 394, 402, 410, 418, 433, 463, 471, 473, 495, 505, 515, 520, 525, 529, 541, 545, 554, 561, 575, 579, 584, 594, 602, 606, 618, 630, 652, 660, 665, 668, 672, 681, 690, 693, 701, 708, 710, 717, 724, 726, 734, 739, 746, 753, 763, 770, 777, 784, 793, 803, 807, 815, 817, 829, 835, 839, 843, 854, 860, 875, 881, 885, 889, 896, 903, 909, 914, 916, 920, 927, 934, 943, 955, 965, 977, 981, 990, 997, 1019, 1024, 1029, 1033, 1045, 1053, 1057, 1064, 1071, 1077, 1084, 1092, 1099, 1105, 1111, 1117, 1123, 1134, 1140, 1145, 1153, 1174, 1183, 1185, 1208, 1225, 1236, 1258, 1262, 1269, 1273, 1283, 1288, 1302, 1311, 1317, 1344, 1361, 1363, 1372, 1381, 1384, 1392, 1396, 1401, 1408, 1413, 1417, 1425, 1432, 1440, 1450, 1458, 1471, 1485, 1501, 1506, 1518, 1538, 1547, 1549, 1555, 1568, 1570, 1572, 1578, 1597, 1613, 1636, 1641, 1648, 1655, 1662, 1669, 1679, 1681, 1689, 1692, 1699, 1703, 1717, 1720, 1728, 1732, 1739] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 180, 1751, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 369, 10, 3, 3, 3, 3, 3, 5, 3, 373, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 389, 10, 6, 3, 6, 3, 6, 7, 6, 393, 10, 6, 12, 6, 14, 6, 396, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 401, 10, 6, 12, 6, 14, 6, 404, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 409, 10, 8, 12, 8, 14, 8, 412, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 419, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 434, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 464, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 472, 10, 18, 12, 18, 14, 18, 475, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 494, 10, 20, 13, 20, 14, 20, 495, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 504, 10, 21, 13, 21, 14, 21, 505, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 514, 10, 22, 13, 22, 14, 22, 515, 3, 23, 3, 23, 3, 23, 5, 23, 521, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 526, 10, 23, 7, 23, 528, 10, 23, 12, 23, 14, 23, 531, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 540, 10, 24, 13, 24, 14, 24, 541, 3, 24, 3, 24, 5, 24, 546, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 555, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 560, 10, 25, 12, 25, 14, 25, 563, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 574, 10, 26, 12, 26, 14, 26, 577, 11, 26, 3, 26, 5, 26, 580, 10, 26, 3, 27, 7, 27, 583, 10, 27, 12, 27, 14, 27, 586, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 593, 10, 28, 12, 28, 14, 28, 596, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 603, 10, 29, 3, 29, 3, 29, 5, 29, 607, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 619, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 631, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 653, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 659, 10, 37, 12, 37, 14, 37, 662, 11, 37, 3, 38, 3, 38, 5, 38, 666, 10, 38, 3, 38, 5, 38, 669, 10, 38, 3, 38, 3, 38, 5, 38, 673, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 682, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 689, 10, 40, 12, 40, 14, 40, 692, 11, 40, 5, 40, 694, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 702, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 709, 10, 41, 5, 41, 711, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 718, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 725, 10, 42, 5, 42, 727, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 735, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 740, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 747, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 754, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 764, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 769, 10, 46, 12, 46, 14, 46, 772, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 778, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 783, 10, 48, 12, 48, 14, 48, 786, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 794, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 804, 10, 50, 3, 51, 3, 51, 5, 51, 808, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 816, 10, 51, 12, 51, 14, 51, 819, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 828, 10, 52, 12, 52, 14, 52, 831, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 836, 10, 53, 3, 53, 3, 53, 5, 53, 840, 10, 53, 3, 53, 3, 53, 5, 53, 844, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 853, 10, 54, 12, 54, 14, 54, 856, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 861, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 874, 10, 57, 12, 57, 14, 57, 877, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 882, 10, 58, 3, 58, 3, 58, 5, 58, 886, 10, 58, 3, 58, 3, 58, 5, 58, 890, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 897, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 902, 10, 59, 12, 59, 14, 59, 905, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 910, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 915, 10, 60, 5, 60, 917, 10, 60, 3, 60, 3, 60, 5, 60, 921, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 928, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 933, 10, 62, 12, 62, 14, 62, 936, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 944, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 954, 10, 64, 13, 64, 14, 64, 955, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 964, 10, 65, 13, 65, 14, 65, 965, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 976, 10, 66, 13, 66, 14, 66, 977, 3, 66, 3, 66, 5, 66, 982, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 991, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 996, 10, 67, 12, 67, 14, 67, 999, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 1018, 10, 69, 13, 69, 14, 69, 1019, 3, 70, 3, 70, 3, 70, 5, 70, 1025, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 1030, 10, 70, 7, 70, 1032, 10, 70, 12, 70, 14, 70, 1035, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 1044, 10, 71, 12, 71, 14, 71, 1047, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 1052, 10, 72, 12, 72, 14, 72, 1055, 11, 72, 3, 73, 5, 73, 1058, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 1065, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 1070, 10, 75, 12, 75, 14, 75, 1073, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 1078, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 1083, 10, 77, 12, 77, 14, 77, 1086, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 1091, 10, 78, 12, 78, 14, 78, 1094, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 1100, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1106, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1112, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1118, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1124, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1133, 10, 84, 12, 84, 14, 84, 1136, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1141, 10, 85, 3, 86, 7, 86, 1144, 10, 86, 12, 86, 14, 86, 1147, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1154, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1173, 10, 90, 12, 90, 14, 90, 1176, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1184, 10, 91, 12, 91, 14, 91, 1187, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1209, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1226, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1237, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1259, 10, 104, 7, 104, 1261, 10, 104, 12, 104, 14, 104, 1264, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1270, 10, 105, 3, 106, 3, 106, 5, 106, 1274, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1284, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1289, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1303, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1310, 10, 109, 12, 109, 14, 109, 1313, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1318, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1343, 10, 113, 12, 113, 14, 113, 1346, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1362, 10, 115, 13, 115, 14, 115, 1363, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 5, 117, 1373, 10, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 7, 117, 1380, 10, 117, 12, 117, 14, 117, 1383, 11, 117, 5, 117, 1385, 10, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 5, 118, 1393, 10, 118, 3, 119, 3, 119, 5, 119, 1397, 10, 119, 3, 119, 3, 119, 3, 119, 5, 119, 1402, 10, 119, 3, 120, 3, 120, 3, 120, 7, 120, 1407, 10, 120, 12, 120, 14, 120, 1410, 11, 120, 3, 121, 3, 121, 5, 121, 1414, 10, 121, 3, 122, 3, 122, 5, 122, 1418, 10, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 5, 123, 1426, 10, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 5, 125, 1433, 10, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 5, 126, 1441, 10, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 129, 3, 129, 5, 129, 1451, 10, 129, 3, 130, 3, 130, 5, 130, 1455, 10, 130, 3, 131, 3, 131, 3, 131, 5, 131, 1460, 10, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 7, 134, 1471, 10, 134, 12, 134, 14, 134, 1474, 11, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 5, 135, 1487, 10, 135, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 5, 137, 1503, 10, 137, 3, 138, 3, 138, 3, 138, 5, 138, 1508, 10, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 5, 140, 1520, 10, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 5, 144, 1540, 10, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 5, 145, 1549, 10, 145, 5, 145, 1551, 10, 145, 3, 145, 3, 145, 3, 146, 3, 146, 5, 146, 1557, 10, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 5, 148, 1570, 10, 148, 5, 148, 1572, 10, 148, 5, 148, 1574, 10, 148, 3, 148, 3, 148, 3, 149, 3, 149, 5, 149, 1580, 10, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 153, 3, 153, 3, 154, 3, 154, 3, 155, 3, 155, 3, 156, 3, 156, 5, 156, 1599, 10, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 5, 159, 1615, 10, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 5, 164, 1638, 10, 164, 3, 165, 3, 165, 3, 165, 5, 165, 1643, 10, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 5, 166, 1650, 10, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 5, 167, 1657, 10, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 5, 168, 1664, 10, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 5, 169, 1671, 10, 169, 3, 169, 3, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 5, 170, 1681, 10, 170, 5, 170, 1683, 10, 170, 3, 171, 3, 171, 3, 171, 3, 171, 7, 171, 1689, 10, 171, 12, 171, 14, 171, 1692, 11, 171, 5, 171, 1694, 10, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 5, 171, 1701, 10, 171, 3, 172, 3, 172, 5, 172, 1705, 10, 172, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 7, 174, 1717, 10, 174, 12, 174, 14, 174, 1720, 11, 174, 5, 174, 1722, 10, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 175, 3, 175, 5, 175, 1730, 10, 175, 3, 176, 3, 176, 5, 176, 1734, 10, 176, 3, 176, 3, 176, 3, 176, 3, 177, 3, 177, 5, 177, 1741, 10, 177, 3, 177, 3, 177, 3, 178, 3, 178, 3, 179, 3, 179, 3, 180, 3, 180, 3, 180, 2, 2, 181, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 2, 13, 4, 2, 17, 17, 105, 105, 3, 2, 82, 83, 3, 2, 20, 29, 4, 2, 5, 5, 35, 45, 3, 2, 47, 48, 4, 2, 12, 12, 49, 51, 3, 2, 137, 138, 3, 2, 140, 146, 3, 2, 147, 151, 4, 2, 19, 19, 170, 170, 4, 2, 61, 132, 171, 171, 2, 1822, 2, 360, 3, 2, 2, 2, 4, 368, 3, 2, 2, 2, 6, 374, 3, 2, 2, 2, 8, 377, 3, 2, 2, 2, 10, 394, 3, 2, 2, 2, 12, 405, 3, 2, 2, 2, 14, 410, 3, 2, 2, 2, 16, 413, 3, 2, 2, 2, 18, 416, 3, 2, 2, 2, 20, 433, 3, 2, 2, 2, 22, 435, 3, 2, 2, 2, 24, 438, 3, 2, 2, 2, 26, 444, 3, 2, 2, 2, 28, 448, 3, 2, 2, 2, 30, 452, 3, 2, 2, 2, 32, 456, 3, 2, 2, 2, 34, 463, 3, 2, 2, 2, 36, 479, 3, 2, 2, 2, 38, 488, 3, 2, 2, 2, 40, 503, 3, 2, 2, 2, 42, 510, 3, 2, 2, 2, 44, 517, 3, 2, 2, 2, 46, 534, 3, 2, 2, 2, 48, 550, 3, 2, 2, 2, 50, 567, 3, 2, 2, 2, 52, 584, 3, 2, 2, 2, 54, 587, 3, 2, 2, 2, 56, 599, 3, 2, 2, 2, 58, 608, 3, 2, 2, 2, 60, 618, 3, 2, 2, 2, 62, 620, 3, 2, 2, 2, 64, 630, 3, 2, 2, 2, 66, 632, 3, 2, 2, 2, 68, 637, 3, 2, 2, 2, 70, 641, 3, 2, 2, 2, 72, 647, 3, 2, 2, 2, 74, 668, 3, 2, 2, 2, 76, 674, 3, 2, 2, 2, 78, 676, 3, 2, 2, 2, 80, 695, 3, 2, 2, 2, 82, 712, 3, 2, 2, 2, 84, 728, 3, 2, 2, 2, 86, 748, 3, 2, 2, 2, 88, 763, 3, 2, 2, 2, 90, 765, 3, 2, 2, 2, 92, 773, 3, 2, 2, 2, 94, 779, 3, 2, 2, 2, 96, 793, 3, 2, 2, 2, 98, 803, 3, 2, 2, 2, 100, 807, 3, 2, 2, 2, 102, 823, 3, 2, 2, 2, 104, 832, 3, 2, 2, 2, 106, 848, 3, 2, 2, 2, 108, 857, 3, 2, 2, 2, 110, 865, 3, 2, 2, 2, 112, 868, 3, 2, 2, 2, 114, 878, 3, 2, 2, 2, 116, 896, 3, 2, 2, 2, 118, 906, 3, 2, 2, 2, 120, 922, 3, 2, 2, 2, 122, 927, 3, 2, 2, 2, 124, 940, 3, 2, 2, 2, 126, 948, 3, 2, 2, 2, 128, 963, 3, 2, 2, 2, 130, 970, 3, 2, 2, 2, 132, 986, 3, 2, 2, 2, 134, 1003, 3, 2, 2, 2, 136, 1012, 3, 2, 2, 2, 138, 1021, 3, 2, 2, 2, 140, 1040, 3, 2, 2, 2, 142, 1048, 3, 2, 2, 2, 144, 1057, 3, 2, 2, 2, 146, 1061, 3, 2, 2, 2, 148, 1066, 3, 2, 2, 2, 150, 1074, 3, 2, 2, 2, 152, 1079, 3, 2, 2, 2, 154, 1087, 3, 2, 2, 2, 156, 1095, 3, 2, 2, 2, 158, 1101, 3, 2, 2, 2, 160, 1107, 3, 2, 2, 2, 162, 1113, 3, 2, 2, 2, 164, 1119, 3, 2, 2, 2, 166, 1125, 3, 2, 2, 2, 168, 1140, 3, 2, 2, 2, 170, 1145, 3, 2, 2, 2, 172, 1153, 3, 2, 2, 2, 174, 1155, 3, 2, 2, 2, 176, 1162, 3, 2, 2, 2, 178, 1169, 3, 2, 2, 2, 180, 1177, 3, 2, 2, 2, 182, 1188, 3, 2, 2, 2, 184, 1194, 3, 2, 2, 2, 186, 1197, 3, 2, 2, 2, 188, 1201, 3, 2, 2, 2, 190, 1225, 3, 2, 2, 2, 192, 1227, 3, 2, 2, 2, 194, 1231, 3, 2, 2, 2, 196, 1234, 3, 2, 2, 2, 198, 1240, 3, 2, 2, 2, 200, 1242, 3, 2, 2, 2, 202, 1247, 3, 2, 2, 2, 204, 1252, 3, 2, 2, 2, 206, 1255, 3, 2, 2, 2, 208, 1269, 3, 2, 2, 2, 210, 1273, 3, 2, 2, 2, 212, 1275, 3, 2, 2, 2, 214, 1279, 3, 2, 2, 2, 216, 1317, 3, 2, 2, 2, 218, 1319, 3, 2, 2, 2, 220, 1323, 3, 2, 2, 2, 222, 1329, 3, 2, 2, 2, 224, 1337, 3, 2, 2, 2, 226, 1352, 3, 2, 2, 2, 228, 1358, 3, 2, 2, 2, 230, 1365, 3, 2, 2, 2, 232, 1369, 3, 2, 2, 2, 234, 1392, 3, 2, 2, 2, 236, 1401, 3, 2, 2, 2, 238, 1403, 3, 2, 2, 2, 240, 1413, 3, 2, 2, 2, 242, 1417, 3, 2, 2, 2, 244, 1425, 3, 2, 2, 2, 246, 1427, 3, 2, 2, 2, 248, 1432, 3, 2, 2, 2, 250, 1440, 3, 2, 2, 2, 252, 1442, 3, 2, 2, 2, 254, 1446, 3, 2, 2, 2, 256, 1450, 3, 2, 2, 2, 258, 1454, 3, 2, 2, 2, 260, 1459, 3, 2, 2, 2, 262, 1461, 3, 2, 2, 2, 264, 1465, 3, 2, 2, 2, 266, 1472, 3, 2, 2, 2, 268, 1486, 3, 2, 2, 2, 270, 1488, 3, 2, 2, 2, 272, 1502, 3, 2, 2, 2, 274, 1504, 3, 2, 2, 2, 276, 1511, 3, 2, 2, 2, 278, 1515, 3, 2, 2, 2, 280, 1523, 3, 2, 2, 2, 282, 1527, 3, 2, 2, 2, 284, 1531, 3, 2, 2, 2, 286, 1535, 3, 2, 2, 2, 288, 1543, 3, 2, 2, 2, 290, 1556, 3, 2, 2, 2, 292, 1558, 3, 2, 2, 2, 294, 1563, 3, 2, 2, 2, 296, 1579, 3, 2, 2, 2, 298, 1581, 3, 2, 2, 2, 300, 1586, 3, 2, 2, 2, 302, 1588, 3, 2, 2, 2, 304, 1590, 3, 2, 2, 2, 306, 1592, 3, 2, 2, 2, 308, 1594, 3, 2, 2, 2, 310, 1598, 3, 2, 2, 2, 312, 1600, 3, 2, 2, 2, 314, 1605, 3, 2, 2, 2, 316, 1614, 3, 2, 2, 2, 318, 1616, 3, 2, 2, 2, 320, 1621, 3, 2, 2, 2, 322, 1626, 3, 2, 2, 2, 324, 1630, 3, 2, 2, 2, 326, 1637, 3, 2, 2, 2, 328, 1639, 3, 2, 2, 2, 330, 1646, 3, 2, 2, 2, 332, 1653, 3, 2, 2, 2, 334, 1660, 3, 2, 2, 2, 336, 1667, 3, 2, 2, 2, 338, 1682, 3, 2, 2, 2, 340, 1700, 3, 2, 2, 2, 342, 1704, 3, 2, 2, 2, 344, 1706, 3, 2, 2, 2, 346, 1711, 3, 2, 2, 2, 348, 1727, 3, 2, 2, 2, 350, 1733, 3, 2, 2, 2, 352, 1738, 3, 2, 2, 2, 354, 1744, 3, 2, 2, 2, 356, 1746, 3, 2, 2, 2, 358, 1748, 3, 2, 2, 2, 360, 361, 5, 4, 3, 2, 361, 362, 7, 2, 2, 3, 362, 3, 3, 2, 2, 2, 363, 364, 7, 104, 2, 2, 364, 365, 7, 103, 2, 2, 365, 366, 5, 356, 179, 2, 366, 367, 7, 3, 2, 2, 367, 369, 3, 2, 2, 2, 368, 363, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 373, 5, 8, 5, 2, 371, 373, 5, 6, 4, 2, 372, 370, 3, 2, 2, 2, 372, 371, 3, 2, 2, 2, 373, 5, 3, 2, 2, 2, 374, 375, 5, 10, 6, 2, 375, 376, 5, 12, 7, 2, 376, 7, 3, 2, 2, 2, 377, 378, 7, 4, 2, 2, 378, 379, 7, 135, 2, 2, 379, 380, 7, 178, 2, 2, 380, 381, 7, 5, 2, 2, 381, 382, 5, 354, 178, 2, 382, 383, 7, 3, 2, 2, 383, 384, 5, 10, 6, 2, 384, 9, 3, 2, 2, 2, 385, 389, 5, 60, 31, 2, 386, 389, 5, 62, 32, 2, 387, 389, 5, 78, 40, 2, 388, 385, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 388, 387, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 3, 2, 2, 391, 393, 3, 2, 2, 2, 392, 388, 3, 2, 2, 2, 393, 396, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 402, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 397, 398, 5, 64, 33, 2, 398, 399, 7, 3, 2, 2, 399, 401, 3, 2, 2, 2, 400, 397, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 11, 3, 2, 2, 2, 404, 402, 3, 2, 2, 2, 405, 406, 5, 18, 10, 2, 406, 13, 3, 2, 2, 2, 407, 409, 5, 20, 11, 2, 408, 407, 3, 2, 2, 2, 409, 412, 3, 2, 2, 2, 410, 408, 3, 2, 2, 2, 410, 411, 3, 2, 2, 2, 411, 15, 3, 2, 2, 2, 412, 410, 3, 2, 2, 2, 413, 414, 5, 14, 8, 2, 414, 415, 5, 94, 48, 2, 415, 17, 3, 2, 2, 2, 416, 418, 5, 14, 8, 2, 417, 419, 5, 94, 48, 2, 418, 417, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 19, 3, 2, 2, 2, 420, 434, 5, 22, 12, 2, 421, 434, 5, 24, 13, 2, 422, 434, 5, 26, 14, 2, 423, 434, 5, 28, 15, 2, 424, 434, 5, 30, 16, 2, 425, 434, 5, 32, 17, 2, 426, 434, 5, 34, 18, 2, 427, 434, 5, 36, 19, 2, 428, 434, 5, 38, 20, 2, 429, 434, 5, 42, 22, 2, 430, 434, 5, 46, 24, 2, 431, 434, 5, 54, 28, 2, 432, 434, 5, 58, 30, 2, 433, 420, 3, 2, 2, 2, 433, 421, 3, 2, 2, 2, 433, 422, 3, 2, 2, 2, 433, 423, 3, 2, 2, 2, 433, 424, 3, 2, 2, 2, 433, 425, 3, 2, 2, 2, 433, 426, 3, 2, 2, 2, 433, 427, 3, 2, 2, 2, 433, 428, 3, 2, 2, 2, 433, 429, 3, 2, 2, 2, 433, 430, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 432, 3, 2, 2, 2, 434, 21, 3, 2, 2, 2, 435, 436, 5, 98, 50, 2, 436, 437, 7, 3, 2, 2, 437, 23, 3, 2, 2, 2, 438, 439, 7, 6, 2, 2, 439, 440, 5, 74, 38, 2, 440, 441, 7, 7, 2, 2, 441, 442, 5, 96, 49, 2, 442, 443, 7, 3, 2, 2, 443, 25, 3, 2, 2, 2, 444, 445, 7, 8, 2, 2, 445, 446, 5, 14, 8, 2, 446, 447, 7, 9, 2, 2, 447, 27, 3, 2, 2, 2, 448, 449, 7, 127, 2, 2, 449, 450, 7, 128, 2, 2, 450, 451, 7, 3, 2, 2, 451, 29, 3, 2, 2, 2, 452, 453, 7, 129, 2, 2, 453, 454, 7, 128, 2, 2, 454, 455, 7, 3, 2, 2, 455, 31, 3, 2, 2, 2, 456, 457, 7, 130, 2, 2, 457, 458, 7, 131, 2, 2, 458, 459, 5, 96, 49, 2, 459, 460, 7, 3, 2, 2, 460, 33, 3, 2, 2, 2, 461, 464, 5, 102, 52, 2, 462, 464, 5, 106, 54, 2, 463, 461, 3, 2, 2, 2, 463, 462, 3, 2, 2, 2, 464, 473, 3, 2, 2, 2, 465, 472, 5, 102, 52, 2, 466, 472, 5, 106, 54, 2, 467, 472, 5, 110, 56, 2, 468, 472, 5, 112, 57, 2, 469, 472, 5, 116, 59, 2, 470, 472, 5, 120, 61, 2, 471, 465, 3, 2, 2, 2, 471, 466, 3, 2, 2, 2, 471, 467, 3, 2, 2, 2, 471, 468, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 470, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 477, 7, 67, 2, 2, 477, 478, 5, 20, 11, 2, 478, 35, 3, 2, 2, 2, 479, 480, 7, 68, 2, 2, 480, 481, 7, 10, 2, 2, 481, 482, 5, 94, 48, 2, 482, 483, 7, 11, 2, 2, 483, 484, 7, 89, 2, 2, 484, 485, 5, 20, 11, 2, 485, 486, 7, 90, 2, 2, 486, 487, 5, 20, 11, 2, 487, 37, 3, 2, 2, 2, 488, 489, 7, 84, 2, 2, 489, 490, 7, 10, 2, 2, 490, 491, 5, 94, 48, 2, 491, 493, 7, 11, 2, 2, 492, 494, 5, 40, 21, 2, 493, 492, 3, 2, 2, 2, 494, 495, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 495, 496, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 7, 88, 2, 2, 498, 499, 7, 67, 2, 2, 499, 500, 5, 20, 11, 2, 500, 39, 3, 2, 2, 2, 501, 502, 7, 85, 2, 2, 502, 504, 5, 96, 49, 2, 503, 501, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 503, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 7, 67, 2, 2, 508, 509, 5, 20, 11, 2, 509, 41, 3, 2, 2, 2, 510, 511, 7, 86, 2, 2, 511, 513, 5, 26, 14, 2, 512, 514, 5, 44, 23, 2, 513, 512, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 43, 3, 2, 2, 2, 517, 520, 7, 87, 2, 2, 518, 521, 7, 12, 2, 2, 519, 521, 5, 74, 38, 2, 520, 518, 3, 2, 2, 2, 520, 519, 3, 2, 2, 2, 521, 529, 3, 2, 2, 2, 522, 525, 7, 13, 2, 2, 523, 526, 7, 12, 2, 2, 524, 526, 5, 74, 38, 2, 525, 523, 3, 2, 2, 2, 525, 524, 3, 2, 2, 2, 526, 528, 3, 2, 2, 2, 527, 522, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 532, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 533, 5, 26, 14, 2, 533, 45, 3, 2, 2, 2, 534, 535, 7, 91, 2, 2, 535, 536, 7, 10, 2, 2, 536, 537, 5, 94, 48, 2, 537, 539, 7, 11, 2, 2, 538, 540, 5, 48, 25, 2, 539, 538, 3, 2, 2, 2, 540, 541, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 545, 7, 88, 2, 2, 544, 546, 5, 194, 98, 2, 545, 544, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 547, 3, 2, 2, 2, 547, 548, 7, 67, 2, 2, 548, 549, 5, 20, 11, 2, 549, 47, 3, 2, 2, 2, 550, 554, 7, 85, 2, 2, 551, 552, 5, 194, 98, 2, 552, 553, 7, 70, 2, 2, 553, 555, 3, 2, 2, 2, 554, 551, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 561, 5, 338, 170, 2, 557, 558, 7, 13, 2, 2, 558, 560, 5, 338, 170, 2, 559, 557, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 561, 562, 3, 2, 2, 2, 562, 564, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 564, 565, 7, 67, 2, 2, 565, 566, 5, 20, 11, 2, 566, 49, 3, 2, 2, 2, 567, 568, 7, 14, 2, 2, 568, 579, 5, 74, 38, 2, 569, 570, 7, 10, 2, 2, 570, 575, 7, 172, 2, 2, 571, 572, 7, 15, 2, 2, 572, 574, 7, 172, 2, 2, 573, 571, 3, 2, 2, 2, 574, 577, 3, 2, 2, 2, 575, 573, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 578, 3, 2, 2, 2, 577, 575, 3, 2, 2, 2, 578, 580, 7, 11, 2, 2, 579, 569, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 51, 3, 2, 2, 2, 581, 583, 5, 50, 26, 2, 582, 581, 3, 2, 2, 2, 583, 586, 3, 2, 2, 2, 584, 582, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 53, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 587, 588, 5, 52, 27, 2, 588, 589, 7, 114, 2, 2, 589, 594, 5, 56, 29, 2, 590, 591, 7, 15, 2, 2, 591, 593, 5, 56, 29, 2, 592, 590, 3, 2, 2, 2, 593, 596, 3, 2, 2, 2, 594, 592, 3, 2, 2, 2, 594, 595, 3, 2, 2, 2, 595, 597, 3, 2, 2, 2, 596, 594, 3, 2, 2, 2, 597, 598, 7, 3, 2, 2, 598, 55, 3, 2, 2, 2, 599, 602, 5, 194, 98, 2, 600, 601, 7, 70, 2, 2, 601, 603, 5, 338, 170, 2, 602, 600, 3, 2, 2, 2, 602, 603, 3, 2, 2, 2, 603, 606, 3, 2, 2, 2, 604, 605, 7, 7, 2, 2, 605, 607, 5, 96, 49, 2, 606, 604, 3, 2, 2, 2, 606, 607, 3, 2, 2, 2, 607, 57, 3, 2, 2, 2, 608, 609, 7, 132, 2, 2, 609, 610, 7, 10, 2, 2, 610, 611, 5, 94, 48, 2, 611, 612, 7, 11, 2, 2, 612, 613, 5, 20, 11, 2, 613, 59, 3, 2, 2, 2, 614, 619, 5, 66, 34, 2, 615, 619, 5, 68, 35, 2, 616, 619, 5, 70, 36, 2, 617, 619, 5, 72, 37, 2, 618, 614, 3, 2, 2, 2, 618, 615, 3, 2, 2, 2, 618, 616, 3, 2, 2, 2, 618, 617, 3, 2, 2, 2, 619, 61, 3, 2, 2, 2, 620, 621, 7, 111, 2, 2, 621, 622, 7, 135, 2, 2, 622, 623, 7, 178, 2, 2, 623, 624, 7, 5, 2, 2, 624, 625, 5, 354, 178, 2, 625, 63, 3, 2, 2, 2, 626, 631, 5, 84, 43, 2, 627, 631, 5, 80, 41, 2, 628, 631, 5, 86, 44, 2, 629, 631, 5, 82, 42, 2, 630, 626, 3, 2, 2, 2, 630, 627, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 630, 629, 3, 2, 2, 2, 631, 65, 3, 2, 2, 2, 632, 633, 7, 111, 2, 2, 633, 634, 7, 88, 2, 2, 634, 635, 7, 81, 2, 2, 635, 636, 5, 354, 178, 2, 636, 67, 3, 2, 2, 2, 637, 638, 7, 111, 2, 2, 638, 639, 7, 16, 2, 2, 639, 640, 9, 2, 2, 2, 640, 69, 3, 2, 2, 2, 641, 642, 7, 111, 2, 2, 642, 643, 7, 88, 2, 2, 643, 644, 7, 66, 2, 2, 644, 645, 7, 73, 2, 2, 645, 646, 9, 3, 2, 2, 646, 71, 3, 2, 2, 2, 647, 652, 7, 111, 2, 2, 648, 649, 7, 18, 2, 2, 649, 653, 5, 74, 38, 2, 650, 651, 7, 88, 2, 2, 651, 653, 7, 18, 2, 2, 652, 648, 3, 2, 2, 2, 652, 650, 3, 2, 2, 2, 653, 660, 3, 2, 2, 2, 654, 655, 5, 76, 39, 2, 655, 656, 7, 5, 2, 2, 656, 657, 5, 356, 179, 2, 657, 659, 3, 2, 2, 2, 658, 654, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 73, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 666, 7, 178, 2, 2, 664, 666, 5, 358, 180, 2, 665, 663, 3, 2, 2, 2, 665, 664, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 669, 7, 19, 2, 2, 668, 665, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 672, 3, 2, 2, 2, 670, 673, 7, 178, 2, 2, 671, 673, 5, 358, 180, 2, 672, 670, 3, 2, 2, 2, 672, 671, 3, 2, 2, 2, 673, 75, 3, 2, 2, 2, 674, 675, 9, 4, 2, 2, 675, 77, 3, 2, 2, 2, 676, 677, 7, 133, 2, 2, 677, 681, 7, 4, 2, 2, 678, 679, 7, 135, 2, 2, 679, 680, 7, 178, 2, 2, 680, 682, 7, 5, 2, 2, 681, 678, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 693, 5, 354, 178, 2, 684, 685, 7, 71, 2, 2, 685, 690, 5, 354, 178, 2, 686, 687, 7, 15, 2, 2, 687, 689, 5, 354, 178, 2, 688, 686, 3, 2, 2, 2, 689, 692, 3, 2, 2, 2, 690, 688, 3, 2, 2, 2, 690, 691, 3, 2, 2, 2, 691, 694, 3, 2, 2, 2, 692, 690, 3, 2, 2, 2, 693, 684, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 79, 3, 2, 2, 2, 695, 696, 7, 111, 2, 2, 696, 697, 5, 52, 27, 2, 697, 698, 7, 114, 2, 2, 698, 701, 5, 194, 98, 2, 699, 700, 7, 70, 2, 2, 700, 702, 5, 338, 170, 2, 701, 699, 3, 2, 2, 2, 701, 702, 3, 2, 2, 2, 702, 710, 3, 2, 2, 2, 703, 704, 7, 7, 2, 2, 704, 711, 5, 96, 49, 2, 705, 708, 7, 30, 2, 2, 706, 707, 7, 7, 2, 2, 707, 709, 5, 96, 49, 2, 708, 706, 3, 2, 2, 2, 708, 709, 3, 2, 2, 2, 709, 711, 3, 2, 2, 2, 710, 703, 3, 2, 2, 2, 710, 705, 3, 2, 2, 2, 711, 81, 3, 2, 2, 2, 712, 713, 7, 111, 2, 2, 713, 714, 7, 112, 2, 2, 714, 717, 7, 113, 2, 2, 715, 716, 7, 70, 2, 2, 716, 718, 5, 338, 170, 2, 717, 715, 3, 2, 2, 2, 717, 718, 3, 2, 2, 2, 718, 726, 3, 2, 2, 2, 719, 720, 7, 7, 2, 2, 720, 727, 5, 96, 49, 2, 721, 724, 7, 30, 2, 2, 722, 723, 7, 7, 2, 2, 723, 725, 5, 96, 49, 2, 724, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 727, 3, 2, 2, 2, 726, 719, 3, 2, 2, 2, 726, 721, 3, 2, 2, 2, 727, 83, 3, 2, 2, 2, 728, 729, 7, 111, 2, 2, 729, 730, 5, 52, 27, 2, 730, 731, 7, 31, 2, 2, 731, 732, 5, 74, 38, 2, 732, 734, 7, 10, 2, 2, 733, 735, 5, 90, 46, 2, 734, 733, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 739, 7, 11, 2, 2, 737, 738, 7, 70, 2, 2, 738, 740, 5, 338, 170, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 746, 3, 2, 2, 2, 741, 742, 7, 8, 2, 2, 742, 743, 5, 18, 10, 2, 743, 744, 7, 9, 2, 2, 744, 747, 3, 2, 2, 2, 745, 747, 7, 30, 2, 2, 746, 741, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 85, 3, 2, 2, 2, 748, 749, 7, 111, 2, 2, 749, 750, 7, 108, 2, 2, 750, 751, 5, 74, 38, 2, 751, 753, 7, 70, 2, 2, 752, 754, 5, 88, 45, 2, 753, 752, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 755, 3, 2, 2, 2, 755, 756, 5, 96, 49, 2, 756, 87, 3, 2, 2, 2, 757, 758, 7, 32, 2, 2, 758, 764, 7, 33, 2, 2, 759, 760, 7, 32, 2, 2, 760, 764, 7, 34, 2, 2, 761, 762, 7, 124, 2, 2, 762, 764, 7, 134, 2, 2, 763, 757, 3, 2, 2, 2, 763, 759, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 764, 89, 3, 2, 2, 2, 765, 770, 5, 92, 47, 2, 766, 767, 7, 15, 2, 2, 767, 769, 5, 92, 47, 2, 768, 766, 3, 2, 2, 2, 769, 772, 3, 2, 2, 2, 770, 768, 3, 2, 2, 2, 770, 771, 3, 2, 2, 2, 771, 91, 3, 2, 2, 2, 772, 770, 3, 2, 2, 2, 773, 774, 7, 6, 2, 2, 774, 777, 5, 74, 38, 2, 775, 776, 7, 70, 2, 2, 776, 778, 5, 338, 170, 2, 777, 775, 3, 2, 2, 2, 777, 778, 3, 2, 2, 2, 778, 93, 3, 2, 2, 2, 779, 784, 5, 96, 49, 2, 780, 781, 7, 15, 2, 2, 781, 783, 5, 96, 49, 2, 782, 780, 3, 2, 2, 2, 783, 786, 3, 2, 2, 2, 784, 782, 3, 2, 2, 2, 784, 785, 3, 2, 2, 2, 785, 95, 3, 2, 2, 2, 786, 784, 3, 2, 2, 2, 787, 794, 5, 98, 50, 2, 788, 794, 5, 100, 51, 2, 789, 794, 5, 126, 64, 2, 790, 794, 5, 130, 66, 2, 791, 794, 5, 134, 68, 2, 792, 794, 5, 136, 69, 2, 793, 787, 3, 2, 2, 2, 793, 788, 3, 2, 2, 2, 793, 789, 3, 2, 2, 2, 793, 790, 3, 2, 2, 2, 793, 791, 3, 2, 2, 2, 793, 792, 3, 2, 2, 2, 794, 97, 3, 2, 2, 2, 795, 804, 5, 122, 62, 2, 796, 804, 5, 140, 71, 2, 797, 804, 5, 216, 109, 2, 798, 804, 5, 218, 110, 2, 799, 804, 5, 220, 111, 2, 800, 804, 5, 222, 112, 2, 801, 804, 5, 224, 113, 2, 802, 804, 5, 226, 114, 2, 803, 795, 3, 2, 2, 2, 803, 796, 3, 2, 2, 2, 803, 797, 3, 2, 2, 2, 803, 798, 3, 2, 2, 2, 803, 799, 3, 2, 2, 2, 803, 800, 3, 2, 2, 2, 803, 801, 3, 2, 2, 2, 803, 802, 3, 2, 2, 2, 804, 99, 3, 2, 2, 2, 805, 808, 5, 102, 52, 2, 806, 808, 5, 106, 54, 2, 807, 805, 3, 2, 2, 2, 807, 806, 3, 2, 2, 2, 808, 817, 3, 2, 2, 2, 809, 816, 5, 102, 52, 2, 810, 816, 5, 106, 54, 2, 811, 816, 5, 110, 56, 2, 812, 816, 5, 112, 57, 2, 813, 816, 5, 116, 59, 2, 814, 816, 5, 120, 61, 2, 815, 809, 3, 2, 2, 2, 815, 810, 3, 2, 2, 2, 815, 811, 3, 2, 2, 2, 815, 812, 3, 2, 2, 2, 815, 813, 3, 2, 2, 2, 815, 814, 3, 2, 2, 2, 816, 819, 3, 2, 2, 2, 817, 815, 3, 2, 2, 2, 817, 818, 3, 2, 2, 2, 818, 820, 3, 2, 2, 2, 819, 817, 3, 2, 2, 2, 820, 821, 7, 67, 2, 2, 821, 822, 5, 96, 49, 2, 822, 101, 3, 2, 2, 2, 823, 824, 7, 61, 2, 2, 824, 829, 5, 104, 53, 2, 825, 826, 7, 15, 2, 2, 826, 828, 5, 104, 53, 2, 827, 825, 3, 2, 2, 2, 828, 831, 3, 2, 2, 2, 829, 827, 3, 2, 2, 2, 829, 830, 3, 2, 2, 2, 830, 103, 3, 2, 2, 2, 831, 829, 3, 2, 2, 2, 832, 835, 5, 194, 98, 2, 833, 834, 7, 70, 2, 2, 834, 836, 5, 338, 170, 2, 835, 833, 3, 2, 2, 2, 835, 836, 3, 2, 2, 2, 836, 839, 3, 2, 2, 2, 837, 838, 7, 72, 2, 2, 838, 840, 7, 73, 2, 2, 839, 837, 3, 2, 2, 2, 839, 840, 3, 2, 2, 2, 840, 843, 3, 2, 2, 2, 841, 842, 7, 71, 2, 2, 842, 844, 5, 194, 98, 2, 843, 841, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 845, 3, 2, 2, 2, 845, 846, 7, 69, 2, 2, 846, 847, 5, 96, 49, 2, 847, 105, 3, 2, 2, 2, 848, 849, 7, 62, 2, 2, 849, 854, 5, 108, 55, 2, 850, 851, 7, 15, 2, 2, 851, 853, 5, 108, 55, 2, 852, 850, 3, 2, 2, 2, 853, 856, 3, 2, 2, 2, 854, 852, 3, 2, 2, 2, 854, 855, 3, 2, 2, 2, 855, 107, 3, 2, 2, 2, 856, 854, 3, 2, 2, 2, 857, 860, 5, 194, 98, 2, 858, 859, 7, 70, 2, 2, 859, 861, 5, 338, 170, 2, 860, 858, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 862, 3, 2, 2, 2, 862, 863, 7, 7, 2, 2, 863, 864, 5, 96, 49, 2, 864, 109, 3, 2, 2, 2, 865, 866, 7, 63, 2, 2, 866, 867, 5, 96, 49, 2, 867, 111, 3, 2, 2, 2, 868, 869, 7, 64, 2, 2, 869, 870, 7, 65, 2, 2, 870, 875, 5, 114, 58, 2, 871, 872, 7, 15, 2, 2, 872, 874, 5, 114, 58, 2, 873, 871, 3, 2, 2, 2, 874, 877, 3, 2, 2, 2, 875, 873, 3, 2, 2, 2, 875, 876, 3, 2, 2, 2, 876, 113, 3, 2, 2, 2, 877, 875, 3, 2, 2, 2, 878, 885, 5, 194, 98, 2, 879, 880, 7, 70, 2, 2, 880, 882, 5, 338, 170, 2, 881, 879, 3, 2, 2, 2, 881, 882, 3, 2, 2, 2, 882, 883, 3, 2, 2, 2, 883, 884, 7, 7, 2, 2, 884, 886, 5, 96, 49, 2, 885, 881, 3, 2, 2, 2, 885, 886, 3, 2, 2, 2, 886, 889, 3, 2, 2, 2, 887, 888, 7, 81, 2, 2, 888, 890, 5, 354, 178, 2, 889, 887, 3, 2, 2, 2, 889, 890, 3, 2, 2, 2, 890, 115, 3, 2, 2, 2, 891, 892, 7, 66, 2, 2, 892, 897, 7, 65, 2, 2, 893, 894, 7, 75, 2, 2, 894, 895, 7, 66, 2, 2, 895, 897, 7, 65, 2, 2, 896, 891, 3, 2, 2, 2, 896, 893, 3, 2, 2, 2, 897, 898, 3, 2, 2, 2, 898, 903, 5, 118, 60, 2, 899, 900, 7, 15, 2, 2, 900, 902, 5, 118, 60, 2, 901, 899, 3, 2, 2, 2, 902, 905, 3, 2, 2, 2, 903, 901, 3, 2, 2, 2, 903, 904, 3, 2, 2, 2, 904, 117, 3, 2, 2, 2, 905, 903, 3, 2, 2, 2, 906, 909, 5, 96, 49, 2, 907, 910, 7, 76, 2, 2, 908, 910, 7, 77, 2, 2, 909, 907, 3, 2, 2, 2, 909, 908, 3, 2, 2, 2, 909, 910, 3, 2, 2, 2, 910, 916, 3, 2, 2, 2, 911, 914, 7, 73, 2, 2, 912, 915, 7, 82, 2, 2, 913, 915, 7, 83, 2, 2, 914, 912, 3, 2, 2, 2, 914, 913, 3, 2, 2, 2, 915, 917, 3, 2, 2, 2, 916, 911, 3, 2, 2, 2, 916, 917, 3, 2, 2, 2, 917, 920, 3, 2, 2, 2, 918, 919, 7, 81, 2, 2, 919, 921, 5, 354, 178, 2, 920, 918, 3, 2, 2, 2, 920, 921, 3, 2, 2, 2, 921, 119, 3, 2, 2, 2, 922, 923, 7, 74, 2, 2, 923, 924, 5, 194, 98, 2, 924, 121, 3, 2, 2, 2, 925, 928, 7, 78, 2, 2, 926, 928, 7, 79, 2, 2, 927, 925, 3, 2, 2, 2, 927, 926, 3, 2, 2, 2, 928, 929, 3, 2, 2, 2, 929, 934, 5, 124, 63, 2, 930, 931, 7, 15, 2, 2, 931, 933, 5, 124, 63, 2, 932, 930, 3, 2, 2, 2, 933, 936, 3, 2, 2, 2, 934, 932, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 937, 3, 2, 2, 2, 936, 934, 3, 2, 2, 2, 937, 938, 7, 80, 2, 2, 938, 939, 5, 96, 49, 2, 939, 123, 3, 2, 2, 2, 940, 943, 5, 194, 98, 2, 941, 942, 7, 70, 2, 2, 942, 944, 5, 338, 170, 2, 943, 941, 3, 2, 2, 2, 943, 944, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 946, 7, 69, 2, 2, 946, 947, 5, 96, 49, 2, 947, 125, 3, 2, 2, 2, 948, 949, 7, 84, 2, 2, 949, 950, 7, 10, 2, 2, 950, 951, 5, 94, 48, 2, 951, 953, 7, 11, 2, 2, 952, 954, 5, 128, 65, 2, 953, 952, 3, 2, 2, 2, 954, 955, 3, 2, 2, 2, 955, 953, 3, 2, 2, 2, 955, 956, 3, 2, 2, 2, 956, 957, 3, 2, 2, 2, 957, 958, 7, 88, 2, 2, 958, 959, 7, 67, 2, 2, 959, 960, 5, 96, 49, 2, 960, 127, 3, 2, 2, 2, 961, 962, 7, 85, 2, 2, 962, 964, 5, 96, 49, 2, 963, 961, 3, 2, 2, 2, 964, 965, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 967, 3, 2, 2, 2, 967, 968, 7, 67, 2, 2, 968, 969, 5, 96, 49, 2, 969, 129, 3, 2, 2, 2, 970, 971, 7, 91, 2, 2, 971, 972, 7, 10, 2, 2, 972, 973, 5, 94, 48, 2, 973, 975, 7, 11, 2, 2, 974, 976, 5, 132, 67, 2, 975, 974, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 975, 3, 2, 2, 2, 977, 978, 3, 2, 2, 2, 978, 979, 3, 2, 2, 2, 979, 981, 7, 88, 2, 2, 980, 982, 5, 194, 98, 2, 981, 980, 3, 2, 2, 2, 981, 982, 3, 2, 2, 2, 982, 983, 3, 2, 2, 2, 983, 984, 7, 67, 2, 2, 984, 985, 5, 96, 49, 2, 985, 131, 3, 2, 2, 2, 986, 990, 7, 85, 2, 2, 987, 988, 5, 194, 98, 2, 988, 989, 7, 70, 2, 2, 989, 991, 3, 2, 2, 2, 990, 987, 3, 2, 2, 2, 990, 991, 3, 2, 2, 2, 991, 992, 3, 2, 2, 2, 992, 997, 5, 338, 170, 2, 993, 994, 7, 13, 2, 2, 994, 996, 5, 338, 170, 2, 995, 993, 3, 2, 2, 2, 996, 999, 3, 2, 2, 2, 997, 995, 3, 2, 2, 2, 997, 998, 3, 2, 2, 2, 998, 1000, 3, 2, 2, 2, 999, 997, 3, 2, 2, 2, 1000, 1001, 7, 67, 2, 2, 1001, 1002, 5, 96, 49, 2, 1002, 133, 3, 2, 2, 2, 1003, 1004, 7, 68, 2, 2, 1004, 1005, 7, 10, 2, 2, 1005, 1006, 5, 94, 48, 2, 1006, 1007, 7, 11, 2, 2, 1007, 1008, 7, 89, 2, 2, 1008, 1009, 5, 96, 49, 2, 1009, 1010, 7, 90, 2, 2, 1010, 1011, 5, 96, 49, 2, 1011, 135, 3, 2, 2, 2, 1012, 1013, 7, 86, 2, 2, 1013, 1014, 7, 8, 2, 2, 1014, 1015, 5, 94, 48, 2, 1015, 1017, 7, 9, 2, 2, 1016, 1018, 5, 138, 70, 2, 1017, 1016, 3, 2, 2, 2, 1018, 1019, 3, 2, 2, 2, 1019, 1017, 3, 2, 2, 2, 1019, 1020, 3, 2, 2, 2, 1020, 137, 3, 2, 2, 2, 1021, 1024, 7, 87, 2, 2, 1022, 1025, 7, 12, 2, 2, 1023, 1025, 5, 74, 38, 2, 1024, 1022, 3, 2, 2, 2, 1024, 1023, 3, 2, 2, 2, 1025, 1033, 3, 2, 2, 2, 1026, 1029, 7, 13, 2, 2, 1027, 1030, 7, 12, 2, 2, 1028, 1030, 5, 74, 38, 2, 1029, 1027, 3, 2, 2, 2, 1029, 1028, 3, 2, 2, 2, 1030, 1032, 3, 2, 2, 2, 1031, 1026, 3, 2, 2, 2, 1032, 1035, 3, 2, 2, 2, 1033, 1031, 3, 2, 2, 2, 1033, 1034, 3, 2, 2, 2, 1034, 1036, 3, 2, 2, 2, 1035, 1033, 3, 2, 2, 2, 1036, 1037, 7, 8, 2, 2, 1037, 1038, 5, 94, 48, 2, 1038, 1039, 7, 9, 2, 2, 1039, 139, 3, 2, 2, 2, 1040, 1045, 5, 142, 72, 2, 1041, 1042, 7, 92, 2, 2, 1042, 1044, 5, 142, 72, 2, 1043, 1041, 3, 2, 2, 2, 1044, 1047, 3, 2, 2, 2, 1045, 1043, 3, 2, 2, 2, 1045, 1046, 3, 2, 2, 2, 1046, 141, 3, 2, 2, 2, 1047, 1045, 3, 2, 2, 2, 1048, 1053, 5, 144, 73, 2, 1049, 1050, 7, 93, 2, 2, 1050, 1052, 5, 144, 73, 2, 1051, 1049, 3, 2, 2, 2, 1052, 1055, 3, 2, 2, 2, 1053, 1051, 3, 2, 2, 2, 1053, 1054, 3, 2, 2, 2, 1054, 143, 3, 2, 2, 2, 1055, 1053, 3, 2, 2, 2, 1056, 1058, 7, 94, 2, 2, 1057, 1056, 3, 2, 2, 2, 1057, 1058, 3, 2, 2, 2, 1058, 1059, 3, 2, 2, 2, 1059, 1060, 5, 146, 74, 2, 1060, 145, 3, 2, 2, 2, 1061, 1064, 5, 148, 75, 2, 1062, 1063, 9, 5, 2, 2, 1063, 1065, 5, 148, 75, 2, 1064, 1062, 3, 2, 2, 2, 1064, 1065, 3, 2, 2, 2, 1065, 147, 3, 2, 2, 2, 1066, 1071, 5, 150, 76, 2, 1067, 1068, 7, 46, 2, 2, 1068, 1070, 5, 150, 76, 2, 1069, 1067, 3, 2, 2, 2, 1070, 1073, 3, 2, 2, 2, 1071, 1069, 3, 2, 2, 2, 1071, 1072, 3, 2, 2, 2, 1072, 149, 3, 2, 2, 2, 1073, 1071, 3, 2, 2, 2, 1074, 1077, 5, 152, 77, 2, 1075, 1076, 7, 95, 2, 2, 1076, 1078, 5, 152, 77, 2, 1077, 1075, 3, 2, 2, 2, 1077, 1078, 3, 2, 2, 2, 1078, 151, 3, 2, 2, 2, 1079, 1084, 5, 154, 78, 2, 1080, 1081, 9, 6, 2, 2, 1081, 1083, 5, 154, 78, 2, 1082, 1080, 3, 2, 2, 2, 1083, 1086, 3, 2, 2, 2, 1084, 1082, 3, 2, 2, 2, 1084, 1085, 3, 2, 2, 2, 1085, 153, 3, 2, 2, 2, 1086, 1084, 3, 2, 2, 2, 1087, 1092, 5, 156, 79, 2, 1088, 1089, 9, 7, 2, 2, 1089, 1091, 5, 156, 79, 2, 1090, 1088, 3, 2, 2, 2, 1091, 1094, 3, 2, 2, 2, 1092, 1090, 3, 2, 2, 2, 1092, 1093, 3, 2, 2, 2, 1093, 155, 3, 2, 2, 2, 1094, 1092, 3, 2, 2, 2, 1095, 1099, 5, 158, 80, 2, 1096, 1097, 7, 96, 2, 2, 1097, 1098, 7, 97, 2, 2, 1098, 1100, 5, 338, 170, 2, 1099, 1096, 3, 2, 2, 2, 1099, 1100, 3, 2, 2, 2, 1100, 157, 3, 2, 2, 2, 1101, 1105, 5, 160, 81, 2, 1102, 1103, 7, 99, 2, 2, 1103, 1104, 7, 98, 2, 2, 1104, 1106, 5, 338, 170, 2, 1105, 1102, 3, 2, 2, 2, 1105, 1106, 3, 2, 2, 2, 1106, 159, 3, 2, 2, 2, 1107, 1111, 5, 162, 82, 2, 1108, 1109, 7, 100, 2, 2, 1109, 1110, 7, 70, 2, 2, 1110, 1112, 5, 338, 170, 2, 1111, 1108, 3, 2, 2, 2, 1111, 1112, 3, 2, 2, 2, 1112, 161, 3, 2, 2, 2, 1113, 1117, 5, 164, 83, 2, 1114, 1115, 7, 102, 2, 2, 1115, 1116, 7, 70, 2, 2, 1116, 1118, 5, 348, 175, 2, 1117, 1114, 3, 2, 2, 2, 1117, 1118, 3, 2, 2, 2, 1118, 163, 3, 2, 2, 2, 1119, 1123, 5, 166, 84, 2, 1120, 1121, 7, 101, 2, 2, 1121, 1122, 7, 70, 2, 2, 1122, 1124, 5, 348, 175, 2, 1123, 1120, 3, 2, 2, 2, 1123, 1124, 3, 2, 2, 2, 1124, 165, 3, 2, 2, 2, 1125, 1134, 5, 170, 86, 2, 1126, 1127, 7, 5, 2, 2, 1127, 1128, 7, 44, 2, 2, 1128, 1129, 3, 2, 2, 2, 1129, 1130, 5, 168, 85, 2, 1130, 1131, 5, 206, 104, 2, 1131, 1133, 3, 2, 2, 2, 1132, 1126, 3, 2, 2, 2, 1133, 1136, 3, 2, 2, 2, 1134, 1132, 3, 2, 2, 2, 1134, 1135, 3, 2, 2, 2, 1135, 167, 3, 2, 2, 2, 1136, 1134, 3, 2, 2, 2, 1137, 1141, 5, 74, 38, 2, 1138, 1141, 5, 194, 98, 2, 1139, 1141, 5, 196, 99, 2, 1140, 1137, 3, 2, 2, 2, 1140, 1138, 3, 2, 2, 2, 1140, 1139, 3, 2, 2, 2, 1141, 169, 3, 2, 2, 2, 1142, 1144, 9, 6, 2, 2, 1143, 1142, 3, 2, 2, 2, 1144, 1147, 3, 2, 2, 2, 1145, 1143, 3, 2, 2, 2, 1145, 1146, 3, 2, 2, 2, 1146, 1148, 3, 2, 2, 2, 1147, 1145, 3, 2, 2, 2, 1148, 1149, 5, 172, 87, 2, 1149, 171, 3, 2, 2, 2, 1150, 1154, 5, 178, 90, 2, 1151, 1154, 5, 174, 88, 2, 1152, 1154, 5, 176, 89, 2, 1153, 1150, 3, 2, 2, 2, 1153, 1151, 3, 2, 2, 2, 1153, 1152, 3, 2, 2, 2, 1154, 173, 3, 2, 2, 2, 1155, 1156, 7, 109, 2, 2, 1156, 1157, 7, 108, 2, 2, 1157, 1158, 5, 338, 170, 2, 1158, 1159, 7, 8, 2, 2, 1159, 1160, 5, 94, 48, 2, 1160, 1161, 7, 9, 2, 2, 1161, 175, 3, 2, 2, 2, 1162, 1163, 7, 110, 2, 2, 1163, 1164, 7, 108, 2, 2, 1164, 1165, 5, 338, 170, 2, 1165, 1166, 7, 8, 2, 2, 1166, 1167, 5, 94, 48, 2, 1167, 1168, 7, 9, 2, 2, 1168, 177, 3, 2, 2, 2, 1169, 1174, 5, 180, 91, 2, 1170, 1171, 7, 52, 2, 2, 1171, 1173, 5, 180, 91, 2, 1172, 1170, 3, 2, 2, 2, 1173, 1176, 3, 2, 2, 2, 1174, 1172, 3, 2, 2, 2, 1174, 1175, 3, 2, 2, 2, 1175, 179, 3, 2, 2, 2, 1176, 1174, 3, 2, 2, 2, 1177, 1185, 5, 190, 96, 2, 1178, 1184, 5, 182, 92, 2, 1179, 1184, 5, 186, 94, 2, 1180, 1184, 5, 188, 95, 2, 1181, 1184, 5, 184, 93, 2, 1182, 1184, 5, 206, 104, 2, 1183, 1178, 3, 2, 2, 2, 1183, 1179, 3, 2, 2, 2, 1183, 1180, 3, 2, 2, 2, 1183, 1181, 3, 2, 2, 2, 1183, 1182, 3, 2, 2, 2, 1184, 1187, 3, 2, 2, 2, 1185, 1183, 3, 2, 2, 2, 1185, 1186, 3, 2, 2, 2, 1186, 181, 3, 2, 2, 2, 1187, 1185, 3, 2, 2, 2, 1188, 1189, 7, 53, 2, 2, 1189, 1190, 7, 53, 2, 2, 1190, 1191, 5, 94, 48, 2, 1191, 1192, 7, 54, 2, 2, 1192, 1193, 7, 54, 2, 2, 1193, 183, 3, 2, 2, 2, 1194, 1195, 7, 53, 2, 2, 1195, 1196, 7, 54, 2, 2, 1196, 185, 3, 2, 2, 2, 1197, 1198, 7, 53, 2, 2, 1198, 1199, 5, 94, 48, 2, 1199, 1200, 7, 54, 2, 2, 1200, 187, 3, 2, 2, 2, 1201, 1208, 7, 55, 2, 2, 1202, 1209, 5, 358, 180, 2, 1203, 1209, 5, 356, 179, 2, 1204, 1209, 7, 178, 2, 2, 1205, 1209, 5, 196, 99, 2, 1206, 1209, 5, 194, 98, 2, 1207, 1209, 5, 198, 100, 2, 1208, 1202, 3, 2, 2, 2, 1208, 1203, 3, 2, 2, 2, 1208, 1204, 3, 2, 2, 2, 1208, 1205, 3, 2, 2, 2, 1208, 1206, 3, 2, 2, 2, 1208, 1207, 3, 2, 2, 2, 1209, 189, 3, 2, 2, 2, 1210, 1226, 7, 171, 2, 2, 1211, 1226, 7, 106, 2, 2, 1212, 1226, 7, 107, 2, 2, 1213, 1226, 7, 172, 2, 2, 1214, 1226, 5, 356, 179, 2, 1215, 1226, 5, 194, 98, 2, 1216, 1226, 5, 196, 99, 2, 1217, 1226, 5, 198, 100, 2, 1218, 1226, 5, 340, 171, 2, 1219, 1226, 5, 204, 103, 2, 1220, 1226, 5, 200, 101, 2, 1221, 1226, 5, 202, 102, 2, 1222, 1226, 5, 352, 177, 2, 1223, 1226, 5, 210, 106, 2, 1224, 1226, 5, 192, 97, 2, 1225, 1210, 3, 2, 2, 2, 1225, 1211, 3, 2, 2, 2, 1225, 1212, 3, 2, 2, 2, 1225, 1213, 3, 2, 2, 2, 1225, 1214, 3, 2, 2, 2, 1225, 1215, 3, 2, 2, 2, 1225, 1216, 3, 2, 2, 2, 1225, 1217, 3, 2, 2, 2, 1225, 1218, 3, 2, 2, 2, 1225, 1219, 3, 2, 2, 2, 1225, 1220, 3, 2, 2, 2, 1225, 1221, 3, 2, 2, 2, 1225, 1222, 3, 2, 2, 2, 1225, 1223, 3, 2, 2, 2, 1225, 1224, 3, 2, 2, 2, 1226, 191, 3, 2, 2, 2, 1227, 1228, 7, 8, 2, 2, 1228, 1229, 5, 16, 9, 2, 1229, 1230, 7, 9, 2, 2, 1230, 193, 3, 2, 2, 2, 1231, 1232, 7, 6, 2, 2, 1232, 1233, 5, 74, 38, 2, 1233, 195, 3, 2, 2, 2, 1234, 1236, 7, 10, 2, 2, 1235, 1237, 5, 94, 48, 2, 1236, 1235, 3, 2, 2, 2, 1236, 1237, 3, 2, 2, 2, 1237, 1238, 3, 2, 2, 2, 1238, 1239, 7, 11, 2, 2, 1239, 197, 3, 2, 2, 2, 1240, 1241, 7, 56, 2, 2, 1241, 199, 3, 2, 2, 2, 1242, 1243, 7, 17, 2, 2, 1243, 1244, 7, 8, 2, 2, 1244, 1245, 5, 94, 48, 2, 1245, 1246, 7, 9, 2, 2, 1246, 201, 3, 2, 2, 2, 1247, 1248, 7, 105, 2, 2, 1248, 1249, 7, 8, 2, 2, 1249, 1250, 5, 94, 48, 2, 1250, 1251, 7, 9, 2, 2, 1251, 203, 3, 2, 2, 2, 1252, 1253, 5, 74, 38, 2, 1253, 1254, 5, 206, 104, 2, 1254, 205, 3, 2, 2, 2, 1255, 1262, 7, 10, 2, 2, 1256, 1258, 5, 208, 105, 2, 1257, 1259, 7, 15, 2, 2, 1258, 1257, 3, 2, 2, 2, 1258, 1259, 3, 2, 2, 2, 1259, 1261, 3, 2, 2, 2, 1260, 1256, 3, 2, 2, 2, 1261, 1264, 3, 2, 2, 2, 1262, 1260, 3, 2, 2, 2, 1262, 1263, 3, 2, 2, 2, 1263, 1265, 3, 2, 2, 2, 1264, 1262, 3, 2, 2, 2, 1265, 1266, 7, 11, 2, 2, 1266, 207, 3, 2, 2, 2, 1267, 1270, 5, 96, 49, 2, 1268, 1270, 7, 170, 2, 2, 1269, 1267, 3, 2, 2, 2, 1269, 1268, 3, 2, 2, 2, 1270, 209, 3, 2, 2, 2, 1271, 1274, 5, 212, 107, 2, 1272, 1274, 5, 214, 108, 2, 1273, 1271, 3, 2, 2, 2, 1273, 1272, 3, 2, 2, 2, 1274, 211, 3, 2, 2, 2, 1275, 1276, 5, 74, 38, 2, 1276, 1277, 7, 57, 2, 2, 1277, 1278, 7, 172, 2, 2, 1278, 213, 3, 2, 2, 2, 1279, 1280, 5, 52, 27, 2, 1280, 1281, 7, 31, 2, 2, 1281, 1283, 7, 10, 2, 2, 1282, 1284, 5, 90, 46, 2, 1283, 1282, 3, 2, 2, 2, 1283, 1284, 3, 2, 2, 2, 1284, 1285, 3, 2, 2, 2, 1285, 1288, 7, 11, 2, 2, 1286, 1287, 7, 70, 2, 2, 1287, 1289, 5, 338, 170, 2, 1288, 1286, 3, 2, 2, 2, 1288, 1289, 3, 2, 2, 2, 1289, 1290, 3, 2, 2, 2, 1290, 1291, 7, 8, 2, 2, 1291, 1292, 5, 18, 10, 2, 1292, 1293, 7, 9, 2, 2, 1293, 215, 3, 2, 2, 2, 1294, 1295, 7, 115, 2, 2, 1295, 1296, 7, 124, 2, 2, 1296, 1297, 5, 96, 49, 2, 1297, 1298, 7, 122, 2, 2, 1298, 1302, 5, 96, 49, 2, 1299, 1300, 7, 71, 2, 2, 1300, 1301, 7, 126, 2, 2, 1301, 1303, 5, 96, 49, 2, 1302, 1299, 3, 2, 2, 2, 1302, 1303, 3, 2, 2, 2, 1303, 1318, 3, 2, 2, 2, 1304, 1305, 7, 115, 2, 2, 1305, 1306, 7, 124, 2, 2, 1306, 1311, 5, 350, 176, 2, 1307, 1308, 7, 15, 2, 2, 1308, 1310, 5, 350, 176, 2, 1309, 1307, 3, 2, 2, 2, 1310, 1313, 3, 2, 2, 2, 1311, 1309, 3, 2, 2, 2, 1311, 1312, 3, 2, 2, 2, 1312, 1314, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1314, 1315, 7, 122, 2, 2, 1315, 1316, 5, 96, 49, 2, 1316, 1318, 3, 2, 2, 2, 1317, 1294, 3, 2, 2, 2, 1317, 1304, 3, 2, 2, 2, 1318, 217, 3, 2, 2, 2, 1319, 1320, 7, 116, 2, 2, 1320, 1321, 7, 124, 2, 2, 1321, 1322, 5, 228, 115, 2, 1322, 219, 3, 2, 2, 2, 1323, 1324, 7, 117, 2, 2, 1324, 1325, 7, 124, 2, 2, 1325, 1326, 5, 228, 115, 2, 1326, 1327, 7, 70, 2, 2, 1327, 1328, 5, 96, 49, 2, 1328, 221, 3, 2, 2, 2, 1329, 1330, 7, 118, 2, 2, 1330, 1331, 7, 124, 2, 2, 1331, 1332, 7, 123, 2, 2, 1332, 1333, 7, 97, 2, 2, 1333, 1334, 5, 228, 115, 2, 1334, 1335, 7, 125, 2, 2, 1335, 1336, 5, 96, 49, 2, 1336, 223, 3, 2, 2, 2, 1337, 1338, 7, 119, 2, 2, 1338, 1339, 7, 124, 2, 2, 1339, 1344, 5, 230, 116, 2, 1340, 1341, 7, 15, 2, 2, 1341, 1343, 5, 230, 116, 2, 1342, 1340, 3, 2, 2, 2, 1343, 1346, 3, 2, 2, 2, 1344, 1342, 3, 2, 2, 2, 1344, 1345, 3, 2, 2, 2, 1345, 1347, 3, 2, 2, 2, 1346, 1344, 3, 2, 2, 2, 1347, 1348, 7, 120, 2, 2, 1348, 1349, 5, 96, 49, 2, 1349, 1350, 7, 67, 2, 2, 1350, 1351, 5, 96, 49, 2, 1351, 225, 3, 2, 2, 2, 1352, 1353, 7, 121, 2, 2, 1353, 1354, 7, 124, 2, 2, 1354, 1355, 5, 96, 49, 2, 1355, 1356, 7, 122, 2, 2, 1356, 1357, 5, 96, 49, 2, 1357, 227, 3, 2, 2, 2, 1358, 1361, 5, 190, 96, 2, 1359, 1362, 5, 182, 92, 2, 1360, 1362, 5, 188, 95, 2, 1361, 1359, 3, 2, 2, 2, 1361, 1360, 3, 2, 2, 2, 1362, 1363, 3, 2, 2, 2, 1363, 1361, 3, 2, 2, 2, 1363, 1364, 3, 2, 2, 2, 1364, 229, 3, 2, 2, 2, 1365, 1366, 5, 194, 98, 2, 1366, 1367, 7, 7, 2, 2, 1367, 1368, 5, 96, 49, 2, 1368, 231, 3, 2, 2, 2, 1369, 1370, 7, 133, 2, 2, 1370, 1372, 7, 134, 2, 2, 1371, 1373, 5, 234, 118, 2, 1372, 1371, 3, 2, 2, 2, 1372, 1373, 3, 2, 2, 2, 1373, 1374, 3, 2, 2, 2, 1374, 1384, 5, 354, 178, 2, 1375, 1376, 7, 71, 2, 2, 1376, 1381, 5, 354, 178, 2, 1377, 1378, 7, 15, 2, 2, 1378, 1380, 5, 354, 178, 2, 1379, 1377, 3, 2, 2, 2, 1380, 1383, 3, 2, 2, 2, 1381, 1379, 3, 2, 2, 2, 1381, 1382, 3, 2, 2, 2, 1382, 1385, 3, 2, 2, 2, 1383, 1381, 3, 2, 2, 2, 1384, 1375, 3, 2, 2, 2, 1384, 1385, 3, 2, 2, 2, 1385, 233, 3, 2, 2, 2, 1386, 1387, 7, 135, 2, 2, 1387, 1388, 7, 178, 2, 2, 1388, 1393, 7, 5, 2, 2, 1389, 1390, 7, 88, 2, 2, 1390, 1391, 7, 136, 2, 2, 1391, 1393, 7, 135, 2, 2, 1392, 1386, 3, 2, 2, 2, 1392, 1389, 3, 2, 2, 2, 1393, 235, 3, 2, 2, 2, 1394, 1396, 7, 137, 2, 2, 1395, 1397, 5, 238, 120, 2, 1396, 1395, 3, 2, 2, 2, 1396, 1397, 3, 2, 2, 2, 1397, 1402, 3, 2, 2, 2, 1398, 1399, 7, 138, 2, 2, 1399, 1402, 5, 238, 120, 2, 1400, 1402, 5, 238, 120, 2, 1401, 1394, 3, 2, 2, 2, 1401, 1398, 3, 2, 2, 2, 1401, 1400, 3, 2, 2, 2, 1402, 237, 3, 2, 2, 2, 1403, 1408, 5, 240, 121, 2, 1404, 1405, 9, 8, 2, 2, 1405, 1407, 5, 240, 121, 2, 1406, 1404, 3, 2, 2, 2, 1407, 1410, 3, 2, 2, 2, 1408, 1406, 3, 2, 2, 2, 1408, 1409, 3, 2, 2, 2, 1409, 239, 3, 2, 2, 2, 1410, 1408, 3, 2, 2, 2, 1411, 1414, 5, 180, 91, 2, 1412, 1414, 5, 242, 122, 2, 1413, 1411, 3, 2, 2, 2, 1413, 1412, 3, 2, 2, 2, 1414, 241, 3, 2, 2, 2, 1415, 1418, 5, 250, 126, 2, 1416, 1418, 5, 244, 123, 2, 1417, 1415, 3, 2, 2, 2, 1417, 1416, 3, 2, 2, 2, 1418, 1419, 3, 2, 2, 2, 1419, 1420, 5, 266, 134, 2, 1420, 243, 3, 2, 2, 2, 1421, 1422, 5, 246, 124, 2, 1422, 1423, 5, 256, 129, 2, 1423, 1426, 3, 2, 2, 2, 1424, 1426, 5, 248, 125, 2, 1425, 1421, 3, 2, 2, 2, 1425, 1424, 3, 2, 2, 2, 1426, 245, 3, 2, 2, 2, 1427, 1428, 9, 9, 2, 2, 1428, 1429, 7, 19, 2, 2, 1429, 1430, 7, 19, 2, 2, 1430, 247, 3, 2, 2, 2, 1431, 1433, 7, 139, 2, 2, 1432, 1431, 3, 2, 2, 2, 1432, 1433, 3, 2, 2, 2, 1433, 1434, 3, 2, 2, 2, 1434, 1435, 5, 256, 129, 2, 1435, 249, 3, 2, 2, 2, 1436, 1437, 5, 252, 127, 2, 1437, 1438, 5, 256, 129, 2, 1438, 1441, 3, 2, 2, 2, 1439, 1441, 5, 254, 128, 2, 1440, 1436, 3, 2, 2, 2, 1440, 1439, 3, 2, 2, 2, 1441, 251, 3, 2, 2, 2, 1442, 1443, 9, 10, 2, 2, 1443, 1444, 7, 19, 2, 2, 1444, 1445, 7, 19, 2, 2, 1445, 253, 3, 2, 2, 2, 1446, 1447, 7, 58, 2, 2, 1447, 255, 3, 2, 2, 2, 1448, 1451, 5, 258, 130, 2, 1449, 1451, 5, 272, 137, 2, 1450, 1448, 3, 2, 2, 2, 1450, 1449, 3, 2, 2, 2, 1451, 257, 3, 2, 2, 2, 1452, 1455, 5, 74, 38, 2, 1453, 1455, 5, 260, 131, 2, 1454, 1452, 3, 2, 2, 2, 1454, 1453, 3, 2, 2, 2, 1455, 259, 3, 2, 2, 2, 1456, 1460, 7, 12, 2, 2, 1457, 1460, 5, 262, 132, 2, 1458, 1460, 5, 264, 133, 2, 1459, 1456, 3, 2, 2, 2, 1459, 1457, 3, 2, 2, 2, 1459, 1458, 3, 2, 2, 2, 1460, 261, 3, 2, 2, 2, 1461, 1462, 7, 178, 2, 2, 1462, 1463, 7, 19, 2, 2, 1463, 1464, 7, 12, 2, 2, 1464, 263, 3, 2, 2, 2, 1465, 1466, 7, 12, 2, 2, 1466, 1467, 7, 19, 2, 2, 1467, 1468, 7, 178, 2, 2, 1468, 265, 3, 2, 2, 2, 1469, 1471, 5, 186, 94, 2, 1470, 1469, 3, 2, 2, 2, 1471, 1474, 3, 2, 2, 2, 1472, 1470, 3, 2, 2, 2, 1472, 1473, 3, 2, 2, 2, 1473, 267, 3, 2, 2, 2, 1474, 1472, 3, 2, 2, 2, 1475, 1487, 5, 74, 38, 2, 1476, 1487, 7, 171, 2, 2, 1477, 1487, 5, 272, 137, 2, 1478, 1479, 7, 113, 2, 2, 1479, 1480, 7, 10, 2, 2, 1480, 1487, 7, 11, 2, 2, 1481, 1487, 5, 342, 172, 2, 1482, 1487, 5, 310, 156, 2, 1483, 1487, 5, 316, 159, 2, 1484, 1487, 5, 270, 136, 2, 1485, 1487, 5, 322, 162, 2, 1486, 1475, 3, 2, 2, 2, 1486, 1476, 3, 2, 2, 2, 1486, 1477, 3, 2, 2, 2, 1486, 1478, 3, 2, 2, 2, 1486, 1481, 3, 2, 2, 2, 1486, 1482, 3, 2, 2, 2, 1486, 1483, 3, 2, 2, 2, 1486, 1484, 3, 2, 2, 2, 1486, 1485, 3, 2, 2, 2, 1487, 269, 3, 2, 2, 2, 1488, 1489, 5, 74, 38, 2, 1489, 271, 3, 2, 2, 2, 1490, 1503, 5, 278, 140, 2, 1491, 1503, 5, 294, 148, 2, 1492, 1503, 5, 288, 145, 2, 1493, 1503, 5, 298, 150, 2, 1494, 1503, 5, 292, 147, 2, 1495, 1503, 5, 286, 144, 2, 1496, 1503, 5, 282, 142, 2, 1497, 1503, 5, 280, 141, 2, 1498, 1503, 5, 284, 143, 2, 1499, 1503, 5, 326, 164, 2, 1500, 1503, 5, 276, 139, 2, 1501, 1503, 5, 274, 138, 2, 1502, 1490, 3, 2, 2, 2, 1502, 1491, 3, 2, 2, 2, 1502, 1492, 3, 2, 2, 2, 1502, 1493, 3, 2, 2, 2, 1502, 1494, 3, 2, 2, 2, 1502, 1495, 3, 2, 2, 2, 1502, 1496, 3, 2, 2, 2, 1502, 1497, 3, 2, 2, 2, 1502, 1498, 3, 2, 2, 2, 1502, 1499, 3, 2, 2, 2, 1502, 1500, 3, 2, 2, 2, 1502, 1501, 3, 2, 2, 2, 1503, 273, 3, 2, 2, 2, 1504, 1505, 7, 152, 2, 2, 1505, 1507, 7, 10, 2, 2, 1506, 1508, 7, 12, 2, 2, 1507, 1506, 3, 2, 2, 2, 1507, 1508, 3, 2, 2, 2, 1508, 1509, 3, 2, 2, 2, 1509, 1510, 7, 11, 2, 2, 1510, 275, 3, 2, 2, 2, 1511, 1512, 7, 153, 2, 2, 1512, 1513, 7, 10, 2, 2, 1513, 1514, 7, 11, 2, 2, 1514, 277, 3, 2, 2, 2, 1515, 1516, 7, 155, 2, 2, 1516, 1519, 7, 10, 2, 2, 1517, 1520, 5, 294, 148, 2, 1518, 1520, 5, 298, 150, 2, 1519, 1517, 3, 2, 2, 2, 1519, 1518, 3, 2, 2, 2, 1519, 1520, 3, 2, 2, 2, 1520, 1521, 3, 2, 2, 2, 1521, 1522, 7, 11, 2, 2, 1522, 279, 3, 2, 2, 2, 1523, 1524, 7, 156, 2, 2, 1524, 1525, 7, 10, 2, 2, 1525, 1526, 7, 11, 2, 2, 1526, 281, 3, 2, 2, 2, 1527, 1528, 7, 166, 2, 2, 1528, 1529, 7, 10, 2, 2, 1529, 1530, 7, 11, 2, 2, 1530, 283, 3, 2, 2, 2, 1531, 1532, 7, 158, 2, 2, 1532, 1533, 7, 10, 2, 2, 1533, 1534, 7, 11, 2, 2, 1534, 285, 3, 2, 2, 2, 1535, 1536, 7, 157, 2, 2, 1536, 1539, 7, 10, 2, 2, 1537, 1540, 7, 178, 2, 2, 1538, 1540, 5, 356, 179, 2, 1539, 1537, 3, 2, 2, 2, 1539, 1538, 3, 2, 2, 2, 1539, 1540, 3, 2, 2, 2, 1540, 1541, 3, 2, 2, 2, 1541, 1542, 7, 11, 2, 2, 1542, 287, 3, 2, 2, 2, 1543, 1544, 7, 142, 2, 2, 1544, 1550, 7, 10, 2, 2, 1545, 1548, 5, 290, 146, 2, 1546, 1547, 7, 15, 2, 2, 1547, 1549, 5, 308, 155, 2, 1548, 1546, 3, 2, 2, 2, 1548, 1549, 3, 2, 2, 2, 1549, 1551, 3, 2, 2, 2, 1550, 1545, 3, 2, 2, 2, 1550, 1551, 3, 2, 2, 2, 1551, 1552, 3, 2, 2, 2, 1552, 1553, 7, 11, 2, 2, 1553, 289, 3, 2, 2, 2, 1554, 1557, 5, 302, 152, 2, 1555, 1557, 7, 12, 2, 2, 1556, 1554, 3, 2, 2, 2, 1556, 1555, 3, 2, 2, 2, 1557, 291, 3, 2, 2, 2, 1558, 1559, 7, 159, 2, 2, 1559, 1560, 7, 10, 2, 2, 1560, 1561, 5, 324, 163, 2, 1561, 1562, 7, 11, 2, 2, 1562, 293, 3, 2, 2, 2, 1563, 1564, 7, 136, 2, 2, 1564, 1573, 7, 10, 2, 2, 1565, 1571, 5, 296, 149, 2, 1566, 1567, 7, 15, 2, 2, 1567, 1569, 5, 308, 155, 2, 1568, 1570, 7, 170, 2, 2, 1569, 1568, 3, 2, 2, 2, 1569, 1570, 3, 2, 2, 2, 1570, 1572, 3, 2, 2, 2, 1571, 1566, 3, 2, 2, 2, 1571, 1572, 3, 2, 2, 2, 1572, 1574, 3, 2, 2, 2, 1573, 1565, 3, 2, 2, 2, 1573, 1574, 3, 2, 2, 2, 1574, 1575, 3, 2, 2, 2, 1575, 1576, 7, 11, 2, 2, 1576, 295, 3, 2, 2, 2, 1577, 1580, 5, 304, 153, 2, 1578, 1580, 7, 12, 2, 2, 1579, 1577, 3, 2, 2, 2, 1579, 1578, 3, 2, 2, 2, 1580, 297, 3, 2, 2, 2, 1581, 1582, 7, 160, 2, 2, 1582, 1583, 7, 10, 2, 2, 1583, 1584, 5, 300, 151, 2, 1584, 1585, 7, 11, 2, 2, 1585, 299, 3, 2, 2, 2, 1586, 1587, 5, 304, 153, 2, 1587, 301, 3, 2, 2, 2, 1588, 1589, 5, 74, 38, 2, 1589, 303, 3, 2, 2, 2, 1590, 1591, 5, 74, 38, 2, 1591, 305, 3, 2, 2, 2, 1592, 1593, 5, 308, 155, 2, 1593, 307, 3, 2, 2, 2, 1594, 1595, 5, 74, 38, 2, 1595, 309, 3, 2, 2, 2, 1596, 1599, 5, 312, 157, 2, 1597, 1599, 5, 314, 158, 2, 1598, 1596, 3, 2, 2, 2, 1598, 1597, 3, 2, 2, 2, 1599, 311, 3, 2, 2, 2, 1600, 1601, 7, 168, 2, 2, 1601, 1602, 7, 10, 2, 2, 1602, 1603, 7, 12, 2, 2, 1603, 1604, 7, 11, 2, 2, 1604, 313, 3, 2, 2, 2, 1605, 1606, 7, 168, 2, 2, 1606, 1607, 7, 10, 2, 2, 1607, 1608, 5, 74, 38, 2, 1608, 1609, 7, 15, 2, 2, 1609, 1610, 5, 338, 170, 2, 1610, 1611, 7, 11, 2, 2, 1611, 315, 3, 2, 2, 2, 1612, 1615, 5, 318, 160, 2, 1613, 1615, 5, 320, 161, 2, 1614, 1612, 3, 2, 2, 2, 1614, 1613, 3, 2, 2, 2, 1615, 317, 3, 2, 2, 2, 1616, 1617, 7, 167, 2, 2, 1617, 1618, 7, 10, 2, 2, 1618, 1619, 7, 12, 2, 2, 1619, 1620, 7, 11, 2, 2, 1620, 319, 3, 2, 2, 2, 1621, 1622, 7, 167, 2, 2, 1622, 1623, 7, 10, 2, 2, 1623, 1624, 5, 338, 170, 2, 1624, 1625, 7, 11, 2, 2, 1625, 321, 3, 2, 2, 2, 1626, 1627, 7, 10, 2, 2, 1627, 1628, 5, 268, 135, 2, 1628, 1629, 7, 11, 2, 2, 1629, 323, 3, 2, 2, 2, 1630, 1631, 5, 302, 152, 2, 1631, 325, 3, 2, 2, 2, 1632, 1638, 5, 328, 165, 2, 1633, 1638, 5, 330, 166, 2, 1634, 1638, 5, 332, 167, 2, 1635, 1638, 5, 334, 168, 2, 1636, 1638, 5, 336, 169, 2, 1637, 1632, 3, 2, 2, 2, 1637, 1633, 3, 2, 2, 2, 1637, 1634, 3, 2, 2, 2, 1637, 1635, 3, 2, 2, 2, 1637, 1636, 3, 2, 2, 2, 1638, 327, 3, 2, 2, 2, 1639, 1640, 7, 161, 2, 2, 1640, 1642, 7, 10, 2, 2, 1641, 1643, 5, 356, 179, 2, 1642, 1641, 3, 2, 2, 2, 1642, 1643, 3, 2, 2, 2, 1643, 1644, 3, 2, 2, 2, 1644, 1645, 7, 11, 2, 2, 1645, 329, 3, 2, 2, 2, 1646, 1647, 7, 165, 2, 2, 1647, 1649, 7, 10, 2, 2, 1648, 1650, 5, 356, 179, 2, 1649, 1648, 3, 2, 2, 2, 1649, 1650, 3, 2, 2, 2, 1650, 1651, 3, 2, 2, 2, 1651, 1652, 7, 11, 2, 2, 1652, 331, 3, 2, 2, 2, 1653, 1654, 7, 164, 2, 2, 1654, 1656, 7, 10, 2, 2, 1655, 1657, 5, 356, 179, 2, 1656, 1655, 3, 2, 2, 2, 1656, 1657, 3, 2, 2, 2, 1657, 1658, 3, 2, 2, 2, 1658, 1659, 7, 11, 2, 2, 1659, 333, 3, 2, 2, 2, 1660, 1661, 7, 162, 2, 2, 1661, 1663, 7, 10, 2, 2, 1662, 1664, 5, 356, 179, 2, 1663, 1662, 3, 2, 2, 2, 1663, 1664, 3, 2, 2, 2, 1664, 1665, 3, 2, 2, 2, 1665, 1666, 7, 11, 2, 2, 1666, 335, 3, 2, 2, 2, 1667, 1668, 7, 163, 2, 2, 1668, 1670, 7, 10, 2, 2, 1669, 1671, 5, 356, 179, 2, 1670, 1669, 3, 2, 2, 2, 1670, 1671, 3, 2, 2, 2, 1671, 1672, 3, 2, 2, 2, 1672, 1673, 7, 11, 2, 2, 1673, 337, 3, 2, 2, 2, 1674, 1675, 7, 10, 2, 2, 1675, 1683, 7, 11, 2, 2, 1676, 1680, 5, 268, 135, 2, 1677, 1681, 7, 170, 2, 2, 1678, 1681, 7, 12, 2, 2, 1679, 1681, 7, 47, 2, 2, 1680, 1677, 3, 2, 2, 2, 1680, 1678, 3, 2, 2, 2, 1680, 1679, 3, 2, 2, 2, 1680, 1681, 3, 2, 2, 2, 1681, 1683, 3, 2, 2, 2, 1682, 1674, 3, 2, 2, 2, 1682, 1676, 3, 2, 2, 2, 1683, 339, 3, 2, 2, 2, 1684, 1693, 7, 8, 2, 2, 1685, 1690, 5, 350, 176, 2, 1686, 1687, 7, 15, 2, 2, 1687, 1689, 5, 350, 176, 2, 1688, 1686, 3, 2, 2, 2, 1689, 1692, 3, 2, 2, 2, 1690, 1688, 3, 2, 2, 2, 1690, 1691, 3, 2, 2, 2, 1691, 1694, 3, 2, 2, 2, 1692, 1690, 3, 2, 2, 2, 1693, 1685, 3, 2, 2, 2, 1693, 1694, 3, 2, 2, 2, 1694, 1695, 3, 2, 2, 2, 1695, 1701, 7, 9, 2, 2, 1696, 1697, 7, 59, 2, 2, 1697, 1698, 5, 94, 48, 2, 1698, 1699, 7, 60, 2, 2, 1699, 1701, 3, 2, 2, 2, 1700, 1684, 3, 2, 2, 2, 1700, 1696, 3, 2, 2, 2, 1701, 341, 3, 2, 2, 2, 1702, 1705, 5, 344, 173, 2, 1703, 1705, 5, 346, 174, 2, 1704, 1702, 3, 2, 2, 2, 1704, 1703, 3, 2, 2, 2, 1705, 343, 3, 2, 2, 2, 1706, 1707, 7, 31, 2, 2, 1707, 1708, 7, 10, 2, 2, 1708, 1709, 7, 12, 2, 2, 1709, 1710, 7, 11, 2, 2, 1710, 345, 3, 2, 2, 2, 1711, 1712, 7, 31, 2, 2, 1712, 1721, 7, 10, 2, 2, 1713, 1718, 5, 338, 170, 2, 1714, 1715, 7, 15, 2, 2, 1715, 1717, 5, 338, 170, 2, 1716, 1714, 3, 2, 2, 2, 1717, 1720, 3, 2, 2, 2, 1718, 1716, 3, 2, 2, 2, 1718, 1719, 3, 2, 2, 2, 1719, 1722, 3, 2, 2, 2, 1720, 1718, 3, 2, 2, 2, 1721, 1713, 3, 2, 2, 2, 1721, 1722, 3, 2, 2, 2, 1722, 1723, 3, 2, 2, 2, 1723, 1724, 7, 11, 2, 2, 1724, 1725, 7, 70, 2, 2, 1725, 1726, 5, 338, 170, 2, 1726, 347, 3, 2, 2, 2, 1727, 1729, 5, 268, 135, 2, 1728, 1730, 7, 170, 2, 2, 1729, 1728, 3, 2, 2, 2, 1729, 1730, 3, 2, 2, 2, 1730, 349, 3, 2, 2, 2, 1731, 1734, 5, 96, 49, 2, 1732, 1734, 7, 178, 2, 2, 1733, 1731, 3, 2, 2, 2, 1733, 1732, 3, 2, 2, 2, 1734, 1735, 3, 2, 2, 2, 1735, 1736, 9, 11, 2, 2, 1736, 1737, 5, 96, 49, 2, 1737, 351, 3, 2, 2, 2, 1738, 1740, 7, 53, 2, 2, 1739, 1741, 5, 94, 48, 2, 1740, 1739, 3, 2, 2, 2, 1740, 1741, 3, 2, 2, 2, 1741, 1742, 3, 2, 2, 2, 1742, 1743, 7, 54, 2, 2, 1743, 353, 3, 2, 2, 2, 1744, 1745, 5, 356, 179, 2, 1745, 355, 3, 2, 2, 2, 1746, 1747, 7, 169, 2, 2, 1747, 357, 3, 2, 2, 2, 1748, 1749, 9, 12, 2, 2, 1749, 359, 3, 2, 2, 2, 169, 368, 372, 388, 394, 402, 410, 418, 433, 463, 471, 473, 495, 505, 515, 520, 525, 529, 541, 545, 554, 561, 575, 579, 584, 594, 602, 606, 618, 630, 652, 660, 665, 668, 672, 681, 690, 693, 701, 708, 710, 717, 724, 726, 734, 739, 746, 753, 763, 770, 777, 784, 793, 803, 807, 815, 817, 829, 835, 839, 843, 854, 860, 875, 881, 885, 889, 896, 903, 909, 914, 916, 920, 927, 934, 943, 955, 965, 977, 981, 990, 997, 1019, 1024, 1029, 1033, 1045, 1053, 1057, 1064, 1071, 1077, 1084, 1092, 1099, 1105, 1111, 1117, 1123, 1134, 1140, 1145, 1153, 1174, 1183, 1185, 1208, 1225, 1236, 1258, 1262, 1269, 1273, 1283, 1288, 1302, 1311, 1317, 1344, 1361, 1363, 1372, 1381, 1384, 1392, 1396, 1401, 1408, 1413, 1417, 1425, 1432, 1440, 1450, 1454, 1459, 1472, 1486, 1502, 1507, 1519, 1539, 1548, 1550, 1556, 1569, 1571, 1573, 1579, 1598, 1614, 1637, 1642, 1649, 1656, 1663, 1670, 1680, 1682, 1690, 1693, 1700, 1704, 1718, 1721, 1729, 1733, 1740] \ No newline at end of file diff --git a/src/main/java/org/rumbledb/parser/JsoniqParser.java b/src/main/java/org/rumbledb/parser/JsoniqParser.java index 8aeaba0ec..331b5390d 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqParser.java +++ b/src/main/java/org/rumbledb/parser/JsoniqParser.java @@ -9179,7 +9179,7 @@ public final PathExprContext pathExpr() throws RecognitionException { setState(1394); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { setState(1393); ((PathExprContext)_localctx).singleslash = relativePathExpr(); @@ -9203,6 +9203,7 @@ public final PathExprContext pathExpr() throws RecognitionException { case T__3: case T__5: case T__7: + case T__9: case T__11: case T__14: case T__28: @@ -9506,6 +9507,7 @@ public final AxisStepContext axisStep() throws RecognitionException { reverseStep(); } break; + case T__9: case Kfor: case Klet: case Kwhere: @@ -9960,6 +9962,7 @@ public final NodeTestContext nodeTest() throws RecognitionException { setState(1448); _errHandler.sync(this); switch (_input.LA(1)) { + case T__9: case Kfor: case Klet: case Kwhere: @@ -10099,12 +10102,23 @@ public final NameTestContext nameTest() throws RecognitionException { NameTestContext _localctx = new NameTestContext(_ctx, getState()); enterRule(_localctx, 256, RULE_nameTest); try { - enterOuterAlt(_localctx, 1); - { - setState(1450); - qname(); - setState(1451); - wildcard(); + setState(1452); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1450); + qname(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1451); + wildcard(); + } + break; } } catch (RecognitionException re) { @@ -10164,14 +10178,14 @@ public final WildcardContext wildcard() throws RecognitionException { WildcardContext _localctx = new WildcardContext(_ctx, getState()); enterRule(_localctx, 258, RULE_wildcard); try { - setState(1456); + setState(1457); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { case 1: _localctx = new AllNamesContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(1453); + setState(1454); match(T__9); } break; @@ -10179,7 +10193,7 @@ public final WildcardContext wildcard() throws RecognitionException { _localctx = new AllWithNSContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(1454); + setState(1455); nCNameWithLocalWildcard(); } break; @@ -10187,7 +10201,7 @@ public final WildcardContext wildcard() throws RecognitionException { _localctx = new AllWithLocalContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(1455); + setState(1456); nCNameWithPrefixWildcard(); } break; @@ -10223,11 +10237,11 @@ public final NCNameWithLocalWildcardContext nCNameWithLocalWildcard() throws Rec try { enterOuterAlt(_localctx, 1); { - setState(1458); - match(NCName); setState(1459); - match(T__16); + match(NCName); setState(1460); + match(T__16); + setState(1461); match(T__9); } } @@ -10261,11 +10275,11 @@ public final NCNameWithPrefixWildcardContext nCNameWithPrefixWildcard() throws R try { enterOuterAlt(_localctx, 1); { - setState(1462); - match(T__9); setState(1463); - match(T__16); + match(T__9); setState(1464); + match(T__16); + setState(1465); match(NCName); } } @@ -10305,17 +10319,17 @@ public final PredicateListContext predicateList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1469); + setState(1470); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__50) { { { - setState(1466); + setState(1467); predicate(); } } - setState(1471); + setState(1472); _errHandler.sync(this); _la = _input.LA(1); } @@ -10371,27 +10385,27 @@ public final ItemTypeContext itemType() throws RecognitionException { ItemTypeContext _localctx = new ItemTypeContext(_ctx, getState()); enterRule(_localctx, 266, RULE_itemType); try { - setState(1483); + setState(1484); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1472); + setState(1473); qname(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1473); + setState(1474); match(NullLiteral); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1474); + setState(1475); kindTest(); } break; @@ -10399,11 +10413,11 @@ public final ItemTypeContext itemType() throws RecognitionException { enterOuterAlt(_localctx, 4); { { - setState(1475); - match(Kitem); setState(1476); - match(T__7); + match(Kitem); setState(1477); + match(T__7); + setState(1478); match(T__8); } } @@ -10411,35 +10425,35 @@ public final ItemTypeContext itemType() throws RecognitionException { case 5: enterOuterAlt(_localctx, 5); { - setState(1478); + setState(1479); functionTest(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1479); + setState(1480); mapTest(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1480); + setState(1481); arrayTest(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1481); + setState(1482); atomicOrUnionType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1482); + setState(1483); parenthesizedItemTest(); } break; @@ -10477,7 +10491,7 @@ public final AtomicOrUnionTypeContext atomicOrUnionType() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1485); + setState(1486); qname(); } } @@ -10544,69 +10558,69 @@ public final KindTestContext kindTest() throws RecognitionException { KindTestContext _localctx = new KindTestContext(_ctx, getState()); enterRule(_localctx, 270, RULE_kindTest); try { - setState(1499); + setState(1500); _errHandler.sync(this); switch (_input.LA(1)) { case Kdocument_node: enterOuterAlt(_localctx, 1); { - setState(1487); + setState(1488); documentTest(); } break; case Kelement: enterOuterAlt(_localctx, 2); { - setState(1488); + setState(1489); elementTest(); } break; case Kattribute: enterOuterAlt(_localctx, 3); { - setState(1489); + setState(1490); attributeTest(); } break; case Kschema_element: enterOuterAlt(_localctx, 4); { - setState(1490); + setState(1491); schemaElementTest(); } break; case Kschema_attribute: enterOuterAlt(_localctx, 5); { - setState(1491); + setState(1492); schemaAttributeTest(); } break; case Kpi: enterOuterAlt(_localctx, 6); { - setState(1492); + setState(1493); piTest(); } break; case Kcomment: enterOuterAlt(_localctx, 7); { - setState(1493); + setState(1494); commentTest(); } break; case Ktext: enterOuterAlt(_localctx, 8); { - setState(1494); + setState(1495); textTest(); } break; case Knamespace_node: enterOuterAlt(_localctx, 9); { - setState(1495); + setState(1496); namespaceNodeTest(); } break; @@ -10617,21 +10631,21 @@ public final KindTestContext kindTest() throws RecognitionException { case Kobject_node: enterOuterAlt(_localctx, 10); { - setState(1496); + setState(1497); mlNodeTest(); } break; case Kbinary: enterOuterAlt(_localctx, 11); { - setState(1497); + setState(1498); binaryNodeTest(); } break; case Knode: enterOuterAlt(_localctx, 12); { - setState(1498); + setState(1499); anyKindTest(); } break; @@ -10670,21 +10684,21 @@ public final AnyKindTestContext anyKindTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1501); - match(Knode); setState(1502); + match(Knode); + setState(1503); match(T__7); - setState(1504); + setState(1505); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__9) { { - setState(1503); + setState(1504); match(T__9); } } - setState(1506); + setState(1507); match(T__8); } } @@ -10718,11 +10732,11 @@ public final BinaryNodeTestContext binaryNodeTest() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1508); - match(Kbinary); setState(1509); - match(T__7); + match(Kbinary); setState(1510); + match(T__7); + setState(1511); match(T__8); } } @@ -10762,22 +10776,22 @@ public final DocumentTestContext documentTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1512); - match(Kdocument_node); setState(1513); + match(Kdocument_node); + setState(1514); match(T__7); - setState(1516); + setState(1517); _errHandler.sync(this); switch (_input.LA(1)) { case Kelement: { - setState(1514); + setState(1515); elementTest(); } break; case Kschema_element: { - setState(1515); + setState(1516); schemaElementTest(); } break; @@ -10786,7 +10800,7 @@ public final DocumentTestContext documentTest() throws RecognitionException { default: break; } - setState(1518); + setState(1519); match(T__8); } } @@ -10820,11 +10834,11 @@ public final TextTestContext textTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1520); - match(Ktext); setState(1521); - match(T__7); + match(Ktext); setState(1522); + match(T__7); + setState(1523); match(T__8); } } @@ -10858,11 +10872,11 @@ public final CommentTestContext commentTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1524); - match(Kcomment); setState(1525); - match(T__7); + match(Kcomment); setState(1526); + match(T__7); + setState(1527); match(T__8); } } @@ -10896,11 +10910,11 @@ public final NamespaceNodeTestContext namespaceNodeTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1528); - match(Knamespace_node); setState(1529); - match(T__7); + match(Knamespace_node); setState(1530); + match(T__7); + setState(1531); match(T__8); } } @@ -10938,22 +10952,22 @@ public final PiTestContext piTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1532); - match(Kpi); setState(1533); + match(Kpi); + setState(1534); match(T__7); - setState(1536); + setState(1537); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(1534); + setState(1535); match(NCName); } break; case STRING: { - setState(1535); + setState(1536); stringLiteral(); } break; @@ -10962,7 +10976,7 @@ public final PiTestContext piTest() throws RecognitionException { default: break; } - setState(1538); + setState(1539); match(T__8); } } @@ -11004,25 +11018,25 @@ public final AttributeTestContext attributeTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1540); - match(Kattribute); setState(1541); + match(Kattribute); + setState(1542); match(T__7); - setState(1547); + setState(1548); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1542); + setState(1543); attributeNameOrWildcard(); - setState(1545); + setState(1546); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__12) { { - setState(1543); - match(T__12); setState(1544); + match(T__12); + setState(1545); ((AttributeTestContext)_localctx).type = typeName(); } } @@ -11030,7 +11044,7 @@ public final AttributeTestContext attributeTest() throws RecognitionException { } } - setState(1549); + setState(1550); match(T__8); } } @@ -11064,7 +11078,7 @@ public final AttributeNameOrWildcardContext attributeNameOrWildcard() throws Rec AttributeNameOrWildcardContext _localctx = new AttributeNameOrWildcardContext(_ctx, getState()); enterRule(_localctx, 288, RULE_attributeNameOrWildcard); try { - setState(1553); + setState(1554); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -11143,14 +11157,14 @@ public final AttributeNameOrWildcardContext attributeNameOrWildcard() throws Rec case NCName: enterOuterAlt(_localctx, 1); { - setState(1551); + setState(1552); attributeName(); } break; case T__9: enterOuterAlt(_localctx, 2); { - setState(1552); + setState(1553); match(T__9); } break; @@ -11191,13 +11205,13 @@ public final SchemaAttributeTestContext schemaAttributeTest() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(1555); - match(Kschema_attribute); setState(1556); - match(T__7); + match(Kschema_attribute); setState(1557); - attributeDeclaration(); + match(T__7); setState(1558); + attributeDeclaration(); + setState(1559); match(T__8); } } @@ -11241,32 +11255,32 @@ public final ElementTestContext elementTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1560); - match(Kelement); setState(1561); + match(Kelement); + setState(1562); match(T__7); - setState(1570); + setState(1571); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1562); + setState(1563); elementNameOrWildcard(); - setState(1568); + setState(1569); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__12) { { - setState(1563); - match(T__12); setState(1564); + match(T__12); + setState(1565); ((ElementTestContext)_localctx).type = typeName(); - setState(1566); + setState(1567); _errHandler.sync(this); _la = _input.LA(1); if (_la==ArgumentPlaceholder) { { - setState(1565); + setState(1566); ((ElementTestContext)_localctx).optional = match(ArgumentPlaceholder); } } @@ -11277,7 +11291,7 @@ public final ElementTestContext elementTest() throws RecognitionException { } } - setState(1572); + setState(1573); match(T__8); } } @@ -11311,7 +11325,7 @@ public final ElementNameOrWildcardContext elementNameOrWildcard() throws Recogni ElementNameOrWildcardContext _localctx = new ElementNameOrWildcardContext(_ctx, getState()); enterRule(_localctx, 294, RULE_elementNameOrWildcard); try { - setState(1576); + setState(1577); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -11390,14 +11404,14 @@ public final ElementNameOrWildcardContext elementNameOrWildcard() throws Recogni case NCName: enterOuterAlt(_localctx, 1); { - setState(1574); + setState(1575); elementName(); } break; case T__9: enterOuterAlt(_localctx, 2); { - setState(1575); + setState(1576); match(T__9); } break; @@ -11438,13 +11452,13 @@ public final SchemaElementTestContext schemaElementTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1578); - match(Kschema_element); setState(1579); - match(T__7); + match(Kschema_element); setState(1580); - elementDeclaration(); + match(T__7); setState(1581); + elementDeclaration(); + setState(1582); match(T__8); } } @@ -11480,7 +11494,7 @@ public final ElementDeclarationContext elementDeclaration() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(1583); + setState(1584); elementName(); } } @@ -11516,7 +11530,7 @@ public final AttributeNameContext attributeName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1585); + setState(1586); qname(); } } @@ -11552,7 +11566,7 @@ public final ElementNameContext elementName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1587); + setState(1588); qname(); } } @@ -11588,7 +11602,7 @@ public final SimpleTypeNameContext simpleTypeName() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1589); + setState(1590); typeName(); } } @@ -11624,7 +11638,7 @@ public final TypeNameContext typeName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1591); + setState(1592); qname(); } } @@ -11661,20 +11675,20 @@ public final MapTestContext mapTest() throws RecognitionException { MapTestContext _localctx = new MapTestContext(_ctx, getState()); enterRule(_localctx, 308, RULE_mapTest); try { - setState(1595); + setState(1596); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1593); + setState(1594); anyMapTest(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1594); + setState(1595); typedMapTest(); } break; @@ -11710,13 +11724,13 @@ public final AnyMapTestContext anyMapTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1597); - match(Kmap); setState(1598); - match(T__7); + match(Kmap); setState(1599); - match(T__9); + match(T__7); setState(1600); + match(T__9); + setState(1601); match(T__8); } } @@ -11756,17 +11770,17 @@ public final TypedMapTestContext typedMapTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1602); - match(Kmap); setState(1603); - match(T__7); + match(Kmap); setState(1604); - qname(); + match(T__7); setState(1605); - match(T__12); + qname(); setState(1606); - sequenceType(); + match(T__12); setState(1607); + sequenceType(); + setState(1608); match(T__8); } } @@ -11803,20 +11817,20 @@ public final ArrayTestContext arrayTest() throws RecognitionException { ArrayTestContext _localctx = new ArrayTestContext(_ctx, getState()); enterRule(_localctx, 314, RULE_arrayTest); try { - setState(1611); + setState(1612); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1609); + setState(1610); anyArrayTest(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1610); + setState(1611); typedArrayTest(); } break; @@ -11852,13 +11866,13 @@ public final AnyArrayTestContext anyArrayTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1613); - match(Karray); setState(1614); - match(T__7); + match(Karray); setState(1615); - match(T__9); + match(T__7); setState(1616); + match(T__9); + setState(1617); match(T__8); } } @@ -11895,13 +11909,13 @@ public final TypedArrayTestContext typedArrayTest() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1618); - match(Karray); setState(1619); - match(T__7); + match(Karray); setState(1620); - sequenceType(); + match(T__7); setState(1621); + sequenceType(); + setState(1622); match(T__8); } } @@ -11937,11 +11951,11 @@ public final ParenthesizedItemTestContext parenthesizedItemTest() throws Recogni try { enterOuterAlt(_localctx, 1); { - setState(1623); - match(T__7); setState(1624); - itemType(); + match(T__7); setState(1625); + itemType(); + setState(1626); match(T__8); } } @@ -11977,7 +11991,7 @@ public final AttributeDeclarationContext attributeDeclaration() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(1627); + setState(1628); attributeName(); } } @@ -12023,41 +12037,41 @@ public final MlNodeTestContext mlNodeTest() throws RecognitionException { MlNodeTestContext _localctx = new MlNodeTestContext(_ctx, getState()); enterRule(_localctx, 324, RULE_mlNodeTest); try { - setState(1634); + setState(1635); _errHandler.sync(this); switch (_input.LA(1)) { case Karray_node: enterOuterAlt(_localctx, 1); { - setState(1629); + setState(1630); mlArrayNodeTest(); } break; case Kobject_node: enterOuterAlt(_localctx, 2); { - setState(1630); + setState(1631); mlObjectNodeTest(); } break; case Knumber_node: enterOuterAlt(_localctx, 3); { - setState(1631); + setState(1632); mlNumberNodeTest(); } break; case Kboolean_node: enterOuterAlt(_localctx, 4); { - setState(1632); + setState(1633); mlBooleanNodeTest(); } break; case Knull_node: enterOuterAlt(_localctx, 5); { - setState(1633); + setState(1634); mlNullNodeTest(); } break; @@ -12099,21 +12113,21 @@ public final MlArrayNodeTestContext mlArrayNodeTest() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1636); - match(Karray_node); setState(1637); + match(Karray_node); + setState(1638); match(T__7); - setState(1639); + setState(1640); _errHandler.sync(this); _la = _input.LA(1); if (_la==STRING) { { - setState(1638); + setState(1639); stringLiteral(); } } - setState(1641); + setState(1642); match(T__8); } } @@ -12151,21 +12165,21 @@ public final MlObjectNodeTestContext mlObjectNodeTest() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1643); - match(Kobject_node); setState(1644); + match(Kobject_node); + setState(1645); match(T__7); - setState(1646); + setState(1647); _errHandler.sync(this); _la = _input.LA(1); if (_la==STRING) { { - setState(1645); + setState(1646); stringLiteral(); } } - setState(1648); + setState(1649); match(T__8); } } @@ -12203,21 +12217,21 @@ public final MlNumberNodeTestContext mlNumberNodeTest() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1650); - match(Knumber_node); setState(1651); + match(Knumber_node); + setState(1652); match(T__7); - setState(1653); + setState(1654); _errHandler.sync(this); _la = _input.LA(1); if (_la==STRING) { { - setState(1652); + setState(1653); stringLiteral(); } } - setState(1655); + setState(1656); match(T__8); } } @@ -12255,21 +12269,21 @@ public final MlBooleanNodeTestContext mlBooleanNodeTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1657); - match(Kboolean_node); setState(1658); + match(Kboolean_node); + setState(1659); match(T__7); - setState(1660); + setState(1661); _errHandler.sync(this); _la = _input.LA(1); if (_la==STRING) { { - setState(1659); + setState(1660); stringLiteral(); } } - setState(1662); + setState(1663); match(T__8); } } @@ -12307,21 +12321,21 @@ public final MlNullNodeTestContext mlNullNodeTest() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1664); - match(Knull_node); setState(1665); + match(Knull_node); + setState(1666); match(T__7); - setState(1667); + setState(1668); _errHandler.sync(this); _la = _input.LA(1); if (_la==STRING) { { - setState(1666); + setState(1667); stringLiteral(); } } - setState(1669); + setState(1670); match(T__8); } } @@ -12363,43 +12377,43 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { SequenceTypeContext _localctx = new SequenceTypeContext(_ctx, getState()); enterRule(_localctx, 336, RULE_sequenceType); try { - setState(1679); + setState(1680); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1671); - match(T__7); setState(1672); + match(T__7); + setState(1673); match(T__8); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1673); + setState(1674); ((SequenceTypeContext)_localctx).item = itemType(); - setState(1677); + setState(1678); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { case 1: { - setState(1674); + setState(1675); ((SequenceTypeContext)_localctx).s168 = match(ArgumentPlaceholder); ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s168); } break; case 2: { - setState(1675); + setState(1676); ((SequenceTypeContext)_localctx).s10 = match(T__9); ((SequenceTypeContext)_localctx).star.add(((SequenceTypeContext)_localctx).s10); } break; case 3: { - setState(1676); + setState(1677); ((SequenceTypeContext)_localctx).s45 = match(T__44); ((SequenceTypeContext)_localctx).plus.add(((SequenceTypeContext)_localctx).s45); } @@ -12448,53 +12462,53 @@ public final ObjectConstructorContext objectConstructor() throws RecognitionExce enterRule(_localctx, 338, RULE_objectConstructor); int _la; try { - setState(1697); + setState(1698); _errHandler.sync(this); switch (_input.LA(1)) { case T__5: enterOuterAlt(_localctx, 1); { - setState(1681); + setState(1682); match(T__5); - setState(1690); + setState(1691); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1682); + setState(1683); pairConstructor(); - setState(1687); + setState(1688); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(1683); - match(T__12); setState(1684); + match(T__12); + setState(1685); pairConstructor(); } } - setState(1689); + setState(1690); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1692); + setState(1693); match(T__6); } break; case T__56: enterOuterAlt(_localctx, 2); { - setState(1693); + setState(1694); ((ObjectConstructorContext)_localctx).s57 = match(T__56); ((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s57); - setState(1694); - expr(); setState(1695); + expr(); + setState(1696); match(T__57); } break; @@ -12537,18 +12551,18 @@ public final FunctionTestContext functionTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1701); + setState(1702); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { case 1: { - setState(1699); + setState(1700); anyFunctionTest(); } break; case 2: { - setState(1700); + setState(1701); typedFunctionTest(); } break; @@ -12584,13 +12598,13 @@ public final AnyFunctionTestContext anyFunctionTest() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1703); - match(T__28); setState(1704); - match(T__7); + match(T__28); setState(1705); - match(T__9); + match(T__7); setState(1706); + match(T__9); + setState(1707); match(T__8); } } @@ -12634,43 +12648,43 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1708); - match(T__28); setState(1709); + match(T__28); + setState(1710); match(T__7); - setState(1718); + setState(1719); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__7) | (1L << T__28) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kattribute - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (Karray - 128)) | (1L << (Kmap - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1710); + setState(1711); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); - setState(1715); + setState(1716); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(1711); - match(T__12); setState(1712); + match(T__12); + setState(1713); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); } } - setState(1717); + setState(1718); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1720); - match(T__8); setState(1721); - match(Kas); + match(T__8); setState(1722); + match(Kas); + setState(1723); ((TypedFunctionTestContext)_localctx).rt = sequenceType(); } } @@ -12710,14 +12724,14 @@ public final SingleTypeContext singleType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1724); + setState(1725); ((SingleTypeContext)_localctx).item = itemType(); - setState(1726); + setState(1727); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { case 1: { - setState(1725); + setState(1726); ((SingleTypeContext)_localctx).s168 = match(ArgumentPlaceholder); ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s168); } @@ -12766,23 +12780,23 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1730); + setState(1731); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,165,_ctx) ) { case 1: { - setState(1728); + setState(1729); ((PairConstructorContext)_localctx).lhs = exprSingle(); } break; case 2: { - setState(1729); + setState(1730); ((PairConstructorContext)_localctx).name = match(NCName); } break; } - setState(1732); + setState(1733); _la = _input.LA(1); if ( !(_la==T__16 || _la==ArgumentPlaceholder) ) { _errHandler.recoverInline(this); @@ -12792,7 +12806,7 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio _errHandler.reportMatch(this); consume(); } - setState(1733); + setState(1734); ((PairConstructorContext)_localctx).rhs = exprSingle(); } } @@ -12829,19 +12843,19 @@ public final ArrayConstructorContext arrayConstructor() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1735); + setState(1736); match(T__50); - setState(1737); + setState(1738); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1736); + setState(1737); expr(); } } - setState(1739); + setState(1740); match(T__51); } } @@ -12877,7 +12891,7 @@ public final UriLiteralContext uriLiteral() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1741); + setState(1742); stringLiteral(); } } @@ -12911,7 +12925,7 @@ public final StringLiteralContext stringLiteral() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1743); + setState(1744); match(STRING); } } @@ -13018,7 +13032,7 @@ public final KeyWordsContext keyWords() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1745); + setState(1746); _la = _input.LA(1); if ( !(((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (Kfor - 59)) | (1L << (Klet - 59)) | (1L << (Kwhere - 59)) | (1L << (Kgroup - 59)) | (1L << (Kby - 59)) | (1L << (Korder - 59)) | (1L << (Kreturn - 59)) | (1L << (Kif - 59)) | (1L << (Kin - 59)) | (1L << (Kas - 59)) | (1L << (Kat - 59)) | (1L << (Kallowing - 59)) | (1L << (Kempty - 59)) | (1L << (Kcount - 59)) | (1L << (Kstable - 59)) | (1L << (Kascending - 59)) | (1L << (Kdescending - 59)) | (1L << (Ksome - 59)) | (1L << (Kevery - 59)) | (1L << (Ksatisfies - 59)) | (1L << (Kcollation - 59)) | (1L << (Kgreatest - 59)) | (1L << (Kleast - 59)) | (1L << (Kswitch - 59)) | (1L << (Kcase - 59)) | (1L << (Ktry - 59)) | (1L << (Kcatch - 59)) | (1L << (Kdefault - 59)) | (1L << (Kthen - 59)) | (1L << (Kelse - 59)) | (1L << (Ktypeswitch - 59)) | (1L << (Kor - 59)) | (1L << (Kand - 59)) | (1L << (Knot - 59)) | (1L << (Kto - 59)) | (1L << (Kinstance - 59)) | (1L << (Kof - 59)) | (1L << (Kstatically - 59)) | (1L << (Kis - 59)) | (1L << (Ktreat - 59)) | (1L << (Kcast - 59)) | (1L << (Kcastable - 59)) | (1L << (Kversion - 59)) | (1L << (Kjsoniq - 59)) | (1L << (Kunordered - 59)) | (1L << (Ktrue - 59)) | (1L << (Kfalse - 59)) | (1L << (Ktype - 59)) | (1L << (Kvalidate - 59)) | (1L << (Kannotate - 59)) | (1L << (Kdeclare - 59)) | (1L << (Kcontext - 59)) | (1L << (Kitem - 59)) | (1L << (Kvariable - 59)) | (1L << (Kinsert - 59)) | (1L << (Kdelete - 59)) | (1L << (Krename - 59)) | (1L << (Kreplace - 59)) | (1L << (Kcopy - 59)) | (1L << (Kmodify - 59)) | (1L << (Kappend - 59)) | (1L << (Kinto - 59)) | (1L << (Kvalue - 59)) | (1L << (Kjson - 59)))) != 0) || ((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (Kwith - 123)) | (1L << (Kposition - 123)) | (1L << (Kbreak - 123)) | (1L << (Kloop - 123)) | (1L << (Kcontinue - 123)) | (1L << (Kexit - 123)) | (1L << (Kreturning - 123)) | (1L << (Kwhile - 123)) | (1L << (NullLiteral - 123)))) != 0)) ) { _errHandler.recoverInline(this); @@ -13042,7 +13056,7 @@ public final KeyWordsContext keyWords() throws RecognitionException { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00b4\u06d6\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00b4\u06d7\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -13140,327 +13154,328 @@ public final KeyWordsContext keyWords() throws RecognitionException { "x\u0582\13x\3y\3y\5y\u0586\ny\3z\3z\5z\u058a\nz\3z\3z\3{\3{\3{\3{\5{\u0592"+ "\n{\3|\3|\3|\3|\3}\5}\u0599\n}\3}\3}\3~\3~\3~\3~\5~\u05a1\n~\3\177\3\177"+ "\3\177\3\177\3\u0080\3\u0080\3\u0081\3\u0081\5\u0081\u05ab\n\u0081\3\u0082"+ - "\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083\5\u0083\u05b3\n\u0083\3\u0084"+ - "\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086\7\u0086"+ - "\u05be\n\u0086\f\u0086\16\u0086\u05c1\13\u0086\3\u0087\3\u0087\3\u0087"+ - "\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\5\u0087"+ - "\u05ce\n\u0087\3\u0088\3\u0088\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089"+ - "\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\5\u0089\u05de"+ - "\n\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u05e3\n\u008a\3\u008a\3\u008a"+ - "\3\u008b\3\u008b\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\5\u008c"+ - "\u05ef\n\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e"+ - "\3\u008e\3\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090"+ - "\3\u0090\3\u0090\5\u0090\u0603\n\u0090\3\u0090\3\u0090\3\u0091\3\u0091"+ - "\3\u0091\3\u0091\3\u0091\5\u0091\u060c\n\u0091\5\u0091\u060e\n\u0091\3"+ - "\u0091\3\u0091\3\u0092\3\u0092\5\u0092\u0614\n\u0092\3\u0093\3\u0093\3"+ - "\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094"+ - "\5\u0094\u0621\n\u0094\5\u0094\u0623\n\u0094\5\u0094\u0625\n\u0094\3\u0094"+ - "\3\u0094\3\u0095\3\u0095\5\u0095\u062b\n\u0095\3\u0096\3\u0096\3\u0096"+ - "\3\u0096\3\u0096\3\u0097\3\u0097\3\u0098\3\u0098\3\u0099\3\u0099\3\u009a"+ - "\3\u009a\3\u009b\3\u009b\3\u009c\3\u009c\5\u009c\u063e\n\u009c\3\u009d"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ - "\3\u009e\3\u009e\3\u009f\3\u009f\5\u009f\u064e\n\u009f\3\u00a0\3\u00a0"+ - "\3\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a2"+ - "\3\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4"+ - "\3\u00a4\5\u00a4\u0665\n\u00a4\3\u00a5\3\u00a5\3\u00a5\5\u00a5\u066a\n"+ - "\u00a5\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a6\5\u00a6\u0671\n\u00a6\3"+ - "\u00a6\3\u00a6\3\u00a7\3\u00a7\3\u00a7\5\u00a7\u0678\n\u00a7\3\u00a7\3"+ - "\u00a7\3\u00a8\3\u00a8\3\u00a8\5\u00a8\u067f\n\u00a8\3\u00a8\3\u00a8\3"+ - "\u00a9\3\u00a9\3\u00a9\5\u00a9\u0686\n\u00a9\3\u00a9\3\u00a9\3\u00aa\3"+ - "\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u0690\n\u00aa\5\u00aa\u0692"+ - "\n\u00aa\3\u00ab\3\u00ab\3\u00ab\3\u00ab\7\u00ab\u0698\n\u00ab\f\u00ab"+ - "\16\u00ab\u069b\13\u00ab\5\u00ab\u069d\n\u00ab\3\u00ab\3\u00ab\3\u00ab"+ - "\3\u00ab\3\u00ab\5\u00ab\u06a4\n\u00ab\3\u00ac\3\u00ac\5\u00ac\u06a8\n"+ - "\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00ae"+ - "\3\u00ae\3\u00ae\7\u00ae\u06b4\n\u00ae\f\u00ae\16\u00ae\u06b7\13\u00ae"+ - "\5\u00ae\u06b9\n\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af"+ - "\5\u00af\u06c1\n\u00af\3\u00b0\3\u00b0\5\u00b0\u06c5\n\u00b0\3\u00b0\3"+ - "\u00b0\3\u00b0\3\u00b1\3\u00b1\5\u00b1\u06cc\n\u00b1\3\u00b1\3\u00b1\3"+ - "\u00b2\3\u00b2\3\u00b3\3\u00b3\3\u00b4\3\u00b4\3\u00b4\2\2\u00b5\2\4\6"+ - "\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRT"+ - "VXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e"+ - "\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6"+ - "\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be"+ - "\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6"+ - "\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee"+ - "\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106"+ - "\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e"+ - "\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136"+ - "\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c\u014e"+ - "\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166"+ - "\2\r\4\2\21\21ii\3\2RS\3\2\24\35\4\2\5\5#-\3\2/\60\4\2\f\f\61\63\3\2\u0089"+ - "\u008a\3\2\u008c\u0092\3\2\u0093\u0097\4\2\23\23\u00aa\u00aa\4\2=\u0084"+ - "\u00ab\u00ab\2\u071c\2\u0168\3\2\2\2\4\u0170\3\2\2\2\6\u0176\3\2\2\2\b"+ - "\u0179\3\2\2\2\n\u018a\3\2\2\2\f\u0195\3\2\2\2\16\u019a\3\2\2\2\20\u019d"+ - "\3\2\2\2\22\u01a0\3\2\2\2\24\u01b1\3\2\2\2\26\u01b3\3\2\2\2\30\u01b6\3"+ - "\2\2\2\32\u01bc\3\2\2\2\34\u01c0\3\2\2\2\36\u01c4\3\2\2\2 \u01c8\3\2\2"+ - "\2\"\u01cf\3\2\2\2$\u01df\3\2\2\2&\u01e8\3\2\2\2(\u01f7\3\2\2\2*\u01fe"+ - "\3\2\2\2,\u0205\3\2\2\2.\u0216\3\2\2\2\60\u0226\3\2\2\2\62\u0237\3\2\2"+ - "\2\64\u0248\3\2\2\2\66\u024b\3\2\2\28\u0257\3\2\2\2:\u0260\3\2\2\2<\u026a"+ - "\3\2\2\2>\u026c\3\2\2\2@\u0276\3\2\2\2B\u0278\3\2\2\2D\u027d\3\2\2\2F"+ - "\u0281\3\2\2\2H\u0287\3\2\2\2J\u029c\3\2\2\2L\u02a2\3\2\2\2N\u02a4\3\2"+ - "\2\2P\u02b7\3\2\2\2R\u02c8\3\2\2\2T\u02d8\3\2\2\2V\u02ec\3\2\2\2X\u02fb"+ - "\3\2\2\2Z\u02fd\3\2\2\2\\\u0305\3\2\2\2^\u030b\3\2\2\2`\u0319\3\2\2\2"+ - "b\u0323\3\2\2\2d\u0327\3\2\2\2f\u0337\3\2\2\2h\u0340\3\2\2\2j\u0350\3"+ - "\2\2\2l\u0359\3\2\2\2n\u0361\3\2\2\2p\u0364\3\2\2\2r\u036e\3\2\2\2t\u0380"+ - "\3\2\2\2v\u038a\3\2\2\2x\u039a\3\2\2\2z\u039f\3\2\2\2|\u03ac\3\2\2\2~"+ - "\u03b4\3\2\2\2\u0080\u03c3\3\2\2\2\u0082\u03ca\3\2\2\2\u0084\u03da\3\2"+ - "\2\2\u0086\u03eb\3\2\2\2\u0088\u03f4\3\2\2\2\u008a\u03fd\3\2\2\2\u008c"+ - "\u0410\3\2\2\2\u008e\u0418\3\2\2\2\u0090\u0421\3\2\2\2\u0092\u0425\3\2"+ - "\2\2\u0094\u042a\3\2\2\2\u0096\u0432\3\2\2\2\u0098\u0437\3\2\2\2\u009a"+ - "\u043f\3\2\2\2\u009c\u0447\3\2\2\2\u009e\u044d\3\2\2\2\u00a0\u0453\3\2"+ - "\2\2\u00a2\u0459\3\2\2\2\u00a4\u045f\3\2\2\2\u00a6\u0465\3\2\2\2\u00a8"+ - "\u0474\3\2\2\2\u00aa\u0479\3\2\2\2\u00ac\u0481\3\2\2\2\u00ae\u0483\3\2"+ - "\2\2\u00b0\u048a\3\2\2\2\u00b2\u0491\3\2\2\2\u00b4\u0499\3\2\2\2\u00b6"+ - "\u04a4\3\2\2\2\u00b8\u04aa\3\2\2\2\u00ba\u04ad\3\2\2\2\u00bc\u04b1\3\2"+ - "\2\2\u00be\u04c9\3\2\2\2\u00c0\u04cb\3\2\2\2\u00c2\u04cf\3\2\2\2\u00c4"+ - "\u04d2\3\2\2\2\u00c6\u04d8\3\2\2\2\u00c8\u04da\3\2\2\2\u00ca\u04df\3\2"+ - "\2\2\u00cc\u04e4\3\2\2\2\u00ce\u04e7\3\2\2\2\u00d0\u04f5\3\2\2\2\u00d2"+ - "\u04f9\3\2\2\2\u00d4\u04fb\3\2\2\2\u00d6\u04ff\3\2\2\2\u00d8\u0525\3\2"+ - "\2\2\u00da\u0527\3\2\2\2\u00dc\u052b\3\2\2\2\u00de\u0531\3\2\2\2\u00e0"+ - "\u0539\3\2\2\2\u00e2\u0548\3\2\2\2\u00e4\u054e\3\2\2\2\u00e6\u0555\3\2"+ - "\2\2\u00e8\u0559\3\2\2\2\u00ea\u0570\3\2\2\2\u00ec\u0579\3\2\2\2\u00ee"+ - "\u057b\3\2\2\2\u00f0\u0585\3\2\2\2\u00f2\u0589\3\2\2\2\u00f4\u0591\3\2"+ - "\2\2\u00f6\u0593\3\2\2\2\u00f8\u0598\3\2\2\2\u00fa\u05a0\3\2\2\2\u00fc"+ - "\u05a2\3\2\2\2\u00fe\u05a6\3\2\2\2\u0100\u05aa\3\2\2\2\u0102\u05ac\3\2"+ - "\2\2\u0104\u05b2\3\2\2\2\u0106\u05b4\3\2\2\2\u0108\u05b8\3\2\2\2\u010a"+ - "\u05bf\3\2\2\2\u010c\u05cd\3\2\2\2\u010e\u05cf\3\2\2\2\u0110\u05dd\3\2"+ - "\2\2\u0112\u05df\3\2\2\2\u0114\u05e6\3\2\2\2\u0116\u05ea\3\2\2\2\u0118"+ - "\u05f2\3\2\2\2\u011a\u05f6\3\2\2\2\u011c\u05fa\3\2\2\2\u011e\u05fe\3\2"+ - "\2\2\u0120\u0606\3\2\2\2\u0122\u0613\3\2\2\2\u0124\u0615\3\2\2\2\u0126"+ - "\u061a\3\2\2\2\u0128\u062a\3\2\2\2\u012a\u062c\3\2\2\2\u012c\u0631\3\2"+ - "\2\2\u012e\u0633\3\2\2\2\u0130\u0635\3\2\2\2\u0132\u0637\3\2\2\2\u0134"+ - "\u0639\3\2\2\2\u0136\u063d\3\2\2\2\u0138\u063f\3\2\2\2\u013a\u0644\3\2"+ - "\2\2\u013c\u064d\3\2\2\2\u013e\u064f\3\2\2\2\u0140\u0654\3\2\2\2\u0142"+ - "\u0659\3\2\2\2\u0144\u065d\3\2\2\2\u0146\u0664\3\2\2\2\u0148\u0666\3\2"+ - "\2\2\u014a\u066d\3\2\2\2\u014c\u0674\3\2\2\2\u014e\u067b\3\2\2\2\u0150"+ - "\u0682\3\2\2\2\u0152\u0691\3\2\2\2\u0154\u06a3\3\2\2\2\u0156\u06a7\3\2"+ - "\2\2\u0158\u06a9\3\2\2\2\u015a\u06ae\3\2\2\2\u015c\u06be\3\2\2\2\u015e"+ - "\u06c4\3\2\2\2\u0160\u06c9\3\2\2\2\u0162\u06cf\3\2\2\2\u0164\u06d1\3\2"+ - "\2\2\u0166\u06d3\3\2\2\2\u0168\u0169\5\4\3\2\u0169\u016a\7\2\2\3\u016a"+ - "\3\3\2\2\2\u016b\u016c\7h\2\2\u016c\u016d\7g\2\2\u016d\u016e\5\u0164\u00b3"+ - "\2\u016e\u016f\7\3\2\2\u016f\u0171\3\2\2\2\u0170\u016b\3\2\2\2\u0170\u0171"+ - "\3\2\2\2\u0171\u0174\3\2\2\2\u0172\u0175\5\b\5\2\u0173\u0175\5\6\4\2\u0174"+ - "\u0172\3\2\2\2\u0174\u0173\3\2\2\2\u0175\5\3\2\2\2\u0176\u0177\5\n\6\2"+ - "\u0177\u0178\5\f\7\2\u0178\7\3\2\2\2\u0179\u017a\7\4\2\2\u017a\u017b\7"+ - "\u0087\2\2\u017b\u017c\7\u00b2\2\2\u017c\u017d\7\5\2\2\u017d\u017e\5\u0162"+ - "\u00b2\2\u017e\u017f\7\3\2\2\u017f\u0180\5\n\6\2\u0180\t\3\2\2\2\u0181"+ - "\u0185\5<\37\2\u0182\u0185\5> \2\u0183\u0185\5N(\2\u0184\u0181\3\2\2\2"+ - "\u0184\u0182\3\2\2\2\u0184\u0183\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0187"+ - "\7\3\2\2\u0187\u0189\3\2\2\2\u0188\u0184\3\2\2\2\u0189\u018c\3\2\2\2\u018a"+ - "\u0188\3\2\2\2\u018a\u018b\3\2\2\2\u018b\u0192\3\2\2\2\u018c\u018a\3\2"+ - "\2\2\u018d\u018e\5@!\2\u018e\u018f\7\3\2\2\u018f\u0191\3\2\2\2\u0190\u018d"+ - "\3\2\2\2\u0191\u0194\3\2\2\2\u0192\u0190\3\2\2\2\u0192\u0193\3\2\2\2\u0193"+ - "\13\3\2\2\2\u0194\u0192\3\2\2\2\u0195\u0196\5\22\n\2\u0196\r\3\2\2\2\u0197"+ - "\u0199\5\24\13\2\u0198\u0197\3\2\2\2\u0199\u019c\3\2\2\2\u019a\u0198\3"+ - "\2\2\2\u019a\u019b\3\2\2\2\u019b\17\3\2\2\2\u019c\u019a\3\2\2\2\u019d"+ - "\u019e\5\16\b\2\u019e\u019f\5^\60\2\u019f\21\3\2\2\2\u01a0\u01a2\5\16"+ - "\b\2\u01a1\u01a3\5^\60\2\u01a2\u01a1\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3"+ - "\23\3\2\2\2\u01a4\u01b2\5\26\f\2\u01a5\u01b2\5\30\r\2\u01a6\u01b2\5\32"+ - "\16\2\u01a7\u01b2\5\34\17\2\u01a8\u01b2\5\36\20\2\u01a9\u01b2\5 \21\2"+ - "\u01aa\u01b2\5\"\22\2\u01ab\u01b2\5$\23\2\u01ac\u01b2\5&\24\2\u01ad\u01b2"+ - "\5*\26\2\u01ae\u01b2\5.\30\2\u01af\u01b2\5\66\34\2\u01b0\u01b2\5:\36\2"+ - "\u01b1\u01a4\3\2\2\2\u01b1\u01a5\3\2\2\2\u01b1\u01a6\3\2\2\2\u01b1\u01a7"+ - "\3\2\2\2\u01b1\u01a8\3\2\2\2\u01b1\u01a9\3\2\2\2\u01b1\u01aa\3\2\2\2\u01b1"+ - "\u01ab\3\2\2\2\u01b1\u01ac\3\2\2\2\u01b1\u01ad\3\2\2\2\u01b1\u01ae\3\2"+ - "\2\2\u01b1\u01af\3\2\2\2\u01b1\u01b0\3\2\2\2\u01b2\25\3\2\2\2\u01b3\u01b4"+ - "\5b\62\2\u01b4\u01b5\7\3\2\2\u01b5\27\3\2\2\2\u01b6\u01b7\7\6\2\2\u01b7"+ - "\u01b8\5J&\2\u01b8\u01b9\7\7\2\2\u01b9\u01ba\5`\61\2\u01ba\u01bb\7\3\2"+ - "\2\u01bb\31\3\2\2\2\u01bc\u01bd\7\b\2\2\u01bd\u01be\5\16\b\2\u01be\u01bf"+ - "\7\t\2\2\u01bf\33\3\2\2\2\u01c0\u01c1\7\177\2\2\u01c1\u01c2\7\u0080\2"+ - "\2\u01c2\u01c3\7\3\2\2\u01c3\35\3\2\2\2\u01c4\u01c5\7\u0081\2\2\u01c5"+ - "\u01c6\7\u0080\2\2\u01c6\u01c7\7\3\2\2\u01c7\37\3\2\2\2\u01c8\u01c9\7"+ - "\u0082\2\2\u01c9\u01ca\7\u0083\2\2\u01ca\u01cb\5`\61\2\u01cb\u01cc\7\3"+ - "\2\2\u01cc!\3\2\2\2\u01cd\u01d0\5f\64\2\u01ce\u01d0\5j\66\2\u01cf\u01cd"+ - "\3\2\2\2\u01cf\u01ce\3\2\2\2\u01d0\u01d9\3\2\2\2\u01d1\u01d8\5f\64\2\u01d2"+ - "\u01d8\5j\66\2\u01d3\u01d8\5n8\2\u01d4\u01d8\5p9\2\u01d5\u01d8\5t;\2\u01d6"+ - "\u01d8\5x=\2\u01d7\u01d1\3\2\2\2\u01d7\u01d2\3\2\2\2\u01d7\u01d3\3\2\2"+ - "\2\u01d7\u01d4\3\2\2\2\u01d7\u01d5\3\2\2\2\u01d7\u01d6\3\2\2\2\u01d8\u01db"+ - "\3\2\2\2\u01d9\u01d7\3\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01dc\3\2\2\2\u01db"+ - "\u01d9\3\2\2\2\u01dc\u01dd\7C\2\2\u01dd\u01de\5\24\13\2\u01de#\3\2\2\2"+ - "\u01df\u01e0\7D\2\2\u01e0\u01e1\7\n\2\2\u01e1\u01e2\5^\60\2\u01e2\u01e3"+ - "\7\13\2\2\u01e3\u01e4\7Y\2\2\u01e4\u01e5\5\24\13\2\u01e5\u01e6\7Z\2\2"+ - "\u01e6\u01e7\5\24\13\2\u01e7%\3\2\2\2\u01e8\u01e9\7T\2\2\u01e9\u01ea\7"+ - "\n\2\2\u01ea\u01eb\5^\60\2\u01eb\u01ed\7\13\2\2\u01ec\u01ee\5(\25\2\u01ed"+ - "\u01ec\3\2\2\2\u01ee\u01ef\3\2\2\2\u01ef\u01ed\3\2\2\2\u01ef\u01f0\3\2"+ - "\2\2\u01f0\u01f1\3\2\2\2\u01f1\u01f2\7X\2\2\u01f2\u01f3\7C\2\2\u01f3\u01f4"+ - "\5\24\13\2\u01f4\'\3\2\2\2\u01f5\u01f6\7U\2\2\u01f6\u01f8\5`\61\2\u01f7"+ - "\u01f5\3\2\2\2\u01f8\u01f9\3\2\2\2\u01f9\u01f7\3\2\2\2\u01f9\u01fa\3\2"+ - "\2\2\u01fa\u01fb\3\2\2\2\u01fb\u01fc\7C\2\2\u01fc\u01fd\5\24\13\2\u01fd"+ - ")\3\2\2\2\u01fe\u01ff\7V\2\2\u01ff\u0201\5\32\16\2\u0200\u0202\5,\27\2"+ - "\u0201\u0200\3\2\2\2\u0202\u0203\3\2\2\2\u0203\u0201\3\2\2\2\u0203\u0204"+ - "\3\2\2\2\u0204+\3\2\2\2\u0205\u0208\7W\2\2\u0206\u0209\7\f\2\2\u0207\u0209"+ - "\5J&\2\u0208\u0206\3\2\2\2\u0208\u0207\3\2\2\2\u0209\u0211\3\2\2\2\u020a"+ - "\u020d\7\r\2\2\u020b\u020e\7\f\2\2\u020c\u020e\5J&\2\u020d\u020b\3\2\2"+ - "\2\u020d\u020c\3\2\2\2\u020e\u0210\3\2\2\2\u020f\u020a\3\2\2\2\u0210\u0213"+ - "\3\2\2\2\u0211\u020f\3\2\2\2\u0211\u0212\3\2\2\2\u0212\u0214\3\2\2\2\u0213"+ - "\u0211\3\2\2\2\u0214\u0215\5\32\16\2\u0215-\3\2\2\2\u0216\u0217\7[\2\2"+ - "\u0217\u0218\7\n\2\2\u0218\u0219\5^\60\2\u0219\u021b\7\13\2\2\u021a\u021c"+ - "\5\60\31\2\u021b\u021a\3\2\2\2\u021c\u021d\3\2\2\2\u021d\u021b\3\2\2\2"+ - "\u021d\u021e\3\2\2\2\u021e\u021f\3\2\2\2\u021f\u0221\7X\2\2\u0220\u0222"+ - "\5\u00c2b\2\u0221\u0220\3\2\2\2\u0221\u0222\3\2\2\2\u0222\u0223\3\2\2"+ - "\2\u0223\u0224\7C\2\2\u0224\u0225\5\24\13\2\u0225/\3\2\2\2\u0226\u022a"+ - "\7U\2\2\u0227\u0228\5\u00c2b\2\u0228\u0229\7F\2\2\u0229\u022b\3\2\2\2"+ - "\u022a\u0227\3\2\2\2\u022a\u022b\3\2\2\2\u022b\u022c\3\2\2\2\u022c\u0231"+ - "\5\u0152\u00aa\2\u022d\u022e\7\r\2\2\u022e\u0230\5\u0152\u00aa\2\u022f"+ - "\u022d\3\2\2\2\u0230\u0233\3\2\2\2\u0231\u022f\3\2\2\2\u0231\u0232\3\2"+ - "\2\2\u0232\u0234\3\2\2\2\u0233\u0231\3\2\2\2\u0234\u0235\7C\2\2\u0235"+ - "\u0236\5\24\13\2\u0236\61\3\2\2\2\u0237\u0238\7\16\2\2\u0238\u0243\5J"+ - "&\2\u0239\u023a\7\n\2\2\u023a\u023f\7\u00ac\2\2\u023b\u023c\7\17\2\2\u023c"+ - "\u023e\7\u00ac\2\2\u023d\u023b\3\2\2\2\u023e\u0241\3\2\2\2\u023f\u023d"+ - "\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u0242\3\2\2\2\u0241\u023f\3\2\2\2\u0242"+ - "\u0244\7\13\2\2\u0243\u0239\3\2\2\2\u0243\u0244\3\2\2\2\u0244\63\3\2\2"+ - "\2\u0245\u0247\5\62\32\2\u0246\u0245\3\2\2\2\u0247\u024a\3\2\2\2\u0248"+ - "\u0246\3\2\2\2\u0248\u0249\3\2\2\2\u0249\65\3\2\2\2\u024a\u0248\3\2\2"+ - "\2\u024b\u024c\5\64\33\2\u024c\u024d\7r\2\2\u024d\u0252\58\35\2\u024e"+ - "\u024f\7\17\2\2\u024f\u0251\58\35\2\u0250\u024e\3\2\2\2\u0251\u0254\3"+ - "\2\2\2\u0252\u0250\3\2\2\2\u0252\u0253\3\2\2\2\u0253\u0255\3\2\2\2\u0254"+ - "\u0252\3\2\2\2\u0255\u0256\7\3\2\2\u0256\67\3\2\2\2\u0257\u025a\5\u00c2"+ - "b\2\u0258\u0259\7F\2\2\u0259\u025b\5\u0152\u00aa\2\u025a\u0258\3\2\2\2"+ - "\u025a\u025b\3\2\2\2\u025b\u025e\3\2\2\2\u025c\u025d\7\7\2\2\u025d\u025f"+ - "\5`\61\2\u025e\u025c\3\2\2\2\u025e\u025f\3\2\2\2\u025f9\3\2\2\2\u0260"+ - "\u0261\7\u0084\2\2\u0261\u0262\7\n\2\2\u0262\u0263\5^\60\2\u0263\u0264"+ - "\7\13\2\2\u0264\u0265\5\24\13\2\u0265;\3\2\2\2\u0266\u026b\5B\"\2\u0267"+ - "\u026b\5D#\2\u0268\u026b\5F$\2\u0269\u026b\5H%\2\u026a\u0266\3\2\2\2\u026a"+ - "\u0267\3\2\2\2\u026a\u0268\3\2\2\2\u026a\u0269\3\2\2\2\u026b=\3\2\2\2"+ - "\u026c\u026d\7o\2\2\u026d\u026e\7\u0087\2\2\u026e\u026f\7\u00b2\2\2\u026f"+ - "\u0270\7\5\2\2\u0270\u0271\5\u0162\u00b2\2\u0271?\3\2\2\2\u0272\u0277"+ - "\5T+\2\u0273\u0277\5P)\2\u0274\u0277\5V,\2\u0275\u0277\5R*\2\u0276\u0272"+ - "\3\2\2\2\u0276\u0273\3\2\2\2\u0276\u0274\3\2\2\2\u0276\u0275\3\2\2\2\u0277"+ - "A\3\2\2\2\u0278\u0279\7o\2\2\u0279\u027a\7X\2\2\u027a\u027b\7Q\2\2\u027b"+ - "\u027c\5\u0162\u00b2\2\u027cC\3\2\2\2\u027d\u027e\7o\2\2\u027e\u027f\7"+ - "\20\2\2\u027f\u0280\t\2\2\2\u0280E\3\2\2\2\u0281\u0282\7o\2\2\u0282\u0283"+ - "\7X\2\2\u0283\u0284\7B\2\2\u0284\u0285\7I\2\2\u0285\u0286\t\3\2\2\u0286"+ - "G\3\2\2\2\u0287\u028c\7o\2\2\u0288\u0289\7\22\2\2\u0289\u028d\5J&\2\u028a"+ - "\u028b\7X\2\2\u028b\u028d\7\22\2\2\u028c\u0288\3\2\2\2\u028c\u028a\3\2"+ - "\2\2\u028d\u0294\3\2\2\2\u028e\u028f\5L\'\2\u028f\u0290\7\5\2\2\u0290"+ - "\u0291\5\u0164\u00b3\2\u0291\u0293\3\2\2\2\u0292\u028e\3\2\2\2\u0293\u0296"+ - "\3\2\2\2\u0294\u0292\3\2\2\2\u0294\u0295\3\2\2\2\u0295I\3\2\2\2\u0296"+ - "\u0294\3\2\2\2\u0297\u029a\7\u00b2\2\2\u0298\u029a\5\u0166\u00b4\2\u0299"+ - "\u0297\3\2\2\2\u0299\u0298\3\2\2\2\u029a\u029b\3\2\2\2\u029b\u029d\7\23"+ - "\2\2\u029c\u0299\3\2\2\2\u029c\u029d\3\2\2\2\u029d\u02a0\3\2\2\2\u029e"+ - "\u02a1\7\u00b2\2\2\u029f\u02a1\5\u0166\u00b4\2\u02a0\u029e\3\2\2\2\u02a0"+ - "\u029f\3\2\2\2\u02a1K\3\2\2\2\u02a2\u02a3\t\4\2\2\u02a3M\3\2\2\2\u02a4"+ - "\u02a5\7\u0085\2\2\u02a5\u02a9\7\4\2\2\u02a6\u02a7\7\u0087\2\2\u02a7\u02a8"+ - "\7\u00b2\2\2\u02a8\u02aa\7\5\2\2\u02a9\u02a6\3\2\2\2\u02a9\u02aa\3\2\2"+ - "\2\u02aa\u02ab\3\2\2\2\u02ab\u02b5\5\u0162\u00b2\2\u02ac\u02ad\7G\2\2"+ - "\u02ad\u02b2\5\u0162\u00b2\2\u02ae\u02af\7\17\2\2\u02af\u02b1\5\u0162"+ - "\u00b2\2\u02b0\u02ae\3\2\2\2\u02b1\u02b4\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b2"+ - "\u02b3\3\2\2\2\u02b3\u02b6\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5\u02ac\3\2"+ - "\2\2\u02b5\u02b6\3\2\2\2\u02b6O\3\2\2\2\u02b7\u02b8\7o\2\2\u02b8\u02b9"+ - "\5\64\33\2\u02b9\u02ba\7r\2\2\u02ba\u02bd\5\u00c2b\2\u02bb\u02bc\7F\2"+ - "\2\u02bc\u02be\5\u0152\u00aa\2\u02bd\u02bb\3\2\2\2\u02bd\u02be\3\2\2\2"+ - "\u02be\u02c6\3\2\2\2\u02bf\u02c0\7\7\2\2\u02c0\u02c7\5`\61\2\u02c1\u02c4"+ - "\7\36\2\2\u02c2\u02c3\7\7\2\2\u02c3\u02c5\5`\61\2\u02c4\u02c2\3\2\2\2"+ - "\u02c4\u02c5\3\2\2\2\u02c5\u02c7\3\2\2\2\u02c6\u02bf\3\2\2\2\u02c6\u02c1"+ - "\3\2\2\2\u02c7Q\3\2\2\2\u02c8\u02c9\7o\2\2\u02c9\u02ca\7p\2\2\u02ca\u02cd"+ - "\7q\2\2\u02cb\u02cc\7F\2\2\u02cc\u02ce\5\u0152\u00aa\2\u02cd\u02cb\3\2"+ - "\2\2\u02cd\u02ce\3\2\2\2\u02ce\u02d6\3\2\2\2\u02cf\u02d0\7\7\2\2\u02d0"+ - "\u02d7\5`\61\2\u02d1\u02d4\7\36\2\2\u02d2\u02d3\7\7\2\2\u02d3\u02d5\5"+ - "`\61\2\u02d4\u02d2\3\2\2\2\u02d4\u02d5\3\2\2\2\u02d5\u02d7\3\2\2\2\u02d6"+ - "\u02cf\3\2\2\2\u02d6\u02d1\3\2\2\2\u02d7S\3\2\2\2\u02d8\u02d9\7o\2\2\u02d9"+ - "\u02da\5\64\33\2\u02da\u02db\7\37\2\2\u02db\u02dc\5J&\2\u02dc\u02de\7"+ - "\n\2\2\u02dd\u02df\5Z.\2\u02de\u02dd\3\2\2\2\u02de\u02df\3\2\2\2\u02df"+ - "\u02e0\3\2\2\2\u02e0\u02e3\7\13\2\2\u02e1\u02e2\7F\2\2\u02e2\u02e4\5\u0152"+ - "\u00aa\2\u02e3\u02e1\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4\u02ea\3\2\2\2\u02e5"+ - "\u02e6\7\b\2\2\u02e6\u02e7\5\22\n\2\u02e7\u02e8\7\t\2\2\u02e8\u02eb\3"+ - "\2\2\2\u02e9\u02eb\7\36\2\2\u02ea\u02e5\3\2\2\2\u02ea\u02e9\3\2\2\2\u02eb"+ - "U\3\2\2\2\u02ec\u02ed\7o\2\2\u02ed\u02ee\7l\2\2\u02ee\u02ef\5J&\2\u02ef"+ - "\u02f1\7F\2\2\u02f0\u02f2\5X-\2\u02f1\u02f0\3\2\2\2\u02f1\u02f2\3\2\2"+ - "\2\u02f2\u02f3\3\2\2\2\u02f3\u02f4\5`\61\2\u02f4W\3\2\2\2\u02f5\u02f6"+ - "\7 \2\2\u02f6\u02fc\7!\2\2\u02f7\u02f8\7 \2\2\u02f8\u02fc\7\"\2\2\u02f9"+ - "\u02fa\7|\2\2\u02fa\u02fc\7\u0086\2\2\u02fb\u02f5\3\2\2\2\u02fb\u02f7"+ - "\3\2\2\2\u02fb\u02f9\3\2\2\2\u02fcY\3\2\2\2\u02fd\u0302\5\\/\2\u02fe\u02ff"+ - "\7\17\2\2\u02ff\u0301\5\\/\2\u0300\u02fe\3\2\2\2\u0301\u0304\3\2\2\2\u0302"+ - "\u0300\3\2\2\2\u0302\u0303\3\2\2\2\u0303[\3\2\2\2\u0304\u0302\3\2\2\2"+ - "\u0305\u0306\7\6\2\2\u0306\u0309\5J&\2\u0307\u0308\7F\2\2\u0308\u030a"+ - "\5\u0152\u00aa\2\u0309\u0307\3\2\2\2\u0309\u030a\3\2\2\2\u030a]\3\2\2"+ - "\2\u030b\u0310\5`\61\2\u030c\u030d\7\17\2\2\u030d\u030f\5`\61\2\u030e"+ - "\u030c\3\2\2\2\u030f\u0312\3\2\2\2\u0310\u030e\3\2\2\2\u0310\u0311\3\2"+ - "\2\2\u0311_\3\2\2\2\u0312\u0310\3\2\2\2\u0313\u031a\5b\62\2\u0314\u031a"+ - "\5d\63\2\u0315\u031a\5~@\2\u0316\u031a\5\u0082B\2\u0317\u031a\5\u0086"+ - "D\2\u0318\u031a\5\u0088E\2\u0319\u0313\3\2\2\2\u0319\u0314\3\2\2\2\u0319"+ - "\u0315\3\2\2\2\u0319\u0316\3\2\2\2\u0319\u0317\3\2\2\2\u0319\u0318\3\2"+ - "\2\2\u031aa\3\2\2\2\u031b\u0324\5z>\2\u031c\u0324\5\u008cG\2\u031d\u0324"+ - "\5\u00d8m\2\u031e\u0324\5\u00dan\2\u031f\u0324\5\u00dco\2\u0320\u0324"+ - "\5\u00dep\2\u0321\u0324\5\u00e0q\2\u0322\u0324\5\u00e2r\2\u0323\u031b"+ - "\3\2\2\2\u0323\u031c\3\2\2\2\u0323\u031d\3\2\2\2\u0323\u031e\3\2\2\2\u0323"+ - "\u031f\3\2\2\2\u0323\u0320\3\2\2\2\u0323\u0321\3\2\2\2\u0323\u0322\3\2"+ - "\2\2\u0324c\3\2\2\2\u0325\u0328\5f\64\2\u0326\u0328\5j\66\2\u0327\u0325"+ - "\3\2\2\2\u0327\u0326\3\2\2\2\u0328\u0331\3\2\2\2\u0329\u0330\5f\64\2\u032a"+ - "\u0330\5j\66\2\u032b\u0330\5n8\2\u032c\u0330\5p9\2\u032d\u0330\5t;\2\u032e"+ - "\u0330\5x=\2\u032f\u0329\3\2\2\2\u032f\u032a\3\2\2\2\u032f\u032b\3\2\2"+ - "\2\u032f\u032c\3\2\2\2\u032f\u032d\3\2\2\2\u032f\u032e\3\2\2\2\u0330\u0333"+ - "\3\2\2\2\u0331\u032f\3\2\2\2\u0331\u0332\3\2\2\2\u0332\u0334\3\2\2\2\u0333"+ - "\u0331\3\2\2\2\u0334\u0335\7C\2\2\u0335\u0336\5`\61\2\u0336e\3\2\2\2\u0337"+ - "\u0338\7=\2\2\u0338\u033d\5h\65\2\u0339\u033a\7\17\2\2\u033a\u033c\5h"+ - "\65\2\u033b\u0339\3\2\2\2\u033c\u033f\3\2\2\2\u033d\u033b\3\2\2\2\u033d"+ - "\u033e\3\2\2\2\u033eg\3\2\2\2\u033f\u033d\3\2\2\2\u0340\u0343\5\u00c2"+ - "b\2\u0341\u0342\7F\2\2\u0342\u0344\5\u0152\u00aa\2\u0343\u0341\3\2\2\2"+ - "\u0343\u0344\3\2\2\2\u0344\u0347\3\2\2\2\u0345\u0346\7H\2\2\u0346\u0348"+ - "\7I\2\2\u0347\u0345\3\2\2\2\u0347\u0348\3\2\2\2\u0348\u034b\3\2\2\2\u0349"+ - "\u034a\7G\2\2\u034a\u034c\5\u00c2b\2\u034b\u0349\3\2\2\2\u034b\u034c\3"+ - "\2\2\2\u034c\u034d\3\2\2\2\u034d\u034e\7E\2\2\u034e\u034f\5`\61\2\u034f"+ - "i\3\2\2\2\u0350\u0351\7>\2\2\u0351\u0356\5l\67\2\u0352\u0353\7\17\2\2"+ - "\u0353\u0355\5l\67\2\u0354\u0352\3\2\2\2\u0355\u0358\3\2\2\2\u0356\u0354"+ - "\3\2\2\2\u0356\u0357\3\2\2\2\u0357k\3\2\2\2\u0358\u0356\3\2\2\2\u0359"+ - "\u035c\5\u00c2b\2\u035a\u035b\7F\2\2\u035b\u035d\5\u0152\u00aa\2\u035c"+ - "\u035a\3\2\2\2\u035c\u035d\3\2\2\2\u035d\u035e\3\2\2\2\u035e\u035f\7\7"+ - "\2\2\u035f\u0360\5`\61\2\u0360m\3\2\2\2\u0361\u0362\7?\2\2\u0362\u0363"+ - "\5`\61\2\u0363o\3\2\2\2\u0364\u0365\7@\2\2\u0365\u0366\7A\2\2\u0366\u036b"+ - "\5r:\2\u0367\u0368\7\17\2\2\u0368\u036a\5r:\2\u0369\u0367\3\2\2\2\u036a"+ - "\u036d\3\2\2\2\u036b\u0369\3\2\2\2\u036b\u036c\3\2\2\2\u036cq\3\2\2\2"+ - "\u036d\u036b\3\2\2\2\u036e\u0375\5\u00c2b\2\u036f\u0370\7F\2\2\u0370\u0372"+ - "\5\u0152\u00aa\2\u0371\u036f\3\2\2\2\u0371\u0372\3\2\2\2\u0372\u0373\3"+ - "\2\2\2\u0373\u0374\7\7\2\2\u0374\u0376\5`\61\2\u0375\u0371\3\2\2\2\u0375"+ - "\u0376\3\2\2\2\u0376\u0379\3\2\2\2\u0377\u0378\7Q\2\2\u0378\u037a\5\u0162"+ - "\u00b2\2\u0379\u0377\3\2\2\2\u0379\u037a\3\2\2\2\u037as\3\2\2\2\u037b"+ - "\u037c\7B\2\2\u037c\u0381\7A\2\2\u037d\u037e\7K\2\2\u037e\u037f\7B\2\2"+ - "\u037f\u0381\7A\2\2\u0380\u037b\3\2\2\2\u0380\u037d\3\2\2\2\u0381\u0382"+ - "\3\2\2\2\u0382\u0387\5v<\2\u0383\u0384\7\17\2\2\u0384\u0386\5v<\2\u0385"+ - "\u0383\3\2\2\2\u0386\u0389\3\2\2\2\u0387\u0385\3\2\2\2\u0387\u0388\3\2"+ - "\2\2\u0388u\3\2\2\2\u0389\u0387\3\2\2\2\u038a\u038d\5`\61\2\u038b\u038e"+ - "\7L\2\2\u038c\u038e\7M\2\2\u038d\u038b\3\2\2\2\u038d\u038c\3\2\2\2\u038d"+ - "\u038e\3\2\2\2\u038e\u0394\3\2\2\2\u038f\u0392\7I\2\2\u0390\u0393\7R\2"+ - "\2\u0391\u0393\7S\2\2\u0392\u0390\3\2\2\2\u0392\u0391\3\2\2\2\u0393\u0395"+ - "\3\2\2\2\u0394\u038f\3\2\2\2\u0394\u0395\3\2\2\2\u0395\u0398\3\2\2\2\u0396"+ - "\u0397\7Q\2\2\u0397\u0399\5\u0162\u00b2\2\u0398\u0396\3\2\2\2\u0398\u0399"+ - "\3\2\2\2\u0399w\3\2\2\2\u039a\u039b\7J\2\2\u039b\u039c\5\u00c2b\2\u039c"+ - "y\3\2\2\2\u039d\u03a0\7N\2\2\u039e\u03a0\7O\2\2\u039f\u039d\3\2\2\2\u039f"+ - "\u039e\3\2\2\2\u03a0\u03a1\3\2\2\2\u03a1\u03a6\5|?\2\u03a2\u03a3\7\17"+ - "\2\2\u03a3\u03a5\5|?\2\u03a4\u03a2\3\2\2\2\u03a5\u03a8\3\2\2\2\u03a6\u03a4"+ - "\3\2\2\2\u03a6\u03a7\3\2\2\2\u03a7\u03a9\3\2\2\2\u03a8\u03a6\3\2\2\2\u03a9"+ - "\u03aa\7P\2\2\u03aa\u03ab\5`\61\2\u03ab{\3\2\2\2\u03ac\u03af\5\u00c2b"+ - "\2\u03ad\u03ae\7F\2\2\u03ae\u03b0\5\u0152\u00aa\2\u03af\u03ad\3\2\2\2"+ - "\u03af\u03b0\3\2\2\2\u03b0\u03b1\3\2\2\2\u03b1\u03b2\7E\2\2\u03b2\u03b3"+ - "\5`\61\2\u03b3}\3\2\2\2\u03b4\u03b5\7T\2\2\u03b5\u03b6\7\n\2\2\u03b6\u03b7"+ - "\5^\60\2\u03b7\u03b9\7\13\2\2\u03b8\u03ba\5\u0080A\2\u03b9\u03b8\3\2\2"+ - "\2\u03ba\u03bb\3\2\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc\u03bd"+ - "\3\2\2\2\u03bd\u03be\7X\2\2\u03be\u03bf\7C\2\2\u03bf\u03c0\5`\61\2\u03c0"+ - "\177\3\2\2\2\u03c1\u03c2\7U\2\2\u03c2\u03c4\5`\61\2\u03c3\u03c1\3\2\2"+ - "\2\u03c4\u03c5\3\2\2\2\u03c5\u03c3\3\2\2\2\u03c5\u03c6\3\2\2\2\u03c6\u03c7"+ - "\3\2\2\2\u03c7\u03c8\7C\2\2\u03c8\u03c9\5`\61\2\u03c9\u0081\3\2\2\2\u03ca"+ - "\u03cb\7[\2\2\u03cb\u03cc\7\n\2\2\u03cc\u03cd\5^\60\2\u03cd\u03cf\7\13"+ - "\2\2\u03ce\u03d0\5\u0084C\2\u03cf\u03ce\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1"+ - "\u03cf\3\2\2\2\u03d1\u03d2\3\2\2\2\u03d2\u03d3\3\2\2\2\u03d3\u03d5\7X"+ - "\2\2\u03d4\u03d6\5\u00c2b\2\u03d5\u03d4\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6"+ - "\u03d7\3\2\2\2\u03d7\u03d8\7C\2\2\u03d8\u03d9\5`\61\2\u03d9\u0083\3\2"+ - "\2\2\u03da\u03de\7U\2\2\u03db\u03dc\5\u00c2b\2\u03dc\u03dd\7F\2\2\u03dd"+ - "\u03df\3\2\2\2\u03de\u03db\3\2\2\2\u03de\u03df\3\2\2\2\u03df\u03e0\3\2"+ - "\2\2\u03e0\u03e5\5\u0152\u00aa\2\u03e1\u03e2\7\r\2\2\u03e2\u03e4\5\u0152"+ - "\u00aa\2\u03e3\u03e1\3\2\2\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5"+ - "\u03e6\3\2\2\2\u03e6\u03e8\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7C"+ - "\2\2\u03e9\u03ea\5`\61\2\u03ea\u0085\3\2\2\2\u03eb\u03ec\7D\2\2\u03ec"+ - "\u03ed\7\n\2\2\u03ed\u03ee\5^\60\2\u03ee\u03ef\7\13\2\2\u03ef\u03f0\7"+ - "Y\2\2\u03f0\u03f1\5`\61\2\u03f1\u03f2\7Z\2\2\u03f2\u03f3\5`\61\2\u03f3"+ - "\u0087\3\2\2\2\u03f4\u03f5\7V\2\2\u03f5\u03f6\7\b\2\2\u03f6\u03f7\5^\60"+ - "\2\u03f7\u03f9\7\t\2\2\u03f8\u03fa\5\u008aF\2\u03f9\u03f8\3\2\2\2\u03fa"+ - "\u03fb\3\2\2\2\u03fb\u03f9\3\2\2\2\u03fb\u03fc\3\2\2\2\u03fc\u0089\3\2"+ - "\2\2\u03fd\u0400\7W\2\2\u03fe\u0401\7\f\2\2\u03ff\u0401\5J&\2\u0400\u03fe"+ - "\3\2\2\2\u0400\u03ff\3\2\2\2\u0401\u0409\3\2\2\2\u0402\u0405\7\r\2\2\u0403"+ - "\u0406\7\f\2\2\u0404\u0406\5J&\2\u0405\u0403\3\2\2\2\u0405\u0404\3\2\2"+ - "\2\u0406\u0408\3\2\2\2\u0407\u0402\3\2\2\2\u0408\u040b\3\2\2\2\u0409\u0407"+ - "\3\2\2\2\u0409\u040a\3\2\2\2\u040a\u040c\3\2\2\2\u040b\u0409\3\2\2\2\u040c"+ + "\3\u0082\5\u0082\u05af\n\u0082\3\u0083\3\u0083\3\u0083\5\u0083\u05b4\n"+ + "\u0083\3\u0084\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085\3\u0085"+ + "\3\u0086\7\u0086\u05bf\n\u0086\f\u0086\16\u0086\u05c2\13\u0086\3\u0087"+ + "\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087"+ + "\3\u0087\5\u0087\u05cf\n\u0087\3\u0088\3\u0088\3\u0089\3\u0089\3\u0089"+ + "\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089"+ + "\5\u0089\u05df\n\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u05e4\n\u008a\3"+ + "\u008a\3\u008a\3\u008b\3\u008b\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c"+ + "\3\u008c\5\u008c\u05f0\n\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d"+ + "\3\u008d\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f"+ + "\3\u0090\3\u0090\3\u0090\3\u0090\5\u0090\u0604\n\u0090\3\u0090\3\u0090"+ + "\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\5\u0091\u060d\n\u0091\5\u0091"+ + "\u060f\n\u0091\3\u0091\3\u0091\3\u0092\3\u0092\5\u0092\u0615\n\u0092\3"+ + "\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094"+ + "\3\u0094\3\u0094\5\u0094\u0622\n\u0094\5\u0094\u0624\n\u0094\5\u0094\u0626"+ + "\n\u0094\3\u0094\3\u0094\3\u0095\3\u0095\5\u0095\u062c\n\u0095\3\u0096"+ + "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0098\3\u0098\3\u0099"+ + "\3\u0099\3\u009a\3\u009a\3\u009b\3\u009b\3\u009c\3\u009c\5\u009c\u063f"+ + "\n\u009c\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e"+ + "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f\5\u009f\u064f\n\u009f"+ + "\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a1"+ + "\3\u00a1\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4"+ + "\3\u00a4\3\u00a4\3\u00a4\5\u00a4\u0666\n\u00a4\3\u00a5\3\u00a5\3\u00a5"+ + "\5\u00a5\u066b\n\u00a5\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a6\5\u00a6"+ + "\u0672\n\u00a6\3\u00a6\3\u00a6\3\u00a7\3\u00a7\3\u00a7\5\u00a7\u0679\n"+ + "\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8\5\u00a8\u0680\n\u00a8\3"+ + "\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\5\u00a9\u0687\n\u00a9\3\u00a9\3"+ + "\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u0691\n"+ + "\u00aa\5\u00aa\u0693\n\u00aa\3\u00ab\3\u00ab\3\u00ab\3\u00ab\7\u00ab\u0699"+ + "\n\u00ab\f\u00ab\16\u00ab\u069c\13\u00ab\5\u00ab\u069e\n\u00ab\3\u00ab"+ + "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\5\u00ab\u06a5\n\u00ab\3\u00ac\3\u00ac"+ + "\5\u00ac\u06a9\n\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ae"+ + "\3\u00ae\3\u00ae\3\u00ae\3\u00ae\7\u00ae\u06b5\n\u00ae\f\u00ae\16\u00ae"+ + "\u06b8\13\u00ae\5\u00ae\u06ba\n\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae"+ + "\3\u00af\3\u00af\5\u00af\u06c2\n\u00af\3\u00b0\3\u00b0\5\u00b0\u06c6\n"+ + "\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b1\3\u00b1\5\u00b1\u06cd\n\u00b1\3"+ + "\u00b1\3\u00b1\3\u00b2\3\u00b2\3\u00b3\3\u00b3\3\u00b4\3\u00b4\3\u00b4"+ + "\2\2\u00b5\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\66"+ + "8:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a"+ + "\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2"+ + "\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba"+ + "\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2"+ + "\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea"+ + "\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102"+ + "\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a"+ + "\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132"+ + "\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a"+ + "\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162"+ + "\u0164\u0166\2\r\4\2\21\21ii\3\2RS\3\2\24\35\4\2\5\5#-\3\2/\60\4\2\f\f"+ + "\61\63\3\2\u0089\u008a\3\2\u008c\u0092\3\2\u0093\u0097\4\2\23\23\u00aa"+ + "\u00aa\4\2=\u0084\u00ab\u00ab\2\u071e\2\u0168\3\2\2\2\4\u0170\3\2\2\2"+ + "\6\u0176\3\2\2\2\b\u0179\3\2\2\2\n\u018a\3\2\2\2\f\u0195\3\2\2\2\16\u019a"+ + "\3\2\2\2\20\u019d\3\2\2\2\22\u01a0\3\2\2\2\24\u01b1\3\2\2\2\26\u01b3\3"+ + "\2\2\2\30\u01b6\3\2\2\2\32\u01bc\3\2\2\2\34\u01c0\3\2\2\2\36\u01c4\3\2"+ + "\2\2 \u01c8\3\2\2\2\"\u01cf\3\2\2\2$\u01df\3\2\2\2&\u01e8\3\2\2\2(\u01f7"+ + "\3\2\2\2*\u01fe\3\2\2\2,\u0205\3\2\2\2.\u0216\3\2\2\2\60\u0226\3\2\2\2"+ + "\62\u0237\3\2\2\2\64\u0248\3\2\2\2\66\u024b\3\2\2\28\u0257\3\2\2\2:\u0260"+ + "\3\2\2\2<\u026a\3\2\2\2>\u026c\3\2\2\2@\u0276\3\2\2\2B\u0278\3\2\2\2D"+ + "\u027d\3\2\2\2F\u0281\3\2\2\2H\u0287\3\2\2\2J\u029c\3\2\2\2L\u02a2\3\2"+ + "\2\2N\u02a4\3\2\2\2P\u02b7\3\2\2\2R\u02c8\3\2\2\2T\u02d8\3\2\2\2V\u02ec"+ + "\3\2\2\2X\u02fb\3\2\2\2Z\u02fd\3\2\2\2\\\u0305\3\2\2\2^\u030b\3\2\2\2"+ + "`\u0319\3\2\2\2b\u0323\3\2\2\2d\u0327\3\2\2\2f\u0337\3\2\2\2h\u0340\3"+ + "\2\2\2j\u0350\3\2\2\2l\u0359\3\2\2\2n\u0361\3\2\2\2p\u0364\3\2\2\2r\u036e"+ + "\3\2\2\2t\u0380\3\2\2\2v\u038a\3\2\2\2x\u039a\3\2\2\2z\u039f\3\2\2\2|"+ + "\u03ac\3\2\2\2~\u03b4\3\2\2\2\u0080\u03c3\3\2\2\2\u0082\u03ca\3\2\2\2"+ + "\u0084\u03da\3\2\2\2\u0086\u03eb\3\2\2\2\u0088\u03f4\3\2\2\2\u008a\u03fd"+ + "\3\2\2\2\u008c\u0410\3\2\2\2\u008e\u0418\3\2\2\2\u0090\u0421\3\2\2\2\u0092"+ + "\u0425\3\2\2\2\u0094\u042a\3\2\2\2\u0096\u0432\3\2\2\2\u0098\u0437\3\2"+ + "\2\2\u009a\u043f\3\2\2\2\u009c\u0447\3\2\2\2\u009e\u044d\3\2\2\2\u00a0"+ + "\u0453\3\2\2\2\u00a2\u0459\3\2\2\2\u00a4\u045f\3\2\2\2\u00a6\u0465\3\2"+ + "\2\2\u00a8\u0474\3\2\2\2\u00aa\u0479\3\2\2\2\u00ac\u0481\3\2\2\2\u00ae"+ + "\u0483\3\2\2\2\u00b0\u048a\3\2\2\2\u00b2\u0491\3\2\2\2\u00b4\u0499\3\2"+ + "\2\2\u00b6\u04a4\3\2\2\2\u00b8\u04aa\3\2\2\2\u00ba\u04ad\3\2\2\2\u00bc"+ + "\u04b1\3\2\2\2\u00be\u04c9\3\2\2\2\u00c0\u04cb\3\2\2\2\u00c2\u04cf\3\2"+ + "\2\2\u00c4\u04d2\3\2\2\2\u00c6\u04d8\3\2\2\2\u00c8\u04da\3\2\2\2\u00ca"+ + "\u04df\3\2\2\2\u00cc\u04e4\3\2\2\2\u00ce\u04e7\3\2\2\2\u00d0\u04f5\3\2"+ + "\2\2\u00d2\u04f9\3\2\2\2\u00d4\u04fb\3\2\2\2\u00d6\u04ff\3\2\2\2\u00d8"+ + "\u0525\3\2\2\2\u00da\u0527\3\2\2\2\u00dc\u052b\3\2\2\2\u00de\u0531\3\2"+ + "\2\2\u00e0\u0539\3\2\2\2\u00e2\u0548\3\2\2\2\u00e4\u054e\3\2\2\2\u00e6"+ + "\u0555\3\2\2\2\u00e8\u0559\3\2\2\2\u00ea\u0570\3\2\2\2\u00ec\u0579\3\2"+ + "\2\2\u00ee\u057b\3\2\2\2\u00f0\u0585\3\2\2\2\u00f2\u0589\3\2\2\2\u00f4"+ + "\u0591\3\2\2\2\u00f6\u0593\3\2\2\2\u00f8\u0598\3\2\2\2\u00fa\u05a0\3\2"+ + "\2\2\u00fc\u05a2\3\2\2\2\u00fe\u05a6\3\2\2\2\u0100\u05aa\3\2\2\2\u0102"+ + "\u05ae\3\2\2\2\u0104\u05b3\3\2\2\2\u0106\u05b5\3\2\2\2\u0108\u05b9\3\2"+ + "\2\2\u010a\u05c0\3\2\2\2\u010c\u05ce\3\2\2\2\u010e\u05d0\3\2\2\2\u0110"+ + "\u05de\3\2\2\2\u0112\u05e0\3\2\2\2\u0114\u05e7\3\2\2\2\u0116\u05eb\3\2"+ + "\2\2\u0118\u05f3\3\2\2\2\u011a\u05f7\3\2\2\2\u011c\u05fb\3\2\2\2\u011e"+ + "\u05ff\3\2\2\2\u0120\u0607\3\2\2\2\u0122\u0614\3\2\2\2\u0124\u0616\3\2"+ + "\2\2\u0126\u061b\3\2\2\2\u0128\u062b\3\2\2\2\u012a\u062d\3\2\2\2\u012c"+ + "\u0632\3\2\2\2\u012e\u0634\3\2\2\2\u0130\u0636\3\2\2\2\u0132\u0638\3\2"+ + "\2\2\u0134\u063a\3\2\2\2\u0136\u063e\3\2\2\2\u0138\u0640\3\2\2\2\u013a"+ + "\u0645\3\2\2\2\u013c\u064e\3\2\2\2\u013e\u0650\3\2\2\2\u0140\u0655\3\2"+ + "\2\2\u0142\u065a\3\2\2\2\u0144\u065e\3\2\2\2\u0146\u0665\3\2\2\2\u0148"+ + "\u0667\3\2\2\2\u014a\u066e\3\2\2\2\u014c\u0675\3\2\2\2\u014e\u067c\3\2"+ + "\2\2\u0150\u0683\3\2\2\2\u0152\u0692\3\2\2\2\u0154\u06a4\3\2\2\2\u0156"+ + "\u06a8\3\2\2\2\u0158\u06aa\3\2\2\2\u015a\u06af\3\2\2\2\u015c\u06bf\3\2"+ + "\2\2\u015e\u06c5\3\2\2\2\u0160\u06ca\3\2\2\2\u0162\u06d0\3\2\2\2\u0164"+ + "\u06d2\3\2\2\2\u0166\u06d4\3\2\2\2\u0168\u0169\5\4\3\2\u0169\u016a\7\2"+ + "\2\3\u016a\3\3\2\2\2\u016b\u016c\7h\2\2\u016c\u016d\7g\2\2\u016d\u016e"+ + "\5\u0164\u00b3\2\u016e\u016f\7\3\2\2\u016f\u0171\3\2\2\2\u0170\u016b\3"+ + "\2\2\2\u0170\u0171\3\2\2\2\u0171\u0174\3\2\2\2\u0172\u0175\5\b\5\2\u0173"+ + "\u0175\5\6\4\2\u0174\u0172\3\2\2\2\u0174\u0173\3\2\2\2\u0175\5\3\2\2\2"+ + "\u0176\u0177\5\n\6\2\u0177\u0178\5\f\7\2\u0178\7\3\2\2\2\u0179\u017a\7"+ + "\4\2\2\u017a\u017b\7\u0087\2\2\u017b\u017c\7\u00b2\2\2\u017c\u017d\7\5"+ + "\2\2\u017d\u017e\5\u0162\u00b2\2\u017e\u017f\7\3\2\2\u017f\u0180\5\n\6"+ + "\2\u0180\t\3\2\2\2\u0181\u0185\5<\37\2\u0182\u0185\5> \2\u0183\u0185\5"+ + "N(\2\u0184\u0181\3\2\2\2\u0184\u0182\3\2\2\2\u0184\u0183\3\2\2\2\u0185"+ + "\u0186\3\2\2\2\u0186\u0187\7\3\2\2\u0187\u0189\3\2\2\2\u0188\u0184\3\2"+ + "\2\2\u0189\u018c\3\2\2\2\u018a\u0188\3\2\2\2\u018a\u018b\3\2\2\2\u018b"+ + "\u0192\3\2\2\2\u018c\u018a\3\2\2\2\u018d\u018e\5@!\2\u018e\u018f\7\3\2"+ + "\2\u018f\u0191\3\2\2\2\u0190\u018d\3\2\2\2\u0191\u0194\3\2\2\2\u0192\u0190"+ + "\3\2\2\2\u0192\u0193\3\2\2\2\u0193\13\3\2\2\2\u0194\u0192\3\2\2\2\u0195"+ + "\u0196\5\22\n\2\u0196\r\3\2\2\2\u0197\u0199\5\24\13\2\u0198\u0197\3\2"+ + "\2\2\u0199\u019c\3\2\2\2\u019a\u0198\3\2\2\2\u019a\u019b\3\2\2\2\u019b"+ + "\17\3\2\2\2\u019c\u019a\3\2\2\2\u019d\u019e\5\16\b\2\u019e\u019f\5^\60"+ + "\2\u019f\21\3\2\2\2\u01a0\u01a2\5\16\b\2\u01a1\u01a3\5^\60\2\u01a2\u01a1"+ + "\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\23\3\2\2\2\u01a4\u01b2\5\26\f\2\u01a5"+ + "\u01b2\5\30\r\2\u01a6\u01b2\5\32\16\2\u01a7\u01b2\5\34\17\2\u01a8\u01b2"+ + "\5\36\20\2\u01a9\u01b2\5 \21\2\u01aa\u01b2\5\"\22\2\u01ab\u01b2\5$\23"+ + "\2\u01ac\u01b2\5&\24\2\u01ad\u01b2\5*\26\2\u01ae\u01b2\5.\30\2\u01af\u01b2"+ + "\5\66\34\2\u01b0\u01b2\5:\36\2\u01b1\u01a4\3\2\2\2\u01b1\u01a5\3\2\2\2"+ + "\u01b1\u01a6\3\2\2\2\u01b1\u01a7\3\2\2\2\u01b1\u01a8\3\2\2\2\u01b1\u01a9"+ + "\3\2\2\2\u01b1\u01aa\3\2\2\2\u01b1\u01ab\3\2\2\2\u01b1\u01ac\3\2\2\2\u01b1"+ + "\u01ad\3\2\2\2\u01b1\u01ae\3\2\2\2\u01b1\u01af\3\2\2\2\u01b1\u01b0\3\2"+ + "\2\2\u01b2\25\3\2\2\2\u01b3\u01b4\5b\62\2\u01b4\u01b5\7\3\2\2\u01b5\27"+ + "\3\2\2\2\u01b6\u01b7\7\6\2\2\u01b7\u01b8\5J&\2\u01b8\u01b9\7\7\2\2\u01b9"+ + "\u01ba\5`\61\2\u01ba\u01bb\7\3\2\2\u01bb\31\3\2\2\2\u01bc\u01bd\7\b\2"+ + "\2\u01bd\u01be\5\16\b\2\u01be\u01bf\7\t\2\2\u01bf\33\3\2\2\2\u01c0\u01c1"+ + "\7\177\2\2\u01c1\u01c2\7\u0080\2\2\u01c2\u01c3\7\3\2\2\u01c3\35\3\2\2"+ + "\2\u01c4\u01c5\7\u0081\2\2\u01c5\u01c6\7\u0080\2\2\u01c6\u01c7\7\3\2\2"+ + "\u01c7\37\3\2\2\2\u01c8\u01c9\7\u0082\2\2\u01c9\u01ca\7\u0083\2\2\u01ca"+ + "\u01cb\5`\61\2\u01cb\u01cc\7\3\2\2\u01cc!\3\2\2\2\u01cd\u01d0\5f\64\2"+ + "\u01ce\u01d0\5j\66\2\u01cf\u01cd\3\2\2\2\u01cf\u01ce\3\2\2\2\u01d0\u01d9"+ + "\3\2\2\2\u01d1\u01d8\5f\64\2\u01d2\u01d8\5j\66\2\u01d3\u01d8\5n8\2\u01d4"+ + "\u01d8\5p9\2\u01d5\u01d8\5t;\2\u01d6\u01d8\5x=\2\u01d7\u01d1\3\2\2\2\u01d7"+ + "\u01d2\3\2\2\2\u01d7\u01d3\3\2\2\2\u01d7\u01d4\3\2\2\2\u01d7\u01d5\3\2"+ + "\2\2\u01d7\u01d6\3\2\2\2\u01d8\u01db\3\2\2\2\u01d9\u01d7\3\2\2\2\u01d9"+ + "\u01da\3\2\2\2\u01da\u01dc\3\2\2\2\u01db\u01d9\3\2\2\2\u01dc\u01dd\7C"+ + "\2\2\u01dd\u01de\5\24\13\2\u01de#\3\2\2\2\u01df\u01e0\7D\2\2\u01e0\u01e1"+ + "\7\n\2\2\u01e1\u01e2\5^\60\2\u01e2\u01e3\7\13\2\2\u01e3\u01e4\7Y\2\2\u01e4"+ + "\u01e5\5\24\13\2\u01e5\u01e6\7Z\2\2\u01e6\u01e7\5\24\13\2\u01e7%\3\2\2"+ + "\2\u01e8\u01e9\7T\2\2\u01e9\u01ea\7\n\2\2\u01ea\u01eb\5^\60\2\u01eb\u01ed"+ + "\7\13\2\2\u01ec\u01ee\5(\25\2\u01ed\u01ec\3\2\2\2\u01ee\u01ef\3\2\2\2"+ + "\u01ef\u01ed\3\2\2\2\u01ef\u01f0\3\2\2\2\u01f0\u01f1\3\2\2\2\u01f1\u01f2"+ + "\7X\2\2\u01f2\u01f3\7C\2\2\u01f3\u01f4\5\24\13\2\u01f4\'\3\2\2\2\u01f5"+ + "\u01f6\7U\2\2\u01f6\u01f8\5`\61\2\u01f7\u01f5\3\2\2\2\u01f8\u01f9\3\2"+ + "\2\2\u01f9\u01f7\3\2\2\2\u01f9\u01fa\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb"+ + "\u01fc\7C\2\2\u01fc\u01fd\5\24\13\2\u01fd)\3\2\2\2\u01fe\u01ff\7V\2\2"+ + "\u01ff\u0201\5\32\16\2\u0200\u0202\5,\27\2\u0201\u0200\3\2\2\2\u0202\u0203"+ + "\3\2\2\2\u0203\u0201\3\2\2\2\u0203\u0204\3\2\2\2\u0204+\3\2\2\2\u0205"+ + "\u0208\7W\2\2\u0206\u0209\7\f\2\2\u0207\u0209\5J&\2\u0208\u0206\3\2\2"+ + "\2\u0208\u0207\3\2\2\2\u0209\u0211\3\2\2\2\u020a\u020d\7\r\2\2\u020b\u020e"+ + "\7\f\2\2\u020c\u020e\5J&\2\u020d\u020b\3\2\2\2\u020d\u020c\3\2\2\2\u020e"+ + "\u0210\3\2\2\2\u020f\u020a\3\2\2\2\u0210\u0213\3\2\2\2\u0211\u020f\3\2"+ + "\2\2\u0211\u0212\3\2\2\2\u0212\u0214\3\2\2\2\u0213\u0211\3\2\2\2\u0214"+ + "\u0215\5\32\16\2\u0215-\3\2\2\2\u0216\u0217\7[\2\2\u0217\u0218\7\n\2\2"+ + "\u0218\u0219\5^\60\2\u0219\u021b\7\13\2\2\u021a\u021c\5\60\31\2\u021b"+ + "\u021a\3\2\2\2\u021c\u021d\3\2\2\2\u021d\u021b\3\2\2\2\u021d\u021e\3\2"+ + "\2\2\u021e\u021f\3\2\2\2\u021f\u0221\7X\2\2\u0220\u0222\5\u00c2b\2\u0221"+ + "\u0220\3\2\2\2\u0221\u0222\3\2\2\2\u0222\u0223\3\2\2\2\u0223\u0224\7C"+ + "\2\2\u0224\u0225\5\24\13\2\u0225/\3\2\2\2\u0226\u022a\7U\2\2\u0227\u0228"+ + "\5\u00c2b\2\u0228\u0229\7F\2\2\u0229\u022b\3\2\2\2\u022a\u0227\3\2\2\2"+ + "\u022a\u022b\3\2\2\2\u022b\u022c\3\2\2\2\u022c\u0231\5\u0152\u00aa\2\u022d"+ + "\u022e\7\r\2\2\u022e\u0230\5\u0152\u00aa\2\u022f\u022d\3\2\2\2\u0230\u0233"+ + "\3\2\2\2\u0231\u022f\3\2\2\2\u0231\u0232\3\2\2\2\u0232\u0234\3\2\2\2\u0233"+ + "\u0231\3\2\2\2\u0234\u0235\7C\2\2\u0235\u0236\5\24\13\2\u0236\61\3\2\2"+ + "\2\u0237\u0238\7\16\2\2\u0238\u0243\5J&\2\u0239\u023a\7\n\2\2\u023a\u023f"+ + "\7\u00ac\2\2\u023b\u023c\7\17\2\2\u023c\u023e\7\u00ac\2\2\u023d\u023b"+ + "\3\2\2\2\u023e\u0241\3\2\2\2\u023f\u023d\3\2\2\2\u023f\u0240\3\2\2\2\u0240"+ + "\u0242\3\2\2\2\u0241\u023f\3\2\2\2\u0242\u0244\7\13\2\2\u0243\u0239\3"+ + "\2\2\2\u0243\u0244\3\2\2\2\u0244\63\3\2\2\2\u0245\u0247\5\62\32\2\u0246"+ + "\u0245\3\2\2\2\u0247\u024a\3\2\2\2\u0248\u0246\3\2\2\2\u0248\u0249\3\2"+ + "\2\2\u0249\65\3\2\2\2\u024a\u0248\3\2\2\2\u024b\u024c\5\64\33\2\u024c"+ + "\u024d\7r\2\2\u024d\u0252\58\35\2\u024e\u024f\7\17\2\2\u024f\u0251\58"+ + "\35\2\u0250\u024e\3\2\2\2\u0251\u0254\3\2\2\2\u0252\u0250\3\2\2\2\u0252"+ + "\u0253\3\2\2\2\u0253\u0255\3\2\2\2\u0254\u0252\3\2\2\2\u0255\u0256\7\3"+ + "\2\2\u0256\67\3\2\2\2\u0257\u025a\5\u00c2b\2\u0258\u0259\7F\2\2\u0259"+ + "\u025b\5\u0152\u00aa\2\u025a\u0258\3\2\2\2\u025a\u025b\3\2\2\2\u025b\u025e"+ + "\3\2\2\2\u025c\u025d\7\7\2\2\u025d\u025f\5`\61\2\u025e\u025c\3\2\2\2\u025e"+ + "\u025f\3\2\2\2\u025f9\3\2\2\2\u0260\u0261\7\u0084\2\2\u0261\u0262\7\n"+ + "\2\2\u0262\u0263\5^\60\2\u0263\u0264\7\13\2\2\u0264\u0265\5\24\13\2\u0265"+ + ";\3\2\2\2\u0266\u026b\5B\"\2\u0267\u026b\5D#\2\u0268\u026b\5F$\2\u0269"+ + "\u026b\5H%\2\u026a\u0266\3\2\2\2\u026a\u0267\3\2\2\2\u026a\u0268\3\2\2"+ + "\2\u026a\u0269\3\2\2\2\u026b=\3\2\2\2\u026c\u026d\7o\2\2\u026d\u026e\7"+ + "\u0087\2\2\u026e\u026f\7\u00b2\2\2\u026f\u0270\7\5\2\2\u0270\u0271\5\u0162"+ + "\u00b2\2\u0271?\3\2\2\2\u0272\u0277\5T+\2\u0273\u0277\5P)\2\u0274\u0277"+ + "\5V,\2\u0275\u0277\5R*\2\u0276\u0272\3\2\2\2\u0276\u0273\3\2\2\2\u0276"+ + "\u0274\3\2\2\2\u0276\u0275\3\2\2\2\u0277A\3\2\2\2\u0278\u0279\7o\2\2\u0279"+ + "\u027a\7X\2\2\u027a\u027b\7Q\2\2\u027b\u027c\5\u0162\u00b2\2\u027cC\3"+ + "\2\2\2\u027d\u027e\7o\2\2\u027e\u027f\7\20\2\2\u027f\u0280\t\2\2\2\u0280"+ + "E\3\2\2\2\u0281\u0282\7o\2\2\u0282\u0283\7X\2\2\u0283\u0284\7B\2\2\u0284"+ + "\u0285\7I\2\2\u0285\u0286\t\3\2\2\u0286G\3\2\2\2\u0287\u028c\7o\2\2\u0288"+ + "\u0289\7\22\2\2\u0289\u028d\5J&\2\u028a\u028b\7X\2\2\u028b\u028d\7\22"+ + "\2\2\u028c\u0288\3\2\2\2\u028c\u028a\3\2\2\2\u028d\u0294\3\2\2\2\u028e"+ + "\u028f\5L\'\2\u028f\u0290\7\5\2\2\u0290\u0291\5\u0164\u00b3\2\u0291\u0293"+ + "\3\2\2\2\u0292\u028e\3\2\2\2\u0293\u0296\3\2\2\2\u0294\u0292\3\2\2\2\u0294"+ + "\u0295\3\2\2\2\u0295I\3\2\2\2\u0296\u0294\3\2\2\2\u0297\u029a\7\u00b2"+ + "\2\2\u0298\u029a\5\u0166\u00b4\2\u0299\u0297\3\2\2\2\u0299\u0298\3\2\2"+ + "\2\u029a\u029b\3\2\2\2\u029b\u029d\7\23\2\2\u029c\u0299\3\2\2\2\u029c"+ + "\u029d\3\2\2\2\u029d\u02a0\3\2\2\2\u029e\u02a1\7\u00b2\2\2\u029f\u02a1"+ + "\5\u0166\u00b4\2\u02a0\u029e\3\2\2\2\u02a0\u029f\3\2\2\2\u02a1K\3\2\2"+ + "\2\u02a2\u02a3\t\4\2\2\u02a3M\3\2\2\2\u02a4\u02a5\7\u0085\2\2\u02a5\u02a9"+ + "\7\4\2\2\u02a6\u02a7\7\u0087\2\2\u02a7\u02a8\7\u00b2\2\2\u02a8\u02aa\7"+ + "\5\2\2\u02a9\u02a6\3\2\2\2\u02a9\u02aa\3\2\2\2\u02aa\u02ab\3\2\2\2\u02ab"+ + "\u02b5\5\u0162\u00b2\2\u02ac\u02ad\7G\2\2\u02ad\u02b2\5\u0162\u00b2\2"+ + "\u02ae\u02af\7\17\2\2\u02af\u02b1\5\u0162\u00b2\2\u02b0\u02ae\3\2\2\2"+ + "\u02b1\u02b4\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b2\u02b3\3\2\2\2\u02b3\u02b6"+ + "\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5\u02ac\3\2\2\2\u02b5\u02b6\3\2\2\2\u02b6"+ + "O\3\2\2\2\u02b7\u02b8\7o\2\2\u02b8\u02b9\5\64\33\2\u02b9\u02ba\7r\2\2"+ + "\u02ba\u02bd\5\u00c2b\2\u02bb\u02bc\7F\2\2\u02bc\u02be\5\u0152\u00aa\2"+ + "\u02bd\u02bb\3\2\2\2\u02bd\u02be\3\2\2\2\u02be\u02c6\3\2\2\2\u02bf\u02c0"+ + "\7\7\2\2\u02c0\u02c7\5`\61\2\u02c1\u02c4\7\36\2\2\u02c2\u02c3\7\7\2\2"+ + "\u02c3\u02c5\5`\61\2\u02c4\u02c2\3\2\2\2\u02c4\u02c5\3\2\2\2\u02c5\u02c7"+ + "\3\2\2\2\u02c6\u02bf\3\2\2\2\u02c6\u02c1\3\2\2\2\u02c7Q\3\2\2\2\u02c8"+ + "\u02c9\7o\2\2\u02c9\u02ca\7p\2\2\u02ca\u02cd\7q\2\2\u02cb\u02cc\7F\2\2"+ + "\u02cc\u02ce\5\u0152\u00aa\2\u02cd\u02cb\3\2\2\2\u02cd\u02ce\3\2\2\2\u02ce"+ + "\u02d6\3\2\2\2\u02cf\u02d0\7\7\2\2\u02d0\u02d7\5`\61\2\u02d1\u02d4\7\36"+ + "\2\2\u02d2\u02d3\7\7\2\2\u02d3\u02d5\5`\61\2\u02d4\u02d2\3\2\2\2\u02d4"+ + "\u02d5\3\2\2\2\u02d5\u02d7\3\2\2\2\u02d6\u02cf\3\2\2\2\u02d6\u02d1\3\2"+ + "\2\2\u02d7S\3\2\2\2\u02d8\u02d9\7o\2\2\u02d9\u02da\5\64\33\2\u02da\u02db"+ + "\7\37\2\2\u02db\u02dc\5J&\2\u02dc\u02de\7\n\2\2\u02dd\u02df\5Z.\2\u02de"+ + "\u02dd\3\2\2\2\u02de\u02df\3\2\2\2\u02df\u02e0\3\2\2\2\u02e0\u02e3\7\13"+ + "\2\2\u02e1\u02e2\7F\2\2\u02e2\u02e4\5\u0152\u00aa\2\u02e3\u02e1\3\2\2"+ + "\2\u02e3\u02e4\3\2\2\2\u02e4\u02ea\3\2\2\2\u02e5\u02e6\7\b\2\2\u02e6\u02e7"+ + "\5\22\n\2\u02e7\u02e8\7\t\2\2\u02e8\u02eb\3\2\2\2\u02e9\u02eb\7\36\2\2"+ + "\u02ea\u02e5\3\2\2\2\u02ea\u02e9\3\2\2\2\u02ebU\3\2\2\2\u02ec\u02ed\7"+ + "o\2\2\u02ed\u02ee\7l\2\2\u02ee\u02ef\5J&\2\u02ef\u02f1\7F\2\2\u02f0\u02f2"+ + "\5X-\2\u02f1\u02f0\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3"+ + "\u02f4\5`\61\2\u02f4W\3\2\2\2\u02f5\u02f6\7 \2\2\u02f6\u02fc\7!\2\2\u02f7"+ + "\u02f8\7 \2\2\u02f8\u02fc\7\"\2\2\u02f9\u02fa\7|\2\2\u02fa\u02fc\7\u0086"+ + "\2\2\u02fb\u02f5\3\2\2\2\u02fb\u02f7\3\2\2\2\u02fb\u02f9\3\2\2\2\u02fc"+ + "Y\3\2\2\2\u02fd\u0302\5\\/\2\u02fe\u02ff\7\17\2\2\u02ff\u0301\5\\/\2\u0300"+ + "\u02fe\3\2\2\2\u0301\u0304\3\2\2\2\u0302\u0300\3\2\2\2\u0302\u0303\3\2"+ + "\2\2\u0303[\3\2\2\2\u0304\u0302\3\2\2\2\u0305\u0306\7\6\2\2\u0306\u0309"+ + "\5J&\2\u0307\u0308\7F\2\2\u0308\u030a\5\u0152\u00aa\2\u0309\u0307\3\2"+ + "\2\2\u0309\u030a\3\2\2\2\u030a]\3\2\2\2\u030b\u0310\5`\61\2\u030c\u030d"+ + "\7\17\2\2\u030d\u030f\5`\61\2\u030e\u030c\3\2\2\2\u030f\u0312\3\2\2\2"+ + "\u0310\u030e\3\2\2\2\u0310\u0311\3\2\2\2\u0311_\3\2\2\2\u0312\u0310\3"+ + "\2\2\2\u0313\u031a\5b\62\2\u0314\u031a\5d\63\2\u0315\u031a\5~@\2\u0316"+ + "\u031a\5\u0082B\2\u0317\u031a\5\u0086D\2\u0318\u031a\5\u0088E\2\u0319"+ + "\u0313\3\2\2\2\u0319\u0314\3\2\2\2\u0319\u0315\3\2\2\2\u0319\u0316\3\2"+ + "\2\2\u0319\u0317\3\2\2\2\u0319\u0318\3\2\2\2\u031aa\3\2\2\2\u031b\u0324"+ + "\5z>\2\u031c\u0324\5\u008cG\2\u031d\u0324\5\u00d8m\2\u031e\u0324\5\u00da"+ + "n\2\u031f\u0324\5\u00dco\2\u0320\u0324\5\u00dep\2\u0321\u0324\5\u00e0"+ + "q\2\u0322\u0324\5\u00e2r\2\u0323\u031b\3\2\2\2\u0323\u031c\3\2\2\2\u0323"+ + "\u031d\3\2\2\2\u0323\u031e\3\2\2\2\u0323\u031f\3\2\2\2\u0323\u0320\3\2"+ + "\2\2\u0323\u0321\3\2\2\2\u0323\u0322\3\2\2\2\u0324c\3\2\2\2\u0325\u0328"+ + "\5f\64\2\u0326\u0328\5j\66\2\u0327\u0325\3\2\2\2\u0327\u0326\3\2\2\2\u0328"+ + "\u0331\3\2\2\2\u0329\u0330\5f\64\2\u032a\u0330\5j\66\2\u032b\u0330\5n"+ + "8\2\u032c\u0330\5p9\2\u032d\u0330\5t;\2\u032e\u0330\5x=\2\u032f\u0329"+ + "\3\2\2\2\u032f\u032a\3\2\2\2\u032f\u032b\3\2\2\2\u032f\u032c\3\2\2\2\u032f"+ + "\u032d\3\2\2\2\u032f\u032e\3\2\2\2\u0330\u0333\3\2\2\2\u0331\u032f\3\2"+ + "\2\2\u0331\u0332\3\2\2\2\u0332\u0334\3\2\2\2\u0333\u0331\3\2\2\2\u0334"+ + "\u0335\7C\2\2\u0335\u0336\5`\61\2\u0336e\3\2\2\2\u0337\u0338\7=\2\2\u0338"+ + "\u033d\5h\65\2\u0339\u033a\7\17\2\2\u033a\u033c\5h\65\2\u033b\u0339\3"+ + "\2\2\2\u033c\u033f\3\2\2\2\u033d\u033b\3\2\2\2\u033d\u033e\3\2\2\2\u033e"+ + "g\3\2\2\2\u033f\u033d\3\2\2\2\u0340\u0343\5\u00c2b\2\u0341\u0342\7F\2"+ + "\2\u0342\u0344\5\u0152\u00aa\2\u0343\u0341\3\2\2\2\u0343\u0344\3\2\2\2"+ + "\u0344\u0347\3\2\2\2\u0345\u0346\7H\2\2\u0346\u0348\7I\2\2\u0347\u0345"+ + "\3\2\2\2\u0347\u0348\3\2\2\2\u0348\u034b\3\2\2\2\u0349\u034a\7G\2\2\u034a"+ + "\u034c\5\u00c2b\2\u034b\u0349\3\2\2\2\u034b\u034c\3\2\2\2\u034c\u034d"+ + "\3\2\2\2\u034d\u034e\7E\2\2\u034e\u034f\5`\61\2\u034fi\3\2\2\2\u0350\u0351"+ + "\7>\2\2\u0351\u0356\5l\67\2\u0352\u0353\7\17\2\2\u0353\u0355\5l\67\2\u0354"+ + "\u0352\3\2\2\2\u0355\u0358\3\2\2\2\u0356\u0354\3\2\2\2\u0356\u0357\3\2"+ + "\2\2\u0357k\3\2\2\2\u0358\u0356\3\2\2\2\u0359\u035c\5\u00c2b\2\u035a\u035b"+ + "\7F\2\2\u035b\u035d\5\u0152\u00aa\2\u035c\u035a\3\2\2\2\u035c\u035d\3"+ + "\2\2\2\u035d\u035e\3\2\2\2\u035e\u035f\7\7\2\2\u035f\u0360\5`\61\2\u0360"+ + "m\3\2\2\2\u0361\u0362\7?\2\2\u0362\u0363\5`\61\2\u0363o\3\2\2\2\u0364"+ + "\u0365\7@\2\2\u0365\u0366\7A\2\2\u0366\u036b\5r:\2\u0367\u0368\7\17\2"+ + "\2\u0368\u036a\5r:\2\u0369\u0367\3\2\2\2\u036a\u036d\3\2\2\2\u036b\u0369"+ + "\3\2\2\2\u036b\u036c\3\2\2\2\u036cq\3\2\2\2\u036d\u036b\3\2\2\2\u036e"+ + "\u0375\5\u00c2b\2\u036f\u0370\7F\2\2\u0370\u0372\5\u0152\u00aa\2\u0371"+ + "\u036f\3\2\2\2\u0371\u0372\3\2\2\2\u0372\u0373\3\2\2\2\u0373\u0374\7\7"+ + "\2\2\u0374\u0376\5`\61\2\u0375\u0371\3\2\2\2\u0375\u0376\3\2\2\2\u0376"+ + "\u0379\3\2\2\2\u0377\u0378\7Q\2\2\u0378\u037a\5\u0162\u00b2\2\u0379\u0377"+ + "\3\2\2\2\u0379\u037a\3\2\2\2\u037as\3\2\2\2\u037b\u037c\7B\2\2\u037c\u0381"+ + "\7A\2\2\u037d\u037e\7K\2\2\u037e\u037f\7B\2\2\u037f\u0381\7A\2\2\u0380"+ + "\u037b\3\2\2\2\u0380\u037d\3\2\2\2\u0381\u0382\3\2\2\2\u0382\u0387\5v"+ + "<\2\u0383\u0384\7\17\2\2\u0384\u0386\5v<\2\u0385\u0383\3\2\2\2\u0386\u0389"+ + "\3\2\2\2\u0387\u0385\3\2\2\2\u0387\u0388\3\2\2\2\u0388u\3\2\2\2\u0389"+ + "\u0387\3\2\2\2\u038a\u038d\5`\61\2\u038b\u038e\7L\2\2\u038c\u038e\7M\2"+ + "\2\u038d\u038b\3\2\2\2\u038d\u038c\3\2\2\2\u038d\u038e\3\2\2\2\u038e\u0394"+ + "\3\2\2\2\u038f\u0392\7I\2\2\u0390\u0393\7R\2\2\u0391\u0393\7S\2\2\u0392"+ + "\u0390\3\2\2\2\u0392\u0391\3\2\2\2\u0393\u0395\3\2\2\2\u0394\u038f\3\2"+ + "\2\2\u0394\u0395\3\2\2\2\u0395\u0398\3\2\2\2\u0396\u0397\7Q\2\2\u0397"+ + "\u0399\5\u0162\u00b2\2\u0398\u0396\3\2\2\2\u0398\u0399\3\2\2\2\u0399w"+ + "\3\2\2\2\u039a\u039b\7J\2\2\u039b\u039c\5\u00c2b\2\u039cy\3\2\2\2\u039d"+ + "\u03a0\7N\2\2\u039e\u03a0\7O\2\2\u039f\u039d\3\2\2\2\u039f\u039e\3\2\2"+ + "\2\u03a0\u03a1\3\2\2\2\u03a1\u03a6\5|?\2\u03a2\u03a3\7\17\2\2\u03a3\u03a5"+ + "\5|?\2\u03a4\u03a2\3\2\2\2\u03a5\u03a8\3\2\2\2\u03a6\u03a4\3\2\2\2\u03a6"+ + "\u03a7\3\2\2\2\u03a7\u03a9\3\2\2\2\u03a8\u03a6\3\2\2\2\u03a9\u03aa\7P"+ + "\2\2\u03aa\u03ab\5`\61\2\u03ab{\3\2\2\2\u03ac\u03af\5\u00c2b\2\u03ad\u03ae"+ + "\7F\2\2\u03ae\u03b0\5\u0152\u00aa\2\u03af\u03ad\3\2\2\2\u03af\u03b0\3"+ + "\2\2\2\u03b0\u03b1\3\2\2\2\u03b1\u03b2\7E\2\2\u03b2\u03b3\5`\61\2\u03b3"+ + "}\3\2\2\2\u03b4\u03b5\7T\2\2\u03b5\u03b6\7\n\2\2\u03b6\u03b7\5^\60\2\u03b7"+ + "\u03b9\7\13\2\2\u03b8\u03ba\5\u0080A\2\u03b9\u03b8\3\2\2\2\u03ba\u03bb"+ + "\3\2\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc\u03bd\3\2\2\2\u03bd"+ + "\u03be\7X\2\2\u03be\u03bf\7C\2\2\u03bf\u03c0\5`\61\2\u03c0\177\3\2\2\2"+ + "\u03c1\u03c2\7U\2\2\u03c2\u03c4\5`\61\2\u03c3\u03c1\3\2\2\2\u03c4\u03c5"+ + "\3\2\2\2\u03c5\u03c3\3\2\2\2\u03c5\u03c6\3\2\2\2\u03c6\u03c7\3\2\2\2\u03c7"+ + "\u03c8\7C\2\2\u03c8\u03c9\5`\61\2\u03c9\u0081\3\2\2\2\u03ca\u03cb\7[\2"+ + "\2\u03cb\u03cc\7\n\2\2\u03cc\u03cd\5^\60\2\u03cd\u03cf\7\13\2\2\u03ce"+ + "\u03d0\5\u0084C\2\u03cf\u03ce\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03cf"+ + "\3\2\2\2\u03d1\u03d2\3\2\2\2\u03d2\u03d3\3\2\2\2\u03d3\u03d5\7X\2\2\u03d4"+ + "\u03d6\5\u00c2b\2\u03d5\u03d4\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6\u03d7"+ + "\3\2\2\2\u03d7\u03d8\7C\2\2\u03d8\u03d9\5`\61\2\u03d9\u0083\3\2\2\2\u03da"+ + "\u03de\7U\2\2\u03db\u03dc\5\u00c2b\2\u03dc\u03dd\7F\2\2\u03dd\u03df\3"+ + "\2\2\2\u03de\u03db\3\2\2\2\u03de\u03df\3\2\2\2\u03df\u03e0\3\2\2\2\u03e0"+ + "\u03e5\5\u0152\u00aa\2\u03e1\u03e2\7\r\2\2\u03e2\u03e4\5\u0152\u00aa\2"+ + "\u03e3\u03e1\3\2\2\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5\u03e6"+ + "\3\2\2\2\u03e6\u03e8\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7C\2\2\u03e9"+ + "\u03ea\5`\61\2\u03ea\u0085\3\2\2\2\u03eb\u03ec\7D\2\2\u03ec\u03ed\7\n"+ + "\2\2\u03ed\u03ee\5^\60\2\u03ee\u03ef\7\13\2\2\u03ef\u03f0\7Y\2\2\u03f0"+ + "\u03f1\5`\61\2\u03f1\u03f2\7Z\2\2\u03f2\u03f3\5`\61\2\u03f3\u0087\3\2"+ + "\2\2\u03f4\u03f5\7V\2\2\u03f5\u03f6\7\b\2\2\u03f6\u03f7\5^\60\2\u03f7"+ + "\u03f9\7\t\2\2\u03f8\u03fa\5\u008aF\2\u03f9\u03f8\3\2\2\2\u03fa\u03fb"+ + "\3\2\2\2\u03fb\u03f9\3\2\2\2\u03fb\u03fc\3\2\2\2\u03fc\u0089\3\2\2\2\u03fd"+ + "\u0400\7W\2\2\u03fe\u0401\7\f\2\2\u03ff\u0401\5J&\2\u0400\u03fe\3\2\2"+ + "\2\u0400\u03ff\3\2\2\2\u0401\u0409\3\2\2\2\u0402\u0405\7\r\2\2\u0403\u0406"+ + "\7\f\2\2\u0404\u0406\5J&\2\u0405\u0403\3\2\2\2\u0405\u0404\3\2\2\2\u0406"+ + "\u0408\3\2\2\2\u0407\u0402\3\2\2\2\u0408\u040b\3\2\2\2\u0409\u0407\3\2"+ + "\2\2\u0409\u040a\3\2\2\2\u040a\u040c\3\2\2\2\u040b\u0409\3\2\2\2\u040c"+ "\u040d\7\b\2\2\u040d\u040e\5^\60\2\u040e\u040f\7\t\2\2\u040f\u008b\3\2"+ "\2\2\u0410\u0415\5\u008eH\2\u0411\u0412\7\\\2\2\u0412\u0414\5\u008eH\2"+ "\u0413\u0411\3\2\2\2\u0414\u0417\3\2\2\2\u0415\u0413\3\2\2\2\u0415\u0416"+ @@ -13604,130 +13619,131 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\2\2\2\u05a1\u00fb\3\2\2\2\u05a2\u05a3\t\n\2\2\u05a3\u05a4\7\23\2\2\u05a4"+ "\u05a5\7\23\2\2\u05a5\u00fd\3\2\2\2\u05a6\u05a7\7:\2\2\u05a7\u00ff\3\2"+ "\2\2\u05a8\u05ab\5\u0102\u0082\2\u05a9\u05ab\5\u0110\u0089\2\u05aa\u05a8"+ - "\3\2\2\2\u05aa\u05a9\3\2\2\2\u05ab\u0101\3\2\2\2\u05ac\u05ad\5J&\2\u05ad"+ - "\u05ae\5\u0104\u0083\2\u05ae\u0103\3\2\2\2\u05af\u05b3\7\f\2\2\u05b0\u05b3"+ - "\5\u0106\u0084\2\u05b1\u05b3\5\u0108\u0085\2\u05b2\u05af\3\2\2\2\u05b2"+ - "\u05b0\3\2\2\2\u05b2\u05b1\3\2\2\2\u05b3\u0105\3\2\2\2\u05b4\u05b5\7\u00b2"+ - "\2\2\u05b5\u05b6\7\23\2\2\u05b6\u05b7\7\f\2\2\u05b7\u0107\3\2\2\2\u05b8"+ - "\u05b9\7\f\2\2\u05b9\u05ba\7\23\2\2\u05ba\u05bb\7\u00b2\2\2\u05bb\u0109"+ - "\3\2\2\2\u05bc\u05be\5\u00ba^\2\u05bd\u05bc\3\2\2\2\u05be\u05c1\3\2\2"+ - "\2\u05bf\u05bd\3\2\2\2\u05bf\u05c0\3\2\2\2\u05c0\u010b\3\2\2\2\u05c1\u05bf"+ - "\3\2\2\2\u05c2\u05ce\5J&\2\u05c3\u05ce\7\u00ab\2\2\u05c4\u05ce\5\u0110"+ - "\u0089\2\u05c5\u05c6\7q\2\2\u05c6\u05c7\7\n\2\2\u05c7\u05ce\7\13\2\2\u05c8"+ - "\u05ce\5\u0156\u00ac\2\u05c9\u05ce\5\u0136\u009c\2\u05ca\u05ce\5\u013c"+ - "\u009f\2\u05cb\u05ce\5\u010e\u0088\2\u05cc\u05ce\5\u0142\u00a2\2\u05cd"+ - "\u05c2\3\2\2\2\u05cd\u05c3\3\2\2\2\u05cd\u05c4\3\2\2\2\u05cd\u05c5\3\2"+ - "\2\2\u05cd\u05c8\3\2\2\2\u05cd\u05c9\3\2\2\2\u05cd\u05ca\3\2\2\2\u05cd"+ - "\u05cb\3\2\2\2\u05cd\u05cc\3\2\2\2\u05ce\u010d\3\2\2\2\u05cf\u05d0\5J"+ - "&\2\u05d0\u010f\3\2\2\2\u05d1\u05de\5\u0116\u008c\2\u05d2\u05de\5\u0126"+ - "\u0094\2\u05d3\u05de\5\u0120\u0091\2\u05d4\u05de\5\u012a\u0096\2\u05d5"+ - "\u05de\5\u0124\u0093\2\u05d6\u05de\5\u011e\u0090\2\u05d7\u05de\5\u011a"+ - "\u008e\2\u05d8\u05de\5\u0118\u008d\2\u05d9\u05de\5\u011c\u008f\2\u05da"+ - "\u05de\5\u0146\u00a4\2\u05db\u05de\5\u0114\u008b\2\u05dc\u05de\5\u0112"+ - "\u008a\2\u05dd\u05d1\3\2\2\2\u05dd\u05d2\3\2\2\2\u05dd\u05d3\3\2\2\2\u05dd"+ - "\u05d4\3\2\2\2\u05dd\u05d5\3\2\2\2\u05dd\u05d6\3\2\2\2\u05dd\u05d7\3\2"+ - "\2\2\u05dd\u05d8\3\2\2\2\u05dd\u05d9\3\2\2\2\u05dd\u05da\3\2\2\2\u05dd"+ - "\u05db\3\2\2\2\u05dd\u05dc\3\2\2\2\u05de\u0111\3\2\2\2\u05df\u05e0\7\u0098"+ - "\2\2\u05e0\u05e2\7\n\2\2\u05e1\u05e3\7\f\2\2\u05e2\u05e1\3\2\2\2\u05e2"+ - "\u05e3\3\2\2\2\u05e3\u05e4\3\2\2\2\u05e4\u05e5\7\13\2\2\u05e5\u0113\3"+ - "\2\2\2\u05e6\u05e7\7\u0099\2\2\u05e7\u05e8\7\n\2\2\u05e8\u05e9\7\13\2"+ - "\2\u05e9\u0115\3\2\2\2\u05ea\u05eb\7\u009b\2\2\u05eb\u05ee\7\n\2\2\u05ec"+ - "\u05ef\5\u0126\u0094\2\u05ed\u05ef\5\u012a\u0096\2\u05ee\u05ec\3\2\2\2"+ - "\u05ee\u05ed\3\2\2\2\u05ee\u05ef\3\2\2\2\u05ef\u05f0\3\2\2\2\u05f0\u05f1"+ - "\7\13\2\2\u05f1\u0117\3\2\2\2\u05f2\u05f3\7\u009c\2\2\u05f3\u05f4\7\n"+ - "\2\2\u05f4\u05f5\7\13\2\2\u05f5\u0119\3\2\2\2\u05f6\u05f7\7\u00a6\2\2"+ - "\u05f7\u05f8\7\n\2\2\u05f8\u05f9\7\13\2\2\u05f9\u011b\3\2\2\2\u05fa\u05fb"+ - "\7\u009e\2\2\u05fb\u05fc\7\n\2\2\u05fc\u05fd\7\13\2\2\u05fd\u011d\3\2"+ - "\2\2\u05fe\u05ff\7\u009d\2\2\u05ff\u0602\7\n\2\2\u0600\u0603\7\u00b2\2"+ - "\2\u0601\u0603\5\u0164\u00b3\2\u0602\u0600\3\2\2\2\u0602\u0601\3\2\2\2"+ - "\u0602\u0603\3\2\2\2\u0603\u0604\3\2\2\2\u0604\u0605\7\13\2\2\u0605\u011f"+ - "\3\2\2\2\u0606\u0607\7\u008e\2\2\u0607\u060d\7\n\2\2\u0608\u060b\5\u0122"+ - "\u0092\2\u0609\u060a\7\17\2\2\u060a\u060c\5\u0134\u009b\2\u060b\u0609"+ - "\3\2\2\2\u060b\u060c\3\2\2\2\u060c\u060e\3\2\2\2\u060d\u0608\3\2\2\2\u060d"+ - "\u060e\3\2\2\2\u060e\u060f\3\2\2\2\u060f\u0610\7\13\2\2\u0610\u0121\3"+ - "\2\2\2\u0611\u0614\5\u012e\u0098\2\u0612\u0614\7\f\2\2\u0613\u0611\3\2"+ - "\2\2\u0613\u0612\3\2\2\2\u0614\u0123\3\2\2\2\u0615\u0616\7\u009f\2\2\u0616"+ - "\u0617\7\n\2\2\u0617\u0618\5\u0144\u00a3\2\u0618\u0619\7\13\2\2\u0619"+ - "\u0125\3\2\2\2\u061a\u061b\7\u0088\2\2\u061b\u0624\7\n\2\2\u061c\u0622"+ - "\5\u0128\u0095\2\u061d\u061e\7\17\2\2\u061e\u0620\5\u0134\u009b\2\u061f"+ - "\u0621\7\u00aa\2\2\u0620\u061f\3\2\2\2\u0620\u0621\3\2\2\2\u0621\u0623"+ - "\3\2\2\2\u0622\u061d\3\2\2\2\u0622\u0623\3\2\2\2\u0623\u0625\3\2\2\2\u0624"+ - "\u061c\3\2\2\2\u0624\u0625\3\2\2\2\u0625\u0626\3\2\2\2\u0626\u0627\7\13"+ - "\2\2\u0627\u0127\3\2\2\2\u0628\u062b\5\u0130\u0099\2\u0629\u062b\7\f\2"+ - "\2\u062a\u0628\3\2\2\2\u062a\u0629\3\2\2\2\u062b\u0129\3\2\2\2\u062c\u062d"+ - "\7\u00a0\2\2\u062d\u062e\7\n\2\2\u062e\u062f\5\u012c\u0097\2\u062f\u0630"+ - "\7\13\2\2\u0630\u012b\3\2\2\2\u0631\u0632\5\u0130\u0099\2\u0632\u012d"+ - "\3\2\2\2\u0633\u0634\5J&\2\u0634\u012f\3\2\2\2\u0635\u0636\5J&\2\u0636"+ - "\u0131\3\2\2\2\u0637\u0638\5\u0134\u009b\2\u0638\u0133\3\2\2\2\u0639\u063a"+ - "\5J&\2\u063a\u0135\3\2\2\2\u063b\u063e\5\u0138\u009d\2\u063c\u063e\5\u013a"+ - "\u009e\2\u063d\u063b\3\2\2\2\u063d\u063c\3\2\2\2\u063e\u0137\3\2\2\2\u063f"+ - "\u0640\7\u00a8\2\2\u0640\u0641\7\n\2\2\u0641\u0642\7\f\2\2\u0642\u0643"+ - "\7\13\2\2\u0643\u0139\3\2\2\2\u0644\u0645\7\u00a8\2\2\u0645\u0646\7\n"+ - "\2\2\u0646\u0647\5J&\2\u0647\u0648\7\17\2\2\u0648\u0649\5\u0152\u00aa"+ - "\2\u0649\u064a\7\13\2\2\u064a\u013b\3\2\2\2\u064b\u064e\5\u013e\u00a0"+ - "\2\u064c\u064e\5\u0140\u00a1\2\u064d\u064b\3\2\2\2\u064d\u064c\3\2\2\2"+ - "\u064e\u013d\3\2\2\2\u064f\u0650\7\u00a7\2\2\u0650\u0651\7\n\2\2\u0651"+ - "\u0652\7\f\2\2\u0652\u0653\7\13\2\2\u0653\u013f\3\2\2\2\u0654\u0655\7"+ - "\u00a7\2\2\u0655\u0656\7\n\2\2\u0656\u0657\5\u0152\u00aa\2\u0657\u0658"+ - "\7\13\2\2\u0658\u0141\3\2\2\2\u0659\u065a\7\n\2\2\u065a\u065b\5\u010c"+ - "\u0087\2\u065b\u065c\7\13\2\2\u065c\u0143\3\2\2\2\u065d\u065e\5\u012e"+ - "\u0098\2\u065e\u0145\3\2\2\2\u065f\u0665\5\u0148\u00a5\2\u0660\u0665\5"+ - "\u014a\u00a6\2\u0661\u0665\5\u014c\u00a7\2\u0662\u0665\5\u014e\u00a8\2"+ - "\u0663\u0665\5\u0150\u00a9\2\u0664\u065f\3\2\2\2\u0664\u0660\3\2\2\2\u0664"+ - "\u0661\3\2\2\2\u0664\u0662\3\2\2\2\u0664\u0663\3\2\2\2\u0665\u0147\3\2"+ - "\2\2\u0666\u0667\7\u00a1\2\2\u0667\u0669\7\n\2\2\u0668\u066a\5\u0164\u00b3"+ - "\2\u0669\u0668\3\2\2\2\u0669\u066a\3\2\2\2\u066a\u066b\3\2\2\2\u066b\u066c"+ - "\7\13\2\2\u066c\u0149\3\2\2\2\u066d\u066e\7\u00a5\2\2\u066e\u0670\7\n"+ - "\2\2\u066f\u0671\5\u0164\u00b3\2\u0670\u066f\3\2\2\2\u0670\u0671\3\2\2"+ - "\2\u0671\u0672\3\2\2\2\u0672\u0673\7\13\2\2\u0673\u014b\3\2\2\2\u0674"+ - "\u0675\7\u00a4\2\2\u0675\u0677\7\n\2\2\u0676\u0678\5\u0164\u00b3\2\u0677"+ - "\u0676\3\2\2\2\u0677\u0678\3\2\2\2\u0678\u0679\3\2\2\2\u0679\u067a\7\13"+ - "\2\2\u067a\u014d\3\2\2\2\u067b\u067c\7\u00a2\2\2\u067c\u067e\7\n\2\2\u067d"+ - "\u067f\5\u0164\u00b3\2\u067e\u067d\3\2\2\2\u067e\u067f\3\2\2\2\u067f\u0680"+ - "\3\2\2\2\u0680\u0681\7\13\2\2\u0681\u014f\3\2\2\2\u0682\u0683\7\u00a3"+ - "\2\2\u0683\u0685\7\n\2\2\u0684\u0686\5\u0164\u00b3\2\u0685\u0684\3\2\2"+ - "\2\u0685\u0686\3\2\2\2\u0686\u0687\3\2\2\2\u0687\u0688\7\13\2\2\u0688"+ - "\u0151\3\2\2\2\u0689\u068a\7\n\2\2\u068a\u0692\7\13\2\2\u068b\u068f\5"+ - "\u010c\u0087\2\u068c\u0690\7\u00aa\2\2\u068d\u0690\7\f\2\2\u068e\u0690"+ - "\7/\2\2\u068f\u068c\3\2\2\2\u068f\u068d\3\2\2\2\u068f\u068e\3\2\2\2\u068f"+ - "\u0690\3\2\2\2\u0690\u0692\3\2\2\2\u0691\u0689\3\2\2\2\u0691\u068b\3\2"+ - "\2\2\u0692\u0153\3\2\2\2\u0693\u069c\7\b\2\2\u0694\u0699\5\u015e\u00b0"+ - "\2\u0695\u0696\7\17\2\2\u0696\u0698\5\u015e\u00b0\2\u0697\u0695\3\2\2"+ - "\2\u0698\u069b\3\2\2\2\u0699\u0697\3\2\2\2\u0699\u069a\3\2\2\2\u069a\u069d"+ - "\3\2\2\2\u069b\u0699\3\2\2\2\u069c\u0694\3\2\2\2\u069c\u069d\3\2\2\2\u069d"+ - "\u069e\3\2\2\2\u069e\u06a4\7\t\2\2\u069f\u06a0\7;\2\2\u06a0\u06a1\5^\60"+ - "\2\u06a1\u06a2\7<\2\2\u06a2\u06a4\3\2\2\2\u06a3\u0693\3\2\2\2\u06a3\u069f"+ - "\3\2\2\2\u06a4\u0155\3\2\2\2\u06a5\u06a8\5\u0158\u00ad\2\u06a6\u06a8\5"+ - "\u015a\u00ae\2\u06a7\u06a5\3\2\2\2\u06a7\u06a6\3\2\2\2\u06a8\u0157\3\2"+ - "\2\2\u06a9\u06aa\7\37\2\2\u06aa\u06ab\7\n\2\2\u06ab\u06ac\7\f\2\2\u06ac"+ - "\u06ad\7\13\2\2\u06ad\u0159\3\2\2\2\u06ae\u06af\7\37\2\2\u06af\u06b8\7"+ - "\n\2\2\u06b0\u06b5\5\u0152\u00aa\2\u06b1\u06b2\7\17\2\2\u06b2\u06b4\5"+ - "\u0152\u00aa\2\u06b3\u06b1\3\2\2\2\u06b4\u06b7\3\2\2\2\u06b5\u06b3\3\2"+ - "\2\2\u06b5\u06b6\3\2\2\2\u06b6\u06b9\3\2\2\2\u06b7\u06b5\3\2\2\2\u06b8"+ - "\u06b0\3\2\2\2\u06b8\u06b9\3\2\2\2\u06b9\u06ba\3\2\2\2\u06ba\u06bb\7\13"+ - "\2\2\u06bb\u06bc\7F\2\2\u06bc\u06bd\5\u0152\u00aa\2\u06bd\u015b\3\2\2"+ - "\2\u06be\u06c0\5\u010c\u0087\2\u06bf\u06c1\7\u00aa\2\2\u06c0\u06bf\3\2"+ - "\2\2\u06c0\u06c1\3\2\2\2\u06c1\u015d\3\2\2\2\u06c2\u06c5\5`\61\2\u06c3"+ - "\u06c5\7\u00b2\2\2\u06c4\u06c2\3\2\2\2\u06c4\u06c3\3\2\2\2\u06c5\u06c6"+ - "\3\2\2\2\u06c6\u06c7\t\13\2\2\u06c7\u06c8\5`\61\2\u06c8\u015f\3\2\2\2"+ - "\u06c9\u06cb\7\65\2\2\u06ca\u06cc\5^\60\2\u06cb\u06ca\3\2\2\2\u06cb\u06cc"+ - "\3\2\2\2\u06cc\u06cd\3\2\2\2\u06cd\u06ce\7\66\2\2\u06ce\u0161\3\2\2\2"+ - "\u06cf\u06d0\5\u0164\u00b3\2\u06d0\u0163\3\2\2\2\u06d1\u06d2\7\u00a9\2"+ - "\2\u06d2\u0165\3\2\2\2\u06d3\u06d4\t\f\2\2\u06d4\u0167\3\2\2\2\u00a8\u0170"+ - "\u0174\u0184\u018a\u0192\u019a\u01a2\u01b1\u01cf\u01d7\u01d9\u01ef\u01f9"+ - "\u0203\u0208\u020d\u0211\u021d\u0221\u022a\u0231\u023f\u0243\u0248\u0252"+ - "\u025a\u025e\u026a\u0276\u028c\u0294\u0299\u029c\u02a0\u02a9\u02b2\u02b5"+ - "\u02bd\u02c4\u02c6\u02cd\u02d4\u02d6\u02de\u02e3\u02ea\u02f1\u02fb\u0302"+ - "\u0309\u0310\u0319\u0323\u0327\u032f\u0331\u033d\u0343\u0347\u034b\u0356"+ - "\u035c\u036b\u0371\u0375\u0379\u0380\u0387\u038d\u0392\u0394\u0398\u039f"+ - "\u03a6\u03af\u03bb\u03c5\u03d1\u03d5\u03de\u03e5\u03fb\u0400\u0405\u0409"+ - "\u0415\u041d\u0421\u0428\u042f\u0435\u043c\u0444\u044b\u0451\u0457\u045d"+ - "\u0463\u046e\u0474\u0479\u0481\u0496\u049f\u04a1\u04b8\u04c9\u04d4\u04ea"+ - "\u04ee\u04f5\u04f9\u0503\u0508\u0516\u051f\u0525\u0540\u0551\u0553\u055c"+ - "\u0565\u0568\u0570\u0574\u0579\u0580\u0585\u0589\u0591\u0598\u05a0\u05aa"+ - "\u05b2\u05bf\u05cd\u05dd\u05e2\u05ee\u0602\u060b\u060d\u0613\u0620\u0622"+ - "\u0624\u062a\u063d\u064d\u0664\u0669\u0670\u0677\u067e\u0685\u068f\u0691"+ - "\u0699\u069c\u06a3\u06a7\u06b5\u06b8\u06c0\u06c4\u06cb"; + "\3\2\2\2\u05aa\u05a9\3\2\2\2\u05ab\u0101\3\2\2\2\u05ac\u05af\5J&\2\u05ad"+ + "\u05af\5\u0104\u0083\2\u05ae\u05ac\3\2\2\2\u05ae\u05ad\3\2\2\2\u05af\u0103"+ + "\3\2\2\2\u05b0\u05b4\7\f\2\2\u05b1\u05b4\5\u0106\u0084\2\u05b2\u05b4\5"+ + "\u0108\u0085\2\u05b3\u05b0\3\2\2\2\u05b3\u05b1\3\2\2\2\u05b3\u05b2\3\2"+ + "\2\2\u05b4\u0105\3\2\2\2\u05b5\u05b6\7\u00b2\2\2\u05b6\u05b7\7\23\2\2"+ + "\u05b7\u05b8\7\f\2\2\u05b8\u0107\3\2\2\2\u05b9\u05ba\7\f\2\2\u05ba\u05bb"+ + "\7\23\2\2\u05bb\u05bc\7\u00b2\2\2\u05bc\u0109\3\2\2\2\u05bd\u05bf\5\u00ba"+ + "^\2\u05be\u05bd\3\2\2\2\u05bf\u05c2\3\2\2\2\u05c0\u05be\3\2\2\2\u05c0"+ + "\u05c1\3\2\2\2\u05c1\u010b\3\2\2\2\u05c2\u05c0\3\2\2\2\u05c3\u05cf\5J"+ + "&\2\u05c4\u05cf\7\u00ab\2\2\u05c5\u05cf\5\u0110\u0089\2\u05c6\u05c7\7"+ + "q\2\2\u05c7\u05c8\7\n\2\2\u05c8\u05cf\7\13\2\2\u05c9\u05cf\5\u0156\u00ac"+ + "\2\u05ca\u05cf\5\u0136\u009c\2\u05cb\u05cf\5\u013c\u009f\2\u05cc\u05cf"+ + "\5\u010e\u0088\2\u05cd\u05cf\5\u0142\u00a2\2\u05ce\u05c3\3\2\2\2\u05ce"+ + "\u05c4\3\2\2\2\u05ce\u05c5\3\2\2\2\u05ce\u05c6\3\2\2\2\u05ce\u05c9\3\2"+ + "\2\2\u05ce\u05ca\3\2\2\2\u05ce\u05cb\3\2\2\2\u05ce\u05cc\3\2\2\2\u05ce"+ + "\u05cd\3\2\2\2\u05cf\u010d\3\2\2\2\u05d0\u05d1\5J&\2\u05d1\u010f\3\2\2"+ + "\2\u05d2\u05df\5\u0116\u008c\2\u05d3\u05df\5\u0126\u0094\2\u05d4\u05df"+ + "\5\u0120\u0091\2\u05d5\u05df\5\u012a\u0096\2\u05d6\u05df\5\u0124\u0093"+ + "\2\u05d7\u05df\5\u011e\u0090\2\u05d8\u05df\5\u011a\u008e\2\u05d9\u05df"+ + "\5\u0118\u008d\2\u05da\u05df\5\u011c\u008f\2\u05db\u05df\5\u0146\u00a4"+ + "\2\u05dc\u05df\5\u0114\u008b\2\u05dd\u05df\5\u0112\u008a\2\u05de\u05d2"+ + "\3\2\2\2\u05de\u05d3\3\2\2\2\u05de\u05d4\3\2\2\2\u05de\u05d5\3\2\2\2\u05de"+ + "\u05d6\3\2\2\2\u05de\u05d7\3\2\2\2\u05de\u05d8\3\2\2\2\u05de\u05d9\3\2"+ + "\2\2\u05de\u05da\3\2\2\2\u05de\u05db\3\2\2\2\u05de\u05dc\3\2\2\2\u05de"+ + "\u05dd\3\2\2\2\u05df\u0111\3\2\2\2\u05e0\u05e1\7\u0098\2\2\u05e1\u05e3"+ + "\7\n\2\2\u05e2\u05e4\7\f\2\2\u05e3\u05e2\3\2\2\2\u05e3\u05e4\3\2\2\2\u05e4"+ + "\u05e5\3\2\2\2\u05e5\u05e6\7\13\2\2\u05e6\u0113\3\2\2\2\u05e7\u05e8\7"+ + "\u0099\2\2\u05e8\u05e9\7\n\2\2\u05e9\u05ea\7\13\2\2\u05ea\u0115\3\2\2"+ + "\2\u05eb\u05ec\7\u009b\2\2\u05ec\u05ef\7\n\2\2\u05ed\u05f0\5\u0126\u0094"+ + "\2\u05ee\u05f0\5\u012a\u0096\2\u05ef\u05ed\3\2\2\2\u05ef\u05ee\3\2\2\2"+ + "\u05ef\u05f0\3\2\2\2\u05f0\u05f1\3\2\2\2\u05f1\u05f2\7\13\2\2\u05f2\u0117"+ + "\3\2\2\2\u05f3\u05f4\7\u009c\2\2\u05f4\u05f5\7\n\2\2\u05f5\u05f6\7\13"+ + "\2\2\u05f6\u0119\3\2\2\2\u05f7\u05f8\7\u00a6\2\2\u05f8\u05f9\7\n\2\2\u05f9"+ + "\u05fa\7\13\2\2\u05fa\u011b\3\2\2\2\u05fb\u05fc\7\u009e\2\2\u05fc\u05fd"+ + "\7\n\2\2\u05fd\u05fe\7\13\2\2\u05fe\u011d\3\2\2\2\u05ff\u0600\7\u009d"+ + "\2\2\u0600\u0603\7\n\2\2\u0601\u0604\7\u00b2\2\2\u0602\u0604\5\u0164\u00b3"+ + "\2\u0603\u0601\3\2\2\2\u0603\u0602\3\2\2\2\u0603\u0604\3\2\2\2\u0604\u0605"+ + "\3\2\2\2\u0605\u0606\7\13\2\2\u0606\u011f\3\2\2\2\u0607\u0608\7\u008e"+ + "\2\2\u0608\u060e\7\n\2\2\u0609\u060c\5\u0122\u0092\2\u060a\u060b\7\17"+ + "\2\2\u060b\u060d\5\u0134\u009b\2\u060c\u060a\3\2\2\2\u060c\u060d\3\2\2"+ + "\2\u060d\u060f\3\2\2\2\u060e\u0609\3\2\2\2\u060e\u060f\3\2\2\2\u060f\u0610"+ + "\3\2\2\2\u0610\u0611\7\13\2\2\u0611\u0121\3\2\2\2\u0612\u0615\5\u012e"+ + "\u0098\2\u0613\u0615\7\f\2\2\u0614\u0612\3\2\2\2\u0614\u0613\3\2\2\2\u0615"+ + "\u0123\3\2\2\2\u0616\u0617\7\u009f\2\2\u0617\u0618\7\n\2\2\u0618\u0619"+ + "\5\u0144\u00a3\2\u0619\u061a\7\13\2\2\u061a\u0125\3\2\2\2\u061b\u061c"+ + "\7\u0088\2\2\u061c\u0625\7\n\2\2\u061d\u0623\5\u0128\u0095\2\u061e\u061f"+ + "\7\17\2\2\u061f\u0621\5\u0134\u009b\2\u0620\u0622\7\u00aa\2\2\u0621\u0620"+ + "\3\2\2\2\u0621\u0622\3\2\2\2\u0622\u0624\3\2\2\2\u0623\u061e\3\2\2\2\u0623"+ + "\u0624\3\2\2\2\u0624\u0626\3\2\2\2\u0625\u061d\3\2\2\2\u0625\u0626\3\2"+ + "\2\2\u0626\u0627\3\2\2\2\u0627\u0628\7\13\2\2\u0628\u0127\3\2\2\2\u0629"+ + "\u062c\5\u0130\u0099\2\u062a\u062c\7\f\2\2\u062b\u0629\3\2\2\2\u062b\u062a"+ + "\3\2\2\2\u062c\u0129\3\2\2\2\u062d\u062e\7\u00a0\2\2\u062e\u062f\7\n\2"+ + "\2\u062f\u0630\5\u012c\u0097\2\u0630\u0631\7\13\2\2\u0631\u012b\3\2\2"+ + "\2\u0632\u0633\5\u0130\u0099\2\u0633\u012d\3\2\2\2\u0634\u0635\5J&\2\u0635"+ + "\u012f\3\2\2\2\u0636\u0637\5J&\2\u0637\u0131\3\2\2\2\u0638\u0639\5\u0134"+ + "\u009b\2\u0639\u0133\3\2\2\2\u063a\u063b\5J&\2\u063b\u0135\3\2\2\2\u063c"+ + "\u063f\5\u0138\u009d\2\u063d\u063f\5\u013a\u009e\2\u063e\u063c\3\2\2\2"+ + "\u063e\u063d\3\2\2\2\u063f\u0137\3\2\2\2\u0640\u0641\7\u00a8\2\2\u0641"+ + "\u0642\7\n\2\2\u0642\u0643\7\f\2\2\u0643\u0644\7\13\2\2\u0644\u0139\3"+ + "\2\2\2\u0645\u0646\7\u00a8\2\2\u0646\u0647\7\n\2\2\u0647\u0648\5J&\2\u0648"+ + "\u0649\7\17\2\2\u0649\u064a\5\u0152\u00aa\2\u064a\u064b\7\13\2\2\u064b"+ + "\u013b\3\2\2\2\u064c\u064f\5\u013e\u00a0\2\u064d\u064f\5\u0140\u00a1\2"+ + "\u064e\u064c\3\2\2\2\u064e\u064d\3\2\2\2\u064f\u013d\3\2\2\2\u0650\u0651"+ + "\7\u00a7\2\2\u0651\u0652\7\n\2\2\u0652\u0653\7\f\2\2\u0653\u0654\7\13"+ + "\2\2\u0654\u013f\3\2\2\2\u0655\u0656\7\u00a7\2\2\u0656\u0657\7\n\2\2\u0657"+ + "\u0658\5\u0152\u00aa\2\u0658\u0659\7\13\2\2\u0659\u0141\3\2\2\2\u065a"+ + "\u065b\7\n\2\2\u065b\u065c\5\u010c\u0087\2\u065c\u065d\7\13\2\2\u065d"+ + "\u0143\3\2\2\2\u065e\u065f\5\u012e\u0098\2\u065f\u0145\3\2\2\2\u0660\u0666"+ + "\5\u0148\u00a5\2\u0661\u0666\5\u014a\u00a6\2\u0662\u0666\5\u014c\u00a7"+ + "\2\u0663\u0666\5\u014e\u00a8\2\u0664\u0666\5\u0150\u00a9\2\u0665\u0660"+ + "\3\2\2\2\u0665\u0661\3\2\2\2\u0665\u0662\3\2\2\2\u0665\u0663\3\2\2\2\u0665"+ + "\u0664\3\2\2\2\u0666\u0147\3\2\2\2\u0667\u0668\7\u00a1\2\2\u0668\u066a"+ + "\7\n\2\2\u0669\u066b\5\u0164\u00b3\2\u066a\u0669\3\2\2\2\u066a\u066b\3"+ + "\2\2\2\u066b\u066c\3\2\2\2\u066c\u066d\7\13\2\2\u066d\u0149\3\2\2\2\u066e"+ + "\u066f\7\u00a5\2\2\u066f\u0671\7\n\2\2\u0670\u0672\5\u0164\u00b3\2\u0671"+ + "\u0670\3\2\2\2\u0671\u0672\3\2\2\2\u0672\u0673\3\2\2\2\u0673\u0674\7\13"+ + "\2\2\u0674\u014b\3\2\2\2\u0675\u0676\7\u00a4\2\2\u0676\u0678\7\n\2\2\u0677"+ + "\u0679\5\u0164\u00b3\2\u0678\u0677\3\2\2\2\u0678\u0679\3\2\2\2\u0679\u067a"+ + "\3\2\2\2\u067a\u067b\7\13\2\2\u067b\u014d\3\2\2\2\u067c\u067d\7\u00a2"+ + "\2\2\u067d\u067f\7\n\2\2\u067e\u0680\5\u0164\u00b3\2\u067f\u067e\3\2\2"+ + "\2\u067f\u0680\3\2\2\2\u0680\u0681\3\2\2\2\u0681\u0682\7\13\2\2\u0682"+ + "\u014f\3\2\2\2\u0683\u0684\7\u00a3\2\2\u0684\u0686\7\n\2\2\u0685\u0687"+ + "\5\u0164\u00b3\2\u0686\u0685\3\2\2\2\u0686\u0687\3\2\2\2\u0687\u0688\3"+ + "\2\2\2\u0688\u0689\7\13\2\2\u0689\u0151\3\2\2\2\u068a\u068b\7\n\2\2\u068b"+ + "\u0693\7\13\2\2\u068c\u0690\5\u010c\u0087\2\u068d\u0691\7\u00aa\2\2\u068e"+ + "\u0691\7\f\2\2\u068f\u0691\7/\2\2\u0690\u068d\3\2\2\2\u0690\u068e\3\2"+ + "\2\2\u0690\u068f\3\2\2\2\u0690\u0691\3\2\2\2\u0691\u0693\3\2\2\2\u0692"+ + "\u068a\3\2\2\2\u0692\u068c\3\2\2\2\u0693\u0153\3\2\2\2\u0694\u069d\7\b"+ + "\2\2\u0695\u069a\5\u015e\u00b0\2\u0696\u0697\7\17\2\2\u0697\u0699\5\u015e"+ + "\u00b0\2\u0698\u0696\3\2\2\2\u0699\u069c\3\2\2\2\u069a\u0698\3\2\2\2\u069a"+ + "\u069b\3\2\2\2\u069b\u069e\3\2\2\2\u069c\u069a\3\2\2\2\u069d\u0695\3\2"+ + "\2\2\u069d\u069e\3\2\2\2\u069e\u069f\3\2\2\2\u069f\u06a5\7\t\2\2\u06a0"+ + "\u06a1\7;\2\2\u06a1\u06a2\5^\60\2\u06a2\u06a3\7<\2\2\u06a3\u06a5\3\2\2"+ + "\2\u06a4\u0694\3\2\2\2\u06a4\u06a0\3\2\2\2\u06a5\u0155\3\2\2\2\u06a6\u06a9"+ + "\5\u0158\u00ad\2\u06a7\u06a9\5\u015a\u00ae\2\u06a8\u06a6\3\2\2\2\u06a8"+ + "\u06a7\3\2\2\2\u06a9\u0157\3\2\2\2\u06aa\u06ab\7\37\2\2\u06ab\u06ac\7"+ + "\n\2\2\u06ac\u06ad\7\f\2\2\u06ad\u06ae\7\13\2\2\u06ae\u0159\3\2\2\2\u06af"+ + "\u06b0\7\37\2\2\u06b0\u06b9\7\n\2\2\u06b1\u06b6\5\u0152\u00aa\2\u06b2"+ + "\u06b3\7\17\2\2\u06b3\u06b5\5\u0152\u00aa\2\u06b4\u06b2\3\2\2\2\u06b5"+ + "\u06b8\3\2\2\2\u06b6\u06b4\3\2\2\2\u06b6\u06b7\3\2\2\2\u06b7\u06ba\3\2"+ + "\2\2\u06b8\u06b6\3\2\2\2\u06b9\u06b1\3\2\2\2\u06b9\u06ba\3\2\2\2\u06ba"+ + "\u06bb\3\2\2\2\u06bb\u06bc\7\13\2\2\u06bc\u06bd\7F\2\2\u06bd\u06be\5\u0152"+ + "\u00aa\2\u06be\u015b\3\2\2\2\u06bf\u06c1\5\u010c\u0087\2\u06c0\u06c2\7"+ + "\u00aa\2\2\u06c1\u06c0\3\2\2\2\u06c1\u06c2\3\2\2\2\u06c2\u015d\3\2\2\2"+ + "\u06c3\u06c6\5`\61\2\u06c4\u06c6\7\u00b2\2\2\u06c5\u06c3\3\2\2\2\u06c5"+ + "\u06c4\3\2\2\2\u06c6\u06c7\3\2\2\2\u06c7\u06c8\t\13\2\2\u06c8\u06c9\5"+ + "`\61\2\u06c9\u015f\3\2\2\2\u06ca\u06cc\7\65\2\2\u06cb\u06cd\5^\60\2\u06cc"+ + "\u06cb\3\2\2\2\u06cc\u06cd\3\2\2\2\u06cd\u06ce\3\2\2\2\u06ce\u06cf\7\66"+ + "\2\2\u06cf\u0161\3\2\2\2\u06d0\u06d1\5\u0164\u00b3\2\u06d1\u0163\3\2\2"+ + "\2\u06d2\u06d3\7\u00a9\2\2\u06d3\u0165\3\2\2\2\u06d4\u06d5\t\f\2\2\u06d5"+ + "\u0167\3\2\2\2\u00a9\u0170\u0174\u0184\u018a\u0192\u019a\u01a2\u01b1\u01cf"+ + "\u01d7\u01d9\u01ef\u01f9\u0203\u0208\u020d\u0211\u021d\u0221\u022a\u0231"+ + "\u023f\u0243\u0248\u0252\u025a\u025e\u026a\u0276\u028c\u0294\u0299\u029c"+ + "\u02a0\u02a9\u02b2\u02b5\u02bd\u02c4\u02c6\u02cd\u02d4\u02d6\u02de\u02e3"+ + "\u02ea\u02f1\u02fb\u0302\u0309\u0310\u0319\u0323\u0327\u032f\u0331\u033d"+ + "\u0343\u0347\u034b\u0356\u035c\u036b\u0371\u0375\u0379\u0380\u0387\u038d"+ + "\u0392\u0394\u0398\u039f\u03a6\u03af\u03bb\u03c5\u03d1\u03d5\u03de\u03e5"+ + "\u03fb\u0400\u0405\u0409\u0415\u041d\u0421\u0428\u042f\u0435\u043c\u0444"+ + "\u044b\u0451\u0457\u045d\u0463\u046e\u0474\u0479\u0481\u0496\u049f\u04a1"+ + "\u04b8\u04c9\u04d4\u04ea\u04ee\u04f5\u04f9\u0503\u0508\u0516\u051f\u0525"+ + "\u0540\u0551\u0553\u055c\u0565\u0568\u0570\u0574\u0579\u0580\u0585\u0589"+ + "\u0591\u0598\u05a0\u05aa\u05ae\u05b3\u05c0\u05ce\u05de\u05e3\u05ef\u0603"+ + "\u060c\u060e\u0614\u0621\u0623\u0625\u062b\u063e\u064e\u0665\u066a\u0671"+ + "\u0678\u067f\u0686\u0690\u0692\u069a\u069d\u06a4\u06a8\u06b6\u06b9\u06c1"+ + "\u06c5\u06cc"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java b/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java new file mode 100644 index 000000000..c6744c1b8 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java @@ -0,0 +1,31 @@ +package org.rumbledb.runtime.xml; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.runtime.LocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.List; + +public class PathExprIterator extends LocalRuntimeIterator { + + protected PathExprIterator(List children, RuntimeStaticContext staticContext) { + super(children, staticContext); + } + + @Override + public void open(DynamicContext context) { + super.open(context); + } + + @Override + public Item next() { + return null; + } + + @Override + public boolean hasNext() { + return super.hasNext(); + } +} From 351ebbd3fed7ed8e4bede2de68de7a2561f0b0d1 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Tue, 23 Jul 2024 15:26:18 +0200 Subject: [PATCH 39/56] Refactored step expr compulation logic --- .../rumbledb/compiler/TranslationVisitor.java | 63 ++++++++++++++----- .../org/rumbledb/expressions/xml/Dash.java | 34 ++++++++++ .../expressions/xml/IntermediaryPath.java | 20 ++++++ .../rumbledb/expressions/xml/PathExpr.java | 28 ++++++--- .../expressions/xml/axis/AxisStep.java | 7 ++- .../expressions/xml/axis/ForwardStep.java | 5 ++ 6 files changed, 132 insertions(+), 25 deletions(-) create mode 100644 src/main/java/org/rumbledb/expressions/xml/Dash.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/IntermediaryPath.java diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java index 5b128c1f4..2a5d0c974 100644 --- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java @@ -138,6 +138,8 @@ import org.rumbledb.expressions.update.RenameExpression; import org.rumbledb.expressions.update.ReplaceExpression; import org.rumbledb.expressions.update.TransformExpression; +import org.rumbledb.expressions.xml.Dash; +import org.rumbledb.expressions.xml.IntermediaryPath; import org.rumbledb.expressions.xml.PathExpr; import org.rumbledb.expressions.xml.StepExpr; import org.rumbledb.expressions.xml.axis.AxisStep; @@ -2294,15 +2296,54 @@ public Node visitVarDeclStatement(JsoniqParser.VarDeclStatementContext ctx) { @Override public Node visitPathExpr(JsoniqParser.PathExprContext ctx) { if (!ctx.singleslash.isEmpty()) { - List stepExprs = getStepExpr(ctx.singleslash, ctx.Kslash()); - return new PathExpr(true, stepExprs, createMetadataFromContext(ctx)); + Dash startDash = new Dash(true); + StepExpr stepExpr = (StepExpr) this.visitStepExpr(ctx.singleslash.stepExpr(0)); + List intermediaryPaths = getIntermediaryPaths(startDash, stepExpr, ctx.singleslash); + return new PathExpr(intermediaryPaths, createMetadataFromContext(ctx)); } else if (!ctx.doubleslash.isEmpty()) { - List stepExprs = getStepExpr(ctx.doubleslash, ctx.Kdslash()); - return new PathExpr(true, stepExprs, createMetadataFromContext(ctx)); + Dash startDash = new Dash( + true, + new AxisStep(new ForwardStep(ForwardAxis.DESCENDANT_OR_SELF, new AnyKindTest())) + ); + StepExpr stepExpr = (StepExpr) this.visitStepExpr(ctx.doubleslash.stepExpr(0)); + List intermediaryPaths = getIntermediaryPaths(startDash, stepExpr, ctx.doubleslash); + return new PathExpr(intermediaryPaths, createMetadataFromContext(ctx)); + } else if (!ctx.relative.isEmpty()) { + StepExpr stepExpr = (StepExpr) this.visitStepExpr(ctx.relative.stepExpr(0)); + List intermediaryPaths = getIntermediaryPaths(null, stepExpr, ctx.relative); + return new PathExpr(intermediaryPaths, createMetadataFromContext(ctx)); + } + // Case: No StepExpr, only dash + Dash startDash = new Dash(true); + List intermediaryPaths = getIntermediaryPaths(startDash, null, ctx.singleslash); + return new PathExpr(intermediaryPaths, createMetadataFromContext(ctx)); + } + + private List getIntermediaryPaths( + Dash startDash, + StepExpr stepExpr, + JsoniqParser.RelativePathExprContext relativePathExprContext + ) { + List intermediaryPaths = new ArrayList<>(); + Dash currentDash = startDash; + StepExpr currentStepExpr = stepExpr; + for (int i = 1; i < relativePathExprContext.stepExpr().size(); ++i) { + IntermediaryPath intermediaryPath = new IntermediaryPath(currentDash, currentStepExpr); + intermediaryPaths.add(intermediaryPath); + + if (relativePathExprContext.sep.get(i).getText().equals("/")) { + currentDash = new Dash(false, null); + } else { + currentDash = new Dash( + false, + new AxisStep(new ForwardStep(ForwardAxis.DESCENDANT_OR_SELF, new AnyKindTest())) + ); + } + currentStepExpr = (StepExpr) this.visitStepExpr(relativePathExprContext.stepExpr(i)); } - List stepExprs = getStepExpr(ctx.relative, null); - return new PathExpr(false, stepExprs, createMetadataFromContext(ctx)); - + IntermediaryPath intermediaryPath = new IntermediaryPath(currentDash, currentStepExpr); + intermediaryPaths.add(intermediaryPath); + return intermediaryPaths; } @Override @@ -2424,14 +2465,6 @@ private NodeTest getKindTest(ParseTree kindTestContext) { } } - private List getStepExpr(JsoniqParser.RelativePathExprContext relativePathExprContext, TerminalNode startDash) { - List stepExprs = new ArrayList<>(); - for (JsoniqParser.StepExprContext stepExprContext : relativePathExprContext.stepExpr()) { - stepExprs.add((StepExpr) this.visitStepExpr(stepExprContext)); - } - return stepExprs; - } - // end region diff --git a/src/main/java/org/rumbledb/expressions/xml/Dash.java b/src/main/java/org/rumbledb/expressions/xml/Dash.java new file mode 100644 index 000000000..a81a005a3 --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/Dash.java @@ -0,0 +1,34 @@ +package org.rumbledb.expressions.xml; + +import org.rumbledb.expressions.xml.axis.AxisStep; + +public class Dash { + private boolean getRoot; + private AxisStep axisStep; + + public Dash(boolean getRoot, AxisStep axisStep) { + this.getRoot = getRoot; + this.axisStep = axisStep; + } + + public Dash(boolean getRoot) { + this.getRoot = getRoot; + this.axisStep = null; + } + + public AxisStep getAxisStep() { + return axisStep; + } + + public boolean requiresRoot() { + return getRoot; + } + + @Override + public String toString() { + // TODO: add root function call + StringBuffer sb = new StringBuffer(); + this.axisStep.serializeToJSONiq(sb, 0); + return sb.toString(); + } +} diff --git a/src/main/java/org/rumbledb/expressions/xml/IntermediaryPath.java b/src/main/java/org/rumbledb/expressions/xml/IntermediaryPath.java new file mode 100644 index 000000000..e0bcac756 --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/IntermediaryPath.java @@ -0,0 +1,20 @@ +package org.rumbledb.expressions.xml; + +public class IntermediaryPath { + private Dash preStepExprDash; + private StepExpr stepExpr; + + public IntermediaryPath(Dash preStepExprDash, StepExpr stepExpr) { + this.preStepExprDash = preStepExprDash; + this.stepExpr = stepExpr; + } + + + public StepExpr getStepExpr() { + return stepExpr; + } + + public Dash getPreStepExprDash() { + return preStepExprDash; + } +} diff --git a/src/main/java/org/rumbledb/expressions/xml/PathExpr.java b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java index b65180723..0c2818717 100644 --- a/src/main/java/org/rumbledb/expressions/xml/PathExpr.java +++ b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java @@ -9,16 +9,13 @@ import java.util.List; public class PathExpr extends Expression { - private boolean startsWithDash; - private List relativePathExpr; + private final List relativePathExpr; public PathExpr( - boolean startsWithDash, - List relativePathExpr, + List relativePathExpr, ExceptionMetadata metadata ) { super(metadata); - this.startsWithDash = startsWithDash; this.relativePathExpr = relativePathExpr; } @@ -29,15 +26,28 @@ public T accept(AbstractNodeVisitor visitor, T argument) { @Override public List getChildren() { - return new ArrayList<>(this.relativePathExpr); + List result = new ArrayList<>(); + for (IntermediaryPath path : this.relativePathExpr) { + result.add(path.getPreStepExprDash().getAxisStep()); + result.add(path.getStepExpr()); + } + return result; } @Override public void serializeToJSONiq(StringBuffer sb, int indent) { - int dashPathCounter = 0; indentIt(sb, indent); - for (StepExpr relativePathExp : this.relativePathExpr) { - relativePathExp.serializeToJSONiq(sb, indent); + for (IntermediaryPath path : this.relativePathExpr) { + if (path.getPreStepExprDash().requiresRoot()) { + sb.append("/"); + } + if (path.getPreStepExprDash() == null) { + path.getStepExpr().serializeToJSONiq(sb, indent); + } else { + sb.append(path.getPreStepExprDash().toString()); + path.getStepExpr().serializeToJSONiq(sb, indent); + } + sb.append("/"); } sb.append("\n"); } diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java index 7d08b9090..c8641673d 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java @@ -11,6 +11,11 @@ public class AxisStep extends Node { private Step step; private List predicates; + public AxisStep(Step step) { + this.step = step; + this.predicates = null; + } + public AxisStep(Step step, List predicates) { this.step = step; this.predicates = predicates; @@ -28,8 +33,8 @@ public List getChildren() { @Override public void serializeToJSONiq(StringBuffer sb, int indent) { - // TODO: serialize step indentIt(sb, indent); + sb.append(step.toString()); for (Expression predicate : predicates) { sb.append("[ "); predicate.serializeToJSONiq(sb, indent); diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java index 3d590e0d2..9e9236ed9 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java @@ -10,4 +10,9 @@ public ForwardStep(ForwardAxis forwardAxis, NodeTest nodeTest) { this.forwardAxis = forwardAxis; this.nodeTest = nodeTest; } + + @Override + public String toString() { + return forwardAxis.getAxisValue() + nodeTest.toString(); + } } From b778ab4352bdaab057a858a5d4d04c1dada08477 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 25 Jul 2024 10:06:59 +0200 Subject: [PATCH 40/56] Added more tests and fixed bugs --- .../org/rumbledb/compiler/CloneVisitor.java | 56 + .../rumbledb/compiler/InferTypeVisitor.java | 14 + .../rumbledb/compiler/TranslationVisitor.java | 105 +- .../org/rumbledb/expressions/xml/Dash.java | 10 +- .../rumbledb/expressions/xml/PathExpr.java | 12 +- .../rumbledb/expressions/xml/StepExpr.java | 9 +- .../expressions/xml/axis/AxisStep.java | 11 +- .../expressions/xml/axis/ForwardAxis.java | 9 + .../expressions/xml/axis/ReverseAxis.java | 9 + .../expressions/xml/axis/ReverseStep.java | 5 + .../xml/node_test/AnyKindTest.java | 5 + .../xml/node_test/AttributeTest.java | 28 + .../xml/node_test/DocumentTest.java | 10 + .../xml/node_test/ElementTest.java | 27 + .../expressions/xml/node_test/NameTest.java | 8 + .../expressions/xml/node_test/TextTest.java | 5 + src/main/java/org/rumbledb/parser/Jsoniq.g4 | 4 +- .../java/org/rumbledb/parser/Jsoniq.interp | 2 +- .../org/rumbledb/parser/JsoniqParser.java | 1400 +++++++++-------- src/test/java/iq/ReadXMLTests.java | 202 +++ .../test_files/xml/FunctionXmlDoc1.jq | 2 - .../xml/compile-xpath/XPathExample1.jq | 1 + .../xml/compile-xpath/XPathExample10.jq | 1 + .../xml/compile-xpath/XPathExample11.jq | 1 + .../xml/compile-xpath/XPathExample12.jq | 1 + .../xml/compile-xpath/XPathExample13.jq | 1 + .../xml/compile-xpath/XPathExample2.jq | 1 + .../xml/compile-xpath/XPathExample3.jq | 1 + .../xml/compile-xpath/XPathExample4.jq | 1 + .../xml/compile-xpath/XPathExample5.jq | 1 + .../xml/compile-xpath/XPathExample6.jq | 1 + .../xml/compile-xpath/XPathExample7.jq | 1 + .../xml/compile-xpath/XPathExample8.jq | 1 + .../xml/compile-xpath/XPathExample9.jq | 1 + 34 files changed, 1215 insertions(+), 731 deletions(-) delete mode 100644 src/test/resources/test_files/xml/FunctionXmlDoc1.jq create mode 100644 src/test/resources/test_files/xml/compile-xpath/XPathExample1.jq create mode 100644 src/test/resources/test_files/xml/compile-xpath/XPathExample10.jq create mode 100644 src/test/resources/test_files/xml/compile-xpath/XPathExample11.jq create mode 100644 src/test/resources/test_files/xml/compile-xpath/XPathExample12.jq create mode 100644 src/test/resources/test_files/xml/compile-xpath/XPathExample13.jq create mode 100644 src/test/resources/test_files/xml/compile-xpath/XPathExample2.jq create mode 100644 src/test/resources/test_files/xml/compile-xpath/XPathExample3.jq create mode 100644 src/test/resources/test_files/xml/compile-xpath/XPathExample4.jq create mode 100644 src/test/resources/test_files/xml/compile-xpath/XPathExample5.jq create mode 100644 src/test/resources/test_files/xml/compile-xpath/XPathExample6.jq create mode 100644 src/test/resources/test_files/xml/compile-xpath/XPathExample7.jq create mode 100644 src/test/resources/test_files/xml/compile-xpath/XPathExample8.jq create mode 100644 src/test/resources/test_files/xml/compile-xpath/XPathExample9.jq diff --git a/src/main/java/org/rumbledb/compiler/CloneVisitor.java b/src/main/java/org/rumbledb/compiler/CloneVisitor.java index 546af9628..12d951b05 100644 --- a/src/main/java/org/rumbledb/compiler/CloneVisitor.java +++ b/src/main/java/org/rumbledb/compiler/CloneVisitor.java @@ -79,6 +79,11 @@ import org.rumbledb.expressions.typing.IsStaticallyExpression; import org.rumbledb.expressions.typing.TreatExpression; import org.rumbledb.expressions.typing.ValidateTypeExpression; +import org.rumbledb.expressions.xml.Dash; +import org.rumbledb.expressions.xml.IntermediaryPath; +import org.rumbledb.expressions.xml.PathExpr; +import org.rumbledb.expressions.xml.StepExpr; +import org.rumbledb.expressions.xml.axis.AxisStep; import java.util.ArrayList; import java.util.HashMap; @@ -1045,4 +1050,55 @@ public Node visitVariableDeclStatement(VariableDeclStatement statement, Node arg return result; } // end region scripting + + // begin region xml + + @Override + public Node visitPathExpr(PathExpr expression, Node argument) { + List intermediaryPaths = new ArrayList<>(); + for (IntermediaryPath path : expression.getIntermediaryPaths()) { + Dash dash = null; + if (path.getPreStepExprDash() != null) { + dash = new Dash( + path.getPreStepExprDash().requiresRoot(), + (AxisStep) this.visitAxisStep(path.getPreStepExprDash().getAxisStep(), argument) + ); + } + StepExpr stepExpr = (StepExpr) this.visitStepExpr(path.getStepExpr(), argument); + intermediaryPaths.add(new IntermediaryPath(dash, stepExpr)); + } + PathExpr result = new PathExpr(intermediaryPaths, expression.getMetadata()); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitStepExpr(StepExpr expression, Node argument) { + StepExpr result; + if (expression.getPostFixExpr() != null) { + Expression postFixExpr = (Expression) this.visit(expression.getPostFixExpr(), argument); + result = new StepExpr(postFixExpr, expression.getMetadata()); + } else { + AxisStep axisStep = (AxisStep) this.visitAxisStep(expression.getAxisStep(), argument); + result = new StepExpr(axisStep, expression.getMetadata()); + } + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitAxisStep(AxisStep axisStep, Node argument) { + if (axisStep == null) { + return null; + } + List predicates = new ArrayList<>(); + for (Expression predicate : axisStep.getPredicates()) { + predicates.add((Expression) this.visit(predicate, argument)); + } + return new AxisStep(axisStep.getStep(), predicates); + } + + // end region xml } diff --git a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java index 9a8cb0d43..ac035122d 100644 --- a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java @@ -103,6 +103,7 @@ import org.rumbledb.expressions.update.RenameExpression; import org.rumbledb.expressions.update.ReplaceExpression; import org.rumbledb.expressions.update.TransformExpression; +import org.rumbledb.expressions.xml.PathExpr; import org.rumbledb.runtime.functions.input.FileSystemUtil; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.FieldDescriptor; @@ -2598,4 +2599,17 @@ public StaticContext visitBlockExpr(BlockExpression expression, StaticContext ar } // endregion + + // region xml + + // TODO: add the right typing data. + @Override + public StaticContext visitPathExpr(PathExpr pathExpr, StaticContext argument) { + visitDescendants(pathExpr, argument); + pathExpr.setStaticSequenceType(SequenceType.ITEM_STAR); + return argument; + } + + + // end xml } diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java index 2a5d0c974..beb0cd981 100644 --- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java @@ -1053,13 +1053,13 @@ public Node visitMultiplicativeExpr(JsoniqParser.MultiplicativeExprContext ctx) @Override public Node visitSimpleMapExpr(JsoniqParser.SimpleMapExprContext ctx) { - Expression result = (Expression) this.visitPostFixExpr(ctx.main_expr); + Expression result = (Expression) this.visitPathExpr(ctx.main_expr); if (ctx.map_expr == null || ctx.map_expr.isEmpty()) { return result; } for (int i = 0; i < ctx.map_expr.size(); ++i) { - JsoniqParser.PostFixExprContext child = ctx.map_expr.get(i); - Expression rightExpression = (Expression) this.visitPostFixExpr(child); + JsoniqParser.PathExprContext child = ctx.map_expr.get(i); + Expression rightExpression = (Expression) this.visitPathExpr(child); result = new SimpleMapExpression( result, rightExpression, @@ -2295,12 +2295,12 @@ public Node visitVarDeclStatement(JsoniqParser.VarDeclStatementContext ctx) { @Override public Node visitPathExpr(JsoniqParser.PathExprContext ctx) { - if (!ctx.singleslash.isEmpty()) { + if (ctx.singleslash != null) { Dash startDash = new Dash(true); StepExpr stepExpr = (StepExpr) this.visitStepExpr(ctx.singleslash.stepExpr(0)); List intermediaryPaths = getIntermediaryPaths(startDash, stepExpr, ctx.singleslash); return new PathExpr(intermediaryPaths, createMetadataFromContext(ctx)); - } else if (!ctx.doubleslash.isEmpty()) { + } else if (ctx.doubleslash != null) { Dash startDash = new Dash( true, new AxisStep(new ForwardStep(ForwardAxis.DESCENDANT_OR_SELF, new AnyKindTest())) @@ -2308,7 +2308,11 @@ public Node visitPathExpr(JsoniqParser.PathExprContext ctx) { StepExpr stepExpr = (StepExpr) this.visitStepExpr(ctx.doubleslash.stepExpr(0)); List intermediaryPaths = getIntermediaryPaths(startDash, stepExpr, ctx.doubleslash); return new PathExpr(intermediaryPaths, createMetadataFromContext(ctx)); - } else if (!ctx.relative.isEmpty()) { + } else if (ctx.relative != null) { + if (ctx.relative.stepExpr(0).postFixExpr() != null) { + // We only have a postfix expression, not a path expression + return this.visitPostFixExpr(ctx.relative.stepExpr(0).postFixExpr()); + } StepExpr stepExpr = (StepExpr) this.visitStepExpr(ctx.relative.stepExpr(0)); List intermediaryPaths = getIntermediaryPaths(null, stepExpr, ctx.relative); return new PathExpr(intermediaryPaths, createMetadataFromContext(ctx)); @@ -2331,7 +2335,7 @@ private List getIntermediaryPaths( IntermediaryPath intermediaryPath = new IntermediaryPath(currentDash, currentStepExpr); intermediaryPaths.add(intermediaryPath); - if (relativePathExprContext.sep.get(i).getText().equals("/")) { + if (relativePathExprContext.sep.get(i - 1).getText().equals("/")) { currentDash = new Dash(false, null); } else { currentDash = new Dash( @@ -2348,7 +2352,7 @@ private List getIntermediaryPaths( @Override public Node visitStepExpr(JsoniqParser.StepExprContext ctx) { - if (ctx.postFixExpr().isEmpty()) { + if (ctx.postFixExpr() == null) { return new StepExpr((AxisStep) this.visitAxisStep(ctx.axisStep()), createMetadataFromContext(ctx)); } return new StepExpr((Expression) this.visitPostFixExpr(ctx.postFixExpr()), createMetadataFromContext(ctx)); @@ -2365,7 +2369,7 @@ public Node visitAxisStep(JsoniqParser.AxisStepContext ctx) { } private Step getStep(JsoniqParser.AxisStepContext ctx) { - if (ctx.forwardStep().isEmpty()) { + if (ctx.forwardStep() == null) { return getReverseStep(ctx.reverseStep()); } return getForwardStep(ctx.forwardStep()); @@ -2374,42 +2378,41 @@ private Step getStep(JsoniqParser.AxisStepContext ctx) { private Step getForwardStep(JsoniqParser.ForwardStepContext ctx) { ForwardAxis forwardAxis; NodeTest nodeTest; - if (ctx.nodeTest().isEmpty()) { + if (ctx.nodeTest() == null) { nodeTest = getNodeTest(ctx.abbrevForwardStep().nodeTest()); if (ctx.abbrevForwardStep().Kat_symbol() != null) { // @ equivalent with 'attribute::' forwardAxis = ForwardAxis.ATTRIBUTE; } else if (nodeTest instanceof AttributeTest) { - // @ equivalent with 'attribute::' forwardAxis = ForwardAxis.ATTRIBUTE; } else { forwardAxis = ForwardAxis.CHILD; } return new ForwardStep(forwardAxis, nodeTest); } - forwardAxis = ForwardAxis.valueOf(ctx.forwardAxis().getText()); + forwardAxis = ForwardAxis.fromString(ctx.forwardAxis().getText()); nodeTest = getNodeTest(ctx.nodeTest()); return new ForwardStep(forwardAxis, nodeTest); } private Step getReverseStep(JsoniqParser.ReverseStepContext ctx) { - if (ctx.nodeTest().isEmpty()) { + if (ctx.nodeTest() == null) { // .. equivalent with 'parent::node()' ReverseAxis reverseAxis = ReverseAxis.PARENT; NodeTest nodeTest = new AnyKindTest(); return new ReverseStep(reverseAxis, nodeTest); } - ReverseAxis reverseAxis = ReverseAxis.valueOf(ctx.reverseAxis().getText()); + ReverseAxis reverseAxis = ReverseAxis.fromString(ctx.reverseAxis().getText()); NodeTest nodeTest = getNodeTest(ctx.nodeTest()); return new ReverseStep(reverseAxis, nodeTest); } private NodeTest getNodeTest(JsoniqParser.NodeTestContext nodeTestContext) { - if (nodeTestContext.nameTest().isEmpty()) { + if (nodeTestContext.nameTest() == null) { // kind test - return getKindTest(nodeTestContext.kindTest()); + return getKindTest(nodeTestContext.kindTest().children.get(0)); } - if (nodeTestContext.nameTest().wildcard().isEmpty()) { + if (nodeTestContext.nameTest().wildcard() == null) { Name name = parseName(nodeTestContext.nameTest().qname(), false, false); return new NameTest(name); } else { @@ -2418,49 +2421,63 @@ private NodeTest getNodeTest(JsoniqParser.NodeTestContext nodeTestContext) { } } - private NodeTest getKindTest(ParseTree kindTestContext) { - if (kindTestContext instanceof JsoniqParser.DocumentTestContext) { - JsoniqParser.DocumentTestContext docContext = (JsoniqParser.DocumentTestContext) kindTestContext; + private NodeTest getKindTest(ParseTree kindTest) { + if (kindTest instanceof JsoniqParser.DocumentTestContext) { + JsoniqParser.DocumentTestContext docContext = (JsoniqParser.DocumentTestContext) kindTest; if (docContext.elementTest().isEmpty()) { throw new UnsupportedFeatureException( "Kind tests of type document, element, attribute, text and any are supported at the moment", - createMetadataFromContext((ParserRuleContext) kindTestContext) + createMetadataFromContext((ParserRuleContext) kindTest) ); } return new DocumentTest(getKindTest(docContext.elementTest())); - } else if (kindTestContext instanceof JsoniqParser.ElementTestContext) { - JsoniqParser.ElementTestContext elementContext = (JsoniqParser.ElementTestContext) kindTestContext; - boolean hasWildcard = elementContext.elementNameOrWildcard().elementName().isEmpty(); - Name typeName = parseName(elementContext.typeName().qname(), false, false); + } else if (kindTest instanceof JsoniqParser.ElementTestContext) { + JsoniqParser.ElementTestContext elementContext = (JsoniqParser.ElementTestContext) kindTest; Name elementName; - if (!hasWildcard) { - elementName = parseName(elementContext.elementNameOrWildcard().elementName().qname(), false, false); - return new ElementTest(elementName, typeName); + if (elementContext.elementNameOrWildcard() != null) { + boolean hasWildcard = elementContext.elementNameOrWildcard().elementName() == null; + if (!hasWildcard) { + elementName = parseName(elementContext.elementNameOrWildcard().elementName().qname(), false, false); + if (elementContext.typeName() == null) { + return new ElementTest(elementName, null); + } + Name typeName = parseName(elementContext.typeName().qname(), false, false); + return new ElementTest(elementName, typeName); + } + return new ElementTest(true); } - return new ElementTest(typeName); - } else if (kindTestContext instanceof JsoniqParser.AttributeTestContext) { + return new ElementTest(); + } else if (kindTest instanceof JsoniqParser.AttributeTestContext) { JsoniqParser.AttributeTestContext attributeTestContext = - (JsoniqParser.AttributeTestContext) kindTestContext; - boolean hasWildcard = attributeTestContext.attributeNameOrWildcard().attributeName().isEmpty(); - Name typeName = parseName(attributeTestContext.typeName().qname(), false, false); + (JsoniqParser.AttributeTestContext) kindTest; Name elementName; - if (!hasWildcard) { - elementName = parseName( - attributeTestContext.attributeNameOrWildcard().attributeName().qname(), - false, - false - ); - return new AttributeTest(elementName, typeName); + if (attributeTestContext.attributeNameOrWildcard() != null) { + boolean hasWildcard = attributeTestContext.attributeNameOrWildcard().attributeName() == null; + if (!hasWildcard) { + elementName = parseName( + attributeTestContext.attributeNameOrWildcard().attributeName().qname(), + false, + false + ); + if (attributeTestContext.typeName() != null) { + Name typeName = parseName(attributeTestContext.typeName().qname(), false, false); + return new AttributeTest(elementName, typeName); + } else { + return new AttributeTest(elementName, null); + } + } else { + return new AttributeTest(true); + } } - return new AttributeTest(typeName); - } else if (kindTestContext instanceof JsoniqParser.TextTestContext) { + return new AttributeTest(); + } else if (kindTest instanceof JsoniqParser.TextTestContext) { return new TextTest(); - } else if (kindTestContext instanceof JsoniqParser.AnyKindTestContext) { + } else if (kindTest instanceof JsoniqParser.AnyKindTestContext) { return new AnyKindTest(); } else { throw new UnsupportedFeatureException( "Kind tests of type document, element, attribute, text and any are supported at the moment", - createMetadataFromContext((ParserRuleContext) kindTestContext) + createMetadataFromContext((ParserRuleContext) kindTest) ); } } diff --git a/src/main/java/org/rumbledb/expressions/xml/Dash.java b/src/main/java/org/rumbledb/expressions/xml/Dash.java index a81a005a3..658689433 100644 --- a/src/main/java/org/rumbledb/expressions/xml/Dash.java +++ b/src/main/java/org/rumbledb/expressions/xml/Dash.java @@ -27,8 +27,12 @@ public boolean requiresRoot() { @Override public String toString() { // TODO: add root function call - StringBuffer sb = new StringBuffer(); - this.axisStep.serializeToJSONiq(sb, 0); - return sb.toString(); + if (this.axisStep != null) { + StringBuffer sb = new StringBuffer("/"); + this.axisStep.serializeToJSONiq(sb, 0); + sb.append("/"); + return sb.toString(); + } + return "/"; } } diff --git a/src/main/java/org/rumbledb/expressions/xml/PathExpr.java b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java index 0c2818717..cad369165 100644 --- a/src/main/java/org/rumbledb/expressions/xml/PathExpr.java +++ b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java @@ -28,7 +28,9 @@ public T accept(AbstractNodeVisitor visitor, T argument) { public List getChildren() { List result = new ArrayList<>(); for (IntermediaryPath path : this.relativePathExpr) { - result.add(path.getPreStepExprDash().getAxisStep()); + if (path.getPreStepExprDash() != null && path.getPreStepExprDash().getAxisStep() != null) { + result.add(path.getPreStepExprDash().getAxisStep()); + } result.add(path.getStepExpr()); } return result; @@ -38,17 +40,17 @@ public List getChildren() { public void serializeToJSONiq(StringBuffer sb, int indent) { indentIt(sb, indent); for (IntermediaryPath path : this.relativePathExpr) { - if (path.getPreStepExprDash().requiresRoot()) { - sb.append("/"); - } if (path.getPreStepExprDash() == null) { path.getStepExpr().serializeToJSONiq(sb, indent); } else { sb.append(path.getPreStepExprDash().toString()); path.getStepExpr().serializeToJSONiq(sb, indent); } - sb.append("/"); } sb.append("\n"); } + + public List getIntermediaryPaths() { + return this.relativePathExpr; + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/StepExpr.java b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java index 59567434e..331ed146e 100644 --- a/src/main/java/org/rumbledb/expressions/xml/StepExpr.java +++ b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java @@ -46,6 +46,13 @@ public void serializeToJSONiq(StringBuffer sb, int indent) { } else { this.axisStep.serializeToJSONiq(sb, indent); } - sb.append("\n"); + } + + public Node getPostFixExpr() { + return this.postFixExpr; + } + + public AxisStep getAxisStep() { + return this.axisStep; } } diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java index c8641673d..4a0cbf538 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java @@ -13,7 +13,7 @@ public class AxisStep extends Node { public AxisStep(Step step) { this.step = step; - this.predicates = null; + this.predicates = new ArrayList<>(); } public AxisStep(Step step, List predicates) { @@ -40,6 +40,13 @@ public void serializeToJSONiq(StringBuffer sb, int indent) { predicate.serializeToJSONiq(sb, indent); sb.append(" ], "); } - sb.append("\n"); + } + + public List getPredicates() { + return this.predicates; + } + + public Step getStep() { + return this.step; } } diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java index b065a9857..764dc223a 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java @@ -18,4 +18,13 @@ public enum ForwardAxis { public String getAxisValue() { return axisValue; } + + public static ForwardAxis fromString(String text) { + for (ForwardAxis forwardAxis : ForwardAxis.values()) { + if (forwardAxis.axisValue.equalsIgnoreCase(text)) { + return forwardAxis; + } + } + throw new IllegalArgumentException("No constant with text: " + text + " found!"); + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java index 3c5cdf3a6..65858583d 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java @@ -16,4 +16,13 @@ public enum ReverseAxis { public String getAxisValue() { return axisValue; } + + public static ReverseAxis fromString(String text) { + for (ReverseAxis forwardAxis : ReverseAxis.values()) { + if (forwardAxis.axisValue.equalsIgnoreCase(text)) { + return forwardAxis; + } + } + throw new IllegalArgumentException("No constant with text: " + text + " found!"); + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java index d694995d6..e069f3a8a 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java @@ -10,4 +10,9 @@ public ReverseStep(ReverseAxis reverseAxis, NodeTest nodeTest) { this.reverseAxis = reverseAxis; this.nodeTest = nodeTest; } + + @Override + public String toString() { + return reverseAxis.getAxisValue() + nodeTest.toString(); + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/AnyKindTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/AnyKindTest.java index 8fc8b150b..6041e4cdb 100644 --- a/src/main/java/org/rumbledb/expressions/xml/node_test/AnyKindTest.java +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/AnyKindTest.java @@ -1,4 +1,9 @@ package org.rumbledb.expressions.xml.node_test; public class AnyKindTest implements NodeTest { + + @Override + public String toString() { + return "node()"; + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java index 7a25e3e57..1454ea8c2 100644 --- a/src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java @@ -18,4 +18,32 @@ public AttributeTest(Name typeName) { this.typeName = typeName; this.hasWildcard = true; } + + public AttributeTest(boolean hasWildcard) { + this.attributeName = null; + this.typeName = null; + this.hasWildcard = hasWildcard; + } + + public AttributeTest() { + this.attributeName = null; + this.typeName = null; + this.hasWildcard = false; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("attribute("); + if (this.hasWildcard) { + sb.append("*"); + } else if (this.attributeName != null) { + sb.append(this.attributeName); + } + if (typeName != null) { + sb.append(","); + sb.append(this.typeName); + } + sb.append(")"); + return sb.toString(); + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java index 6ef9592ea..b0a6202a1 100644 --- a/src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java @@ -7,4 +7,14 @@ public class DocumentTest implements NodeTest { public DocumentTest(NodeTest nodeTest) { this.nodeTest = nodeTest; } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("document-node("); + if (this.nodeTest != null) { + sb.append(this.nodeTest); + } + sb.append(")"); + return sb.toString(); + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java index 75766696b..c1b38914f 100644 --- a/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java @@ -20,4 +20,31 @@ public ElementTest(Name typeName) { this.typeName = typeName; this.hasWildcard = true; } + + public ElementTest(boolean hasWildcard) { + this.elementName = null; + this.typeName = null; + this.hasWildcard = true; + } + + public ElementTest() { + this.elementName = null; + this.typeName = null; + this.hasWildcard = false; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("element("); + if (this.hasWildcard) { + sb.append("*"); + } else if (this.elementName != null) { + sb.append(this.elementName); + } + if (this.typeName != null) { + sb.append(this.typeName); + } + sb.append(")"); + return sb.toString(); + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java index 3c50d6b89..602c030b0 100644 --- a/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java @@ -16,4 +16,12 @@ public NameTest(String wildcardWithNCName) { this.qname = null; this.wildcardWithNCName = wildcardWithNCName; } + + @Override + public String toString() { + if (this.qname != null) { + return this.qname.toString(); + } + return this.wildcardWithNCName; + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/TextTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/TextTest.java index fefea51d9..6d3fd41e9 100644 --- a/src/main/java/org/rumbledb/expressions/xml/node_test/TextTest.java +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/TextTest.java @@ -1,4 +1,9 @@ package org.rumbledb.expressions.xml.node_test; public class TextTest implements NodeTest { + + @Override + public String toString() { + return "text()"; + } } diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.g4 b/src/main/java/org/rumbledb/parser/Jsoniq.g4 index 396db7a68..30cae2882 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.g4 +++ b/src/main/java/org/rumbledb/parser/Jsoniq.g4 @@ -265,7 +265,7 @@ validateExpr : Kvalidate Ktype sequenceType '{' expr '}'; annotateExpr : Kannotate Ktype sequenceType '{' expr '}'; -simpleMapExpr : main_expr=postFixExpr ('!' map_expr+=postFixExpr)*; +simpleMapExpr : main_expr=pathExpr ('!' map_expr+=pathExpr)*; postFixExpr : main_expr=primaryExpr (arrayLookup | predicate | objectLookup | arrayUnboxing | argumentList)*; @@ -439,7 +439,7 @@ kindTest: documentTest | anyKindTest ; -anyKindTest: Knode '(' '*'? ')' ; +anyKindTest: Knode '(' ')' ; binaryNodeTest: Kbinary '(' ')' ; diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.interp b/src/main/java/org/rumbledb/parser/Jsoniq.interp index ca28d7970..af0d231f1 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.interp +++ b/src/main/java/org/rumbledb/parser/Jsoniq.interp @@ -543,4 +543,4 @@ keyWords atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 180, 1751, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 369, 10, 3, 3, 3, 3, 3, 5, 3, 373, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 389, 10, 6, 3, 6, 3, 6, 7, 6, 393, 10, 6, 12, 6, 14, 6, 396, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 401, 10, 6, 12, 6, 14, 6, 404, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 409, 10, 8, 12, 8, 14, 8, 412, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 419, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 434, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 464, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 472, 10, 18, 12, 18, 14, 18, 475, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 494, 10, 20, 13, 20, 14, 20, 495, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 504, 10, 21, 13, 21, 14, 21, 505, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 514, 10, 22, 13, 22, 14, 22, 515, 3, 23, 3, 23, 3, 23, 5, 23, 521, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 526, 10, 23, 7, 23, 528, 10, 23, 12, 23, 14, 23, 531, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 540, 10, 24, 13, 24, 14, 24, 541, 3, 24, 3, 24, 5, 24, 546, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 555, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 560, 10, 25, 12, 25, 14, 25, 563, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 574, 10, 26, 12, 26, 14, 26, 577, 11, 26, 3, 26, 5, 26, 580, 10, 26, 3, 27, 7, 27, 583, 10, 27, 12, 27, 14, 27, 586, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 593, 10, 28, 12, 28, 14, 28, 596, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 603, 10, 29, 3, 29, 3, 29, 5, 29, 607, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 619, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 631, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 653, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 659, 10, 37, 12, 37, 14, 37, 662, 11, 37, 3, 38, 3, 38, 5, 38, 666, 10, 38, 3, 38, 5, 38, 669, 10, 38, 3, 38, 3, 38, 5, 38, 673, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 682, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 689, 10, 40, 12, 40, 14, 40, 692, 11, 40, 5, 40, 694, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 702, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 709, 10, 41, 5, 41, 711, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 718, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 725, 10, 42, 5, 42, 727, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 735, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 740, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 747, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 754, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 764, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 769, 10, 46, 12, 46, 14, 46, 772, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 778, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 783, 10, 48, 12, 48, 14, 48, 786, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 794, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 804, 10, 50, 3, 51, 3, 51, 5, 51, 808, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 816, 10, 51, 12, 51, 14, 51, 819, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 828, 10, 52, 12, 52, 14, 52, 831, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 836, 10, 53, 3, 53, 3, 53, 5, 53, 840, 10, 53, 3, 53, 3, 53, 5, 53, 844, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 853, 10, 54, 12, 54, 14, 54, 856, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 861, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 874, 10, 57, 12, 57, 14, 57, 877, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 882, 10, 58, 3, 58, 3, 58, 5, 58, 886, 10, 58, 3, 58, 3, 58, 5, 58, 890, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 897, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 902, 10, 59, 12, 59, 14, 59, 905, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 910, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 915, 10, 60, 5, 60, 917, 10, 60, 3, 60, 3, 60, 5, 60, 921, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 928, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 933, 10, 62, 12, 62, 14, 62, 936, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 944, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 954, 10, 64, 13, 64, 14, 64, 955, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 964, 10, 65, 13, 65, 14, 65, 965, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 976, 10, 66, 13, 66, 14, 66, 977, 3, 66, 3, 66, 5, 66, 982, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 991, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 996, 10, 67, 12, 67, 14, 67, 999, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 1018, 10, 69, 13, 69, 14, 69, 1019, 3, 70, 3, 70, 3, 70, 5, 70, 1025, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 1030, 10, 70, 7, 70, 1032, 10, 70, 12, 70, 14, 70, 1035, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 1044, 10, 71, 12, 71, 14, 71, 1047, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 1052, 10, 72, 12, 72, 14, 72, 1055, 11, 72, 3, 73, 5, 73, 1058, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 1065, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 1070, 10, 75, 12, 75, 14, 75, 1073, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 1078, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 1083, 10, 77, 12, 77, 14, 77, 1086, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 1091, 10, 78, 12, 78, 14, 78, 1094, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 1100, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1106, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1112, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1118, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1124, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1133, 10, 84, 12, 84, 14, 84, 1136, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1141, 10, 85, 3, 86, 7, 86, 1144, 10, 86, 12, 86, 14, 86, 1147, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1154, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1173, 10, 90, 12, 90, 14, 90, 1176, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1184, 10, 91, 12, 91, 14, 91, 1187, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1209, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1226, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1237, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1259, 10, 104, 7, 104, 1261, 10, 104, 12, 104, 14, 104, 1264, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1270, 10, 105, 3, 106, 3, 106, 5, 106, 1274, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1284, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1289, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1303, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1310, 10, 109, 12, 109, 14, 109, 1313, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1318, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1343, 10, 113, 12, 113, 14, 113, 1346, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1362, 10, 115, 13, 115, 14, 115, 1363, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 5, 117, 1373, 10, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 7, 117, 1380, 10, 117, 12, 117, 14, 117, 1383, 11, 117, 5, 117, 1385, 10, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 5, 118, 1393, 10, 118, 3, 119, 3, 119, 5, 119, 1397, 10, 119, 3, 119, 3, 119, 3, 119, 5, 119, 1402, 10, 119, 3, 120, 3, 120, 3, 120, 7, 120, 1407, 10, 120, 12, 120, 14, 120, 1410, 11, 120, 3, 121, 3, 121, 5, 121, 1414, 10, 121, 3, 122, 3, 122, 5, 122, 1418, 10, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 5, 123, 1426, 10, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 5, 125, 1433, 10, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 5, 126, 1441, 10, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 129, 3, 129, 5, 129, 1451, 10, 129, 3, 130, 3, 130, 5, 130, 1455, 10, 130, 3, 131, 3, 131, 3, 131, 5, 131, 1460, 10, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 7, 134, 1471, 10, 134, 12, 134, 14, 134, 1474, 11, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 5, 135, 1487, 10, 135, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 5, 137, 1503, 10, 137, 3, 138, 3, 138, 3, 138, 5, 138, 1508, 10, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 5, 140, 1520, 10, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 5, 144, 1540, 10, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 5, 145, 1549, 10, 145, 5, 145, 1551, 10, 145, 3, 145, 3, 145, 3, 146, 3, 146, 5, 146, 1557, 10, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 5, 148, 1570, 10, 148, 5, 148, 1572, 10, 148, 5, 148, 1574, 10, 148, 3, 148, 3, 148, 3, 149, 3, 149, 5, 149, 1580, 10, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 153, 3, 153, 3, 154, 3, 154, 3, 155, 3, 155, 3, 156, 3, 156, 5, 156, 1599, 10, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 5, 159, 1615, 10, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 5, 164, 1638, 10, 164, 3, 165, 3, 165, 3, 165, 5, 165, 1643, 10, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 5, 166, 1650, 10, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 5, 167, 1657, 10, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 5, 168, 1664, 10, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 5, 169, 1671, 10, 169, 3, 169, 3, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 5, 170, 1681, 10, 170, 5, 170, 1683, 10, 170, 3, 171, 3, 171, 3, 171, 3, 171, 7, 171, 1689, 10, 171, 12, 171, 14, 171, 1692, 11, 171, 5, 171, 1694, 10, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 5, 171, 1701, 10, 171, 3, 172, 3, 172, 5, 172, 1705, 10, 172, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 7, 174, 1717, 10, 174, 12, 174, 14, 174, 1720, 11, 174, 5, 174, 1722, 10, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 175, 3, 175, 5, 175, 1730, 10, 175, 3, 176, 3, 176, 5, 176, 1734, 10, 176, 3, 176, 3, 176, 3, 176, 3, 177, 3, 177, 5, 177, 1741, 10, 177, 3, 177, 3, 177, 3, 178, 3, 178, 3, 179, 3, 179, 3, 180, 3, 180, 3, 180, 2, 2, 181, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 2, 13, 4, 2, 17, 17, 105, 105, 3, 2, 82, 83, 3, 2, 20, 29, 4, 2, 5, 5, 35, 45, 3, 2, 47, 48, 4, 2, 12, 12, 49, 51, 3, 2, 137, 138, 3, 2, 140, 146, 3, 2, 147, 151, 4, 2, 19, 19, 170, 170, 4, 2, 61, 132, 171, 171, 2, 1822, 2, 360, 3, 2, 2, 2, 4, 368, 3, 2, 2, 2, 6, 374, 3, 2, 2, 2, 8, 377, 3, 2, 2, 2, 10, 394, 3, 2, 2, 2, 12, 405, 3, 2, 2, 2, 14, 410, 3, 2, 2, 2, 16, 413, 3, 2, 2, 2, 18, 416, 3, 2, 2, 2, 20, 433, 3, 2, 2, 2, 22, 435, 3, 2, 2, 2, 24, 438, 3, 2, 2, 2, 26, 444, 3, 2, 2, 2, 28, 448, 3, 2, 2, 2, 30, 452, 3, 2, 2, 2, 32, 456, 3, 2, 2, 2, 34, 463, 3, 2, 2, 2, 36, 479, 3, 2, 2, 2, 38, 488, 3, 2, 2, 2, 40, 503, 3, 2, 2, 2, 42, 510, 3, 2, 2, 2, 44, 517, 3, 2, 2, 2, 46, 534, 3, 2, 2, 2, 48, 550, 3, 2, 2, 2, 50, 567, 3, 2, 2, 2, 52, 584, 3, 2, 2, 2, 54, 587, 3, 2, 2, 2, 56, 599, 3, 2, 2, 2, 58, 608, 3, 2, 2, 2, 60, 618, 3, 2, 2, 2, 62, 620, 3, 2, 2, 2, 64, 630, 3, 2, 2, 2, 66, 632, 3, 2, 2, 2, 68, 637, 3, 2, 2, 2, 70, 641, 3, 2, 2, 2, 72, 647, 3, 2, 2, 2, 74, 668, 3, 2, 2, 2, 76, 674, 3, 2, 2, 2, 78, 676, 3, 2, 2, 2, 80, 695, 3, 2, 2, 2, 82, 712, 3, 2, 2, 2, 84, 728, 3, 2, 2, 2, 86, 748, 3, 2, 2, 2, 88, 763, 3, 2, 2, 2, 90, 765, 3, 2, 2, 2, 92, 773, 3, 2, 2, 2, 94, 779, 3, 2, 2, 2, 96, 793, 3, 2, 2, 2, 98, 803, 3, 2, 2, 2, 100, 807, 3, 2, 2, 2, 102, 823, 3, 2, 2, 2, 104, 832, 3, 2, 2, 2, 106, 848, 3, 2, 2, 2, 108, 857, 3, 2, 2, 2, 110, 865, 3, 2, 2, 2, 112, 868, 3, 2, 2, 2, 114, 878, 3, 2, 2, 2, 116, 896, 3, 2, 2, 2, 118, 906, 3, 2, 2, 2, 120, 922, 3, 2, 2, 2, 122, 927, 3, 2, 2, 2, 124, 940, 3, 2, 2, 2, 126, 948, 3, 2, 2, 2, 128, 963, 3, 2, 2, 2, 130, 970, 3, 2, 2, 2, 132, 986, 3, 2, 2, 2, 134, 1003, 3, 2, 2, 2, 136, 1012, 3, 2, 2, 2, 138, 1021, 3, 2, 2, 2, 140, 1040, 3, 2, 2, 2, 142, 1048, 3, 2, 2, 2, 144, 1057, 3, 2, 2, 2, 146, 1061, 3, 2, 2, 2, 148, 1066, 3, 2, 2, 2, 150, 1074, 3, 2, 2, 2, 152, 1079, 3, 2, 2, 2, 154, 1087, 3, 2, 2, 2, 156, 1095, 3, 2, 2, 2, 158, 1101, 3, 2, 2, 2, 160, 1107, 3, 2, 2, 2, 162, 1113, 3, 2, 2, 2, 164, 1119, 3, 2, 2, 2, 166, 1125, 3, 2, 2, 2, 168, 1140, 3, 2, 2, 2, 170, 1145, 3, 2, 2, 2, 172, 1153, 3, 2, 2, 2, 174, 1155, 3, 2, 2, 2, 176, 1162, 3, 2, 2, 2, 178, 1169, 3, 2, 2, 2, 180, 1177, 3, 2, 2, 2, 182, 1188, 3, 2, 2, 2, 184, 1194, 3, 2, 2, 2, 186, 1197, 3, 2, 2, 2, 188, 1201, 3, 2, 2, 2, 190, 1225, 3, 2, 2, 2, 192, 1227, 3, 2, 2, 2, 194, 1231, 3, 2, 2, 2, 196, 1234, 3, 2, 2, 2, 198, 1240, 3, 2, 2, 2, 200, 1242, 3, 2, 2, 2, 202, 1247, 3, 2, 2, 2, 204, 1252, 3, 2, 2, 2, 206, 1255, 3, 2, 2, 2, 208, 1269, 3, 2, 2, 2, 210, 1273, 3, 2, 2, 2, 212, 1275, 3, 2, 2, 2, 214, 1279, 3, 2, 2, 2, 216, 1317, 3, 2, 2, 2, 218, 1319, 3, 2, 2, 2, 220, 1323, 3, 2, 2, 2, 222, 1329, 3, 2, 2, 2, 224, 1337, 3, 2, 2, 2, 226, 1352, 3, 2, 2, 2, 228, 1358, 3, 2, 2, 2, 230, 1365, 3, 2, 2, 2, 232, 1369, 3, 2, 2, 2, 234, 1392, 3, 2, 2, 2, 236, 1401, 3, 2, 2, 2, 238, 1403, 3, 2, 2, 2, 240, 1413, 3, 2, 2, 2, 242, 1417, 3, 2, 2, 2, 244, 1425, 3, 2, 2, 2, 246, 1427, 3, 2, 2, 2, 248, 1432, 3, 2, 2, 2, 250, 1440, 3, 2, 2, 2, 252, 1442, 3, 2, 2, 2, 254, 1446, 3, 2, 2, 2, 256, 1450, 3, 2, 2, 2, 258, 1454, 3, 2, 2, 2, 260, 1459, 3, 2, 2, 2, 262, 1461, 3, 2, 2, 2, 264, 1465, 3, 2, 2, 2, 266, 1472, 3, 2, 2, 2, 268, 1486, 3, 2, 2, 2, 270, 1488, 3, 2, 2, 2, 272, 1502, 3, 2, 2, 2, 274, 1504, 3, 2, 2, 2, 276, 1511, 3, 2, 2, 2, 278, 1515, 3, 2, 2, 2, 280, 1523, 3, 2, 2, 2, 282, 1527, 3, 2, 2, 2, 284, 1531, 3, 2, 2, 2, 286, 1535, 3, 2, 2, 2, 288, 1543, 3, 2, 2, 2, 290, 1556, 3, 2, 2, 2, 292, 1558, 3, 2, 2, 2, 294, 1563, 3, 2, 2, 2, 296, 1579, 3, 2, 2, 2, 298, 1581, 3, 2, 2, 2, 300, 1586, 3, 2, 2, 2, 302, 1588, 3, 2, 2, 2, 304, 1590, 3, 2, 2, 2, 306, 1592, 3, 2, 2, 2, 308, 1594, 3, 2, 2, 2, 310, 1598, 3, 2, 2, 2, 312, 1600, 3, 2, 2, 2, 314, 1605, 3, 2, 2, 2, 316, 1614, 3, 2, 2, 2, 318, 1616, 3, 2, 2, 2, 320, 1621, 3, 2, 2, 2, 322, 1626, 3, 2, 2, 2, 324, 1630, 3, 2, 2, 2, 326, 1637, 3, 2, 2, 2, 328, 1639, 3, 2, 2, 2, 330, 1646, 3, 2, 2, 2, 332, 1653, 3, 2, 2, 2, 334, 1660, 3, 2, 2, 2, 336, 1667, 3, 2, 2, 2, 338, 1682, 3, 2, 2, 2, 340, 1700, 3, 2, 2, 2, 342, 1704, 3, 2, 2, 2, 344, 1706, 3, 2, 2, 2, 346, 1711, 3, 2, 2, 2, 348, 1727, 3, 2, 2, 2, 350, 1733, 3, 2, 2, 2, 352, 1738, 3, 2, 2, 2, 354, 1744, 3, 2, 2, 2, 356, 1746, 3, 2, 2, 2, 358, 1748, 3, 2, 2, 2, 360, 361, 5, 4, 3, 2, 361, 362, 7, 2, 2, 3, 362, 3, 3, 2, 2, 2, 363, 364, 7, 104, 2, 2, 364, 365, 7, 103, 2, 2, 365, 366, 5, 356, 179, 2, 366, 367, 7, 3, 2, 2, 367, 369, 3, 2, 2, 2, 368, 363, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 373, 5, 8, 5, 2, 371, 373, 5, 6, 4, 2, 372, 370, 3, 2, 2, 2, 372, 371, 3, 2, 2, 2, 373, 5, 3, 2, 2, 2, 374, 375, 5, 10, 6, 2, 375, 376, 5, 12, 7, 2, 376, 7, 3, 2, 2, 2, 377, 378, 7, 4, 2, 2, 378, 379, 7, 135, 2, 2, 379, 380, 7, 178, 2, 2, 380, 381, 7, 5, 2, 2, 381, 382, 5, 354, 178, 2, 382, 383, 7, 3, 2, 2, 383, 384, 5, 10, 6, 2, 384, 9, 3, 2, 2, 2, 385, 389, 5, 60, 31, 2, 386, 389, 5, 62, 32, 2, 387, 389, 5, 78, 40, 2, 388, 385, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 388, 387, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 3, 2, 2, 391, 393, 3, 2, 2, 2, 392, 388, 3, 2, 2, 2, 393, 396, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 402, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 397, 398, 5, 64, 33, 2, 398, 399, 7, 3, 2, 2, 399, 401, 3, 2, 2, 2, 400, 397, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 11, 3, 2, 2, 2, 404, 402, 3, 2, 2, 2, 405, 406, 5, 18, 10, 2, 406, 13, 3, 2, 2, 2, 407, 409, 5, 20, 11, 2, 408, 407, 3, 2, 2, 2, 409, 412, 3, 2, 2, 2, 410, 408, 3, 2, 2, 2, 410, 411, 3, 2, 2, 2, 411, 15, 3, 2, 2, 2, 412, 410, 3, 2, 2, 2, 413, 414, 5, 14, 8, 2, 414, 415, 5, 94, 48, 2, 415, 17, 3, 2, 2, 2, 416, 418, 5, 14, 8, 2, 417, 419, 5, 94, 48, 2, 418, 417, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 19, 3, 2, 2, 2, 420, 434, 5, 22, 12, 2, 421, 434, 5, 24, 13, 2, 422, 434, 5, 26, 14, 2, 423, 434, 5, 28, 15, 2, 424, 434, 5, 30, 16, 2, 425, 434, 5, 32, 17, 2, 426, 434, 5, 34, 18, 2, 427, 434, 5, 36, 19, 2, 428, 434, 5, 38, 20, 2, 429, 434, 5, 42, 22, 2, 430, 434, 5, 46, 24, 2, 431, 434, 5, 54, 28, 2, 432, 434, 5, 58, 30, 2, 433, 420, 3, 2, 2, 2, 433, 421, 3, 2, 2, 2, 433, 422, 3, 2, 2, 2, 433, 423, 3, 2, 2, 2, 433, 424, 3, 2, 2, 2, 433, 425, 3, 2, 2, 2, 433, 426, 3, 2, 2, 2, 433, 427, 3, 2, 2, 2, 433, 428, 3, 2, 2, 2, 433, 429, 3, 2, 2, 2, 433, 430, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 432, 3, 2, 2, 2, 434, 21, 3, 2, 2, 2, 435, 436, 5, 98, 50, 2, 436, 437, 7, 3, 2, 2, 437, 23, 3, 2, 2, 2, 438, 439, 7, 6, 2, 2, 439, 440, 5, 74, 38, 2, 440, 441, 7, 7, 2, 2, 441, 442, 5, 96, 49, 2, 442, 443, 7, 3, 2, 2, 443, 25, 3, 2, 2, 2, 444, 445, 7, 8, 2, 2, 445, 446, 5, 14, 8, 2, 446, 447, 7, 9, 2, 2, 447, 27, 3, 2, 2, 2, 448, 449, 7, 127, 2, 2, 449, 450, 7, 128, 2, 2, 450, 451, 7, 3, 2, 2, 451, 29, 3, 2, 2, 2, 452, 453, 7, 129, 2, 2, 453, 454, 7, 128, 2, 2, 454, 455, 7, 3, 2, 2, 455, 31, 3, 2, 2, 2, 456, 457, 7, 130, 2, 2, 457, 458, 7, 131, 2, 2, 458, 459, 5, 96, 49, 2, 459, 460, 7, 3, 2, 2, 460, 33, 3, 2, 2, 2, 461, 464, 5, 102, 52, 2, 462, 464, 5, 106, 54, 2, 463, 461, 3, 2, 2, 2, 463, 462, 3, 2, 2, 2, 464, 473, 3, 2, 2, 2, 465, 472, 5, 102, 52, 2, 466, 472, 5, 106, 54, 2, 467, 472, 5, 110, 56, 2, 468, 472, 5, 112, 57, 2, 469, 472, 5, 116, 59, 2, 470, 472, 5, 120, 61, 2, 471, 465, 3, 2, 2, 2, 471, 466, 3, 2, 2, 2, 471, 467, 3, 2, 2, 2, 471, 468, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 470, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 477, 7, 67, 2, 2, 477, 478, 5, 20, 11, 2, 478, 35, 3, 2, 2, 2, 479, 480, 7, 68, 2, 2, 480, 481, 7, 10, 2, 2, 481, 482, 5, 94, 48, 2, 482, 483, 7, 11, 2, 2, 483, 484, 7, 89, 2, 2, 484, 485, 5, 20, 11, 2, 485, 486, 7, 90, 2, 2, 486, 487, 5, 20, 11, 2, 487, 37, 3, 2, 2, 2, 488, 489, 7, 84, 2, 2, 489, 490, 7, 10, 2, 2, 490, 491, 5, 94, 48, 2, 491, 493, 7, 11, 2, 2, 492, 494, 5, 40, 21, 2, 493, 492, 3, 2, 2, 2, 494, 495, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 495, 496, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 7, 88, 2, 2, 498, 499, 7, 67, 2, 2, 499, 500, 5, 20, 11, 2, 500, 39, 3, 2, 2, 2, 501, 502, 7, 85, 2, 2, 502, 504, 5, 96, 49, 2, 503, 501, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 503, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 7, 67, 2, 2, 508, 509, 5, 20, 11, 2, 509, 41, 3, 2, 2, 2, 510, 511, 7, 86, 2, 2, 511, 513, 5, 26, 14, 2, 512, 514, 5, 44, 23, 2, 513, 512, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 43, 3, 2, 2, 2, 517, 520, 7, 87, 2, 2, 518, 521, 7, 12, 2, 2, 519, 521, 5, 74, 38, 2, 520, 518, 3, 2, 2, 2, 520, 519, 3, 2, 2, 2, 521, 529, 3, 2, 2, 2, 522, 525, 7, 13, 2, 2, 523, 526, 7, 12, 2, 2, 524, 526, 5, 74, 38, 2, 525, 523, 3, 2, 2, 2, 525, 524, 3, 2, 2, 2, 526, 528, 3, 2, 2, 2, 527, 522, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 532, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 533, 5, 26, 14, 2, 533, 45, 3, 2, 2, 2, 534, 535, 7, 91, 2, 2, 535, 536, 7, 10, 2, 2, 536, 537, 5, 94, 48, 2, 537, 539, 7, 11, 2, 2, 538, 540, 5, 48, 25, 2, 539, 538, 3, 2, 2, 2, 540, 541, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 545, 7, 88, 2, 2, 544, 546, 5, 194, 98, 2, 545, 544, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 547, 3, 2, 2, 2, 547, 548, 7, 67, 2, 2, 548, 549, 5, 20, 11, 2, 549, 47, 3, 2, 2, 2, 550, 554, 7, 85, 2, 2, 551, 552, 5, 194, 98, 2, 552, 553, 7, 70, 2, 2, 553, 555, 3, 2, 2, 2, 554, 551, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 561, 5, 338, 170, 2, 557, 558, 7, 13, 2, 2, 558, 560, 5, 338, 170, 2, 559, 557, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 561, 562, 3, 2, 2, 2, 562, 564, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 564, 565, 7, 67, 2, 2, 565, 566, 5, 20, 11, 2, 566, 49, 3, 2, 2, 2, 567, 568, 7, 14, 2, 2, 568, 579, 5, 74, 38, 2, 569, 570, 7, 10, 2, 2, 570, 575, 7, 172, 2, 2, 571, 572, 7, 15, 2, 2, 572, 574, 7, 172, 2, 2, 573, 571, 3, 2, 2, 2, 574, 577, 3, 2, 2, 2, 575, 573, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 578, 3, 2, 2, 2, 577, 575, 3, 2, 2, 2, 578, 580, 7, 11, 2, 2, 579, 569, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 51, 3, 2, 2, 2, 581, 583, 5, 50, 26, 2, 582, 581, 3, 2, 2, 2, 583, 586, 3, 2, 2, 2, 584, 582, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 53, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 587, 588, 5, 52, 27, 2, 588, 589, 7, 114, 2, 2, 589, 594, 5, 56, 29, 2, 590, 591, 7, 15, 2, 2, 591, 593, 5, 56, 29, 2, 592, 590, 3, 2, 2, 2, 593, 596, 3, 2, 2, 2, 594, 592, 3, 2, 2, 2, 594, 595, 3, 2, 2, 2, 595, 597, 3, 2, 2, 2, 596, 594, 3, 2, 2, 2, 597, 598, 7, 3, 2, 2, 598, 55, 3, 2, 2, 2, 599, 602, 5, 194, 98, 2, 600, 601, 7, 70, 2, 2, 601, 603, 5, 338, 170, 2, 602, 600, 3, 2, 2, 2, 602, 603, 3, 2, 2, 2, 603, 606, 3, 2, 2, 2, 604, 605, 7, 7, 2, 2, 605, 607, 5, 96, 49, 2, 606, 604, 3, 2, 2, 2, 606, 607, 3, 2, 2, 2, 607, 57, 3, 2, 2, 2, 608, 609, 7, 132, 2, 2, 609, 610, 7, 10, 2, 2, 610, 611, 5, 94, 48, 2, 611, 612, 7, 11, 2, 2, 612, 613, 5, 20, 11, 2, 613, 59, 3, 2, 2, 2, 614, 619, 5, 66, 34, 2, 615, 619, 5, 68, 35, 2, 616, 619, 5, 70, 36, 2, 617, 619, 5, 72, 37, 2, 618, 614, 3, 2, 2, 2, 618, 615, 3, 2, 2, 2, 618, 616, 3, 2, 2, 2, 618, 617, 3, 2, 2, 2, 619, 61, 3, 2, 2, 2, 620, 621, 7, 111, 2, 2, 621, 622, 7, 135, 2, 2, 622, 623, 7, 178, 2, 2, 623, 624, 7, 5, 2, 2, 624, 625, 5, 354, 178, 2, 625, 63, 3, 2, 2, 2, 626, 631, 5, 84, 43, 2, 627, 631, 5, 80, 41, 2, 628, 631, 5, 86, 44, 2, 629, 631, 5, 82, 42, 2, 630, 626, 3, 2, 2, 2, 630, 627, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 630, 629, 3, 2, 2, 2, 631, 65, 3, 2, 2, 2, 632, 633, 7, 111, 2, 2, 633, 634, 7, 88, 2, 2, 634, 635, 7, 81, 2, 2, 635, 636, 5, 354, 178, 2, 636, 67, 3, 2, 2, 2, 637, 638, 7, 111, 2, 2, 638, 639, 7, 16, 2, 2, 639, 640, 9, 2, 2, 2, 640, 69, 3, 2, 2, 2, 641, 642, 7, 111, 2, 2, 642, 643, 7, 88, 2, 2, 643, 644, 7, 66, 2, 2, 644, 645, 7, 73, 2, 2, 645, 646, 9, 3, 2, 2, 646, 71, 3, 2, 2, 2, 647, 652, 7, 111, 2, 2, 648, 649, 7, 18, 2, 2, 649, 653, 5, 74, 38, 2, 650, 651, 7, 88, 2, 2, 651, 653, 7, 18, 2, 2, 652, 648, 3, 2, 2, 2, 652, 650, 3, 2, 2, 2, 653, 660, 3, 2, 2, 2, 654, 655, 5, 76, 39, 2, 655, 656, 7, 5, 2, 2, 656, 657, 5, 356, 179, 2, 657, 659, 3, 2, 2, 2, 658, 654, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 73, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 666, 7, 178, 2, 2, 664, 666, 5, 358, 180, 2, 665, 663, 3, 2, 2, 2, 665, 664, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 669, 7, 19, 2, 2, 668, 665, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 672, 3, 2, 2, 2, 670, 673, 7, 178, 2, 2, 671, 673, 5, 358, 180, 2, 672, 670, 3, 2, 2, 2, 672, 671, 3, 2, 2, 2, 673, 75, 3, 2, 2, 2, 674, 675, 9, 4, 2, 2, 675, 77, 3, 2, 2, 2, 676, 677, 7, 133, 2, 2, 677, 681, 7, 4, 2, 2, 678, 679, 7, 135, 2, 2, 679, 680, 7, 178, 2, 2, 680, 682, 7, 5, 2, 2, 681, 678, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 693, 5, 354, 178, 2, 684, 685, 7, 71, 2, 2, 685, 690, 5, 354, 178, 2, 686, 687, 7, 15, 2, 2, 687, 689, 5, 354, 178, 2, 688, 686, 3, 2, 2, 2, 689, 692, 3, 2, 2, 2, 690, 688, 3, 2, 2, 2, 690, 691, 3, 2, 2, 2, 691, 694, 3, 2, 2, 2, 692, 690, 3, 2, 2, 2, 693, 684, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 79, 3, 2, 2, 2, 695, 696, 7, 111, 2, 2, 696, 697, 5, 52, 27, 2, 697, 698, 7, 114, 2, 2, 698, 701, 5, 194, 98, 2, 699, 700, 7, 70, 2, 2, 700, 702, 5, 338, 170, 2, 701, 699, 3, 2, 2, 2, 701, 702, 3, 2, 2, 2, 702, 710, 3, 2, 2, 2, 703, 704, 7, 7, 2, 2, 704, 711, 5, 96, 49, 2, 705, 708, 7, 30, 2, 2, 706, 707, 7, 7, 2, 2, 707, 709, 5, 96, 49, 2, 708, 706, 3, 2, 2, 2, 708, 709, 3, 2, 2, 2, 709, 711, 3, 2, 2, 2, 710, 703, 3, 2, 2, 2, 710, 705, 3, 2, 2, 2, 711, 81, 3, 2, 2, 2, 712, 713, 7, 111, 2, 2, 713, 714, 7, 112, 2, 2, 714, 717, 7, 113, 2, 2, 715, 716, 7, 70, 2, 2, 716, 718, 5, 338, 170, 2, 717, 715, 3, 2, 2, 2, 717, 718, 3, 2, 2, 2, 718, 726, 3, 2, 2, 2, 719, 720, 7, 7, 2, 2, 720, 727, 5, 96, 49, 2, 721, 724, 7, 30, 2, 2, 722, 723, 7, 7, 2, 2, 723, 725, 5, 96, 49, 2, 724, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 727, 3, 2, 2, 2, 726, 719, 3, 2, 2, 2, 726, 721, 3, 2, 2, 2, 727, 83, 3, 2, 2, 2, 728, 729, 7, 111, 2, 2, 729, 730, 5, 52, 27, 2, 730, 731, 7, 31, 2, 2, 731, 732, 5, 74, 38, 2, 732, 734, 7, 10, 2, 2, 733, 735, 5, 90, 46, 2, 734, 733, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 739, 7, 11, 2, 2, 737, 738, 7, 70, 2, 2, 738, 740, 5, 338, 170, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 746, 3, 2, 2, 2, 741, 742, 7, 8, 2, 2, 742, 743, 5, 18, 10, 2, 743, 744, 7, 9, 2, 2, 744, 747, 3, 2, 2, 2, 745, 747, 7, 30, 2, 2, 746, 741, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 85, 3, 2, 2, 2, 748, 749, 7, 111, 2, 2, 749, 750, 7, 108, 2, 2, 750, 751, 5, 74, 38, 2, 751, 753, 7, 70, 2, 2, 752, 754, 5, 88, 45, 2, 753, 752, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 755, 3, 2, 2, 2, 755, 756, 5, 96, 49, 2, 756, 87, 3, 2, 2, 2, 757, 758, 7, 32, 2, 2, 758, 764, 7, 33, 2, 2, 759, 760, 7, 32, 2, 2, 760, 764, 7, 34, 2, 2, 761, 762, 7, 124, 2, 2, 762, 764, 7, 134, 2, 2, 763, 757, 3, 2, 2, 2, 763, 759, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 764, 89, 3, 2, 2, 2, 765, 770, 5, 92, 47, 2, 766, 767, 7, 15, 2, 2, 767, 769, 5, 92, 47, 2, 768, 766, 3, 2, 2, 2, 769, 772, 3, 2, 2, 2, 770, 768, 3, 2, 2, 2, 770, 771, 3, 2, 2, 2, 771, 91, 3, 2, 2, 2, 772, 770, 3, 2, 2, 2, 773, 774, 7, 6, 2, 2, 774, 777, 5, 74, 38, 2, 775, 776, 7, 70, 2, 2, 776, 778, 5, 338, 170, 2, 777, 775, 3, 2, 2, 2, 777, 778, 3, 2, 2, 2, 778, 93, 3, 2, 2, 2, 779, 784, 5, 96, 49, 2, 780, 781, 7, 15, 2, 2, 781, 783, 5, 96, 49, 2, 782, 780, 3, 2, 2, 2, 783, 786, 3, 2, 2, 2, 784, 782, 3, 2, 2, 2, 784, 785, 3, 2, 2, 2, 785, 95, 3, 2, 2, 2, 786, 784, 3, 2, 2, 2, 787, 794, 5, 98, 50, 2, 788, 794, 5, 100, 51, 2, 789, 794, 5, 126, 64, 2, 790, 794, 5, 130, 66, 2, 791, 794, 5, 134, 68, 2, 792, 794, 5, 136, 69, 2, 793, 787, 3, 2, 2, 2, 793, 788, 3, 2, 2, 2, 793, 789, 3, 2, 2, 2, 793, 790, 3, 2, 2, 2, 793, 791, 3, 2, 2, 2, 793, 792, 3, 2, 2, 2, 794, 97, 3, 2, 2, 2, 795, 804, 5, 122, 62, 2, 796, 804, 5, 140, 71, 2, 797, 804, 5, 216, 109, 2, 798, 804, 5, 218, 110, 2, 799, 804, 5, 220, 111, 2, 800, 804, 5, 222, 112, 2, 801, 804, 5, 224, 113, 2, 802, 804, 5, 226, 114, 2, 803, 795, 3, 2, 2, 2, 803, 796, 3, 2, 2, 2, 803, 797, 3, 2, 2, 2, 803, 798, 3, 2, 2, 2, 803, 799, 3, 2, 2, 2, 803, 800, 3, 2, 2, 2, 803, 801, 3, 2, 2, 2, 803, 802, 3, 2, 2, 2, 804, 99, 3, 2, 2, 2, 805, 808, 5, 102, 52, 2, 806, 808, 5, 106, 54, 2, 807, 805, 3, 2, 2, 2, 807, 806, 3, 2, 2, 2, 808, 817, 3, 2, 2, 2, 809, 816, 5, 102, 52, 2, 810, 816, 5, 106, 54, 2, 811, 816, 5, 110, 56, 2, 812, 816, 5, 112, 57, 2, 813, 816, 5, 116, 59, 2, 814, 816, 5, 120, 61, 2, 815, 809, 3, 2, 2, 2, 815, 810, 3, 2, 2, 2, 815, 811, 3, 2, 2, 2, 815, 812, 3, 2, 2, 2, 815, 813, 3, 2, 2, 2, 815, 814, 3, 2, 2, 2, 816, 819, 3, 2, 2, 2, 817, 815, 3, 2, 2, 2, 817, 818, 3, 2, 2, 2, 818, 820, 3, 2, 2, 2, 819, 817, 3, 2, 2, 2, 820, 821, 7, 67, 2, 2, 821, 822, 5, 96, 49, 2, 822, 101, 3, 2, 2, 2, 823, 824, 7, 61, 2, 2, 824, 829, 5, 104, 53, 2, 825, 826, 7, 15, 2, 2, 826, 828, 5, 104, 53, 2, 827, 825, 3, 2, 2, 2, 828, 831, 3, 2, 2, 2, 829, 827, 3, 2, 2, 2, 829, 830, 3, 2, 2, 2, 830, 103, 3, 2, 2, 2, 831, 829, 3, 2, 2, 2, 832, 835, 5, 194, 98, 2, 833, 834, 7, 70, 2, 2, 834, 836, 5, 338, 170, 2, 835, 833, 3, 2, 2, 2, 835, 836, 3, 2, 2, 2, 836, 839, 3, 2, 2, 2, 837, 838, 7, 72, 2, 2, 838, 840, 7, 73, 2, 2, 839, 837, 3, 2, 2, 2, 839, 840, 3, 2, 2, 2, 840, 843, 3, 2, 2, 2, 841, 842, 7, 71, 2, 2, 842, 844, 5, 194, 98, 2, 843, 841, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 845, 3, 2, 2, 2, 845, 846, 7, 69, 2, 2, 846, 847, 5, 96, 49, 2, 847, 105, 3, 2, 2, 2, 848, 849, 7, 62, 2, 2, 849, 854, 5, 108, 55, 2, 850, 851, 7, 15, 2, 2, 851, 853, 5, 108, 55, 2, 852, 850, 3, 2, 2, 2, 853, 856, 3, 2, 2, 2, 854, 852, 3, 2, 2, 2, 854, 855, 3, 2, 2, 2, 855, 107, 3, 2, 2, 2, 856, 854, 3, 2, 2, 2, 857, 860, 5, 194, 98, 2, 858, 859, 7, 70, 2, 2, 859, 861, 5, 338, 170, 2, 860, 858, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 862, 3, 2, 2, 2, 862, 863, 7, 7, 2, 2, 863, 864, 5, 96, 49, 2, 864, 109, 3, 2, 2, 2, 865, 866, 7, 63, 2, 2, 866, 867, 5, 96, 49, 2, 867, 111, 3, 2, 2, 2, 868, 869, 7, 64, 2, 2, 869, 870, 7, 65, 2, 2, 870, 875, 5, 114, 58, 2, 871, 872, 7, 15, 2, 2, 872, 874, 5, 114, 58, 2, 873, 871, 3, 2, 2, 2, 874, 877, 3, 2, 2, 2, 875, 873, 3, 2, 2, 2, 875, 876, 3, 2, 2, 2, 876, 113, 3, 2, 2, 2, 877, 875, 3, 2, 2, 2, 878, 885, 5, 194, 98, 2, 879, 880, 7, 70, 2, 2, 880, 882, 5, 338, 170, 2, 881, 879, 3, 2, 2, 2, 881, 882, 3, 2, 2, 2, 882, 883, 3, 2, 2, 2, 883, 884, 7, 7, 2, 2, 884, 886, 5, 96, 49, 2, 885, 881, 3, 2, 2, 2, 885, 886, 3, 2, 2, 2, 886, 889, 3, 2, 2, 2, 887, 888, 7, 81, 2, 2, 888, 890, 5, 354, 178, 2, 889, 887, 3, 2, 2, 2, 889, 890, 3, 2, 2, 2, 890, 115, 3, 2, 2, 2, 891, 892, 7, 66, 2, 2, 892, 897, 7, 65, 2, 2, 893, 894, 7, 75, 2, 2, 894, 895, 7, 66, 2, 2, 895, 897, 7, 65, 2, 2, 896, 891, 3, 2, 2, 2, 896, 893, 3, 2, 2, 2, 897, 898, 3, 2, 2, 2, 898, 903, 5, 118, 60, 2, 899, 900, 7, 15, 2, 2, 900, 902, 5, 118, 60, 2, 901, 899, 3, 2, 2, 2, 902, 905, 3, 2, 2, 2, 903, 901, 3, 2, 2, 2, 903, 904, 3, 2, 2, 2, 904, 117, 3, 2, 2, 2, 905, 903, 3, 2, 2, 2, 906, 909, 5, 96, 49, 2, 907, 910, 7, 76, 2, 2, 908, 910, 7, 77, 2, 2, 909, 907, 3, 2, 2, 2, 909, 908, 3, 2, 2, 2, 909, 910, 3, 2, 2, 2, 910, 916, 3, 2, 2, 2, 911, 914, 7, 73, 2, 2, 912, 915, 7, 82, 2, 2, 913, 915, 7, 83, 2, 2, 914, 912, 3, 2, 2, 2, 914, 913, 3, 2, 2, 2, 915, 917, 3, 2, 2, 2, 916, 911, 3, 2, 2, 2, 916, 917, 3, 2, 2, 2, 917, 920, 3, 2, 2, 2, 918, 919, 7, 81, 2, 2, 919, 921, 5, 354, 178, 2, 920, 918, 3, 2, 2, 2, 920, 921, 3, 2, 2, 2, 921, 119, 3, 2, 2, 2, 922, 923, 7, 74, 2, 2, 923, 924, 5, 194, 98, 2, 924, 121, 3, 2, 2, 2, 925, 928, 7, 78, 2, 2, 926, 928, 7, 79, 2, 2, 927, 925, 3, 2, 2, 2, 927, 926, 3, 2, 2, 2, 928, 929, 3, 2, 2, 2, 929, 934, 5, 124, 63, 2, 930, 931, 7, 15, 2, 2, 931, 933, 5, 124, 63, 2, 932, 930, 3, 2, 2, 2, 933, 936, 3, 2, 2, 2, 934, 932, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 937, 3, 2, 2, 2, 936, 934, 3, 2, 2, 2, 937, 938, 7, 80, 2, 2, 938, 939, 5, 96, 49, 2, 939, 123, 3, 2, 2, 2, 940, 943, 5, 194, 98, 2, 941, 942, 7, 70, 2, 2, 942, 944, 5, 338, 170, 2, 943, 941, 3, 2, 2, 2, 943, 944, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 946, 7, 69, 2, 2, 946, 947, 5, 96, 49, 2, 947, 125, 3, 2, 2, 2, 948, 949, 7, 84, 2, 2, 949, 950, 7, 10, 2, 2, 950, 951, 5, 94, 48, 2, 951, 953, 7, 11, 2, 2, 952, 954, 5, 128, 65, 2, 953, 952, 3, 2, 2, 2, 954, 955, 3, 2, 2, 2, 955, 953, 3, 2, 2, 2, 955, 956, 3, 2, 2, 2, 956, 957, 3, 2, 2, 2, 957, 958, 7, 88, 2, 2, 958, 959, 7, 67, 2, 2, 959, 960, 5, 96, 49, 2, 960, 127, 3, 2, 2, 2, 961, 962, 7, 85, 2, 2, 962, 964, 5, 96, 49, 2, 963, 961, 3, 2, 2, 2, 964, 965, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 967, 3, 2, 2, 2, 967, 968, 7, 67, 2, 2, 968, 969, 5, 96, 49, 2, 969, 129, 3, 2, 2, 2, 970, 971, 7, 91, 2, 2, 971, 972, 7, 10, 2, 2, 972, 973, 5, 94, 48, 2, 973, 975, 7, 11, 2, 2, 974, 976, 5, 132, 67, 2, 975, 974, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 975, 3, 2, 2, 2, 977, 978, 3, 2, 2, 2, 978, 979, 3, 2, 2, 2, 979, 981, 7, 88, 2, 2, 980, 982, 5, 194, 98, 2, 981, 980, 3, 2, 2, 2, 981, 982, 3, 2, 2, 2, 982, 983, 3, 2, 2, 2, 983, 984, 7, 67, 2, 2, 984, 985, 5, 96, 49, 2, 985, 131, 3, 2, 2, 2, 986, 990, 7, 85, 2, 2, 987, 988, 5, 194, 98, 2, 988, 989, 7, 70, 2, 2, 989, 991, 3, 2, 2, 2, 990, 987, 3, 2, 2, 2, 990, 991, 3, 2, 2, 2, 991, 992, 3, 2, 2, 2, 992, 997, 5, 338, 170, 2, 993, 994, 7, 13, 2, 2, 994, 996, 5, 338, 170, 2, 995, 993, 3, 2, 2, 2, 996, 999, 3, 2, 2, 2, 997, 995, 3, 2, 2, 2, 997, 998, 3, 2, 2, 2, 998, 1000, 3, 2, 2, 2, 999, 997, 3, 2, 2, 2, 1000, 1001, 7, 67, 2, 2, 1001, 1002, 5, 96, 49, 2, 1002, 133, 3, 2, 2, 2, 1003, 1004, 7, 68, 2, 2, 1004, 1005, 7, 10, 2, 2, 1005, 1006, 5, 94, 48, 2, 1006, 1007, 7, 11, 2, 2, 1007, 1008, 7, 89, 2, 2, 1008, 1009, 5, 96, 49, 2, 1009, 1010, 7, 90, 2, 2, 1010, 1011, 5, 96, 49, 2, 1011, 135, 3, 2, 2, 2, 1012, 1013, 7, 86, 2, 2, 1013, 1014, 7, 8, 2, 2, 1014, 1015, 5, 94, 48, 2, 1015, 1017, 7, 9, 2, 2, 1016, 1018, 5, 138, 70, 2, 1017, 1016, 3, 2, 2, 2, 1018, 1019, 3, 2, 2, 2, 1019, 1017, 3, 2, 2, 2, 1019, 1020, 3, 2, 2, 2, 1020, 137, 3, 2, 2, 2, 1021, 1024, 7, 87, 2, 2, 1022, 1025, 7, 12, 2, 2, 1023, 1025, 5, 74, 38, 2, 1024, 1022, 3, 2, 2, 2, 1024, 1023, 3, 2, 2, 2, 1025, 1033, 3, 2, 2, 2, 1026, 1029, 7, 13, 2, 2, 1027, 1030, 7, 12, 2, 2, 1028, 1030, 5, 74, 38, 2, 1029, 1027, 3, 2, 2, 2, 1029, 1028, 3, 2, 2, 2, 1030, 1032, 3, 2, 2, 2, 1031, 1026, 3, 2, 2, 2, 1032, 1035, 3, 2, 2, 2, 1033, 1031, 3, 2, 2, 2, 1033, 1034, 3, 2, 2, 2, 1034, 1036, 3, 2, 2, 2, 1035, 1033, 3, 2, 2, 2, 1036, 1037, 7, 8, 2, 2, 1037, 1038, 5, 94, 48, 2, 1038, 1039, 7, 9, 2, 2, 1039, 139, 3, 2, 2, 2, 1040, 1045, 5, 142, 72, 2, 1041, 1042, 7, 92, 2, 2, 1042, 1044, 5, 142, 72, 2, 1043, 1041, 3, 2, 2, 2, 1044, 1047, 3, 2, 2, 2, 1045, 1043, 3, 2, 2, 2, 1045, 1046, 3, 2, 2, 2, 1046, 141, 3, 2, 2, 2, 1047, 1045, 3, 2, 2, 2, 1048, 1053, 5, 144, 73, 2, 1049, 1050, 7, 93, 2, 2, 1050, 1052, 5, 144, 73, 2, 1051, 1049, 3, 2, 2, 2, 1052, 1055, 3, 2, 2, 2, 1053, 1051, 3, 2, 2, 2, 1053, 1054, 3, 2, 2, 2, 1054, 143, 3, 2, 2, 2, 1055, 1053, 3, 2, 2, 2, 1056, 1058, 7, 94, 2, 2, 1057, 1056, 3, 2, 2, 2, 1057, 1058, 3, 2, 2, 2, 1058, 1059, 3, 2, 2, 2, 1059, 1060, 5, 146, 74, 2, 1060, 145, 3, 2, 2, 2, 1061, 1064, 5, 148, 75, 2, 1062, 1063, 9, 5, 2, 2, 1063, 1065, 5, 148, 75, 2, 1064, 1062, 3, 2, 2, 2, 1064, 1065, 3, 2, 2, 2, 1065, 147, 3, 2, 2, 2, 1066, 1071, 5, 150, 76, 2, 1067, 1068, 7, 46, 2, 2, 1068, 1070, 5, 150, 76, 2, 1069, 1067, 3, 2, 2, 2, 1070, 1073, 3, 2, 2, 2, 1071, 1069, 3, 2, 2, 2, 1071, 1072, 3, 2, 2, 2, 1072, 149, 3, 2, 2, 2, 1073, 1071, 3, 2, 2, 2, 1074, 1077, 5, 152, 77, 2, 1075, 1076, 7, 95, 2, 2, 1076, 1078, 5, 152, 77, 2, 1077, 1075, 3, 2, 2, 2, 1077, 1078, 3, 2, 2, 2, 1078, 151, 3, 2, 2, 2, 1079, 1084, 5, 154, 78, 2, 1080, 1081, 9, 6, 2, 2, 1081, 1083, 5, 154, 78, 2, 1082, 1080, 3, 2, 2, 2, 1083, 1086, 3, 2, 2, 2, 1084, 1082, 3, 2, 2, 2, 1084, 1085, 3, 2, 2, 2, 1085, 153, 3, 2, 2, 2, 1086, 1084, 3, 2, 2, 2, 1087, 1092, 5, 156, 79, 2, 1088, 1089, 9, 7, 2, 2, 1089, 1091, 5, 156, 79, 2, 1090, 1088, 3, 2, 2, 2, 1091, 1094, 3, 2, 2, 2, 1092, 1090, 3, 2, 2, 2, 1092, 1093, 3, 2, 2, 2, 1093, 155, 3, 2, 2, 2, 1094, 1092, 3, 2, 2, 2, 1095, 1099, 5, 158, 80, 2, 1096, 1097, 7, 96, 2, 2, 1097, 1098, 7, 97, 2, 2, 1098, 1100, 5, 338, 170, 2, 1099, 1096, 3, 2, 2, 2, 1099, 1100, 3, 2, 2, 2, 1100, 157, 3, 2, 2, 2, 1101, 1105, 5, 160, 81, 2, 1102, 1103, 7, 99, 2, 2, 1103, 1104, 7, 98, 2, 2, 1104, 1106, 5, 338, 170, 2, 1105, 1102, 3, 2, 2, 2, 1105, 1106, 3, 2, 2, 2, 1106, 159, 3, 2, 2, 2, 1107, 1111, 5, 162, 82, 2, 1108, 1109, 7, 100, 2, 2, 1109, 1110, 7, 70, 2, 2, 1110, 1112, 5, 338, 170, 2, 1111, 1108, 3, 2, 2, 2, 1111, 1112, 3, 2, 2, 2, 1112, 161, 3, 2, 2, 2, 1113, 1117, 5, 164, 83, 2, 1114, 1115, 7, 102, 2, 2, 1115, 1116, 7, 70, 2, 2, 1116, 1118, 5, 348, 175, 2, 1117, 1114, 3, 2, 2, 2, 1117, 1118, 3, 2, 2, 2, 1118, 163, 3, 2, 2, 2, 1119, 1123, 5, 166, 84, 2, 1120, 1121, 7, 101, 2, 2, 1121, 1122, 7, 70, 2, 2, 1122, 1124, 5, 348, 175, 2, 1123, 1120, 3, 2, 2, 2, 1123, 1124, 3, 2, 2, 2, 1124, 165, 3, 2, 2, 2, 1125, 1134, 5, 170, 86, 2, 1126, 1127, 7, 5, 2, 2, 1127, 1128, 7, 44, 2, 2, 1128, 1129, 3, 2, 2, 2, 1129, 1130, 5, 168, 85, 2, 1130, 1131, 5, 206, 104, 2, 1131, 1133, 3, 2, 2, 2, 1132, 1126, 3, 2, 2, 2, 1133, 1136, 3, 2, 2, 2, 1134, 1132, 3, 2, 2, 2, 1134, 1135, 3, 2, 2, 2, 1135, 167, 3, 2, 2, 2, 1136, 1134, 3, 2, 2, 2, 1137, 1141, 5, 74, 38, 2, 1138, 1141, 5, 194, 98, 2, 1139, 1141, 5, 196, 99, 2, 1140, 1137, 3, 2, 2, 2, 1140, 1138, 3, 2, 2, 2, 1140, 1139, 3, 2, 2, 2, 1141, 169, 3, 2, 2, 2, 1142, 1144, 9, 6, 2, 2, 1143, 1142, 3, 2, 2, 2, 1144, 1147, 3, 2, 2, 2, 1145, 1143, 3, 2, 2, 2, 1145, 1146, 3, 2, 2, 2, 1146, 1148, 3, 2, 2, 2, 1147, 1145, 3, 2, 2, 2, 1148, 1149, 5, 172, 87, 2, 1149, 171, 3, 2, 2, 2, 1150, 1154, 5, 178, 90, 2, 1151, 1154, 5, 174, 88, 2, 1152, 1154, 5, 176, 89, 2, 1153, 1150, 3, 2, 2, 2, 1153, 1151, 3, 2, 2, 2, 1153, 1152, 3, 2, 2, 2, 1154, 173, 3, 2, 2, 2, 1155, 1156, 7, 109, 2, 2, 1156, 1157, 7, 108, 2, 2, 1157, 1158, 5, 338, 170, 2, 1158, 1159, 7, 8, 2, 2, 1159, 1160, 5, 94, 48, 2, 1160, 1161, 7, 9, 2, 2, 1161, 175, 3, 2, 2, 2, 1162, 1163, 7, 110, 2, 2, 1163, 1164, 7, 108, 2, 2, 1164, 1165, 5, 338, 170, 2, 1165, 1166, 7, 8, 2, 2, 1166, 1167, 5, 94, 48, 2, 1167, 1168, 7, 9, 2, 2, 1168, 177, 3, 2, 2, 2, 1169, 1174, 5, 180, 91, 2, 1170, 1171, 7, 52, 2, 2, 1171, 1173, 5, 180, 91, 2, 1172, 1170, 3, 2, 2, 2, 1173, 1176, 3, 2, 2, 2, 1174, 1172, 3, 2, 2, 2, 1174, 1175, 3, 2, 2, 2, 1175, 179, 3, 2, 2, 2, 1176, 1174, 3, 2, 2, 2, 1177, 1185, 5, 190, 96, 2, 1178, 1184, 5, 182, 92, 2, 1179, 1184, 5, 186, 94, 2, 1180, 1184, 5, 188, 95, 2, 1181, 1184, 5, 184, 93, 2, 1182, 1184, 5, 206, 104, 2, 1183, 1178, 3, 2, 2, 2, 1183, 1179, 3, 2, 2, 2, 1183, 1180, 3, 2, 2, 2, 1183, 1181, 3, 2, 2, 2, 1183, 1182, 3, 2, 2, 2, 1184, 1187, 3, 2, 2, 2, 1185, 1183, 3, 2, 2, 2, 1185, 1186, 3, 2, 2, 2, 1186, 181, 3, 2, 2, 2, 1187, 1185, 3, 2, 2, 2, 1188, 1189, 7, 53, 2, 2, 1189, 1190, 7, 53, 2, 2, 1190, 1191, 5, 94, 48, 2, 1191, 1192, 7, 54, 2, 2, 1192, 1193, 7, 54, 2, 2, 1193, 183, 3, 2, 2, 2, 1194, 1195, 7, 53, 2, 2, 1195, 1196, 7, 54, 2, 2, 1196, 185, 3, 2, 2, 2, 1197, 1198, 7, 53, 2, 2, 1198, 1199, 5, 94, 48, 2, 1199, 1200, 7, 54, 2, 2, 1200, 187, 3, 2, 2, 2, 1201, 1208, 7, 55, 2, 2, 1202, 1209, 5, 358, 180, 2, 1203, 1209, 5, 356, 179, 2, 1204, 1209, 7, 178, 2, 2, 1205, 1209, 5, 196, 99, 2, 1206, 1209, 5, 194, 98, 2, 1207, 1209, 5, 198, 100, 2, 1208, 1202, 3, 2, 2, 2, 1208, 1203, 3, 2, 2, 2, 1208, 1204, 3, 2, 2, 2, 1208, 1205, 3, 2, 2, 2, 1208, 1206, 3, 2, 2, 2, 1208, 1207, 3, 2, 2, 2, 1209, 189, 3, 2, 2, 2, 1210, 1226, 7, 171, 2, 2, 1211, 1226, 7, 106, 2, 2, 1212, 1226, 7, 107, 2, 2, 1213, 1226, 7, 172, 2, 2, 1214, 1226, 5, 356, 179, 2, 1215, 1226, 5, 194, 98, 2, 1216, 1226, 5, 196, 99, 2, 1217, 1226, 5, 198, 100, 2, 1218, 1226, 5, 340, 171, 2, 1219, 1226, 5, 204, 103, 2, 1220, 1226, 5, 200, 101, 2, 1221, 1226, 5, 202, 102, 2, 1222, 1226, 5, 352, 177, 2, 1223, 1226, 5, 210, 106, 2, 1224, 1226, 5, 192, 97, 2, 1225, 1210, 3, 2, 2, 2, 1225, 1211, 3, 2, 2, 2, 1225, 1212, 3, 2, 2, 2, 1225, 1213, 3, 2, 2, 2, 1225, 1214, 3, 2, 2, 2, 1225, 1215, 3, 2, 2, 2, 1225, 1216, 3, 2, 2, 2, 1225, 1217, 3, 2, 2, 2, 1225, 1218, 3, 2, 2, 2, 1225, 1219, 3, 2, 2, 2, 1225, 1220, 3, 2, 2, 2, 1225, 1221, 3, 2, 2, 2, 1225, 1222, 3, 2, 2, 2, 1225, 1223, 3, 2, 2, 2, 1225, 1224, 3, 2, 2, 2, 1226, 191, 3, 2, 2, 2, 1227, 1228, 7, 8, 2, 2, 1228, 1229, 5, 16, 9, 2, 1229, 1230, 7, 9, 2, 2, 1230, 193, 3, 2, 2, 2, 1231, 1232, 7, 6, 2, 2, 1232, 1233, 5, 74, 38, 2, 1233, 195, 3, 2, 2, 2, 1234, 1236, 7, 10, 2, 2, 1235, 1237, 5, 94, 48, 2, 1236, 1235, 3, 2, 2, 2, 1236, 1237, 3, 2, 2, 2, 1237, 1238, 3, 2, 2, 2, 1238, 1239, 7, 11, 2, 2, 1239, 197, 3, 2, 2, 2, 1240, 1241, 7, 56, 2, 2, 1241, 199, 3, 2, 2, 2, 1242, 1243, 7, 17, 2, 2, 1243, 1244, 7, 8, 2, 2, 1244, 1245, 5, 94, 48, 2, 1245, 1246, 7, 9, 2, 2, 1246, 201, 3, 2, 2, 2, 1247, 1248, 7, 105, 2, 2, 1248, 1249, 7, 8, 2, 2, 1249, 1250, 5, 94, 48, 2, 1250, 1251, 7, 9, 2, 2, 1251, 203, 3, 2, 2, 2, 1252, 1253, 5, 74, 38, 2, 1253, 1254, 5, 206, 104, 2, 1254, 205, 3, 2, 2, 2, 1255, 1262, 7, 10, 2, 2, 1256, 1258, 5, 208, 105, 2, 1257, 1259, 7, 15, 2, 2, 1258, 1257, 3, 2, 2, 2, 1258, 1259, 3, 2, 2, 2, 1259, 1261, 3, 2, 2, 2, 1260, 1256, 3, 2, 2, 2, 1261, 1264, 3, 2, 2, 2, 1262, 1260, 3, 2, 2, 2, 1262, 1263, 3, 2, 2, 2, 1263, 1265, 3, 2, 2, 2, 1264, 1262, 3, 2, 2, 2, 1265, 1266, 7, 11, 2, 2, 1266, 207, 3, 2, 2, 2, 1267, 1270, 5, 96, 49, 2, 1268, 1270, 7, 170, 2, 2, 1269, 1267, 3, 2, 2, 2, 1269, 1268, 3, 2, 2, 2, 1270, 209, 3, 2, 2, 2, 1271, 1274, 5, 212, 107, 2, 1272, 1274, 5, 214, 108, 2, 1273, 1271, 3, 2, 2, 2, 1273, 1272, 3, 2, 2, 2, 1274, 211, 3, 2, 2, 2, 1275, 1276, 5, 74, 38, 2, 1276, 1277, 7, 57, 2, 2, 1277, 1278, 7, 172, 2, 2, 1278, 213, 3, 2, 2, 2, 1279, 1280, 5, 52, 27, 2, 1280, 1281, 7, 31, 2, 2, 1281, 1283, 7, 10, 2, 2, 1282, 1284, 5, 90, 46, 2, 1283, 1282, 3, 2, 2, 2, 1283, 1284, 3, 2, 2, 2, 1284, 1285, 3, 2, 2, 2, 1285, 1288, 7, 11, 2, 2, 1286, 1287, 7, 70, 2, 2, 1287, 1289, 5, 338, 170, 2, 1288, 1286, 3, 2, 2, 2, 1288, 1289, 3, 2, 2, 2, 1289, 1290, 3, 2, 2, 2, 1290, 1291, 7, 8, 2, 2, 1291, 1292, 5, 18, 10, 2, 1292, 1293, 7, 9, 2, 2, 1293, 215, 3, 2, 2, 2, 1294, 1295, 7, 115, 2, 2, 1295, 1296, 7, 124, 2, 2, 1296, 1297, 5, 96, 49, 2, 1297, 1298, 7, 122, 2, 2, 1298, 1302, 5, 96, 49, 2, 1299, 1300, 7, 71, 2, 2, 1300, 1301, 7, 126, 2, 2, 1301, 1303, 5, 96, 49, 2, 1302, 1299, 3, 2, 2, 2, 1302, 1303, 3, 2, 2, 2, 1303, 1318, 3, 2, 2, 2, 1304, 1305, 7, 115, 2, 2, 1305, 1306, 7, 124, 2, 2, 1306, 1311, 5, 350, 176, 2, 1307, 1308, 7, 15, 2, 2, 1308, 1310, 5, 350, 176, 2, 1309, 1307, 3, 2, 2, 2, 1310, 1313, 3, 2, 2, 2, 1311, 1309, 3, 2, 2, 2, 1311, 1312, 3, 2, 2, 2, 1312, 1314, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1314, 1315, 7, 122, 2, 2, 1315, 1316, 5, 96, 49, 2, 1316, 1318, 3, 2, 2, 2, 1317, 1294, 3, 2, 2, 2, 1317, 1304, 3, 2, 2, 2, 1318, 217, 3, 2, 2, 2, 1319, 1320, 7, 116, 2, 2, 1320, 1321, 7, 124, 2, 2, 1321, 1322, 5, 228, 115, 2, 1322, 219, 3, 2, 2, 2, 1323, 1324, 7, 117, 2, 2, 1324, 1325, 7, 124, 2, 2, 1325, 1326, 5, 228, 115, 2, 1326, 1327, 7, 70, 2, 2, 1327, 1328, 5, 96, 49, 2, 1328, 221, 3, 2, 2, 2, 1329, 1330, 7, 118, 2, 2, 1330, 1331, 7, 124, 2, 2, 1331, 1332, 7, 123, 2, 2, 1332, 1333, 7, 97, 2, 2, 1333, 1334, 5, 228, 115, 2, 1334, 1335, 7, 125, 2, 2, 1335, 1336, 5, 96, 49, 2, 1336, 223, 3, 2, 2, 2, 1337, 1338, 7, 119, 2, 2, 1338, 1339, 7, 124, 2, 2, 1339, 1344, 5, 230, 116, 2, 1340, 1341, 7, 15, 2, 2, 1341, 1343, 5, 230, 116, 2, 1342, 1340, 3, 2, 2, 2, 1343, 1346, 3, 2, 2, 2, 1344, 1342, 3, 2, 2, 2, 1344, 1345, 3, 2, 2, 2, 1345, 1347, 3, 2, 2, 2, 1346, 1344, 3, 2, 2, 2, 1347, 1348, 7, 120, 2, 2, 1348, 1349, 5, 96, 49, 2, 1349, 1350, 7, 67, 2, 2, 1350, 1351, 5, 96, 49, 2, 1351, 225, 3, 2, 2, 2, 1352, 1353, 7, 121, 2, 2, 1353, 1354, 7, 124, 2, 2, 1354, 1355, 5, 96, 49, 2, 1355, 1356, 7, 122, 2, 2, 1356, 1357, 5, 96, 49, 2, 1357, 227, 3, 2, 2, 2, 1358, 1361, 5, 190, 96, 2, 1359, 1362, 5, 182, 92, 2, 1360, 1362, 5, 188, 95, 2, 1361, 1359, 3, 2, 2, 2, 1361, 1360, 3, 2, 2, 2, 1362, 1363, 3, 2, 2, 2, 1363, 1361, 3, 2, 2, 2, 1363, 1364, 3, 2, 2, 2, 1364, 229, 3, 2, 2, 2, 1365, 1366, 5, 194, 98, 2, 1366, 1367, 7, 7, 2, 2, 1367, 1368, 5, 96, 49, 2, 1368, 231, 3, 2, 2, 2, 1369, 1370, 7, 133, 2, 2, 1370, 1372, 7, 134, 2, 2, 1371, 1373, 5, 234, 118, 2, 1372, 1371, 3, 2, 2, 2, 1372, 1373, 3, 2, 2, 2, 1373, 1374, 3, 2, 2, 2, 1374, 1384, 5, 354, 178, 2, 1375, 1376, 7, 71, 2, 2, 1376, 1381, 5, 354, 178, 2, 1377, 1378, 7, 15, 2, 2, 1378, 1380, 5, 354, 178, 2, 1379, 1377, 3, 2, 2, 2, 1380, 1383, 3, 2, 2, 2, 1381, 1379, 3, 2, 2, 2, 1381, 1382, 3, 2, 2, 2, 1382, 1385, 3, 2, 2, 2, 1383, 1381, 3, 2, 2, 2, 1384, 1375, 3, 2, 2, 2, 1384, 1385, 3, 2, 2, 2, 1385, 233, 3, 2, 2, 2, 1386, 1387, 7, 135, 2, 2, 1387, 1388, 7, 178, 2, 2, 1388, 1393, 7, 5, 2, 2, 1389, 1390, 7, 88, 2, 2, 1390, 1391, 7, 136, 2, 2, 1391, 1393, 7, 135, 2, 2, 1392, 1386, 3, 2, 2, 2, 1392, 1389, 3, 2, 2, 2, 1393, 235, 3, 2, 2, 2, 1394, 1396, 7, 137, 2, 2, 1395, 1397, 5, 238, 120, 2, 1396, 1395, 3, 2, 2, 2, 1396, 1397, 3, 2, 2, 2, 1397, 1402, 3, 2, 2, 2, 1398, 1399, 7, 138, 2, 2, 1399, 1402, 5, 238, 120, 2, 1400, 1402, 5, 238, 120, 2, 1401, 1394, 3, 2, 2, 2, 1401, 1398, 3, 2, 2, 2, 1401, 1400, 3, 2, 2, 2, 1402, 237, 3, 2, 2, 2, 1403, 1408, 5, 240, 121, 2, 1404, 1405, 9, 8, 2, 2, 1405, 1407, 5, 240, 121, 2, 1406, 1404, 3, 2, 2, 2, 1407, 1410, 3, 2, 2, 2, 1408, 1406, 3, 2, 2, 2, 1408, 1409, 3, 2, 2, 2, 1409, 239, 3, 2, 2, 2, 1410, 1408, 3, 2, 2, 2, 1411, 1414, 5, 180, 91, 2, 1412, 1414, 5, 242, 122, 2, 1413, 1411, 3, 2, 2, 2, 1413, 1412, 3, 2, 2, 2, 1414, 241, 3, 2, 2, 2, 1415, 1418, 5, 250, 126, 2, 1416, 1418, 5, 244, 123, 2, 1417, 1415, 3, 2, 2, 2, 1417, 1416, 3, 2, 2, 2, 1418, 1419, 3, 2, 2, 2, 1419, 1420, 5, 266, 134, 2, 1420, 243, 3, 2, 2, 2, 1421, 1422, 5, 246, 124, 2, 1422, 1423, 5, 256, 129, 2, 1423, 1426, 3, 2, 2, 2, 1424, 1426, 5, 248, 125, 2, 1425, 1421, 3, 2, 2, 2, 1425, 1424, 3, 2, 2, 2, 1426, 245, 3, 2, 2, 2, 1427, 1428, 9, 9, 2, 2, 1428, 1429, 7, 19, 2, 2, 1429, 1430, 7, 19, 2, 2, 1430, 247, 3, 2, 2, 2, 1431, 1433, 7, 139, 2, 2, 1432, 1431, 3, 2, 2, 2, 1432, 1433, 3, 2, 2, 2, 1433, 1434, 3, 2, 2, 2, 1434, 1435, 5, 256, 129, 2, 1435, 249, 3, 2, 2, 2, 1436, 1437, 5, 252, 127, 2, 1437, 1438, 5, 256, 129, 2, 1438, 1441, 3, 2, 2, 2, 1439, 1441, 5, 254, 128, 2, 1440, 1436, 3, 2, 2, 2, 1440, 1439, 3, 2, 2, 2, 1441, 251, 3, 2, 2, 2, 1442, 1443, 9, 10, 2, 2, 1443, 1444, 7, 19, 2, 2, 1444, 1445, 7, 19, 2, 2, 1445, 253, 3, 2, 2, 2, 1446, 1447, 7, 58, 2, 2, 1447, 255, 3, 2, 2, 2, 1448, 1451, 5, 258, 130, 2, 1449, 1451, 5, 272, 137, 2, 1450, 1448, 3, 2, 2, 2, 1450, 1449, 3, 2, 2, 2, 1451, 257, 3, 2, 2, 2, 1452, 1455, 5, 74, 38, 2, 1453, 1455, 5, 260, 131, 2, 1454, 1452, 3, 2, 2, 2, 1454, 1453, 3, 2, 2, 2, 1455, 259, 3, 2, 2, 2, 1456, 1460, 7, 12, 2, 2, 1457, 1460, 5, 262, 132, 2, 1458, 1460, 5, 264, 133, 2, 1459, 1456, 3, 2, 2, 2, 1459, 1457, 3, 2, 2, 2, 1459, 1458, 3, 2, 2, 2, 1460, 261, 3, 2, 2, 2, 1461, 1462, 7, 178, 2, 2, 1462, 1463, 7, 19, 2, 2, 1463, 1464, 7, 12, 2, 2, 1464, 263, 3, 2, 2, 2, 1465, 1466, 7, 12, 2, 2, 1466, 1467, 7, 19, 2, 2, 1467, 1468, 7, 178, 2, 2, 1468, 265, 3, 2, 2, 2, 1469, 1471, 5, 186, 94, 2, 1470, 1469, 3, 2, 2, 2, 1471, 1474, 3, 2, 2, 2, 1472, 1470, 3, 2, 2, 2, 1472, 1473, 3, 2, 2, 2, 1473, 267, 3, 2, 2, 2, 1474, 1472, 3, 2, 2, 2, 1475, 1487, 5, 74, 38, 2, 1476, 1487, 7, 171, 2, 2, 1477, 1487, 5, 272, 137, 2, 1478, 1479, 7, 113, 2, 2, 1479, 1480, 7, 10, 2, 2, 1480, 1487, 7, 11, 2, 2, 1481, 1487, 5, 342, 172, 2, 1482, 1487, 5, 310, 156, 2, 1483, 1487, 5, 316, 159, 2, 1484, 1487, 5, 270, 136, 2, 1485, 1487, 5, 322, 162, 2, 1486, 1475, 3, 2, 2, 2, 1486, 1476, 3, 2, 2, 2, 1486, 1477, 3, 2, 2, 2, 1486, 1478, 3, 2, 2, 2, 1486, 1481, 3, 2, 2, 2, 1486, 1482, 3, 2, 2, 2, 1486, 1483, 3, 2, 2, 2, 1486, 1484, 3, 2, 2, 2, 1486, 1485, 3, 2, 2, 2, 1487, 269, 3, 2, 2, 2, 1488, 1489, 5, 74, 38, 2, 1489, 271, 3, 2, 2, 2, 1490, 1503, 5, 278, 140, 2, 1491, 1503, 5, 294, 148, 2, 1492, 1503, 5, 288, 145, 2, 1493, 1503, 5, 298, 150, 2, 1494, 1503, 5, 292, 147, 2, 1495, 1503, 5, 286, 144, 2, 1496, 1503, 5, 282, 142, 2, 1497, 1503, 5, 280, 141, 2, 1498, 1503, 5, 284, 143, 2, 1499, 1503, 5, 326, 164, 2, 1500, 1503, 5, 276, 139, 2, 1501, 1503, 5, 274, 138, 2, 1502, 1490, 3, 2, 2, 2, 1502, 1491, 3, 2, 2, 2, 1502, 1492, 3, 2, 2, 2, 1502, 1493, 3, 2, 2, 2, 1502, 1494, 3, 2, 2, 2, 1502, 1495, 3, 2, 2, 2, 1502, 1496, 3, 2, 2, 2, 1502, 1497, 3, 2, 2, 2, 1502, 1498, 3, 2, 2, 2, 1502, 1499, 3, 2, 2, 2, 1502, 1500, 3, 2, 2, 2, 1502, 1501, 3, 2, 2, 2, 1503, 273, 3, 2, 2, 2, 1504, 1505, 7, 152, 2, 2, 1505, 1507, 7, 10, 2, 2, 1506, 1508, 7, 12, 2, 2, 1507, 1506, 3, 2, 2, 2, 1507, 1508, 3, 2, 2, 2, 1508, 1509, 3, 2, 2, 2, 1509, 1510, 7, 11, 2, 2, 1510, 275, 3, 2, 2, 2, 1511, 1512, 7, 153, 2, 2, 1512, 1513, 7, 10, 2, 2, 1513, 1514, 7, 11, 2, 2, 1514, 277, 3, 2, 2, 2, 1515, 1516, 7, 155, 2, 2, 1516, 1519, 7, 10, 2, 2, 1517, 1520, 5, 294, 148, 2, 1518, 1520, 5, 298, 150, 2, 1519, 1517, 3, 2, 2, 2, 1519, 1518, 3, 2, 2, 2, 1519, 1520, 3, 2, 2, 2, 1520, 1521, 3, 2, 2, 2, 1521, 1522, 7, 11, 2, 2, 1522, 279, 3, 2, 2, 2, 1523, 1524, 7, 156, 2, 2, 1524, 1525, 7, 10, 2, 2, 1525, 1526, 7, 11, 2, 2, 1526, 281, 3, 2, 2, 2, 1527, 1528, 7, 166, 2, 2, 1528, 1529, 7, 10, 2, 2, 1529, 1530, 7, 11, 2, 2, 1530, 283, 3, 2, 2, 2, 1531, 1532, 7, 158, 2, 2, 1532, 1533, 7, 10, 2, 2, 1533, 1534, 7, 11, 2, 2, 1534, 285, 3, 2, 2, 2, 1535, 1536, 7, 157, 2, 2, 1536, 1539, 7, 10, 2, 2, 1537, 1540, 7, 178, 2, 2, 1538, 1540, 5, 356, 179, 2, 1539, 1537, 3, 2, 2, 2, 1539, 1538, 3, 2, 2, 2, 1539, 1540, 3, 2, 2, 2, 1540, 1541, 3, 2, 2, 2, 1541, 1542, 7, 11, 2, 2, 1542, 287, 3, 2, 2, 2, 1543, 1544, 7, 142, 2, 2, 1544, 1550, 7, 10, 2, 2, 1545, 1548, 5, 290, 146, 2, 1546, 1547, 7, 15, 2, 2, 1547, 1549, 5, 308, 155, 2, 1548, 1546, 3, 2, 2, 2, 1548, 1549, 3, 2, 2, 2, 1549, 1551, 3, 2, 2, 2, 1550, 1545, 3, 2, 2, 2, 1550, 1551, 3, 2, 2, 2, 1551, 1552, 3, 2, 2, 2, 1552, 1553, 7, 11, 2, 2, 1553, 289, 3, 2, 2, 2, 1554, 1557, 5, 302, 152, 2, 1555, 1557, 7, 12, 2, 2, 1556, 1554, 3, 2, 2, 2, 1556, 1555, 3, 2, 2, 2, 1557, 291, 3, 2, 2, 2, 1558, 1559, 7, 159, 2, 2, 1559, 1560, 7, 10, 2, 2, 1560, 1561, 5, 324, 163, 2, 1561, 1562, 7, 11, 2, 2, 1562, 293, 3, 2, 2, 2, 1563, 1564, 7, 136, 2, 2, 1564, 1573, 7, 10, 2, 2, 1565, 1571, 5, 296, 149, 2, 1566, 1567, 7, 15, 2, 2, 1567, 1569, 5, 308, 155, 2, 1568, 1570, 7, 170, 2, 2, 1569, 1568, 3, 2, 2, 2, 1569, 1570, 3, 2, 2, 2, 1570, 1572, 3, 2, 2, 2, 1571, 1566, 3, 2, 2, 2, 1571, 1572, 3, 2, 2, 2, 1572, 1574, 3, 2, 2, 2, 1573, 1565, 3, 2, 2, 2, 1573, 1574, 3, 2, 2, 2, 1574, 1575, 3, 2, 2, 2, 1575, 1576, 7, 11, 2, 2, 1576, 295, 3, 2, 2, 2, 1577, 1580, 5, 304, 153, 2, 1578, 1580, 7, 12, 2, 2, 1579, 1577, 3, 2, 2, 2, 1579, 1578, 3, 2, 2, 2, 1580, 297, 3, 2, 2, 2, 1581, 1582, 7, 160, 2, 2, 1582, 1583, 7, 10, 2, 2, 1583, 1584, 5, 300, 151, 2, 1584, 1585, 7, 11, 2, 2, 1585, 299, 3, 2, 2, 2, 1586, 1587, 5, 304, 153, 2, 1587, 301, 3, 2, 2, 2, 1588, 1589, 5, 74, 38, 2, 1589, 303, 3, 2, 2, 2, 1590, 1591, 5, 74, 38, 2, 1591, 305, 3, 2, 2, 2, 1592, 1593, 5, 308, 155, 2, 1593, 307, 3, 2, 2, 2, 1594, 1595, 5, 74, 38, 2, 1595, 309, 3, 2, 2, 2, 1596, 1599, 5, 312, 157, 2, 1597, 1599, 5, 314, 158, 2, 1598, 1596, 3, 2, 2, 2, 1598, 1597, 3, 2, 2, 2, 1599, 311, 3, 2, 2, 2, 1600, 1601, 7, 168, 2, 2, 1601, 1602, 7, 10, 2, 2, 1602, 1603, 7, 12, 2, 2, 1603, 1604, 7, 11, 2, 2, 1604, 313, 3, 2, 2, 2, 1605, 1606, 7, 168, 2, 2, 1606, 1607, 7, 10, 2, 2, 1607, 1608, 5, 74, 38, 2, 1608, 1609, 7, 15, 2, 2, 1609, 1610, 5, 338, 170, 2, 1610, 1611, 7, 11, 2, 2, 1611, 315, 3, 2, 2, 2, 1612, 1615, 5, 318, 160, 2, 1613, 1615, 5, 320, 161, 2, 1614, 1612, 3, 2, 2, 2, 1614, 1613, 3, 2, 2, 2, 1615, 317, 3, 2, 2, 2, 1616, 1617, 7, 167, 2, 2, 1617, 1618, 7, 10, 2, 2, 1618, 1619, 7, 12, 2, 2, 1619, 1620, 7, 11, 2, 2, 1620, 319, 3, 2, 2, 2, 1621, 1622, 7, 167, 2, 2, 1622, 1623, 7, 10, 2, 2, 1623, 1624, 5, 338, 170, 2, 1624, 1625, 7, 11, 2, 2, 1625, 321, 3, 2, 2, 2, 1626, 1627, 7, 10, 2, 2, 1627, 1628, 5, 268, 135, 2, 1628, 1629, 7, 11, 2, 2, 1629, 323, 3, 2, 2, 2, 1630, 1631, 5, 302, 152, 2, 1631, 325, 3, 2, 2, 2, 1632, 1638, 5, 328, 165, 2, 1633, 1638, 5, 330, 166, 2, 1634, 1638, 5, 332, 167, 2, 1635, 1638, 5, 334, 168, 2, 1636, 1638, 5, 336, 169, 2, 1637, 1632, 3, 2, 2, 2, 1637, 1633, 3, 2, 2, 2, 1637, 1634, 3, 2, 2, 2, 1637, 1635, 3, 2, 2, 2, 1637, 1636, 3, 2, 2, 2, 1638, 327, 3, 2, 2, 2, 1639, 1640, 7, 161, 2, 2, 1640, 1642, 7, 10, 2, 2, 1641, 1643, 5, 356, 179, 2, 1642, 1641, 3, 2, 2, 2, 1642, 1643, 3, 2, 2, 2, 1643, 1644, 3, 2, 2, 2, 1644, 1645, 7, 11, 2, 2, 1645, 329, 3, 2, 2, 2, 1646, 1647, 7, 165, 2, 2, 1647, 1649, 7, 10, 2, 2, 1648, 1650, 5, 356, 179, 2, 1649, 1648, 3, 2, 2, 2, 1649, 1650, 3, 2, 2, 2, 1650, 1651, 3, 2, 2, 2, 1651, 1652, 7, 11, 2, 2, 1652, 331, 3, 2, 2, 2, 1653, 1654, 7, 164, 2, 2, 1654, 1656, 7, 10, 2, 2, 1655, 1657, 5, 356, 179, 2, 1656, 1655, 3, 2, 2, 2, 1656, 1657, 3, 2, 2, 2, 1657, 1658, 3, 2, 2, 2, 1658, 1659, 7, 11, 2, 2, 1659, 333, 3, 2, 2, 2, 1660, 1661, 7, 162, 2, 2, 1661, 1663, 7, 10, 2, 2, 1662, 1664, 5, 356, 179, 2, 1663, 1662, 3, 2, 2, 2, 1663, 1664, 3, 2, 2, 2, 1664, 1665, 3, 2, 2, 2, 1665, 1666, 7, 11, 2, 2, 1666, 335, 3, 2, 2, 2, 1667, 1668, 7, 163, 2, 2, 1668, 1670, 7, 10, 2, 2, 1669, 1671, 5, 356, 179, 2, 1670, 1669, 3, 2, 2, 2, 1670, 1671, 3, 2, 2, 2, 1671, 1672, 3, 2, 2, 2, 1672, 1673, 7, 11, 2, 2, 1673, 337, 3, 2, 2, 2, 1674, 1675, 7, 10, 2, 2, 1675, 1683, 7, 11, 2, 2, 1676, 1680, 5, 268, 135, 2, 1677, 1681, 7, 170, 2, 2, 1678, 1681, 7, 12, 2, 2, 1679, 1681, 7, 47, 2, 2, 1680, 1677, 3, 2, 2, 2, 1680, 1678, 3, 2, 2, 2, 1680, 1679, 3, 2, 2, 2, 1680, 1681, 3, 2, 2, 2, 1681, 1683, 3, 2, 2, 2, 1682, 1674, 3, 2, 2, 2, 1682, 1676, 3, 2, 2, 2, 1683, 339, 3, 2, 2, 2, 1684, 1693, 7, 8, 2, 2, 1685, 1690, 5, 350, 176, 2, 1686, 1687, 7, 15, 2, 2, 1687, 1689, 5, 350, 176, 2, 1688, 1686, 3, 2, 2, 2, 1689, 1692, 3, 2, 2, 2, 1690, 1688, 3, 2, 2, 2, 1690, 1691, 3, 2, 2, 2, 1691, 1694, 3, 2, 2, 2, 1692, 1690, 3, 2, 2, 2, 1693, 1685, 3, 2, 2, 2, 1693, 1694, 3, 2, 2, 2, 1694, 1695, 3, 2, 2, 2, 1695, 1701, 7, 9, 2, 2, 1696, 1697, 7, 59, 2, 2, 1697, 1698, 5, 94, 48, 2, 1698, 1699, 7, 60, 2, 2, 1699, 1701, 3, 2, 2, 2, 1700, 1684, 3, 2, 2, 2, 1700, 1696, 3, 2, 2, 2, 1701, 341, 3, 2, 2, 2, 1702, 1705, 5, 344, 173, 2, 1703, 1705, 5, 346, 174, 2, 1704, 1702, 3, 2, 2, 2, 1704, 1703, 3, 2, 2, 2, 1705, 343, 3, 2, 2, 2, 1706, 1707, 7, 31, 2, 2, 1707, 1708, 7, 10, 2, 2, 1708, 1709, 7, 12, 2, 2, 1709, 1710, 7, 11, 2, 2, 1710, 345, 3, 2, 2, 2, 1711, 1712, 7, 31, 2, 2, 1712, 1721, 7, 10, 2, 2, 1713, 1718, 5, 338, 170, 2, 1714, 1715, 7, 15, 2, 2, 1715, 1717, 5, 338, 170, 2, 1716, 1714, 3, 2, 2, 2, 1717, 1720, 3, 2, 2, 2, 1718, 1716, 3, 2, 2, 2, 1718, 1719, 3, 2, 2, 2, 1719, 1722, 3, 2, 2, 2, 1720, 1718, 3, 2, 2, 2, 1721, 1713, 3, 2, 2, 2, 1721, 1722, 3, 2, 2, 2, 1722, 1723, 3, 2, 2, 2, 1723, 1724, 7, 11, 2, 2, 1724, 1725, 7, 70, 2, 2, 1725, 1726, 5, 338, 170, 2, 1726, 347, 3, 2, 2, 2, 1727, 1729, 5, 268, 135, 2, 1728, 1730, 7, 170, 2, 2, 1729, 1728, 3, 2, 2, 2, 1729, 1730, 3, 2, 2, 2, 1730, 349, 3, 2, 2, 2, 1731, 1734, 5, 96, 49, 2, 1732, 1734, 7, 178, 2, 2, 1733, 1731, 3, 2, 2, 2, 1733, 1732, 3, 2, 2, 2, 1734, 1735, 3, 2, 2, 2, 1735, 1736, 9, 11, 2, 2, 1736, 1737, 5, 96, 49, 2, 1737, 351, 3, 2, 2, 2, 1738, 1740, 7, 53, 2, 2, 1739, 1741, 5, 94, 48, 2, 1740, 1739, 3, 2, 2, 2, 1740, 1741, 3, 2, 2, 2, 1741, 1742, 3, 2, 2, 2, 1742, 1743, 7, 54, 2, 2, 1743, 353, 3, 2, 2, 2, 1744, 1745, 5, 356, 179, 2, 1745, 355, 3, 2, 2, 2, 1746, 1747, 7, 169, 2, 2, 1747, 357, 3, 2, 2, 2, 1748, 1749, 9, 12, 2, 2, 1749, 359, 3, 2, 2, 2, 169, 368, 372, 388, 394, 402, 410, 418, 433, 463, 471, 473, 495, 505, 515, 520, 525, 529, 541, 545, 554, 561, 575, 579, 584, 594, 602, 606, 618, 630, 652, 660, 665, 668, 672, 681, 690, 693, 701, 708, 710, 717, 724, 726, 734, 739, 746, 753, 763, 770, 777, 784, 793, 803, 807, 815, 817, 829, 835, 839, 843, 854, 860, 875, 881, 885, 889, 896, 903, 909, 914, 916, 920, 927, 934, 943, 955, 965, 977, 981, 990, 997, 1019, 1024, 1029, 1033, 1045, 1053, 1057, 1064, 1071, 1077, 1084, 1092, 1099, 1105, 1111, 1117, 1123, 1134, 1140, 1145, 1153, 1174, 1183, 1185, 1208, 1225, 1236, 1258, 1262, 1269, 1273, 1283, 1288, 1302, 1311, 1317, 1344, 1361, 1363, 1372, 1381, 1384, 1392, 1396, 1401, 1408, 1413, 1417, 1425, 1432, 1440, 1450, 1454, 1459, 1472, 1486, 1502, 1507, 1519, 1539, 1548, 1550, 1556, 1569, 1571, 1573, 1579, 1598, 1614, 1637, 1642, 1649, 1656, 1663, 1670, 1680, 1682, 1690, 1693, 1700, 1704, 1718, 1721, 1729, 1733, 1740] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 180, 1748, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 369, 10, 3, 3, 3, 3, 3, 5, 3, 373, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 389, 10, 6, 3, 6, 3, 6, 7, 6, 393, 10, 6, 12, 6, 14, 6, 396, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 401, 10, 6, 12, 6, 14, 6, 404, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 409, 10, 8, 12, 8, 14, 8, 412, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 419, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 434, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 464, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 472, 10, 18, 12, 18, 14, 18, 475, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 494, 10, 20, 13, 20, 14, 20, 495, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 504, 10, 21, 13, 21, 14, 21, 505, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 514, 10, 22, 13, 22, 14, 22, 515, 3, 23, 3, 23, 3, 23, 5, 23, 521, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 526, 10, 23, 7, 23, 528, 10, 23, 12, 23, 14, 23, 531, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 540, 10, 24, 13, 24, 14, 24, 541, 3, 24, 3, 24, 5, 24, 546, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 555, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 560, 10, 25, 12, 25, 14, 25, 563, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 574, 10, 26, 12, 26, 14, 26, 577, 11, 26, 3, 26, 5, 26, 580, 10, 26, 3, 27, 7, 27, 583, 10, 27, 12, 27, 14, 27, 586, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 593, 10, 28, 12, 28, 14, 28, 596, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 603, 10, 29, 3, 29, 3, 29, 5, 29, 607, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 619, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 631, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 653, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 659, 10, 37, 12, 37, 14, 37, 662, 11, 37, 3, 38, 3, 38, 5, 38, 666, 10, 38, 3, 38, 5, 38, 669, 10, 38, 3, 38, 3, 38, 5, 38, 673, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 682, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 689, 10, 40, 12, 40, 14, 40, 692, 11, 40, 5, 40, 694, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 702, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 709, 10, 41, 5, 41, 711, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 718, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 725, 10, 42, 5, 42, 727, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 735, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 740, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 747, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 754, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 764, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 769, 10, 46, 12, 46, 14, 46, 772, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 778, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 783, 10, 48, 12, 48, 14, 48, 786, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 794, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 804, 10, 50, 3, 51, 3, 51, 5, 51, 808, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 816, 10, 51, 12, 51, 14, 51, 819, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 828, 10, 52, 12, 52, 14, 52, 831, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 836, 10, 53, 3, 53, 3, 53, 5, 53, 840, 10, 53, 3, 53, 3, 53, 5, 53, 844, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 853, 10, 54, 12, 54, 14, 54, 856, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 861, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 874, 10, 57, 12, 57, 14, 57, 877, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 882, 10, 58, 3, 58, 3, 58, 5, 58, 886, 10, 58, 3, 58, 3, 58, 5, 58, 890, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 897, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 902, 10, 59, 12, 59, 14, 59, 905, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 910, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 915, 10, 60, 5, 60, 917, 10, 60, 3, 60, 3, 60, 5, 60, 921, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 928, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 933, 10, 62, 12, 62, 14, 62, 936, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 944, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 954, 10, 64, 13, 64, 14, 64, 955, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 964, 10, 65, 13, 65, 14, 65, 965, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 976, 10, 66, 13, 66, 14, 66, 977, 3, 66, 3, 66, 5, 66, 982, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 991, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 996, 10, 67, 12, 67, 14, 67, 999, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 1018, 10, 69, 13, 69, 14, 69, 1019, 3, 70, 3, 70, 3, 70, 5, 70, 1025, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 1030, 10, 70, 7, 70, 1032, 10, 70, 12, 70, 14, 70, 1035, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 1044, 10, 71, 12, 71, 14, 71, 1047, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 1052, 10, 72, 12, 72, 14, 72, 1055, 11, 72, 3, 73, 5, 73, 1058, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 1065, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 1070, 10, 75, 12, 75, 14, 75, 1073, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 1078, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 1083, 10, 77, 12, 77, 14, 77, 1086, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 1091, 10, 78, 12, 78, 14, 78, 1094, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 1100, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1106, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1112, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1118, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1124, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1133, 10, 84, 12, 84, 14, 84, 1136, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1141, 10, 85, 3, 86, 7, 86, 1144, 10, 86, 12, 86, 14, 86, 1147, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1154, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1173, 10, 90, 12, 90, 14, 90, 1176, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1184, 10, 91, 12, 91, 14, 91, 1187, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1209, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1226, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1237, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1259, 10, 104, 7, 104, 1261, 10, 104, 12, 104, 14, 104, 1264, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1270, 10, 105, 3, 106, 3, 106, 5, 106, 1274, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1284, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1289, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1303, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1310, 10, 109, 12, 109, 14, 109, 1313, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1318, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1343, 10, 113, 12, 113, 14, 113, 1346, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1362, 10, 115, 13, 115, 14, 115, 1363, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 5, 117, 1373, 10, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 7, 117, 1380, 10, 117, 12, 117, 14, 117, 1383, 11, 117, 5, 117, 1385, 10, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 5, 118, 1393, 10, 118, 3, 119, 3, 119, 5, 119, 1397, 10, 119, 3, 119, 3, 119, 3, 119, 5, 119, 1402, 10, 119, 3, 120, 3, 120, 3, 120, 7, 120, 1407, 10, 120, 12, 120, 14, 120, 1410, 11, 120, 3, 121, 3, 121, 5, 121, 1414, 10, 121, 3, 122, 3, 122, 5, 122, 1418, 10, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 5, 123, 1426, 10, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 5, 125, 1433, 10, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 5, 126, 1441, 10, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 129, 3, 129, 5, 129, 1451, 10, 129, 3, 130, 3, 130, 5, 130, 1455, 10, 130, 3, 131, 3, 131, 3, 131, 5, 131, 1460, 10, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 7, 134, 1471, 10, 134, 12, 134, 14, 134, 1474, 11, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 5, 135, 1487, 10, 135, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 5, 137, 1503, 10, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 5, 140, 1517, 10, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 5, 144, 1537, 10, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 5, 145, 1546, 10, 145, 5, 145, 1548, 10, 145, 3, 145, 3, 145, 3, 146, 3, 146, 5, 146, 1554, 10, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 5, 148, 1567, 10, 148, 5, 148, 1569, 10, 148, 5, 148, 1571, 10, 148, 3, 148, 3, 148, 3, 149, 3, 149, 5, 149, 1577, 10, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 153, 3, 153, 3, 154, 3, 154, 3, 155, 3, 155, 3, 156, 3, 156, 5, 156, 1596, 10, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 5, 159, 1612, 10, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 5, 164, 1635, 10, 164, 3, 165, 3, 165, 3, 165, 5, 165, 1640, 10, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 5, 166, 1647, 10, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 5, 167, 1654, 10, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 5, 168, 1661, 10, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 5, 169, 1668, 10, 169, 3, 169, 3, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 5, 170, 1678, 10, 170, 5, 170, 1680, 10, 170, 3, 171, 3, 171, 3, 171, 3, 171, 7, 171, 1686, 10, 171, 12, 171, 14, 171, 1689, 11, 171, 5, 171, 1691, 10, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 5, 171, 1698, 10, 171, 3, 172, 3, 172, 5, 172, 1702, 10, 172, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 7, 174, 1714, 10, 174, 12, 174, 14, 174, 1717, 11, 174, 5, 174, 1719, 10, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 175, 3, 175, 5, 175, 1727, 10, 175, 3, 176, 3, 176, 5, 176, 1731, 10, 176, 3, 176, 3, 176, 3, 176, 3, 177, 3, 177, 5, 177, 1738, 10, 177, 3, 177, 3, 177, 3, 178, 3, 178, 3, 179, 3, 179, 3, 180, 3, 180, 3, 180, 2, 2, 181, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 2, 13, 4, 2, 17, 17, 105, 105, 3, 2, 82, 83, 3, 2, 20, 29, 4, 2, 5, 5, 35, 45, 3, 2, 47, 48, 4, 2, 12, 12, 49, 51, 3, 2, 137, 138, 3, 2, 140, 146, 3, 2, 147, 151, 4, 2, 19, 19, 170, 170, 4, 2, 61, 132, 171, 171, 2, 1818, 2, 360, 3, 2, 2, 2, 4, 368, 3, 2, 2, 2, 6, 374, 3, 2, 2, 2, 8, 377, 3, 2, 2, 2, 10, 394, 3, 2, 2, 2, 12, 405, 3, 2, 2, 2, 14, 410, 3, 2, 2, 2, 16, 413, 3, 2, 2, 2, 18, 416, 3, 2, 2, 2, 20, 433, 3, 2, 2, 2, 22, 435, 3, 2, 2, 2, 24, 438, 3, 2, 2, 2, 26, 444, 3, 2, 2, 2, 28, 448, 3, 2, 2, 2, 30, 452, 3, 2, 2, 2, 32, 456, 3, 2, 2, 2, 34, 463, 3, 2, 2, 2, 36, 479, 3, 2, 2, 2, 38, 488, 3, 2, 2, 2, 40, 503, 3, 2, 2, 2, 42, 510, 3, 2, 2, 2, 44, 517, 3, 2, 2, 2, 46, 534, 3, 2, 2, 2, 48, 550, 3, 2, 2, 2, 50, 567, 3, 2, 2, 2, 52, 584, 3, 2, 2, 2, 54, 587, 3, 2, 2, 2, 56, 599, 3, 2, 2, 2, 58, 608, 3, 2, 2, 2, 60, 618, 3, 2, 2, 2, 62, 620, 3, 2, 2, 2, 64, 630, 3, 2, 2, 2, 66, 632, 3, 2, 2, 2, 68, 637, 3, 2, 2, 2, 70, 641, 3, 2, 2, 2, 72, 647, 3, 2, 2, 2, 74, 668, 3, 2, 2, 2, 76, 674, 3, 2, 2, 2, 78, 676, 3, 2, 2, 2, 80, 695, 3, 2, 2, 2, 82, 712, 3, 2, 2, 2, 84, 728, 3, 2, 2, 2, 86, 748, 3, 2, 2, 2, 88, 763, 3, 2, 2, 2, 90, 765, 3, 2, 2, 2, 92, 773, 3, 2, 2, 2, 94, 779, 3, 2, 2, 2, 96, 793, 3, 2, 2, 2, 98, 803, 3, 2, 2, 2, 100, 807, 3, 2, 2, 2, 102, 823, 3, 2, 2, 2, 104, 832, 3, 2, 2, 2, 106, 848, 3, 2, 2, 2, 108, 857, 3, 2, 2, 2, 110, 865, 3, 2, 2, 2, 112, 868, 3, 2, 2, 2, 114, 878, 3, 2, 2, 2, 116, 896, 3, 2, 2, 2, 118, 906, 3, 2, 2, 2, 120, 922, 3, 2, 2, 2, 122, 927, 3, 2, 2, 2, 124, 940, 3, 2, 2, 2, 126, 948, 3, 2, 2, 2, 128, 963, 3, 2, 2, 2, 130, 970, 3, 2, 2, 2, 132, 986, 3, 2, 2, 2, 134, 1003, 3, 2, 2, 2, 136, 1012, 3, 2, 2, 2, 138, 1021, 3, 2, 2, 2, 140, 1040, 3, 2, 2, 2, 142, 1048, 3, 2, 2, 2, 144, 1057, 3, 2, 2, 2, 146, 1061, 3, 2, 2, 2, 148, 1066, 3, 2, 2, 2, 150, 1074, 3, 2, 2, 2, 152, 1079, 3, 2, 2, 2, 154, 1087, 3, 2, 2, 2, 156, 1095, 3, 2, 2, 2, 158, 1101, 3, 2, 2, 2, 160, 1107, 3, 2, 2, 2, 162, 1113, 3, 2, 2, 2, 164, 1119, 3, 2, 2, 2, 166, 1125, 3, 2, 2, 2, 168, 1140, 3, 2, 2, 2, 170, 1145, 3, 2, 2, 2, 172, 1153, 3, 2, 2, 2, 174, 1155, 3, 2, 2, 2, 176, 1162, 3, 2, 2, 2, 178, 1169, 3, 2, 2, 2, 180, 1177, 3, 2, 2, 2, 182, 1188, 3, 2, 2, 2, 184, 1194, 3, 2, 2, 2, 186, 1197, 3, 2, 2, 2, 188, 1201, 3, 2, 2, 2, 190, 1225, 3, 2, 2, 2, 192, 1227, 3, 2, 2, 2, 194, 1231, 3, 2, 2, 2, 196, 1234, 3, 2, 2, 2, 198, 1240, 3, 2, 2, 2, 200, 1242, 3, 2, 2, 2, 202, 1247, 3, 2, 2, 2, 204, 1252, 3, 2, 2, 2, 206, 1255, 3, 2, 2, 2, 208, 1269, 3, 2, 2, 2, 210, 1273, 3, 2, 2, 2, 212, 1275, 3, 2, 2, 2, 214, 1279, 3, 2, 2, 2, 216, 1317, 3, 2, 2, 2, 218, 1319, 3, 2, 2, 2, 220, 1323, 3, 2, 2, 2, 222, 1329, 3, 2, 2, 2, 224, 1337, 3, 2, 2, 2, 226, 1352, 3, 2, 2, 2, 228, 1358, 3, 2, 2, 2, 230, 1365, 3, 2, 2, 2, 232, 1369, 3, 2, 2, 2, 234, 1392, 3, 2, 2, 2, 236, 1401, 3, 2, 2, 2, 238, 1403, 3, 2, 2, 2, 240, 1413, 3, 2, 2, 2, 242, 1417, 3, 2, 2, 2, 244, 1425, 3, 2, 2, 2, 246, 1427, 3, 2, 2, 2, 248, 1432, 3, 2, 2, 2, 250, 1440, 3, 2, 2, 2, 252, 1442, 3, 2, 2, 2, 254, 1446, 3, 2, 2, 2, 256, 1450, 3, 2, 2, 2, 258, 1454, 3, 2, 2, 2, 260, 1459, 3, 2, 2, 2, 262, 1461, 3, 2, 2, 2, 264, 1465, 3, 2, 2, 2, 266, 1472, 3, 2, 2, 2, 268, 1486, 3, 2, 2, 2, 270, 1488, 3, 2, 2, 2, 272, 1502, 3, 2, 2, 2, 274, 1504, 3, 2, 2, 2, 276, 1508, 3, 2, 2, 2, 278, 1512, 3, 2, 2, 2, 280, 1520, 3, 2, 2, 2, 282, 1524, 3, 2, 2, 2, 284, 1528, 3, 2, 2, 2, 286, 1532, 3, 2, 2, 2, 288, 1540, 3, 2, 2, 2, 290, 1553, 3, 2, 2, 2, 292, 1555, 3, 2, 2, 2, 294, 1560, 3, 2, 2, 2, 296, 1576, 3, 2, 2, 2, 298, 1578, 3, 2, 2, 2, 300, 1583, 3, 2, 2, 2, 302, 1585, 3, 2, 2, 2, 304, 1587, 3, 2, 2, 2, 306, 1589, 3, 2, 2, 2, 308, 1591, 3, 2, 2, 2, 310, 1595, 3, 2, 2, 2, 312, 1597, 3, 2, 2, 2, 314, 1602, 3, 2, 2, 2, 316, 1611, 3, 2, 2, 2, 318, 1613, 3, 2, 2, 2, 320, 1618, 3, 2, 2, 2, 322, 1623, 3, 2, 2, 2, 324, 1627, 3, 2, 2, 2, 326, 1634, 3, 2, 2, 2, 328, 1636, 3, 2, 2, 2, 330, 1643, 3, 2, 2, 2, 332, 1650, 3, 2, 2, 2, 334, 1657, 3, 2, 2, 2, 336, 1664, 3, 2, 2, 2, 338, 1679, 3, 2, 2, 2, 340, 1697, 3, 2, 2, 2, 342, 1701, 3, 2, 2, 2, 344, 1703, 3, 2, 2, 2, 346, 1708, 3, 2, 2, 2, 348, 1724, 3, 2, 2, 2, 350, 1730, 3, 2, 2, 2, 352, 1735, 3, 2, 2, 2, 354, 1741, 3, 2, 2, 2, 356, 1743, 3, 2, 2, 2, 358, 1745, 3, 2, 2, 2, 360, 361, 5, 4, 3, 2, 361, 362, 7, 2, 2, 3, 362, 3, 3, 2, 2, 2, 363, 364, 7, 104, 2, 2, 364, 365, 7, 103, 2, 2, 365, 366, 5, 356, 179, 2, 366, 367, 7, 3, 2, 2, 367, 369, 3, 2, 2, 2, 368, 363, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 373, 5, 8, 5, 2, 371, 373, 5, 6, 4, 2, 372, 370, 3, 2, 2, 2, 372, 371, 3, 2, 2, 2, 373, 5, 3, 2, 2, 2, 374, 375, 5, 10, 6, 2, 375, 376, 5, 12, 7, 2, 376, 7, 3, 2, 2, 2, 377, 378, 7, 4, 2, 2, 378, 379, 7, 135, 2, 2, 379, 380, 7, 178, 2, 2, 380, 381, 7, 5, 2, 2, 381, 382, 5, 354, 178, 2, 382, 383, 7, 3, 2, 2, 383, 384, 5, 10, 6, 2, 384, 9, 3, 2, 2, 2, 385, 389, 5, 60, 31, 2, 386, 389, 5, 62, 32, 2, 387, 389, 5, 78, 40, 2, 388, 385, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 388, 387, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 3, 2, 2, 391, 393, 3, 2, 2, 2, 392, 388, 3, 2, 2, 2, 393, 396, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 402, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 397, 398, 5, 64, 33, 2, 398, 399, 7, 3, 2, 2, 399, 401, 3, 2, 2, 2, 400, 397, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 11, 3, 2, 2, 2, 404, 402, 3, 2, 2, 2, 405, 406, 5, 18, 10, 2, 406, 13, 3, 2, 2, 2, 407, 409, 5, 20, 11, 2, 408, 407, 3, 2, 2, 2, 409, 412, 3, 2, 2, 2, 410, 408, 3, 2, 2, 2, 410, 411, 3, 2, 2, 2, 411, 15, 3, 2, 2, 2, 412, 410, 3, 2, 2, 2, 413, 414, 5, 14, 8, 2, 414, 415, 5, 94, 48, 2, 415, 17, 3, 2, 2, 2, 416, 418, 5, 14, 8, 2, 417, 419, 5, 94, 48, 2, 418, 417, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 19, 3, 2, 2, 2, 420, 434, 5, 22, 12, 2, 421, 434, 5, 24, 13, 2, 422, 434, 5, 26, 14, 2, 423, 434, 5, 28, 15, 2, 424, 434, 5, 30, 16, 2, 425, 434, 5, 32, 17, 2, 426, 434, 5, 34, 18, 2, 427, 434, 5, 36, 19, 2, 428, 434, 5, 38, 20, 2, 429, 434, 5, 42, 22, 2, 430, 434, 5, 46, 24, 2, 431, 434, 5, 54, 28, 2, 432, 434, 5, 58, 30, 2, 433, 420, 3, 2, 2, 2, 433, 421, 3, 2, 2, 2, 433, 422, 3, 2, 2, 2, 433, 423, 3, 2, 2, 2, 433, 424, 3, 2, 2, 2, 433, 425, 3, 2, 2, 2, 433, 426, 3, 2, 2, 2, 433, 427, 3, 2, 2, 2, 433, 428, 3, 2, 2, 2, 433, 429, 3, 2, 2, 2, 433, 430, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 432, 3, 2, 2, 2, 434, 21, 3, 2, 2, 2, 435, 436, 5, 98, 50, 2, 436, 437, 7, 3, 2, 2, 437, 23, 3, 2, 2, 2, 438, 439, 7, 6, 2, 2, 439, 440, 5, 74, 38, 2, 440, 441, 7, 7, 2, 2, 441, 442, 5, 96, 49, 2, 442, 443, 7, 3, 2, 2, 443, 25, 3, 2, 2, 2, 444, 445, 7, 8, 2, 2, 445, 446, 5, 14, 8, 2, 446, 447, 7, 9, 2, 2, 447, 27, 3, 2, 2, 2, 448, 449, 7, 127, 2, 2, 449, 450, 7, 128, 2, 2, 450, 451, 7, 3, 2, 2, 451, 29, 3, 2, 2, 2, 452, 453, 7, 129, 2, 2, 453, 454, 7, 128, 2, 2, 454, 455, 7, 3, 2, 2, 455, 31, 3, 2, 2, 2, 456, 457, 7, 130, 2, 2, 457, 458, 7, 131, 2, 2, 458, 459, 5, 96, 49, 2, 459, 460, 7, 3, 2, 2, 460, 33, 3, 2, 2, 2, 461, 464, 5, 102, 52, 2, 462, 464, 5, 106, 54, 2, 463, 461, 3, 2, 2, 2, 463, 462, 3, 2, 2, 2, 464, 473, 3, 2, 2, 2, 465, 472, 5, 102, 52, 2, 466, 472, 5, 106, 54, 2, 467, 472, 5, 110, 56, 2, 468, 472, 5, 112, 57, 2, 469, 472, 5, 116, 59, 2, 470, 472, 5, 120, 61, 2, 471, 465, 3, 2, 2, 2, 471, 466, 3, 2, 2, 2, 471, 467, 3, 2, 2, 2, 471, 468, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 470, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 477, 7, 67, 2, 2, 477, 478, 5, 20, 11, 2, 478, 35, 3, 2, 2, 2, 479, 480, 7, 68, 2, 2, 480, 481, 7, 10, 2, 2, 481, 482, 5, 94, 48, 2, 482, 483, 7, 11, 2, 2, 483, 484, 7, 89, 2, 2, 484, 485, 5, 20, 11, 2, 485, 486, 7, 90, 2, 2, 486, 487, 5, 20, 11, 2, 487, 37, 3, 2, 2, 2, 488, 489, 7, 84, 2, 2, 489, 490, 7, 10, 2, 2, 490, 491, 5, 94, 48, 2, 491, 493, 7, 11, 2, 2, 492, 494, 5, 40, 21, 2, 493, 492, 3, 2, 2, 2, 494, 495, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 495, 496, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 7, 88, 2, 2, 498, 499, 7, 67, 2, 2, 499, 500, 5, 20, 11, 2, 500, 39, 3, 2, 2, 2, 501, 502, 7, 85, 2, 2, 502, 504, 5, 96, 49, 2, 503, 501, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 503, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 7, 67, 2, 2, 508, 509, 5, 20, 11, 2, 509, 41, 3, 2, 2, 2, 510, 511, 7, 86, 2, 2, 511, 513, 5, 26, 14, 2, 512, 514, 5, 44, 23, 2, 513, 512, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 43, 3, 2, 2, 2, 517, 520, 7, 87, 2, 2, 518, 521, 7, 12, 2, 2, 519, 521, 5, 74, 38, 2, 520, 518, 3, 2, 2, 2, 520, 519, 3, 2, 2, 2, 521, 529, 3, 2, 2, 2, 522, 525, 7, 13, 2, 2, 523, 526, 7, 12, 2, 2, 524, 526, 5, 74, 38, 2, 525, 523, 3, 2, 2, 2, 525, 524, 3, 2, 2, 2, 526, 528, 3, 2, 2, 2, 527, 522, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 532, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 533, 5, 26, 14, 2, 533, 45, 3, 2, 2, 2, 534, 535, 7, 91, 2, 2, 535, 536, 7, 10, 2, 2, 536, 537, 5, 94, 48, 2, 537, 539, 7, 11, 2, 2, 538, 540, 5, 48, 25, 2, 539, 538, 3, 2, 2, 2, 540, 541, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 545, 7, 88, 2, 2, 544, 546, 5, 194, 98, 2, 545, 544, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 547, 3, 2, 2, 2, 547, 548, 7, 67, 2, 2, 548, 549, 5, 20, 11, 2, 549, 47, 3, 2, 2, 2, 550, 554, 7, 85, 2, 2, 551, 552, 5, 194, 98, 2, 552, 553, 7, 70, 2, 2, 553, 555, 3, 2, 2, 2, 554, 551, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 561, 5, 338, 170, 2, 557, 558, 7, 13, 2, 2, 558, 560, 5, 338, 170, 2, 559, 557, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 561, 562, 3, 2, 2, 2, 562, 564, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 564, 565, 7, 67, 2, 2, 565, 566, 5, 20, 11, 2, 566, 49, 3, 2, 2, 2, 567, 568, 7, 14, 2, 2, 568, 579, 5, 74, 38, 2, 569, 570, 7, 10, 2, 2, 570, 575, 7, 172, 2, 2, 571, 572, 7, 15, 2, 2, 572, 574, 7, 172, 2, 2, 573, 571, 3, 2, 2, 2, 574, 577, 3, 2, 2, 2, 575, 573, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 578, 3, 2, 2, 2, 577, 575, 3, 2, 2, 2, 578, 580, 7, 11, 2, 2, 579, 569, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 51, 3, 2, 2, 2, 581, 583, 5, 50, 26, 2, 582, 581, 3, 2, 2, 2, 583, 586, 3, 2, 2, 2, 584, 582, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 53, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 587, 588, 5, 52, 27, 2, 588, 589, 7, 114, 2, 2, 589, 594, 5, 56, 29, 2, 590, 591, 7, 15, 2, 2, 591, 593, 5, 56, 29, 2, 592, 590, 3, 2, 2, 2, 593, 596, 3, 2, 2, 2, 594, 592, 3, 2, 2, 2, 594, 595, 3, 2, 2, 2, 595, 597, 3, 2, 2, 2, 596, 594, 3, 2, 2, 2, 597, 598, 7, 3, 2, 2, 598, 55, 3, 2, 2, 2, 599, 602, 5, 194, 98, 2, 600, 601, 7, 70, 2, 2, 601, 603, 5, 338, 170, 2, 602, 600, 3, 2, 2, 2, 602, 603, 3, 2, 2, 2, 603, 606, 3, 2, 2, 2, 604, 605, 7, 7, 2, 2, 605, 607, 5, 96, 49, 2, 606, 604, 3, 2, 2, 2, 606, 607, 3, 2, 2, 2, 607, 57, 3, 2, 2, 2, 608, 609, 7, 132, 2, 2, 609, 610, 7, 10, 2, 2, 610, 611, 5, 94, 48, 2, 611, 612, 7, 11, 2, 2, 612, 613, 5, 20, 11, 2, 613, 59, 3, 2, 2, 2, 614, 619, 5, 66, 34, 2, 615, 619, 5, 68, 35, 2, 616, 619, 5, 70, 36, 2, 617, 619, 5, 72, 37, 2, 618, 614, 3, 2, 2, 2, 618, 615, 3, 2, 2, 2, 618, 616, 3, 2, 2, 2, 618, 617, 3, 2, 2, 2, 619, 61, 3, 2, 2, 2, 620, 621, 7, 111, 2, 2, 621, 622, 7, 135, 2, 2, 622, 623, 7, 178, 2, 2, 623, 624, 7, 5, 2, 2, 624, 625, 5, 354, 178, 2, 625, 63, 3, 2, 2, 2, 626, 631, 5, 84, 43, 2, 627, 631, 5, 80, 41, 2, 628, 631, 5, 86, 44, 2, 629, 631, 5, 82, 42, 2, 630, 626, 3, 2, 2, 2, 630, 627, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 630, 629, 3, 2, 2, 2, 631, 65, 3, 2, 2, 2, 632, 633, 7, 111, 2, 2, 633, 634, 7, 88, 2, 2, 634, 635, 7, 81, 2, 2, 635, 636, 5, 354, 178, 2, 636, 67, 3, 2, 2, 2, 637, 638, 7, 111, 2, 2, 638, 639, 7, 16, 2, 2, 639, 640, 9, 2, 2, 2, 640, 69, 3, 2, 2, 2, 641, 642, 7, 111, 2, 2, 642, 643, 7, 88, 2, 2, 643, 644, 7, 66, 2, 2, 644, 645, 7, 73, 2, 2, 645, 646, 9, 3, 2, 2, 646, 71, 3, 2, 2, 2, 647, 652, 7, 111, 2, 2, 648, 649, 7, 18, 2, 2, 649, 653, 5, 74, 38, 2, 650, 651, 7, 88, 2, 2, 651, 653, 7, 18, 2, 2, 652, 648, 3, 2, 2, 2, 652, 650, 3, 2, 2, 2, 653, 660, 3, 2, 2, 2, 654, 655, 5, 76, 39, 2, 655, 656, 7, 5, 2, 2, 656, 657, 5, 356, 179, 2, 657, 659, 3, 2, 2, 2, 658, 654, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 73, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 666, 7, 178, 2, 2, 664, 666, 5, 358, 180, 2, 665, 663, 3, 2, 2, 2, 665, 664, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 669, 7, 19, 2, 2, 668, 665, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 672, 3, 2, 2, 2, 670, 673, 7, 178, 2, 2, 671, 673, 5, 358, 180, 2, 672, 670, 3, 2, 2, 2, 672, 671, 3, 2, 2, 2, 673, 75, 3, 2, 2, 2, 674, 675, 9, 4, 2, 2, 675, 77, 3, 2, 2, 2, 676, 677, 7, 133, 2, 2, 677, 681, 7, 4, 2, 2, 678, 679, 7, 135, 2, 2, 679, 680, 7, 178, 2, 2, 680, 682, 7, 5, 2, 2, 681, 678, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 693, 5, 354, 178, 2, 684, 685, 7, 71, 2, 2, 685, 690, 5, 354, 178, 2, 686, 687, 7, 15, 2, 2, 687, 689, 5, 354, 178, 2, 688, 686, 3, 2, 2, 2, 689, 692, 3, 2, 2, 2, 690, 688, 3, 2, 2, 2, 690, 691, 3, 2, 2, 2, 691, 694, 3, 2, 2, 2, 692, 690, 3, 2, 2, 2, 693, 684, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 79, 3, 2, 2, 2, 695, 696, 7, 111, 2, 2, 696, 697, 5, 52, 27, 2, 697, 698, 7, 114, 2, 2, 698, 701, 5, 194, 98, 2, 699, 700, 7, 70, 2, 2, 700, 702, 5, 338, 170, 2, 701, 699, 3, 2, 2, 2, 701, 702, 3, 2, 2, 2, 702, 710, 3, 2, 2, 2, 703, 704, 7, 7, 2, 2, 704, 711, 5, 96, 49, 2, 705, 708, 7, 30, 2, 2, 706, 707, 7, 7, 2, 2, 707, 709, 5, 96, 49, 2, 708, 706, 3, 2, 2, 2, 708, 709, 3, 2, 2, 2, 709, 711, 3, 2, 2, 2, 710, 703, 3, 2, 2, 2, 710, 705, 3, 2, 2, 2, 711, 81, 3, 2, 2, 2, 712, 713, 7, 111, 2, 2, 713, 714, 7, 112, 2, 2, 714, 717, 7, 113, 2, 2, 715, 716, 7, 70, 2, 2, 716, 718, 5, 338, 170, 2, 717, 715, 3, 2, 2, 2, 717, 718, 3, 2, 2, 2, 718, 726, 3, 2, 2, 2, 719, 720, 7, 7, 2, 2, 720, 727, 5, 96, 49, 2, 721, 724, 7, 30, 2, 2, 722, 723, 7, 7, 2, 2, 723, 725, 5, 96, 49, 2, 724, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 727, 3, 2, 2, 2, 726, 719, 3, 2, 2, 2, 726, 721, 3, 2, 2, 2, 727, 83, 3, 2, 2, 2, 728, 729, 7, 111, 2, 2, 729, 730, 5, 52, 27, 2, 730, 731, 7, 31, 2, 2, 731, 732, 5, 74, 38, 2, 732, 734, 7, 10, 2, 2, 733, 735, 5, 90, 46, 2, 734, 733, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 739, 7, 11, 2, 2, 737, 738, 7, 70, 2, 2, 738, 740, 5, 338, 170, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 746, 3, 2, 2, 2, 741, 742, 7, 8, 2, 2, 742, 743, 5, 18, 10, 2, 743, 744, 7, 9, 2, 2, 744, 747, 3, 2, 2, 2, 745, 747, 7, 30, 2, 2, 746, 741, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 85, 3, 2, 2, 2, 748, 749, 7, 111, 2, 2, 749, 750, 7, 108, 2, 2, 750, 751, 5, 74, 38, 2, 751, 753, 7, 70, 2, 2, 752, 754, 5, 88, 45, 2, 753, 752, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 755, 3, 2, 2, 2, 755, 756, 5, 96, 49, 2, 756, 87, 3, 2, 2, 2, 757, 758, 7, 32, 2, 2, 758, 764, 7, 33, 2, 2, 759, 760, 7, 32, 2, 2, 760, 764, 7, 34, 2, 2, 761, 762, 7, 124, 2, 2, 762, 764, 7, 134, 2, 2, 763, 757, 3, 2, 2, 2, 763, 759, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 764, 89, 3, 2, 2, 2, 765, 770, 5, 92, 47, 2, 766, 767, 7, 15, 2, 2, 767, 769, 5, 92, 47, 2, 768, 766, 3, 2, 2, 2, 769, 772, 3, 2, 2, 2, 770, 768, 3, 2, 2, 2, 770, 771, 3, 2, 2, 2, 771, 91, 3, 2, 2, 2, 772, 770, 3, 2, 2, 2, 773, 774, 7, 6, 2, 2, 774, 777, 5, 74, 38, 2, 775, 776, 7, 70, 2, 2, 776, 778, 5, 338, 170, 2, 777, 775, 3, 2, 2, 2, 777, 778, 3, 2, 2, 2, 778, 93, 3, 2, 2, 2, 779, 784, 5, 96, 49, 2, 780, 781, 7, 15, 2, 2, 781, 783, 5, 96, 49, 2, 782, 780, 3, 2, 2, 2, 783, 786, 3, 2, 2, 2, 784, 782, 3, 2, 2, 2, 784, 785, 3, 2, 2, 2, 785, 95, 3, 2, 2, 2, 786, 784, 3, 2, 2, 2, 787, 794, 5, 98, 50, 2, 788, 794, 5, 100, 51, 2, 789, 794, 5, 126, 64, 2, 790, 794, 5, 130, 66, 2, 791, 794, 5, 134, 68, 2, 792, 794, 5, 136, 69, 2, 793, 787, 3, 2, 2, 2, 793, 788, 3, 2, 2, 2, 793, 789, 3, 2, 2, 2, 793, 790, 3, 2, 2, 2, 793, 791, 3, 2, 2, 2, 793, 792, 3, 2, 2, 2, 794, 97, 3, 2, 2, 2, 795, 804, 5, 122, 62, 2, 796, 804, 5, 140, 71, 2, 797, 804, 5, 216, 109, 2, 798, 804, 5, 218, 110, 2, 799, 804, 5, 220, 111, 2, 800, 804, 5, 222, 112, 2, 801, 804, 5, 224, 113, 2, 802, 804, 5, 226, 114, 2, 803, 795, 3, 2, 2, 2, 803, 796, 3, 2, 2, 2, 803, 797, 3, 2, 2, 2, 803, 798, 3, 2, 2, 2, 803, 799, 3, 2, 2, 2, 803, 800, 3, 2, 2, 2, 803, 801, 3, 2, 2, 2, 803, 802, 3, 2, 2, 2, 804, 99, 3, 2, 2, 2, 805, 808, 5, 102, 52, 2, 806, 808, 5, 106, 54, 2, 807, 805, 3, 2, 2, 2, 807, 806, 3, 2, 2, 2, 808, 817, 3, 2, 2, 2, 809, 816, 5, 102, 52, 2, 810, 816, 5, 106, 54, 2, 811, 816, 5, 110, 56, 2, 812, 816, 5, 112, 57, 2, 813, 816, 5, 116, 59, 2, 814, 816, 5, 120, 61, 2, 815, 809, 3, 2, 2, 2, 815, 810, 3, 2, 2, 2, 815, 811, 3, 2, 2, 2, 815, 812, 3, 2, 2, 2, 815, 813, 3, 2, 2, 2, 815, 814, 3, 2, 2, 2, 816, 819, 3, 2, 2, 2, 817, 815, 3, 2, 2, 2, 817, 818, 3, 2, 2, 2, 818, 820, 3, 2, 2, 2, 819, 817, 3, 2, 2, 2, 820, 821, 7, 67, 2, 2, 821, 822, 5, 96, 49, 2, 822, 101, 3, 2, 2, 2, 823, 824, 7, 61, 2, 2, 824, 829, 5, 104, 53, 2, 825, 826, 7, 15, 2, 2, 826, 828, 5, 104, 53, 2, 827, 825, 3, 2, 2, 2, 828, 831, 3, 2, 2, 2, 829, 827, 3, 2, 2, 2, 829, 830, 3, 2, 2, 2, 830, 103, 3, 2, 2, 2, 831, 829, 3, 2, 2, 2, 832, 835, 5, 194, 98, 2, 833, 834, 7, 70, 2, 2, 834, 836, 5, 338, 170, 2, 835, 833, 3, 2, 2, 2, 835, 836, 3, 2, 2, 2, 836, 839, 3, 2, 2, 2, 837, 838, 7, 72, 2, 2, 838, 840, 7, 73, 2, 2, 839, 837, 3, 2, 2, 2, 839, 840, 3, 2, 2, 2, 840, 843, 3, 2, 2, 2, 841, 842, 7, 71, 2, 2, 842, 844, 5, 194, 98, 2, 843, 841, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 845, 3, 2, 2, 2, 845, 846, 7, 69, 2, 2, 846, 847, 5, 96, 49, 2, 847, 105, 3, 2, 2, 2, 848, 849, 7, 62, 2, 2, 849, 854, 5, 108, 55, 2, 850, 851, 7, 15, 2, 2, 851, 853, 5, 108, 55, 2, 852, 850, 3, 2, 2, 2, 853, 856, 3, 2, 2, 2, 854, 852, 3, 2, 2, 2, 854, 855, 3, 2, 2, 2, 855, 107, 3, 2, 2, 2, 856, 854, 3, 2, 2, 2, 857, 860, 5, 194, 98, 2, 858, 859, 7, 70, 2, 2, 859, 861, 5, 338, 170, 2, 860, 858, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 862, 3, 2, 2, 2, 862, 863, 7, 7, 2, 2, 863, 864, 5, 96, 49, 2, 864, 109, 3, 2, 2, 2, 865, 866, 7, 63, 2, 2, 866, 867, 5, 96, 49, 2, 867, 111, 3, 2, 2, 2, 868, 869, 7, 64, 2, 2, 869, 870, 7, 65, 2, 2, 870, 875, 5, 114, 58, 2, 871, 872, 7, 15, 2, 2, 872, 874, 5, 114, 58, 2, 873, 871, 3, 2, 2, 2, 874, 877, 3, 2, 2, 2, 875, 873, 3, 2, 2, 2, 875, 876, 3, 2, 2, 2, 876, 113, 3, 2, 2, 2, 877, 875, 3, 2, 2, 2, 878, 885, 5, 194, 98, 2, 879, 880, 7, 70, 2, 2, 880, 882, 5, 338, 170, 2, 881, 879, 3, 2, 2, 2, 881, 882, 3, 2, 2, 2, 882, 883, 3, 2, 2, 2, 883, 884, 7, 7, 2, 2, 884, 886, 5, 96, 49, 2, 885, 881, 3, 2, 2, 2, 885, 886, 3, 2, 2, 2, 886, 889, 3, 2, 2, 2, 887, 888, 7, 81, 2, 2, 888, 890, 5, 354, 178, 2, 889, 887, 3, 2, 2, 2, 889, 890, 3, 2, 2, 2, 890, 115, 3, 2, 2, 2, 891, 892, 7, 66, 2, 2, 892, 897, 7, 65, 2, 2, 893, 894, 7, 75, 2, 2, 894, 895, 7, 66, 2, 2, 895, 897, 7, 65, 2, 2, 896, 891, 3, 2, 2, 2, 896, 893, 3, 2, 2, 2, 897, 898, 3, 2, 2, 2, 898, 903, 5, 118, 60, 2, 899, 900, 7, 15, 2, 2, 900, 902, 5, 118, 60, 2, 901, 899, 3, 2, 2, 2, 902, 905, 3, 2, 2, 2, 903, 901, 3, 2, 2, 2, 903, 904, 3, 2, 2, 2, 904, 117, 3, 2, 2, 2, 905, 903, 3, 2, 2, 2, 906, 909, 5, 96, 49, 2, 907, 910, 7, 76, 2, 2, 908, 910, 7, 77, 2, 2, 909, 907, 3, 2, 2, 2, 909, 908, 3, 2, 2, 2, 909, 910, 3, 2, 2, 2, 910, 916, 3, 2, 2, 2, 911, 914, 7, 73, 2, 2, 912, 915, 7, 82, 2, 2, 913, 915, 7, 83, 2, 2, 914, 912, 3, 2, 2, 2, 914, 913, 3, 2, 2, 2, 915, 917, 3, 2, 2, 2, 916, 911, 3, 2, 2, 2, 916, 917, 3, 2, 2, 2, 917, 920, 3, 2, 2, 2, 918, 919, 7, 81, 2, 2, 919, 921, 5, 354, 178, 2, 920, 918, 3, 2, 2, 2, 920, 921, 3, 2, 2, 2, 921, 119, 3, 2, 2, 2, 922, 923, 7, 74, 2, 2, 923, 924, 5, 194, 98, 2, 924, 121, 3, 2, 2, 2, 925, 928, 7, 78, 2, 2, 926, 928, 7, 79, 2, 2, 927, 925, 3, 2, 2, 2, 927, 926, 3, 2, 2, 2, 928, 929, 3, 2, 2, 2, 929, 934, 5, 124, 63, 2, 930, 931, 7, 15, 2, 2, 931, 933, 5, 124, 63, 2, 932, 930, 3, 2, 2, 2, 933, 936, 3, 2, 2, 2, 934, 932, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 937, 3, 2, 2, 2, 936, 934, 3, 2, 2, 2, 937, 938, 7, 80, 2, 2, 938, 939, 5, 96, 49, 2, 939, 123, 3, 2, 2, 2, 940, 943, 5, 194, 98, 2, 941, 942, 7, 70, 2, 2, 942, 944, 5, 338, 170, 2, 943, 941, 3, 2, 2, 2, 943, 944, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 946, 7, 69, 2, 2, 946, 947, 5, 96, 49, 2, 947, 125, 3, 2, 2, 2, 948, 949, 7, 84, 2, 2, 949, 950, 7, 10, 2, 2, 950, 951, 5, 94, 48, 2, 951, 953, 7, 11, 2, 2, 952, 954, 5, 128, 65, 2, 953, 952, 3, 2, 2, 2, 954, 955, 3, 2, 2, 2, 955, 953, 3, 2, 2, 2, 955, 956, 3, 2, 2, 2, 956, 957, 3, 2, 2, 2, 957, 958, 7, 88, 2, 2, 958, 959, 7, 67, 2, 2, 959, 960, 5, 96, 49, 2, 960, 127, 3, 2, 2, 2, 961, 962, 7, 85, 2, 2, 962, 964, 5, 96, 49, 2, 963, 961, 3, 2, 2, 2, 964, 965, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 967, 3, 2, 2, 2, 967, 968, 7, 67, 2, 2, 968, 969, 5, 96, 49, 2, 969, 129, 3, 2, 2, 2, 970, 971, 7, 91, 2, 2, 971, 972, 7, 10, 2, 2, 972, 973, 5, 94, 48, 2, 973, 975, 7, 11, 2, 2, 974, 976, 5, 132, 67, 2, 975, 974, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 975, 3, 2, 2, 2, 977, 978, 3, 2, 2, 2, 978, 979, 3, 2, 2, 2, 979, 981, 7, 88, 2, 2, 980, 982, 5, 194, 98, 2, 981, 980, 3, 2, 2, 2, 981, 982, 3, 2, 2, 2, 982, 983, 3, 2, 2, 2, 983, 984, 7, 67, 2, 2, 984, 985, 5, 96, 49, 2, 985, 131, 3, 2, 2, 2, 986, 990, 7, 85, 2, 2, 987, 988, 5, 194, 98, 2, 988, 989, 7, 70, 2, 2, 989, 991, 3, 2, 2, 2, 990, 987, 3, 2, 2, 2, 990, 991, 3, 2, 2, 2, 991, 992, 3, 2, 2, 2, 992, 997, 5, 338, 170, 2, 993, 994, 7, 13, 2, 2, 994, 996, 5, 338, 170, 2, 995, 993, 3, 2, 2, 2, 996, 999, 3, 2, 2, 2, 997, 995, 3, 2, 2, 2, 997, 998, 3, 2, 2, 2, 998, 1000, 3, 2, 2, 2, 999, 997, 3, 2, 2, 2, 1000, 1001, 7, 67, 2, 2, 1001, 1002, 5, 96, 49, 2, 1002, 133, 3, 2, 2, 2, 1003, 1004, 7, 68, 2, 2, 1004, 1005, 7, 10, 2, 2, 1005, 1006, 5, 94, 48, 2, 1006, 1007, 7, 11, 2, 2, 1007, 1008, 7, 89, 2, 2, 1008, 1009, 5, 96, 49, 2, 1009, 1010, 7, 90, 2, 2, 1010, 1011, 5, 96, 49, 2, 1011, 135, 3, 2, 2, 2, 1012, 1013, 7, 86, 2, 2, 1013, 1014, 7, 8, 2, 2, 1014, 1015, 5, 94, 48, 2, 1015, 1017, 7, 9, 2, 2, 1016, 1018, 5, 138, 70, 2, 1017, 1016, 3, 2, 2, 2, 1018, 1019, 3, 2, 2, 2, 1019, 1017, 3, 2, 2, 2, 1019, 1020, 3, 2, 2, 2, 1020, 137, 3, 2, 2, 2, 1021, 1024, 7, 87, 2, 2, 1022, 1025, 7, 12, 2, 2, 1023, 1025, 5, 74, 38, 2, 1024, 1022, 3, 2, 2, 2, 1024, 1023, 3, 2, 2, 2, 1025, 1033, 3, 2, 2, 2, 1026, 1029, 7, 13, 2, 2, 1027, 1030, 7, 12, 2, 2, 1028, 1030, 5, 74, 38, 2, 1029, 1027, 3, 2, 2, 2, 1029, 1028, 3, 2, 2, 2, 1030, 1032, 3, 2, 2, 2, 1031, 1026, 3, 2, 2, 2, 1032, 1035, 3, 2, 2, 2, 1033, 1031, 3, 2, 2, 2, 1033, 1034, 3, 2, 2, 2, 1034, 1036, 3, 2, 2, 2, 1035, 1033, 3, 2, 2, 2, 1036, 1037, 7, 8, 2, 2, 1037, 1038, 5, 94, 48, 2, 1038, 1039, 7, 9, 2, 2, 1039, 139, 3, 2, 2, 2, 1040, 1045, 5, 142, 72, 2, 1041, 1042, 7, 92, 2, 2, 1042, 1044, 5, 142, 72, 2, 1043, 1041, 3, 2, 2, 2, 1044, 1047, 3, 2, 2, 2, 1045, 1043, 3, 2, 2, 2, 1045, 1046, 3, 2, 2, 2, 1046, 141, 3, 2, 2, 2, 1047, 1045, 3, 2, 2, 2, 1048, 1053, 5, 144, 73, 2, 1049, 1050, 7, 93, 2, 2, 1050, 1052, 5, 144, 73, 2, 1051, 1049, 3, 2, 2, 2, 1052, 1055, 3, 2, 2, 2, 1053, 1051, 3, 2, 2, 2, 1053, 1054, 3, 2, 2, 2, 1054, 143, 3, 2, 2, 2, 1055, 1053, 3, 2, 2, 2, 1056, 1058, 7, 94, 2, 2, 1057, 1056, 3, 2, 2, 2, 1057, 1058, 3, 2, 2, 2, 1058, 1059, 3, 2, 2, 2, 1059, 1060, 5, 146, 74, 2, 1060, 145, 3, 2, 2, 2, 1061, 1064, 5, 148, 75, 2, 1062, 1063, 9, 5, 2, 2, 1063, 1065, 5, 148, 75, 2, 1064, 1062, 3, 2, 2, 2, 1064, 1065, 3, 2, 2, 2, 1065, 147, 3, 2, 2, 2, 1066, 1071, 5, 150, 76, 2, 1067, 1068, 7, 46, 2, 2, 1068, 1070, 5, 150, 76, 2, 1069, 1067, 3, 2, 2, 2, 1070, 1073, 3, 2, 2, 2, 1071, 1069, 3, 2, 2, 2, 1071, 1072, 3, 2, 2, 2, 1072, 149, 3, 2, 2, 2, 1073, 1071, 3, 2, 2, 2, 1074, 1077, 5, 152, 77, 2, 1075, 1076, 7, 95, 2, 2, 1076, 1078, 5, 152, 77, 2, 1077, 1075, 3, 2, 2, 2, 1077, 1078, 3, 2, 2, 2, 1078, 151, 3, 2, 2, 2, 1079, 1084, 5, 154, 78, 2, 1080, 1081, 9, 6, 2, 2, 1081, 1083, 5, 154, 78, 2, 1082, 1080, 3, 2, 2, 2, 1083, 1086, 3, 2, 2, 2, 1084, 1082, 3, 2, 2, 2, 1084, 1085, 3, 2, 2, 2, 1085, 153, 3, 2, 2, 2, 1086, 1084, 3, 2, 2, 2, 1087, 1092, 5, 156, 79, 2, 1088, 1089, 9, 7, 2, 2, 1089, 1091, 5, 156, 79, 2, 1090, 1088, 3, 2, 2, 2, 1091, 1094, 3, 2, 2, 2, 1092, 1090, 3, 2, 2, 2, 1092, 1093, 3, 2, 2, 2, 1093, 155, 3, 2, 2, 2, 1094, 1092, 3, 2, 2, 2, 1095, 1099, 5, 158, 80, 2, 1096, 1097, 7, 96, 2, 2, 1097, 1098, 7, 97, 2, 2, 1098, 1100, 5, 338, 170, 2, 1099, 1096, 3, 2, 2, 2, 1099, 1100, 3, 2, 2, 2, 1100, 157, 3, 2, 2, 2, 1101, 1105, 5, 160, 81, 2, 1102, 1103, 7, 99, 2, 2, 1103, 1104, 7, 98, 2, 2, 1104, 1106, 5, 338, 170, 2, 1105, 1102, 3, 2, 2, 2, 1105, 1106, 3, 2, 2, 2, 1106, 159, 3, 2, 2, 2, 1107, 1111, 5, 162, 82, 2, 1108, 1109, 7, 100, 2, 2, 1109, 1110, 7, 70, 2, 2, 1110, 1112, 5, 338, 170, 2, 1111, 1108, 3, 2, 2, 2, 1111, 1112, 3, 2, 2, 2, 1112, 161, 3, 2, 2, 2, 1113, 1117, 5, 164, 83, 2, 1114, 1115, 7, 102, 2, 2, 1115, 1116, 7, 70, 2, 2, 1116, 1118, 5, 348, 175, 2, 1117, 1114, 3, 2, 2, 2, 1117, 1118, 3, 2, 2, 2, 1118, 163, 3, 2, 2, 2, 1119, 1123, 5, 166, 84, 2, 1120, 1121, 7, 101, 2, 2, 1121, 1122, 7, 70, 2, 2, 1122, 1124, 5, 348, 175, 2, 1123, 1120, 3, 2, 2, 2, 1123, 1124, 3, 2, 2, 2, 1124, 165, 3, 2, 2, 2, 1125, 1134, 5, 170, 86, 2, 1126, 1127, 7, 5, 2, 2, 1127, 1128, 7, 44, 2, 2, 1128, 1129, 3, 2, 2, 2, 1129, 1130, 5, 168, 85, 2, 1130, 1131, 5, 206, 104, 2, 1131, 1133, 3, 2, 2, 2, 1132, 1126, 3, 2, 2, 2, 1133, 1136, 3, 2, 2, 2, 1134, 1132, 3, 2, 2, 2, 1134, 1135, 3, 2, 2, 2, 1135, 167, 3, 2, 2, 2, 1136, 1134, 3, 2, 2, 2, 1137, 1141, 5, 74, 38, 2, 1138, 1141, 5, 194, 98, 2, 1139, 1141, 5, 196, 99, 2, 1140, 1137, 3, 2, 2, 2, 1140, 1138, 3, 2, 2, 2, 1140, 1139, 3, 2, 2, 2, 1141, 169, 3, 2, 2, 2, 1142, 1144, 9, 6, 2, 2, 1143, 1142, 3, 2, 2, 2, 1144, 1147, 3, 2, 2, 2, 1145, 1143, 3, 2, 2, 2, 1145, 1146, 3, 2, 2, 2, 1146, 1148, 3, 2, 2, 2, 1147, 1145, 3, 2, 2, 2, 1148, 1149, 5, 172, 87, 2, 1149, 171, 3, 2, 2, 2, 1150, 1154, 5, 178, 90, 2, 1151, 1154, 5, 174, 88, 2, 1152, 1154, 5, 176, 89, 2, 1153, 1150, 3, 2, 2, 2, 1153, 1151, 3, 2, 2, 2, 1153, 1152, 3, 2, 2, 2, 1154, 173, 3, 2, 2, 2, 1155, 1156, 7, 109, 2, 2, 1156, 1157, 7, 108, 2, 2, 1157, 1158, 5, 338, 170, 2, 1158, 1159, 7, 8, 2, 2, 1159, 1160, 5, 94, 48, 2, 1160, 1161, 7, 9, 2, 2, 1161, 175, 3, 2, 2, 2, 1162, 1163, 7, 110, 2, 2, 1163, 1164, 7, 108, 2, 2, 1164, 1165, 5, 338, 170, 2, 1165, 1166, 7, 8, 2, 2, 1166, 1167, 5, 94, 48, 2, 1167, 1168, 7, 9, 2, 2, 1168, 177, 3, 2, 2, 2, 1169, 1174, 5, 236, 119, 2, 1170, 1171, 7, 52, 2, 2, 1171, 1173, 5, 236, 119, 2, 1172, 1170, 3, 2, 2, 2, 1173, 1176, 3, 2, 2, 2, 1174, 1172, 3, 2, 2, 2, 1174, 1175, 3, 2, 2, 2, 1175, 179, 3, 2, 2, 2, 1176, 1174, 3, 2, 2, 2, 1177, 1185, 5, 190, 96, 2, 1178, 1184, 5, 182, 92, 2, 1179, 1184, 5, 186, 94, 2, 1180, 1184, 5, 188, 95, 2, 1181, 1184, 5, 184, 93, 2, 1182, 1184, 5, 206, 104, 2, 1183, 1178, 3, 2, 2, 2, 1183, 1179, 3, 2, 2, 2, 1183, 1180, 3, 2, 2, 2, 1183, 1181, 3, 2, 2, 2, 1183, 1182, 3, 2, 2, 2, 1184, 1187, 3, 2, 2, 2, 1185, 1183, 3, 2, 2, 2, 1185, 1186, 3, 2, 2, 2, 1186, 181, 3, 2, 2, 2, 1187, 1185, 3, 2, 2, 2, 1188, 1189, 7, 53, 2, 2, 1189, 1190, 7, 53, 2, 2, 1190, 1191, 5, 94, 48, 2, 1191, 1192, 7, 54, 2, 2, 1192, 1193, 7, 54, 2, 2, 1193, 183, 3, 2, 2, 2, 1194, 1195, 7, 53, 2, 2, 1195, 1196, 7, 54, 2, 2, 1196, 185, 3, 2, 2, 2, 1197, 1198, 7, 53, 2, 2, 1198, 1199, 5, 94, 48, 2, 1199, 1200, 7, 54, 2, 2, 1200, 187, 3, 2, 2, 2, 1201, 1208, 7, 55, 2, 2, 1202, 1209, 5, 358, 180, 2, 1203, 1209, 5, 356, 179, 2, 1204, 1209, 7, 178, 2, 2, 1205, 1209, 5, 196, 99, 2, 1206, 1209, 5, 194, 98, 2, 1207, 1209, 5, 198, 100, 2, 1208, 1202, 3, 2, 2, 2, 1208, 1203, 3, 2, 2, 2, 1208, 1204, 3, 2, 2, 2, 1208, 1205, 3, 2, 2, 2, 1208, 1206, 3, 2, 2, 2, 1208, 1207, 3, 2, 2, 2, 1209, 189, 3, 2, 2, 2, 1210, 1226, 7, 171, 2, 2, 1211, 1226, 7, 106, 2, 2, 1212, 1226, 7, 107, 2, 2, 1213, 1226, 7, 172, 2, 2, 1214, 1226, 5, 356, 179, 2, 1215, 1226, 5, 194, 98, 2, 1216, 1226, 5, 196, 99, 2, 1217, 1226, 5, 198, 100, 2, 1218, 1226, 5, 340, 171, 2, 1219, 1226, 5, 204, 103, 2, 1220, 1226, 5, 200, 101, 2, 1221, 1226, 5, 202, 102, 2, 1222, 1226, 5, 352, 177, 2, 1223, 1226, 5, 210, 106, 2, 1224, 1226, 5, 192, 97, 2, 1225, 1210, 3, 2, 2, 2, 1225, 1211, 3, 2, 2, 2, 1225, 1212, 3, 2, 2, 2, 1225, 1213, 3, 2, 2, 2, 1225, 1214, 3, 2, 2, 2, 1225, 1215, 3, 2, 2, 2, 1225, 1216, 3, 2, 2, 2, 1225, 1217, 3, 2, 2, 2, 1225, 1218, 3, 2, 2, 2, 1225, 1219, 3, 2, 2, 2, 1225, 1220, 3, 2, 2, 2, 1225, 1221, 3, 2, 2, 2, 1225, 1222, 3, 2, 2, 2, 1225, 1223, 3, 2, 2, 2, 1225, 1224, 3, 2, 2, 2, 1226, 191, 3, 2, 2, 2, 1227, 1228, 7, 8, 2, 2, 1228, 1229, 5, 16, 9, 2, 1229, 1230, 7, 9, 2, 2, 1230, 193, 3, 2, 2, 2, 1231, 1232, 7, 6, 2, 2, 1232, 1233, 5, 74, 38, 2, 1233, 195, 3, 2, 2, 2, 1234, 1236, 7, 10, 2, 2, 1235, 1237, 5, 94, 48, 2, 1236, 1235, 3, 2, 2, 2, 1236, 1237, 3, 2, 2, 2, 1237, 1238, 3, 2, 2, 2, 1238, 1239, 7, 11, 2, 2, 1239, 197, 3, 2, 2, 2, 1240, 1241, 7, 56, 2, 2, 1241, 199, 3, 2, 2, 2, 1242, 1243, 7, 17, 2, 2, 1243, 1244, 7, 8, 2, 2, 1244, 1245, 5, 94, 48, 2, 1245, 1246, 7, 9, 2, 2, 1246, 201, 3, 2, 2, 2, 1247, 1248, 7, 105, 2, 2, 1248, 1249, 7, 8, 2, 2, 1249, 1250, 5, 94, 48, 2, 1250, 1251, 7, 9, 2, 2, 1251, 203, 3, 2, 2, 2, 1252, 1253, 5, 74, 38, 2, 1253, 1254, 5, 206, 104, 2, 1254, 205, 3, 2, 2, 2, 1255, 1262, 7, 10, 2, 2, 1256, 1258, 5, 208, 105, 2, 1257, 1259, 7, 15, 2, 2, 1258, 1257, 3, 2, 2, 2, 1258, 1259, 3, 2, 2, 2, 1259, 1261, 3, 2, 2, 2, 1260, 1256, 3, 2, 2, 2, 1261, 1264, 3, 2, 2, 2, 1262, 1260, 3, 2, 2, 2, 1262, 1263, 3, 2, 2, 2, 1263, 1265, 3, 2, 2, 2, 1264, 1262, 3, 2, 2, 2, 1265, 1266, 7, 11, 2, 2, 1266, 207, 3, 2, 2, 2, 1267, 1270, 5, 96, 49, 2, 1268, 1270, 7, 170, 2, 2, 1269, 1267, 3, 2, 2, 2, 1269, 1268, 3, 2, 2, 2, 1270, 209, 3, 2, 2, 2, 1271, 1274, 5, 212, 107, 2, 1272, 1274, 5, 214, 108, 2, 1273, 1271, 3, 2, 2, 2, 1273, 1272, 3, 2, 2, 2, 1274, 211, 3, 2, 2, 2, 1275, 1276, 5, 74, 38, 2, 1276, 1277, 7, 57, 2, 2, 1277, 1278, 7, 172, 2, 2, 1278, 213, 3, 2, 2, 2, 1279, 1280, 5, 52, 27, 2, 1280, 1281, 7, 31, 2, 2, 1281, 1283, 7, 10, 2, 2, 1282, 1284, 5, 90, 46, 2, 1283, 1282, 3, 2, 2, 2, 1283, 1284, 3, 2, 2, 2, 1284, 1285, 3, 2, 2, 2, 1285, 1288, 7, 11, 2, 2, 1286, 1287, 7, 70, 2, 2, 1287, 1289, 5, 338, 170, 2, 1288, 1286, 3, 2, 2, 2, 1288, 1289, 3, 2, 2, 2, 1289, 1290, 3, 2, 2, 2, 1290, 1291, 7, 8, 2, 2, 1291, 1292, 5, 18, 10, 2, 1292, 1293, 7, 9, 2, 2, 1293, 215, 3, 2, 2, 2, 1294, 1295, 7, 115, 2, 2, 1295, 1296, 7, 124, 2, 2, 1296, 1297, 5, 96, 49, 2, 1297, 1298, 7, 122, 2, 2, 1298, 1302, 5, 96, 49, 2, 1299, 1300, 7, 71, 2, 2, 1300, 1301, 7, 126, 2, 2, 1301, 1303, 5, 96, 49, 2, 1302, 1299, 3, 2, 2, 2, 1302, 1303, 3, 2, 2, 2, 1303, 1318, 3, 2, 2, 2, 1304, 1305, 7, 115, 2, 2, 1305, 1306, 7, 124, 2, 2, 1306, 1311, 5, 350, 176, 2, 1307, 1308, 7, 15, 2, 2, 1308, 1310, 5, 350, 176, 2, 1309, 1307, 3, 2, 2, 2, 1310, 1313, 3, 2, 2, 2, 1311, 1309, 3, 2, 2, 2, 1311, 1312, 3, 2, 2, 2, 1312, 1314, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1314, 1315, 7, 122, 2, 2, 1315, 1316, 5, 96, 49, 2, 1316, 1318, 3, 2, 2, 2, 1317, 1294, 3, 2, 2, 2, 1317, 1304, 3, 2, 2, 2, 1318, 217, 3, 2, 2, 2, 1319, 1320, 7, 116, 2, 2, 1320, 1321, 7, 124, 2, 2, 1321, 1322, 5, 228, 115, 2, 1322, 219, 3, 2, 2, 2, 1323, 1324, 7, 117, 2, 2, 1324, 1325, 7, 124, 2, 2, 1325, 1326, 5, 228, 115, 2, 1326, 1327, 7, 70, 2, 2, 1327, 1328, 5, 96, 49, 2, 1328, 221, 3, 2, 2, 2, 1329, 1330, 7, 118, 2, 2, 1330, 1331, 7, 124, 2, 2, 1331, 1332, 7, 123, 2, 2, 1332, 1333, 7, 97, 2, 2, 1333, 1334, 5, 228, 115, 2, 1334, 1335, 7, 125, 2, 2, 1335, 1336, 5, 96, 49, 2, 1336, 223, 3, 2, 2, 2, 1337, 1338, 7, 119, 2, 2, 1338, 1339, 7, 124, 2, 2, 1339, 1344, 5, 230, 116, 2, 1340, 1341, 7, 15, 2, 2, 1341, 1343, 5, 230, 116, 2, 1342, 1340, 3, 2, 2, 2, 1343, 1346, 3, 2, 2, 2, 1344, 1342, 3, 2, 2, 2, 1344, 1345, 3, 2, 2, 2, 1345, 1347, 3, 2, 2, 2, 1346, 1344, 3, 2, 2, 2, 1347, 1348, 7, 120, 2, 2, 1348, 1349, 5, 96, 49, 2, 1349, 1350, 7, 67, 2, 2, 1350, 1351, 5, 96, 49, 2, 1351, 225, 3, 2, 2, 2, 1352, 1353, 7, 121, 2, 2, 1353, 1354, 7, 124, 2, 2, 1354, 1355, 5, 96, 49, 2, 1355, 1356, 7, 122, 2, 2, 1356, 1357, 5, 96, 49, 2, 1357, 227, 3, 2, 2, 2, 1358, 1361, 5, 190, 96, 2, 1359, 1362, 5, 182, 92, 2, 1360, 1362, 5, 188, 95, 2, 1361, 1359, 3, 2, 2, 2, 1361, 1360, 3, 2, 2, 2, 1362, 1363, 3, 2, 2, 2, 1363, 1361, 3, 2, 2, 2, 1363, 1364, 3, 2, 2, 2, 1364, 229, 3, 2, 2, 2, 1365, 1366, 5, 194, 98, 2, 1366, 1367, 7, 7, 2, 2, 1367, 1368, 5, 96, 49, 2, 1368, 231, 3, 2, 2, 2, 1369, 1370, 7, 133, 2, 2, 1370, 1372, 7, 134, 2, 2, 1371, 1373, 5, 234, 118, 2, 1372, 1371, 3, 2, 2, 2, 1372, 1373, 3, 2, 2, 2, 1373, 1374, 3, 2, 2, 2, 1374, 1384, 5, 354, 178, 2, 1375, 1376, 7, 71, 2, 2, 1376, 1381, 5, 354, 178, 2, 1377, 1378, 7, 15, 2, 2, 1378, 1380, 5, 354, 178, 2, 1379, 1377, 3, 2, 2, 2, 1380, 1383, 3, 2, 2, 2, 1381, 1379, 3, 2, 2, 2, 1381, 1382, 3, 2, 2, 2, 1382, 1385, 3, 2, 2, 2, 1383, 1381, 3, 2, 2, 2, 1384, 1375, 3, 2, 2, 2, 1384, 1385, 3, 2, 2, 2, 1385, 233, 3, 2, 2, 2, 1386, 1387, 7, 135, 2, 2, 1387, 1388, 7, 178, 2, 2, 1388, 1393, 7, 5, 2, 2, 1389, 1390, 7, 88, 2, 2, 1390, 1391, 7, 136, 2, 2, 1391, 1393, 7, 135, 2, 2, 1392, 1386, 3, 2, 2, 2, 1392, 1389, 3, 2, 2, 2, 1393, 235, 3, 2, 2, 2, 1394, 1396, 7, 137, 2, 2, 1395, 1397, 5, 238, 120, 2, 1396, 1395, 3, 2, 2, 2, 1396, 1397, 3, 2, 2, 2, 1397, 1402, 3, 2, 2, 2, 1398, 1399, 7, 138, 2, 2, 1399, 1402, 5, 238, 120, 2, 1400, 1402, 5, 238, 120, 2, 1401, 1394, 3, 2, 2, 2, 1401, 1398, 3, 2, 2, 2, 1401, 1400, 3, 2, 2, 2, 1402, 237, 3, 2, 2, 2, 1403, 1408, 5, 240, 121, 2, 1404, 1405, 9, 8, 2, 2, 1405, 1407, 5, 240, 121, 2, 1406, 1404, 3, 2, 2, 2, 1407, 1410, 3, 2, 2, 2, 1408, 1406, 3, 2, 2, 2, 1408, 1409, 3, 2, 2, 2, 1409, 239, 3, 2, 2, 2, 1410, 1408, 3, 2, 2, 2, 1411, 1414, 5, 180, 91, 2, 1412, 1414, 5, 242, 122, 2, 1413, 1411, 3, 2, 2, 2, 1413, 1412, 3, 2, 2, 2, 1414, 241, 3, 2, 2, 2, 1415, 1418, 5, 250, 126, 2, 1416, 1418, 5, 244, 123, 2, 1417, 1415, 3, 2, 2, 2, 1417, 1416, 3, 2, 2, 2, 1418, 1419, 3, 2, 2, 2, 1419, 1420, 5, 266, 134, 2, 1420, 243, 3, 2, 2, 2, 1421, 1422, 5, 246, 124, 2, 1422, 1423, 5, 256, 129, 2, 1423, 1426, 3, 2, 2, 2, 1424, 1426, 5, 248, 125, 2, 1425, 1421, 3, 2, 2, 2, 1425, 1424, 3, 2, 2, 2, 1426, 245, 3, 2, 2, 2, 1427, 1428, 9, 9, 2, 2, 1428, 1429, 7, 19, 2, 2, 1429, 1430, 7, 19, 2, 2, 1430, 247, 3, 2, 2, 2, 1431, 1433, 7, 139, 2, 2, 1432, 1431, 3, 2, 2, 2, 1432, 1433, 3, 2, 2, 2, 1433, 1434, 3, 2, 2, 2, 1434, 1435, 5, 256, 129, 2, 1435, 249, 3, 2, 2, 2, 1436, 1437, 5, 252, 127, 2, 1437, 1438, 5, 256, 129, 2, 1438, 1441, 3, 2, 2, 2, 1439, 1441, 5, 254, 128, 2, 1440, 1436, 3, 2, 2, 2, 1440, 1439, 3, 2, 2, 2, 1441, 251, 3, 2, 2, 2, 1442, 1443, 9, 10, 2, 2, 1443, 1444, 7, 19, 2, 2, 1444, 1445, 7, 19, 2, 2, 1445, 253, 3, 2, 2, 2, 1446, 1447, 7, 58, 2, 2, 1447, 255, 3, 2, 2, 2, 1448, 1451, 5, 258, 130, 2, 1449, 1451, 5, 272, 137, 2, 1450, 1448, 3, 2, 2, 2, 1450, 1449, 3, 2, 2, 2, 1451, 257, 3, 2, 2, 2, 1452, 1455, 5, 74, 38, 2, 1453, 1455, 5, 260, 131, 2, 1454, 1452, 3, 2, 2, 2, 1454, 1453, 3, 2, 2, 2, 1455, 259, 3, 2, 2, 2, 1456, 1460, 7, 12, 2, 2, 1457, 1460, 5, 262, 132, 2, 1458, 1460, 5, 264, 133, 2, 1459, 1456, 3, 2, 2, 2, 1459, 1457, 3, 2, 2, 2, 1459, 1458, 3, 2, 2, 2, 1460, 261, 3, 2, 2, 2, 1461, 1462, 7, 178, 2, 2, 1462, 1463, 7, 19, 2, 2, 1463, 1464, 7, 12, 2, 2, 1464, 263, 3, 2, 2, 2, 1465, 1466, 7, 12, 2, 2, 1466, 1467, 7, 19, 2, 2, 1467, 1468, 7, 178, 2, 2, 1468, 265, 3, 2, 2, 2, 1469, 1471, 5, 186, 94, 2, 1470, 1469, 3, 2, 2, 2, 1471, 1474, 3, 2, 2, 2, 1472, 1470, 3, 2, 2, 2, 1472, 1473, 3, 2, 2, 2, 1473, 267, 3, 2, 2, 2, 1474, 1472, 3, 2, 2, 2, 1475, 1487, 5, 74, 38, 2, 1476, 1487, 7, 171, 2, 2, 1477, 1487, 5, 272, 137, 2, 1478, 1479, 7, 113, 2, 2, 1479, 1480, 7, 10, 2, 2, 1480, 1487, 7, 11, 2, 2, 1481, 1487, 5, 342, 172, 2, 1482, 1487, 5, 310, 156, 2, 1483, 1487, 5, 316, 159, 2, 1484, 1487, 5, 270, 136, 2, 1485, 1487, 5, 322, 162, 2, 1486, 1475, 3, 2, 2, 2, 1486, 1476, 3, 2, 2, 2, 1486, 1477, 3, 2, 2, 2, 1486, 1478, 3, 2, 2, 2, 1486, 1481, 3, 2, 2, 2, 1486, 1482, 3, 2, 2, 2, 1486, 1483, 3, 2, 2, 2, 1486, 1484, 3, 2, 2, 2, 1486, 1485, 3, 2, 2, 2, 1487, 269, 3, 2, 2, 2, 1488, 1489, 5, 74, 38, 2, 1489, 271, 3, 2, 2, 2, 1490, 1503, 5, 278, 140, 2, 1491, 1503, 5, 294, 148, 2, 1492, 1503, 5, 288, 145, 2, 1493, 1503, 5, 298, 150, 2, 1494, 1503, 5, 292, 147, 2, 1495, 1503, 5, 286, 144, 2, 1496, 1503, 5, 282, 142, 2, 1497, 1503, 5, 280, 141, 2, 1498, 1503, 5, 284, 143, 2, 1499, 1503, 5, 326, 164, 2, 1500, 1503, 5, 276, 139, 2, 1501, 1503, 5, 274, 138, 2, 1502, 1490, 3, 2, 2, 2, 1502, 1491, 3, 2, 2, 2, 1502, 1492, 3, 2, 2, 2, 1502, 1493, 3, 2, 2, 2, 1502, 1494, 3, 2, 2, 2, 1502, 1495, 3, 2, 2, 2, 1502, 1496, 3, 2, 2, 2, 1502, 1497, 3, 2, 2, 2, 1502, 1498, 3, 2, 2, 2, 1502, 1499, 3, 2, 2, 2, 1502, 1500, 3, 2, 2, 2, 1502, 1501, 3, 2, 2, 2, 1503, 273, 3, 2, 2, 2, 1504, 1505, 7, 152, 2, 2, 1505, 1506, 7, 10, 2, 2, 1506, 1507, 7, 11, 2, 2, 1507, 275, 3, 2, 2, 2, 1508, 1509, 7, 153, 2, 2, 1509, 1510, 7, 10, 2, 2, 1510, 1511, 7, 11, 2, 2, 1511, 277, 3, 2, 2, 2, 1512, 1513, 7, 155, 2, 2, 1513, 1516, 7, 10, 2, 2, 1514, 1517, 5, 294, 148, 2, 1515, 1517, 5, 298, 150, 2, 1516, 1514, 3, 2, 2, 2, 1516, 1515, 3, 2, 2, 2, 1516, 1517, 3, 2, 2, 2, 1517, 1518, 3, 2, 2, 2, 1518, 1519, 7, 11, 2, 2, 1519, 279, 3, 2, 2, 2, 1520, 1521, 7, 156, 2, 2, 1521, 1522, 7, 10, 2, 2, 1522, 1523, 7, 11, 2, 2, 1523, 281, 3, 2, 2, 2, 1524, 1525, 7, 166, 2, 2, 1525, 1526, 7, 10, 2, 2, 1526, 1527, 7, 11, 2, 2, 1527, 283, 3, 2, 2, 2, 1528, 1529, 7, 158, 2, 2, 1529, 1530, 7, 10, 2, 2, 1530, 1531, 7, 11, 2, 2, 1531, 285, 3, 2, 2, 2, 1532, 1533, 7, 157, 2, 2, 1533, 1536, 7, 10, 2, 2, 1534, 1537, 7, 178, 2, 2, 1535, 1537, 5, 356, 179, 2, 1536, 1534, 3, 2, 2, 2, 1536, 1535, 3, 2, 2, 2, 1536, 1537, 3, 2, 2, 2, 1537, 1538, 3, 2, 2, 2, 1538, 1539, 7, 11, 2, 2, 1539, 287, 3, 2, 2, 2, 1540, 1541, 7, 142, 2, 2, 1541, 1547, 7, 10, 2, 2, 1542, 1545, 5, 290, 146, 2, 1543, 1544, 7, 15, 2, 2, 1544, 1546, 5, 308, 155, 2, 1545, 1543, 3, 2, 2, 2, 1545, 1546, 3, 2, 2, 2, 1546, 1548, 3, 2, 2, 2, 1547, 1542, 3, 2, 2, 2, 1547, 1548, 3, 2, 2, 2, 1548, 1549, 3, 2, 2, 2, 1549, 1550, 7, 11, 2, 2, 1550, 289, 3, 2, 2, 2, 1551, 1554, 5, 302, 152, 2, 1552, 1554, 7, 12, 2, 2, 1553, 1551, 3, 2, 2, 2, 1553, 1552, 3, 2, 2, 2, 1554, 291, 3, 2, 2, 2, 1555, 1556, 7, 159, 2, 2, 1556, 1557, 7, 10, 2, 2, 1557, 1558, 5, 324, 163, 2, 1558, 1559, 7, 11, 2, 2, 1559, 293, 3, 2, 2, 2, 1560, 1561, 7, 136, 2, 2, 1561, 1570, 7, 10, 2, 2, 1562, 1568, 5, 296, 149, 2, 1563, 1564, 7, 15, 2, 2, 1564, 1566, 5, 308, 155, 2, 1565, 1567, 7, 170, 2, 2, 1566, 1565, 3, 2, 2, 2, 1566, 1567, 3, 2, 2, 2, 1567, 1569, 3, 2, 2, 2, 1568, 1563, 3, 2, 2, 2, 1568, 1569, 3, 2, 2, 2, 1569, 1571, 3, 2, 2, 2, 1570, 1562, 3, 2, 2, 2, 1570, 1571, 3, 2, 2, 2, 1571, 1572, 3, 2, 2, 2, 1572, 1573, 7, 11, 2, 2, 1573, 295, 3, 2, 2, 2, 1574, 1577, 5, 304, 153, 2, 1575, 1577, 7, 12, 2, 2, 1576, 1574, 3, 2, 2, 2, 1576, 1575, 3, 2, 2, 2, 1577, 297, 3, 2, 2, 2, 1578, 1579, 7, 160, 2, 2, 1579, 1580, 7, 10, 2, 2, 1580, 1581, 5, 300, 151, 2, 1581, 1582, 7, 11, 2, 2, 1582, 299, 3, 2, 2, 2, 1583, 1584, 5, 304, 153, 2, 1584, 301, 3, 2, 2, 2, 1585, 1586, 5, 74, 38, 2, 1586, 303, 3, 2, 2, 2, 1587, 1588, 5, 74, 38, 2, 1588, 305, 3, 2, 2, 2, 1589, 1590, 5, 308, 155, 2, 1590, 307, 3, 2, 2, 2, 1591, 1592, 5, 74, 38, 2, 1592, 309, 3, 2, 2, 2, 1593, 1596, 5, 312, 157, 2, 1594, 1596, 5, 314, 158, 2, 1595, 1593, 3, 2, 2, 2, 1595, 1594, 3, 2, 2, 2, 1596, 311, 3, 2, 2, 2, 1597, 1598, 7, 168, 2, 2, 1598, 1599, 7, 10, 2, 2, 1599, 1600, 7, 12, 2, 2, 1600, 1601, 7, 11, 2, 2, 1601, 313, 3, 2, 2, 2, 1602, 1603, 7, 168, 2, 2, 1603, 1604, 7, 10, 2, 2, 1604, 1605, 5, 74, 38, 2, 1605, 1606, 7, 15, 2, 2, 1606, 1607, 5, 338, 170, 2, 1607, 1608, 7, 11, 2, 2, 1608, 315, 3, 2, 2, 2, 1609, 1612, 5, 318, 160, 2, 1610, 1612, 5, 320, 161, 2, 1611, 1609, 3, 2, 2, 2, 1611, 1610, 3, 2, 2, 2, 1612, 317, 3, 2, 2, 2, 1613, 1614, 7, 167, 2, 2, 1614, 1615, 7, 10, 2, 2, 1615, 1616, 7, 12, 2, 2, 1616, 1617, 7, 11, 2, 2, 1617, 319, 3, 2, 2, 2, 1618, 1619, 7, 167, 2, 2, 1619, 1620, 7, 10, 2, 2, 1620, 1621, 5, 338, 170, 2, 1621, 1622, 7, 11, 2, 2, 1622, 321, 3, 2, 2, 2, 1623, 1624, 7, 10, 2, 2, 1624, 1625, 5, 268, 135, 2, 1625, 1626, 7, 11, 2, 2, 1626, 323, 3, 2, 2, 2, 1627, 1628, 5, 302, 152, 2, 1628, 325, 3, 2, 2, 2, 1629, 1635, 5, 328, 165, 2, 1630, 1635, 5, 330, 166, 2, 1631, 1635, 5, 332, 167, 2, 1632, 1635, 5, 334, 168, 2, 1633, 1635, 5, 336, 169, 2, 1634, 1629, 3, 2, 2, 2, 1634, 1630, 3, 2, 2, 2, 1634, 1631, 3, 2, 2, 2, 1634, 1632, 3, 2, 2, 2, 1634, 1633, 3, 2, 2, 2, 1635, 327, 3, 2, 2, 2, 1636, 1637, 7, 161, 2, 2, 1637, 1639, 7, 10, 2, 2, 1638, 1640, 5, 356, 179, 2, 1639, 1638, 3, 2, 2, 2, 1639, 1640, 3, 2, 2, 2, 1640, 1641, 3, 2, 2, 2, 1641, 1642, 7, 11, 2, 2, 1642, 329, 3, 2, 2, 2, 1643, 1644, 7, 165, 2, 2, 1644, 1646, 7, 10, 2, 2, 1645, 1647, 5, 356, 179, 2, 1646, 1645, 3, 2, 2, 2, 1646, 1647, 3, 2, 2, 2, 1647, 1648, 3, 2, 2, 2, 1648, 1649, 7, 11, 2, 2, 1649, 331, 3, 2, 2, 2, 1650, 1651, 7, 164, 2, 2, 1651, 1653, 7, 10, 2, 2, 1652, 1654, 5, 356, 179, 2, 1653, 1652, 3, 2, 2, 2, 1653, 1654, 3, 2, 2, 2, 1654, 1655, 3, 2, 2, 2, 1655, 1656, 7, 11, 2, 2, 1656, 333, 3, 2, 2, 2, 1657, 1658, 7, 162, 2, 2, 1658, 1660, 7, 10, 2, 2, 1659, 1661, 5, 356, 179, 2, 1660, 1659, 3, 2, 2, 2, 1660, 1661, 3, 2, 2, 2, 1661, 1662, 3, 2, 2, 2, 1662, 1663, 7, 11, 2, 2, 1663, 335, 3, 2, 2, 2, 1664, 1665, 7, 163, 2, 2, 1665, 1667, 7, 10, 2, 2, 1666, 1668, 5, 356, 179, 2, 1667, 1666, 3, 2, 2, 2, 1667, 1668, 3, 2, 2, 2, 1668, 1669, 3, 2, 2, 2, 1669, 1670, 7, 11, 2, 2, 1670, 337, 3, 2, 2, 2, 1671, 1672, 7, 10, 2, 2, 1672, 1680, 7, 11, 2, 2, 1673, 1677, 5, 268, 135, 2, 1674, 1678, 7, 170, 2, 2, 1675, 1678, 7, 12, 2, 2, 1676, 1678, 7, 47, 2, 2, 1677, 1674, 3, 2, 2, 2, 1677, 1675, 3, 2, 2, 2, 1677, 1676, 3, 2, 2, 2, 1677, 1678, 3, 2, 2, 2, 1678, 1680, 3, 2, 2, 2, 1679, 1671, 3, 2, 2, 2, 1679, 1673, 3, 2, 2, 2, 1680, 339, 3, 2, 2, 2, 1681, 1690, 7, 8, 2, 2, 1682, 1687, 5, 350, 176, 2, 1683, 1684, 7, 15, 2, 2, 1684, 1686, 5, 350, 176, 2, 1685, 1683, 3, 2, 2, 2, 1686, 1689, 3, 2, 2, 2, 1687, 1685, 3, 2, 2, 2, 1687, 1688, 3, 2, 2, 2, 1688, 1691, 3, 2, 2, 2, 1689, 1687, 3, 2, 2, 2, 1690, 1682, 3, 2, 2, 2, 1690, 1691, 3, 2, 2, 2, 1691, 1692, 3, 2, 2, 2, 1692, 1698, 7, 9, 2, 2, 1693, 1694, 7, 59, 2, 2, 1694, 1695, 5, 94, 48, 2, 1695, 1696, 7, 60, 2, 2, 1696, 1698, 3, 2, 2, 2, 1697, 1681, 3, 2, 2, 2, 1697, 1693, 3, 2, 2, 2, 1698, 341, 3, 2, 2, 2, 1699, 1702, 5, 344, 173, 2, 1700, 1702, 5, 346, 174, 2, 1701, 1699, 3, 2, 2, 2, 1701, 1700, 3, 2, 2, 2, 1702, 343, 3, 2, 2, 2, 1703, 1704, 7, 31, 2, 2, 1704, 1705, 7, 10, 2, 2, 1705, 1706, 7, 12, 2, 2, 1706, 1707, 7, 11, 2, 2, 1707, 345, 3, 2, 2, 2, 1708, 1709, 7, 31, 2, 2, 1709, 1718, 7, 10, 2, 2, 1710, 1715, 5, 338, 170, 2, 1711, 1712, 7, 15, 2, 2, 1712, 1714, 5, 338, 170, 2, 1713, 1711, 3, 2, 2, 2, 1714, 1717, 3, 2, 2, 2, 1715, 1713, 3, 2, 2, 2, 1715, 1716, 3, 2, 2, 2, 1716, 1719, 3, 2, 2, 2, 1717, 1715, 3, 2, 2, 2, 1718, 1710, 3, 2, 2, 2, 1718, 1719, 3, 2, 2, 2, 1719, 1720, 3, 2, 2, 2, 1720, 1721, 7, 11, 2, 2, 1721, 1722, 7, 70, 2, 2, 1722, 1723, 5, 338, 170, 2, 1723, 347, 3, 2, 2, 2, 1724, 1726, 5, 268, 135, 2, 1725, 1727, 7, 170, 2, 2, 1726, 1725, 3, 2, 2, 2, 1726, 1727, 3, 2, 2, 2, 1727, 349, 3, 2, 2, 2, 1728, 1731, 5, 96, 49, 2, 1729, 1731, 7, 178, 2, 2, 1730, 1728, 3, 2, 2, 2, 1730, 1729, 3, 2, 2, 2, 1731, 1732, 3, 2, 2, 2, 1732, 1733, 9, 11, 2, 2, 1733, 1734, 5, 96, 49, 2, 1734, 351, 3, 2, 2, 2, 1735, 1737, 7, 53, 2, 2, 1736, 1738, 5, 94, 48, 2, 1737, 1736, 3, 2, 2, 2, 1737, 1738, 3, 2, 2, 2, 1738, 1739, 3, 2, 2, 2, 1739, 1740, 7, 54, 2, 2, 1740, 353, 3, 2, 2, 2, 1741, 1742, 5, 356, 179, 2, 1742, 355, 3, 2, 2, 2, 1743, 1744, 7, 169, 2, 2, 1744, 357, 3, 2, 2, 2, 1745, 1746, 9, 12, 2, 2, 1746, 359, 3, 2, 2, 2, 168, 368, 372, 388, 394, 402, 410, 418, 433, 463, 471, 473, 495, 505, 515, 520, 525, 529, 541, 545, 554, 561, 575, 579, 584, 594, 602, 606, 618, 630, 652, 660, 665, 668, 672, 681, 690, 693, 701, 708, 710, 717, 724, 726, 734, 739, 746, 753, 763, 770, 777, 784, 793, 803, 807, 815, 817, 829, 835, 839, 843, 854, 860, 875, 881, 885, 889, 896, 903, 909, 914, 916, 920, 927, 934, 943, 955, 965, 977, 981, 990, 997, 1019, 1024, 1029, 1033, 1045, 1053, 1057, 1064, 1071, 1077, 1084, 1092, 1099, 1105, 1111, 1117, 1123, 1134, 1140, 1145, 1153, 1174, 1183, 1185, 1208, 1225, 1236, 1258, 1262, 1269, 1273, 1283, 1288, 1302, 1311, 1317, 1344, 1361, 1363, 1372, 1381, 1384, 1392, 1396, 1401, 1408, 1413, 1417, 1425, 1432, 1440, 1450, 1454, 1459, 1472, 1486, 1502, 1516, 1536, 1545, 1547, 1553, 1566, 1568, 1570, 1576, 1595, 1611, 1634, 1639, 1646, 1653, 1660, 1667, 1677, 1679, 1687, 1690, 1697, 1701, 1715, 1718, 1726, 1730, 1737] \ No newline at end of file diff --git a/src/main/java/org/rumbledb/parser/JsoniqParser.java b/src/main/java/org/rumbledb/parser/JsoniqParser.java index 331b5390d..35bee14a3 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqParser.java +++ b/src/main/java/org/rumbledb/parser/JsoniqParser.java @@ -360,6 +360,7 @@ public final ModuleContext module() throws RecognitionException { case T__3: case T__5: case T__7: + case T__9: case T__11: case T__14: case T__28: @@ -367,6 +368,7 @@ public final ModuleContext module() throws RecognitionException { case T__45: case T__50: case T__53: + case T__55: case T__56: case Kfor: case Klet: @@ -441,6 +443,36 @@ public final ModuleContext module() throws RecognitionException { case Kreturning: case Kwhile: case Kimport: + case Kelement: + case Kslash: + case Kdslash: + case Kat_symbol: + case Kchild: + case Kdescendant: + case Kattribute: + case Kself: + case Kdescendant_or_self: + case Kfollowing_sibling: + case Kfollowing: + case Kparent: + case Kancestor: + case Kpreceding_sibling: + case Kpreceding: + case Kancestor_or_self: + case Knode: + case Kbinary: + case Kdocument_node: + case Ktext: + case Kpi: + case Knamespace_node: + case Kschema_attribute: + case Kschema_element: + case Karray_node: + case Kboolean_node: + case Knull_node: + case Knumber_node: + case Kobject_node: + case Kcomment: case STRING: case NullLiteral: case Literal: @@ -833,7 +865,7 @@ public final StatementsAndOptionalExprContext statementsAndOptionalExpr() throws setState(416); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { setState(415); expr(); @@ -6296,36 +6328,39 @@ public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionEx enterRule(_localctx, 152, RULE_multiplicativeExpr); int _la; try { + int _alt; enterOuterAlt(_localctx, 1); { setState(1085); ((MultiplicativeExprContext)_localctx).main_expr = instanceOfExpr(); setState(1090); _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) { - { - { - setState(1086); - ((MultiplicativeExprContext)_localctx)._tset1965 = _input.LT(1); - _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) ) { - ((MultiplicativeExprContext)_localctx)._tset1965 = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1965); - setState(1087); - ((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr(); - ((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr); - } + _alt = getInterpreter().adaptivePredict(_input,92,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1086); + ((MultiplicativeExprContext)_localctx)._tset1965 = _input.LT(1); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) ) { + ((MultiplicativeExprContext)_localctx)._tset1965 = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1965); + setState(1087); + ((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr(); + ((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr); + } + } } setState(1092); _errHandler.sync(this); - _la = _input.LA(1); + _alt = getInterpreter().adaptivePredict(_input,92,_ctx); } } } @@ -7076,14 +7111,14 @@ public final AnnotateExprContext annotateExpr() throws RecognitionException { } public static class SimpleMapExprContext extends ParserRuleContext { - public PostFixExprContext main_expr; - public PostFixExprContext postFixExpr; - public List map_expr = new ArrayList(); - public List postFixExpr() { - return getRuleContexts(PostFixExprContext.class); + public PathExprContext main_expr; + public PathExprContext pathExpr; + public List map_expr = new ArrayList(); + public List pathExpr() { + return getRuleContexts(PathExprContext.class); } - public PostFixExprContext postFixExpr(int i) { - return getRuleContext(PostFixExprContext.class,i); + public PathExprContext pathExpr(int i) { + return getRuleContext(PathExprContext.class,i); } public SimpleMapExprContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -7104,7 +7139,7 @@ public final SimpleMapExprContext simpleMapExpr() throws RecognitionException { enterOuterAlt(_localctx, 1); { setState(1167); - ((SimpleMapExprContext)_localctx).main_expr = postFixExpr(); + ((SimpleMapExprContext)_localctx).main_expr = pathExpr(); setState(1172); _errHandler.sync(this); _la = _input.LA(1); @@ -7114,8 +7149,8 @@ public final SimpleMapExprContext simpleMapExpr() throws RecognitionException { setState(1168); match(T__49); setState(1169); - ((SimpleMapExprContext)_localctx).postFixExpr = postFixExpr(); - ((SimpleMapExprContext)_localctx).map_expr.add(((SimpleMapExprContext)_localctx).postFixExpr); + ((SimpleMapExprContext)_localctx).pathExpr = pathExpr(); + ((SimpleMapExprContext)_localctx).map_expr.add(((SimpleMapExprContext)_localctx).pathExpr); } } setState(1174); @@ -7817,7 +7852,7 @@ public final ParenthesizedExprContext parenthesizedExpr() throws RecognitionExce setState(1234); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { setState(1233); expr(); @@ -8031,7 +8066,7 @@ public final ArgumentListContext argumentList() throws RecognitionException { setState(1260); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (ArgumentPlaceholder - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (STRING - 128)) | (1L << (ArgumentPlaceholder - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { { setState(1254); @@ -8094,6 +8129,7 @@ public final ArgumentContext argument() throws RecognitionException { case T__3: case T__5: case T__7: + case T__9: case T__11: case T__14: case T__28: @@ -8101,6 +8137,7 @@ public final ArgumentContext argument() throws RecognitionException { case T__45: case T__50: case T__53: + case T__55: case T__56: case Kfor: case Klet: @@ -8174,6 +8211,36 @@ public final ArgumentContext argument() throws RecognitionException { case Kexit: case Kreturning: case Kwhile: + case Kelement: + case Kslash: + case Kdslash: + case Kat_symbol: + case Kchild: + case Kdescendant: + case Kattribute: + case Kself: + case Kdescendant_or_self: + case Kfollowing_sibling: + case Kfollowing: + case Kparent: + case Kancestor: + case Kpreceding_sibling: + case Kpreceding: + case Kancestor_or_self: + case Knode: + case Kbinary: + case Kdocument_node: + case Ktext: + case Kpi: + case Knamespace_node: + case Kschema_attribute: + case Kschema_element: + case Karray_node: + case Kboolean_node: + case Knull_node: + case Knumber_node: + case Kobject_node: + case Kcomment: case STRING: case NullLiteral: case Literal: @@ -9165,7 +9232,6 @@ public T accept(ParseTreeVisitor visitor) { public final PathExprContext pathExpr() throws RecognitionException { PathExprContext _localctx = new PathExprContext(_ctx, getState()); enterRule(_localctx, 234, RULE_pathExpr); - int _la; try { setState(1399); _errHandler.sync(this); @@ -9178,14 +9244,14 @@ public final PathExprContext pathExpr() throws RecognitionException { match(Kslash); setState(1394); _errHandler.sync(this); - _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { + case 1: { setState(1393); ((PathExprContext)_localctx).singleslash = relativePathExpr(); } + break; } - } } break; @@ -9371,35 +9437,38 @@ public final RelativePathExprContext relativePathExpr() throws RecognitionExcept enterRule(_localctx, 236, RULE_relativePathExpr); int _la; try { + int _alt; enterOuterAlt(_localctx, 1); { setState(1401); stepExpr(); setState(1406); _errHandler.sync(this); - _la = _input.LA(1); - while (_la==Kslash || _la==Kdslash) { - { - { - setState(1402); - ((RelativePathExprContext)_localctx)._tset2889 = _input.LT(1); - _la = _input.LA(1); - if ( !(_la==Kslash || _la==Kdslash) ) { - ((RelativePathExprContext)_localctx)._tset2889 = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - ((RelativePathExprContext)_localctx).sep.add(((RelativePathExprContext)_localctx)._tset2889); - setState(1403); - stepExpr(); - } + _alt = getInterpreter().adaptivePredict(_input,126,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1402); + ((RelativePathExprContext)_localctx)._tset2889 = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==Kslash || _la==Kdslash) ) { + ((RelativePathExprContext)_localctx)._tset2889 = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + ((RelativePathExprContext)_localctx).sep.add(((RelativePathExprContext)_localctx)._tset2889); + setState(1403); + stepExpr(); + } + } } setState(1408); _errHandler.sync(this); - _la = _input.LA(1); + _alt = getInterpreter().adaptivePredict(_input,126,_ctx); } } } @@ -10315,23 +10384,25 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateListContext predicateList() throws RecognitionException { PredicateListContext _localctx = new PredicateListContext(_ctx, getState()); enterRule(_localctx, 264, RULE_predicateList); - int _la; try { + int _alt; enterOuterAlt(_localctx, 1); { setState(1470); _errHandler.sync(this); - _la = _input.LA(1); - while (_la==T__50) { - { - { - setState(1467); - predicate(); - } + _alt = getInterpreter().adaptivePredict(_input,135,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1467); + predicate(); + } + } } setState(1472); _errHandler.sync(this); - _la = _input.LA(1); + _alt = getInterpreter().adaptivePredict(_input,135,_ctx); } } } @@ -10680,7 +10751,6 @@ public T accept(ParseTreeVisitor visitor) { public final AnyKindTestContext anyKindTest() throws RecognitionException { AnyKindTestContext _localctx = new AnyKindTestContext(_ctx, getState()); enterRule(_localctx, 272, RULE_anyKindTest); - int _la; try { enterOuterAlt(_localctx, 1); { @@ -10688,17 +10758,7 @@ public final AnyKindTestContext anyKindTest() throws RecognitionException { match(Knode); setState(1503); match(T__7); - setState(1505); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==T__9) { - { - setState(1504); - match(T__9); - } - } - - setState(1507); + setState(1504); match(T__8); } } @@ -10732,11 +10792,11 @@ public final BinaryNodeTestContext binaryNodeTest() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1509); + setState(1506); match(Kbinary); - setState(1510); + setState(1507); match(T__7); - setState(1511); + setState(1508); match(T__8); } } @@ -10776,22 +10836,22 @@ public final DocumentTestContext documentTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1513); + setState(1510); match(Kdocument_node); - setState(1514); + setState(1511); match(T__7); - setState(1517); + setState(1514); _errHandler.sync(this); switch (_input.LA(1)) { case Kelement: { - setState(1515); + setState(1512); elementTest(); } break; case Kschema_element: { - setState(1516); + setState(1513); schemaElementTest(); } break; @@ -10800,7 +10860,7 @@ public final DocumentTestContext documentTest() throws RecognitionException { default: break; } - setState(1519); + setState(1516); match(T__8); } } @@ -10834,11 +10894,11 @@ public final TextTestContext textTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1521); + setState(1518); match(Ktext); - setState(1522); + setState(1519); match(T__7); - setState(1523); + setState(1520); match(T__8); } } @@ -10872,11 +10932,11 @@ public final CommentTestContext commentTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1525); + setState(1522); match(Kcomment); - setState(1526); + setState(1523); match(T__7); - setState(1527); + setState(1524); match(T__8); } } @@ -10910,11 +10970,11 @@ public final NamespaceNodeTestContext namespaceNodeTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1529); + setState(1526); match(Knamespace_node); - setState(1530); + setState(1527); match(T__7); - setState(1531); + setState(1528); match(T__8); } } @@ -10952,22 +11012,22 @@ public final PiTestContext piTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1533); + setState(1530); match(Kpi); - setState(1534); + setState(1531); match(T__7); - setState(1537); + setState(1534); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(1535); + setState(1532); match(NCName); } break; case STRING: { - setState(1536); + setState(1533); stringLiteral(); } break; @@ -10976,7 +11036,7 @@ public final PiTestContext piTest() throws RecognitionException { default: break; } - setState(1539); + setState(1536); match(T__8); } } @@ -11018,25 +11078,25 @@ public final AttributeTestContext attributeTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1541); + setState(1538); match(Kattribute); - setState(1542); + setState(1539); match(T__7); - setState(1548); + setState(1545); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1543); + setState(1540); attributeNameOrWildcard(); - setState(1546); + setState(1543); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__12) { { - setState(1544); + setState(1541); match(T__12); - setState(1545); + setState(1542); ((AttributeTestContext)_localctx).type = typeName(); } } @@ -11044,7 +11104,7 @@ public final AttributeTestContext attributeTest() throws RecognitionException { } } - setState(1550); + setState(1547); match(T__8); } } @@ -11078,7 +11138,7 @@ public final AttributeNameOrWildcardContext attributeNameOrWildcard() throws Rec AttributeNameOrWildcardContext _localctx = new AttributeNameOrWildcardContext(_ctx, getState()); enterRule(_localctx, 288, RULE_attributeNameOrWildcard); try { - setState(1554); + setState(1551); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -11157,14 +11217,14 @@ public final AttributeNameOrWildcardContext attributeNameOrWildcard() throws Rec case NCName: enterOuterAlt(_localctx, 1); { - setState(1552); + setState(1549); attributeName(); } break; case T__9: enterOuterAlt(_localctx, 2); { - setState(1553); + setState(1550); match(T__9); } break; @@ -11205,13 +11265,13 @@ public final SchemaAttributeTestContext schemaAttributeTest() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(1556); + setState(1553); match(Kschema_attribute); - setState(1557); + setState(1554); match(T__7); - setState(1558); + setState(1555); attributeDeclaration(); - setState(1559); + setState(1556); match(T__8); } } @@ -11255,32 +11315,32 @@ public final ElementTestContext elementTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1561); + setState(1558); match(Kelement); - setState(1562); + setState(1559); match(T__7); - setState(1571); + setState(1568); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1563); + setState(1560); elementNameOrWildcard(); - setState(1569); + setState(1566); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__12) { { - setState(1564); + setState(1561); match(T__12); - setState(1565); + setState(1562); ((ElementTestContext)_localctx).type = typeName(); - setState(1567); + setState(1564); _errHandler.sync(this); _la = _input.LA(1); if (_la==ArgumentPlaceholder) { { - setState(1566); + setState(1563); ((ElementTestContext)_localctx).optional = match(ArgumentPlaceholder); } } @@ -11291,7 +11351,7 @@ public final ElementTestContext elementTest() throws RecognitionException { } } - setState(1573); + setState(1570); match(T__8); } } @@ -11325,7 +11385,7 @@ public final ElementNameOrWildcardContext elementNameOrWildcard() throws Recogni ElementNameOrWildcardContext _localctx = new ElementNameOrWildcardContext(_ctx, getState()); enterRule(_localctx, 294, RULE_elementNameOrWildcard); try { - setState(1577); + setState(1574); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -11404,14 +11464,14 @@ public final ElementNameOrWildcardContext elementNameOrWildcard() throws Recogni case NCName: enterOuterAlt(_localctx, 1); { - setState(1575); + setState(1572); elementName(); } break; case T__9: enterOuterAlt(_localctx, 2); { - setState(1576); + setState(1573); match(T__9); } break; @@ -11452,13 +11512,13 @@ public final SchemaElementTestContext schemaElementTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1579); + setState(1576); match(Kschema_element); - setState(1580); + setState(1577); match(T__7); - setState(1581); + setState(1578); elementDeclaration(); - setState(1582); + setState(1579); match(T__8); } } @@ -11494,7 +11554,7 @@ public final ElementDeclarationContext elementDeclaration() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(1584); + setState(1581); elementName(); } } @@ -11530,7 +11590,7 @@ public final AttributeNameContext attributeName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1586); + setState(1583); qname(); } } @@ -11566,7 +11626,7 @@ public final ElementNameContext elementName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1588); + setState(1585); qname(); } } @@ -11602,7 +11662,7 @@ public final SimpleTypeNameContext simpleTypeName() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1590); + setState(1587); typeName(); } } @@ -11638,7 +11698,7 @@ public final TypeNameContext typeName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1592); + setState(1589); qname(); } } @@ -11675,20 +11735,20 @@ public final MapTestContext mapTest() throws RecognitionException { MapTestContext _localctx = new MapTestContext(_ctx, getState()); enterRule(_localctx, 308, RULE_mapTest); try { - setState(1596); + setState(1593); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1594); + setState(1591); anyMapTest(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1595); + setState(1592); typedMapTest(); } break; @@ -11724,13 +11784,13 @@ public final AnyMapTestContext anyMapTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1598); + setState(1595); match(Kmap); - setState(1599); + setState(1596); match(T__7); - setState(1600); + setState(1597); match(T__9); - setState(1601); + setState(1598); match(T__8); } } @@ -11770,17 +11830,17 @@ public final TypedMapTestContext typedMapTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1603); + setState(1600); match(Kmap); - setState(1604); + setState(1601); match(T__7); - setState(1605); + setState(1602); qname(); - setState(1606); + setState(1603); match(T__12); - setState(1607); + setState(1604); sequenceType(); - setState(1608); + setState(1605); match(T__8); } } @@ -11817,20 +11877,20 @@ public final ArrayTestContext arrayTest() throws RecognitionException { ArrayTestContext _localctx = new ArrayTestContext(_ctx, getState()); enterRule(_localctx, 314, RULE_arrayTest); try { - setState(1612); + setState(1609); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1610); + setState(1607); anyArrayTest(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1611); + setState(1608); typedArrayTest(); } break; @@ -11866,13 +11926,13 @@ public final AnyArrayTestContext anyArrayTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1614); + setState(1611); match(Karray); - setState(1615); + setState(1612); match(T__7); - setState(1616); + setState(1613); match(T__9); - setState(1617); + setState(1614); match(T__8); } } @@ -11909,13 +11969,13 @@ public final TypedArrayTestContext typedArrayTest() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1619); + setState(1616); match(Karray); - setState(1620); + setState(1617); match(T__7); - setState(1621); + setState(1618); sequenceType(); - setState(1622); + setState(1619); match(T__8); } } @@ -11951,11 +12011,11 @@ public final ParenthesizedItemTestContext parenthesizedItemTest() throws Recogni try { enterOuterAlt(_localctx, 1); { - setState(1624); + setState(1621); match(T__7); - setState(1625); + setState(1622); itemType(); - setState(1626); + setState(1623); match(T__8); } } @@ -11991,7 +12051,7 @@ public final AttributeDeclarationContext attributeDeclaration() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(1628); + setState(1625); attributeName(); } } @@ -12037,41 +12097,41 @@ public final MlNodeTestContext mlNodeTest() throws RecognitionException { MlNodeTestContext _localctx = new MlNodeTestContext(_ctx, getState()); enterRule(_localctx, 324, RULE_mlNodeTest); try { - setState(1635); + setState(1632); _errHandler.sync(this); switch (_input.LA(1)) { case Karray_node: enterOuterAlt(_localctx, 1); { - setState(1630); + setState(1627); mlArrayNodeTest(); } break; case Kobject_node: enterOuterAlt(_localctx, 2); { - setState(1631); + setState(1628); mlObjectNodeTest(); } break; case Knumber_node: enterOuterAlt(_localctx, 3); { - setState(1632); + setState(1629); mlNumberNodeTest(); } break; case Kboolean_node: enterOuterAlt(_localctx, 4); { - setState(1633); + setState(1630); mlBooleanNodeTest(); } break; case Knull_node: enterOuterAlt(_localctx, 5); { - setState(1634); + setState(1631); mlNullNodeTest(); } break; @@ -12113,21 +12173,21 @@ public final MlArrayNodeTestContext mlArrayNodeTest() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1637); + setState(1634); match(Karray_node); - setState(1638); + setState(1635); match(T__7); - setState(1640); + setState(1637); _errHandler.sync(this); _la = _input.LA(1); if (_la==STRING) { { - setState(1639); + setState(1636); stringLiteral(); } } - setState(1642); + setState(1639); match(T__8); } } @@ -12165,21 +12225,21 @@ public final MlObjectNodeTestContext mlObjectNodeTest() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1644); + setState(1641); match(Kobject_node); - setState(1645); + setState(1642); match(T__7); - setState(1647); + setState(1644); _errHandler.sync(this); _la = _input.LA(1); if (_la==STRING) { { - setState(1646); + setState(1643); stringLiteral(); } } - setState(1649); + setState(1646); match(T__8); } } @@ -12217,21 +12277,21 @@ public final MlNumberNodeTestContext mlNumberNodeTest() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1651); + setState(1648); match(Knumber_node); - setState(1652); + setState(1649); match(T__7); - setState(1654); + setState(1651); _errHandler.sync(this); _la = _input.LA(1); if (_la==STRING) { { - setState(1653); + setState(1650); stringLiteral(); } } - setState(1656); + setState(1653); match(T__8); } } @@ -12269,21 +12329,21 @@ public final MlBooleanNodeTestContext mlBooleanNodeTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1658); + setState(1655); match(Kboolean_node); - setState(1659); + setState(1656); match(T__7); - setState(1661); + setState(1658); _errHandler.sync(this); _la = _input.LA(1); if (_la==STRING) { { - setState(1660); + setState(1657); stringLiteral(); } } - setState(1663); + setState(1660); match(T__8); } } @@ -12321,21 +12381,21 @@ public final MlNullNodeTestContext mlNullNodeTest() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1665); + setState(1662); match(Knull_node); - setState(1666); + setState(1663); match(T__7); - setState(1668); + setState(1665); _errHandler.sync(this); _la = _input.LA(1); if (_la==STRING) { { - setState(1667); + setState(1664); stringLiteral(); } } - setState(1670); + setState(1667); match(T__8); } } @@ -12377,43 +12437,43 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { SequenceTypeContext _localctx = new SequenceTypeContext(_ctx, getState()); enterRule(_localctx, 336, RULE_sequenceType); try { - setState(1680); + setState(1677); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1672); + setState(1669); match(T__7); - setState(1673); + setState(1670); match(T__8); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1674); + setState(1671); ((SequenceTypeContext)_localctx).item = itemType(); - setState(1678); + setState(1675); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { case 1: { - setState(1675); + setState(1672); ((SequenceTypeContext)_localctx).s168 = match(ArgumentPlaceholder); ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s168); } break; case 2: { - setState(1676); + setState(1673); ((SequenceTypeContext)_localctx).s10 = match(T__9); ((SequenceTypeContext)_localctx).star.add(((SequenceTypeContext)_localctx).s10); } break; case 3: { - setState(1677); + setState(1674); ((SequenceTypeContext)_localctx).s45 = match(T__44); ((SequenceTypeContext)_localctx).plus.add(((SequenceTypeContext)_localctx).s45); } @@ -12462,53 +12522,53 @@ public final ObjectConstructorContext objectConstructor() throws RecognitionExce enterRule(_localctx, 338, RULE_objectConstructor); int _la; try { - setState(1698); + setState(1695); _errHandler.sync(this); switch (_input.LA(1)) { case T__5: enterOuterAlt(_localctx, 1); { - setState(1682); + setState(1679); match(T__5); - setState(1691); + setState(1688); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1683); + setState(1680); pairConstructor(); - setState(1688); + setState(1685); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(1684); + setState(1681); match(T__12); - setState(1685); + setState(1682); pairConstructor(); } } - setState(1690); + setState(1687); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1693); + setState(1690); match(T__6); } break; case T__56: enterOuterAlt(_localctx, 2); { - setState(1694); + setState(1691); ((ObjectConstructorContext)_localctx).s57 = match(T__56); ((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s57); - setState(1695); + setState(1692); expr(); - setState(1696); + setState(1693); match(T__57); } break; @@ -12551,18 +12611,18 @@ public final FunctionTestContext functionTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1702); + setState(1699); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: { - setState(1700); + setState(1697); anyFunctionTest(); } break; case 2: { - setState(1701); + setState(1698); typedFunctionTest(); } break; @@ -12598,13 +12658,13 @@ public final AnyFunctionTestContext anyFunctionTest() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1704); + setState(1701); match(T__28); - setState(1705); + setState(1702); match(T__7); - setState(1706); + setState(1703); match(T__9); - setState(1707); + setState(1704); match(T__8); } } @@ -12648,43 +12708,43 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1709); + setState(1706); match(T__28); - setState(1710); + setState(1707); match(T__7); - setState(1719); + setState(1716); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__7) | (1L << T__28) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kattribute - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (Karray - 128)) | (1L << (Kmap - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1711); + setState(1708); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); - setState(1716); + setState(1713); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(1712); + setState(1709); match(T__12); - setState(1713); + setState(1710); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); } } - setState(1718); + setState(1715); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1721); + setState(1718); match(T__8); - setState(1722); + setState(1719); match(Kas); - setState(1723); + setState(1720); ((TypedFunctionTestContext)_localctx).rt = sequenceType(); } } @@ -12724,14 +12784,14 @@ public final SingleTypeContext singleType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1725); + setState(1722); ((SingleTypeContext)_localctx).item = itemType(); - setState(1727); + setState(1724); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { case 1: { - setState(1726); + setState(1723); ((SingleTypeContext)_localctx).s168 = match(ArgumentPlaceholder); ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s168); } @@ -12780,23 +12840,23 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1731); + setState(1728); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,165,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { case 1: { - setState(1729); + setState(1726); ((PairConstructorContext)_localctx).lhs = exprSingle(); } break; case 2: { - setState(1730); + setState(1727); ((PairConstructorContext)_localctx).name = match(NCName); } break; } - setState(1733); + setState(1730); _la = _input.LA(1); if ( !(_la==T__16 || _la==ArgumentPlaceholder) ) { _errHandler.recoverInline(this); @@ -12806,7 +12866,7 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio _errHandler.reportMatch(this); consume(); } - setState(1734); + setState(1731); ((PairConstructorContext)_localctx).rhs = exprSingle(); } } @@ -12843,19 +12903,19 @@ public final ArrayConstructorContext arrayConstructor() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1736); + setState(1733); match(T__50); - setState(1738); + setState(1735); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1737); + setState(1734); expr(); } } - setState(1740); + setState(1737); match(T__51); } } @@ -12891,7 +12951,7 @@ public final UriLiteralContext uriLiteral() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1742); + setState(1739); stringLiteral(); } } @@ -12925,7 +12985,7 @@ public final StringLiteralContext stringLiteral() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1744); + setState(1741); match(STRING); } } @@ -13032,7 +13092,7 @@ public final KeyWordsContext keyWords() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1746); + setState(1743); _la = _input.LA(1); if ( !(((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (Kfor - 59)) | (1L << (Klet - 59)) | (1L << (Kwhere - 59)) | (1L << (Kgroup - 59)) | (1L << (Kby - 59)) | (1L << (Korder - 59)) | (1L << (Kreturn - 59)) | (1L << (Kif - 59)) | (1L << (Kin - 59)) | (1L << (Kas - 59)) | (1L << (Kat - 59)) | (1L << (Kallowing - 59)) | (1L << (Kempty - 59)) | (1L << (Kcount - 59)) | (1L << (Kstable - 59)) | (1L << (Kascending - 59)) | (1L << (Kdescending - 59)) | (1L << (Ksome - 59)) | (1L << (Kevery - 59)) | (1L << (Ksatisfies - 59)) | (1L << (Kcollation - 59)) | (1L << (Kgreatest - 59)) | (1L << (Kleast - 59)) | (1L << (Kswitch - 59)) | (1L << (Kcase - 59)) | (1L << (Ktry - 59)) | (1L << (Kcatch - 59)) | (1L << (Kdefault - 59)) | (1L << (Kthen - 59)) | (1L << (Kelse - 59)) | (1L << (Ktypeswitch - 59)) | (1L << (Kor - 59)) | (1L << (Kand - 59)) | (1L << (Knot - 59)) | (1L << (Kto - 59)) | (1L << (Kinstance - 59)) | (1L << (Kof - 59)) | (1L << (Kstatically - 59)) | (1L << (Kis - 59)) | (1L << (Ktreat - 59)) | (1L << (Kcast - 59)) | (1L << (Kcastable - 59)) | (1L << (Kversion - 59)) | (1L << (Kjsoniq - 59)) | (1L << (Kunordered - 59)) | (1L << (Ktrue - 59)) | (1L << (Kfalse - 59)) | (1L << (Ktype - 59)) | (1L << (Kvalidate - 59)) | (1L << (Kannotate - 59)) | (1L << (Kdeclare - 59)) | (1L << (Kcontext - 59)) | (1L << (Kitem - 59)) | (1L << (Kvariable - 59)) | (1L << (Kinsert - 59)) | (1L << (Kdelete - 59)) | (1L << (Krename - 59)) | (1L << (Kreplace - 59)) | (1L << (Kcopy - 59)) | (1L << (Kmodify - 59)) | (1L << (Kappend - 59)) | (1L << (Kinto - 59)) | (1L << (Kvalue - 59)) | (1L << (Kjson - 59)))) != 0) || ((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (Kwith - 123)) | (1L << (Kposition - 123)) | (1L << (Kbreak - 123)) | (1L << (Kloop - 123)) | (1L << (Kcontinue - 123)) | (1L << (Kexit - 123)) | (1L << (Kreturning - 123)) | (1L << (Kwhile - 123)) | (1L << (NullLiteral - 123)))) != 0)) ) { _errHandler.recoverInline(this); @@ -13056,7 +13116,7 @@ public final KeyWordsContext keyWords() throws RecognitionException { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00b4\u06d7\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00b4\u06d4\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -13160,322 +13220,321 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087"+ "\3\u0087\5\u0087\u05cf\n\u0087\3\u0088\3\u0088\3\u0089\3\u0089\3\u0089"+ "\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089"+ - "\5\u0089\u05df\n\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u05e4\n\u008a\3"+ - "\u008a\3\u008a\3\u008b\3\u008b\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c"+ - "\3\u008c\5\u008c\u05f0\n\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d"+ - "\3\u008d\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f"+ - "\3\u0090\3\u0090\3\u0090\3\u0090\5\u0090\u0604\n\u0090\3\u0090\3\u0090"+ - "\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\5\u0091\u060d\n\u0091\5\u0091"+ - "\u060f\n\u0091\3\u0091\3\u0091\3\u0092\3\u0092\5\u0092\u0615\n\u0092\3"+ - "\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094"+ - "\3\u0094\3\u0094\5\u0094\u0622\n\u0094\5\u0094\u0624\n\u0094\5\u0094\u0626"+ - "\n\u0094\3\u0094\3\u0094\3\u0095\3\u0095\5\u0095\u062c\n\u0095\3\u0096"+ - "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0098\3\u0098\3\u0099"+ - "\3\u0099\3\u009a\3\u009a\3\u009b\3\u009b\3\u009c\3\u009c\5\u009c\u063f"+ - "\n\u009c\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e"+ - "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f\5\u009f\u064f\n\u009f"+ - "\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a1"+ - "\3\u00a1\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4"+ - "\3\u00a4\3\u00a4\3\u00a4\5\u00a4\u0666\n\u00a4\3\u00a5\3\u00a5\3\u00a5"+ - "\5\u00a5\u066b\n\u00a5\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a6\5\u00a6"+ - "\u0672\n\u00a6\3\u00a6\3\u00a6\3\u00a7\3\u00a7\3\u00a7\5\u00a7\u0679\n"+ - "\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8\5\u00a8\u0680\n\u00a8\3"+ - "\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\5\u00a9\u0687\n\u00a9\3\u00a9\3"+ - "\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u0691\n"+ - "\u00aa\5\u00aa\u0693\n\u00aa\3\u00ab\3\u00ab\3\u00ab\3\u00ab\7\u00ab\u0699"+ - "\n\u00ab\f\u00ab\16\u00ab\u069c\13\u00ab\5\u00ab\u069e\n\u00ab\3\u00ab"+ - "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\5\u00ab\u06a5\n\u00ab\3\u00ac\3\u00ac"+ - "\5\u00ac\u06a9\n\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ae"+ - "\3\u00ae\3\u00ae\3\u00ae\3\u00ae\7\u00ae\u06b5\n\u00ae\f\u00ae\16\u00ae"+ - "\u06b8\13\u00ae\5\u00ae\u06ba\n\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae"+ - "\3\u00af\3\u00af\5\u00af\u06c2\n\u00af\3\u00b0\3\u00b0\5\u00b0\u06c6\n"+ - "\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b1\3\u00b1\5\u00b1\u06cd\n\u00b1\3"+ - "\u00b1\3\u00b1\3\u00b2\3\u00b2\3\u00b3\3\u00b3\3\u00b4\3\u00b4\3\u00b4"+ - "\2\2\u00b5\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\66"+ - "8:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a"+ - "\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2"+ - "\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba"+ - "\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2"+ - "\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea"+ - "\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102"+ - "\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a"+ - "\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132"+ - "\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a"+ - "\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162"+ - "\u0164\u0166\2\r\4\2\21\21ii\3\2RS\3\2\24\35\4\2\5\5#-\3\2/\60\4\2\f\f"+ - "\61\63\3\2\u0089\u008a\3\2\u008c\u0092\3\2\u0093\u0097\4\2\23\23\u00aa"+ - "\u00aa\4\2=\u0084\u00ab\u00ab\2\u071e\2\u0168\3\2\2\2\4\u0170\3\2\2\2"+ - "\6\u0176\3\2\2\2\b\u0179\3\2\2\2\n\u018a\3\2\2\2\f\u0195\3\2\2\2\16\u019a"+ - "\3\2\2\2\20\u019d\3\2\2\2\22\u01a0\3\2\2\2\24\u01b1\3\2\2\2\26\u01b3\3"+ - "\2\2\2\30\u01b6\3\2\2\2\32\u01bc\3\2\2\2\34\u01c0\3\2\2\2\36\u01c4\3\2"+ - "\2\2 \u01c8\3\2\2\2\"\u01cf\3\2\2\2$\u01df\3\2\2\2&\u01e8\3\2\2\2(\u01f7"+ - "\3\2\2\2*\u01fe\3\2\2\2,\u0205\3\2\2\2.\u0216\3\2\2\2\60\u0226\3\2\2\2"+ - "\62\u0237\3\2\2\2\64\u0248\3\2\2\2\66\u024b\3\2\2\28\u0257\3\2\2\2:\u0260"+ - "\3\2\2\2<\u026a\3\2\2\2>\u026c\3\2\2\2@\u0276\3\2\2\2B\u0278\3\2\2\2D"+ - "\u027d\3\2\2\2F\u0281\3\2\2\2H\u0287\3\2\2\2J\u029c\3\2\2\2L\u02a2\3\2"+ - "\2\2N\u02a4\3\2\2\2P\u02b7\3\2\2\2R\u02c8\3\2\2\2T\u02d8\3\2\2\2V\u02ec"+ - "\3\2\2\2X\u02fb\3\2\2\2Z\u02fd\3\2\2\2\\\u0305\3\2\2\2^\u030b\3\2\2\2"+ - "`\u0319\3\2\2\2b\u0323\3\2\2\2d\u0327\3\2\2\2f\u0337\3\2\2\2h\u0340\3"+ - "\2\2\2j\u0350\3\2\2\2l\u0359\3\2\2\2n\u0361\3\2\2\2p\u0364\3\2\2\2r\u036e"+ - "\3\2\2\2t\u0380\3\2\2\2v\u038a\3\2\2\2x\u039a\3\2\2\2z\u039f\3\2\2\2|"+ - "\u03ac\3\2\2\2~\u03b4\3\2\2\2\u0080\u03c3\3\2\2\2\u0082\u03ca\3\2\2\2"+ - "\u0084\u03da\3\2\2\2\u0086\u03eb\3\2\2\2\u0088\u03f4\3\2\2\2\u008a\u03fd"+ - "\3\2\2\2\u008c\u0410\3\2\2\2\u008e\u0418\3\2\2\2\u0090\u0421\3\2\2\2\u0092"+ - "\u0425\3\2\2\2\u0094\u042a\3\2\2\2\u0096\u0432\3\2\2\2\u0098\u0437\3\2"+ - "\2\2\u009a\u043f\3\2\2\2\u009c\u0447\3\2\2\2\u009e\u044d\3\2\2\2\u00a0"+ - "\u0453\3\2\2\2\u00a2\u0459\3\2\2\2\u00a4\u045f\3\2\2\2\u00a6\u0465\3\2"+ - "\2\2\u00a8\u0474\3\2\2\2\u00aa\u0479\3\2\2\2\u00ac\u0481\3\2\2\2\u00ae"+ - "\u0483\3\2\2\2\u00b0\u048a\3\2\2\2\u00b2\u0491\3\2\2\2\u00b4\u0499\3\2"+ - "\2\2\u00b6\u04a4\3\2\2\2\u00b8\u04aa\3\2\2\2\u00ba\u04ad\3\2\2\2\u00bc"+ - "\u04b1\3\2\2\2\u00be\u04c9\3\2\2\2\u00c0\u04cb\3\2\2\2\u00c2\u04cf\3\2"+ - "\2\2\u00c4\u04d2\3\2\2\2\u00c6\u04d8\3\2\2\2\u00c8\u04da\3\2\2\2\u00ca"+ - "\u04df\3\2\2\2\u00cc\u04e4\3\2\2\2\u00ce\u04e7\3\2\2\2\u00d0\u04f5\3\2"+ - "\2\2\u00d2\u04f9\3\2\2\2\u00d4\u04fb\3\2\2\2\u00d6\u04ff\3\2\2\2\u00d8"+ - "\u0525\3\2\2\2\u00da\u0527\3\2\2\2\u00dc\u052b\3\2\2\2\u00de\u0531\3\2"+ - "\2\2\u00e0\u0539\3\2\2\2\u00e2\u0548\3\2\2\2\u00e4\u054e\3\2\2\2\u00e6"+ - "\u0555\3\2\2\2\u00e8\u0559\3\2\2\2\u00ea\u0570\3\2\2\2\u00ec\u0579\3\2"+ - "\2\2\u00ee\u057b\3\2\2\2\u00f0\u0585\3\2\2\2\u00f2\u0589\3\2\2\2\u00f4"+ - "\u0591\3\2\2\2\u00f6\u0593\3\2\2\2\u00f8\u0598\3\2\2\2\u00fa\u05a0\3\2"+ - "\2\2\u00fc\u05a2\3\2\2\2\u00fe\u05a6\3\2\2\2\u0100\u05aa\3\2\2\2\u0102"+ - "\u05ae\3\2\2\2\u0104\u05b3\3\2\2\2\u0106\u05b5\3\2\2\2\u0108\u05b9\3\2"+ - "\2\2\u010a\u05c0\3\2\2\2\u010c\u05ce\3\2\2\2\u010e\u05d0\3\2\2\2\u0110"+ - "\u05de\3\2\2\2\u0112\u05e0\3\2\2\2\u0114\u05e7\3\2\2\2\u0116\u05eb\3\2"+ - "\2\2\u0118\u05f3\3\2\2\2\u011a\u05f7\3\2\2\2\u011c\u05fb\3\2\2\2\u011e"+ - "\u05ff\3\2\2\2\u0120\u0607\3\2\2\2\u0122\u0614\3\2\2\2\u0124\u0616\3\2"+ - "\2\2\u0126\u061b\3\2\2\2\u0128\u062b\3\2\2\2\u012a\u062d\3\2\2\2\u012c"+ - "\u0632\3\2\2\2\u012e\u0634\3\2\2\2\u0130\u0636\3\2\2\2\u0132\u0638\3\2"+ - "\2\2\u0134\u063a\3\2\2\2\u0136\u063e\3\2\2\2\u0138\u0640\3\2\2\2\u013a"+ - "\u0645\3\2\2\2\u013c\u064e\3\2\2\2\u013e\u0650\3\2\2\2\u0140\u0655\3\2"+ - "\2\2\u0142\u065a\3\2\2\2\u0144\u065e\3\2\2\2\u0146\u0665\3\2\2\2\u0148"+ - "\u0667\3\2\2\2\u014a\u066e\3\2\2\2\u014c\u0675\3\2\2\2\u014e\u067c\3\2"+ - "\2\2\u0150\u0683\3\2\2\2\u0152\u0692\3\2\2\2\u0154\u06a4\3\2\2\2\u0156"+ - "\u06a8\3\2\2\2\u0158\u06aa\3\2\2\2\u015a\u06af\3\2\2\2\u015c\u06bf\3\2"+ - "\2\2\u015e\u06c5\3\2\2\2\u0160\u06ca\3\2\2\2\u0162\u06d0\3\2\2\2\u0164"+ - "\u06d2\3\2\2\2\u0166\u06d4\3\2\2\2\u0168\u0169\5\4\3\2\u0169\u016a\7\2"+ - "\2\3\u016a\3\3\2\2\2\u016b\u016c\7h\2\2\u016c\u016d\7g\2\2\u016d\u016e"+ - "\5\u0164\u00b3\2\u016e\u016f\7\3\2\2\u016f\u0171\3\2\2\2\u0170\u016b\3"+ - "\2\2\2\u0170\u0171\3\2\2\2\u0171\u0174\3\2\2\2\u0172\u0175\5\b\5\2\u0173"+ - "\u0175\5\6\4\2\u0174\u0172\3\2\2\2\u0174\u0173\3\2\2\2\u0175\5\3\2\2\2"+ - "\u0176\u0177\5\n\6\2\u0177\u0178\5\f\7\2\u0178\7\3\2\2\2\u0179\u017a\7"+ - "\4\2\2\u017a\u017b\7\u0087\2\2\u017b\u017c\7\u00b2\2\2\u017c\u017d\7\5"+ - "\2\2\u017d\u017e\5\u0162\u00b2\2\u017e\u017f\7\3\2\2\u017f\u0180\5\n\6"+ - "\2\u0180\t\3\2\2\2\u0181\u0185\5<\37\2\u0182\u0185\5> \2\u0183\u0185\5"+ - "N(\2\u0184\u0181\3\2\2\2\u0184\u0182\3\2\2\2\u0184\u0183\3\2\2\2\u0185"+ - "\u0186\3\2\2\2\u0186\u0187\7\3\2\2\u0187\u0189\3\2\2\2\u0188\u0184\3\2"+ - "\2\2\u0189\u018c\3\2\2\2\u018a\u0188\3\2\2\2\u018a\u018b\3\2\2\2\u018b"+ - "\u0192\3\2\2\2\u018c\u018a\3\2\2\2\u018d\u018e\5@!\2\u018e\u018f\7\3\2"+ - "\2\u018f\u0191\3\2\2\2\u0190\u018d\3\2\2\2\u0191\u0194\3\2\2\2\u0192\u0190"+ - "\3\2\2\2\u0192\u0193\3\2\2\2\u0193\13\3\2\2\2\u0194\u0192\3\2\2\2\u0195"+ - "\u0196\5\22\n\2\u0196\r\3\2\2\2\u0197\u0199\5\24\13\2\u0198\u0197\3\2"+ - "\2\2\u0199\u019c\3\2\2\2\u019a\u0198\3\2\2\2\u019a\u019b\3\2\2\2\u019b"+ - "\17\3\2\2\2\u019c\u019a\3\2\2\2\u019d\u019e\5\16\b\2\u019e\u019f\5^\60"+ - "\2\u019f\21\3\2\2\2\u01a0\u01a2\5\16\b\2\u01a1\u01a3\5^\60\2\u01a2\u01a1"+ - "\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\23\3\2\2\2\u01a4\u01b2\5\26\f\2\u01a5"+ - "\u01b2\5\30\r\2\u01a6\u01b2\5\32\16\2\u01a7\u01b2\5\34\17\2\u01a8\u01b2"+ - "\5\36\20\2\u01a9\u01b2\5 \21\2\u01aa\u01b2\5\"\22\2\u01ab\u01b2\5$\23"+ - "\2\u01ac\u01b2\5&\24\2\u01ad\u01b2\5*\26\2\u01ae\u01b2\5.\30\2\u01af\u01b2"+ - "\5\66\34\2\u01b0\u01b2\5:\36\2\u01b1\u01a4\3\2\2\2\u01b1\u01a5\3\2\2\2"+ - "\u01b1\u01a6\3\2\2\2\u01b1\u01a7\3\2\2\2\u01b1\u01a8\3\2\2\2\u01b1\u01a9"+ - "\3\2\2\2\u01b1\u01aa\3\2\2\2\u01b1\u01ab\3\2\2\2\u01b1\u01ac\3\2\2\2\u01b1"+ - "\u01ad\3\2\2\2\u01b1\u01ae\3\2\2\2\u01b1\u01af\3\2\2\2\u01b1\u01b0\3\2"+ - "\2\2\u01b2\25\3\2\2\2\u01b3\u01b4\5b\62\2\u01b4\u01b5\7\3\2\2\u01b5\27"+ - "\3\2\2\2\u01b6\u01b7\7\6\2\2\u01b7\u01b8\5J&\2\u01b8\u01b9\7\7\2\2\u01b9"+ - "\u01ba\5`\61\2\u01ba\u01bb\7\3\2\2\u01bb\31\3\2\2\2\u01bc\u01bd\7\b\2"+ - "\2\u01bd\u01be\5\16\b\2\u01be\u01bf\7\t\2\2\u01bf\33\3\2\2\2\u01c0\u01c1"+ - "\7\177\2\2\u01c1\u01c2\7\u0080\2\2\u01c2\u01c3\7\3\2\2\u01c3\35\3\2\2"+ - "\2\u01c4\u01c5\7\u0081\2\2\u01c5\u01c6\7\u0080\2\2\u01c6\u01c7\7\3\2\2"+ - "\u01c7\37\3\2\2\2\u01c8\u01c9\7\u0082\2\2\u01c9\u01ca\7\u0083\2\2\u01ca"+ - "\u01cb\5`\61\2\u01cb\u01cc\7\3\2\2\u01cc!\3\2\2\2\u01cd\u01d0\5f\64\2"+ - "\u01ce\u01d0\5j\66\2\u01cf\u01cd\3\2\2\2\u01cf\u01ce\3\2\2\2\u01d0\u01d9"+ - "\3\2\2\2\u01d1\u01d8\5f\64\2\u01d2\u01d8\5j\66\2\u01d3\u01d8\5n8\2\u01d4"+ - "\u01d8\5p9\2\u01d5\u01d8\5t;\2\u01d6\u01d8\5x=\2\u01d7\u01d1\3\2\2\2\u01d7"+ - "\u01d2\3\2\2\2\u01d7\u01d3\3\2\2\2\u01d7\u01d4\3\2\2\2\u01d7\u01d5\3\2"+ - "\2\2\u01d7\u01d6\3\2\2\2\u01d8\u01db\3\2\2\2\u01d9\u01d7\3\2\2\2\u01d9"+ - "\u01da\3\2\2\2\u01da\u01dc\3\2\2\2\u01db\u01d9\3\2\2\2\u01dc\u01dd\7C"+ - "\2\2\u01dd\u01de\5\24\13\2\u01de#\3\2\2\2\u01df\u01e0\7D\2\2\u01e0\u01e1"+ - "\7\n\2\2\u01e1\u01e2\5^\60\2\u01e2\u01e3\7\13\2\2\u01e3\u01e4\7Y\2\2\u01e4"+ - "\u01e5\5\24\13\2\u01e5\u01e6\7Z\2\2\u01e6\u01e7\5\24\13\2\u01e7%\3\2\2"+ - "\2\u01e8\u01e9\7T\2\2\u01e9\u01ea\7\n\2\2\u01ea\u01eb\5^\60\2\u01eb\u01ed"+ - "\7\13\2\2\u01ec\u01ee\5(\25\2\u01ed\u01ec\3\2\2\2\u01ee\u01ef\3\2\2\2"+ - "\u01ef\u01ed\3\2\2\2\u01ef\u01f0\3\2\2\2\u01f0\u01f1\3\2\2\2\u01f1\u01f2"+ - "\7X\2\2\u01f2\u01f3\7C\2\2\u01f3\u01f4\5\24\13\2\u01f4\'\3\2\2\2\u01f5"+ - "\u01f6\7U\2\2\u01f6\u01f8\5`\61\2\u01f7\u01f5\3\2\2\2\u01f8\u01f9\3\2"+ - "\2\2\u01f9\u01f7\3\2\2\2\u01f9\u01fa\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb"+ - "\u01fc\7C\2\2\u01fc\u01fd\5\24\13\2\u01fd)\3\2\2\2\u01fe\u01ff\7V\2\2"+ - "\u01ff\u0201\5\32\16\2\u0200\u0202\5,\27\2\u0201\u0200\3\2\2\2\u0202\u0203"+ - "\3\2\2\2\u0203\u0201\3\2\2\2\u0203\u0204\3\2\2\2\u0204+\3\2\2\2\u0205"+ - "\u0208\7W\2\2\u0206\u0209\7\f\2\2\u0207\u0209\5J&\2\u0208\u0206\3\2\2"+ - "\2\u0208\u0207\3\2\2\2\u0209\u0211\3\2\2\2\u020a\u020d\7\r\2\2\u020b\u020e"+ - "\7\f\2\2\u020c\u020e\5J&\2\u020d\u020b\3\2\2\2\u020d\u020c\3\2\2\2\u020e"+ - "\u0210\3\2\2\2\u020f\u020a\3\2\2\2\u0210\u0213\3\2\2\2\u0211\u020f\3\2"+ - "\2\2\u0211\u0212\3\2\2\2\u0212\u0214\3\2\2\2\u0213\u0211\3\2\2\2\u0214"+ - "\u0215\5\32\16\2\u0215-\3\2\2\2\u0216\u0217\7[\2\2\u0217\u0218\7\n\2\2"+ - "\u0218\u0219\5^\60\2\u0219\u021b\7\13\2\2\u021a\u021c\5\60\31\2\u021b"+ - "\u021a\3\2\2\2\u021c\u021d\3\2\2\2\u021d\u021b\3\2\2\2\u021d\u021e\3\2"+ - "\2\2\u021e\u021f\3\2\2\2\u021f\u0221\7X\2\2\u0220\u0222\5\u00c2b\2\u0221"+ - "\u0220\3\2\2\2\u0221\u0222\3\2\2\2\u0222\u0223\3\2\2\2\u0223\u0224\7C"+ - "\2\2\u0224\u0225\5\24\13\2\u0225/\3\2\2\2\u0226\u022a\7U\2\2\u0227\u0228"+ - "\5\u00c2b\2\u0228\u0229\7F\2\2\u0229\u022b\3\2\2\2\u022a\u0227\3\2\2\2"+ - "\u022a\u022b\3\2\2\2\u022b\u022c\3\2\2\2\u022c\u0231\5\u0152\u00aa\2\u022d"+ - "\u022e\7\r\2\2\u022e\u0230\5\u0152\u00aa\2\u022f\u022d\3\2\2\2\u0230\u0233"+ - "\3\2\2\2\u0231\u022f\3\2\2\2\u0231\u0232\3\2\2\2\u0232\u0234\3\2\2\2\u0233"+ - "\u0231\3\2\2\2\u0234\u0235\7C\2\2\u0235\u0236\5\24\13\2\u0236\61\3\2\2"+ - "\2\u0237\u0238\7\16\2\2\u0238\u0243\5J&\2\u0239\u023a\7\n\2\2\u023a\u023f"+ - "\7\u00ac\2\2\u023b\u023c\7\17\2\2\u023c\u023e\7\u00ac\2\2\u023d\u023b"+ - "\3\2\2\2\u023e\u0241\3\2\2\2\u023f\u023d\3\2\2\2\u023f\u0240\3\2\2\2\u0240"+ - "\u0242\3\2\2\2\u0241\u023f\3\2\2\2\u0242\u0244\7\13\2\2\u0243\u0239\3"+ - "\2\2\2\u0243\u0244\3\2\2\2\u0244\63\3\2\2\2\u0245\u0247\5\62\32\2\u0246"+ - "\u0245\3\2\2\2\u0247\u024a\3\2\2\2\u0248\u0246\3\2\2\2\u0248\u0249\3\2"+ - "\2\2\u0249\65\3\2\2\2\u024a\u0248\3\2\2\2\u024b\u024c\5\64\33\2\u024c"+ - "\u024d\7r\2\2\u024d\u0252\58\35\2\u024e\u024f\7\17\2\2\u024f\u0251\58"+ - "\35\2\u0250\u024e\3\2\2\2\u0251\u0254\3\2\2\2\u0252\u0250\3\2\2\2\u0252"+ - "\u0253\3\2\2\2\u0253\u0255\3\2\2\2\u0254\u0252\3\2\2\2\u0255\u0256\7\3"+ - "\2\2\u0256\67\3\2\2\2\u0257\u025a\5\u00c2b\2\u0258\u0259\7F\2\2\u0259"+ - "\u025b\5\u0152\u00aa\2\u025a\u0258\3\2\2\2\u025a\u025b\3\2\2\2\u025b\u025e"+ - "\3\2\2\2\u025c\u025d\7\7\2\2\u025d\u025f\5`\61\2\u025e\u025c\3\2\2\2\u025e"+ - "\u025f\3\2\2\2\u025f9\3\2\2\2\u0260\u0261\7\u0084\2\2\u0261\u0262\7\n"+ - "\2\2\u0262\u0263\5^\60\2\u0263\u0264\7\13\2\2\u0264\u0265\5\24\13\2\u0265"+ - ";\3\2\2\2\u0266\u026b\5B\"\2\u0267\u026b\5D#\2\u0268\u026b\5F$\2\u0269"+ - "\u026b\5H%\2\u026a\u0266\3\2\2\2\u026a\u0267\3\2\2\2\u026a\u0268\3\2\2"+ - "\2\u026a\u0269\3\2\2\2\u026b=\3\2\2\2\u026c\u026d\7o\2\2\u026d\u026e\7"+ - "\u0087\2\2\u026e\u026f\7\u00b2\2\2\u026f\u0270\7\5\2\2\u0270\u0271\5\u0162"+ - "\u00b2\2\u0271?\3\2\2\2\u0272\u0277\5T+\2\u0273\u0277\5P)\2\u0274\u0277"+ - "\5V,\2\u0275\u0277\5R*\2\u0276\u0272\3\2\2\2\u0276\u0273\3\2\2\2\u0276"+ - "\u0274\3\2\2\2\u0276\u0275\3\2\2\2\u0277A\3\2\2\2\u0278\u0279\7o\2\2\u0279"+ - "\u027a\7X\2\2\u027a\u027b\7Q\2\2\u027b\u027c\5\u0162\u00b2\2\u027cC\3"+ - "\2\2\2\u027d\u027e\7o\2\2\u027e\u027f\7\20\2\2\u027f\u0280\t\2\2\2\u0280"+ - "E\3\2\2\2\u0281\u0282\7o\2\2\u0282\u0283\7X\2\2\u0283\u0284\7B\2\2\u0284"+ - "\u0285\7I\2\2\u0285\u0286\t\3\2\2\u0286G\3\2\2\2\u0287\u028c\7o\2\2\u0288"+ - "\u0289\7\22\2\2\u0289\u028d\5J&\2\u028a\u028b\7X\2\2\u028b\u028d\7\22"+ - "\2\2\u028c\u0288\3\2\2\2\u028c\u028a\3\2\2\2\u028d\u0294\3\2\2\2\u028e"+ - "\u028f\5L\'\2\u028f\u0290\7\5\2\2\u0290\u0291\5\u0164\u00b3\2\u0291\u0293"+ - "\3\2\2\2\u0292\u028e\3\2\2\2\u0293\u0296\3\2\2\2\u0294\u0292\3\2\2\2\u0294"+ - "\u0295\3\2\2\2\u0295I\3\2\2\2\u0296\u0294\3\2\2\2\u0297\u029a\7\u00b2"+ - "\2\2\u0298\u029a\5\u0166\u00b4\2\u0299\u0297\3\2\2\2\u0299\u0298\3\2\2"+ - "\2\u029a\u029b\3\2\2\2\u029b\u029d\7\23\2\2\u029c\u0299\3\2\2\2\u029c"+ - "\u029d\3\2\2\2\u029d\u02a0\3\2\2\2\u029e\u02a1\7\u00b2\2\2\u029f\u02a1"+ - "\5\u0166\u00b4\2\u02a0\u029e\3\2\2\2\u02a0\u029f\3\2\2\2\u02a1K\3\2\2"+ - "\2\u02a2\u02a3\t\4\2\2\u02a3M\3\2\2\2\u02a4\u02a5\7\u0085\2\2\u02a5\u02a9"+ - "\7\4\2\2\u02a6\u02a7\7\u0087\2\2\u02a7\u02a8\7\u00b2\2\2\u02a8\u02aa\7"+ - "\5\2\2\u02a9\u02a6\3\2\2\2\u02a9\u02aa\3\2\2\2\u02aa\u02ab\3\2\2\2\u02ab"+ - "\u02b5\5\u0162\u00b2\2\u02ac\u02ad\7G\2\2\u02ad\u02b2\5\u0162\u00b2\2"+ - "\u02ae\u02af\7\17\2\2\u02af\u02b1\5\u0162\u00b2\2\u02b0\u02ae\3\2\2\2"+ - "\u02b1\u02b4\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b2\u02b3\3\2\2\2\u02b3\u02b6"+ - "\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5\u02ac\3\2\2\2\u02b5\u02b6\3\2\2\2\u02b6"+ - "O\3\2\2\2\u02b7\u02b8\7o\2\2\u02b8\u02b9\5\64\33\2\u02b9\u02ba\7r\2\2"+ - "\u02ba\u02bd\5\u00c2b\2\u02bb\u02bc\7F\2\2\u02bc\u02be\5\u0152\u00aa\2"+ - "\u02bd\u02bb\3\2\2\2\u02bd\u02be\3\2\2\2\u02be\u02c6\3\2\2\2\u02bf\u02c0"+ - "\7\7\2\2\u02c0\u02c7\5`\61\2\u02c1\u02c4\7\36\2\2\u02c2\u02c3\7\7\2\2"+ - "\u02c3\u02c5\5`\61\2\u02c4\u02c2\3\2\2\2\u02c4\u02c5\3\2\2\2\u02c5\u02c7"+ - "\3\2\2\2\u02c6\u02bf\3\2\2\2\u02c6\u02c1\3\2\2\2\u02c7Q\3\2\2\2\u02c8"+ - "\u02c9\7o\2\2\u02c9\u02ca\7p\2\2\u02ca\u02cd\7q\2\2\u02cb\u02cc\7F\2\2"+ - "\u02cc\u02ce\5\u0152\u00aa\2\u02cd\u02cb\3\2\2\2\u02cd\u02ce\3\2\2\2\u02ce"+ - "\u02d6\3\2\2\2\u02cf\u02d0\7\7\2\2\u02d0\u02d7\5`\61\2\u02d1\u02d4\7\36"+ - "\2\2\u02d2\u02d3\7\7\2\2\u02d3\u02d5\5`\61\2\u02d4\u02d2\3\2\2\2\u02d4"+ - "\u02d5\3\2\2\2\u02d5\u02d7\3\2\2\2\u02d6\u02cf\3\2\2\2\u02d6\u02d1\3\2"+ - "\2\2\u02d7S\3\2\2\2\u02d8\u02d9\7o\2\2\u02d9\u02da\5\64\33\2\u02da\u02db"+ - "\7\37\2\2\u02db\u02dc\5J&\2\u02dc\u02de\7\n\2\2\u02dd\u02df\5Z.\2\u02de"+ - "\u02dd\3\2\2\2\u02de\u02df\3\2\2\2\u02df\u02e0\3\2\2\2\u02e0\u02e3\7\13"+ - "\2\2\u02e1\u02e2\7F\2\2\u02e2\u02e4\5\u0152\u00aa\2\u02e3\u02e1\3\2\2"+ - "\2\u02e3\u02e4\3\2\2\2\u02e4\u02ea\3\2\2\2\u02e5\u02e6\7\b\2\2\u02e6\u02e7"+ - "\5\22\n\2\u02e7\u02e8\7\t\2\2\u02e8\u02eb\3\2\2\2\u02e9\u02eb\7\36\2\2"+ - "\u02ea\u02e5\3\2\2\2\u02ea\u02e9\3\2\2\2\u02ebU\3\2\2\2\u02ec\u02ed\7"+ - "o\2\2\u02ed\u02ee\7l\2\2\u02ee\u02ef\5J&\2\u02ef\u02f1\7F\2\2\u02f0\u02f2"+ - "\5X-\2\u02f1\u02f0\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3"+ - "\u02f4\5`\61\2\u02f4W\3\2\2\2\u02f5\u02f6\7 \2\2\u02f6\u02fc\7!\2\2\u02f7"+ - "\u02f8\7 \2\2\u02f8\u02fc\7\"\2\2\u02f9\u02fa\7|\2\2\u02fa\u02fc\7\u0086"+ - "\2\2\u02fb\u02f5\3\2\2\2\u02fb\u02f7\3\2\2\2\u02fb\u02f9\3\2\2\2\u02fc"+ - "Y\3\2\2\2\u02fd\u0302\5\\/\2\u02fe\u02ff\7\17\2\2\u02ff\u0301\5\\/\2\u0300"+ - "\u02fe\3\2\2\2\u0301\u0304\3\2\2\2\u0302\u0300\3\2\2\2\u0302\u0303\3\2"+ - "\2\2\u0303[\3\2\2\2\u0304\u0302\3\2\2\2\u0305\u0306\7\6\2\2\u0306\u0309"+ - "\5J&\2\u0307\u0308\7F\2\2\u0308\u030a\5\u0152\u00aa\2\u0309\u0307\3\2"+ - "\2\2\u0309\u030a\3\2\2\2\u030a]\3\2\2\2\u030b\u0310\5`\61\2\u030c\u030d"+ - "\7\17\2\2\u030d\u030f\5`\61\2\u030e\u030c\3\2\2\2\u030f\u0312\3\2\2\2"+ - "\u0310\u030e\3\2\2\2\u0310\u0311\3\2\2\2\u0311_\3\2\2\2\u0312\u0310\3"+ - "\2\2\2\u0313\u031a\5b\62\2\u0314\u031a\5d\63\2\u0315\u031a\5~@\2\u0316"+ - "\u031a\5\u0082B\2\u0317\u031a\5\u0086D\2\u0318\u031a\5\u0088E\2\u0319"+ - "\u0313\3\2\2\2\u0319\u0314\3\2\2\2\u0319\u0315\3\2\2\2\u0319\u0316\3\2"+ - "\2\2\u0319\u0317\3\2\2\2\u0319\u0318\3\2\2\2\u031aa\3\2\2\2\u031b\u0324"+ - "\5z>\2\u031c\u0324\5\u008cG\2\u031d\u0324\5\u00d8m\2\u031e\u0324\5\u00da"+ - "n\2\u031f\u0324\5\u00dco\2\u0320\u0324\5\u00dep\2\u0321\u0324\5\u00e0"+ - "q\2\u0322\u0324\5\u00e2r\2\u0323\u031b\3\2\2\2\u0323\u031c\3\2\2\2\u0323"+ - "\u031d\3\2\2\2\u0323\u031e\3\2\2\2\u0323\u031f\3\2\2\2\u0323\u0320\3\2"+ - "\2\2\u0323\u0321\3\2\2\2\u0323\u0322\3\2\2\2\u0324c\3\2\2\2\u0325\u0328"+ - "\5f\64\2\u0326\u0328\5j\66\2\u0327\u0325\3\2\2\2\u0327\u0326\3\2\2\2\u0328"+ - "\u0331\3\2\2\2\u0329\u0330\5f\64\2\u032a\u0330\5j\66\2\u032b\u0330\5n"+ - "8\2\u032c\u0330\5p9\2\u032d\u0330\5t;\2\u032e\u0330\5x=\2\u032f\u0329"+ - "\3\2\2\2\u032f\u032a\3\2\2\2\u032f\u032b\3\2\2\2\u032f\u032c\3\2\2\2\u032f"+ - "\u032d\3\2\2\2\u032f\u032e\3\2\2\2\u0330\u0333\3\2\2\2\u0331\u032f\3\2"+ - "\2\2\u0331\u0332\3\2\2\2\u0332\u0334\3\2\2\2\u0333\u0331\3\2\2\2\u0334"+ - "\u0335\7C\2\2\u0335\u0336\5`\61\2\u0336e\3\2\2\2\u0337\u0338\7=\2\2\u0338"+ - "\u033d\5h\65\2\u0339\u033a\7\17\2\2\u033a\u033c\5h\65\2\u033b\u0339\3"+ - "\2\2\2\u033c\u033f\3\2\2\2\u033d\u033b\3\2\2\2\u033d\u033e\3\2\2\2\u033e"+ - "g\3\2\2\2\u033f\u033d\3\2\2\2\u0340\u0343\5\u00c2b\2\u0341\u0342\7F\2"+ - "\2\u0342\u0344\5\u0152\u00aa\2\u0343\u0341\3\2\2\2\u0343\u0344\3\2\2\2"+ - "\u0344\u0347\3\2\2\2\u0345\u0346\7H\2\2\u0346\u0348\7I\2\2\u0347\u0345"+ - "\3\2\2\2\u0347\u0348\3\2\2\2\u0348\u034b\3\2\2\2\u0349\u034a\7G\2\2\u034a"+ - "\u034c\5\u00c2b\2\u034b\u0349\3\2\2\2\u034b\u034c\3\2\2\2\u034c\u034d"+ - "\3\2\2\2\u034d\u034e\7E\2\2\u034e\u034f\5`\61\2\u034fi\3\2\2\2\u0350\u0351"+ - "\7>\2\2\u0351\u0356\5l\67\2\u0352\u0353\7\17\2\2\u0353\u0355\5l\67\2\u0354"+ - "\u0352\3\2\2\2\u0355\u0358\3\2\2\2\u0356\u0354\3\2\2\2\u0356\u0357\3\2"+ - "\2\2\u0357k\3\2\2\2\u0358\u0356\3\2\2\2\u0359\u035c\5\u00c2b\2\u035a\u035b"+ - "\7F\2\2\u035b\u035d\5\u0152\u00aa\2\u035c\u035a\3\2\2\2\u035c\u035d\3"+ - "\2\2\2\u035d\u035e\3\2\2\2\u035e\u035f\7\7\2\2\u035f\u0360\5`\61\2\u0360"+ - "m\3\2\2\2\u0361\u0362\7?\2\2\u0362\u0363\5`\61\2\u0363o\3\2\2\2\u0364"+ - "\u0365\7@\2\2\u0365\u0366\7A\2\2\u0366\u036b\5r:\2\u0367\u0368\7\17\2"+ - "\2\u0368\u036a\5r:\2\u0369\u0367\3\2\2\2\u036a\u036d\3\2\2\2\u036b\u0369"+ - "\3\2\2\2\u036b\u036c\3\2\2\2\u036cq\3\2\2\2\u036d\u036b\3\2\2\2\u036e"+ - "\u0375\5\u00c2b\2\u036f\u0370\7F\2\2\u0370\u0372\5\u0152\u00aa\2\u0371"+ - "\u036f\3\2\2\2\u0371\u0372\3\2\2\2\u0372\u0373\3\2\2\2\u0373\u0374\7\7"+ - "\2\2\u0374\u0376\5`\61\2\u0375\u0371\3\2\2\2\u0375\u0376\3\2\2\2\u0376"+ - "\u0379\3\2\2\2\u0377\u0378\7Q\2\2\u0378\u037a\5\u0162\u00b2\2\u0379\u0377"+ - "\3\2\2\2\u0379\u037a\3\2\2\2\u037as\3\2\2\2\u037b\u037c\7B\2\2\u037c\u0381"+ - "\7A\2\2\u037d\u037e\7K\2\2\u037e\u037f\7B\2\2\u037f\u0381\7A\2\2\u0380"+ - "\u037b\3\2\2\2\u0380\u037d\3\2\2\2\u0381\u0382\3\2\2\2\u0382\u0387\5v"+ - "<\2\u0383\u0384\7\17\2\2\u0384\u0386\5v<\2\u0385\u0383\3\2\2\2\u0386\u0389"+ - "\3\2\2\2\u0387\u0385\3\2\2\2\u0387\u0388\3\2\2\2\u0388u\3\2\2\2\u0389"+ - "\u0387\3\2\2\2\u038a\u038d\5`\61\2\u038b\u038e\7L\2\2\u038c\u038e\7M\2"+ - "\2\u038d\u038b\3\2\2\2\u038d\u038c\3\2\2\2\u038d\u038e\3\2\2\2\u038e\u0394"+ - "\3\2\2\2\u038f\u0392\7I\2\2\u0390\u0393\7R\2\2\u0391\u0393\7S\2\2\u0392"+ - "\u0390\3\2\2\2\u0392\u0391\3\2\2\2\u0393\u0395\3\2\2\2\u0394\u038f\3\2"+ - "\2\2\u0394\u0395\3\2\2\2\u0395\u0398\3\2\2\2\u0396\u0397\7Q\2\2\u0397"+ - "\u0399\5\u0162\u00b2\2\u0398\u0396\3\2\2\2\u0398\u0399\3\2\2\2\u0399w"+ - "\3\2\2\2\u039a\u039b\7J\2\2\u039b\u039c\5\u00c2b\2\u039cy\3\2\2\2\u039d"+ - "\u03a0\7N\2\2\u039e\u03a0\7O\2\2\u039f\u039d\3\2\2\2\u039f\u039e\3\2\2"+ - "\2\u03a0\u03a1\3\2\2\2\u03a1\u03a6\5|?\2\u03a2\u03a3\7\17\2\2\u03a3\u03a5"+ - "\5|?\2\u03a4\u03a2\3\2\2\2\u03a5\u03a8\3\2\2\2\u03a6\u03a4\3\2\2\2\u03a6"+ - "\u03a7\3\2\2\2\u03a7\u03a9\3\2\2\2\u03a8\u03a6\3\2\2\2\u03a9\u03aa\7P"+ - "\2\2\u03aa\u03ab\5`\61\2\u03ab{\3\2\2\2\u03ac\u03af\5\u00c2b\2\u03ad\u03ae"+ - "\7F\2\2\u03ae\u03b0\5\u0152\u00aa\2\u03af\u03ad\3\2\2\2\u03af\u03b0\3"+ - "\2\2\2\u03b0\u03b1\3\2\2\2\u03b1\u03b2\7E\2\2\u03b2\u03b3\5`\61\2\u03b3"+ - "}\3\2\2\2\u03b4\u03b5\7T\2\2\u03b5\u03b6\7\n\2\2\u03b6\u03b7\5^\60\2\u03b7"+ - "\u03b9\7\13\2\2\u03b8\u03ba\5\u0080A\2\u03b9\u03b8\3\2\2\2\u03ba\u03bb"+ - "\3\2\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc\u03bd\3\2\2\2\u03bd"+ - "\u03be\7X\2\2\u03be\u03bf\7C\2\2\u03bf\u03c0\5`\61\2\u03c0\177\3\2\2\2"+ - "\u03c1\u03c2\7U\2\2\u03c2\u03c4\5`\61\2\u03c3\u03c1\3\2\2\2\u03c4\u03c5"+ - "\3\2\2\2\u03c5\u03c3\3\2\2\2\u03c5\u03c6\3\2\2\2\u03c6\u03c7\3\2\2\2\u03c7"+ - "\u03c8\7C\2\2\u03c8\u03c9\5`\61\2\u03c9\u0081\3\2\2\2\u03ca\u03cb\7[\2"+ - "\2\u03cb\u03cc\7\n\2\2\u03cc\u03cd\5^\60\2\u03cd\u03cf\7\13\2\2\u03ce"+ - "\u03d0\5\u0084C\2\u03cf\u03ce\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03cf"+ - "\3\2\2\2\u03d1\u03d2\3\2\2\2\u03d2\u03d3\3\2\2\2\u03d3\u03d5\7X\2\2\u03d4"+ - "\u03d6\5\u00c2b\2\u03d5\u03d4\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6\u03d7"+ - "\3\2\2\2\u03d7\u03d8\7C\2\2\u03d8\u03d9\5`\61\2\u03d9\u0083\3\2\2\2\u03da"+ - "\u03de\7U\2\2\u03db\u03dc\5\u00c2b\2\u03dc\u03dd\7F\2\2\u03dd\u03df\3"+ - "\2\2\2\u03de\u03db\3\2\2\2\u03de\u03df\3\2\2\2\u03df\u03e0\3\2\2\2\u03e0"+ - "\u03e5\5\u0152\u00aa\2\u03e1\u03e2\7\r\2\2\u03e2\u03e4\5\u0152\u00aa\2"+ - "\u03e3\u03e1\3\2\2\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5\u03e6"+ - "\3\2\2\2\u03e6\u03e8\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7C\2\2\u03e9"+ - "\u03ea\5`\61\2\u03ea\u0085\3\2\2\2\u03eb\u03ec\7D\2\2\u03ec\u03ed\7\n"+ - "\2\2\u03ed\u03ee\5^\60\2\u03ee\u03ef\7\13\2\2\u03ef\u03f0\7Y\2\2\u03f0"+ - "\u03f1\5`\61\2\u03f1\u03f2\7Z\2\2\u03f2\u03f3\5`\61\2\u03f3\u0087\3\2"+ - "\2\2\u03f4\u03f5\7V\2\2\u03f5\u03f6\7\b\2\2\u03f6\u03f7\5^\60\2\u03f7"+ - "\u03f9\7\t\2\2\u03f8\u03fa\5\u008aF\2\u03f9\u03f8\3\2\2\2\u03fa\u03fb"+ - "\3\2\2\2\u03fb\u03f9\3\2\2\2\u03fb\u03fc\3\2\2\2\u03fc\u0089\3\2\2\2\u03fd"+ - "\u0400\7W\2\2\u03fe\u0401\7\f\2\2\u03ff\u0401\5J&\2\u0400\u03fe\3\2\2"+ - "\2\u0400\u03ff\3\2\2\2\u0401\u0409\3\2\2\2\u0402\u0405\7\r\2\2\u0403\u0406"+ - "\7\f\2\2\u0404\u0406\5J&\2\u0405\u0403\3\2\2\2\u0405\u0404\3\2\2\2\u0406"+ - "\u0408\3\2\2\2\u0407\u0402\3\2\2\2\u0408\u040b\3\2\2\2\u0409\u0407\3\2"+ - "\2\2\u0409\u040a\3\2\2\2\u040a\u040c\3\2\2\2\u040b\u0409\3\2\2\2\u040c"+ + "\5\u0089\u05df\n\u0089\3\u008a\3\u008a\3\u008a\3\u008a\3\u008b\3\u008b"+ + "\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u05ed\n\u008c"+ + "\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e"+ + "\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\3\u0090"+ + "\5\u0090\u0601\n\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091"+ + "\3\u0091\5\u0091\u060a\n\u0091\5\u0091\u060c\n\u0091\3\u0091\3\u0091\3"+ + "\u0092\3\u0092\5\u0092\u0612\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3"+ + "\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\5\u0094\u061f\n"+ + "\u0094\5\u0094\u0621\n\u0094\5\u0094\u0623\n\u0094\3\u0094\3\u0094\3\u0095"+ + "\3\u0095\5\u0095\u0629\n\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+ + "\3\u0097\3\u0097\3\u0098\3\u0098\3\u0099\3\u0099\3\u009a\3\u009a\3\u009b"+ + "\3\u009b\3\u009c\3\u009c\5\u009c\u063c\n\u009c\3\u009d\3\u009d\3\u009d"+ + "\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\3\u009f\3\u009f\5\u009f\u064c\n\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0"+ + "\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a2"+ + "\3\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\5\u00a4"+ + "\u0663\n\u00a4\3\u00a5\3\u00a5\3\u00a5\5\u00a5\u0668\n\u00a5\3\u00a5\3"+ + "\u00a5\3\u00a6\3\u00a6\3\u00a6\5\u00a6\u066f\n\u00a6\3\u00a6\3\u00a6\3"+ + "\u00a7\3\u00a7\3\u00a7\5\u00a7\u0676\n\u00a7\3\u00a7\3\u00a7\3\u00a8\3"+ + "\u00a8\3\u00a8\5\u00a8\u067d\n\u00a8\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3"+ + "\u00a9\5\u00a9\u0684\n\u00a9\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3"+ + "\u00aa\3\u00aa\3\u00aa\5\u00aa\u068e\n\u00aa\5\u00aa\u0690\n\u00aa\3\u00ab"+ + "\3\u00ab\3\u00ab\3\u00ab\7\u00ab\u0696\n\u00ab\f\u00ab\16\u00ab\u0699"+ + "\13\u00ab\5\u00ab\u069b\n\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab"+ + "\5\u00ab\u06a2\n\u00ab\3\u00ac\3\u00ac\5\u00ac\u06a6\n\u00ac\3\u00ad\3"+ + "\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae"+ + "\7\u00ae\u06b2\n\u00ae\f\u00ae\16\u00ae\u06b5\13\u00ae\5\u00ae\u06b7\n"+ + "\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\5\u00af\u06bf\n"+ + "\u00af\3\u00b0\3\u00b0\5\u00b0\u06c3\n\u00b0\3\u00b0\3\u00b0\3\u00b0\3"+ + "\u00b1\3\u00b1\5\u00b1\u06ca\n\u00b1\3\u00b1\3\u00b1\3\u00b2\3\u00b2\3"+ + "\u00b3\3\u00b3\3\u00b4\3\u00b4\3\u00b4\2\2\u00b5\2\4\6\b\n\f\16\20\22"+ + "\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnp"+ + "rtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094"+ + "\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac"+ + "\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4"+ + "\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc"+ + "\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4"+ + "\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c"+ + "\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124"+ + "\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c"+ + "\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154"+ + "\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\2\r\4\2\21\21i"+ + "i\3\2RS\3\2\24\35\4\2\5\5#-\3\2/\60\4\2\f\f\61\63\3\2\u0089\u008a\3\2"+ + "\u008c\u0092\3\2\u0093\u0097\4\2\23\23\u00aa\u00aa\4\2=\u0084\u00ab\u00ab"+ + "\2\u071a\2\u0168\3\2\2\2\4\u0170\3\2\2\2\6\u0176\3\2\2\2\b\u0179\3\2\2"+ + "\2\n\u018a\3\2\2\2\f\u0195\3\2\2\2\16\u019a\3\2\2\2\20\u019d\3\2\2\2\22"+ + "\u01a0\3\2\2\2\24\u01b1\3\2\2\2\26\u01b3\3\2\2\2\30\u01b6\3\2\2\2\32\u01bc"+ + "\3\2\2\2\34\u01c0\3\2\2\2\36\u01c4\3\2\2\2 \u01c8\3\2\2\2\"\u01cf\3\2"+ + "\2\2$\u01df\3\2\2\2&\u01e8\3\2\2\2(\u01f7\3\2\2\2*\u01fe\3\2\2\2,\u0205"+ + "\3\2\2\2.\u0216\3\2\2\2\60\u0226\3\2\2\2\62\u0237\3\2\2\2\64\u0248\3\2"+ + "\2\2\66\u024b\3\2\2\28\u0257\3\2\2\2:\u0260\3\2\2\2<\u026a\3\2\2\2>\u026c"+ + "\3\2\2\2@\u0276\3\2\2\2B\u0278\3\2\2\2D\u027d\3\2\2\2F\u0281\3\2\2\2H"+ + "\u0287\3\2\2\2J\u029c\3\2\2\2L\u02a2\3\2\2\2N\u02a4\3\2\2\2P\u02b7\3\2"+ + "\2\2R\u02c8\3\2\2\2T\u02d8\3\2\2\2V\u02ec\3\2\2\2X\u02fb\3\2\2\2Z\u02fd"+ + "\3\2\2\2\\\u0305\3\2\2\2^\u030b\3\2\2\2`\u0319\3\2\2\2b\u0323\3\2\2\2"+ + "d\u0327\3\2\2\2f\u0337\3\2\2\2h\u0340\3\2\2\2j\u0350\3\2\2\2l\u0359\3"+ + "\2\2\2n\u0361\3\2\2\2p\u0364\3\2\2\2r\u036e\3\2\2\2t\u0380\3\2\2\2v\u038a"+ + "\3\2\2\2x\u039a\3\2\2\2z\u039f\3\2\2\2|\u03ac\3\2\2\2~\u03b4\3\2\2\2\u0080"+ + "\u03c3\3\2\2\2\u0082\u03ca\3\2\2\2\u0084\u03da\3\2\2\2\u0086\u03eb\3\2"+ + "\2\2\u0088\u03f4\3\2\2\2\u008a\u03fd\3\2\2\2\u008c\u0410\3\2\2\2\u008e"+ + "\u0418\3\2\2\2\u0090\u0421\3\2\2\2\u0092\u0425\3\2\2\2\u0094\u042a\3\2"+ + "\2\2\u0096\u0432\3\2\2\2\u0098\u0437\3\2\2\2\u009a\u043f\3\2\2\2\u009c"+ + "\u0447\3\2\2\2\u009e\u044d\3\2\2\2\u00a0\u0453\3\2\2\2\u00a2\u0459\3\2"+ + "\2\2\u00a4\u045f\3\2\2\2\u00a6\u0465\3\2\2\2\u00a8\u0474\3\2\2\2\u00aa"+ + "\u0479\3\2\2\2\u00ac\u0481\3\2\2\2\u00ae\u0483\3\2\2\2\u00b0\u048a\3\2"+ + "\2\2\u00b2\u0491\3\2\2\2\u00b4\u0499\3\2\2\2\u00b6\u04a4\3\2\2\2\u00b8"+ + "\u04aa\3\2\2\2\u00ba\u04ad\3\2\2\2\u00bc\u04b1\3\2\2\2\u00be\u04c9\3\2"+ + "\2\2\u00c0\u04cb\3\2\2\2\u00c2\u04cf\3\2\2\2\u00c4\u04d2\3\2\2\2\u00c6"+ + "\u04d8\3\2\2\2\u00c8\u04da\3\2\2\2\u00ca\u04df\3\2\2\2\u00cc\u04e4\3\2"+ + "\2\2\u00ce\u04e7\3\2\2\2\u00d0\u04f5\3\2\2\2\u00d2\u04f9\3\2\2\2\u00d4"+ + "\u04fb\3\2\2\2\u00d6\u04ff\3\2\2\2\u00d8\u0525\3\2\2\2\u00da\u0527\3\2"+ + "\2\2\u00dc\u052b\3\2\2\2\u00de\u0531\3\2\2\2\u00e0\u0539\3\2\2\2\u00e2"+ + "\u0548\3\2\2\2\u00e4\u054e\3\2\2\2\u00e6\u0555\3\2\2\2\u00e8\u0559\3\2"+ + "\2\2\u00ea\u0570\3\2\2\2\u00ec\u0579\3\2\2\2\u00ee\u057b\3\2\2\2\u00f0"+ + "\u0585\3\2\2\2\u00f2\u0589\3\2\2\2\u00f4\u0591\3\2\2\2\u00f6\u0593\3\2"+ + "\2\2\u00f8\u0598\3\2\2\2\u00fa\u05a0\3\2\2\2\u00fc\u05a2\3\2\2\2\u00fe"+ + "\u05a6\3\2\2\2\u0100\u05aa\3\2\2\2\u0102\u05ae\3\2\2\2\u0104\u05b3\3\2"+ + "\2\2\u0106\u05b5\3\2\2\2\u0108\u05b9\3\2\2\2\u010a\u05c0\3\2\2\2\u010c"+ + "\u05ce\3\2\2\2\u010e\u05d0\3\2\2\2\u0110\u05de\3\2\2\2\u0112\u05e0\3\2"+ + "\2\2\u0114\u05e4\3\2\2\2\u0116\u05e8\3\2\2\2\u0118\u05f0\3\2\2\2\u011a"+ + "\u05f4\3\2\2\2\u011c\u05f8\3\2\2\2\u011e\u05fc\3\2\2\2\u0120\u0604\3\2"+ + "\2\2\u0122\u0611\3\2\2\2\u0124\u0613\3\2\2\2\u0126\u0618\3\2\2\2\u0128"+ + "\u0628\3\2\2\2\u012a\u062a\3\2\2\2\u012c\u062f\3\2\2\2\u012e\u0631\3\2"+ + "\2\2\u0130\u0633\3\2\2\2\u0132\u0635\3\2\2\2\u0134\u0637\3\2\2\2\u0136"+ + "\u063b\3\2\2\2\u0138\u063d\3\2\2\2\u013a\u0642\3\2\2\2\u013c\u064b\3\2"+ + "\2\2\u013e\u064d\3\2\2\2\u0140\u0652\3\2\2\2\u0142\u0657\3\2\2\2\u0144"+ + "\u065b\3\2\2\2\u0146\u0662\3\2\2\2\u0148\u0664\3\2\2\2\u014a\u066b\3\2"+ + "\2\2\u014c\u0672\3\2\2\2\u014e\u0679\3\2\2\2\u0150\u0680\3\2\2\2\u0152"+ + "\u068f\3\2\2\2\u0154\u06a1\3\2\2\2\u0156\u06a5\3\2\2\2\u0158\u06a7\3\2"+ + "\2\2\u015a\u06ac\3\2\2\2\u015c\u06bc\3\2\2\2\u015e\u06c2\3\2\2\2\u0160"+ + "\u06c7\3\2\2\2\u0162\u06cd\3\2\2\2\u0164\u06cf\3\2\2\2\u0166\u06d1\3\2"+ + "\2\2\u0168\u0169\5\4\3\2\u0169\u016a\7\2\2\3\u016a\3\3\2\2\2\u016b\u016c"+ + "\7h\2\2\u016c\u016d\7g\2\2\u016d\u016e\5\u0164\u00b3\2\u016e\u016f\7\3"+ + "\2\2\u016f\u0171\3\2\2\2\u0170\u016b\3\2\2\2\u0170\u0171\3\2\2\2\u0171"+ + "\u0174\3\2\2\2\u0172\u0175\5\b\5\2\u0173\u0175\5\6\4\2\u0174\u0172\3\2"+ + "\2\2\u0174\u0173\3\2\2\2\u0175\5\3\2\2\2\u0176\u0177\5\n\6\2\u0177\u0178"+ + "\5\f\7\2\u0178\7\3\2\2\2\u0179\u017a\7\4\2\2\u017a\u017b\7\u0087\2\2\u017b"+ + "\u017c\7\u00b2\2\2\u017c\u017d\7\5\2\2\u017d\u017e\5\u0162\u00b2\2\u017e"+ + "\u017f\7\3\2\2\u017f\u0180\5\n\6\2\u0180\t\3\2\2\2\u0181\u0185\5<\37\2"+ + "\u0182\u0185\5> \2\u0183\u0185\5N(\2\u0184\u0181\3\2\2\2\u0184\u0182\3"+ + "\2\2\2\u0184\u0183\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0187\7\3\2\2\u0187"+ + "\u0189\3\2\2\2\u0188\u0184\3\2\2\2\u0189\u018c\3\2\2\2\u018a\u0188\3\2"+ + "\2\2\u018a\u018b\3\2\2\2\u018b\u0192\3\2\2\2\u018c\u018a\3\2\2\2\u018d"+ + "\u018e\5@!\2\u018e\u018f\7\3\2\2\u018f\u0191\3\2\2\2\u0190\u018d\3\2\2"+ + "\2\u0191\u0194\3\2\2\2\u0192\u0190\3\2\2\2\u0192\u0193\3\2\2\2\u0193\13"+ + "\3\2\2\2\u0194\u0192\3\2\2\2\u0195\u0196\5\22\n\2\u0196\r\3\2\2\2\u0197"+ + "\u0199\5\24\13\2\u0198\u0197\3\2\2\2\u0199\u019c\3\2\2\2\u019a\u0198\3"+ + "\2\2\2\u019a\u019b\3\2\2\2\u019b\17\3\2\2\2\u019c\u019a\3\2\2\2\u019d"+ + "\u019e\5\16\b\2\u019e\u019f\5^\60\2\u019f\21\3\2\2\2\u01a0\u01a2\5\16"+ + "\b\2\u01a1\u01a3\5^\60\2\u01a2\u01a1\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3"+ + "\23\3\2\2\2\u01a4\u01b2\5\26\f\2\u01a5\u01b2\5\30\r\2\u01a6\u01b2\5\32"+ + "\16\2\u01a7\u01b2\5\34\17\2\u01a8\u01b2\5\36\20\2\u01a9\u01b2\5 \21\2"+ + "\u01aa\u01b2\5\"\22\2\u01ab\u01b2\5$\23\2\u01ac\u01b2\5&\24\2\u01ad\u01b2"+ + "\5*\26\2\u01ae\u01b2\5.\30\2\u01af\u01b2\5\66\34\2\u01b0\u01b2\5:\36\2"+ + "\u01b1\u01a4\3\2\2\2\u01b1\u01a5\3\2\2\2\u01b1\u01a6\3\2\2\2\u01b1\u01a7"+ + "\3\2\2\2\u01b1\u01a8\3\2\2\2\u01b1\u01a9\3\2\2\2\u01b1\u01aa\3\2\2\2\u01b1"+ + "\u01ab\3\2\2\2\u01b1\u01ac\3\2\2\2\u01b1\u01ad\3\2\2\2\u01b1\u01ae\3\2"+ + "\2\2\u01b1\u01af\3\2\2\2\u01b1\u01b0\3\2\2\2\u01b2\25\3\2\2\2\u01b3\u01b4"+ + "\5b\62\2\u01b4\u01b5\7\3\2\2\u01b5\27\3\2\2\2\u01b6\u01b7\7\6\2\2\u01b7"+ + "\u01b8\5J&\2\u01b8\u01b9\7\7\2\2\u01b9\u01ba\5`\61\2\u01ba\u01bb\7\3\2"+ + "\2\u01bb\31\3\2\2\2\u01bc\u01bd\7\b\2\2\u01bd\u01be\5\16\b\2\u01be\u01bf"+ + "\7\t\2\2\u01bf\33\3\2\2\2\u01c0\u01c1\7\177\2\2\u01c1\u01c2\7\u0080\2"+ + "\2\u01c2\u01c3\7\3\2\2\u01c3\35\3\2\2\2\u01c4\u01c5\7\u0081\2\2\u01c5"+ + "\u01c6\7\u0080\2\2\u01c6\u01c7\7\3\2\2\u01c7\37\3\2\2\2\u01c8\u01c9\7"+ + "\u0082\2\2\u01c9\u01ca\7\u0083\2\2\u01ca\u01cb\5`\61\2\u01cb\u01cc\7\3"+ + "\2\2\u01cc!\3\2\2\2\u01cd\u01d0\5f\64\2\u01ce\u01d0\5j\66\2\u01cf\u01cd"+ + "\3\2\2\2\u01cf\u01ce\3\2\2\2\u01d0\u01d9\3\2\2\2\u01d1\u01d8\5f\64\2\u01d2"+ + "\u01d8\5j\66\2\u01d3\u01d8\5n8\2\u01d4\u01d8\5p9\2\u01d5\u01d8\5t;\2\u01d6"+ + "\u01d8\5x=\2\u01d7\u01d1\3\2\2\2\u01d7\u01d2\3\2\2\2\u01d7\u01d3\3\2\2"+ + "\2\u01d7\u01d4\3\2\2\2\u01d7\u01d5\3\2\2\2\u01d7\u01d6\3\2\2\2\u01d8\u01db"+ + "\3\2\2\2\u01d9\u01d7\3\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01dc\3\2\2\2\u01db"+ + "\u01d9\3\2\2\2\u01dc\u01dd\7C\2\2\u01dd\u01de\5\24\13\2\u01de#\3\2\2\2"+ + "\u01df\u01e0\7D\2\2\u01e0\u01e1\7\n\2\2\u01e1\u01e2\5^\60\2\u01e2\u01e3"+ + "\7\13\2\2\u01e3\u01e4\7Y\2\2\u01e4\u01e5\5\24\13\2\u01e5\u01e6\7Z\2\2"+ + "\u01e6\u01e7\5\24\13\2\u01e7%\3\2\2\2\u01e8\u01e9\7T\2\2\u01e9\u01ea\7"+ + "\n\2\2\u01ea\u01eb\5^\60\2\u01eb\u01ed\7\13\2\2\u01ec\u01ee\5(\25\2\u01ed"+ + "\u01ec\3\2\2\2\u01ee\u01ef\3\2\2\2\u01ef\u01ed\3\2\2\2\u01ef\u01f0\3\2"+ + "\2\2\u01f0\u01f1\3\2\2\2\u01f1\u01f2\7X\2\2\u01f2\u01f3\7C\2\2\u01f3\u01f4"+ + "\5\24\13\2\u01f4\'\3\2\2\2\u01f5\u01f6\7U\2\2\u01f6\u01f8\5`\61\2\u01f7"+ + "\u01f5\3\2\2\2\u01f8\u01f9\3\2\2\2\u01f9\u01f7\3\2\2\2\u01f9\u01fa\3\2"+ + "\2\2\u01fa\u01fb\3\2\2\2\u01fb\u01fc\7C\2\2\u01fc\u01fd\5\24\13\2\u01fd"+ + ")\3\2\2\2\u01fe\u01ff\7V\2\2\u01ff\u0201\5\32\16\2\u0200\u0202\5,\27\2"+ + "\u0201\u0200\3\2\2\2\u0202\u0203\3\2\2\2\u0203\u0201\3\2\2\2\u0203\u0204"+ + "\3\2\2\2\u0204+\3\2\2\2\u0205\u0208\7W\2\2\u0206\u0209\7\f\2\2\u0207\u0209"+ + "\5J&\2\u0208\u0206\3\2\2\2\u0208\u0207\3\2\2\2\u0209\u0211\3\2\2\2\u020a"+ + "\u020d\7\r\2\2\u020b\u020e\7\f\2\2\u020c\u020e\5J&\2\u020d\u020b\3\2\2"+ + "\2\u020d\u020c\3\2\2\2\u020e\u0210\3\2\2\2\u020f\u020a\3\2\2\2\u0210\u0213"+ + "\3\2\2\2\u0211\u020f\3\2\2\2\u0211\u0212\3\2\2\2\u0212\u0214\3\2\2\2\u0213"+ + "\u0211\3\2\2\2\u0214\u0215\5\32\16\2\u0215-\3\2\2\2\u0216\u0217\7[\2\2"+ + "\u0217\u0218\7\n\2\2\u0218\u0219\5^\60\2\u0219\u021b\7\13\2\2\u021a\u021c"+ + "\5\60\31\2\u021b\u021a\3\2\2\2\u021c\u021d\3\2\2\2\u021d\u021b\3\2\2\2"+ + "\u021d\u021e\3\2\2\2\u021e\u021f\3\2\2\2\u021f\u0221\7X\2\2\u0220\u0222"+ + "\5\u00c2b\2\u0221\u0220\3\2\2\2\u0221\u0222\3\2\2\2\u0222\u0223\3\2\2"+ + "\2\u0223\u0224\7C\2\2\u0224\u0225\5\24\13\2\u0225/\3\2\2\2\u0226\u022a"+ + "\7U\2\2\u0227\u0228\5\u00c2b\2\u0228\u0229\7F\2\2\u0229\u022b\3\2\2\2"+ + "\u022a\u0227\3\2\2\2\u022a\u022b\3\2\2\2\u022b\u022c\3\2\2\2\u022c\u0231"+ + "\5\u0152\u00aa\2\u022d\u022e\7\r\2\2\u022e\u0230\5\u0152\u00aa\2\u022f"+ + "\u022d\3\2\2\2\u0230\u0233\3\2\2\2\u0231\u022f\3\2\2\2\u0231\u0232\3\2"+ + "\2\2\u0232\u0234\3\2\2\2\u0233\u0231\3\2\2\2\u0234\u0235\7C\2\2\u0235"+ + "\u0236\5\24\13\2\u0236\61\3\2\2\2\u0237\u0238\7\16\2\2\u0238\u0243\5J"+ + "&\2\u0239\u023a\7\n\2\2\u023a\u023f\7\u00ac\2\2\u023b\u023c\7\17\2\2\u023c"+ + "\u023e\7\u00ac\2\2\u023d\u023b\3\2\2\2\u023e\u0241\3\2\2\2\u023f\u023d"+ + "\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u0242\3\2\2\2\u0241\u023f\3\2\2\2\u0242"+ + "\u0244\7\13\2\2\u0243\u0239\3\2\2\2\u0243\u0244\3\2\2\2\u0244\63\3\2\2"+ + "\2\u0245\u0247\5\62\32\2\u0246\u0245\3\2\2\2\u0247\u024a\3\2\2\2\u0248"+ + "\u0246\3\2\2\2\u0248\u0249\3\2\2\2\u0249\65\3\2\2\2\u024a\u0248\3\2\2"+ + "\2\u024b\u024c\5\64\33\2\u024c\u024d\7r\2\2\u024d\u0252\58\35\2\u024e"+ + "\u024f\7\17\2\2\u024f\u0251\58\35\2\u0250\u024e\3\2\2\2\u0251\u0254\3"+ + "\2\2\2\u0252\u0250\3\2\2\2\u0252\u0253\3\2\2\2\u0253\u0255\3\2\2\2\u0254"+ + "\u0252\3\2\2\2\u0255\u0256\7\3\2\2\u0256\67\3\2\2\2\u0257\u025a\5\u00c2"+ + "b\2\u0258\u0259\7F\2\2\u0259\u025b\5\u0152\u00aa\2\u025a\u0258\3\2\2\2"+ + "\u025a\u025b\3\2\2\2\u025b\u025e\3\2\2\2\u025c\u025d\7\7\2\2\u025d\u025f"+ + "\5`\61\2\u025e\u025c\3\2\2\2\u025e\u025f\3\2\2\2\u025f9\3\2\2\2\u0260"+ + "\u0261\7\u0084\2\2\u0261\u0262\7\n\2\2\u0262\u0263\5^\60\2\u0263\u0264"+ + "\7\13\2\2\u0264\u0265\5\24\13\2\u0265;\3\2\2\2\u0266\u026b\5B\"\2\u0267"+ + "\u026b\5D#\2\u0268\u026b\5F$\2\u0269\u026b\5H%\2\u026a\u0266\3\2\2\2\u026a"+ + "\u0267\3\2\2\2\u026a\u0268\3\2\2\2\u026a\u0269\3\2\2\2\u026b=\3\2\2\2"+ + "\u026c\u026d\7o\2\2\u026d\u026e\7\u0087\2\2\u026e\u026f\7\u00b2\2\2\u026f"+ + "\u0270\7\5\2\2\u0270\u0271\5\u0162\u00b2\2\u0271?\3\2\2\2\u0272\u0277"+ + "\5T+\2\u0273\u0277\5P)\2\u0274\u0277\5V,\2\u0275\u0277\5R*\2\u0276\u0272"+ + "\3\2\2\2\u0276\u0273\3\2\2\2\u0276\u0274\3\2\2\2\u0276\u0275\3\2\2\2\u0277"+ + "A\3\2\2\2\u0278\u0279\7o\2\2\u0279\u027a\7X\2\2\u027a\u027b\7Q\2\2\u027b"+ + "\u027c\5\u0162\u00b2\2\u027cC\3\2\2\2\u027d\u027e\7o\2\2\u027e\u027f\7"+ + "\20\2\2\u027f\u0280\t\2\2\2\u0280E\3\2\2\2\u0281\u0282\7o\2\2\u0282\u0283"+ + "\7X\2\2\u0283\u0284\7B\2\2\u0284\u0285\7I\2\2\u0285\u0286\t\3\2\2\u0286"+ + "G\3\2\2\2\u0287\u028c\7o\2\2\u0288\u0289\7\22\2\2\u0289\u028d\5J&\2\u028a"+ + "\u028b\7X\2\2\u028b\u028d\7\22\2\2\u028c\u0288\3\2\2\2\u028c\u028a\3\2"+ + "\2\2\u028d\u0294\3\2\2\2\u028e\u028f\5L\'\2\u028f\u0290\7\5\2\2\u0290"+ + "\u0291\5\u0164\u00b3\2\u0291\u0293\3\2\2\2\u0292\u028e\3\2\2\2\u0293\u0296"+ + "\3\2\2\2\u0294\u0292\3\2\2\2\u0294\u0295\3\2\2\2\u0295I\3\2\2\2\u0296"+ + "\u0294\3\2\2\2\u0297\u029a\7\u00b2\2\2\u0298\u029a\5\u0166\u00b4\2\u0299"+ + "\u0297\3\2\2\2\u0299\u0298\3\2\2\2\u029a\u029b\3\2\2\2\u029b\u029d\7\23"+ + "\2\2\u029c\u0299\3\2\2\2\u029c\u029d\3\2\2\2\u029d\u02a0\3\2\2\2\u029e"+ + "\u02a1\7\u00b2\2\2\u029f\u02a1\5\u0166\u00b4\2\u02a0\u029e\3\2\2\2\u02a0"+ + "\u029f\3\2\2\2\u02a1K\3\2\2\2\u02a2\u02a3\t\4\2\2\u02a3M\3\2\2\2\u02a4"+ + "\u02a5\7\u0085\2\2\u02a5\u02a9\7\4\2\2\u02a6\u02a7\7\u0087\2\2\u02a7\u02a8"+ + "\7\u00b2\2\2\u02a8\u02aa\7\5\2\2\u02a9\u02a6\3\2\2\2\u02a9\u02aa\3\2\2"+ + "\2\u02aa\u02ab\3\2\2\2\u02ab\u02b5\5\u0162\u00b2\2\u02ac\u02ad\7G\2\2"+ + "\u02ad\u02b2\5\u0162\u00b2\2\u02ae\u02af\7\17\2\2\u02af\u02b1\5\u0162"+ + "\u00b2\2\u02b0\u02ae\3\2\2\2\u02b1\u02b4\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b2"+ + "\u02b3\3\2\2\2\u02b3\u02b6\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5\u02ac\3\2"+ + "\2\2\u02b5\u02b6\3\2\2\2\u02b6O\3\2\2\2\u02b7\u02b8\7o\2\2\u02b8\u02b9"+ + "\5\64\33\2\u02b9\u02ba\7r\2\2\u02ba\u02bd\5\u00c2b\2\u02bb\u02bc\7F\2"+ + "\2\u02bc\u02be\5\u0152\u00aa\2\u02bd\u02bb\3\2\2\2\u02bd\u02be\3\2\2\2"+ + "\u02be\u02c6\3\2\2\2\u02bf\u02c0\7\7\2\2\u02c0\u02c7\5`\61\2\u02c1\u02c4"+ + "\7\36\2\2\u02c2\u02c3\7\7\2\2\u02c3\u02c5\5`\61\2\u02c4\u02c2\3\2\2\2"+ + "\u02c4\u02c5\3\2\2\2\u02c5\u02c7\3\2\2\2\u02c6\u02bf\3\2\2\2\u02c6\u02c1"+ + "\3\2\2\2\u02c7Q\3\2\2\2\u02c8\u02c9\7o\2\2\u02c9\u02ca\7p\2\2\u02ca\u02cd"+ + "\7q\2\2\u02cb\u02cc\7F\2\2\u02cc\u02ce\5\u0152\u00aa\2\u02cd\u02cb\3\2"+ + "\2\2\u02cd\u02ce\3\2\2\2\u02ce\u02d6\3\2\2\2\u02cf\u02d0\7\7\2\2\u02d0"+ + "\u02d7\5`\61\2\u02d1\u02d4\7\36\2\2\u02d2\u02d3\7\7\2\2\u02d3\u02d5\5"+ + "`\61\2\u02d4\u02d2\3\2\2\2\u02d4\u02d5\3\2\2\2\u02d5\u02d7\3\2\2\2\u02d6"+ + "\u02cf\3\2\2\2\u02d6\u02d1\3\2\2\2\u02d7S\3\2\2\2\u02d8\u02d9\7o\2\2\u02d9"+ + "\u02da\5\64\33\2\u02da\u02db\7\37\2\2\u02db\u02dc\5J&\2\u02dc\u02de\7"+ + "\n\2\2\u02dd\u02df\5Z.\2\u02de\u02dd\3\2\2\2\u02de\u02df\3\2\2\2\u02df"+ + "\u02e0\3\2\2\2\u02e0\u02e3\7\13\2\2\u02e1\u02e2\7F\2\2\u02e2\u02e4\5\u0152"+ + "\u00aa\2\u02e3\u02e1\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4\u02ea\3\2\2\2\u02e5"+ + "\u02e6\7\b\2\2\u02e6\u02e7\5\22\n\2\u02e7\u02e8\7\t\2\2\u02e8\u02eb\3"+ + "\2\2\2\u02e9\u02eb\7\36\2\2\u02ea\u02e5\3\2\2\2\u02ea\u02e9\3\2\2\2\u02eb"+ + "U\3\2\2\2\u02ec\u02ed\7o\2\2\u02ed\u02ee\7l\2\2\u02ee\u02ef\5J&\2\u02ef"+ + "\u02f1\7F\2\2\u02f0\u02f2\5X-\2\u02f1\u02f0\3\2\2\2\u02f1\u02f2\3\2\2"+ + "\2\u02f2\u02f3\3\2\2\2\u02f3\u02f4\5`\61\2\u02f4W\3\2\2\2\u02f5\u02f6"+ + "\7 \2\2\u02f6\u02fc\7!\2\2\u02f7\u02f8\7 \2\2\u02f8\u02fc\7\"\2\2\u02f9"+ + "\u02fa\7|\2\2\u02fa\u02fc\7\u0086\2\2\u02fb\u02f5\3\2\2\2\u02fb\u02f7"+ + "\3\2\2\2\u02fb\u02f9\3\2\2\2\u02fcY\3\2\2\2\u02fd\u0302\5\\/\2\u02fe\u02ff"+ + "\7\17\2\2\u02ff\u0301\5\\/\2\u0300\u02fe\3\2\2\2\u0301\u0304\3\2\2\2\u0302"+ + "\u0300\3\2\2\2\u0302\u0303\3\2\2\2\u0303[\3\2\2\2\u0304\u0302\3\2\2\2"+ + "\u0305\u0306\7\6\2\2\u0306\u0309\5J&\2\u0307\u0308\7F\2\2\u0308\u030a"+ + "\5\u0152\u00aa\2\u0309\u0307\3\2\2\2\u0309\u030a\3\2\2\2\u030a]\3\2\2"+ + "\2\u030b\u0310\5`\61\2\u030c\u030d\7\17\2\2\u030d\u030f\5`\61\2\u030e"+ + "\u030c\3\2\2\2\u030f\u0312\3\2\2\2\u0310\u030e\3\2\2\2\u0310\u0311\3\2"+ + "\2\2\u0311_\3\2\2\2\u0312\u0310\3\2\2\2\u0313\u031a\5b\62\2\u0314\u031a"+ + "\5d\63\2\u0315\u031a\5~@\2\u0316\u031a\5\u0082B\2\u0317\u031a\5\u0086"+ + "D\2\u0318\u031a\5\u0088E\2\u0319\u0313\3\2\2\2\u0319\u0314\3\2\2\2\u0319"+ + "\u0315\3\2\2\2\u0319\u0316\3\2\2\2\u0319\u0317\3\2\2\2\u0319\u0318\3\2"+ + "\2\2\u031aa\3\2\2\2\u031b\u0324\5z>\2\u031c\u0324\5\u008cG\2\u031d\u0324"+ + "\5\u00d8m\2\u031e\u0324\5\u00dan\2\u031f\u0324\5\u00dco\2\u0320\u0324"+ + "\5\u00dep\2\u0321\u0324\5\u00e0q\2\u0322\u0324\5\u00e2r\2\u0323\u031b"+ + "\3\2\2\2\u0323\u031c\3\2\2\2\u0323\u031d\3\2\2\2\u0323\u031e\3\2\2\2\u0323"+ + "\u031f\3\2\2\2\u0323\u0320\3\2\2\2\u0323\u0321\3\2\2\2\u0323\u0322\3\2"+ + "\2\2\u0324c\3\2\2\2\u0325\u0328\5f\64\2\u0326\u0328\5j\66\2\u0327\u0325"+ + "\3\2\2\2\u0327\u0326\3\2\2\2\u0328\u0331\3\2\2\2\u0329\u0330\5f\64\2\u032a"+ + "\u0330\5j\66\2\u032b\u0330\5n8\2\u032c\u0330\5p9\2\u032d\u0330\5t;\2\u032e"+ + "\u0330\5x=\2\u032f\u0329\3\2\2\2\u032f\u032a\3\2\2\2\u032f\u032b\3\2\2"+ + "\2\u032f\u032c\3\2\2\2\u032f\u032d\3\2\2\2\u032f\u032e\3\2\2\2\u0330\u0333"+ + "\3\2\2\2\u0331\u032f\3\2\2\2\u0331\u0332\3\2\2\2\u0332\u0334\3\2\2\2\u0333"+ + "\u0331\3\2\2\2\u0334\u0335\7C\2\2\u0335\u0336\5`\61\2\u0336e\3\2\2\2\u0337"+ + "\u0338\7=\2\2\u0338\u033d\5h\65\2\u0339\u033a\7\17\2\2\u033a\u033c\5h"+ + "\65\2\u033b\u0339\3\2\2\2\u033c\u033f\3\2\2\2\u033d\u033b\3\2\2\2\u033d"+ + "\u033e\3\2\2\2\u033eg\3\2\2\2\u033f\u033d\3\2\2\2\u0340\u0343\5\u00c2"+ + "b\2\u0341\u0342\7F\2\2\u0342\u0344\5\u0152\u00aa\2\u0343\u0341\3\2\2\2"+ + "\u0343\u0344\3\2\2\2\u0344\u0347\3\2\2\2\u0345\u0346\7H\2\2\u0346\u0348"+ + "\7I\2\2\u0347\u0345\3\2\2\2\u0347\u0348\3\2\2\2\u0348\u034b\3\2\2\2\u0349"+ + "\u034a\7G\2\2\u034a\u034c\5\u00c2b\2\u034b\u0349\3\2\2\2\u034b\u034c\3"+ + "\2\2\2\u034c\u034d\3\2\2\2\u034d\u034e\7E\2\2\u034e\u034f\5`\61\2\u034f"+ + "i\3\2\2\2\u0350\u0351\7>\2\2\u0351\u0356\5l\67\2\u0352\u0353\7\17\2\2"+ + "\u0353\u0355\5l\67\2\u0354\u0352\3\2\2\2\u0355\u0358\3\2\2\2\u0356\u0354"+ + "\3\2\2\2\u0356\u0357\3\2\2\2\u0357k\3\2\2\2\u0358\u0356\3\2\2\2\u0359"+ + "\u035c\5\u00c2b\2\u035a\u035b\7F\2\2\u035b\u035d\5\u0152\u00aa\2\u035c"+ + "\u035a\3\2\2\2\u035c\u035d\3\2\2\2\u035d\u035e\3\2\2\2\u035e\u035f\7\7"+ + "\2\2\u035f\u0360\5`\61\2\u0360m\3\2\2\2\u0361\u0362\7?\2\2\u0362\u0363"+ + "\5`\61\2\u0363o\3\2\2\2\u0364\u0365\7@\2\2\u0365\u0366\7A\2\2\u0366\u036b"+ + "\5r:\2\u0367\u0368\7\17\2\2\u0368\u036a\5r:\2\u0369\u0367\3\2\2\2\u036a"+ + "\u036d\3\2\2\2\u036b\u0369\3\2\2\2\u036b\u036c\3\2\2\2\u036cq\3\2\2\2"+ + "\u036d\u036b\3\2\2\2\u036e\u0375\5\u00c2b\2\u036f\u0370\7F\2\2\u0370\u0372"+ + "\5\u0152\u00aa\2\u0371\u036f\3\2\2\2\u0371\u0372\3\2\2\2\u0372\u0373\3"+ + "\2\2\2\u0373\u0374\7\7\2\2\u0374\u0376\5`\61\2\u0375\u0371\3\2\2\2\u0375"+ + "\u0376\3\2\2\2\u0376\u0379\3\2\2\2\u0377\u0378\7Q\2\2\u0378\u037a\5\u0162"+ + "\u00b2\2\u0379\u0377\3\2\2\2\u0379\u037a\3\2\2\2\u037as\3\2\2\2\u037b"+ + "\u037c\7B\2\2\u037c\u0381\7A\2\2\u037d\u037e\7K\2\2\u037e\u037f\7B\2\2"+ + "\u037f\u0381\7A\2\2\u0380\u037b\3\2\2\2\u0380\u037d\3\2\2\2\u0381\u0382"+ + "\3\2\2\2\u0382\u0387\5v<\2\u0383\u0384\7\17\2\2\u0384\u0386\5v<\2\u0385"+ + "\u0383\3\2\2\2\u0386\u0389\3\2\2\2\u0387\u0385\3\2\2\2\u0387\u0388\3\2"+ + "\2\2\u0388u\3\2\2\2\u0389\u0387\3\2\2\2\u038a\u038d\5`\61\2\u038b\u038e"+ + "\7L\2\2\u038c\u038e\7M\2\2\u038d\u038b\3\2\2\2\u038d\u038c\3\2\2\2\u038d"+ + "\u038e\3\2\2\2\u038e\u0394\3\2\2\2\u038f\u0392\7I\2\2\u0390\u0393\7R\2"+ + "\2\u0391\u0393\7S\2\2\u0392\u0390\3\2\2\2\u0392\u0391\3\2\2\2\u0393\u0395"+ + "\3\2\2\2\u0394\u038f\3\2\2\2\u0394\u0395\3\2\2\2\u0395\u0398\3\2\2\2\u0396"+ + "\u0397\7Q\2\2\u0397\u0399\5\u0162\u00b2\2\u0398\u0396\3\2\2\2\u0398\u0399"+ + "\3\2\2\2\u0399w\3\2\2\2\u039a\u039b\7J\2\2\u039b\u039c\5\u00c2b\2\u039c"+ + "y\3\2\2\2\u039d\u03a0\7N\2\2\u039e\u03a0\7O\2\2\u039f\u039d\3\2\2\2\u039f"+ + "\u039e\3\2\2\2\u03a0\u03a1\3\2\2\2\u03a1\u03a6\5|?\2\u03a2\u03a3\7\17"+ + "\2\2\u03a3\u03a5\5|?\2\u03a4\u03a2\3\2\2\2\u03a5\u03a8\3\2\2\2\u03a6\u03a4"+ + "\3\2\2\2\u03a6\u03a7\3\2\2\2\u03a7\u03a9\3\2\2\2\u03a8\u03a6\3\2\2\2\u03a9"+ + "\u03aa\7P\2\2\u03aa\u03ab\5`\61\2\u03ab{\3\2\2\2\u03ac\u03af\5\u00c2b"+ + "\2\u03ad\u03ae\7F\2\2\u03ae\u03b0\5\u0152\u00aa\2\u03af\u03ad\3\2\2\2"+ + "\u03af\u03b0\3\2\2\2\u03b0\u03b1\3\2\2\2\u03b1\u03b2\7E\2\2\u03b2\u03b3"+ + "\5`\61\2\u03b3}\3\2\2\2\u03b4\u03b5\7T\2\2\u03b5\u03b6\7\n\2\2\u03b6\u03b7"+ + "\5^\60\2\u03b7\u03b9\7\13\2\2\u03b8\u03ba\5\u0080A\2\u03b9\u03b8\3\2\2"+ + "\2\u03ba\u03bb\3\2\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc\u03bd"+ + "\3\2\2\2\u03bd\u03be\7X\2\2\u03be\u03bf\7C\2\2\u03bf\u03c0\5`\61\2\u03c0"+ + "\177\3\2\2\2\u03c1\u03c2\7U\2\2\u03c2\u03c4\5`\61\2\u03c3\u03c1\3\2\2"+ + "\2\u03c4\u03c5\3\2\2\2\u03c5\u03c3\3\2\2\2\u03c5\u03c6\3\2\2\2\u03c6\u03c7"+ + "\3\2\2\2\u03c7\u03c8\7C\2\2\u03c8\u03c9\5`\61\2\u03c9\u0081\3\2\2\2\u03ca"+ + "\u03cb\7[\2\2\u03cb\u03cc\7\n\2\2\u03cc\u03cd\5^\60\2\u03cd\u03cf\7\13"+ + "\2\2\u03ce\u03d0\5\u0084C\2\u03cf\u03ce\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1"+ + "\u03cf\3\2\2\2\u03d1\u03d2\3\2\2\2\u03d2\u03d3\3\2\2\2\u03d3\u03d5\7X"+ + "\2\2\u03d4\u03d6\5\u00c2b\2\u03d5\u03d4\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6"+ + "\u03d7\3\2\2\2\u03d7\u03d8\7C\2\2\u03d8\u03d9\5`\61\2\u03d9\u0083\3\2"+ + "\2\2\u03da\u03de\7U\2\2\u03db\u03dc\5\u00c2b\2\u03dc\u03dd\7F\2\2\u03dd"+ + "\u03df\3\2\2\2\u03de\u03db\3\2\2\2\u03de\u03df\3\2\2\2\u03df\u03e0\3\2"+ + "\2\2\u03e0\u03e5\5\u0152\u00aa\2\u03e1\u03e2\7\r\2\2\u03e2\u03e4\5\u0152"+ + "\u00aa\2\u03e3\u03e1\3\2\2\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5"+ + "\u03e6\3\2\2\2\u03e6\u03e8\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7C"+ + "\2\2\u03e9\u03ea\5`\61\2\u03ea\u0085\3\2\2\2\u03eb\u03ec\7D\2\2\u03ec"+ + "\u03ed\7\n\2\2\u03ed\u03ee\5^\60\2\u03ee\u03ef\7\13\2\2\u03ef\u03f0\7"+ + "Y\2\2\u03f0\u03f1\5`\61\2\u03f1\u03f2\7Z\2\2\u03f2\u03f3\5`\61\2\u03f3"+ + "\u0087\3\2\2\2\u03f4\u03f5\7V\2\2\u03f5\u03f6\7\b\2\2\u03f6\u03f7\5^\60"+ + "\2\u03f7\u03f9\7\t\2\2\u03f8\u03fa\5\u008aF\2\u03f9\u03f8\3\2\2\2\u03fa"+ + "\u03fb\3\2\2\2\u03fb\u03f9\3\2\2\2\u03fb\u03fc\3\2\2\2\u03fc\u0089\3\2"+ + "\2\2\u03fd\u0400\7W\2\2\u03fe\u0401\7\f\2\2\u03ff\u0401\5J&\2\u0400\u03fe"+ + "\3\2\2\2\u0400\u03ff\3\2\2\2\u0401\u0409\3\2\2\2\u0402\u0405\7\r\2\2\u0403"+ + "\u0406\7\f\2\2\u0404\u0406\5J&\2\u0405\u0403\3\2\2\2\u0405\u0404\3\2\2"+ + "\2\u0406\u0408\3\2\2\2\u0407\u0402\3\2\2\2\u0408\u040b\3\2\2\2\u0409\u0407"+ + "\3\2\2\2\u0409\u040a\3\2\2\2\u040a\u040c\3\2\2\2\u040b\u0409\3\2\2\2\u040c"+ "\u040d\7\b\2\2\u040d\u040e\5^\60\2\u040e\u040f\7\t\2\2\u040f\u008b\3\2"+ "\2\2\u0410\u0415\5\u008eH\2\u0411\u0412\7\\\2\2\u0412\u0414\5\u008eH\2"+ "\u0413\u0411\3\2\2\2\u0414\u0417\3\2\2\2\u0415\u0413\3\2\2\2\u0415\u0416"+ @@ -13520,8 +13579,8 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\5\u0152\u00aa\2\u0486\u0487\7\b\2\2\u0487\u0488\5^\60\2\u0488\u0489\7"+ "\t\2\2\u0489\u00af\3\2\2\2\u048a\u048b\7n\2\2\u048b\u048c\7l\2\2\u048c"+ "\u048d\5\u0152\u00aa\2\u048d\u048e\7\b\2\2\u048e\u048f\5^\60\2\u048f\u0490"+ - "\7\t\2\2\u0490\u00b1\3\2\2\2\u0491\u0496\5\u00b4[\2\u0492\u0493\7\64\2"+ - "\2\u0493\u0495\5\u00b4[\2\u0494\u0492\3\2\2\2\u0495\u0498\3\2\2\2\u0496"+ + "\7\t\2\2\u0490\u00b1\3\2\2\2\u0491\u0496\5\u00ecw\2\u0492\u0493\7\64\2"+ + "\2\u0493\u0495\5\u00ecw\2\u0494\u0492\3\2\2\2\u0495\u0498\3\2\2\2\u0496"+ "\u0494\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u00b3\3\2\2\2\u0498\u0496\3\2"+ "\2\2\u0499\u04a1\5\u00be`\2\u049a\u04a0\5\u00b6\\\2\u049b\u04a0\5\u00ba"+ "^\2\u049c\u04a0\5\u00bc_\2\u049d\u04a0\5\u00b8]\2\u049e\u04a0\5\u00ce"+ @@ -13643,93 +13702,92 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\3\2\2\2\u05de\u05d3\3\2\2\2\u05de\u05d4\3\2\2\2\u05de\u05d5\3\2\2\2\u05de"+ "\u05d6\3\2\2\2\u05de\u05d7\3\2\2\2\u05de\u05d8\3\2\2\2\u05de\u05d9\3\2"+ "\2\2\u05de\u05da\3\2\2\2\u05de\u05db\3\2\2\2\u05de\u05dc\3\2\2\2\u05de"+ - "\u05dd\3\2\2\2\u05df\u0111\3\2\2\2\u05e0\u05e1\7\u0098\2\2\u05e1\u05e3"+ - "\7\n\2\2\u05e2\u05e4\7\f\2\2\u05e3\u05e2\3\2\2\2\u05e3\u05e4\3\2\2\2\u05e4"+ - "\u05e5\3\2\2\2\u05e5\u05e6\7\13\2\2\u05e6\u0113\3\2\2\2\u05e7\u05e8\7"+ - "\u0099\2\2\u05e8\u05e9\7\n\2\2\u05e9\u05ea\7\13\2\2\u05ea\u0115\3\2\2"+ - "\2\u05eb\u05ec\7\u009b\2\2\u05ec\u05ef\7\n\2\2\u05ed\u05f0\5\u0126\u0094"+ - "\2\u05ee\u05f0\5\u012a\u0096\2\u05ef\u05ed\3\2\2\2\u05ef\u05ee\3\2\2\2"+ - "\u05ef\u05f0\3\2\2\2\u05f0\u05f1\3\2\2\2\u05f1\u05f2\7\13\2\2\u05f2\u0117"+ - "\3\2\2\2\u05f3\u05f4\7\u009c\2\2\u05f4\u05f5\7\n\2\2\u05f5\u05f6\7\13"+ - "\2\2\u05f6\u0119\3\2\2\2\u05f7\u05f8\7\u00a6\2\2\u05f8\u05f9\7\n\2\2\u05f9"+ - "\u05fa\7\13\2\2\u05fa\u011b\3\2\2\2\u05fb\u05fc\7\u009e\2\2\u05fc\u05fd"+ - "\7\n\2\2\u05fd\u05fe\7\13\2\2\u05fe\u011d\3\2\2\2\u05ff\u0600\7\u009d"+ - "\2\2\u0600\u0603\7\n\2\2\u0601\u0604\7\u00b2\2\2\u0602\u0604\5\u0164\u00b3"+ - "\2\u0603\u0601\3\2\2\2\u0603\u0602\3\2\2\2\u0603\u0604\3\2\2\2\u0604\u0605"+ - "\3\2\2\2\u0605\u0606\7\13\2\2\u0606\u011f\3\2\2\2\u0607\u0608\7\u008e"+ - "\2\2\u0608\u060e\7\n\2\2\u0609\u060c\5\u0122\u0092\2\u060a\u060b\7\17"+ - "\2\2\u060b\u060d\5\u0134\u009b\2\u060c\u060a\3\2\2\2\u060c\u060d\3\2\2"+ - "\2\u060d\u060f\3\2\2\2\u060e\u0609\3\2\2\2\u060e\u060f\3\2\2\2\u060f\u0610"+ - "\3\2\2\2\u0610\u0611\7\13\2\2\u0611\u0121\3\2\2\2\u0612\u0615\5\u012e"+ - "\u0098\2\u0613\u0615\7\f\2\2\u0614\u0612\3\2\2\2\u0614\u0613\3\2\2\2\u0615"+ - "\u0123\3\2\2\2\u0616\u0617\7\u009f\2\2\u0617\u0618\7\n\2\2\u0618\u0619"+ - "\5\u0144\u00a3\2\u0619\u061a\7\13\2\2\u061a\u0125\3\2\2\2\u061b\u061c"+ - "\7\u0088\2\2\u061c\u0625\7\n\2\2\u061d\u0623\5\u0128\u0095\2\u061e\u061f"+ - "\7\17\2\2\u061f\u0621\5\u0134\u009b\2\u0620\u0622\7\u00aa\2\2\u0621\u0620"+ - "\3\2\2\2\u0621\u0622\3\2\2\2\u0622\u0624\3\2\2\2\u0623\u061e\3\2\2\2\u0623"+ - "\u0624\3\2\2\2\u0624\u0626\3\2\2\2\u0625\u061d\3\2\2\2\u0625\u0626\3\2"+ - "\2\2\u0626\u0627\3\2\2\2\u0627\u0628\7\13\2\2\u0628\u0127\3\2\2\2\u0629"+ - "\u062c\5\u0130\u0099\2\u062a\u062c\7\f\2\2\u062b\u0629\3\2\2\2\u062b\u062a"+ - "\3\2\2\2\u062c\u0129\3\2\2\2\u062d\u062e\7\u00a0\2\2\u062e\u062f\7\n\2"+ - "\2\u062f\u0630\5\u012c\u0097\2\u0630\u0631\7\13\2\2\u0631\u012b\3\2\2"+ - "\2\u0632\u0633\5\u0130\u0099\2\u0633\u012d\3\2\2\2\u0634\u0635\5J&\2\u0635"+ - "\u012f\3\2\2\2\u0636\u0637\5J&\2\u0637\u0131\3\2\2\2\u0638\u0639\5\u0134"+ - "\u009b\2\u0639\u0133\3\2\2\2\u063a\u063b\5J&\2\u063b\u0135\3\2\2\2\u063c"+ - "\u063f\5\u0138\u009d\2\u063d\u063f\5\u013a\u009e\2\u063e\u063c\3\2\2\2"+ - "\u063e\u063d\3\2\2\2\u063f\u0137\3\2\2\2\u0640\u0641\7\u00a8\2\2\u0641"+ - "\u0642\7\n\2\2\u0642\u0643\7\f\2\2\u0643\u0644\7\13\2\2\u0644\u0139\3"+ - "\2\2\2\u0645\u0646\7\u00a8\2\2\u0646\u0647\7\n\2\2\u0647\u0648\5J&\2\u0648"+ - "\u0649\7\17\2\2\u0649\u064a\5\u0152\u00aa\2\u064a\u064b\7\13\2\2\u064b"+ - "\u013b\3\2\2\2\u064c\u064f\5\u013e\u00a0\2\u064d\u064f\5\u0140\u00a1\2"+ - "\u064e\u064c\3\2\2\2\u064e\u064d\3\2\2\2\u064f\u013d\3\2\2\2\u0650\u0651"+ - "\7\u00a7\2\2\u0651\u0652\7\n\2\2\u0652\u0653\7\f\2\2\u0653\u0654\7\13"+ - "\2\2\u0654\u013f\3\2\2\2\u0655\u0656\7\u00a7\2\2\u0656\u0657\7\n\2\2\u0657"+ - "\u0658\5\u0152\u00aa\2\u0658\u0659\7\13\2\2\u0659\u0141\3\2\2\2\u065a"+ - "\u065b\7\n\2\2\u065b\u065c\5\u010c\u0087\2\u065c\u065d\7\13\2\2\u065d"+ - "\u0143\3\2\2\2\u065e\u065f\5\u012e\u0098\2\u065f\u0145\3\2\2\2\u0660\u0666"+ - "\5\u0148\u00a5\2\u0661\u0666\5\u014a\u00a6\2\u0662\u0666\5\u014c\u00a7"+ - "\2\u0663\u0666\5\u014e\u00a8\2\u0664\u0666\5\u0150\u00a9\2\u0665\u0660"+ - "\3\2\2\2\u0665\u0661\3\2\2\2\u0665\u0662\3\2\2\2\u0665\u0663\3\2\2\2\u0665"+ - "\u0664\3\2\2\2\u0666\u0147\3\2\2\2\u0667\u0668\7\u00a1\2\2\u0668\u066a"+ - "\7\n\2\2\u0669\u066b\5\u0164\u00b3\2\u066a\u0669\3\2\2\2\u066a\u066b\3"+ - "\2\2\2\u066b\u066c\3\2\2\2\u066c\u066d\7\13\2\2\u066d\u0149\3\2\2\2\u066e"+ - "\u066f\7\u00a5\2\2\u066f\u0671\7\n\2\2\u0670\u0672\5\u0164\u00b3\2\u0671"+ - "\u0670\3\2\2\2\u0671\u0672\3\2\2\2\u0672\u0673\3\2\2\2\u0673\u0674\7\13"+ - "\2\2\u0674\u014b\3\2\2\2\u0675\u0676\7\u00a4\2\2\u0676\u0678\7\n\2\2\u0677"+ - "\u0679\5\u0164\u00b3\2\u0678\u0677\3\2\2\2\u0678\u0679\3\2\2\2\u0679\u067a"+ - "\3\2\2\2\u067a\u067b\7\13\2\2\u067b\u014d\3\2\2\2\u067c\u067d\7\u00a2"+ - "\2\2\u067d\u067f\7\n\2\2\u067e\u0680\5\u0164\u00b3\2\u067f\u067e\3\2\2"+ - "\2\u067f\u0680\3\2\2\2\u0680\u0681\3\2\2\2\u0681\u0682\7\13\2\2\u0682"+ - "\u014f\3\2\2\2\u0683\u0684\7\u00a3\2\2\u0684\u0686\7\n\2\2\u0685\u0687"+ - "\5\u0164\u00b3\2\u0686\u0685\3\2\2\2\u0686\u0687\3\2\2\2\u0687\u0688\3"+ - "\2\2\2\u0688\u0689\7\13\2\2\u0689\u0151\3\2\2\2\u068a\u068b\7\n\2\2\u068b"+ - "\u0693\7\13\2\2\u068c\u0690\5\u010c\u0087\2\u068d\u0691\7\u00aa\2\2\u068e"+ - "\u0691\7\f\2\2\u068f\u0691\7/\2\2\u0690\u068d\3\2\2\2\u0690\u068e\3\2"+ - "\2\2\u0690\u068f\3\2\2\2\u0690\u0691\3\2\2\2\u0691\u0693\3\2\2\2\u0692"+ - "\u068a\3\2\2\2\u0692\u068c\3\2\2\2\u0693\u0153\3\2\2\2\u0694\u069d\7\b"+ - "\2\2\u0695\u069a\5\u015e\u00b0\2\u0696\u0697\7\17\2\2\u0697\u0699\5\u015e"+ - "\u00b0\2\u0698\u0696\3\2\2\2\u0699\u069c\3\2\2\2\u069a\u0698\3\2\2\2\u069a"+ - "\u069b\3\2\2\2\u069b\u069e\3\2\2\2\u069c\u069a\3\2\2\2\u069d\u0695\3\2"+ - "\2\2\u069d\u069e\3\2\2\2\u069e\u069f\3\2\2\2\u069f\u06a5\7\t\2\2\u06a0"+ - "\u06a1\7;\2\2\u06a1\u06a2\5^\60\2\u06a2\u06a3\7<\2\2\u06a3\u06a5\3\2\2"+ - "\2\u06a4\u0694\3\2\2\2\u06a4\u06a0\3\2\2\2\u06a5\u0155\3\2\2\2\u06a6\u06a9"+ - "\5\u0158\u00ad\2\u06a7\u06a9\5\u015a\u00ae\2\u06a8\u06a6\3\2\2\2\u06a8"+ - "\u06a7\3\2\2\2\u06a9\u0157\3\2\2\2\u06aa\u06ab\7\37\2\2\u06ab\u06ac\7"+ - "\n\2\2\u06ac\u06ad\7\f\2\2\u06ad\u06ae\7\13\2\2\u06ae\u0159\3\2\2\2\u06af"+ - "\u06b0\7\37\2\2\u06b0\u06b9\7\n\2\2\u06b1\u06b6\5\u0152\u00aa\2\u06b2"+ - "\u06b3\7\17\2\2\u06b3\u06b5\5\u0152\u00aa\2\u06b4\u06b2\3\2\2\2\u06b5"+ - "\u06b8\3\2\2\2\u06b6\u06b4\3\2\2\2\u06b6\u06b7\3\2\2\2\u06b7\u06ba\3\2"+ - "\2\2\u06b8\u06b6\3\2\2\2\u06b9\u06b1\3\2\2\2\u06b9\u06ba\3\2\2\2\u06ba"+ - "\u06bb\3\2\2\2\u06bb\u06bc\7\13\2\2\u06bc\u06bd\7F\2\2\u06bd\u06be\5\u0152"+ - "\u00aa\2\u06be\u015b\3\2\2\2\u06bf\u06c1\5\u010c\u0087\2\u06c0\u06c2\7"+ - "\u00aa\2\2\u06c1\u06c0\3\2\2\2\u06c1\u06c2\3\2\2\2\u06c2\u015d\3\2\2\2"+ - "\u06c3\u06c6\5`\61\2\u06c4\u06c6\7\u00b2\2\2\u06c5\u06c3\3\2\2\2\u06c5"+ - "\u06c4\3\2\2\2\u06c6\u06c7\3\2\2\2\u06c7\u06c8\t\13\2\2\u06c8\u06c9\5"+ - "`\61\2\u06c9\u015f\3\2\2\2\u06ca\u06cc\7\65\2\2\u06cb\u06cd\5^\60\2\u06cc"+ - "\u06cb\3\2\2\2\u06cc\u06cd\3\2\2\2\u06cd\u06ce\3\2\2\2\u06ce\u06cf\7\66"+ - "\2\2\u06cf\u0161\3\2\2\2\u06d0\u06d1\5\u0164\u00b3\2\u06d1\u0163\3\2\2"+ - "\2\u06d2\u06d3\7\u00a9\2\2\u06d3\u0165\3\2\2\2\u06d4\u06d5\t\f\2\2\u06d5"+ - "\u0167\3\2\2\2\u00a9\u0170\u0174\u0184\u018a\u0192\u019a\u01a2\u01b1\u01cf"+ + "\u05dd\3\2\2\2\u05df\u0111\3\2\2\2\u05e0\u05e1\7\u0098\2\2\u05e1\u05e2"+ + "\7\n\2\2\u05e2\u05e3\7\13\2\2\u05e3\u0113\3\2\2\2\u05e4\u05e5\7\u0099"+ + "\2\2\u05e5\u05e6\7\n\2\2\u05e6\u05e7\7\13\2\2\u05e7\u0115\3\2\2\2\u05e8"+ + "\u05e9\7\u009b\2\2\u05e9\u05ec\7\n\2\2\u05ea\u05ed\5\u0126\u0094\2\u05eb"+ + "\u05ed\5\u012a\u0096\2\u05ec\u05ea\3\2\2\2\u05ec\u05eb\3\2\2\2\u05ec\u05ed"+ + "\3\2\2\2\u05ed\u05ee\3\2\2\2\u05ee\u05ef\7\13\2\2\u05ef\u0117\3\2\2\2"+ + "\u05f0\u05f1\7\u009c\2\2\u05f1\u05f2\7\n\2\2\u05f2\u05f3\7\13\2\2\u05f3"+ + "\u0119\3\2\2\2\u05f4\u05f5\7\u00a6\2\2\u05f5\u05f6\7\n\2\2\u05f6\u05f7"+ + "\7\13\2\2\u05f7\u011b\3\2\2\2\u05f8\u05f9\7\u009e\2\2\u05f9\u05fa\7\n"+ + "\2\2\u05fa\u05fb\7\13\2\2\u05fb\u011d\3\2\2\2\u05fc\u05fd\7\u009d\2\2"+ + "\u05fd\u0600\7\n\2\2\u05fe\u0601\7\u00b2\2\2\u05ff\u0601\5\u0164\u00b3"+ + "\2\u0600\u05fe\3\2\2\2\u0600\u05ff\3\2\2\2\u0600\u0601\3\2\2\2\u0601\u0602"+ + "\3\2\2\2\u0602\u0603\7\13\2\2\u0603\u011f\3\2\2\2\u0604\u0605\7\u008e"+ + "\2\2\u0605\u060b\7\n\2\2\u0606\u0609\5\u0122\u0092\2\u0607\u0608\7\17"+ + "\2\2\u0608\u060a\5\u0134\u009b\2\u0609\u0607\3\2\2\2\u0609\u060a\3\2\2"+ + "\2\u060a\u060c\3\2\2\2\u060b\u0606\3\2\2\2\u060b\u060c\3\2\2\2\u060c\u060d"+ + "\3\2\2\2\u060d\u060e\7\13\2\2\u060e\u0121\3\2\2\2\u060f\u0612\5\u012e"+ + "\u0098\2\u0610\u0612\7\f\2\2\u0611\u060f\3\2\2\2\u0611\u0610\3\2\2\2\u0612"+ + "\u0123\3\2\2\2\u0613\u0614\7\u009f\2\2\u0614\u0615\7\n\2\2\u0615\u0616"+ + "\5\u0144\u00a3\2\u0616\u0617\7\13\2\2\u0617\u0125\3\2\2\2\u0618\u0619"+ + "\7\u0088\2\2\u0619\u0622\7\n\2\2\u061a\u0620\5\u0128\u0095\2\u061b\u061c"+ + "\7\17\2\2\u061c\u061e\5\u0134\u009b\2\u061d\u061f\7\u00aa\2\2\u061e\u061d"+ + "\3\2\2\2\u061e\u061f\3\2\2\2\u061f\u0621\3\2\2\2\u0620\u061b\3\2\2\2\u0620"+ + "\u0621\3\2\2\2\u0621\u0623\3\2\2\2\u0622\u061a\3\2\2\2\u0622\u0623\3\2"+ + "\2\2\u0623\u0624\3\2\2\2\u0624\u0625\7\13\2\2\u0625\u0127\3\2\2\2\u0626"+ + "\u0629\5\u0130\u0099\2\u0627\u0629\7\f\2\2\u0628\u0626\3\2\2\2\u0628\u0627"+ + "\3\2\2\2\u0629\u0129\3\2\2\2\u062a\u062b\7\u00a0\2\2\u062b\u062c\7\n\2"+ + "\2\u062c\u062d\5\u012c\u0097\2\u062d\u062e\7\13\2\2\u062e\u012b\3\2\2"+ + "\2\u062f\u0630\5\u0130\u0099\2\u0630\u012d\3\2\2\2\u0631\u0632\5J&\2\u0632"+ + "\u012f\3\2\2\2\u0633\u0634\5J&\2\u0634\u0131\3\2\2\2\u0635\u0636\5\u0134"+ + "\u009b\2\u0636\u0133\3\2\2\2\u0637\u0638\5J&\2\u0638\u0135\3\2\2\2\u0639"+ + "\u063c\5\u0138\u009d\2\u063a\u063c\5\u013a\u009e\2\u063b\u0639\3\2\2\2"+ + "\u063b\u063a\3\2\2\2\u063c\u0137\3\2\2\2\u063d\u063e\7\u00a8\2\2\u063e"+ + "\u063f\7\n\2\2\u063f\u0640\7\f\2\2\u0640\u0641\7\13\2\2\u0641\u0139\3"+ + "\2\2\2\u0642\u0643\7\u00a8\2\2\u0643\u0644\7\n\2\2\u0644\u0645\5J&\2\u0645"+ + "\u0646\7\17\2\2\u0646\u0647\5\u0152\u00aa\2\u0647\u0648\7\13\2\2\u0648"+ + "\u013b\3\2\2\2\u0649\u064c\5\u013e\u00a0\2\u064a\u064c\5\u0140\u00a1\2"+ + "\u064b\u0649\3\2\2\2\u064b\u064a\3\2\2\2\u064c\u013d\3\2\2\2\u064d\u064e"+ + "\7\u00a7\2\2\u064e\u064f\7\n\2\2\u064f\u0650\7\f\2\2\u0650\u0651\7\13"+ + "\2\2\u0651\u013f\3\2\2\2\u0652\u0653\7\u00a7\2\2\u0653\u0654\7\n\2\2\u0654"+ + "\u0655\5\u0152\u00aa\2\u0655\u0656\7\13\2\2\u0656\u0141\3\2\2\2\u0657"+ + "\u0658\7\n\2\2\u0658\u0659\5\u010c\u0087\2\u0659\u065a\7\13\2\2\u065a"+ + "\u0143\3\2\2\2\u065b\u065c\5\u012e\u0098\2\u065c\u0145\3\2\2\2\u065d\u0663"+ + "\5\u0148\u00a5\2\u065e\u0663\5\u014a\u00a6\2\u065f\u0663\5\u014c\u00a7"+ + "\2\u0660\u0663\5\u014e\u00a8\2\u0661\u0663\5\u0150\u00a9\2\u0662\u065d"+ + "\3\2\2\2\u0662\u065e\3\2\2\2\u0662\u065f\3\2\2\2\u0662\u0660\3\2\2\2\u0662"+ + "\u0661\3\2\2\2\u0663\u0147\3\2\2\2\u0664\u0665\7\u00a1\2\2\u0665\u0667"+ + "\7\n\2\2\u0666\u0668\5\u0164\u00b3\2\u0667\u0666\3\2\2\2\u0667\u0668\3"+ + "\2\2\2\u0668\u0669\3\2\2\2\u0669\u066a\7\13\2\2\u066a\u0149\3\2\2\2\u066b"+ + "\u066c\7\u00a5\2\2\u066c\u066e\7\n\2\2\u066d\u066f\5\u0164\u00b3\2\u066e"+ + "\u066d\3\2\2\2\u066e\u066f\3\2\2\2\u066f\u0670\3\2\2\2\u0670\u0671\7\13"+ + "\2\2\u0671\u014b\3\2\2\2\u0672\u0673\7\u00a4\2\2\u0673\u0675\7\n\2\2\u0674"+ + "\u0676\5\u0164\u00b3\2\u0675\u0674\3\2\2\2\u0675\u0676\3\2\2\2\u0676\u0677"+ + "\3\2\2\2\u0677\u0678\7\13\2\2\u0678\u014d\3\2\2\2\u0679\u067a\7\u00a2"+ + "\2\2\u067a\u067c\7\n\2\2\u067b\u067d\5\u0164\u00b3\2\u067c\u067b\3\2\2"+ + "\2\u067c\u067d\3\2\2\2\u067d\u067e\3\2\2\2\u067e\u067f\7\13\2\2\u067f"+ + "\u014f\3\2\2\2\u0680\u0681\7\u00a3\2\2\u0681\u0683\7\n\2\2\u0682\u0684"+ + "\5\u0164\u00b3\2\u0683\u0682\3\2\2\2\u0683\u0684\3\2\2\2\u0684\u0685\3"+ + "\2\2\2\u0685\u0686\7\13\2\2\u0686\u0151\3\2\2\2\u0687\u0688\7\n\2\2\u0688"+ + "\u0690\7\13\2\2\u0689\u068d\5\u010c\u0087\2\u068a\u068e\7\u00aa\2\2\u068b"+ + "\u068e\7\f\2\2\u068c\u068e\7/\2\2\u068d\u068a\3\2\2\2\u068d\u068b\3\2"+ + "\2\2\u068d\u068c\3\2\2\2\u068d\u068e\3\2\2\2\u068e\u0690\3\2\2\2\u068f"+ + "\u0687\3\2\2\2\u068f\u0689\3\2\2\2\u0690\u0153\3\2\2\2\u0691\u069a\7\b"+ + "\2\2\u0692\u0697\5\u015e\u00b0\2\u0693\u0694\7\17\2\2\u0694\u0696\5\u015e"+ + "\u00b0\2\u0695\u0693\3\2\2\2\u0696\u0699\3\2\2\2\u0697\u0695\3\2\2\2\u0697"+ + "\u0698\3\2\2\2\u0698\u069b\3\2\2\2\u0699\u0697\3\2\2\2\u069a\u0692\3\2"+ + "\2\2\u069a\u069b\3\2\2\2\u069b\u069c\3\2\2\2\u069c\u06a2\7\t\2\2\u069d"+ + "\u069e\7;\2\2\u069e\u069f\5^\60\2\u069f\u06a0\7<\2\2\u06a0\u06a2\3\2\2"+ + "\2\u06a1\u0691\3\2\2\2\u06a1\u069d\3\2\2\2\u06a2\u0155\3\2\2\2\u06a3\u06a6"+ + "\5\u0158\u00ad\2\u06a4\u06a6\5\u015a\u00ae\2\u06a5\u06a3\3\2\2\2\u06a5"+ + "\u06a4\3\2\2\2\u06a6\u0157\3\2\2\2\u06a7\u06a8\7\37\2\2\u06a8\u06a9\7"+ + "\n\2\2\u06a9\u06aa\7\f\2\2\u06aa\u06ab\7\13\2\2\u06ab\u0159\3\2\2\2\u06ac"+ + "\u06ad\7\37\2\2\u06ad\u06b6\7\n\2\2\u06ae\u06b3\5\u0152\u00aa\2\u06af"+ + "\u06b0\7\17\2\2\u06b0\u06b2\5\u0152\u00aa\2\u06b1\u06af\3\2\2\2\u06b2"+ + "\u06b5\3\2\2\2\u06b3\u06b1\3\2\2\2\u06b3\u06b4\3\2\2\2\u06b4\u06b7\3\2"+ + "\2\2\u06b5\u06b3\3\2\2\2\u06b6\u06ae\3\2\2\2\u06b6\u06b7\3\2\2\2\u06b7"+ + "\u06b8\3\2\2\2\u06b8\u06b9\7\13\2\2\u06b9\u06ba\7F\2\2\u06ba\u06bb\5\u0152"+ + "\u00aa\2\u06bb\u015b\3\2\2\2\u06bc\u06be\5\u010c\u0087\2\u06bd\u06bf\7"+ + "\u00aa\2\2\u06be\u06bd\3\2\2\2\u06be\u06bf\3\2\2\2\u06bf\u015d\3\2\2\2"+ + "\u06c0\u06c3\5`\61\2\u06c1\u06c3\7\u00b2\2\2\u06c2\u06c0\3\2\2\2\u06c2"+ + "\u06c1\3\2\2\2\u06c3\u06c4\3\2\2\2\u06c4\u06c5\t\13\2\2\u06c5\u06c6\5"+ + "`\61\2\u06c6\u015f\3\2\2\2\u06c7\u06c9\7\65\2\2\u06c8\u06ca\5^\60\2\u06c9"+ + "\u06c8\3\2\2\2\u06c9\u06ca\3\2\2\2\u06ca\u06cb\3\2\2\2\u06cb\u06cc\7\66"+ + "\2\2\u06cc\u0161\3\2\2\2\u06cd\u06ce\5\u0164\u00b3\2\u06ce\u0163\3\2\2"+ + "\2\u06cf\u06d0\7\u00a9\2\2\u06d0\u0165\3\2\2\2\u06d1\u06d2\t\f\2\2\u06d2"+ + "\u0167\3\2\2\2\u00a8\u0170\u0174\u0184\u018a\u0192\u019a\u01a2\u01b1\u01cf"+ "\u01d7\u01d9\u01ef\u01f9\u0203\u0208\u020d\u0211\u021d\u0221\u022a\u0231"+ "\u023f\u0243\u0248\u0252\u025a\u025e\u026a\u0276\u028c\u0294\u0299\u029c"+ "\u02a0\u02a9\u02b2\u02b5\u02bd\u02c4\u02c6\u02cd\u02d4\u02d6\u02de\u02e3"+ @@ -13740,10 +13798,10 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\u044b\u0451\u0457\u045d\u0463\u046e\u0474\u0479\u0481\u0496\u049f\u04a1"+ "\u04b8\u04c9\u04d4\u04ea\u04ee\u04f5\u04f9\u0503\u0508\u0516\u051f\u0525"+ "\u0540\u0551\u0553\u055c\u0565\u0568\u0570\u0574\u0579\u0580\u0585\u0589"+ - "\u0591\u0598\u05a0\u05aa\u05ae\u05b3\u05c0\u05ce\u05de\u05e3\u05ef\u0603"+ - "\u060c\u060e\u0614\u0621\u0623\u0625\u062b\u063e\u064e\u0665\u066a\u0671"+ - "\u0678\u067f\u0686\u0690\u0692\u069a\u069d\u06a4\u06a8\u06b6\u06b9\u06c1"+ - "\u06c5\u06cc"; + "\u0591\u0598\u05a0\u05aa\u05ae\u05b3\u05c0\u05ce\u05de\u05ec\u0600\u0609"+ + "\u060b\u0611\u061e\u0620\u0622\u0628\u063b\u064b\u0662\u0667\u066e\u0675"+ + "\u067c\u0683\u068d\u068f\u0697\u069a\u06a1\u06a5\u06b3\u06b6\u06be\u06c2"+ + "\u06c9"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/test/java/iq/ReadXMLTests.java b/src/test/java/iq/ReadXMLTests.java index f6f007b85..b793009da 100644 --- a/src/test/java/iq/ReadXMLTests.java +++ b/src/test/java/iq/ReadXMLTests.java @@ -6,9 +6,14 @@ import org.rumbledb.api.Item; import org.rumbledb.api.Rumble; import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.compiler.VisitorHelpers; import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.expressions.module.MainModule; +import org.rumbledb.expressions.scripting.Program; +import org.rumbledb.expressions.xml.PathExpr; import org.rumbledb.runtime.functions.input.FileSystemUtil; +import java.io.IOException; import java.net.URI; import java.util.List; @@ -31,6 +36,24 @@ private URI resolveUri(String path) { ); } + private MainModule parseAndCompile(String filePath) throws IOException { + URI uri = FileSystemUtil.resolveURIAgainstWorkingDirectory( + filePath, + getConfiguration(), + ExceptionMetadata.EMPTY_METADATA + ); + return VisitorHelpers.parseMainModuleFromLocation( + uri, + getConfiguration() + ); + } + + private PathExpr getPathExprFromMainModule(String filePath) throws IOException { + MainModule mainModule = parseAndCompile(filePath); + Program program = (Program) mainModule.getDescendantsMatching(stmt -> stmt instanceof Program).get(0); + return (PathExpr) program.getStatementsAndOptionalExpr().getExpression(); + } + @Test(timeout = 100000) public void testBlockStatementWithSequentialStatement() throws Throwable { String filePath = System.getProperty("user.dir") @@ -75,4 +98,183 @@ public void testBlockStatementWithSequentialStatement() throws Throwable { assertEquals("web", attribute3.stringValue()); assertEquals("web", attribute4.stringValue()); } + + @Test(timeout = 100000) + public void testPathConstructionWithStartingDash() throws Throwable { + String filePath = System.getProperty("user.dir") + + + "/src/test/resources/test_files/xml/compile-xpath/XPathExample1.jq"; + PathExpr pathExpr = getPathExprFromMainModule(filePath); + StringBuffer sb = new StringBuffer(); + pathExpr.serializeToJSONiq(sb, 0); + assertEquals("/child::div1/child::div2\n", sb.toString()); + } + + @Test(timeout = 100000) + public void testPathConstructionWithoutStartingDash() throws Throwable { + String filePath = System.getProperty("user.dir") + + + "/src/test/resources/test_files/xml/compile-xpath/XPathExample2.jq"; + PathExpr pathExpr = getPathExprFromMainModule(filePath); + StringBuffer sb = new StringBuffer(); + pathExpr.serializeToJSONiq(sb, 0); + assertEquals("parent::author/child::title\n", sb.toString()); + } + + @Test(timeout = 100000) + public void testPathConstructionWithPredicates() throws Throwable { + String filePath = System.getProperty("user.dir") + + + "/src/test/resources/test_files/xml/compile-xpath/XPathExample3.jq"; + PathExpr pathExpr = getPathExprFromMainModule(filePath); + StringBuffer sb = new StringBuffer(); + pathExpr.serializeToJSONiq(sb, 0); + String res = sb.toString().trim().replaceAll("\n", ""); + res = res.replaceAll(" ", ""); + res = res.replaceAll("[,#]", ""); + assertEquals("/child::book/child::chapter[(fn:position0())eq(5)]/child::section[(fn:position0())eq(2)]", res); + } + + @Test(timeout = 100000) + public void testPathConstructionWithDoubleSlashStart() throws Throwable { + String filePath = System.getProperty("user.dir") + + + "/src/test/resources/test_files/xml/compile-xpath/XPathExample4.jq"; + PathExpr pathExpr = getPathExprFromMainModule(filePath); + StringBuffer sb = new StringBuffer(); + pathExpr.serializeToJSONiq(sb, 0); + String res = sb.toString().trim().replaceAll("\n", ""); + res = res.replaceAll(" ", ""); + res = res.replaceAll("[,#]", ""); + assertEquals("/descendant-or-self::node()/child::book/child::chapter[5]/child::section[2]", res); + } + + @Test(timeout = 100000) + public void testPathConstructionWithOrOperation() throws Throwable { + String filePath = System.getProperty("user.dir") + + + "/src/test/resources/test_files/xml/compile-xpath/XPathExample5.jq"; + PathExpr pathExpr = getPathExprFromMainModule(filePath); + StringBuffer sb = new StringBuffer(); + pathExpr.serializeToJSONiq(sb, 0); + String res = sb.toString().trim().replaceAll("\n", ""); + res = res.replaceAll(" ", ""); + res = res.replaceAll("[,#]", ""); + assertEquals("child::book/(child::chapter)or(child::appendix)/descendant-or-self::node()/child::section", res); + } + + @Test(timeout = 100000) + public void testPathConstructionWithDoubleSlashes() throws Throwable { + String filePath = System.getProperty("user.dir") + + + "/src/test/resources/test_files/xml/compile-xpath/XPathExample6.jq"; + PathExpr pathExpr = getPathExprFromMainModule(filePath); + StringBuffer sb = new StringBuffer(); + pathExpr.serializeToJSONiq(sb, 0); + String res = sb.toString().trim().replaceAll("\n", ""); + res = res.replaceAll(" ", ""); + res = res.replaceAll("[,#]", ""); + assertEquals( + "child::chapter/descendant-or-self::node()/child::para/descendant-or-self::node()/attribute::version", + res + ); + } + + @Test(timeout = 100000) + public void testPathConstructionWithWildcard() throws Throwable { + String filePath = System.getProperty("user.dir") + + + "/src/test/resources/test_files/xml/compile-xpath/XPathExample7.jq"; + PathExpr pathExpr = getPathExprFromMainModule(filePath); + StringBuffer sb = new StringBuffer(); + pathExpr.serializeToJSONiq(sb, 0); + String res = sb.toString().trim().replaceAll("\n", ""); + res = res.replaceAll(" ", ""); + res = res.replaceAll("[,#]", ""); + assertEquals("attribute::*", res); + } + + @Test(timeout = 100000) + public void testPathConstructionWithWildcardReverseAxis() throws Throwable { + String filePath = System.getProperty("user.dir") + + + "/src/test/resources/test_files/xml/compile-xpath/XPathExample8.jq"; + PathExpr pathExpr = getPathExprFromMainModule(filePath); + StringBuffer sb = new StringBuffer(); + pathExpr.serializeToJSONiq(sb, 0); + String res = sb.toString().trim().replaceAll("\n", ""); + res = res.replaceAll(" ", ""); + res = res.replaceAll("[,#]", ""); + assertEquals("parent::*", res); + } + + @Test(timeout = 100000) + public void testPathConstructionWithWildcardMultiPath() throws Throwable { + String filePath = System.getProperty("user.dir") + + + "/src/test/resources/test_files/xml/compile-xpath/XPathExample9.jq"; + PathExpr pathExpr = getPathExprFromMainModule(filePath); + StringBuffer sb = new StringBuffer(); + pathExpr.serializeToJSONiq(sb, 0); + String res = sb.toString().trim().replaceAll("\n", ""); + res = res.replaceAll(" ", ""); + res = res.replaceAll("[,#]", ""); + assertEquals("child::*/child::para", res); + } + + @Test(timeout = 100000) + public void testPathConstructionWithAttributeTest() throws Throwable { + String filePath = System.getProperty("user.dir") + + + "/src/test/resources/test_files/xml/compile-xpath/XPathExample10.jq"; + PathExpr pathExpr = getPathExprFromMainModule(filePath); + StringBuffer sb = new StringBuffer(); + pathExpr.serializeToJSONiq(sb, 0); + String res = sb.toString().trim().replaceAll("\n", ""); + res = res.replaceAll(" ", ""); + res = res.replaceAll("[,#]", ""); + assertEquals("attribute::attribute(price)", res); + } + + @Test(timeout = 100000) + public void testPathConstructionWithReverseAxis() throws Throwable { + String filePath = System.getProperty("user.dir") + + + "/src/test/resources/test_files/xml/compile-xpath/XPathExample11.jq"; + PathExpr pathExpr = getPathExprFromMainModule(filePath); + StringBuffer sb = new StringBuffer(); + pathExpr.serializeToJSONiq(sb, 0); + String res = sb.toString().trim().replaceAll("\n", ""); + res = res.replaceAll(" ", ""); + res = res.replaceAll("[,#]", ""); + assertEquals("parent::node()", res); + } + + @Test(timeout = 100000) + public void testPathConstructionWithReverseAxisAbbreviated() throws Throwable { + String filePath = System.getProperty("user.dir") + + + "/src/test/resources/test_files/xml/compile-xpath/XPathExample12.jq"; + PathExpr pathExpr = getPathExprFromMainModule(filePath); + StringBuffer sb = new StringBuffer(); + pathExpr.serializeToJSONiq(sb, 0); + String res = sb.toString().trim().replaceAll("\n", ""); + res = res.replaceAll(" ", ""); + res = res.replaceAll("[,#]", ""); + assertEquals("parent::node()/parent::element(*)", res); + } + + @Test(timeout = 100000) + public void testPathConstructionWithReverseAxisMultiPath() throws Throwable { + String filePath = System.getProperty("user.dir") + + + "/src/test/resources/test_files/xml/compile-xpath/XPathExample13.jq"; + PathExpr pathExpr = getPathExprFromMainModule(filePath); + StringBuffer sb = new StringBuffer(); + pathExpr.serializeToJSONiq(sb, 0); + String res = sb.toString().trim().replaceAll("\n", ""); + res = res.replaceAll(" ", ""); + res = res.replaceAll("[,#]", ""); + assertEquals("ancestor-or-self::di/ancestor::p/parent::text()", res); + } } diff --git a/src/test/resources/test_files/xml/FunctionXmlDoc1.jq b/src/test/resources/test_files/xml/FunctionXmlDoc1.jq deleted file mode 100644 index 2c9da0cbe..000000000 --- a/src/test/resources/test_files/xml/FunctionXmlDoc1.jq +++ /dev/null @@ -1,2 +0,0 @@ -(:JIQS: ShouldRun; Output="3" :) -xml-doc("../../../queries/xml/books.xml") diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample1.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample1.jq new file mode 100644 index 000000000..f763388b5 --- /dev/null +++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample1.jq @@ -0,0 +1 @@ +/child::div1/child::div2 \ No newline at end of file diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample10.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample10.jq new file mode 100644 index 000000000..f343e793c --- /dev/null +++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample10.jq @@ -0,0 +1 @@ +attribute(price) \ No newline at end of file diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample11.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample11.jq new file mode 100644 index 000000000..cd099475e --- /dev/null +++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample11.jq @@ -0,0 +1 @@ +parent::node() \ No newline at end of file diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample12.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample12.jq new file mode 100644 index 000000000..aab712bd9 --- /dev/null +++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample12.jq @@ -0,0 +1 @@ +../parent::element(*) \ No newline at end of file diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample13.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample13.jq new file mode 100644 index 000000000..45c32a344 --- /dev/null +++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample13.jq @@ -0,0 +1 @@ +ancestor-or-self::di/ancestor::p/parent::text() \ No newline at end of file diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample2.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample2.jq new file mode 100644 index 000000000..6015552c6 --- /dev/null +++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample2.jq @@ -0,0 +1 @@ +parent::author/title \ No newline at end of file diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample3.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample3.jq new file mode 100644 index 000000000..2aeb4296d --- /dev/null +++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample3.jq @@ -0,0 +1 @@ +/child::book/child::chapter[fn:position() = 5]/child::section[fn:position() = 2] \ No newline at end of file diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample4.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample4.jq new file mode 100644 index 000000000..b8eeba909 --- /dev/null +++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample4.jq @@ -0,0 +1 @@ +//book/chapter[5]/section[2] \ No newline at end of file diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample5.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample5.jq new file mode 100644 index 000000000..ab3d4d9c6 --- /dev/null +++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample5.jq @@ -0,0 +1 @@ +book/(chapter or appendix)//section \ No newline at end of file diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample6.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample6.jq new file mode 100644 index 000000000..e683a01b4 --- /dev/null +++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample6.jq @@ -0,0 +1 @@ +chapter//para//@version \ No newline at end of file diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample7.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample7.jq new file mode 100644 index 000000000..add02a169 --- /dev/null +++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample7.jq @@ -0,0 +1 @@ +attribute::* \ No newline at end of file diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample8.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample8.jq new file mode 100644 index 000000000..9ab7b2eaa --- /dev/null +++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample8.jq @@ -0,0 +1 @@ +parent::* \ No newline at end of file diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample9.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample9.jq new file mode 100644 index 000000000..5b35c4593 --- /dev/null +++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample9.jq @@ -0,0 +1 @@ +child::*/child::para \ No newline at end of file From 1434a6634b6f04a3844423520f53db9a7a5bd027 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 25 Jul 2024 16:14:23 +0200 Subject: [PATCH 41/56] Refactored classes --- gen/XQueryParserScripting.interp | 2 +- .../org/rumbledb/compiler/CloneVisitor.java | 85 +++++------- .../rumbledb/compiler/TranslationVisitor.java | 128 ++++++++++-------- .../expressions/AbstractNodeVisitor.java | 5 - .../org/rumbledb/expressions/xml/Dash.java | 38 ------ .../expressions/xml/IntermediaryPath.java | 20 --- .../rumbledb/expressions/xml/PathExpr.java | 37 +++-- .../rumbledb/expressions/xml/StepExpr.java | 42 +++--- .../expressions/xml/axis/AxisStep.java | 52 ------- .../rumbledb/expressions/xml/axis/NoStep.java | 9 ++ src/test/java/iq/ReadXMLTests.java | 2 +- 11 files changed, 158 insertions(+), 262 deletions(-) delete mode 100644 src/main/java/org/rumbledb/expressions/xml/Dash.java delete mode 100644 src/main/java/org/rumbledb/expressions/xml/IntermediaryPath.java delete mode 100644 src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java create mode 100644 src/main/java/org/rumbledb/expressions/xml/axis/NoStep.java diff --git a/gen/XQueryParserScripting.interp b/gen/XQueryParserScripting.interp index a8a5b7efd..b8693908f 100644 --- a/gen/XQueryParserScripting.interp +++ b/gen/XQueryParserScripting.interp @@ -556,7 +556,7 @@ whileStatement pathExpr relativePathExpr stepExpr -axisStep +stepExpr forwardStep forwardAxis abbrevForwardStep diff --git a/src/main/java/org/rumbledb/compiler/CloneVisitor.java b/src/main/java/org/rumbledb/compiler/CloneVisitor.java index 12d951b05..e77ff5a57 100644 --- a/src/main/java/org/rumbledb/compiler/CloneVisitor.java +++ b/src/main/java/org/rumbledb/compiler/CloneVisitor.java @@ -79,11 +79,6 @@ import org.rumbledb.expressions.typing.IsStaticallyExpression; import org.rumbledb.expressions.typing.TreatExpression; import org.rumbledb.expressions.typing.ValidateTypeExpression; -import org.rumbledb.expressions.xml.Dash; -import org.rumbledb.expressions.xml.IntermediaryPath; -import org.rumbledb.expressions.xml.PathExpr; -import org.rumbledb.expressions.xml.StepExpr; -import org.rumbledb.expressions.xml.axis.AxisStep; import java.util.ArrayList; import java.util.HashMap; @@ -1053,52 +1048,40 @@ public Node visitVariableDeclStatement(VariableDeclStatement statement, Node arg // begin region xml - @Override - public Node visitPathExpr(PathExpr expression, Node argument) { - List intermediaryPaths = new ArrayList<>(); - for (IntermediaryPath path : expression.getIntermediaryPaths()) { - Dash dash = null; - if (path.getPreStepExprDash() != null) { - dash = new Dash( - path.getPreStepExprDash().requiresRoot(), - (AxisStep) this.visitAxisStep(path.getPreStepExprDash().getAxisStep(), argument) - ); - } - StepExpr stepExpr = (StepExpr) this.visitStepExpr(path.getStepExpr(), argument); - intermediaryPaths.add(new IntermediaryPath(dash, stepExpr)); - } - PathExpr result = new PathExpr(intermediaryPaths, expression.getMetadata()); - result.setStaticSequenceType(expression.getStaticSequenceType()); - result.setStaticContext(expression.getStaticContext()); - return result; - } - - @Override - public Node visitStepExpr(StepExpr expression, Node argument) { - StepExpr result; - if (expression.getPostFixExpr() != null) { - Expression postFixExpr = (Expression) this.visit(expression.getPostFixExpr(), argument); - result = new StepExpr(postFixExpr, expression.getMetadata()); - } else { - AxisStep axisStep = (AxisStep) this.visitAxisStep(expression.getAxisStep(), argument); - result = new StepExpr(axisStep, expression.getMetadata()); - } - result.setStaticSequenceType(expression.getStaticSequenceType()); - result.setStaticContext(expression.getStaticContext()); - return result; - } - - @Override - public Node visitAxisStep(AxisStep axisStep, Node argument) { - if (axisStep == null) { - return null; - } - List predicates = new ArrayList<>(); - for (Expression predicate : axisStep.getPredicates()) { - predicates.add((Expression) this.visit(predicate, argument)); - } - return new AxisStep(axisStep.getStep(), predicates); - } + // @Override + // public Node visitPathExpr(PathExpr expression, Node argument) { + // List intermediaryPaths = new ArrayList<>(); + // for (IntermediaryPath path : expression.getRelativePathExpressions()) { + // Dash dash = null; + // if (path.getPreStepExprDash() != null) { + // dash = new Dash( + // path.getPreStepExprDash().requiresRoot(), + // (StepExpr) this.visitAxisStep(path.getPreStepExprDash().getAxisStep(), argument) + // ); + // } + // StepExpr stepExpr = (StepExpr) this.visitStepExpr(path.getStepExpr(), argument); + // intermediaryPaths.add(new IntermediaryPath(dash, stepExpr)); + // } + // PathExpr result = new PathExpr(intermediaryPaths, expression.getMetadata()); + // result.setStaticSequenceType(expression.getStaticSequenceType()); + // result.setStaticContext(expression.getStaticContext()); + // return result; + // } + + // @Override + // public Node visitStepExpr(StepExpr expression, Node argument) { + // StepExpr result; + // if (expression.getPostFixExpr() != null) { + // Expression postFixExpr = (Expression) this.visit(expression.getPostFixExpr(), argument); + // result = new StepExpr(postFixExpr, expression.getMetadata()); + // } else { + // StepExpr stepExpr = (StepExpr) this.visitAxisStep(expression.getAxisStep(), argument); + // result = new StepExpr(stepExpr, expression.getMetadata()); + // } + // result.setStaticSequenceType(expression.getStaticSequenceType()); + // result.setStaticContext(expression.getStaticContext()); + // return result; + // } // end region xml } diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java index beb0cd981..cd6dda57b 100644 --- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java @@ -138,13 +138,11 @@ import org.rumbledb.expressions.update.RenameExpression; import org.rumbledb.expressions.update.ReplaceExpression; import org.rumbledb.expressions.update.TransformExpression; -import org.rumbledb.expressions.xml.Dash; -import org.rumbledb.expressions.xml.IntermediaryPath; import org.rumbledb.expressions.xml.PathExpr; import org.rumbledb.expressions.xml.StepExpr; -import org.rumbledb.expressions.xml.axis.AxisStep; import org.rumbledb.expressions.xml.axis.ForwardAxis; import org.rumbledb.expressions.xml.axis.ForwardStep; +import org.rumbledb.expressions.xml.axis.NoStep; import org.rumbledb.expressions.xml.axis.ReverseAxis; import org.rumbledb.expressions.xml.axis.ReverseStep; import org.rumbledb.expressions.xml.axis.Step; @@ -2296,76 +2294,100 @@ public Node visitVarDeclStatement(JsoniqParser.VarDeclStatementContext ctx) { @Override public Node visitPathExpr(JsoniqParser.PathExprContext ctx) { if (ctx.singleslash != null) { - Dash startDash = new Dash(true); - StepExpr stepExpr = (StepExpr) this.visitStepExpr(ctx.singleslash.stepExpr(0)); - List intermediaryPaths = getIntermediaryPaths(startDash, stepExpr, ctx.singleslash); - return new PathExpr(intermediaryPaths, createMetadataFromContext(ctx)); + return visitSingleSlash(ctx.singleslash); } else if (ctx.doubleslash != null) { - Dash startDash = new Dash( - true, - new AxisStep(new ForwardStep(ForwardAxis.DESCENDANT_OR_SELF, new AnyKindTest())) - ); - StepExpr stepExpr = (StepExpr) this.visitStepExpr(ctx.doubleslash.stepExpr(0)); - List intermediaryPaths = getIntermediaryPaths(startDash, stepExpr, ctx.doubleslash); - return new PathExpr(intermediaryPaths, createMetadataFromContext(ctx)); + return visitDoubleSlash(ctx.doubleslash); } else if (ctx.relative != null) { - if (ctx.relative.stepExpr(0).postFixExpr() != null) { - // We only have a postfix expression, not a path expression - return this.visitPostFixExpr(ctx.relative.stepExpr(0).postFixExpr()); - } - StepExpr stepExpr = (StepExpr) this.visitStepExpr(ctx.relative.stepExpr(0)); - List intermediaryPaths = getIntermediaryPaths(null, stepExpr, ctx.relative); - return new PathExpr(intermediaryPaths, createMetadataFromContext(ctx)); + return visitRelativeWithoutSlash(ctx.relative); } + return visitSingleSlashNoStepExpr(ctx); + } + + private Node visitSingleSlashNoStepExpr(JsoniqParser.PathExprContext ctx) { // Case: No StepExpr, only dash - Dash startDash = new Dash(true); - List intermediaryPaths = getIntermediaryPaths(startDash, null, ctx.singleslash); - return new PathExpr(intermediaryPaths, createMetadataFromContext(ctx)); + StepExpr stepExpr = new StepExpr(new NoStep(), createMetadataFromContext(ctx)); + List intermediaryPaths = Collections.singletonList(stepExpr); + return new PathExpr(true, intermediaryPaths, createMetadataFromContext(ctx)); + } + + private Node visitRelativeWithoutSlash(JsoniqParser.RelativePathExprContext relativeContext) { + if (relativeContext.stepExpr().size() == 1 && relativeContext.stepExpr(0).postFixExpr() != null) { + // We only have a postfix expression, not a path expression + return this.visitPostFixExpr(relativeContext.stepExpr(0).postFixExpr()); + } + List intermediaryPaths = getIntermediaryPaths(relativeContext); + return new PathExpr(false, intermediaryPaths, createMetadataFromContext(relativeContext)); } - private List getIntermediaryPaths( - Dash startDash, + private Node visitDoubleSlash(JsoniqParser.RelativePathExprContext doubleSlashContext) { + StepExpr stepExpr = new StepExpr( + new ForwardStep(ForwardAxis.DESCENDANT_OR_SELF, new AnyKindTest()), + createMetadataFromContext(doubleSlashContext) + ); + List intermediaryPaths = getIntermediaryPaths(stepExpr, doubleSlashContext); + return new PathExpr(true, intermediaryPaths, createMetadataFromContext(doubleSlashContext)); + } + + private Node visitSingleSlash(JsoniqParser.RelativePathExprContext singleSlashContext) { + List intermediaryPaths = getIntermediaryPaths(singleSlashContext); + return new PathExpr(true, intermediaryPaths, createMetadataFromContext(singleSlashContext)); + } + + + // The path may start with a '/' or '//' which should be already converted to a StepExpr. + private List getIntermediaryPaths( StepExpr stepExpr, JsoniqParser.RelativePathExprContext relativePathExprContext ) { - List intermediaryPaths = new ArrayList<>(); - Dash currentDash = startDash; - StepExpr currentStepExpr = stepExpr; - for (int i = 1; i < relativePathExprContext.stepExpr().size(); ++i) { - IntermediaryPath intermediaryPath = new IntermediaryPath(currentDash, currentStepExpr); - intermediaryPaths.add(intermediaryPath); - - if (relativePathExprContext.sep.get(i - 1).getText().equals("/")) { - currentDash = new Dash(false, null); - } else { - currentDash = new Dash( - false, - new AxisStep(new ForwardStep(ForwardAxis.DESCENDANT_OR_SELF, new AnyKindTest())) + List intermediaryPaths = new ArrayList<>(); + StepExpr currentStepExpr; + intermediaryPaths.add(stepExpr); + for (int i = 0; i < relativePathExprContext.stepExpr().size(); ++i) { + currentStepExpr = (StepExpr) this.visitStepExpr(relativePathExprContext.stepExpr(i)); + if (i > 0 && relativePathExprContext.sep.get(i - 1).getText().equals("//")) { + // Unroll '//' to forward axis + StepExpr intermediaryStep = new StepExpr( + new ForwardStep(ForwardAxis.DESCENDANT_OR_SELF, new AnyKindTest()), + createMetadataFromContext(relativePathExprContext) ); + intermediaryPaths.add(intermediaryStep); } - currentStepExpr = (StepExpr) this.visitStepExpr(relativePathExprContext.stepExpr(i)); + intermediaryPaths.add(currentStepExpr); } - IntermediaryPath intermediaryPath = new IntermediaryPath(currentDash, currentStepExpr); - intermediaryPaths.add(intermediaryPath); return intermediaryPaths; } - @Override - public Node visitStepExpr(JsoniqParser.StepExprContext ctx) { - if (ctx.postFixExpr() == null) { - return new StepExpr((AxisStep) this.visitAxisStep(ctx.axisStep()), createMetadataFromContext(ctx)); + private List getIntermediaryPaths( + JsoniqParser.RelativePathExprContext relativePathExprContext + ) { + List intermediaryPaths = new ArrayList<>(); + Expression currentStepExpr; + for (int i = 0; i < relativePathExprContext.stepExpr().size(); ++i) { + currentStepExpr = (Expression) this.visitStepExpr(relativePathExprContext.stepExpr(i)); + if (i > 0 && relativePathExprContext.sep.get(i - 1).getText().equals("//")) { + // Unroll '//' to forward axis + StepExpr intermediaryStep = new StepExpr( + new ForwardStep(ForwardAxis.DESCENDANT_OR_SELF, new AnyKindTest()), + createMetadataFromContext(relativePathExprContext) + ); + intermediaryPaths.add(intermediaryStep); + } + intermediaryPaths.add(currentStepExpr); } - return new StepExpr((Expression) this.visitPostFixExpr(ctx.postFixExpr()), createMetadataFromContext(ctx)); + return intermediaryPaths; } @Override - public Node visitAxisStep(JsoniqParser.AxisStepContext ctx) { - List predicates = new ArrayList<>(); - Step step = getStep(ctx); - for (JsoniqParser.PredicateContext predicateContext : ctx.predicateList().predicate()) { - predicates.add((Expression) this.visitPredicate(predicateContext)); + public Node visitStepExpr(JsoniqParser.StepExprContext ctx) { + if (ctx.postFixExpr() == null) { + List predicates = new ArrayList<>(); + Step step = getStep(ctx.axisStep()); + for (JsoniqParser.PredicateContext predicateContext : ctx.axisStep().predicateList().predicate()) { + predicates.add((Expression) this.visitPredicate(predicateContext)); + } + return new StepExpr(step, predicates, createMetadataFromContext(ctx)); } - return new AxisStep(step, predicates); + return this.visitPostFixExpr(ctx.postFixExpr()); } private Step getStep(JsoniqParser.AxisStepContext ctx) { diff --git a/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java b/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java index ae983bf13..7a8d33f39 100644 --- a/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java +++ b/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java @@ -99,7 +99,6 @@ import org.rumbledb.expressions.update.TransformExpression; import org.rumbledb.expressions.xml.PathExpr; import org.rumbledb.expressions.xml.StepExpr; -import org.rumbledb.expressions.xml.axis.AxisStep; public abstract class AbstractNodeVisitor { @@ -464,8 +463,4 @@ public T visitPathExpr(PathExpr pathExpr, T argument) { public T visitStepExpr(StepExpr stepExpr, T argument) { return defaultAction(stepExpr, argument); } - - public T visitAxisStep(AxisStep axisStep, T argument) { - return defaultAction(axisStep, argument); - } } diff --git a/src/main/java/org/rumbledb/expressions/xml/Dash.java b/src/main/java/org/rumbledb/expressions/xml/Dash.java deleted file mode 100644 index 658689433..000000000 --- a/src/main/java/org/rumbledb/expressions/xml/Dash.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.rumbledb.expressions.xml; - -import org.rumbledb.expressions.xml.axis.AxisStep; - -public class Dash { - private boolean getRoot; - private AxisStep axisStep; - - public Dash(boolean getRoot, AxisStep axisStep) { - this.getRoot = getRoot; - this.axisStep = axisStep; - } - - public Dash(boolean getRoot) { - this.getRoot = getRoot; - this.axisStep = null; - } - - public AxisStep getAxisStep() { - return axisStep; - } - - public boolean requiresRoot() { - return getRoot; - } - - @Override - public String toString() { - // TODO: add root function call - if (this.axisStep != null) { - StringBuffer sb = new StringBuffer("/"); - this.axisStep.serializeToJSONiq(sb, 0); - sb.append("/"); - return sb.toString(); - } - return "/"; - } -} diff --git a/src/main/java/org/rumbledb/expressions/xml/IntermediaryPath.java b/src/main/java/org/rumbledb/expressions/xml/IntermediaryPath.java deleted file mode 100644 index e0bcac756..000000000 --- a/src/main/java/org/rumbledb/expressions/xml/IntermediaryPath.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.rumbledb.expressions.xml; - -public class IntermediaryPath { - private Dash preStepExprDash; - private StepExpr stepExpr; - - public IntermediaryPath(Dash preStepExprDash, StepExpr stepExpr) { - this.preStepExprDash = preStepExprDash; - this.stepExpr = stepExpr; - } - - - public StepExpr getStepExpr() { - return stepExpr; - } - - public Dash getPreStepExprDash() { - return preStepExprDash; - } -} diff --git a/src/main/java/org/rumbledb/expressions/xml/PathExpr.java b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java index cad369165..83db51f11 100644 --- a/src/main/java/org/rumbledb/expressions/xml/PathExpr.java +++ b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java @@ -9,14 +9,18 @@ import java.util.List; public class PathExpr extends Expression { - private final List relativePathExpr; + private final List relativePathExpressions; + // TODO: Handle fetching. + private boolean fetchRoot; public PathExpr( - List relativePathExpr, + boolean fetchRoot, + List relativePathExpressions, ExceptionMetadata metadata ) { super(metadata); - this.relativePathExpr = relativePathExpr; + this.fetchRoot = fetchRoot; + this.relativePathExpressions = relativePathExpressions; } @Override @@ -26,31 +30,26 @@ public T accept(AbstractNodeVisitor visitor, T argument) { @Override public List getChildren() { - List result = new ArrayList<>(); - for (IntermediaryPath path : this.relativePathExpr) { - if (path.getPreStepExprDash() != null && path.getPreStepExprDash().getAxisStep() != null) { - result.add(path.getPreStepExprDash().getAxisStep()); - } - result.add(path.getStepExpr()); - } - return result; + return new ArrayList<>(this.relativePathExpressions); } @Override public void serializeToJSONiq(StringBuffer sb, int indent) { + int pathCounter = 0; indentIt(sb, indent); - for (IntermediaryPath path : this.relativePathExpr) { - if (path.getPreStepExprDash() == null) { - path.getStepExpr().serializeToJSONiq(sb, indent); - } else { - sb.append(path.getPreStepExprDash().toString()); - path.getStepExpr().serializeToJSONiq(sb, indent); + if (this.fetchRoot) { + sb.append("/"); + } + for (Expression stepExpr : this.relativePathExpressions) { + stepExpr.serializeToJSONiq(sb, indent); + if (++pathCounter < this.relativePathExpressions.size()) { + sb.append("/"); } } sb.append("\n"); } - public List getIntermediaryPaths() { - return this.relativePathExpr; + public List getRelativePathExpressions() { + return this.relativePathExpressions; } } diff --git a/src/main/java/org/rumbledb/expressions/xml/StepExpr.java b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java index 331ed146e..64e90076e 100644 --- a/src/main/java/org/rumbledb/expressions/xml/StepExpr.java +++ b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java @@ -4,25 +4,25 @@ import org.rumbledb.expressions.AbstractNodeVisitor; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; -import org.rumbledb.expressions.xml.axis.AxisStep; +import org.rumbledb.expressions.xml.axis.Step; -import java.util.Collections; +import java.util.ArrayList; import java.util.List; public class StepExpr extends Expression { - private Expression postFixExpr; - private AxisStep axisStep; + private Step step; + private List predicates; - public StepExpr(Expression postFixExpr, ExceptionMetadata exceptionMetadata) { + public StepExpr(Step step, ExceptionMetadata exceptionMetadata) { super(exceptionMetadata); - this.postFixExpr = postFixExpr; - this.axisStep = null; + this.step = step; + this.predicates = new ArrayList<>(); } - public StepExpr(AxisStep axisStep, ExceptionMetadata exceptionMetadata) { + public StepExpr(Step step, List predicates, ExceptionMetadata exceptionMetadata) { super(exceptionMetadata); - this.postFixExpr = null; - this.axisStep = axisStep; + this.step = step; + this.predicates = predicates; } @Override @@ -32,27 +32,25 @@ public T accept(AbstractNodeVisitor visitor, T argument) { @Override public List getChildren() { - if (this.postFixExpr != null) { - return Collections.singletonList(this.postFixExpr); - } - return Collections.singletonList(this.axisStep); + return new ArrayList<>(predicates); } @Override public void serializeToJSONiq(StringBuffer sb, int indent) { indentIt(sb, indent); - if (this.postFixExpr != null) { - this.postFixExpr.serializeToJSONiq(sb, indent); - } else { - this.axisStep.serializeToJSONiq(sb, indent); + sb.append(step.toString()); + for (Expression predicate : predicates) { + sb.append("[ "); + predicate.serializeToJSONiq(sb, indent); + sb.append(" ], "); } } - public Node getPostFixExpr() { - return this.postFixExpr; + public List getPredicates() { + return this.predicates; } - public AxisStep getAxisStep() { - return this.axisStep; + public Step getStep() { + return this.step; } } diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java deleted file mode 100644 index 4a0cbf538..000000000 --- a/src/main/java/org/rumbledb/expressions/xml/axis/AxisStep.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.rumbledb.expressions.xml.axis; - -import org.rumbledb.expressions.AbstractNodeVisitor; -import org.rumbledb.expressions.Expression; -import org.rumbledb.expressions.Node; - -import java.util.ArrayList; -import java.util.List; - -public class AxisStep extends Node { - private Step step; - private List predicates; - - public AxisStep(Step step) { - this.step = step; - this.predicates = new ArrayList<>(); - } - - public AxisStep(Step step, List predicates) { - this.step = step; - this.predicates = predicates; - } - - @Override - public T accept(AbstractNodeVisitor visitor, T argument) { - return visitor.visitAxisStep(this, argument); - } - - @Override - public List getChildren() { - return new ArrayList<>(predicates); - } - - @Override - public void serializeToJSONiq(StringBuffer sb, int indent) { - indentIt(sb, indent); - sb.append(step.toString()); - for (Expression predicate : predicates) { - sb.append("[ "); - predicate.serializeToJSONiq(sb, indent); - sb.append(" ], "); - } - } - - public List getPredicates() { - return this.predicates; - } - - public Step getStep() { - return this.step; - } -} diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/NoStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/NoStep.java new file mode 100644 index 000000000..eb5f80aec --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/axis/NoStep.java @@ -0,0 +1,9 @@ +package org.rumbledb.expressions.xml.axis; + +public class NoStep implements Step { + + @Override + public String toString() { + return ""; + } +} diff --git a/src/test/java/iq/ReadXMLTests.java b/src/test/java/iq/ReadXMLTests.java index b793009da..0e7912511 100644 --- a/src/test/java/iq/ReadXMLTests.java +++ b/src/test/java/iq/ReadXMLTests.java @@ -132,7 +132,7 @@ public void testPathConstructionWithPredicates() throws Throwable { String res = sb.toString().trim().replaceAll("\n", ""); res = res.replaceAll(" ", ""); res = res.replaceAll("[,#]", ""); - assertEquals("/child::book/child::chapter[(fn:position0())eq(5)]/child::section[(fn:position0())eq(2)]", res); + assertEquals("/child::book/child::chapter[(fn:position0())=(5)]/child::section[(fn:position0())=(2)]", res); } @Test(timeout = 100000) From d1bb791511999eb66b0fdb74603da239d57bb88d Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 25 Jul 2024 17:46:44 +0200 Subject: [PATCH 42/56] Fixed grammar --- src/main/java/org/rumbledb/parser/Jsoniq.g4 | 99 +- .../java/org/rumbledb/parser/Jsoniq.interp | 50 +- .../java/org/rumbledb/parser/Jsoniq.tokens | 192 +- .../rumbledb/parser/JsoniqBaseVisitor.java | 132 +- .../org/rumbledb/parser/JsoniqLexer.interp | 44 +- .../java/org/rumbledb/parser/JsoniqLexer.java | 1153 ++-- .../org/rumbledb/parser/JsoniqLexer.tokens | 192 +- .../org/rumbledb/parser/JsoniqParser.java | 5051 +++++++---------- .../org/rumbledb/parser/JsoniqVisitor.java | 120 +- 9 files changed, 2870 insertions(+), 4163 deletions(-) diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.g4 b/src/main/java/org/rumbledb/parser/Jsoniq.g4 index 30cae2882..29b9ec835 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.g4 +++ b/src/main/java/org/rumbledb/parser/Jsoniq.g4 @@ -330,9 +330,9 @@ deleteExpr : Kdelete Kjson updateLocator; renameExpr : Krename Kjson updateLocator Kas name_expr=exprSingle; -replaceExpr : Kreplace Kjson Kvalue Kof updateLocator Kwith replacer_expr=exprSingle; +replaceExpr : Kreplace Kvalue Kof Kjson updateLocator Kwith replacer_expr=exprSingle; -transformExpr : Kcopy Kjson copyDecl ( ',' copyDecl )* Kmodify mod_expr=exprSingle Kreturn ret_expr=exprSingle; +transformExpr : Kcopy copyDecl ( ',' copyDecl )* Kmodify mod_expr=exprSingle Kreturn ret_expr=exprSingle; appendExpr : Kappend Kjson to_append_expr=exprSingle Kinto array_expr=exprSingle; @@ -343,29 +343,7 @@ copyDecl : var_ref=varRef ':=' src_expr=exprSingle; // TODO: Direct element constructors -///////////////////////// XPath and XQuery - -// Mostly taken from http://www.w3.org/TR/xquery/#id-grammar, with some -// simplifications: -// -// 1. The parser itself doesn't really enforce ws:explicit except for some easy -// cases (QNames and wildcards). Walkers will need to do this (and also parse -// wildcards a bit). -// -// 2. When collecting element content, we will need to check the HIDDEN -// channel as well, for whitespace and XQuery comments (these should be -// treated as regular text inside elements). - -// MODULE HEADER /////////////////////////////////////////////////////////////// - -// Replace according to https://www.w3.org/TR/xquery-31/#id-query-prolog, we only have single mainModule - -schemaImport: Kimport Kschema - schemaPrefix? - nsURI=uriLiteral - (Kat locations+=uriLiteral (',' locations+=uriLiteral)*)? ; - -schemaPrefix: (Knamespace NCName '=' | Kdefault Kelement Knamespace) ; +///////////////////////// XPath // PATHS /////////////////////////////////////////////////////////////////////// @@ -387,7 +365,7 @@ forwardAxis: ( Kchild | Kfollowing_sibling | Kfollowing ) ':' ':' ; -abbrevForwardStep: Kat_symbol? nodeTest ; +abbrevForwardStep: Kat_symbol nodeTest ; reverseStep: (reverseAxis nodeTest) | abbrevReverseStep ; @@ -413,18 +391,6 @@ nCNameWithPrefixWildcard: '*' ':' NCName ; predicateList: predicate*; -itemType: qname - | NullLiteral - | kindTest - | ('item' '(' ')') - | functionTest - | mapTest - | arrayTest - | atomicOrUnionType - | parenthesizedItemTest ; - -atomicOrUnionType: qname ; - kindTest: documentTest | elementTest | attributeTest @@ -434,7 +400,6 @@ kindTest: documentTest | commentTest | textTest | namespaceNodeTest - | mlNodeTest | binaryNodeTest | anyKindTest ; @@ -459,6 +424,8 @@ attributeNameOrWildcard: attributeName | '*' ; schemaAttributeTest: Kschema_attribute '(' attributeDeclaration ')' ; +attributeDeclaration: attributeName ; + elementTest: Kelement '(' (elementNameOrWildcard (',' type=typeName optional='?'?)?)? ')' ; elementNameOrWildcard: elementName | '*' ; @@ -475,39 +442,6 @@ simpleTypeName: typeName ; typeName: qname; -mapTest: anyMapTest | typedMapTest ; - -anyMapTest: Kmap '(' '*' ')' ; - -typedMapTest: Kmap '(' qname ',' sequenceType ')' ; - -arrayTest: anyArrayTest | typedArrayTest ; - -anyArrayTest: Karray '(' '*' ')' ; - -typedArrayTest: Karray '(' sequenceType ')' ; - -parenthesizedItemTest: '(' itemType ')' ; - -attributeDeclaration: attributeName ; - -mlNodeTest: mlArrayNodeTest - | mlObjectNodeTest - | mlNumberNodeTest - | mlBooleanNodeTest - | mlNullNodeTest - ; - -mlArrayNodeTest: Karray_node '(' stringLiteral? ')' ; - -mlObjectNodeTest: Kobject_node '(' stringLiteral? ')' ; - -mlNumberNodeTest: Knumber_node '(' stringLiteral? ')' ; - -mlBooleanNodeTest: Kboolean_node '(' stringLiteral? ')' ; - -mlNullNodeTest: Knull_node '(' stringLiteral? ')' ; - ///////////////////////// Types sequenceType : '(' ')' @@ -516,6 +450,10 @@ sequenceType : '(' ')' objectConstructor : '{' ( pairConstructor (',' pairConstructor)* )? '}' | merge_operator+='{|' expr '|}'; +itemType : qname + | NullLiteral + | functionTest; + functionTest : (anyFunctionTest | typedFunctionTest); anyFunctionTest : 'function' '(' '*' ')'; @@ -741,13 +679,6 @@ Kwith : 'with'; Kposition : 'position'; -///////////////////////// Scripting keywords -Kbreak : 'break' ; -Kloop : 'loop' ; -Kcontinue : 'continue' ; -Kexit : 'exit' ; -Kreturning : 'returning' ; -Kwhile : 'while' ; ///////////////////////// XPath Kimport : 'import'; @@ -784,8 +715,14 @@ Knull_node : 'null-node'; Knumber_node : 'number-node'; Kobject_node : 'object-node'; Kcomment : 'comment'; -Karray : 'array'; -Kmap : 'map'; + +///////////////////////// Scripting keywords +Kbreak : 'break' ; +Kloop : 'loop' ; +Kcontinue : 'continue' ; +Kexit : 'exit' ; +Kreturning : 'returning' ; +Kwhile : 'while' ; STRING : '"' (ESC | ~ ["\\])* '"'; diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.interp b/src/main/java/org/rumbledb/parser/Jsoniq.interp index af0d231f1..c467abd2d 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.interp +++ b/src/main/java/org/rumbledb/parser/Jsoniq.interp @@ -124,12 +124,6 @@ null 'json' 'with' 'position' -'break' -'loop' -'continue' -'exit' -'returning' -'while' 'import' 'schema' 'namespace' @@ -164,8 +158,12 @@ null 'number-node' 'object-node' 'comment' -'array' -'map' +'break' +'loop' +'continue' +'exit' +'returning' +'while' null '?' 'null' @@ -305,12 +303,6 @@ Kvalue Kjson Kwith Kposition -Kbreak -Kloop -Kcontinue -Kexit -Kreturning -Kwhile Kimport Kschema Knamespace @@ -345,8 +337,12 @@ Knull_node Knumber_node Kobject_node Kcomment -Karray -Kmap +Kbreak +Kloop +Kcontinue +Kexit +Kreturning +Kwhile STRING ArgumentPlaceholder NullLiteral @@ -476,8 +472,6 @@ transformExpr appendExpr updateLocator copyDecl -schemaImport -schemaPrefix pathExpr relativePathExpr stepExpr @@ -494,8 +488,6 @@ wildcard nCNameWithLocalWildcard nCNameWithPrefixWildcard predicateList -itemType -atomicOrUnionType kindTest anyKindTest binaryNodeTest @@ -507,6 +499,7 @@ piTest attributeTest attributeNameOrWildcard schemaAttributeTest +attributeDeclaration elementTest elementNameOrWildcard schemaElementTest @@ -515,22 +508,9 @@ attributeName elementName simpleTypeName typeName -mapTest -anyMapTest -typedMapTest -arrayTest -anyArrayTest -typedArrayTest -parenthesizedItemTest -attributeDeclaration -mlNodeTest -mlArrayNodeTest -mlObjectNodeTest -mlNumberNodeTest -mlBooleanNodeTest -mlNullNodeTest sequenceType objectConstructor +itemType functionTest anyFunctionTest typedFunctionTest @@ -543,4 +523,4 @@ keyWords atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 180, 1748, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 369, 10, 3, 3, 3, 3, 3, 5, 3, 373, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 389, 10, 6, 3, 6, 3, 6, 7, 6, 393, 10, 6, 12, 6, 14, 6, 396, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 401, 10, 6, 12, 6, 14, 6, 404, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 409, 10, 8, 12, 8, 14, 8, 412, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 419, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 434, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 464, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 472, 10, 18, 12, 18, 14, 18, 475, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 494, 10, 20, 13, 20, 14, 20, 495, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 504, 10, 21, 13, 21, 14, 21, 505, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 514, 10, 22, 13, 22, 14, 22, 515, 3, 23, 3, 23, 3, 23, 5, 23, 521, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 526, 10, 23, 7, 23, 528, 10, 23, 12, 23, 14, 23, 531, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 540, 10, 24, 13, 24, 14, 24, 541, 3, 24, 3, 24, 5, 24, 546, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 555, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 560, 10, 25, 12, 25, 14, 25, 563, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 574, 10, 26, 12, 26, 14, 26, 577, 11, 26, 3, 26, 5, 26, 580, 10, 26, 3, 27, 7, 27, 583, 10, 27, 12, 27, 14, 27, 586, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 593, 10, 28, 12, 28, 14, 28, 596, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 603, 10, 29, 3, 29, 3, 29, 5, 29, 607, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 619, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 631, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 653, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 659, 10, 37, 12, 37, 14, 37, 662, 11, 37, 3, 38, 3, 38, 5, 38, 666, 10, 38, 3, 38, 5, 38, 669, 10, 38, 3, 38, 3, 38, 5, 38, 673, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 682, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 689, 10, 40, 12, 40, 14, 40, 692, 11, 40, 5, 40, 694, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 702, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 709, 10, 41, 5, 41, 711, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 718, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 725, 10, 42, 5, 42, 727, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 735, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 740, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 747, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 754, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 764, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 769, 10, 46, 12, 46, 14, 46, 772, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 778, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 783, 10, 48, 12, 48, 14, 48, 786, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 794, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 804, 10, 50, 3, 51, 3, 51, 5, 51, 808, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 816, 10, 51, 12, 51, 14, 51, 819, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 828, 10, 52, 12, 52, 14, 52, 831, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 836, 10, 53, 3, 53, 3, 53, 5, 53, 840, 10, 53, 3, 53, 3, 53, 5, 53, 844, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 853, 10, 54, 12, 54, 14, 54, 856, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 861, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 874, 10, 57, 12, 57, 14, 57, 877, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 882, 10, 58, 3, 58, 3, 58, 5, 58, 886, 10, 58, 3, 58, 3, 58, 5, 58, 890, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 897, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 902, 10, 59, 12, 59, 14, 59, 905, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 910, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 915, 10, 60, 5, 60, 917, 10, 60, 3, 60, 3, 60, 5, 60, 921, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 928, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 933, 10, 62, 12, 62, 14, 62, 936, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 944, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 954, 10, 64, 13, 64, 14, 64, 955, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 964, 10, 65, 13, 65, 14, 65, 965, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 976, 10, 66, 13, 66, 14, 66, 977, 3, 66, 3, 66, 5, 66, 982, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 991, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 996, 10, 67, 12, 67, 14, 67, 999, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 1018, 10, 69, 13, 69, 14, 69, 1019, 3, 70, 3, 70, 3, 70, 5, 70, 1025, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 1030, 10, 70, 7, 70, 1032, 10, 70, 12, 70, 14, 70, 1035, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 1044, 10, 71, 12, 71, 14, 71, 1047, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 1052, 10, 72, 12, 72, 14, 72, 1055, 11, 72, 3, 73, 5, 73, 1058, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 1065, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 1070, 10, 75, 12, 75, 14, 75, 1073, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 1078, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 1083, 10, 77, 12, 77, 14, 77, 1086, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 1091, 10, 78, 12, 78, 14, 78, 1094, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 1100, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1106, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1112, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1118, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1124, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1133, 10, 84, 12, 84, 14, 84, 1136, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1141, 10, 85, 3, 86, 7, 86, 1144, 10, 86, 12, 86, 14, 86, 1147, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1154, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1173, 10, 90, 12, 90, 14, 90, 1176, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1184, 10, 91, 12, 91, 14, 91, 1187, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1209, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1226, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1237, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1259, 10, 104, 7, 104, 1261, 10, 104, 12, 104, 14, 104, 1264, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1270, 10, 105, 3, 106, 3, 106, 5, 106, 1274, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1284, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1289, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1303, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1310, 10, 109, 12, 109, 14, 109, 1313, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1318, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1343, 10, 113, 12, 113, 14, 113, 1346, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1362, 10, 115, 13, 115, 14, 115, 1363, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 5, 117, 1373, 10, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 7, 117, 1380, 10, 117, 12, 117, 14, 117, 1383, 11, 117, 5, 117, 1385, 10, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 5, 118, 1393, 10, 118, 3, 119, 3, 119, 5, 119, 1397, 10, 119, 3, 119, 3, 119, 3, 119, 5, 119, 1402, 10, 119, 3, 120, 3, 120, 3, 120, 7, 120, 1407, 10, 120, 12, 120, 14, 120, 1410, 11, 120, 3, 121, 3, 121, 5, 121, 1414, 10, 121, 3, 122, 3, 122, 5, 122, 1418, 10, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 5, 123, 1426, 10, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 5, 125, 1433, 10, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 5, 126, 1441, 10, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 129, 3, 129, 5, 129, 1451, 10, 129, 3, 130, 3, 130, 5, 130, 1455, 10, 130, 3, 131, 3, 131, 3, 131, 5, 131, 1460, 10, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 7, 134, 1471, 10, 134, 12, 134, 14, 134, 1474, 11, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 5, 135, 1487, 10, 135, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 5, 137, 1503, 10, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 5, 140, 1517, 10, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 5, 144, 1537, 10, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 5, 145, 1546, 10, 145, 5, 145, 1548, 10, 145, 3, 145, 3, 145, 3, 146, 3, 146, 5, 146, 1554, 10, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 5, 148, 1567, 10, 148, 5, 148, 1569, 10, 148, 5, 148, 1571, 10, 148, 3, 148, 3, 148, 3, 149, 3, 149, 5, 149, 1577, 10, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 153, 3, 153, 3, 154, 3, 154, 3, 155, 3, 155, 3, 156, 3, 156, 5, 156, 1596, 10, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 5, 159, 1612, 10, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 5, 164, 1635, 10, 164, 3, 165, 3, 165, 3, 165, 5, 165, 1640, 10, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 5, 166, 1647, 10, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 5, 167, 1654, 10, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 5, 168, 1661, 10, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 5, 169, 1668, 10, 169, 3, 169, 3, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 5, 170, 1678, 10, 170, 5, 170, 1680, 10, 170, 3, 171, 3, 171, 3, 171, 3, 171, 7, 171, 1686, 10, 171, 12, 171, 14, 171, 1689, 11, 171, 5, 171, 1691, 10, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 5, 171, 1698, 10, 171, 3, 172, 3, 172, 5, 172, 1702, 10, 172, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 7, 174, 1714, 10, 174, 12, 174, 14, 174, 1717, 11, 174, 5, 174, 1719, 10, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 175, 3, 175, 5, 175, 1727, 10, 175, 3, 176, 3, 176, 5, 176, 1731, 10, 176, 3, 176, 3, 176, 3, 176, 3, 177, 3, 177, 5, 177, 1738, 10, 177, 3, 177, 3, 177, 3, 178, 3, 178, 3, 179, 3, 179, 3, 180, 3, 180, 3, 180, 2, 2, 181, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 2, 13, 4, 2, 17, 17, 105, 105, 3, 2, 82, 83, 3, 2, 20, 29, 4, 2, 5, 5, 35, 45, 3, 2, 47, 48, 4, 2, 12, 12, 49, 51, 3, 2, 137, 138, 3, 2, 140, 146, 3, 2, 147, 151, 4, 2, 19, 19, 170, 170, 4, 2, 61, 132, 171, 171, 2, 1818, 2, 360, 3, 2, 2, 2, 4, 368, 3, 2, 2, 2, 6, 374, 3, 2, 2, 2, 8, 377, 3, 2, 2, 2, 10, 394, 3, 2, 2, 2, 12, 405, 3, 2, 2, 2, 14, 410, 3, 2, 2, 2, 16, 413, 3, 2, 2, 2, 18, 416, 3, 2, 2, 2, 20, 433, 3, 2, 2, 2, 22, 435, 3, 2, 2, 2, 24, 438, 3, 2, 2, 2, 26, 444, 3, 2, 2, 2, 28, 448, 3, 2, 2, 2, 30, 452, 3, 2, 2, 2, 32, 456, 3, 2, 2, 2, 34, 463, 3, 2, 2, 2, 36, 479, 3, 2, 2, 2, 38, 488, 3, 2, 2, 2, 40, 503, 3, 2, 2, 2, 42, 510, 3, 2, 2, 2, 44, 517, 3, 2, 2, 2, 46, 534, 3, 2, 2, 2, 48, 550, 3, 2, 2, 2, 50, 567, 3, 2, 2, 2, 52, 584, 3, 2, 2, 2, 54, 587, 3, 2, 2, 2, 56, 599, 3, 2, 2, 2, 58, 608, 3, 2, 2, 2, 60, 618, 3, 2, 2, 2, 62, 620, 3, 2, 2, 2, 64, 630, 3, 2, 2, 2, 66, 632, 3, 2, 2, 2, 68, 637, 3, 2, 2, 2, 70, 641, 3, 2, 2, 2, 72, 647, 3, 2, 2, 2, 74, 668, 3, 2, 2, 2, 76, 674, 3, 2, 2, 2, 78, 676, 3, 2, 2, 2, 80, 695, 3, 2, 2, 2, 82, 712, 3, 2, 2, 2, 84, 728, 3, 2, 2, 2, 86, 748, 3, 2, 2, 2, 88, 763, 3, 2, 2, 2, 90, 765, 3, 2, 2, 2, 92, 773, 3, 2, 2, 2, 94, 779, 3, 2, 2, 2, 96, 793, 3, 2, 2, 2, 98, 803, 3, 2, 2, 2, 100, 807, 3, 2, 2, 2, 102, 823, 3, 2, 2, 2, 104, 832, 3, 2, 2, 2, 106, 848, 3, 2, 2, 2, 108, 857, 3, 2, 2, 2, 110, 865, 3, 2, 2, 2, 112, 868, 3, 2, 2, 2, 114, 878, 3, 2, 2, 2, 116, 896, 3, 2, 2, 2, 118, 906, 3, 2, 2, 2, 120, 922, 3, 2, 2, 2, 122, 927, 3, 2, 2, 2, 124, 940, 3, 2, 2, 2, 126, 948, 3, 2, 2, 2, 128, 963, 3, 2, 2, 2, 130, 970, 3, 2, 2, 2, 132, 986, 3, 2, 2, 2, 134, 1003, 3, 2, 2, 2, 136, 1012, 3, 2, 2, 2, 138, 1021, 3, 2, 2, 2, 140, 1040, 3, 2, 2, 2, 142, 1048, 3, 2, 2, 2, 144, 1057, 3, 2, 2, 2, 146, 1061, 3, 2, 2, 2, 148, 1066, 3, 2, 2, 2, 150, 1074, 3, 2, 2, 2, 152, 1079, 3, 2, 2, 2, 154, 1087, 3, 2, 2, 2, 156, 1095, 3, 2, 2, 2, 158, 1101, 3, 2, 2, 2, 160, 1107, 3, 2, 2, 2, 162, 1113, 3, 2, 2, 2, 164, 1119, 3, 2, 2, 2, 166, 1125, 3, 2, 2, 2, 168, 1140, 3, 2, 2, 2, 170, 1145, 3, 2, 2, 2, 172, 1153, 3, 2, 2, 2, 174, 1155, 3, 2, 2, 2, 176, 1162, 3, 2, 2, 2, 178, 1169, 3, 2, 2, 2, 180, 1177, 3, 2, 2, 2, 182, 1188, 3, 2, 2, 2, 184, 1194, 3, 2, 2, 2, 186, 1197, 3, 2, 2, 2, 188, 1201, 3, 2, 2, 2, 190, 1225, 3, 2, 2, 2, 192, 1227, 3, 2, 2, 2, 194, 1231, 3, 2, 2, 2, 196, 1234, 3, 2, 2, 2, 198, 1240, 3, 2, 2, 2, 200, 1242, 3, 2, 2, 2, 202, 1247, 3, 2, 2, 2, 204, 1252, 3, 2, 2, 2, 206, 1255, 3, 2, 2, 2, 208, 1269, 3, 2, 2, 2, 210, 1273, 3, 2, 2, 2, 212, 1275, 3, 2, 2, 2, 214, 1279, 3, 2, 2, 2, 216, 1317, 3, 2, 2, 2, 218, 1319, 3, 2, 2, 2, 220, 1323, 3, 2, 2, 2, 222, 1329, 3, 2, 2, 2, 224, 1337, 3, 2, 2, 2, 226, 1352, 3, 2, 2, 2, 228, 1358, 3, 2, 2, 2, 230, 1365, 3, 2, 2, 2, 232, 1369, 3, 2, 2, 2, 234, 1392, 3, 2, 2, 2, 236, 1401, 3, 2, 2, 2, 238, 1403, 3, 2, 2, 2, 240, 1413, 3, 2, 2, 2, 242, 1417, 3, 2, 2, 2, 244, 1425, 3, 2, 2, 2, 246, 1427, 3, 2, 2, 2, 248, 1432, 3, 2, 2, 2, 250, 1440, 3, 2, 2, 2, 252, 1442, 3, 2, 2, 2, 254, 1446, 3, 2, 2, 2, 256, 1450, 3, 2, 2, 2, 258, 1454, 3, 2, 2, 2, 260, 1459, 3, 2, 2, 2, 262, 1461, 3, 2, 2, 2, 264, 1465, 3, 2, 2, 2, 266, 1472, 3, 2, 2, 2, 268, 1486, 3, 2, 2, 2, 270, 1488, 3, 2, 2, 2, 272, 1502, 3, 2, 2, 2, 274, 1504, 3, 2, 2, 2, 276, 1508, 3, 2, 2, 2, 278, 1512, 3, 2, 2, 2, 280, 1520, 3, 2, 2, 2, 282, 1524, 3, 2, 2, 2, 284, 1528, 3, 2, 2, 2, 286, 1532, 3, 2, 2, 2, 288, 1540, 3, 2, 2, 2, 290, 1553, 3, 2, 2, 2, 292, 1555, 3, 2, 2, 2, 294, 1560, 3, 2, 2, 2, 296, 1576, 3, 2, 2, 2, 298, 1578, 3, 2, 2, 2, 300, 1583, 3, 2, 2, 2, 302, 1585, 3, 2, 2, 2, 304, 1587, 3, 2, 2, 2, 306, 1589, 3, 2, 2, 2, 308, 1591, 3, 2, 2, 2, 310, 1595, 3, 2, 2, 2, 312, 1597, 3, 2, 2, 2, 314, 1602, 3, 2, 2, 2, 316, 1611, 3, 2, 2, 2, 318, 1613, 3, 2, 2, 2, 320, 1618, 3, 2, 2, 2, 322, 1623, 3, 2, 2, 2, 324, 1627, 3, 2, 2, 2, 326, 1634, 3, 2, 2, 2, 328, 1636, 3, 2, 2, 2, 330, 1643, 3, 2, 2, 2, 332, 1650, 3, 2, 2, 2, 334, 1657, 3, 2, 2, 2, 336, 1664, 3, 2, 2, 2, 338, 1679, 3, 2, 2, 2, 340, 1697, 3, 2, 2, 2, 342, 1701, 3, 2, 2, 2, 344, 1703, 3, 2, 2, 2, 346, 1708, 3, 2, 2, 2, 348, 1724, 3, 2, 2, 2, 350, 1730, 3, 2, 2, 2, 352, 1735, 3, 2, 2, 2, 354, 1741, 3, 2, 2, 2, 356, 1743, 3, 2, 2, 2, 358, 1745, 3, 2, 2, 2, 360, 361, 5, 4, 3, 2, 361, 362, 7, 2, 2, 3, 362, 3, 3, 2, 2, 2, 363, 364, 7, 104, 2, 2, 364, 365, 7, 103, 2, 2, 365, 366, 5, 356, 179, 2, 366, 367, 7, 3, 2, 2, 367, 369, 3, 2, 2, 2, 368, 363, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 373, 5, 8, 5, 2, 371, 373, 5, 6, 4, 2, 372, 370, 3, 2, 2, 2, 372, 371, 3, 2, 2, 2, 373, 5, 3, 2, 2, 2, 374, 375, 5, 10, 6, 2, 375, 376, 5, 12, 7, 2, 376, 7, 3, 2, 2, 2, 377, 378, 7, 4, 2, 2, 378, 379, 7, 135, 2, 2, 379, 380, 7, 178, 2, 2, 380, 381, 7, 5, 2, 2, 381, 382, 5, 354, 178, 2, 382, 383, 7, 3, 2, 2, 383, 384, 5, 10, 6, 2, 384, 9, 3, 2, 2, 2, 385, 389, 5, 60, 31, 2, 386, 389, 5, 62, 32, 2, 387, 389, 5, 78, 40, 2, 388, 385, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 388, 387, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 3, 2, 2, 391, 393, 3, 2, 2, 2, 392, 388, 3, 2, 2, 2, 393, 396, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 402, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 397, 398, 5, 64, 33, 2, 398, 399, 7, 3, 2, 2, 399, 401, 3, 2, 2, 2, 400, 397, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 11, 3, 2, 2, 2, 404, 402, 3, 2, 2, 2, 405, 406, 5, 18, 10, 2, 406, 13, 3, 2, 2, 2, 407, 409, 5, 20, 11, 2, 408, 407, 3, 2, 2, 2, 409, 412, 3, 2, 2, 2, 410, 408, 3, 2, 2, 2, 410, 411, 3, 2, 2, 2, 411, 15, 3, 2, 2, 2, 412, 410, 3, 2, 2, 2, 413, 414, 5, 14, 8, 2, 414, 415, 5, 94, 48, 2, 415, 17, 3, 2, 2, 2, 416, 418, 5, 14, 8, 2, 417, 419, 5, 94, 48, 2, 418, 417, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 19, 3, 2, 2, 2, 420, 434, 5, 22, 12, 2, 421, 434, 5, 24, 13, 2, 422, 434, 5, 26, 14, 2, 423, 434, 5, 28, 15, 2, 424, 434, 5, 30, 16, 2, 425, 434, 5, 32, 17, 2, 426, 434, 5, 34, 18, 2, 427, 434, 5, 36, 19, 2, 428, 434, 5, 38, 20, 2, 429, 434, 5, 42, 22, 2, 430, 434, 5, 46, 24, 2, 431, 434, 5, 54, 28, 2, 432, 434, 5, 58, 30, 2, 433, 420, 3, 2, 2, 2, 433, 421, 3, 2, 2, 2, 433, 422, 3, 2, 2, 2, 433, 423, 3, 2, 2, 2, 433, 424, 3, 2, 2, 2, 433, 425, 3, 2, 2, 2, 433, 426, 3, 2, 2, 2, 433, 427, 3, 2, 2, 2, 433, 428, 3, 2, 2, 2, 433, 429, 3, 2, 2, 2, 433, 430, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 432, 3, 2, 2, 2, 434, 21, 3, 2, 2, 2, 435, 436, 5, 98, 50, 2, 436, 437, 7, 3, 2, 2, 437, 23, 3, 2, 2, 2, 438, 439, 7, 6, 2, 2, 439, 440, 5, 74, 38, 2, 440, 441, 7, 7, 2, 2, 441, 442, 5, 96, 49, 2, 442, 443, 7, 3, 2, 2, 443, 25, 3, 2, 2, 2, 444, 445, 7, 8, 2, 2, 445, 446, 5, 14, 8, 2, 446, 447, 7, 9, 2, 2, 447, 27, 3, 2, 2, 2, 448, 449, 7, 127, 2, 2, 449, 450, 7, 128, 2, 2, 450, 451, 7, 3, 2, 2, 451, 29, 3, 2, 2, 2, 452, 453, 7, 129, 2, 2, 453, 454, 7, 128, 2, 2, 454, 455, 7, 3, 2, 2, 455, 31, 3, 2, 2, 2, 456, 457, 7, 130, 2, 2, 457, 458, 7, 131, 2, 2, 458, 459, 5, 96, 49, 2, 459, 460, 7, 3, 2, 2, 460, 33, 3, 2, 2, 2, 461, 464, 5, 102, 52, 2, 462, 464, 5, 106, 54, 2, 463, 461, 3, 2, 2, 2, 463, 462, 3, 2, 2, 2, 464, 473, 3, 2, 2, 2, 465, 472, 5, 102, 52, 2, 466, 472, 5, 106, 54, 2, 467, 472, 5, 110, 56, 2, 468, 472, 5, 112, 57, 2, 469, 472, 5, 116, 59, 2, 470, 472, 5, 120, 61, 2, 471, 465, 3, 2, 2, 2, 471, 466, 3, 2, 2, 2, 471, 467, 3, 2, 2, 2, 471, 468, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 470, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 477, 7, 67, 2, 2, 477, 478, 5, 20, 11, 2, 478, 35, 3, 2, 2, 2, 479, 480, 7, 68, 2, 2, 480, 481, 7, 10, 2, 2, 481, 482, 5, 94, 48, 2, 482, 483, 7, 11, 2, 2, 483, 484, 7, 89, 2, 2, 484, 485, 5, 20, 11, 2, 485, 486, 7, 90, 2, 2, 486, 487, 5, 20, 11, 2, 487, 37, 3, 2, 2, 2, 488, 489, 7, 84, 2, 2, 489, 490, 7, 10, 2, 2, 490, 491, 5, 94, 48, 2, 491, 493, 7, 11, 2, 2, 492, 494, 5, 40, 21, 2, 493, 492, 3, 2, 2, 2, 494, 495, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 495, 496, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 7, 88, 2, 2, 498, 499, 7, 67, 2, 2, 499, 500, 5, 20, 11, 2, 500, 39, 3, 2, 2, 2, 501, 502, 7, 85, 2, 2, 502, 504, 5, 96, 49, 2, 503, 501, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 503, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 7, 67, 2, 2, 508, 509, 5, 20, 11, 2, 509, 41, 3, 2, 2, 2, 510, 511, 7, 86, 2, 2, 511, 513, 5, 26, 14, 2, 512, 514, 5, 44, 23, 2, 513, 512, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 43, 3, 2, 2, 2, 517, 520, 7, 87, 2, 2, 518, 521, 7, 12, 2, 2, 519, 521, 5, 74, 38, 2, 520, 518, 3, 2, 2, 2, 520, 519, 3, 2, 2, 2, 521, 529, 3, 2, 2, 2, 522, 525, 7, 13, 2, 2, 523, 526, 7, 12, 2, 2, 524, 526, 5, 74, 38, 2, 525, 523, 3, 2, 2, 2, 525, 524, 3, 2, 2, 2, 526, 528, 3, 2, 2, 2, 527, 522, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 532, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 533, 5, 26, 14, 2, 533, 45, 3, 2, 2, 2, 534, 535, 7, 91, 2, 2, 535, 536, 7, 10, 2, 2, 536, 537, 5, 94, 48, 2, 537, 539, 7, 11, 2, 2, 538, 540, 5, 48, 25, 2, 539, 538, 3, 2, 2, 2, 540, 541, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 545, 7, 88, 2, 2, 544, 546, 5, 194, 98, 2, 545, 544, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 547, 3, 2, 2, 2, 547, 548, 7, 67, 2, 2, 548, 549, 5, 20, 11, 2, 549, 47, 3, 2, 2, 2, 550, 554, 7, 85, 2, 2, 551, 552, 5, 194, 98, 2, 552, 553, 7, 70, 2, 2, 553, 555, 3, 2, 2, 2, 554, 551, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 561, 5, 338, 170, 2, 557, 558, 7, 13, 2, 2, 558, 560, 5, 338, 170, 2, 559, 557, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 561, 562, 3, 2, 2, 2, 562, 564, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 564, 565, 7, 67, 2, 2, 565, 566, 5, 20, 11, 2, 566, 49, 3, 2, 2, 2, 567, 568, 7, 14, 2, 2, 568, 579, 5, 74, 38, 2, 569, 570, 7, 10, 2, 2, 570, 575, 7, 172, 2, 2, 571, 572, 7, 15, 2, 2, 572, 574, 7, 172, 2, 2, 573, 571, 3, 2, 2, 2, 574, 577, 3, 2, 2, 2, 575, 573, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 578, 3, 2, 2, 2, 577, 575, 3, 2, 2, 2, 578, 580, 7, 11, 2, 2, 579, 569, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 51, 3, 2, 2, 2, 581, 583, 5, 50, 26, 2, 582, 581, 3, 2, 2, 2, 583, 586, 3, 2, 2, 2, 584, 582, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 53, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 587, 588, 5, 52, 27, 2, 588, 589, 7, 114, 2, 2, 589, 594, 5, 56, 29, 2, 590, 591, 7, 15, 2, 2, 591, 593, 5, 56, 29, 2, 592, 590, 3, 2, 2, 2, 593, 596, 3, 2, 2, 2, 594, 592, 3, 2, 2, 2, 594, 595, 3, 2, 2, 2, 595, 597, 3, 2, 2, 2, 596, 594, 3, 2, 2, 2, 597, 598, 7, 3, 2, 2, 598, 55, 3, 2, 2, 2, 599, 602, 5, 194, 98, 2, 600, 601, 7, 70, 2, 2, 601, 603, 5, 338, 170, 2, 602, 600, 3, 2, 2, 2, 602, 603, 3, 2, 2, 2, 603, 606, 3, 2, 2, 2, 604, 605, 7, 7, 2, 2, 605, 607, 5, 96, 49, 2, 606, 604, 3, 2, 2, 2, 606, 607, 3, 2, 2, 2, 607, 57, 3, 2, 2, 2, 608, 609, 7, 132, 2, 2, 609, 610, 7, 10, 2, 2, 610, 611, 5, 94, 48, 2, 611, 612, 7, 11, 2, 2, 612, 613, 5, 20, 11, 2, 613, 59, 3, 2, 2, 2, 614, 619, 5, 66, 34, 2, 615, 619, 5, 68, 35, 2, 616, 619, 5, 70, 36, 2, 617, 619, 5, 72, 37, 2, 618, 614, 3, 2, 2, 2, 618, 615, 3, 2, 2, 2, 618, 616, 3, 2, 2, 2, 618, 617, 3, 2, 2, 2, 619, 61, 3, 2, 2, 2, 620, 621, 7, 111, 2, 2, 621, 622, 7, 135, 2, 2, 622, 623, 7, 178, 2, 2, 623, 624, 7, 5, 2, 2, 624, 625, 5, 354, 178, 2, 625, 63, 3, 2, 2, 2, 626, 631, 5, 84, 43, 2, 627, 631, 5, 80, 41, 2, 628, 631, 5, 86, 44, 2, 629, 631, 5, 82, 42, 2, 630, 626, 3, 2, 2, 2, 630, 627, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 630, 629, 3, 2, 2, 2, 631, 65, 3, 2, 2, 2, 632, 633, 7, 111, 2, 2, 633, 634, 7, 88, 2, 2, 634, 635, 7, 81, 2, 2, 635, 636, 5, 354, 178, 2, 636, 67, 3, 2, 2, 2, 637, 638, 7, 111, 2, 2, 638, 639, 7, 16, 2, 2, 639, 640, 9, 2, 2, 2, 640, 69, 3, 2, 2, 2, 641, 642, 7, 111, 2, 2, 642, 643, 7, 88, 2, 2, 643, 644, 7, 66, 2, 2, 644, 645, 7, 73, 2, 2, 645, 646, 9, 3, 2, 2, 646, 71, 3, 2, 2, 2, 647, 652, 7, 111, 2, 2, 648, 649, 7, 18, 2, 2, 649, 653, 5, 74, 38, 2, 650, 651, 7, 88, 2, 2, 651, 653, 7, 18, 2, 2, 652, 648, 3, 2, 2, 2, 652, 650, 3, 2, 2, 2, 653, 660, 3, 2, 2, 2, 654, 655, 5, 76, 39, 2, 655, 656, 7, 5, 2, 2, 656, 657, 5, 356, 179, 2, 657, 659, 3, 2, 2, 2, 658, 654, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 73, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 666, 7, 178, 2, 2, 664, 666, 5, 358, 180, 2, 665, 663, 3, 2, 2, 2, 665, 664, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 669, 7, 19, 2, 2, 668, 665, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 672, 3, 2, 2, 2, 670, 673, 7, 178, 2, 2, 671, 673, 5, 358, 180, 2, 672, 670, 3, 2, 2, 2, 672, 671, 3, 2, 2, 2, 673, 75, 3, 2, 2, 2, 674, 675, 9, 4, 2, 2, 675, 77, 3, 2, 2, 2, 676, 677, 7, 133, 2, 2, 677, 681, 7, 4, 2, 2, 678, 679, 7, 135, 2, 2, 679, 680, 7, 178, 2, 2, 680, 682, 7, 5, 2, 2, 681, 678, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 693, 5, 354, 178, 2, 684, 685, 7, 71, 2, 2, 685, 690, 5, 354, 178, 2, 686, 687, 7, 15, 2, 2, 687, 689, 5, 354, 178, 2, 688, 686, 3, 2, 2, 2, 689, 692, 3, 2, 2, 2, 690, 688, 3, 2, 2, 2, 690, 691, 3, 2, 2, 2, 691, 694, 3, 2, 2, 2, 692, 690, 3, 2, 2, 2, 693, 684, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 79, 3, 2, 2, 2, 695, 696, 7, 111, 2, 2, 696, 697, 5, 52, 27, 2, 697, 698, 7, 114, 2, 2, 698, 701, 5, 194, 98, 2, 699, 700, 7, 70, 2, 2, 700, 702, 5, 338, 170, 2, 701, 699, 3, 2, 2, 2, 701, 702, 3, 2, 2, 2, 702, 710, 3, 2, 2, 2, 703, 704, 7, 7, 2, 2, 704, 711, 5, 96, 49, 2, 705, 708, 7, 30, 2, 2, 706, 707, 7, 7, 2, 2, 707, 709, 5, 96, 49, 2, 708, 706, 3, 2, 2, 2, 708, 709, 3, 2, 2, 2, 709, 711, 3, 2, 2, 2, 710, 703, 3, 2, 2, 2, 710, 705, 3, 2, 2, 2, 711, 81, 3, 2, 2, 2, 712, 713, 7, 111, 2, 2, 713, 714, 7, 112, 2, 2, 714, 717, 7, 113, 2, 2, 715, 716, 7, 70, 2, 2, 716, 718, 5, 338, 170, 2, 717, 715, 3, 2, 2, 2, 717, 718, 3, 2, 2, 2, 718, 726, 3, 2, 2, 2, 719, 720, 7, 7, 2, 2, 720, 727, 5, 96, 49, 2, 721, 724, 7, 30, 2, 2, 722, 723, 7, 7, 2, 2, 723, 725, 5, 96, 49, 2, 724, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 727, 3, 2, 2, 2, 726, 719, 3, 2, 2, 2, 726, 721, 3, 2, 2, 2, 727, 83, 3, 2, 2, 2, 728, 729, 7, 111, 2, 2, 729, 730, 5, 52, 27, 2, 730, 731, 7, 31, 2, 2, 731, 732, 5, 74, 38, 2, 732, 734, 7, 10, 2, 2, 733, 735, 5, 90, 46, 2, 734, 733, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 739, 7, 11, 2, 2, 737, 738, 7, 70, 2, 2, 738, 740, 5, 338, 170, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 746, 3, 2, 2, 2, 741, 742, 7, 8, 2, 2, 742, 743, 5, 18, 10, 2, 743, 744, 7, 9, 2, 2, 744, 747, 3, 2, 2, 2, 745, 747, 7, 30, 2, 2, 746, 741, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 85, 3, 2, 2, 2, 748, 749, 7, 111, 2, 2, 749, 750, 7, 108, 2, 2, 750, 751, 5, 74, 38, 2, 751, 753, 7, 70, 2, 2, 752, 754, 5, 88, 45, 2, 753, 752, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 755, 3, 2, 2, 2, 755, 756, 5, 96, 49, 2, 756, 87, 3, 2, 2, 2, 757, 758, 7, 32, 2, 2, 758, 764, 7, 33, 2, 2, 759, 760, 7, 32, 2, 2, 760, 764, 7, 34, 2, 2, 761, 762, 7, 124, 2, 2, 762, 764, 7, 134, 2, 2, 763, 757, 3, 2, 2, 2, 763, 759, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 764, 89, 3, 2, 2, 2, 765, 770, 5, 92, 47, 2, 766, 767, 7, 15, 2, 2, 767, 769, 5, 92, 47, 2, 768, 766, 3, 2, 2, 2, 769, 772, 3, 2, 2, 2, 770, 768, 3, 2, 2, 2, 770, 771, 3, 2, 2, 2, 771, 91, 3, 2, 2, 2, 772, 770, 3, 2, 2, 2, 773, 774, 7, 6, 2, 2, 774, 777, 5, 74, 38, 2, 775, 776, 7, 70, 2, 2, 776, 778, 5, 338, 170, 2, 777, 775, 3, 2, 2, 2, 777, 778, 3, 2, 2, 2, 778, 93, 3, 2, 2, 2, 779, 784, 5, 96, 49, 2, 780, 781, 7, 15, 2, 2, 781, 783, 5, 96, 49, 2, 782, 780, 3, 2, 2, 2, 783, 786, 3, 2, 2, 2, 784, 782, 3, 2, 2, 2, 784, 785, 3, 2, 2, 2, 785, 95, 3, 2, 2, 2, 786, 784, 3, 2, 2, 2, 787, 794, 5, 98, 50, 2, 788, 794, 5, 100, 51, 2, 789, 794, 5, 126, 64, 2, 790, 794, 5, 130, 66, 2, 791, 794, 5, 134, 68, 2, 792, 794, 5, 136, 69, 2, 793, 787, 3, 2, 2, 2, 793, 788, 3, 2, 2, 2, 793, 789, 3, 2, 2, 2, 793, 790, 3, 2, 2, 2, 793, 791, 3, 2, 2, 2, 793, 792, 3, 2, 2, 2, 794, 97, 3, 2, 2, 2, 795, 804, 5, 122, 62, 2, 796, 804, 5, 140, 71, 2, 797, 804, 5, 216, 109, 2, 798, 804, 5, 218, 110, 2, 799, 804, 5, 220, 111, 2, 800, 804, 5, 222, 112, 2, 801, 804, 5, 224, 113, 2, 802, 804, 5, 226, 114, 2, 803, 795, 3, 2, 2, 2, 803, 796, 3, 2, 2, 2, 803, 797, 3, 2, 2, 2, 803, 798, 3, 2, 2, 2, 803, 799, 3, 2, 2, 2, 803, 800, 3, 2, 2, 2, 803, 801, 3, 2, 2, 2, 803, 802, 3, 2, 2, 2, 804, 99, 3, 2, 2, 2, 805, 808, 5, 102, 52, 2, 806, 808, 5, 106, 54, 2, 807, 805, 3, 2, 2, 2, 807, 806, 3, 2, 2, 2, 808, 817, 3, 2, 2, 2, 809, 816, 5, 102, 52, 2, 810, 816, 5, 106, 54, 2, 811, 816, 5, 110, 56, 2, 812, 816, 5, 112, 57, 2, 813, 816, 5, 116, 59, 2, 814, 816, 5, 120, 61, 2, 815, 809, 3, 2, 2, 2, 815, 810, 3, 2, 2, 2, 815, 811, 3, 2, 2, 2, 815, 812, 3, 2, 2, 2, 815, 813, 3, 2, 2, 2, 815, 814, 3, 2, 2, 2, 816, 819, 3, 2, 2, 2, 817, 815, 3, 2, 2, 2, 817, 818, 3, 2, 2, 2, 818, 820, 3, 2, 2, 2, 819, 817, 3, 2, 2, 2, 820, 821, 7, 67, 2, 2, 821, 822, 5, 96, 49, 2, 822, 101, 3, 2, 2, 2, 823, 824, 7, 61, 2, 2, 824, 829, 5, 104, 53, 2, 825, 826, 7, 15, 2, 2, 826, 828, 5, 104, 53, 2, 827, 825, 3, 2, 2, 2, 828, 831, 3, 2, 2, 2, 829, 827, 3, 2, 2, 2, 829, 830, 3, 2, 2, 2, 830, 103, 3, 2, 2, 2, 831, 829, 3, 2, 2, 2, 832, 835, 5, 194, 98, 2, 833, 834, 7, 70, 2, 2, 834, 836, 5, 338, 170, 2, 835, 833, 3, 2, 2, 2, 835, 836, 3, 2, 2, 2, 836, 839, 3, 2, 2, 2, 837, 838, 7, 72, 2, 2, 838, 840, 7, 73, 2, 2, 839, 837, 3, 2, 2, 2, 839, 840, 3, 2, 2, 2, 840, 843, 3, 2, 2, 2, 841, 842, 7, 71, 2, 2, 842, 844, 5, 194, 98, 2, 843, 841, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 845, 3, 2, 2, 2, 845, 846, 7, 69, 2, 2, 846, 847, 5, 96, 49, 2, 847, 105, 3, 2, 2, 2, 848, 849, 7, 62, 2, 2, 849, 854, 5, 108, 55, 2, 850, 851, 7, 15, 2, 2, 851, 853, 5, 108, 55, 2, 852, 850, 3, 2, 2, 2, 853, 856, 3, 2, 2, 2, 854, 852, 3, 2, 2, 2, 854, 855, 3, 2, 2, 2, 855, 107, 3, 2, 2, 2, 856, 854, 3, 2, 2, 2, 857, 860, 5, 194, 98, 2, 858, 859, 7, 70, 2, 2, 859, 861, 5, 338, 170, 2, 860, 858, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 862, 3, 2, 2, 2, 862, 863, 7, 7, 2, 2, 863, 864, 5, 96, 49, 2, 864, 109, 3, 2, 2, 2, 865, 866, 7, 63, 2, 2, 866, 867, 5, 96, 49, 2, 867, 111, 3, 2, 2, 2, 868, 869, 7, 64, 2, 2, 869, 870, 7, 65, 2, 2, 870, 875, 5, 114, 58, 2, 871, 872, 7, 15, 2, 2, 872, 874, 5, 114, 58, 2, 873, 871, 3, 2, 2, 2, 874, 877, 3, 2, 2, 2, 875, 873, 3, 2, 2, 2, 875, 876, 3, 2, 2, 2, 876, 113, 3, 2, 2, 2, 877, 875, 3, 2, 2, 2, 878, 885, 5, 194, 98, 2, 879, 880, 7, 70, 2, 2, 880, 882, 5, 338, 170, 2, 881, 879, 3, 2, 2, 2, 881, 882, 3, 2, 2, 2, 882, 883, 3, 2, 2, 2, 883, 884, 7, 7, 2, 2, 884, 886, 5, 96, 49, 2, 885, 881, 3, 2, 2, 2, 885, 886, 3, 2, 2, 2, 886, 889, 3, 2, 2, 2, 887, 888, 7, 81, 2, 2, 888, 890, 5, 354, 178, 2, 889, 887, 3, 2, 2, 2, 889, 890, 3, 2, 2, 2, 890, 115, 3, 2, 2, 2, 891, 892, 7, 66, 2, 2, 892, 897, 7, 65, 2, 2, 893, 894, 7, 75, 2, 2, 894, 895, 7, 66, 2, 2, 895, 897, 7, 65, 2, 2, 896, 891, 3, 2, 2, 2, 896, 893, 3, 2, 2, 2, 897, 898, 3, 2, 2, 2, 898, 903, 5, 118, 60, 2, 899, 900, 7, 15, 2, 2, 900, 902, 5, 118, 60, 2, 901, 899, 3, 2, 2, 2, 902, 905, 3, 2, 2, 2, 903, 901, 3, 2, 2, 2, 903, 904, 3, 2, 2, 2, 904, 117, 3, 2, 2, 2, 905, 903, 3, 2, 2, 2, 906, 909, 5, 96, 49, 2, 907, 910, 7, 76, 2, 2, 908, 910, 7, 77, 2, 2, 909, 907, 3, 2, 2, 2, 909, 908, 3, 2, 2, 2, 909, 910, 3, 2, 2, 2, 910, 916, 3, 2, 2, 2, 911, 914, 7, 73, 2, 2, 912, 915, 7, 82, 2, 2, 913, 915, 7, 83, 2, 2, 914, 912, 3, 2, 2, 2, 914, 913, 3, 2, 2, 2, 915, 917, 3, 2, 2, 2, 916, 911, 3, 2, 2, 2, 916, 917, 3, 2, 2, 2, 917, 920, 3, 2, 2, 2, 918, 919, 7, 81, 2, 2, 919, 921, 5, 354, 178, 2, 920, 918, 3, 2, 2, 2, 920, 921, 3, 2, 2, 2, 921, 119, 3, 2, 2, 2, 922, 923, 7, 74, 2, 2, 923, 924, 5, 194, 98, 2, 924, 121, 3, 2, 2, 2, 925, 928, 7, 78, 2, 2, 926, 928, 7, 79, 2, 2, 927, 925, 3, 2, 2, 2, 927, 926, 3, 2, 2, 2, 928, 929, 3, 2, 2, 2, 929, 934, 5, 124, 63, 2, 930, 931, 7, 15, 2, 2, 931, 933, 5, 124, 63, 2, 932, 930, 3, 2, 2, 2, 933, 936, 3, 2, 2, 2, 934, 932, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 937, 3, 2, 2, 2, 936, 934, 3, 2, 2, 2, 937, 938, 7, 80, 2, 2, 938, 939, 5, 96, 49, 2, 939, 123, 3, 2, 2, 2, 940, 943, 5, 194, 98, 2, 941, 942, 7, 70, 2, 2, 942, 944, 5, 338, 170, 2, 943, 941, 3, 2, 2, 2, 943, 944, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 946, 7, 69, 2, 2, 946, 947, 5, 96, 49, 2, 947, 125, 3, 2, 2, 2, 948, 949, 7, 84, 2, 2, 949, 950, 7, 10, 2, 2, 950, 951, 5, 94, 48, 2, 951, 953, 7, 11, 2, 2, 952, 954, 5, 128, 65, 2, 953, 952, 3, 2, 2, 2, 954, 955, 3, 2, 2, 2, 955, 953, 3, 2, 2, 2, 955, 956, 3, 2, 2, 2, 956, 957, 3, 2, 2, 2, 957, 958, 7, 88, 2, 2, 958, 959, 7, 67, 2, 2, 959, 960, 5, 96, 49, 2, 960, 127, 3, 2, 2, 2, 961, 962, 7, 85, 2, 2, 962, 964, 5, 96, 49, 2, 963, 961, 3, 2, 2, 2, 964, 965, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 967, 3, 2, 2, 2, 967, 968, 7, 67, 2, 2, 968, 969, 5, 96, 49, 2, 969, 129, 3, 2, 2, 2, 970, 971, 7, 91, 2, 2, 971, 972, 7, 10, 2, 2, 972, 973, 5, 94, 48, 2, 973, 975, 7, 11, 2, 2, 974, 976, 5, 132, 67, 2, 975, 974, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 975, 3, 2, 2, 2, 977, 978, 3, 2, 2, 2, 978, 979, 3, 2, 2, 2, 979, 981, 7, 88, 2, 2, 980, 982, 5, 194, 98, 2, 981, 980, 3, 2, 2, 2, 981, 982, 3, 2, 2, 2, 982, 983, 3, 2, 2, 2, 983, 984, 7, 67, 2, 2, 984, 985, 5, 96, 49, 2, 985, 131, 3, 2, 2, 2, 986, 990, 7, 85, 2, 2, 987, 988, 5, 194, 98, 2, 988, 989, 7, 70, 2, 2, 989, 991, 3, 2, 2, 2, 990, 987, 3, 2, 2, 2, 990, 991, 3, 2, 2, 2, 991, 992, 3, 2, 2, 2, 992, 997, 5, 338, 170, 2, 993, 994, 7, 13, 2, 2, 994, 996, 5, 338, 170, 2, 995, 993, 3, 2, 2, 2, 996, 999, 3, 2, 2, 2, 997, 995, 3, 2, 2, 2, 997, 998, 3, 2, 2, 2, 998, 1000, 3, 2, 2, 2, 999, 997, 3, 2, 2, 2, 1000, 1001, 7, 67, 2, 2, 1001, 1002, 5, 96, 49, 2, 1002, 133, 3, 2, 2, 2, 1003, 1004, 7, 68, 2, 2, 1004, 1005, 7, 10, 2, 2, 1005, 1006, 5, 94, 48, 2, 1006, 1007, 7, 11, 2, 2, 1007, 1008, 7, 89, 2, 2, 1008, 1009, 5, 96, 49, 2, 1009, 1010, 7, 90, 2, 2, 1010, 1011, 5, 96, 49, 2, 1011, 135, 3, 2, 2, 2, 1012, 1013, 7, 86, 2, 2, 1013, 1014, 7, 8, 2, 2, 1014, 1015, 5, 94, 48, 2, 1015, 1017, 7, 9, 2, 2, 1016, 1018, 5, 138, 70, 2, 1017, 1016, 3, 2, 2, 2, 1018, 1019, 3, 2, 2, 2, 1019, 1017, 3, 2, 2, 2, 1019, 1020, 3, 2, 2, 2, 1020, 137, 3, 2, 2, 2, 1021, 1024, 7, 87, 2, 2, 1022, 1025, 7, 12, 2, 2, 1023, 1025, 5, 74, 38, 2, 1024, 1022, 3, 2, 2, 2, 1024, 1023, 3, 2, 2, 2, 1025, 1033, 3, 2, 2, 2, 1026, 1029, 7, 13, 2, 2, 1027, 1030, 7, 12, 2, 2, 1028, 1030, 5, 74, 38, 2, 1029, 1027, 3, 2, 2, 2, 1029, 1028, 3, 2, 2, 2, 1030, 1032, 3, 2, 2, 2, 1031, 1026, 3, 2, 2, 2, 1032, 1035, 3, 2, 2, 2, 1033, 1031, 3, 2, 2, 2, 1033, 1034, 3, 2, 2, 2, 1034, 1036, 3, 2, 2, 2, 1035, 1033, 3, 2, 2, 2, 1036, 1037, 7, 8, 2, 2, 1037, 1038, 5, 94, 48, 2, 1038, 1039, 7, 9, 2, 2, 1039, 139, 3, 2, 2, 2, 1040, 1045, 5, 142, 72, 2, 1041, 1042, 7, 92, 2, 2, 1042, 1044, 5, 142, 72, 2, 1043, 1041, 3, 2, 2, 2, 1044, 1047, 3, 2, 2, 2, 1045, 1043, 3, 2, 2, 2, 1045, 1046, 3, 2, 2, 2, 1046, 141, 3, 2, 2, 2, 1047, 1045, 3, 2, 2, 2, 1048, 1053, 5, 144, 73, 2, 1049, 1050, 7, 93, 2, 2, 1050, 1052, 5, 144, 73, 2, 1051, 1049, 3, 2, 2, 2, 1052, 1055, 3, 2, 2, 2, 1053, 1051, 3, 2, 2, 2, 1053, 1054, 3, 2, 2, 2, 1054, 143, 3, 2, 2, 2, 1055, 1053, 3, 2, 2, 2, 1056, 1058, 7, 94, 2, 2, 1057, 1056, 3, 2, 2, 2, 1057, 1058, 3, 2, 2, 2, 1058, 1059, 3, 2, 2, 2, 1059, 1060, 5, 146, 74, 2, 1060, 145, 3, 2, 2, 2, 1061, 1064, 5, 148, 75, 2, 1062, 1063, 9, 5, 2, 2, 1063, 1065, 5, 148, 75, 2, 1064, 1062, 3, 2, 2, 2, 1064, 1065, 3, 2, 2, 2, 1065, 147, 3, 2, 2, 2, 1066, 1071, 5, 150, 76, 2, 1067, 1068, 7, 46, 2, 2, 1068, 1070, 5, 150, 76, 2, 1069, 1067, 3, 2, 2, 2, 1070, 1073, 3, 2, 2, 2, 1071, 1069, 3, 2, 2, 2, 1071, 1072, 3, 2, 2, 2, 1072, 149, 3, 2, 2, 2, 1073, 1071, 3, 2, 2, 2, 1074, 1077, 5, 152, 77, 2, 1075, 1076, 7, 95, 2, 2, 1076, 1078, 5, 152, 77, 2, 1077, 1075, 3, 2, 2, 2, 1077, 1078, 3, 2, 2, 2, 1078, 151, 3, 2, 2, 2, 1079, 1084, 5, 154, 78, 2, 1080, 1081, 9, 6, 2, 2, 1081, 1083, 5, 154, 78, 2, 1082, 1080, 3, 2, 2, 2, 1083, 1086, 3, 2, 2, 2, 1084, 1082, 3, 2, 2, 2, 1084, 1085, 3, 2, 2, 2, 1085, 153, 3, 2, 2, 2, 1086, 1084, 3, 2, 2, 2, 1087, 1092, 5, 156, 79, 2, 1088, 1089, 9, 7, 2, 2, 1089, 1091, 5, 156, 79, 2, 1090, 1088, 3, 2, 2, 2, 1091, 1094, 3, 2, 2, 2, 1092, 1090, 3, 2, 2, 2, 1092, 1093, 3, 2, 2, 2, 1093, 155, 3, 2, 2, 2, 1094, 1092, 3, 2, 2, 2, 1095, 1099, 5, 158, 80, 2, 1096, 1097, 7, 96, 2, 2, 1097, 1098, 7, 97, 2, 2, 1098, 1100, 5, 338, 170, 2, 1099, 1096, 3, 2, 2, 2, 1099, 1100, 3, 2, 2, 2, 1100, 157, 3, 2, 2, 2, 1101, 1105, 5, 160, 81, 2, 1102, 1103, 7, 99, 2, 2, 1103, 1104, 7, 98, 2, 2, 1104, 1106, 5, 338, 170, 2, 1105, 1102, 3, 2, 2, 2, 1105, 1106, 3, 2, 2, 2, 1106, 159, 3, 2, 2, 2, 1107, 1111, 5, 162, 82, 2, 1108, 1109, 7, 100, 2, 2, 1109, 1110, 7, 70, 2, 2, 1110, 1112, 5, 338, 170, 2, 1111, 1108, 3, 2, 2, 2, 1111, 1112, 3, 2, 2, 2, 1112, 161, 3, 2, 2, 2, 1113, 1117, 5, 164, 83, 2, 1114, 1115, 7, 102, 2, 2, 1115, 1116, 7, 70, 2, 2, 1116, 1118, 5, 348, 175, 2, 1117, 1114, 3, 2, 2, 2, 1117, 1118, 3, 2, 2, 2, 1118, 163, 3, 2, 2, 2, 1119, 1123, 5, 166, 84, 2, 1120, 1121, 7, 101, 2, 2, 1121, 1122, 7, 70, 2, 2, 1122, 1124, 5, 348, 175, 2, 1123, 1120, 3, 2, 2, 2, 1123, 1124, 3, 2, 2, 2, 1124, 165, 3, 2, 2, 2, 1125, 1134, 5, 170, 86, 2, 1126, 1127, 7, 5, 2, 2, 1127, 1128, 7, 44, 2, 2, 1128, 1129, 3, 2, 2, 2, 1129, 1130, 5, 168, 85, 2, 1130, 1131, 5, 206, 104, 2, 1131, 1133, 3, 2, 2, 2, 1132, 1126, 3, 2, 2, 2, 1133, 1136, 3, 2, 2, 2, 1134, 1132, 3, 2, 2, 2, 1134, 1135, 3, 2, 2, 2, 1135, 167, 3, 2, 2, 2, 1136, 1134, 3, 2, 2, 2, 1137, 1141, 5, 74, 38, 2, 1138, 1141, 5, 194, 98, 2, 1139, 1141, 5, 196, 99, 2, 1140, 1137, 3, 2, 2, 2, 1140, 1138, 3, 2, 2, 2, 1140, 1139, 3, 2, 2, 2, 1141, 169, 3, 2, 2, 2, 1142, 1144, 9, 6, 2, 2, 1143, 1142, 3, 2, 2, 2, 1144, 1147, 3, 2, 2, 2, 1145, 1143, 3, 2, 2, 2, 1145, 1146, 3, 2, 2, 2, 1146, 1148, 3, 2, 2, 2, 1147, 1145, 3, 2, 2, 2, 1148, 1149, 5, 172, 87, 2, 1149, 171, 3, 2, 2, 2, 1150, 1154, 5, 178, 90, 2, 1151, 1154, 5, 174, 88, 2, 1152, 1154, 5, 176, 89, 2, 1153, 1150, 3, 2, 2, 2, 1153, 1151, 3, 2, 2, 2, 1153, 1152, 3, 2, 2, 2, 1154, 173, 3, 2, 2, 2, 1155, 1156, 7, 109, 2, 2, 1156, 1157, 7, 108, 2, 2, 1157, 1158, 5, 338, 170, 2, 1158, 1159, 7, 8, 2, 2, 1159, 1160, 5, 94, 48, 2, 1160, 1161, 7, 9, 2, 2, 1161, 175, 3, 2, 2, 2, 1162, 1163, 7, 110, 2, 2, 1163, 1164, 7, 108, 2, 2, 1164, 1165, 5, 338, 170, 2, 1165, 1166, 7, 8, 2, 2, 1166, 1167, 5, 94, 48, 2, 1167, 1168, 7, 9, 2, 2, 1168, 177, 3, 2, 2, 2, 1169, 1174, 5, 236, 119, 2, 1170, 1171, 7, 52, 2, 2, 1171, 1173, 5, 236, 119, 2, 1172, 1170, 3, 2, 2, 2, 1173, 1176, 3, 2, 2, 2, 1174, 1172, 3, 2, 2, 2, 1174, 1175, 3, 2, 2, 2, 1175, 179, 3, 2, 2, 2, 1176, 1174, 3, 2, 2, 2, 1177, 1185, 5, 190, 96, 2, 1178, 1184, 5, 182, 92, 2, 1179, 1184, 5, 186, 94, 2, 1180, 1184, 5, 188, 95, 2, 1181, 1184, 5, 184, 93, 2, 1182, 1184, 5, 206, 104, 2, 1183, 1178, 3, 2, 2, 2, 1183, 1179, 3, 2, 2, 2, 1183, 1180, 3, 2, 2, 2, 1183, 1181, 3, 2, 2, 2, 1183, 1182, 3, 2, 2, 2, 1184, 1187, 3, 2, 2, 2, 1185, 1183, 3, 2, 2, 2, 1185, 1186, 3, 2, 2, 2, 1186, 181, 3, 2, 2, 2, 1187, 1185, 3, 2, 2, 2, 1188, 1189, 7, 53, 2, 2, 1189, 1190, 7, 53, 2, 2, 1190, 1191, 5, 94, 48, 2, 1191, 1192, 7, 54, 2, 2, 1192, 1193, 7, 54, 2, 2, 1193, 183, 3, 2, 2, 2, 1194, 1195, 7, 53, 2, 2, 1195, 1196, 7, 54, 2, 2, 1196, 185, 3, 2, 2, 2, 1197, 1198, 7, 53, 2, 2, 1198, 1199, 5, 94, 48, 2, 1199, 1200, 7, 54, 2, 2, 1200, 187, 3, 2, 2, 2, 1201, 1208, 7, 55, 2, 2, 1202, 1209, 5, 358, 180, 2, 1203, 1209, 5, 356, 179, 2, 1204, 1209, 7, 178, 2, 2, 1205, 1209, 5, 196, 99, 2, 1206, 1209, 5, 194, 98, 2, 1207, 1209, 5, 198, 100, 2, 1208, 1202, 3, 2, 2, 2, 1208, 1203, 3, 2, 2, 2, 1208, 1204, 3, 2, 2, 2, 1208, 1205, 3, 2, 2, 2, 1208, 1206, 3, 2, 2, 2, 1208, 1207, 3, 2, 2, 2, 1209, 189, 3, 2, 2, 2, 1210, 1226, 7, 171, 2, 2, 1211, 1226, 7, 106, 2, 2, 1212, 1226, 7, 107, 2, 2, 1213, 1226, 7, 172, 2, 2, 1214, 1226, 5, 356, 179, 2, 1215, 1226, 5, 194, 98, 2, 1216, 1226, 5, 196, 99, 2, 1217, 1226, 5, 198, 100, 2, 1218, 1226, 5, 340, 171, 2, 1219, 1226, 5, 204, 103, 2, 1220, 1226, 5, 200, 101, 2, 1221, 1226, 5, 202, 102, 2, 1222, 1226, 5, 352, 177, 2, 1223, 1226, 5, 210, 106, 2, 1224, 1226, 5, 192, 97, 2, 1225, 1210, 3, 2, 2, 2, 1225, 1211, 3, 2, 2, 2, 1225, 1212, 3, 2, 2, 2, 1225, 1213, 3, 2, 2, 2, 1225, 1214, 3, 2, 2, 2, 1225, 1215, 3, 2, 2, 2, 1225, 1216, 3, 2, 2, 2, 1225, 1217, 3, 2, 2, 2, 1225, 1218, 3, 2, 2, 2, 1225, 1219, 3, 2, 2, 2, 1225, 1220, 3, 2, 2, 2, 1225, 1221, 3, 2, 2, 2, 1225, 1222, 3, 2, 2, 2, 1225, 1223, 3, 2, 2, 2, 1225, 1224, 3, 2, 2, 2, 1226, 191, 3, 2, 2, 2, 1227, 1228, 7, 8, 2, 2, 1228, 1229, 5, 16, 9, 2, 1229, 1230, 7, 9, 2, 2, 1230, 193, 3, 2, 2, 2, 1231, 1232, 7, 6, 2, 2, 1232, 1233, 5, 74, 38, 2, 1233, 195, 3, 2, 2, 2, 1234, 1236, 7, 10, 2, 2, 1235, 1237, 5, 94, 48, 2, 1236, 1235, 3, 2, 2, 2, 1236, 1237, 3, 2, 2, 2, 1237, 1238, 3, 2, 2, 2, 1238, 1239, 7, 11, 2, 2, 1239, 197, 3, 2, 2, 2, 1240, 1241, 7, 56, 2, 2, 1241, 199, 3, 2, 2, 2, 1242, 1243, 7, 17, 2, 2, 1243, 1244, 7, 8, 2, 2, 1244, 1245, 5, 94, 48, 2, 1245, 1246, 7, 9, 2, 2, 1246, 201, 3, 2, 2, 2, 1247, 1248, 7, 105, 2, 2, 1248, 1249, 7, 8, 2, 2, 1249, 1250, 5, 94, 48, 2, 1250, 1251, 7, 9, 2, 2, 1251, 203, 3, 2, 2, 2, 1252, 1253, 5, 74, 38, 2, 1253, 1254, 5, 206, 104, 2, 1254, 205, 3, 2, 2, 2, 1255, 1262, 7, 10, 2, 2, 1256, 1258, 5, 208, 105, 2, 1257, 1259, 7, 15, 2, 2, 1258, 1257, 3, 2, 2, 2, 1258, 1259, 3, 2, 2, 2, 1259, 1261, 3, 2, 2, 2, 1260, 1256, 3, 2, 2, 2, 1261, 1264, 3, 2, 2, 2, 1262, 1260, 3, 2, 2, 2, 1262, 1263, 3, 2, 2, 2, 1263, 1265, 3, 2, 2, 2, 1264, 1262, 3, 2, 2, 2, 1265, 1266, 7, 11, 2, 2, 1266, 207, 3, 2, 2, 2, 1267, 1270, 5, 96, 49, 2, 1268, 1270, 7, 170, 2, 2, 1269, 1267, 3, 2, 2, 2, 1269, 1268, 3, 2, 2, 2, 1270, 209, 3, 2, 2, 2, 1271, 1274, 5, 212, 107, 2, 1272, 1274, 5, 214, 108, 2, 1273, 1271, 3, 2, 2, 2, 1273, 1272, 3, 2, 2, 2, 1274, 211, 3, 2, 2, 2, 1275, 1276, 5, 74, 38, 2, 1276, 1277, 7, 57, 2, 2, 1277, 1278, 7, 172, 2, 2, 1278, 213, 3, 2, 2, 2, 1279, 1280, 5, 52, 27, 2, 1280, 1281, 7, 31, 2, 2, 1281, 1283, 7, 10, 2, 2, 1282, 1284, 5, 90, 46, 2, 1283, 1282, 3, 2, 2, 2, 1283, 1284, 3, 2, 2, 2, 1284, 1285, 3, 2, 2, 2, 1285, 1288, 7, 11, 2, 2, 1286, 1287, 7, 70, 2, 2, 1287, 1289, 5, 338, 170, 2, 1288, 1286, 3, 2, 2, 2, 1288, 1289, 3, 2, 2, 2, 1289, 1290, 3, 2, 2, 2, 1290, 1291, 7, 8, 2, 2, 1291, 1292, 5, 18, 10, 2, 1292, 1293, 7, 9, 2, 2, 1293, 215, 3, 2, 2, 2, 1294, 1295, 7, 115, 2, 2, 1295, 1296, 7, 124, 2, 2, 1296, 1297, 5, 96, 49, 2, 1297, 1298, 7, 122, 2, 2, 1298, 1302, 5, 96, 49, 2, 1299, 1300, 7, 71, 2, 2, 1300, 1301, 7, 126, 2, 2, 1301, 1303, 5, 96, 49, 2, 1302, 1299, 3, 2, 2, 2, 1302, 1303, 3, 2, 2, 2, 1303, 1318, 3, 2, 2, 2, 1304, 1305, 7, 115, 2, 2, 1305, 1306, 7, 124, 2, 2, 1306, 1311, 5, 350, 176, 2, 1307, 1308, 7, 15, 2, 2, 1308, 1310, 5, 350, 176, 2, 1309, 1307, 3, 2, 2, 2, 1310, 1313, 3, 2, 2, 2, 1311, 1309, 3, 2, 2, 2, 1311, 1312, 3, 2, 2, 2, 1312, 1314, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1314, 1315, 7, 122, 2, 2, 1315, 1316, 5, 96, 49, 2, 1316, 1318, 3, 2, 2, 2, 1317, 1294, 3, 2, 2, 2, 1317, 1304, 3, 2, 2, 2, 1318, 217, 3, 2, 2, 2, 1319, 1320, 7, 116, 2, 2, 1320, 1321, 7, 124, 2, 2, 1321, 1322, 5, 228, 115, 2, 1322, 219, 3, 2, 2, 2, 1323, 1324, 7, 117, 2, 2, 1324, 1325, 7, 124, 2, 2, 1325, 1326, 5, 228, 115, 2, 1326, 1327, 7, 70, 2, 2, 1327, 1328, 5, 96, 49, 2, 1328, 221, 3, 2, 2, 2, 1329, 1330, 7, 118, 2, 2, 1330, 1331, 7, 124, 2, 2, 1331, 1332, 7, 123, 2, 2, 1332, 1333, 7, 97, 2, 2, 1333, 1334, 5, 228, 115, 2, 1334, 1335, 7, 125, 2, 2, 1335, 1336, 5, 96, 49, 2, 1336, 223, 3, 2, 2, 2, 1337, 1338, 7, 119, 2, 2, 1338, 1339, 7, 124, 2, 2, 1339, 1344, 5, 230, 116, 2, 1340, 1341, 7, 15, 2, 2, 1341, 1343, 5, 230, 116, 2, 1342, 1340, 3, 2, 2, 2, 1343, 1346, 3, 2, 2, 2, 1344, 1342, 3, 2, 2, 2, 1344, 1345, 3, 2, 2, 2, 1345, 1347, 3, 2, 2, 2, 1346, 1344, 3, 2, 2, 2, 1347, 1348, 7, 120, 2, 2, 1348, 1349, 5, 96, 49, 2, 1349, 1350, 7, 67, 2, 2, 1350, 1351, 5, 96, 49, 2, 1351, 225, 3, 2, 2, 2, 1352, 1353, 7, 121, 2, 2, 1353, 1354, 7, 124, 2, 2, 1354, 1355, 5, 96, 49, 2, 1355, 1356, 7, 122, 2, 2, 1356, 1357, 5, 96, 49, 2, 1357, 227, 3, 2, 2, 2, 1358, 1361, 5, 190, 96, 2, 1359, 1362, 5, 182, 92, 2, 1360, 1362, 5, 188, 95, 2, 1361, 1359, 3, 2, 2, 2, 1361, 1360, 3, 2, 2, 2, 1362, 1363, 3, 2, 2, 2, 1363, 1361, 3, 2, 2, 2, 1363, 1364, 3, 2, 2, 2, 1364, 229, 3, 2, 2, 2, 1365, 1366, 5, 194, 98, 2, 1366, 1367, 7, 7, 2, 2, 1367, 1368, 5, 96, 49, 2, 1368, 231, 3, 2, 2, 2, 1369, 1370, 7, 133, 2, 2, 1370, 1372, 7, 134, 2, 2, 1371, 1373, 5, 234, 118, 2, 1372, 1371, 3, 2, 2, 2, 1372, 1373, 3, 2, 2, 2, 1373, 1374, 3, 2, 2, 2, 1374, 1384, 5, 354, 178, 2, 1375, 1376, 7, 71, 2, 2, 1376, 1381, 5, 354, 178, 2, 1377, 1378, 7, 15, 2, 2, 1378, 1380, 5, 354, 178, 2, 1379, 1377, 3, 2, 2, 2, 1380, 1383, 3, 2, 2, 2, 1381, 1379, 3, 2, 2, 2, 1381, 1382, 3, 2, 2, 2, 1382, 1385, 3, 2, 2, 2, 1383, 1381, 3, 2, 2, 2, 1384, 1375, 3, 2, 2, 2, 1384, 1385, 3, 2, 2, 2, 1385, 233, 3, 2, 2, 2, 1386, 1387, 7, 135, 2, 2, 1387, 1388, 7, 178, 2, 2, 1388, 1393, 7, 5, 2, 2, 1389, 1390, 7, 88, 2, 2, 1390, 1391, 7, 136, 2, 2, 1391, 1393, 7, 135, 2, 2, 1392, 1386, 3, 2, 2, 2, 1392, 1389, 3, 2, 2, 2, 1393, 235, 3, 2, 2, 2, 1394, 1396, 7, 137, 2, 2, 1395, 1397, 5, 238, 120, 2, 1396, 1395, 3, 2, 2, 2, 1396, 1397, 3, 2, 2, 2, 1397, 1402, 3, 2, 2, 2, 1398, 1399, 7, 138, 2, 2, 1399, 1402, 5, 238, 120, 2, 1400, 1402, 5, 238, 120, 2, 1401, 1394, 3, 2, 2, 2, 1401, 1398, 3, 2, 2, 2, 1401, 1400, 3, 2, 2, 2, 1402, 237, 3, 2, 2, 2, 1403, 1408, 5, 240, 121, 2, 1404, 1405, 9, 8, 2, 2, 1405, 1407, 5, 240, 121, 2, 1406, 1404, 3, 2, 2, 2, 1407, 1410, 3, 2, 2, 2, 1408, 1406, 3, 2, 2, 2, 1408, 1409, 3, 2, 2, 2, 1409, 239, 3, 2, 2, 2, 1410, 1408, 3, 2, 2, 2, 1411, 1414, 5, 180, 91, 2, 1412, 1414, 5, 242, 122, 2, 1413, 1411, 3, 2, 2, 2, 1413, 1412, 3, 2, 2, 2, 1414, 241, 3, 2, 2, 2, 1415, 1418, 5, 250, 126, 2, 1416, 1418, 5, 244, 123, 2, 1417, 1415, 3, 2, 2, 2, 1417, 1416, 3, 2, 2, 2, 1418, 1419, 3, 2, 2, 2, 1419, 1420, 5, 266, 134, 2, 1420, 243, 3, 2, 2, 2, 1421, 1422, 5, 246, 124, 2, 1422, 1423, 5, 256, 129, 2, 1423, 1426, 3, 2, 2, 2, 1424, 1426, 5, 248, 125, 2, 1425, 1421, 3, 2, 2, 2, 1425, 1424, 3, 2, 2, 2, 1426, 245, 3, 2, 2, 2, 1427, 1428, 9, 9, 2, 2, 1428, 1429, 7, 19, 2, 2, 1429, 1430, 7, 19, 2, 2, 1430, 247, 3, 2, 2, 2, 1431, 1433, 7, 139, 2, 2, 1432, 1431, 3, 2, 2, 2, 1432, 1433, 3, 2, 2, 2, 1433, 1434, 3, 2, 2, 2, 1434, 1435, 5, 256, 129, 2, 1435, 249, 3, 2, 2, 2, 1436, 1437, 5, 252, 127, 2, 1437, 1438, 5, 256, 129, 2, 1438, 1441, 3, 2, 2, 2, 1439, 1441, 5, 254, 128, 2, 1440, 1436, 3, 2, 2, 2, 1440, 1439, 3, 2, 2, 2, 1441, 251, 3, 2, 2, 2, 1442, 1443, 9, 10, 2, 2, 1443, 1444, 7, 19, 2, 2, 1444, 1445, 7, 19, 2, 2, 1445, 253, 3, 2, 2, 2, 1446, 1447, 7, 58, 2, 2, 1447, 255, 3, 2, 2, 2, 1448, 1451, 5, 258, 130, 2, 1449, 1451, 5, 272, 137, 2, 1450, 1448, 3, 2, 2, 2, 1450, 1449, 3, 2, 2, 2, 1451, 257, 3, 2, 2, 2, 1452, 1455, 5, 74, 38, 2, 1453, 1455, 5, 260, 131, 2, 1454, 1452, 3, 2, 2, 2, 1454, 1453, 3, 2, 2, 2, 1455, 259, 3, 2, 2, 2, 1456, 1460, 7, 12, 2, 2, 1457, 1460, 5, 262, 132, 2, 1458, 1460, 5, 264, 133, 2, 1459, 1456, 3, 2, 2, 2, 1459, 1457, 3, 2, 2, 2, 1459, 1458, 3, 2, 2, 2, 1460, 261, 3, 2, 2, 2, 1461, 1462, 7, 178, 2, 2, 1462, 1463, 7, 19, 2, 2, 1463, 1464, 7, 12, 2, 2, 1464, 263, 3, 2, 2, 2, 1465, 1466, 7, 12, 2, 2, 1466, 1467, 7, 19, 2, 2, 1467, 1468, 7, 178, 2, 2, 1468, 265, 3, 2, 2, 2, 1469, 1471, 5, 186, 94, 2, 1470, 1469, 3, 2, 2, 2, 1471, 1474, 3, 2, 2, 2, 1472, 1470, 3, 2, 2, 2, 1472, 1473, 3, 2, 2, 2, 1473, 267, 3, 2, 2, 2, 1474, 1472, 3, 2, 2, 2, 1475, 1487, 5, 74, 38, 2, 1476, 1487, 7, 171, 2, 2, 1477, 1487, 5, 272, 137, 2, 1478, 1479, 7, 113, 2, 2, 1479, 1480, 7, 10, 2, 2, 1480, 1487, 7, 11, 2, 2, 1481, 1487, 5, 342, 172, 2, 1482, 1487, 5, 310, 156, 2, 1483, 1487, 5, 316, 159, 2, 1484, 1487, 5, 270, 136, 2, 1485, 1487, 5, 322, 162, 2, 1486, 1475, 3, 2, 2, 2, 1486, 1476, 3, 2, 2, 2, 1486, 1477, 3, 2, 2, 2, 1486, 1478, 3, 2, 2, 2, 1486, 1481, 3, 2, 2, 2, 1486, 1482, 3, 2, 2, 2, 1486, 1483, 3, 2, 2, 2, 1486, 1484, 3, 2, 2, 2, 1486, 1485, 3, 2, 2, 2, 1487, 269, 3, 2, 2, 2, 1488, 1489, 5, 74, 38, 2, 1489, 271, 3, 2, 2, 2, 1490, 1503, 5, 278, 140, 2, 1491, 1503, 5, 294, 148, 2, 1492, 1503, 5, 288, 145, 2, 1493, 1503, 5, 298, 150, 2, 1494, 1503, 5, 292, 147, 2, 1495, 1503, 5, 286, 144, 2, 1496, 1503, 5, 282, 142, 2, 1497, 1503, 5, 280, 141, 2, 1498, 1503, 5, 284, 143, 2, 1499, 1503, 5, 326, 164, 2, 1500, 1503, 5, 276, 139, 2, 1501, 1503, 5, 274, 138, 2, 1502, 1490, 3, 2, 2, 2, 1502, 1491, 3, 2, 2, 2, 1502, 1492, 3, 2, 2, 2, 1502, 1493, 3, 2, 2, 2, 1502, 1494, 3, 2, 2, 2, 1502, 1495, 3, 2, 2, 2, 1502, 1496, 3, 2, 2, 2, 1502, 1497, 3, 2, 2, 2, 1502, 1498, 3, 2, 2, 2, 1502, 1499, 3, 2, 2, 2, 1502, 1500, 3, 2, 2, 2, 1502, 1501, 3, 2, 2, 2, 1503, 273, 3, 2, 2, 2, 1504, 1505, 7, 152, 2, 2, 1505, 1506, 7, 10, 2, 2, 1506, 1507, 7, 11, 2, 2, 1507, 275, 3, 2, 2, 2, 1508, 1509, 7, 153, 2, 2, 1509, 1510, 7, 10, 2, 2, 1510, 1511, 7, 11, 2, 2, 1511, 277, 3, 2, 2, 2, 1512, 1513, 7, 155, 2, 2, 1513, 1516, 7, 10, 2, 2, 1514, 1517, 5, 294, 148, 2, 1515, 1517, 5, 298, 150, 2, 1516, 1514, 3, 2, 2, 2, 1516, 1515, 3, 2, 2, 2, 1516, 1517, 3, 2, 2, 2, 1517, 1518, 3, 2, 2, 2, 1518, 1519, 7, 11, 2, 2, 1519, 279, 3, 2, 2, 2, 1520, 1521, 7, 156, 2, 2, 1521, 1522, 7, 10, 2, 2, 1522, 1523, 7, 11, 2, 2, 1523, 281, 3, 2, 2, 2, 1524, 1525, 7, 166, 2, 2, 1525, 1526, 7, 10, 2, 2, 1526, 1527, 7, 11, 2, 2, 1527, 283, 3, 2, 2, 2, 1528, 1529, 7, 158, 2, 2, 1529, 1530, 7, 10, 2, 2, 1530, 1531, 7, 11, 2, 2, 1531, 285, 3, 2, 2, 2, 1532, 1533, 7, 157, 2, 2, 1533, 1536, 7, 10, 2, 2, 1534, 1537, 7, 178, 2, 2, 1535, 1537, 5, 356, 179, 2, 1536, 1534, 3, 2, 2, 2, 1536, 1535, 3, 2, 2, 2, 1536, 1537, 3, 2, 2, 2, 1537, 1538, 3, 2, 2, 2, 1538, 1539, 7, 11, 2, 2, 1539, 287, 3, 2, 2, 2, 1540, 1541, 7, 142, 2, 2, 1541, 1547, 7, 10, 2, 2, 1542, 1545, 5, 290, 146, 2, 1543, 1544, 7, 15, 2, 2, 1544, 1546, 5, 308, 155, 2, 1545, 1543, 3, 2, 2, 2, 1545, 1546, 3, 2, 2, 2, 1546, 1548, 3, 2, 2, 2, 1547, 1542, 3, 2, 2, 2, 1547, 1548, 3, 2, 2, 2, 1548, 1549, 3, 2, 2, 2, 1549, 1550, 7, 11, 2, 2, 1550, 289, 3, 2, 2, 2, 1551, 1554, 5, 302, 152, 2, 1552, 1554, 7, 12, 2, 2, 1553, 1551, 3, 2, 2, 2, 1553, 1552, 3, 2, 2, 2, 1554, 291, 3, 2, 2, 2, 1555, 1556, 7, 159, 2, 2, 1556, 1557, 7, 10, 2, 2, 1557, 1558, 5, 324, 163, 2, 1558, 1559, 7, 11, 2, 2, 1559, 293, 3, 2, 2, 2, 1560, 1561, 7, 136, 2, 2, 1561, 1570, 7, 10, 2, 2, 1562, 1568, 5, 296, 149, 2, 1563, 1564, 7, 15, 2, 2, 1564, 1566, 5, 308, 155, 2, 1565, 1567, 7, 170, 2, 2, 1566, 1565, 3, 2, 2, 2, 1566, 1567, 3, 2, 2, 2, 1567, 1569, 3, 2, 2, 2, 1568, 1563, 3, 2, 2, 2, 1568, 1569, 3, 2, 2, 2, 1569, 1571, 3, 2, 2, 2, 1570, 1562, 3, 2, 2, 2, 1570, 1571, 3, 2, 2, 2, 1571, 1572, 3, 2, 2, 2, 1572, 1573, 7, 11, 2, 2, 1573, 295, 3, 2, 2, 2, 1574, 1577, 5, 304, 153, 2, 1575, 1577, 7, 12, 2, 2, 1576, 1574, 3, 2, 2, 2, 1576, 1575, 3, 2, 2, 2, 1577, 297, 3, 2, 2, 2, 1578, 1579, 7, 160, 2, 2, 1579, 1580, 7, 10, 2, 2, 1580, 1581, 5, 300, 151, 2, 1581, 1582, 7, 11, 2, 2, 1582, 299, 3, 2, 2, 2, 1583, 1584, 5, 304, 153, 2, 1584, 301, 3, 2, 2, 2, 1585, 1586, 5, 74, 38, 2, 1586, 303, 3, 2, 2, 2, 1587, 1588, 5, 74, 38, 2, 1588, 305, 3, 2, 2, 2, 1589, 1590, 5, 308, 155, 2, 1590, 307, 3, 2, 2, 2, 1591, 1592, 5, 74, 38, 2, 1592, 309, 3, 2, 2, 2, 1593, 1596, 5, 312, 157, 2, 1594, 1596, 5, 314, 158, 2, 1595, 1593, 3, 2, 2, 2, 1595, 1594, 3, 2, 2, 2, 1596, 311, 3, 2, 2, 2, 1597, 1598, 7, 168, 2, 2, 1598, 1599, 7, 10, 2, 2, 1599, 1600, 7, 12, 2, 2, 1600, 1601, 7, 11, 2, 2, 1601, 313, 3, 2, 2, 2, 1602, 1603, 7, 168, 2, 2, 1603, 1604, 7, 10, 2, 2, 1604, 1605, 5, 74, 38, 2, 1605, 1606, 7, 15, 2, 2, 1606, 1607, 5, 338, 170, 2, 1607, 1608, 7, 11, 2, 2, 1608, 315, 3, 2, 2, 2, 1609, 1612, 5, 318, 160, 2, 1610, 1612, 5, 320, 161, 2, 1611, 1609, 3, 2, 2, 2, 1611, 1610, 3, 2, 2, 2, 1612, 317, 3, 2, 2, 2, 1613, 1614, 7, 167, 2, 2, 1614, 1615, 7, 10, 2, 2, 1615, 1616, 7, 12, 2, 2, 1616, 1617, 7, 11, 2, 2, 1617, 319, 3, 2, 2, 2, 1618, 1619, 7, 167, 2, 2, 1619, 1620, 7, 10, 2, 2, 1620, 1621, 5, 338, 170, 2, 1621, 1622, 7, 11, 2, 2, 1622, 321, 3, 2, 2, 2, 1623, 1624, 7, 10, 2, 2, 1624, 1625, 5, 268, 135, 2, 1625, 1626, 7, 11, 2, 2, 1626, 323, 3, 2, 2, 2, 1627, 1628, 5, 302, 152, 2, 1628, 325, 3, 2, 2, 2, 1629, 1635, 5, 328, 165, 2, 1630, 1635, 5, 330, 166, 2, 1631, 1635, 5, 332, 167, 2, 1632, 1635, 5, 334, 168, 2, 1633, 1635, 5, 336, 169, 2, 1634, 1629, 3, 2, 2, 2, 1634, 1630, 3, 2, 2, 2, 1634, 1631, 3, 2, 2, 2, 1634, 1632, 3, 2, 2, 2, 1634, 1633, 3, 2, 2, 2, 1635, 327, 3, 2, 2, 2, 1636, 1637, 7, 161, 2, 2, 1637, 1639, 7, 10, 2, 2, 1638, 1640, 5, 356, 179, 2, 1639, 1638, 3, 2, 2, 2, 1639, 1640, 3, 2, 2, 2, 1640, 1641, 3, 2, 2, 2, 1641, 1642, 7, 11, 2, 2, 1642, 329, 3, 2, 2, 2, 1643, 1644, 7, 165, 2, 2, 1644, 1646, 7, 10, 2, 2, 1645, 1647, 5, 356, 179, 2, 1646, 1645, 3, 2, 2, 2, 1646, 1647, 3, 2, 2, 2, 1647, 1648, 3, 2, 2, 2, 1648, 1649, 7, 11, 2, 2, 1649, 331, 3, 2, 2, 2, 1650, 1651, 7, 164, 2, 2, 1651, 1653, 7, 10, 2, 2, 1652, 1654, 5, 356, 179, 2, 1653, 1652, 3, 2, 2, 2, 1653, 1654, 3, 2, 2, 2, 1654, 1655, 3, 2, 2, 2, 1655, 1656, 7, 11, 2, 2, 1656, 333, 3, 2, 2, 2, 1657, 1658, 7, 162, 2, 2, 1658, 1660, 7, 10, 2, 2, 1659, 1661, 5, 356, 179, 2, 1660, 1659, 3, 2, 2, 2, 1660, 1661, 3, 2, 2, 2, 1661, 1662, 3, 2, 2, 2, 1662, 1663, 7, 11, 2, 2, 1663, 335, 3, 2, 2, 2, 1664, 1665, 7, 163, 2, 2, 1665, 1667, 7, 10, 2, 2, 1666, 1668, 5, 356, 179, 2, 1667, 1666, 3, 2, 2, 2, 1667, 1668, 3, 2, 2, 2, 1668, 1669, 3, 2, 2, 2, 1669, 1670, 7, 11, 2, 2, 1670, 337, 3, 2, 2, 2, 1671, 1672, 7, 10, 2, 2, 1672, 1680, 7, 11, 2, 2, 1673, 1677, 5, 268, 135, 2, 1674, 1678, 7, 170, 2, 2, 1675, 1678, 7, 12, 2, 2, 1676, 1678, 7, 47, 2, 2, 1677, 1674, 3, 2, 2, 2, 1677, 1675, 3, 2, 2, 2, 1677, 1676, 3, 2, 2, 2, 1677, 1678, 3, 2, 2, 2, 1678, 1680, 3, 2, 2, 2, 1679, 1671, 3, 2, 2, 2, 1679, 1673, 3, 2, 2, 2, 1680, 339, 3, 2, 2, 2, 1681, 1690, 7, 8, 2, 2, 1682, 1687, 5, 350, 176, 2, 1683, 1684, 7, 15, 2, 2, 1684, 1686, 5, 350, 176, 2, 1685, 1683, 3, 2, 2, 2, 1686, 1689, 3, 2, 2, 2, 1687, 1685, 3, 2, 2, 2, 1687, 1688, 3, 2, 2, 2, 1688, 1691, 3, 2, 2, 2, 1689, 1687, 3, 2, 2, 2, 1690, 1682, 3, 2, 2, 2, 1690, 1691, 3, 2, 2, 2, 1691, 1692, 3, 2, 2, 2, 1692, 1698, 7, 9, 2, 2, 1693, 1694, 7, 59, 2, 2, 1694, 1695, 5, 94, 48, 2, 1695, 1696, 7, 60, 2, 2, 1696, 1698, 3, 2, 2, 2, 1697, 1681, 3, 2, 2, 2, 1697, 1693, 3, 2, 2, 2, 1698, 341, 3, 2, 2, 2, 1699, 1702, 5, 344, 173, 2, 1700, 1702, 5, 346, 174, 2, 1701, 1699, 3, 2, 2, 2, 1701, 1700, 3, 2, 2, 2, 1702, 343, 3, 2, 2, 2, 1703, 1704, 7, 31, 2, 2, 1704, 1705, 7, 10, 2, 2, 1705, 1706, 7, 12, 2, 2, 1706, 1707, 7, 11, 2, 2, 1707, 345, 3, 2, 2, 2, 1708, 1709, 7, 31, 2, 2, 1709, 1718, 7, 10, 2, 2, 1710, 1715, 5, 338, 170, 2, 1711, 1712, 7, 15, 2, 2, 1712, 1714, 5, 338, 170, 2, 1713, 1711, 3, 2, 2, 2, 1714, 1717, 3, 2, 2, 2, 1715, 1713, 3, 2, 2, 2, 1715, 1716, 3, 2, 2, 2, 1716, 1719, 3, 2, 2, 2, 1717, 1715, 3, 2, 2, 2, 1718, 1710, 3, 2, 2, 2, 1718, 1719, 3, 2, 2, 2, 1719, 1720, 3, 2, 2, 2, 1720, 1721, 7, 11, 2, 2, 1721, 1722, 7, 70, 2, 2, 1722, 1723, 5, 338, 170, 2, 1723, 347, 3, 2, 2, 2, 1724, 1726, 5, 268, 135, 2, 1725, 1727, 7, 170, 2, 2, 1726, 1725, 3, 2, 2, 2, 1726, 1727, 3, 2, 2, 2, 1727, 349, 3, 2, 2, 2, 1728, 1731, 5, 96, 49, 2, 1729, 1731, 7, 178, 2, 2, 1730, 1728, 3, 2, 2, 2, 1730, 1729, 3, 2, 2, 2, 1731, 1732, 3, 2, 2, 2, 1732, 1733, 9, 11, 2, 2, 1733, 1734, 5, 96, 49, 2, 1734, 351, 3, 2, 2, 2, 1735, 1737, 7, 53, 2, 2, 1736, 1738, 5, 94, 48, 2, 1737, 1736, 3, 2, 2, 2, 1737, 1738, 3, 2, 2, 2, 1738, 1739, 3, 2, 2, 2, 1739, 1740, 7, 54, 2, 2, 1740, 353, 3, 2, 2, 2, 1741, 1742, 5, 356, 179, 2, 1742, 355, 3, 2, 2, 2, 1743, 1744, 7, 169, 2, 2, 1744, 357, 3, 2, 2, 2, 1745, 1746, 9, 12, 2, 2, 1746, 359, 3, 2, 2, 2, 168, 368, 372, 388, 394, 402, 410, 418, 433, 463, 471, 473, 495, 505, 515, 520, 525, 529, 541, 545, 554, 561, 575, 579, 584, 594, 602, 606, 618, 630, 652, 660, 665, 668, 672, 681, 690, 693, 701, 708, 710, 717, 724, 726, 734, 739, 746, 753, 763, 770, 777, 784, 793, 803, 807, 815, 817, 829, 835, 839, 843, 854, 860, 875, 881, 885, 889, 896, 903, 909, 914, 916, 920, 927, 934, 943, 955, 965, 977, 981, 990, 997, 1019, 1024, 1029, 1033, 1045, 1053, 1057, 1064, 1071, 1077, 1084, 1092, 1099, 1105, 1111, 1117, 1123, 1134, 1140, 1145, 1153, 1174, 1183, 1185, 1208, 1225, 1236, 1258, 1262, 1269, 1273, 1283, 1288, 1302, 1311, 1317, 1344, 1361, 1363, 1372, 1381, 1384, 1392, 1396, 1401, 1408, 1413, 1417, 1425, 1432, 1440, 1450, 1454, 1459, 1472, 1486, 1502, 1516, 1536, 1545, 1547, 1553, 1566, 1568, 1570, 1576, 1595, 1611, 1634, 1639, 1646, 1653, 1660, 1667, 1677, 1679, 1687, 1690, 1697, 1701, 1715, 1718, 1726, 1730, 1737] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 178, 1601, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 337, 10, 3, 3, 3, 3, 3, 5, 3, 341, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 357, 10, 6, 3, 6, 3, 6, 7, 6, 361, 10, 6, 12, 6, 14, 6, 364, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 369, 10, 6, 12, 6, 14, 6, 372, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 377, 10, 8, 12, 8, 14, 8, 380, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 387, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 402, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 432, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 440, 10, 18, 12, 18, 14, 18, 443, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 462, 10, 20, 13, 20, 14, 20, 463, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 472, 10, 21, 13, 21, 14, 21, 473, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 482, 10, 22, 13, 22, 14, 22, 483, 3, 23, 3, 23, 3, 23, 5, 23, 489, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 494, 10, 23, 7, 23, 496, 10, 23, 12, 23, 14, 23, 499, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 508, 10, 24, 13, 24, 14, 24, 509, 3, 24, 3, 24, 5, 24, 514, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 523, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 528, 10, 25, 12, 25, 14, 25, 531, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 542, 10, 26, 12, 26, 14, 26, 545, 11, 26, 3, 26, 5, 26, 548, 10, 26, 3, 27, 7, 27, 551, 10, 27, 12, 27, 14, 27, 554, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 561, 10, 28, 12, 28, 14, 28, 564, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 571, 10, 29, 3, 29, 3, 29, 5, 29, 575, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 587, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 599, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 621, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 627, 10, 37, 12, 37, 14, 37, 630, 11, 37, 3, 38, 3, 38, 5, 38, 634, 10, 38, 3, 38, 5, 38, 637, 10, 38, 3, 38, 3, 38, 5, 38, 641, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 650, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 657, 10, 40, 12, 40, 14, 40, 660, 11, 40, 5, 40, 662, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 670, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 677, 10, 41, 5, 41, 679, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 686, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 693, 10, 42, 5, 42, 695, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 703, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 708, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 715, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 722, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 732, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 737, 10, 46, 12, 46, 14, 46, 740, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 746, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 751, 10, 48, 12, 48, 14, 48, 754, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 762, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 772, 10, 50, 3, 51, 3, 51, 5, 51, 776, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 784, 10, 51, 12, 51, 14, 51, 787, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 796, 10, 52, 12, 52, 14, 52, 799, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 804, 10, 53, 3, 53, 3, 53, 5, 53, 808, 10, 53, 3, 53, 3, 53, 5, 53, 812, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 821, 10, 54, 12, 54, 14, 54, 824, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 829, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 842, 10, 57, 12, 57, 14, 57, 845, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 850, 10, 58, 3, 58, 3, 58, 5, 58, 854, 10, 58, 3, 58, 3, 58, 5, 58, 858, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 865, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 870, 10, 59, 12, 59, 14, 59, 873, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 878, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 883, 10, 60, 5, 60, 885, 10, 60, 3, 60, 3, 60, 5, 60, 889, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 896, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 901, 10, 62, 12, 62, 14, 62, 904, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 912, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 922, 10, 64, 13, 64, 14, 64, 923, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 932, 10, 65, 13, 65, 14, 65, 933, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 944, 10, 66, 13, 66, 14, 66, 945, 3, 66, 3, 66, 5, 66, 950, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 959, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 964, 10, 67, 12, 67, 14, 67, 967, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 986, 10, 69, 13, 69, 14, 69, 987, 3, 70, 3, 70, 3, 70, 5, 70, 993, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 998, 10, 70, 7, 70, 1000, 10, 70, 12, 70, 14, 70, 1003, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 1012, 10, 71, 12, 71, 14, 71, 1015, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 1020, 10, 72, 12, 72, 14, 72, 1023, 11, 72, 3, 73, 5, 73, 1026, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 1033, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 1038, 10, 75, 12, 75, 14, 75, 1041, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 1046, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 1051, 10, 77, 12, 77, 14, 77, 1054, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 1059, 10, 78, 12, 78, 14, 78, 1062, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 1068, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1074, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1080, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1086, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1092, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1101, 10, 84, 12, 84, 14, 84, 1104, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1109, 10, 85, 3, 86, 7, 86, 1112, 10, 86, 12, 86, 14, 86, 1115, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1122, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1141, 10, 90, 12, 90, 14, 90, 1144, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1152, 10, 91, 12, 91, 14, 91, 1155, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1177, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1194, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1205, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1227, 10, 104, 7, 104, 1229, 10, 104, 12, 104, 14, 104, 1232, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1238, 10, 105, 3, 106, 3, 106, 5, 106, 1242, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1252, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1257, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1271, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1278, 10, 109, 12, 109, 14, 109, 1281, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1286, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1310, 10, 113, 12, 113, 14, 113, 1313, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1329, 10, 115, 13, 115, 14, 115, 1330, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 5, 117, 1339, 10, 117, 3, 117, 3, 117, 3, 117, 5, 117, 1344, 10, 117, 3, 118, 3, 118, 3, 118, 7, 118, 1349, 10, 118, 12, 118, 14, 118, 1352, 11, 118, 3, 119, 3, 119, 5, 119, 1356, 10, 119, 3, 120, 3, 120, 5, 120, 1360, 10, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 5, 121, 1368, 10, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 5, 124, 1381, 10, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 127, 3, 127, 5, 127, 1391, 10, 127, 3, 128, 3, 128, 5, 128, 1395, 10, 128, 3, 129, 3, 129, 3, 129, 5, 129, 1400, 10, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 7, 132, 1411, 10, 132, 12, 132, 14, 132, 1414, 11, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 5, 133, 1427, 10, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 5, 136, 1441, 10, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 5, 140, 1461, 10, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 5, 141, 1470, 10, 141, 5, 141, 1472, 10, 141, 3, 141, 3, 141, 3, 142, 3, 142, 5, 142, 1478, 10, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 5, 145, 1493, 10, 145, 5, 145, 1495, 10, 145, 5, 145, 1497, 10, 145, 3, 145, 3, 145, 3, 146, 3, 146, 5, 146, 1503, 10, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 149, 3, 149, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 5, 153, 1526, 10, 153, 5, 153, 1528, 10, 153, 3, 154, 3, 154, 3, 154, 3, 154, 7, 154, 1534, 10, 154, 12, 154, 14, 154, 1537, 11, 154, 5, 154, 1539, 10, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 5, 154, 1546, 10, 154, 3, 155, 3, 155, 3, 155, 5, 155, 1551, 10, 155, 3, 156, 3, 156, 5, 156, 1555, 10, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 7, 158, 1567, 10, 158, 12, 158, 14, 158, 1570, 11, 158, 5, 158, 1572, 10, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 5, 159, 1580, 10, 159, 3, 160, 3, 160, 5, 160, 1584, 10, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 5, 161, 1591, 10, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 2, 2, 165, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 2, 13, 4, 2, 17, 17, 105, 105, 3, 2, 82, 83, 3, 2, 20, 29, 4, 2, 5, 5, 35, 45, 3, 2, 47, 48, 4, 2, 12, 12, 49, 51, 3, 2, 131, 132, 3, 2, 134, 140, 3, 2, 141, 145, 4, 2, 19, 19, 168, 168, 5, 2, 61, 126, 161, 166, 169, 169, 2, 1664, 2, 328, 3, 2, 2, 2, 4, 336, 3, 2, 2, 2, 6, 342, 3, 2, 2, 2, 8, 345, 3, 2, 2, 2, 10, 362, 3, 2, 2, 2, 12, 373, 3, 2, 2, 2, 14, 378, 3, 2, 2, 2, 16, 381, 3, 2, 2, 2, 18, 384, 3, 2, 2, 2, 20, 401, 3, 2, 2, 2, 22, 403, 3, 2, 2, 2, 24, 406, 3, 2, 2, 2, 26, 412, 3, 2, 2, 2, 28, 416, 3, 2, 2, 2, 30, 420, 3, 2, 2, 2, 32, 424, 3, 2, 2, 2, 34, 431, 3, 2, 2, 2, 36, 447, 3, 2, 2, 2, 38, 456, 3, 2, 2, 2, 40, 471, 3, 2, 2, 2, 42, 478, 3, 2, 2, 2, 44, 485, 3, 2, 2, 2, 46, 502, 3, 2, 2, 2, 48, 518, 3, 2, 2, 2, 50, 535, 3, 2, 2, 2, 52, 552, 3, 2, 2, 2, 54, 555, 3, 2, 2, 2, 56, 567, 3, 2, 2, 2, 58, 576, 3, 2, 2, 2, 60, 586, 3, 2, 2, 2, 62, 588, 3, 2, 2, 2, 64, 598, 3, 2, 2, 2, 66, 600, 3, 2, 2, 2, 68, 605, 3, 2, 2, 2, 70, 609, 3, 2, 2, 2, 72, 615, 3, 2, 2, 2, 74, 636, 3, 2, 2, 2, 76, 642, 3, 2, 2, 2, 78, 644, 3, 2, 2, 2, 80, 663, 3, 2, 2, 2, 82, 680, 3, 2, 2, 2, 84, 696, 3, 2, 2, 2, 86, 716, 3, 2, 2, 2, 88, 731, 3, 2, 2, 2, 90, 733, 3, 2, 2, 2, 92, 741, 3, 2, 2, 2, 94, 747, 3, 2, 2, 2, 96, 761, 3, 2, 2, 2, 98, 771, 3, 2, 2, 2, 100, 775, 3, 2, 2, 2, 102, 791, 3, 2, 2, 2, 104, 800, 3, 2, 2, 2, 106, 816, 3, 2, 2, 2, 108, 825, 3, 2, 2, 2, 110, 833, 3, 2, 2, 2, 112, 836, 3, 2, 2, 2, 114, 846, 3, 2, 2, 2, 116, 864, 3, 2, 2, 2, 118, 874, 3, 2, 2, 2, 120, 890, 3, 2, 2, 2, 122, 895, 3, 2, 2, 2, 124, 908, 3, 2, 2, 2, 126, 916, 3, 2, 2, 2, 128, 931, 3, 2, 2, 2, 130, 938, 3, 2, 2, 2, 132, 954, 3, 2, 2, 2, 134, 971, 3, 2, 2, 2, 136, 980, 3, 2, 2, 2, 138, 989, 3, 2, 2, 2, 140, 1008, 3, 2, 2, 2, 142, 1016, 3, 2, 2, 2, 144, 1025, 3, 2, 2, 2, 146, 1029, 3, 2, 2, 2, 148, 1034, 3, 2, 2, 2, 150, 1042, 3, 2, 2, 2, 152, 1047, 3, 2, 2, 2, 154, 1055, 3, 2, 2, 2, 156, 1063, 3, 2, 2, 2, 158, 1069, 3, 2, 2, 2, 160, 1075, 3, 2, 2, 2, 162, 1081, 3, 2, 2, 2, 164, 1087, 3, 2, 2, 2, 166, 1093, 3, 2, 2, 2, 168, 1108, 3, 2, 2, 2, 170, 1113, 3, 2, 2, 2, 172, 1121, 3, 2, 2, 2, 174, 1123, 3, 2, 2, 2, 176, 1130, 3, 2, 2, 2, 178, 1137, 3, 2, 2, 2, 180, 1145, 3, 2, 2, 2, 182, 1156, 3, 2, 2, 2, 184, 1162, 3, 2, 2, 2, 186, 1165, 3, 2, 2, 2, 188, 1169, 3, 2, 2, 2, 190, 1193, 3, 2, 2, 2, 192, 1195, 3, 2, 2, 2, 194, 1199, 3, 2, 2, 2, 196, 1202, 3, 2, 2, 2, 198, 1208, 3, 2, 2, 2, 200, 1210, 3, 2, 2, 2, 202, 1215, 3, 2, 2, 2, 204, 1220, 3, 2, 2, 2, 206, 1223, 3, 2, 2, 2, 208, 1237, 3, 2, 2, 2, 210, 1241, 3, 2, 2, 2, 212, 1243, 3, 2, 2, 2, 214, 1247, 3, 2, 2, 2, 216, 1285, 3, 2, 2, 2, 218, 1287, 3, 2, 2, 2, 220, 1291, 3, 2, 2, 2, 222, 1297, 3, 2, 2, 2, 224, 1305, 3, 2, 2, 2, 226, 1319, 3, 2, 2, 2, 228, 1325, 3, 2, 2, 2, 230, 1332, 3, 2, 2, 2, 232, 1343, 3, 2, 2, 2, 234, 1345, 3, 2, 2, 2, 236, 1355, 3, 2, 2, 2, 238, 1359, 3, 2, 2, 2, 240, 1367, 3, 2, 2, 2, 242, 1369, 3, 2, 2, 2, 244, 1373, 3, 2, 2, 2, 246, 1380, 3, 2, 2, 2, 248, 1382, 3, 2, 2, 2, 250, 1386, 3, 2, 2, 2, 252, 1390, 3, 2, 2, 2, 254, 1394, 3, 2, 2, 2, 256, 1399, 3, 2, 2, 2, 258, 1401, 3, 2, 2, 2, 260, 1405, 3, 2, 2, 2, 262, 1412, 3, 2, 2, 2, 264, 1426, 3, 2, 2, 2, 266, 1428, 3, 2, 2, 2, 268, 1432, 3, 2, 2, 2, 270, 1436, 3, 2, 2, 2, 272, 1444, 3, 2, 2, 2, 274, 1448, 3, 2, 2, 2, 276, 1452, 3, 2, 2, 2, 278, 1456, 3, 2, 2, 2, 280, 1464, 3, 2, 2, 2, 282, 1477, 3, 2, 2, 2, 284, 1479, 3, 2, 2, 2, 286, 1484, 3, 2, 2, 2, 288, 1486, 3, 2, 2, 2, 290, 1502, 3, 2, 2, 2, 292, 1504, 3, 2, 2, 2, 294, 1509, 3, 2, 2, 2, 296, 1511, 3, 2, 2, 2, 298, 1513, 3, 2, 2, 2, 300, 1515, 3, 2, 2, 2, 302, 1517, 3, 2, 2, 2, 304, 1527, 3, 2, 2, 2, 306, 1545, 3, 2, 2, 2, 308, 1550, 3, 2, 2, 2, 310, 1554, 3, 2, 2, 2, 312, 1556, 3, 2, 2, 2, 314, 1561, 3, 2, 2, 2, 316, 1577, 3, 2, 2, 2, 318, 1583, 3, 2, 2, 2, 320, 1588, 3, 2, 2, 2, 322, 1594, 3, 2, 2, 2, 324, 1596, 3, 2, 2, 2, 326, 1598, 3, 2, 2, 2, 328, 329, 5, 4, 3, 2, 329, 330, 7, 2, 2, 3, 330, 3, 3, 2, 2, 2, 331, 332, 7, 104, 2, 2, 332, 333, 7, 103, 2, 2, 333, 334, 5, 324, 163, 2, 334, 335, 7, 3, 2, 2, 335, 337, 3, 2, 2, 2, 336, 331, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 341, 5, 8, 5, 2, 339, 341, 5, 6, 4, 2, 340, 338, 3, 2, 2, 2, 340, 339, 3, 2, 2, 2, 341, 5, 3, 2, 2, 2, 342, 343, 5, 10, 6, 2, 343, 344, 5, 12, 7, 2, 344, 7, 3, 2, 2, 2, 345, 346, 7, 4, 2, 2, 346, 347, 7, 129, 2, 2, 347, 348, 7, 176, 2, 2, 348, 349, 7, 5, 2, 2, 349, 350, 5, 322, 162, 2, 350, 351, 7, 3, 2, 2, 351, 352, 5, 10, 6, 2, 352, 9, 3, 2, 2, 2, 353, 357, 5, 60, 31, 2, 354, 357, 5, 62, 32, 2, 355, 357, 5, 78, 40, 2, 356, 353, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 355, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 359, 7, 3, 2, 2, 359, 361, 3, 2, 2, 2, 360, 356, 3, 2, 2, 2, 361, 364, 3, 2, 2, 2, 362, 360, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 370, 3, 2, 2, 2, 364, 362, 3, 2, 2, 2, 365, 366, 5, 64, 33, 2, 366, 367, 7, 3, 2, 2, 367, 369, 3, 2, 2, 2, 368, 365, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 368, 3, 2, 2, 2, 370, 371, 3, 2, 2, 2, 371, 11, 3, 2, 2, 2, 372, 370, 3, 2, 2, 2, 373, 374, 5, 18, 10, 2, 374, 13, 3, 2, 2, 2, 375, 377, 5, 20, 11, 2, 376, 375, 3, 2, 2, 2, 377, 380, 3, 2, 2, 2, 378, 376, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 15, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 381, 382, 5, 14, 8, 2, 382, 383, 5, 94, 48, 2, 383, 17, 3, 2, 2, 2, 384, 386, 5, 14, 8, 2, 385, 387, 5, 94, 48, 2, 386, 385, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 19, 3, 2, 2, 2, 388, 402, 5, 22, 12, 2, 389, 402, 5, 24, 13, 2, 390, 402, 5, 26, 14, 2, 391, 402, 5, 28, 15, 2, 392, 402, 5, 30, 16, 2, 393, 402, 5, 32, 17, 2, 394, 402, 5, 34, 18, 2, 395, 402, 5, 36, 19, 2, 396, 402, 5, 38, 20, 2, 397, 402, 5, 42, 22, 2, 398, 402, 5, 46, 24, 2, 399, 402, 5, 54, 28, 2, 400, 402, 5, 58, 30, 2, 401, 388, 3, 2, 2, 2, 401, 389, 3, 2, 2, 2, 401, 390, 3, 2, 2, 2, 401, 391, 3, 2, 2, 2, 401, 392, 3, 2, 2, 2, 401, 393, 3, 2, 2, 2, 401, 394, 3, 2, 2, 2, 401, 395, 3, 2, 2, 2, 401, 396, 3, 2, 2, 2, 401, 397, 3, 2, 2, 2, 401, 398, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 401, 400, 3, 2, 2, 2, 402, 21, 3, 2, 2, 2, 403, 404, 5, 98, 50, 2, 404, 405, 7, 3, 2, 2, 405, 23, 3, 2, 2, 2, 406, 407, 7, 6, 2, 2, 407, 408, 5, 74, 38, 2, 408, 409, 7, 7, 2, 2, 409, 410, 5, 96, 49, 2, 410, 411, 7, 3, 2, 2, 411, 25, 3, 2, 2, 2, 412, 413, 7, 8, 2, 2, 413, 414, 5, 14, 8, 2, 414, 415, 7, 9, 2, 2, 415, 27, 3, 2, 2, 2, 416, 417, 7, 161, 2, 2, 417, 418, 7, 162, 2, 2, 418, 419, 7, 3, 2, 2, 419, 29, 3, 2, 2, 2, 420, 421, 7, 163, 2, 2, 421, 422, 7, 162, 2, 2, 422, 423, 7, 3, 2, 2, 423, 31, 3, 2, 2, 2, 424, 425, 7, 164, 2, 2, 425, 426, 7, 165, 2, 2, 426, 427, 5, 96, 49, 2, 427, 428, 7, 3, 2, 2, 428, 33, 3, 2, 2, 2, 429, 432, 5, 102, 52, 2, 430, 432, 5, 106, 54, 2, 431, 429, 3, 2, 2, 2, 431, 430, 3, 2, 2, 2, 432, 441, 3, 2, 2, 2, 433, 440, 5, 102, 52, 2, 434, 440, 5, 106, 54, 2, 435, 440, 5, 110, 56, 2, 436, 440, 5, 112, 57, 2, 437, 440, 5, 116, 59, 2, 438, 440, 5, 120, 61, 2, 439, 433, 3, 2, 2, 2, 439, 434, 3, 2, 2, 2, 439, 435, 3, 2, 2, 2, 439, 436, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 438, 3, 2, 2, 2, 440, 443, 3, 2, 2, 2, 441, 439, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 444, 3, 2, 2, 2, 443, 441, 3, 2, 2, 2, 444, 445, 7, 67, 2, 2, 445, 446, 5, 20, 11, 2, 446, 35, 3, 2, 2, 2, 447, 448, 7, 68, 2, 2, 448, 449, 7, 10, 2, 2, 449, 450, 5, 94, 48, 2, 450, 451, 7, 11, 2, 2, 451, 452, 7, 89, 2, 2, 452, 453, 5, 20, 11, 2, 453, 454, 7, 90, 2, 2, 454, 455, 5, 20, 11, 2, 455, 37, 3, 2, 2, 2, 456, 457, 7, 84, 2, 2, 457, 458, 7, 10, 2, 2, 458, 459, 5, 94, 48, 2, 459, 461, 7, 11, 2, 2, 460, 462, 5, 40, 21, 2, 461, 460, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 461, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 88, 2, 2, 466, 467, 7, 67, 2, 2, 467, 468, 5, 20, 11, 2, 468, 39, 3, 2, 2, 2, 469, 470, 7, 85, 2, 2, 470, 472, 5, 96, 49, 2, 471, 469, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 7, 67, 2, 2, 476, 477, 5, 20, 11, 2, 477, 41, 3, 2, 2, 2, 478, 479, 7, 86, 2, 2, 479, 481, 5, 26, 14, 2, 480, 482, 5, 44, 23, 2, 481, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 43, 3, 2, 2, 2, 485, 488, 7, 87, 2, 2, 486, 489, 7, 12, 2, 2, 487, 489, 5, 74, 38, 2, 488, 486, 3, 2, 2, 2, 488, 487, 3, 2, 2, 2, 489, 497, 3, 2, 2, 2, 490, 493, 7, 13, 2, 2, 491, 494, 7, 12, 2, 2, 492, 494, 5, 74, 38, 2, 493, 491, 3, 2, 2, 2, 493, 492, 3, 2, 2, 2, 494, 496, 3, 2, 2, 2, 495, 490, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 500, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 500, 501, 5, 26, 14, 2, 501, 45, 3, 2, 2, 2, 502, 503, 7, 91, 2, 2, 503, 504, 7, 10, 2, 2, 504, 505, 5, 94, 48, 2, 505, 507, 7, 11, 2, 2, 506, 508, 5, 48, 25, 2, 507, 506, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 507, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 513, 7, 88, 2, 2, 512, 514, 5, 194, 98, 2, 513, 512, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 7, 67, 2, 2, 516, 517, 5, 20, 11, 2, 517, 47, 3, 2, 2, 2, 518, 522, 7, 85, 2, 2, 519, 520, 5, 194, 98, 2, 520, 521, 7, 70, 2, 2, 521, 523, 3, 2, 2, 2, 522, 519, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 524, 3, 2, 2, 2, 524, 529, 5, 304, 153, 2, 525, 526, 7, 13, 2, 2, 526, 528, 5, 304, 153, 2, 527, 525, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 532, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 533, 7, 67, 2, 2, 533, 534, 5, 20, 11, 2, 534, 49, 3, 2, 2, 2, 535, 536, 7, 14, 2, 2, 536, 547, 5, 74, 38, 2, 537, 538, 7, 10, 2, 2, 538, 543, 7, 170, 2, 2, 539, 540, 7, 15, 2, 2, 540, 542, 7, 170, 2, 2, 541, 539, 3, 2, 2, 2, 542, 545, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 546, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 546, 548, 7, 11, 2, 2, 547, 537, 3, 2, 2, 2, 547, 548, 3, 2, 2, 2, 548, 51, 3, 2, 2, 2, 549, 551, 5, 50, 26, 2, 550, 549, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 53, 3, 2, 2, 2, 554, 552, 3, 2, 2, 2, 555, 556, 5, 52, 27, 2, 556, 557, 7, 114, 2, 2, 557, 562, 5, 56, 29, 2, 558, 559, 7, 15, 2, 2, 559, 561, 5, 56, 29, 2, 560, 558, 3, 2, 2, 2, 561, 564, 3, 2, 2, 2, 562, 560, 3, 2, 2, 2, 562, 563, 3, 2, 2, 2, 563, 565, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 565, 566, 7, 3, 2, 2, 566, 55, 3, 2, 2, 2, 567, 570, 5, 194, 98, 2, 568, 569, 7, 70, 2, 2, 569, 571, 5, 304, 153, 2, 570, 568, 3, 2, 2, 2, 570, 571, 3, 2, 2, 2, 571, 574, 3, 2, 2, 2, 572, 573, 7, 7, 2, 2, 573, 575, 5, 96, 49, 2, 574, 572, 3, 2, 2, 2, 574, 575, 3, 2, 2, 2, 575, 57, 3, 2, 2, 2, 576, 577, 7, 166, 2, 2, 577, 578, 7, 10, 2, 2, 578, 579, 5, 94, 48, 2, 579, 580, 7, 11, 2, 2, 580, 581, 5, 20, 11, 2, 581, 59, 3, 2, 2, 2, 582, 587, 5, 66, 34, 2, 583, 587, 5, 68, 35, 2, 584, 587, 5, 70, 36, 2, 585, 587, 5, 72, 37, 2, 586, 582, 3, 2, 2, 2, 586, 583, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 586, 585, 3, 2, 2, 2, 587, 61, 3, 2, 2, 2, 588, 589, 7, 111, 2, 2, 589, 590, 7, 129, 2, 2, 590, 591, 7, 176, 2, 2, 591, 592, 7, 5, 2, 2, 592, 593, 5, 322, 162, 2, 593, 63, 3, 2, 2, 2, 594, 599, 5, 84, 43, 2, 595, 599, 5, 80, 41, 2, 596, 599, 5, 86, 44, 2, 597, 599, 5, 82, 42, 2, 598, 594, 3, 2, 2, 2, 598, 595, 3, 2, 2, 2, 598, 596, 3, 2, 2, 2, 598, 597, 3, 2, 2, 2, 599, 65, 3, 2, 2, 2, 600, 601, 7, 111, 2, 2, 601, 602, 7, 88, 2, 2, 602, 603, 7, 81, 2, 2, 603, 604, 5, 322, 162, 2, 604, 67, 3, 2, 2, 2, 605, 606, 7, 111, 2, 2, 606, 607, 7, 16, 2, 2, 607, 608, 9, 2, 2, 2, 608, 69, 3, 2, 2, 2, 609, 610, 7, 111, 2, 2, 610, 611, 7, 88, 2, 2, 611, 612, 7, 66, 2, 2, 612, 613, 7, 73, 2, 2, 613, 614, 9, 3, 2, 2, 614, 71, 3, 2, 2, 2, 615, 620, 7, 111, 2, 2, 616, 617, 7, 18, 2, 2, 617, 621, 5, 74, 38, 2, 618, 619, 7, 88, 2, 2, 619, 621, 7, 18, 2, 2, 620, 616, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 621, 628, 3, 2, 2, 2, 622, 623, 5, 76, 39, 2, 623, 624, 7, 5, 2, 2, 624, 625, 5, 324, 163, 2, 625, 627, 3, 2, 2, 2, 626, 622, 3, 2, 2, 2, 627, 630, 3, 2, 2, 2, 628, 626, 3, 2, 2, 2, 628, 629, 3, 2, 2, 2, 629, 73, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 631, 634, 7, 176, 2, 2, 632, 634, 5, 326, 164, 2, 633, 631, 3, 2, 2, 2, 633, 632, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 637, 7, 19, 2, 2, 636, 633, 3, 2, 2, 2, 636, 637, 3, 2, 2, 2, 637, 640, 3, 2, 2, 2, 638, 641, 7, 176, 2, 2, 639, 641, 5, 326, 164, 2, 640, 638, 3, 2, 2, 2, 640, 639, 3, 2, 2, 2, 641, 75, 3, 2, 2, 2, 642, 643, 9, 4, 2, 2, 643, 77, 3, 2, 2, 2, 644, 645, 7, 127, 2, 2, 645, 649, 7, 4, 2, 2, 646, 647, 7, 129, 2, 2, 647, 648, 7, 176, 2, 2, 648, 650, 7, 5, 2, 2, 649, 646, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 661, 5, 322, 162, 2, 652, 653, 7, 71, 2, 2, 653, 658, 5, 322, 162, 2, 654, 655, 7, 15, 2, 2, 655, 657, 5, 322, 162, 2, 656, 654, 3, 2, 2, 2, 657, 660, 3, 2, 2, 2, 658, 656, 3, 2, 2, 2, 658, 659, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 661, 652, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 79, 3, 2, 2, 2, 663, 664, 7, 111, 2, 2, 664, 665, 5, 52, 27, 2, 665, 666, 7, 114, 2, 2, 666, 669, 5, 194, 98, 2, 667, 668, 7, 70, 2, 2, 668, 670, 5, 304, 153, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 678, 3, 2, 2, 2, 671, 672, 7, 7, 2, 2, 672, 679, 5, 96, 49, 2, 673, 676, 7, 30, 2, 2, 674, 675, 7, 7, 2, 2, 675, 677, 5, 96, 49, 2, 676, 674, 3, 2, 2, 2, 676, 677, 3, 2, 2, 2, 677, 679, 3, 2, 2, 2, 678, 671, 3, 2, 2, 2, 678, 673, 3, 2, 2, 2, 679, 81, 3, 2, 2, 2, 680, 681, 7, 111, 2, 2, 681, 682, 7, 112, 2, 2, 682, 685, 7, 113, 2, 2, 683, 684, 7, 70, 2, 2, 684, 686, 5, 304, 153, 2, 685, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 694, 3, 2, 2, 2, 687, 688, 7, 7, 2, 2, 688, 695, 5, 96, 49, 2, 689, 692, 7, 30, 2, 2, 690, 691, 7, 7, 2, 2, 691, 693, 5, 96, 49, 2, 692, 690, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 695, 3, 2, 2, 2, 694, 687, 3, 2, 2, 2, 694, 689, 3, 2, 2, 2, 695, 83, 3, 2, 2, 2, 696, 697, 7, 111, 2, 2, 697, 698, 5, 52, 27, 2, 698, 699, 7, 31, 2, 2, 699, 700, 5, 74, 38, 2, 700, 702, 7, 10, 2, 2, 701, 703, 5, 90, 46, 2, 702, 701, 3, 2, 2, 2, 702, 703, 3, 2, 2, 2, 703, 704, 3, 2, 2, 2, 704, 707, 7, 11, 2, 2, 705, 706, 7, 70, 2, 2, 706, 708, 5, 304, 153, 2, 707, 705, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, 714, 3, 2, 2, 2, 709, 710, 7, 8, 2, 2, 710, 711, 5, 18, 10, 2, 711, 712, 7, 9, 2, 2, 712, 715, 3, 2, 2, 2, 713, 715, 7, 30, 2, 2, 714, 709, 3, 2, 2, 2, 714, 713, 3, 2, 2, 2, 715, 85, 3, 2, 2, 2, 716, 717, 7, 111, 2, 2, 717, 718, 7, 108, 2, 2, 718, 719, 5, 74, 38, 2, 719, 721, 7, 70, 2, 2, 720, 722, 5, 88, 45, 2, 721, 720, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 723, 3, 2, 2, 2, 723, 724, 5, 96, 49, 2, 724, 87, 3, 2, 2, 2, 725, 726, 7, 32, 2, 2, 726, 732, 7, 33, 2, 2, 727, 728, 7, 32, 2, 2, 728, 732, 7, 34, 2, 2, 729, 730, 7, 124, 2, 2, 730, 732, 7, 128, 2, 2, 731, 725, 3, 2, 2, 2, 731, 727, 3, 2, 2, 2, 731, 729, 3, 2, 2, 2, 732, 89, 3, 2, 2, 2, 733, 738, 5, 92, 47, 2, 734, 735, 7, 15, 2, 2, 735, 737, 5, 92, 47, 2, 736, 734, 3, 2, 2, 2, 737, 740, 3, 2, 2, 2, 738, 736, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 91, 3, 2, 2, 2, 740, 738, 3, 2, 2, 2, 741, 742, 7, 6, 2, 2, 742, 745, 5, 74, 38, 2, 743, 744, 7, 70, 2, 2, 744, 746, 5, 304, 153, 2, 745, 743, 3, 2, 2, 2, 745, 746, 3, 2, 2, 2, 746, 93, 3, 2, 2, 2, 747, 752, 5, 96, 49, 2, 748, 749, 7, 15, 2, 2, 749, 751, 5, 96, 49, 2, 750, 748, 3, 2, 2, 2, 751, 754, 3, 2, 2, 2, 752, 750, 3, 2, 2, 2, 752, 753, 3, 2, 2, 2, 753, 95, 3, 2, 2, 2, 754, 752, 3, 2, 2, 2, 755, 762, 5, 98, 50, 2, 756, 762, 5, 100, 51, 2, 757, 762, 5, 126, 64, 2, 758, 762, 5, 130, 66, 2, 759, 762, 5, 134, 68, 2, 760, 762, 5, 136, 69, 2, 761, 755, 3, 2, 2, 2, 761, 756, 3, 2, 2, 2, 761, 757, 3, 2, 2, 2, 761, 758, 3, 2, 2, 2, 761, 759, 3, 2, 2, 2, 761, 760, 3, 2, 2, 2, 762, 97, 3, 2, 2, 2, 763, 772, 5, 122, 62, 2, 764, 772, 5, 140, 71, 2, 765, 772, 5, 216, 109, 2, 766, 772, 5, 218, 110, 2, 767, 772, 5, 220, 111, 2, 768, 772, 5, 222, 112, 2, 769, 772, 5, 224, 113, 2, 770, 772, 5, 226, 114, 2, 771, 763, 3, 2, 2, 2, 771, 764, 3, 2, 2, 2, 771, 765, 3, 2, 2, 2, 771, 766, 3, 2, 2, 2, 771, 767, 3, 2, 2, 2, 771, 768, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 771, 770, 3, 2, 2, 2, 772, 99, 3, 2, 2, 2, 773, 776, 5, 102, 52, 2, 774, 776, 5, 106, 54, 2, 775, 773, 3, 2, 2, 2, 775, 774, 3, 2, 2, 2, 776, 785, 3, 2, 2, 2, 777, 784, 5, 102, 52, 2, 778, 784, 5, 106, 54, 2, 779, 784, 5, 110, 56, 2, 780, 784, 5, 112, 57, 2, 781, 784, 5, 116, 59, 2, 782, 784, 5, 120, 61, 2, 783, 777, 3, 2, 2, 2, 783, 778, 3, 2, 2, 2, 783, 779, 3, 2, 2, 2, 783, 780, 3, 2, 2, 2, 783, 781, 3, 2, 2, 2, 783, 782, 3, 2, 2, 2, 784, 787, 3, 2, 2, 2, 785, 783, 3, 2, 2, 2, 785, 786, 3, 2, 2, 2, 786, 788, 3, 2, 2, 2, 787, 785, 3, 2, 2, 2, 788, 789, 7, 67, 2, 2, 789, 790, 5, 96, 49, 2, 790, 101, 3, 2, 2, 2, 791, 792, 7, 61, 2, 2, 792, 797, 5, 104, 53, 2, 793, 794, 7, 15, 2, 2, 794, 796, 5, 104, 53, 2, 795, 793, 3, 2, 2, 2, 796, 799, 3, 2, 2, 2, 797, 795, 3, 2, 2, 2, 797, 798, 3, 2, 2, 2, 798, 103, 3, 2, 2, 2, 799, 797, 3, 2, 2, 2, 800, 803, 5, 194, 98, 2, 801, 802, 7, 70, 2, 2, 802, 804, 5, 304, 153, 2, 803, 801, 3, 2, 2, 2, 803, 804, 3, 2, 2, 2, 804, 807, 3, 2, 2, 2, 805, 806, 7, 72, 2, 2, 806, 808, 7, 73, 2, 2, 807, 805, 3, 2, 2, 2, 807, 808, 3, 2, 2, 2, 808, 811, 3, 2, 2, 2, 809, 810, 7, 71, 2, 2, 810, 812, 5, 194, 98, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 813, 3, 2, 2, 2, 813, 814, 7, 69, 2, 2, 814, 815, 5, 96, 49, 2, 815, 105, 3, 2, 2, 2, 816, 817, 7, 62, 2, 2, 817, 822, 5, 108, 55, 2, 818, 819, 7, 15, 2, 2, 819, 821, 5, 108, 55, 2, 820, 818, 3, 2, 2, 2, 821, 824, 3, 2, 2, 2, 822, 820, 3, 2, 2, 2, 822, 823, 3, 2, 2, 2, 823, 107, 3, 2, 2, 2, 824, 822, 3, 2, 2, 2, 825, 828, 5, 194, 98, 2, 826, 827, 7, 70, 2, 2, 827, 829, 5, 304, 153, 2, 828, 826, 3, 2, 2, 2, 828, 829, 3, 2, 2, 2, 829, 830, 3, 2, 2, 2, 830, 831, 7, 7, 2, 2, 831, 832, 5, 96, 49, 2, 832, 109, 3, 2, 2, 2, 833, 834, 7, 63, 2, 2, 834, 835, 5, 96, 49, 2, 835, 111, 3, 2, 2, 2, 836, 837, 7, 64, 2, 2, 837, 838, 7, 65, 2, 2, 838, 843, 5, 114, 58, 2, 839, 840, 7, 15, 2, 2, 840, 842, 5, 114, 58, 2, 841, 839, 3, 2, 2, 2, 842, 845, 3, 2, 2, 2, 843, 841, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 113, 3, 2, 2, 2, 845, 843, 3, 2, 2, 2, 846, 853, 5, 194, 98, 2, 847, 848, 7, 70, 2, 2, 848, 850, 5, 304, 153, 2, 849, 847, 3, 2, 2, 2, 849, 850, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 852, 7, 7, 2, 2, 852, 854, 5, 96, 49, 2, 853, 849, 3, 2, 2, 2, 853, 854, 3, 2, 2, 2, 854, 857, 3, 2, 2, 2, 855, 856, 7, 81, 2, 2, 856, 858, 5, 322, 162, 2, 857, 855, 3, 2, 2, 2, 857, 858, 3, 2, 2, 2, 858, 115, 3, 2, 2, 2, 859, 860, 7, 66, 2, 2, 860, 865, 7, 65, 2, 2, 861, 862, 7, 75, 2, 2, 862, 863, 7, 66, 2, 2, 863, 865, 7, 65, 2, 2, 864, 859, 3, 2, 2, 2, 864, 861, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 871, 5, 118, 60, 2, 867, 868, 7, 15, 2, 2, 868, 870, 5, 118, 60, 2, 869, 867, 3, 2, 2, 2, 870, 873, 3, 2, 2, 2, 871, 869, 3, 2, 2, 2, 871, 872, 3, 2, 2, 2, 872, 117, 3, 2, 2, 2, 873, 871, 3, 2, 2, 2, 874, 877, 5, 96, 49, 2, 875, 878, 7, 76, 2, 2, 876, 878, 7, 77, 2, 2, 877, 875, 3, 2, 2, 2, 877, 876, 3, 2, 2, 2, 877, 878, 3, 2, 2, 2, 878, 884, 3, 2, 2, 2, 879, 882, 7, 73, 2, 2, 880, 883, 7, 82, 2, 2, 881, 883, 7, 83, 2, 2, 882, 880, 3, 2, 2, 2, 882, 881, 3, 2, 2, 2, 883, 885, 3, 2, 2, 2, 884, 879, 3, 2, 2, 2, 884, 885, 3, 2, 2, 2, 885, 888, 3, 2, 2, 2, 886, 887, 7, 81, 2, 2, 887, 889, 5, 322, 162, 2, 888, 886, 3, 2, 2, 2, 888, 889, 3, 2, 2, 2, 889, 119, 3, 2, 2, 2, 890, 891, 7, 74, 2, 2, 891, 892, 5, 194, 98, 2, 892, 121, 3, 2, 2, 2, 893, 896, 7, 78, 2, 2, 894, 896, 7, 79, 2, 2, 895, 893, 3, 2, 2, 2, 895, 894, 3, 2, 2, 2, 896, 897, 3, 2, 2, 2, 897, 902, 5, 124, 63, 2, 898, 899, 7, 15, 2, 2, 899, 901, 5, 124, 63, 2, 900, 898, 3, 2, 2, 2, 901, 904, 3, 2, 2, 2, 902, 900, 3, 2, 2, 2, 902, 903, 3, 2, 2, 2, 903, 905, 3, 2, 2, 2, 904, 902, 3, 2, 2, 2, 905, 906, 7, 80, 2, 2, 906, 907, 5, 96, 49, 2, 907, 123, 3, 2, 2, 2, 908, 911, 5, 194, 98, 2, 909, 910, 7, 70, 2, 2, 910, 912, 5, 304, 153, 2, 911, 909, 3, 2, 2, 2, 911, 912, 3, 2, 2, 2, 912, 913, 3, 2, 2, 2, 913, 914, 7, 69, 2, 2, 914, 915, 5, 96, 49, 2, 915, 125, 3, 2, 2, 2, 916, 917, 7, 84, 2, 2, 917, 918, 7, 10, 2, 2, 918, 919, 5, 94, 48, 2, 919, 921, 7, 11, 2, 2, 920, 922, 5, 128, 65, 2, 921, 920, 3, 2, 2, 2, 922, 923, 3, 2, 2, 2, 923, 921, 3, 2, 2, 2, 923, 924, 3, 2, 2, 2, 924, 925, 3, 2, 2, 2, 925, 926, 7, 88, 2, 2, 926, 927, 7, 67, 2, 2, 927, 928, 5, 96, 49, 2, 928, 127, 3, 2, 2, 2, 929, 930, 7, 85, 2, 2, 930, 932, 5, 96, 49, 2, 931, 929, 3, 2, 2, 2, 932, 933, 3, 2, 2, 2, 933, 931, 3, 2, 2, 2, 933, 934, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 936, 7, 67, 2, 2, 936, 937, 5, 96, 49, 2, 937, 129, 3, 2, 2, 2, 938, 939, 7, 91, 2, 2, 939, 940, 7, 10, 2, 2, 940, 941, 5, 94, 48, 2, 941, 943, 7, 11, 2, 2, 942, 944, 5, 132, 67, 2, 943, 942, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 943, 3, 2, 2, 2, 945, 946, 3, 2, 2, 2, 946, 947, 3, 2, 2, 2, 947, 949, 7, 88, 2, 2, 948, 950, 5, 194, 98, 2, 949, 948, 3, 2, 2, 2, 949, 950, 3, 2, 2, 2, 950, 951, 3, 2, 2, 2, 951, 952, 7, 67, 2, 2, 952, 953, 5, 96, 49, 2, 953, 131, 3, 2, 2, 2, 954, 958, 7, 85, 2, 2, 955, 956, 5, 194, 98, 2, 956, 957, 7, 70, 2, 2, 957, 959, 3, 2, 2, 2, 958, 955, 3, 2, 2, 2, 958, 959, 3, 2, 2, 2, 959, 960, 3, 2, 2, 2, 960, 965, 5, 304, 153, 2, 961, 962, 7, 13, 2, 2, 962, 964, 5, 304, 153, 2, 963, 961, 3, 2, 2, 2, 964, 967, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 968, 3, 2, 2, 2, 967, 965, 3, 2, 2, 2, 968, 969, 7, 67, 2, 2, 969, 970, 5, 96, 49, 2, 970, 133, 3, 2, 2, 2, 971, 972, 7, 68, 2, 2, 972, 973, 7, 10, 2, 2, 973, 974, 5, 94, 48, 2, 974, 975, 7, 11, 2, 2, 975, 976, 7, 89, 2, 2, 976, 977, 5, 96, 49, 2, 977, 978, 7, 90, 2, 2, 978, 979, 5, 96, 49, 2, 979, 135, 3, 2, 2, 2, 980, 981, 7, 86, 2, 2, 981, 982, 7, 8, 2, 2, 982, 983, 5, 94, 48, 2, 983, 985, 7, 9, 2, 2, 984, 986, 5, 138, 70, 2, 985, 984, 3, 2, 2, 2, 986, 987, 3, 2, 2, 2, 987, 985, 3, 2, 2, 2, 987, 988, 3, 2, 2, 2, 988, 137, 3, 2, 2, 2, 989, 992, 7, 87, 2, 2, 990, 993, 7, 12, 2, 2, 991, 993, 5, 74, 38, 2, 992, 990, 3, 2, 2, 2, 992, 991, 3, 2, 2, 2, 993, 1001, 3, 2, 2, 2, 994, 997, 7, 13, 2, 2, 995, 998, 7, 12, 2, 2, 996, 998, 5, 74, 38, 2, 997, 995, 3, 2, 2, 2, 997, 996, 3, 2, 2, 2, 998, 1000, 3, 2, 2, 2, 999, 994, 3, 2, 2, 2, 1000, 1003, 3, 2, 2, 2, 1001, 999, 3, 2, 2, 2, 1001, 1002, 3, 2, 2, 2, 1002, 1004, 3, 2, 2, 2, 1003, 1001, 3, 2, 2, 2, 1004, 1005, 7, 8, 2, 2, 1005, 1006, 5, 94, 48, 2, 1006, 1007, 7, 9, 2, 2, 1007, 139, 3, 2, 2, 2, 1008, 1013, 5, 142, 72, 2, 1009, 1010, 7, 92, 2, 2, 1010, 1012, 5, 142, 72, 2, 1011, 1009, 3, 2, 2, 2, 1012, 1015, 3, 2, 2, 2, 1013, 1011, 3, 2, 2, 2, 1013, 1014, 3, 2, 2, 2, 1014, 141, 3, 2, 2, 2, 1015, 1013, 3, 2, 2, 2, 1016, 1021, 5, 144, 73, 2, 1017, 1018, 7, 93, 2, 2, 1018, 1020, 5, 144, 73, 2, 1019, 1017, 3, 2, 2, 2, 1020, 1023, 3, 2, 2, 2, 1021, 1019, 3, 2, 2, 2, 1021, 1022, 3, 2, 2, 2, 1022, 143, 3, 2, 2, 2, 1023, 1021, 3, 2, 2, 2, 1024, 1026, 7, 94, 2, 2, 1025, 1024, 3, 2, 2, 2, 1025, 1026, 3, 2, 2, 2, 1026, 1027, 3, 2, 2, 2, 1027, 1028, 5, 146, 74, 2, 1028, 145, 3, 2, 2, 2, 1029, 1032, 5, 148, 75, 2, 1030, 1031, 9, 5, 2, 2, 1031, 1033, 5, 148, 75, 2, 1032, 1030, 3, 2, 2, 2, 1032, 1033, 3, 2, 2, 2, 1033, 147, 3, 2, 2, 2, 1034, 1039, 5, 150, 76, 2, 1035, 1036, 7, 46, 2, 2, 1036, 1038, 5, 150, 76, 2, 1037, 1035, 3, 2, 2, 2, 1038, 1041, 3, 2, 2, 2, 1039, 1037, 3, 2, 2, 2, 1039, 1040, 3, 2, 2, 2, 1040, 149, 3, 2, 2, 2, 1041, 1039, 3, 2, 2, 2, 1042, 1045, 5, 152, 77, 2, 1043, 1044, 7, 95, 2, 2, 1044, 1046, 5, 152, 77, 2, 1045, 1043, 3, 2, 2, 2, 1045, 1046, 3, 2, 2, 2, 1046, 151, 3, 2, 2, 2, 1047, 1052, 5, 154, 78, 2, 1048, 1049, 9, 6, 2, 2, 1049, 1051, 5, 154, 78, 2, 1050, 1048, 3, 2, 2, 2, 1051, 1054, 3, 2, 2, 2, 1052, 1050, 3, 2, 2, 2, 1052, 1053, 3, 2, 2, 2, 1053, 153, 3, 2, 2, 2, 1054, 1052, 3, 2, 2, 2, 1055, 1060, 5, 156, 79, 2, 1056, 1057, 9, 7, 2, 2, 1057, 1059, 5, 156, 79, 2, 1058, 1056, 3, 2, 2, 2, 1059, 1062, 3, 2, 2, 2, 1060, 1058, 3, 2, 2, 2, 1060, 1061, 3, 2, 2, 2, 1061, 155, 3, 2, 2, 2, 1062, 1060, 3, 2, 2, 2, 1063, 1067, 5, 158, 80, 2, 1064, 1065, 7, 96, 2, 2, 1065, 1066, 7, 97, 2, 2, 1066, 1068, 5, 304, 153, 2, 1067, 1064, 3, 2, 2, 2, 1067, 1068, 3, 2, 2, 2, 1068, 157, 3, 2, 2, 2, 1069, 1073, 5, 160, 81, 2, 1070, 1071, 7, 99, 2, 2, 1071, 1072, 7, 98, 2, 2, 1072, 1074, 5, 304, 153, 2, 1073, 1070, 3, 2, 2, 2, 1073, 1074, 3, 2, 2, 2, 1074, 159, 3, 2, 2, 2, 1075, 1079, 5, 162, 82, 2, 1076, 1077, 7, 100, 2, 2, 1077, 1078, 7, 70, 2, 2, 1078, 1080, 5, 304, 153, 2, 1079, 1076, 3, 2, 2, 2, 1079, 1080, 3, 2, 2, 2, 1080, 161, 3, 2, 2, 2, 1081, 1085, 5, 164, 83, 2, 1082, 1083, 7, 102, 2, 2, 1083, 1084, 7, 70, 2, 2, 1084, 1086, 5, 316, 159, 2, 1085, 1082, 3, 2, 2, 2, 1085, 1086, 3, 2, 2, 2, 1086, 163, 3, 2, 2, 2, 1087, 1091, 5, 166, 84, 2, 1088, 1089, 7, 101, 2, 2, 1089, 1090, 7, 70, 2, 2, 1090, 1092, 5, 316, 159, 2, 1091, 1088, 3, 2, 2, 2, 1091, 1092, 3, 2, 2, 2, 1092, 165, 3, 2, 2, 2, 1093, 1102, 5, 170, 86, 2, 1094, 1095, 7, 5, 2, 2, 1095, 1096, 7, 44, 2, 2, 1096, 1097, 3, 2, 2, 2, 1097, 1098, 5, 168, 85, 2, 1098, 1099, 5, 206, 104, 2, 1099, 1101, 3, 2, 2, 2, 1100, 1094, 3, 2, 2, 2, 1101, 1104, 3, 2, 2, 2, 1102, 1100, 3, 2, 2, 2, 1102, 1103, 3, 2, 2, 2, 1103, 167, 3, 2, 2, 2, 1104, 1102, 3, 2, 2, 2, 1105, 1109, 5, 74, 38, 2, 1106, 1109, 5, 194, 98, 2, 1107, 1109, 5, 196, 99, 2, 1108, 1105, 3, 2, 2, 2, 1108, 1106, 3, 2, 2, 2, 1108, 1107, 3, 2, 2, 2, 1109, 169, 3, 2, 2, 2, 1110, 1112, 9, 6, 2, 2, 1111, 1110, 3, 2, 2, 2, 1112, 1115, 3, 2, 2, 2, 1113, 1111, 3, 2, 2, 2, 1113, 1114, 3, 2, 2, 2, 1114, 1116, 3, 2, 2, 2, 1115, 1113, 3, 2, 2, 2, 1116, 1117, 5, 172, 87, 2, 1117, 171, 3, 2, 2, 2, 1118, 1122, 5, 178, 90, 2, 1119, 1122, 5, 174, 88, 2, 1120, 1122, 5, 176, 89, 2, 1121, 1118, 3, 2, 2, 2, 1121, 1119, 3, 2, 2, 2, 1121, 1120, 3, 2, 2, 2, 1122, 173, 3, 2, 2, 2, 1123, 1124, 7, 109, 2, 2, 1124, 1125, 7, 108, 2, 2, 1125, 1126, 5, 304, 153, 2, 1126, 1127, 7, 8, 2, 2, 1127, 1128, 5, 94, 48, 2, 1128, 1129, 7, 9, 2, 2, 1129, 175, 3, 2, 2, 2, 1130, 1131, 7, 110, 2, 2, 1131, 1132, 7, 108, 2, 2, 1132, 1133, 5, 304, 153, 2, 1133, 1134, 7, 8, 2, 2, 1134, 1135, 5, 94, 48, 2, 1135, 1136, 7, 9, 2, 2, 1136, 177, 3, 2, 2, 2, 1137, 1142, 5, 232, 117, 2, 1138, 1139, 7, 52, 2, 2, 1139, 1141, 5, 232, 117, 2, 1140, 1138, 3, 2, 2, 2, 1141, 1144, 3, 2, 2, 2, 1142, 1140, 3, 2, 2, 2, 1142, 1143, 3, 2, 2, 2, 1143, 179, 3, 2, 2, 2, 1144, 1142, 3, 2, 2, 2, 1145, 1153, 5, 190, 96, 2, 1146, 1152, 5, 182, 92, 2, 1147, 1152, 5, 186, 94, 2, 1148, 1152, 5, 188, 95, 2, 1149, 1152, 5, 184, 93, 2, 1150, 1152, 5, 206, 104, 2, 1151, 1146, 3, 2, 2, 2, 1151, 1147, 3, 2, 2, 2, 1151, 1148, 3, 2, 2, 2, 1151, 1149, 3, 2, 2, 2, 1151, 1150, 3, 2, 2, 2, 1152, 1155, 3, 2, 2, 2, 1153, 1151, 3, 2, 2, 2, 1153, 1154, 3, 2, 2, 2, 1154, 181, 3, 2, 2, 2, 1155, 1153, 3, 2, 2, 2, 1156, 1157, 7, 53, 2, 2, 1157, 1158, 7, 53, 2, 2, 1158, 1159, 5, 94, 48, 2, 1159, 1160, 7, 54, 2, 2, 1160, 1161, 7, 54, 2, 2, 1161, 183, 3, 2, 2, 2, 1162, 1163, 7, 53, 2, 2, 1163, 1164, 7, 54, 2, 2, 1164, 185, 3, 2, 2, 2, 1165, 1166, 7, 53, 2, 2, 1166, 1167, 5, 94, 48, 2, 1167, 1168, 7, 54, 2, 2, 1168, 187, 3, 2, 2, 2, 1169, 1176, 7, 55, 2, 2, 1170, 1177, 5, 326, 164, 2, 1171, 1177, 5, 324, 163, 2, 1172, 1177, 7, 176, 2, 2, 1173, 1177, 5, 196, 99, 2, 1174, 1177, 5, 194, 98, 2, 1175, 1177, 5, 198, 100, 2, 1176, 1170, 3, 2, 2, 2, 1176, 1171, 3, 2, 2, 2, 1176, 1172, 3, 2, 2, 2, 1176, 1173, 3, 2, 2, 2, 1176, 1174, 3, 2, 2, 2, 1176, 1175, 3, 2, 2, 2, 1177, 189, 3, 2, 2, 2, 1178, 1194, 7, 169, 2, 2, 1179, 1194, 7, 106, 2, 2, 1180, 1194, 7, 107, 2, 2, 1181, 1194, 7, 170, 2, 2, 1182, 1194, 5, 324, 163, 2, 1183, 1194, 5, 194, 98, 2, 1184, 1194, 5, 196, 99, 2, 1185, 1194, 5, 198, 100, 2, 1186, 1194, 5, 306, 154, 2, 1187, 1194, 5, 204, 103, 2, 1188, 1194, 5, 200, 101, 2, 1189, 1194, 5, 202, 102, 2, 1190, 1194, 5, 320, 161, 2, 1191, 1194, 5, 210, 106, 2, 1192, 1194, 5, 192, 97, 2, 1193, 1178, 3, 2, 2, 2, 1193, 1179, 3, 2, 2, 2, 1193, 1180, 3, 2, 2, 2, 1193, 1181, 3, 2, 2, 2, 1193, 1182, 3, 2, 2, 2, 1193, 1183, 3, 2, 2, 2, 1193, 1184, 3, 2, 2, 2, 1193, 1185, 3, 2, 2, 2, 1193, 1186, 3, 2, 2, 2, 1193, 1187, 3, 2, 2, 2, 1193, 1188, 3, 2, 2, 2, 1193, 1189, 3, 2, 2, 2, 1193, 1190, 3, 2, 2, 2, 1193, 1191, 3, 2, 2, 2, 1193, 1192, 3, 2, 2, 2, 1194, 191, 3, 2, 2, 2, 1195, 1196, 7, 8, 2, 2, 1196, 1197, 5, 16, 9, 2, 1197, 1198, 7, 9, 2, 2, 1198, 193, 3, 2, 2, 2, 1199, 1200, 7, 6, 2, 2, 1200, 1201, 5, 74, 38, 2, 1201, 195, 3, 2, 2, 2, 1202, 1204, 7, 10, 2, 2, 1203, 1205, 5, 94, 48, 2, 1204, 1203, 3, 2, 2, 2, 1204, 1205, 3, 2, 2, 2, 1205, 1206, 3, 2, 2, 2, 1206, 1207, 7, 11, 2, 2, 1207, 197, 3, 2, 2, 2, 1208, 1209, 7, 56, 2, 2, 1209, 199, 3, 2, 2, 2, 1210, 1211, 7, 17, 2, 2, 1211, 1212, 7, 8, 2, 2, 1212, 1213, 5, 94, 48, 2, 1213, 1214, 7, 9, 2, 2, 1214, 201, 3, 2, 2, 2, 1215, 1216, 7, 105, 2, 2, 1216, 1217, 7, 8, 2, 2, 1217, 1218, 5, 94, 48, 2, 1218, 1219, 7, 9, 2, 2, 1219, 203, 3, 2, 2, 2, 1220, 1221, 5, 74, 38, 2, 1221, 1222, 5, 206, 104, 2, 1222, 205, 3, 2, 2, 2, 1223, 1230, 7, 10, 2, 2, 1224, 1226, 5, 208, 105, 2, 1225, 1227, 7, 15, 2, 2, 1226, 1225, 3, 2, 2, 2, 1226, 1227, 3, 2, 2, 2, 1227, 1229, 3, 2, 2, 2, 1228, 1224, 3, 2, 2, 2, 1229, 1232, 3, 2, 2, 2, 1230, 1228, 3, 2, 2, 2, 1230, 1231, 3, 2, 2, 2, 1231, 1233, 3, 2, 2, 2, 1232, 1230, 3, 2, 2, 2, 1233, 1234, 7, 11, 2, 2, 1234, 207, 3, 2, 2, 2, 1235, 1238, 5, 96, 49, 2, 1236, 1238, 7, 168, 2, 2, 1237, 1235, 3, 2, 2, 2, 1237, 1236, 3, 2, 2, 2, 1238, 209, 3, 2, 2, 2, 1239, 1242, 5, 212, 107, 2, 1240, 1242, 5, 214, 108, 2, 1241, 1239, 3, 2, 2, 2, 1241, 1240, 3, 2, 2, 2, 1242, 211, 3, 2, 2, 2, 1243, 1244, 5, 74, 38, 2, 1244, 1245, 7, 57, 2, 2, 1245, 1246, 7, 170, 2, 2, 1246, 213, 3, 2, 2, 2, 1247, 1248, 5, 52, 27, 2, 1248, 1249, 7, 31, 2, 2, 1249, 1251, 7, 10, 2, 2, 1250, 1252, 5, 90, 46, 2, 1251, 1250, 3, 2, 2, 2, 1251, 1252, 3, 2, 2, 2, 1252, 1253, 3, 2, 2, 2, 1253, 1256, 7, 11, 2, 2, 1254, 1255, 7, 70, 2, 2, 1255, 1257, 5, 304, 153, 2, 1256, 1254, 3, 2, 2, 2, 1256, 1257, 3, 2, 2, 2, 1257, 1258, 3, 2, 2, 2, 1258, 1259, 7, 8, 2, 2, 1259, 1260, 5, 18, 10, 2, 1260, 1261, 7, 9, 2, 2, 1261, 215, 3, 2, 2, 2, 1262, 1263, 7, 115, 2, 2, 1263, 1264, 7, 124, 2, 2, 1264, 1265, 5, 96, 49, 2, 1265, 1266, 7, 122, 2, 2, 1266, 1270, 5, 96, 49, 2, 1267, 1268, 7, 71, 2, 2, 1268, 1269, 7, 126, 2, 2, 1269, 1271, 5, 96, 49, 2, 1270, 1267, 3, 2, 2, 2, 1270, 1271, 3, 2, 2, 2, 1271, 1286, 3, 2, 2, 2, 1272, 1273, 7, 115, 2, 2, 1273, 1274, 7, 124, 2, 2, 1274, 1279, 5, 318, 160, 2, 1275, 1276, 7, 15, 2, 2, 1276, 1278, 5, 318, 160, 2, 1277, 1275, 3, 2, 2, 2, 1278, 1281, 3, 2, 2, 2, 1279, 1277, 3, 2, 2, 2, 1279, 1280, 3, 2, 2, 2, 1280, 1282, 3, 2, 2, 2, 1281, 1279, 3, 2, 2, 2, 1282, 1283, 7, 122, 2, 2, 1283, 1284, 5, 96, 49, 2, 1284, 1286, 3, 2, 2, 2, 1285, 1262, 3, 2, 2, 2, 1285, 1272, 3, 2, 2, 2, 1286, 217, 3, 2, 2, 2, 1287, 1288, 7, 116, 2, 2, 1288, 1289, 7, 124, 2, 2, 1289, 1290, 5, 228, 115, 2, 1290, 219, 3, 2, 2, 2, 1291, 1292, 7, 117, 2, 2, 1292, 1293, 7, 124, 2, 2, 1293, 1294, 5, 228, 115, 2, 1294, 1295, 7, 70, 2, 2, 1295, 1296, 5, 96, 49, 2, 1296, 221, 3, 2, 2, 2, 1297, 1298, 7, 118, 2, 2, 1298, 1299, 7, 123, 2, 2, 1299, 1300, 7, 97, 2, 2, 1300, 1301, 7, 124, 2, 2, 1301, 1302, 5, 228, 115, 2, 1302, 1303, 7, 125, 2, 2, 1303, 1304, 5, 96, 49, 2, 1304, 223, 3, 2, 2, 2, 1305, 1306, 7, 119, 2, 2, 1306, 1311, 5, 230, 116, 2, 1307, 1308, 7, 15, 2, 2, 1308, 1310, 5, 230, 116, 2, 1309, 1307, 3, 2, 2, 2, 1310, 1313, 3, 2, 2, 2, 1311, 1309, 3, 2, 2, 2, 1311, 1312, 3, 2, 2, 2, 1312, 1314, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1314, 1315, 7, 120, 2, 2, 1315, 1316, 5, 96, 49, 2, 1316, 1317, 7, 67, 2, 2, 1317, 1318, 5, 96, 49, 2, 1318, 225, 3, 2, 2, 2, 1319, 1320, 7, 121, 2, 2, 1320, 1321, 7, 124, 2, 2, 1321, 1322, 5, 96, 49, 2, 1322, 1323, 7, 122, 2, 2, 1323, 1324, 5, 96, 49, 2, 1324, 227, 3, 2, 2, 2, 1325, 1328, 5, 190, 96, 2, 1326, 1329, 5, 182, 92, 2, 1327, 1329, 5, 188, 95, 2, 1328, 1326, 3, 2, 2, 2, 1328, 1327, 3, 2, 2, 2, 1329, 1330, 3, 2, 2, 2, 1330, 1328, 3, 2, 2, 2, 1330, 1331, 3, 2, 2, 2, 1331, 229, 3, 2, 2, 2, 1332, 1333, 5, 194, 98, 2, 1333, 1334, 7, 7, 2, 2, 1334, 1335, 5, 96, 49, 2, 1335, 231, 3, 2, 2, 2, 1336, 1338, 7, 131, 2, 2, 1337, 1339, 5, 234, 118, 2, 1338, 1337, 3, 2, 2, 2, 1338, 1339, 3, 2, 2, 2, 1339, 1344, 3, 2, 2, 2, 1340, 1341, 7, 132, 2, 2, 1341, 1344, 5, 234, 118, 2, 1342, 1344, 5, 234, 118, 2, 1343, 1336, 3, 2, 2, 2, 1343, 1340, 3, 2, 2, 2, 1343, 1342, 3, 2, 2, 2, 1344, 233, 3, 2, 2, 2, 1345, 1350, 5, 236, 119, 2, 1346, 1347, 9, 8, 2, 2, 1347, 1349, 5, 236, 119, 2, 1348, 1346, 3, 2, 2, 2, 1349, 1352, 3, 2, 2, 2, 1350, 1348, 3, 2, 2, 2, 1350, 1351, 3, 2, 2, 2, 1351, 235, 3, 2, 2, 2, 1352, 1350, 3, 2, 2, 2, 1353, 1356, 5, 180, 91, 2, 1354, 1356, 5, 238, 120, 2, 1355, 1353, 3, 2, 2, 2, 1355, 1354, 3, 2, 2, 2, 1356, 237, 3, 2, 2, 2, 1357, 1360, 5, 246, 124, 2, 1358, 1360, 5, 240, 121, 2, 1359, 1357, 3, 2, 2, 2, 1359, 1358, 3, 2, 2, 2, 1360, 1361, 3, 2, 2, 2, 1361, 1362, 5, 262, 132, 2, 1362, 239, 3, 2, 2, 2, 1363, 1364, 5, 242, 122, 2, 1364, 1365, 5, 252, 127, 2, 1365, 1368, 3, 2, 2, 2, 1366, 1368, 5, 244, 123, 2, 1367, 1363, 3, 2, 2, 2, 1367, 1366, 3, 2, 2, 2, 1368, 241, 3, 2, 2, 2, 1369, 1370, 9, 9, 2, 2, 1370, 1371, 7, 19, 2, 2, 1371, 1372, 7, 19, 2, 2, 1372, 243, 3, 2, 2, 2, 1373, 1374, 7, 133, 2, 2, 1374, 1375, 5, 252, 127, 2, 1375, 245, 3, 2, 2, 2, 1376, 1377, 5, 248, 125, 2, 1377, 1378, 5, 252, 127, 2, 1378, 1381, 3, 2, 2, 2, 1379, 1381, 5, 250, 126, 2, 1380, 1376, 3, 2, 2, 2, 1380, 1379, 3, 2, 2, 2, 1381, 247, 3, 2, 2, 2, 1382, 1383, 9, 10, 2, 2, 1383, 1384, 7, 19, 2, 2, 1384, 1385, 7, 19, 2, 2, 1385, 249, 3, 2, 2, 2, 1386, 1387, 7, 58, 2, 2, 1387, 251, 3, 2, 2, 2, 1388, 1391, 5, 254, 128, 2, 1389, 1391, 5, 264, 133, 2, 1390, 1388, 3, 2, 2, 2, 1390, 1389, 3, 2, 2, 2, 1391, 253, 3, 2, 2, 2, 1392, 1395, 5, 74, 38, 2, 1393, 1395, 5, 256, 129, 2, 1394, 1392, 3, 2, 2, 2, 1394, 1393, 3, 2, 2, 2, 1395, 255, 3, 2, 2, 2, 1396, 1400, 7, 12, 2, 2, 1397, 1400, 5, 258, 130, 2, 1398, 1400, 5, 260, 131, 2, 1399, 1396, 3, 2, 2, 2, 1399, 1397, 3, 2, 2, 2, 1399, 1398, 3, 2, 2, 2, 1400, 257, 3, 2, 2, 2, 1401, 1402, 7, 176, 2, 2, 1402, 1403, 7, 19, 2, 2, 1403, 1404, 7, 12, 2, 2, 1404, 259, 3, 2, 2, 2, 1405, 1406, 7, 12, 2, 2, 1406, 1407, 7, 19, 2, 2, 1407, 1408, 7, 176, 2, 2, 1408, 261, 3, 2, 2, 2, 1409, 1411, 5, 186, 94, 2, 1410, 1409, 3, 2, 2, 2, 1411, 1414, 3, 2, 2, 2, 1412, 1410, 3, 2, 2, 2, 1412, 1413, 3, 2, 2, 2, 1413, 263, 3, 2, 2, 2, 1414, 1412, 3, 2, 2, 2, 1415, 1427, 5, 270, 136, 2, 1416, 1427, 5, 288, 145, 2, 1417, 1427, 5, 280, 141, 2, 1418, 1427, 5, 292, 147, 2, 1419, 1427, 5, 284, 143, 2, 1420, 1427, 5, 278, 140, 2, 1421, 1427, 5, 274, 138, 2, 1422, 1427, 5, 272, 137, 2, 1423, 1427, 5, 276, 139, 2, 1424, 1427, 5, 268, 135, 2, 1425, 1427, 5, 266, 134, 2, 1426, 1415, 3, 2, 2, 2, 1426, 1416, 3, 2, 2, 2, 1426, 1417, 3, 2, 2, 2, 1426, 1418, 3, 2, 2, 2, 1426, 1419, 3, 2, 2, 2, 1426, 1420, 3, 2, 2, 2, 1426, 1421, 3, 2, 2, 2, 1426, 1422, 3, 2, 2, 2, 1426, 1423, 3, 2, 2, 2, 1426, 1424, 3, 2, 2, 2, 1426, 1425, 3, 2, 2, 2, 1427, 265, 3, 2, 2, 2, 1428, 1429, 7, 146, 2, 2, 1429, 1430, 7, 10, 2, 2, 1430, 1431, 7, 11, 2, 2, 1431, 267, 3, 2, 2, 2, 1432, 1433, 7, 147, 2, 2, 1433, 1434, 7, 10, 2, 2, 1434, 1435, 7, 11, 2, 2, 1435, 269, 3, 2, 2, 2, 1436, 1437, 7, 149, 2, 2, 1437, 1440, 7, 10, 2, 2, 1438, 1441, 5, 288, 145, 2, 1439, 1441, 5, 292, 147, 2, 1440, 1438, 3, 2, 2, 2, 1440, 1439, 3, 2, 2, 2, 1440, 1441, 3, 2, 2, 2, 1441, 1442, 3, 2, 2, 2, 1442, 1443, 7, 11, 2, 2, 1443, 271, 3, 2, 2, 2, 1444, 1445, 7, 150, 2, 2, 1445, 1446, 7, 10, 2, 2, 1446, 1447, 7, 11, 2, 2, 1447, 273, 3, 2, 2, 2, 1448, 1449, 7, 160, 2, 2, 1449, 1450, 7, 10, 2, 2, 1450, 1451, 7, 11, 2, 2, 1451, 275, 3, 2, 2, 2, 1452, 1453, 7, 152, 2, 2, 1453, 1454, 7, 10, 2, 2, 1454, 1455, 7, 11, 2, 2, 1455, 277, 3, 2, 2, 2, 1456, 1457, 7, 151, 2, 2, 1457, 1460, 7, 10, 2, 2, 1458, 1461, 7, 176, 2, 2, 1459, 1461, 5, 324, 163, 2, 1460, 1458, 3, 2, 2, 2, 1460, 1459, 3, 2, 2, 2, 1460, 1461, 3, 2, 2, 2, 1461, 1462, 3, 2, 2, 2, 1462, 1463, 7, 11, 2, 2, 1463, 279, 3, 2, 2, 2, 1464, 1465, 7, 136, 2, 2, 1465, 1471, 7, 10, 2, 2, 1466, 1469, 5, 282, 142, 2, 1467, 1468, 7, 15, 2, 2, 1468, 1470, 5, 302, 152, 2, 1469, 1467, 3, 2, 2, 2, 1469, 1470, 3, 2, 2, 2, 1470, 1472, 3, 2, 2, 2, 1471, 1466, 3, 2, 2, 2, 1471, 1472, 3, 2, 2, 2, 1472, 1473, 3, 2, 2, 2, 1473, 1474, 7, 11, 2, 2, 1474, 281, 3, 2, 2, 2, 1475, 1478, 5, 296, 149, 2, 1476, 1478, 7, 12, 2, 2, 1477, 1475, 3, 2, 2, 2, 1477, 1476, 3, 2, 2, 2, 1478, 283, 3, 2, 2, 2, 1479, 1480, 7, 153, 2, 2, 1480, 1481, 7, 10, 2, 2, 1481, 1482, 5, 286, 144, 2, 1482, 1483, 7, 11, 2, 2, 1483, 285, 3, 2, 2, 2, 1484, 1485, 5, 296, 149, 2, 1485, 287, 3, 2, 2, 2, 1486, 1487, 7, 130, 2, 2, 1487, 1496, 7, 10, 2, 2, 1488, 1494, 5, 290, 146, 2, 1489, 1490, 7, 15, 2, 2, 1490, 1492, 5, 302, 152, 2, 1491, 1493, 7, 168, 2, 2, 1492, 1491, 3, 2, 2, 2, 1492, 1493, 3, 2, 2, 2, 1493, 1495, 3, 2, 2, 2, 1494, 1489, 3, 2, 2, 2, 1494, 1495, 3, 2, 2, 2, 1495, 1497, 3, 2, 2, 2, 1496, 1488, 3, 2, 2, 2, 1496, 1497, 3, 2, 2, 2, 1497, 1498, 3, 2, 2, 2, 1498, 1499, 7, 11, 2, 2, 1499, 289, 3, 2, 2, 2, 1500, 1503, 5, 298, 150, 2, 1501, 1503, 7, 12, 2, 2, 1502, 1500, 3, 2, 2, 2, 1502, 1501, 3, 2, 2, 2, 1503, 291, 3, 2, 2, 2, 1504, 1505, 7, 154, 2, 2, 1505, 1506, 7, 10, 2, 2, 1506, 1507, 5, 294, 148, 2, 1507, 1508, 7, 11, 2, 2, 1508, 293, 3, 2, 2, 2, 1509, 1510, 5, 298, 150, 2, 1510, 295, 3, 2, 2, 2, 1511, 1512, 5, 74, 38, 2, 1512, 297, 3, 2, 2, 2, 1513, 1514, 5, 74, 38, 2, 1514, 299, 3, 2, 2, 2, 1515, 1516, 5, 302, 152, 2, 1516, 301, 3, 2, 2, 2, 1517, 1518, 5, 74, 38, 2, 1518, 303, 3, 2, 2, 2, 1519, 1520, 7, 10, 2, 2, 1520, 1528, 7, 11, 2, 2, 1521, 1525, 5, 308, 155, 2, 1522, 1526, 7, 168, 2, 2, 1523, 1526, 7, 12, 2, 2, 1524, 1526, 7, 47, 2, 2, 1525, 1522, 3, 2, 2, 2, 1525, 1523, 3, 2, 2, 2, 1525, 1524, 3, 2, 2, 2, 1525, 1526, 3, 2, 2, 2, 1526, 1528, 3, 2, 2, 2, 1527, 1519, 3, 2, 2, 2, 1527, 1521, 3, 2, 2, 2, 1528, 305, 3, 2, 2, 2, 1529, 1538, 7, 8, 2, 2, 1530, 1535, 5, 318, 160, 2, 1531, 1532, 7, 15, 2, 2, 1532, 1534, 5, 318, 160, 2, 1533, 1531, 3, 2, 2, 2, 1534, 1537, 3, 2, 2, 2, 1535, 1533, 3, 2, 2, 2, 1535, 1536, 3, 2, 2, 2, 1536, 1539, 3, 2, 2, 2, 1537, 1535, 3, 2, 2, 2, 1538, 1530, 3, 2, 2, 2, 1538, 1539, 3, 2, 2, 2, 1539, 1540, 3, 2, 2, 2, 1540, 1546, 7, 9, 2, 2, 1541, 1542, 7, 59, 2, 2, 1542, 1543, 5, 94, 48, 2, 1543, 1544, 7, 60, 2, 2, 1544, 1546, 3, 2, 2, 2, 1545, 1529, 3, 2, 2, 2, 1545, 1541, 3, 2, 2, 2, 1546, 307, 3, 2, 2, 2, 1547, 1551, 5, 74, 38, 2, 1548, 1551, 7, 169, 2, 2, 1549, 1551, 5, 310, 156, 2, 1550, 1547, 3, 2, 2, 2, 1550, 1548, 3, 2, 2, 2, 1550, 1549, 3, 2, 2, 2, 1551, 309, 3, 2, 2, 2, 1552, 1555, 5, 312, 157, 2, 1553, 1555, 5, 314, 158, 2, 1554, 1552, 3, 2, 2, 2, 1554, 1553, 3, 2, 2, 2, 1555, 311, 3, 2, 2, 2, 1556, 1557, 7, 31, 2, 2, 1557, 1558, 7, 10, 2, 2, 1558, 1559, 7, 12, 2, 2, 1559, 1560, 7, 11, 2, 2, 1560, 313, 3, 2, 2, 2, 1561, 1562, 7, 31, 2, 2, 1562, 1571, 7, 10, 2, 2, 1563, 1568, 5, 304, 153, 2, 1564, 1565, 7, 15, 2, 2, 1565, 1567, 5, 304, 153, 2, 1566, 1564, 3, 2, 2, 2, 1567, 1570, 3, 2, 2, 2, 1568, 1566, 3, 2, 2, 2, 1568, 1569, 3, 2, 2, 2, 1569, 1572, 3, 2, 2, 2, 1570, 1568, 3, 2, 2, 2, 1571, 1563, 3, 2, 2, 2, 1571, 1572, 3, 2, 2, 2, 1572, 1573, 3, 2, 2, 2, 1573, 1574, 7, 11, 2, 2, 1574, 1575, 7, 70, 2, 2, 1575, 1576, 5, 304, 153, 2, 1576, 315, 3, 2, 2, 2, 1577, 1579, 5, 308, 155, 2, 1578, 1580, 7, 168, 2, 2, 1579, 1578, 3, 2, 2, 2, 1579, 1580, 3, 2, 2, 2, 1580, 317, 3, 2, 2, 2, 1581, 1584, 5, 96, 49, 2, 1582, 1584, 7, 176, 2, 2, 1583, 1581, 3, 2, 2, 2, 1583, 1582, 3, 2, 2, 2, 1584, 1585, 3, 2, 2, 2, 1585, 1586, 9, 11, 2, 2, 1586, 1587, 5, 96, 49, 2, 1587, 319, 3, 2, 2, 2, 1588, 1590, 7, 53, 2, 2, 1589, 1591, 5, 94, 48, 2, 1590, 1589, 3, 2, 2, 2, 1590, 1591, 3, 2, 2, 2, 1591, 1592, 3, 2, 2, 2, 1592, 1593, 7, 54, 2, 2, 1593, 321, 3, 2, 2, 2, 1594, 1595, 5, 324, 163, 2, 1595, 323, 3, 2, 2, 2, 1596, 1597, 7, 167, 2, 2, 1597, 325, 3, 2, 2, 2, 1598, 1599, 9, 12, 2, 2, 1599, 327, 3, 2, 2, 2, 155, 336, 340, 356, 362, 370, 378, 386, 401, 431, 439, 441, 463, 473, 483, 488, 493, 497, 509, 513, 522, 529, 543, 547, 552, 562, 570, 574, 586, 598, 620, 628, 633, 636, 640, 649, 658, 661, 669, 676, 678, 685, 692, 694, 702, 707, 714, 721, 731, 738, 745, 752, 761, 771, 775, 783, 785, 797, 803, 807, 811, 822, 828, 843, 849, 853, 857, 864, 871, 877, 882, 884, 888, 895, 902, 911, 923, 933, 945, 949, 958, 965, 987, 992, 997, 1001, 1013, 1021, 1025, 1032, 1039, 1045, 1052, 1060, 1067, 1073, 1079, 1085, 1091, 1102, 1108, 1113, 1121, 1142, 1151, 1153, 1176, 1193, 1204, 1226, 1230, 1237, 1241, 1251, 1256, 1270, 1279, 1285, 1311, 1328, 1330, 1338, 1343, 1350, 1355, 1359, 1367, 1380, 1390, 1394, 1399, 1412, 1426, 1440, 1460, 1469, 1471, 1477, 1492, 1494, 1496, 1502, 1525, 1527, 1535, 1538, 1545, 1550, 1554, 1568, 1571, 1579, 1583, 1590] \ No newline at end of file diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.tokens b/src/main/java/org/rumbledb/parser/Jsoniq.tokens index ee3ace15f..488d2a227 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.tokens +++ b/src/main/java/org/rumbledb/parser/Jsoniq.tokens @@ -122,60 +122,58 @@ Kvalue=121 Kjson=122 Kwith=123 Kposition=124 -Kbreak=125 -Kloop=126 -Kcontinue=127 -Kexit=128 -Kreturning=129 -Kwhile=130 -Kimport=131 -Kschema=132 -Knamespace=133 -Kelement=134 -Kslash=135 -Kdslash=136 -Kat_symbol=137 -Kchild=138 -Kdescendant=139 -Kattribute=140 -Kself=141 -Kdescendant_or_self=142 -Kfollowing_sibling=143 -Kfollowing=144 -Kparent=145 -Kancestor=146 -Kpreceding_sibling=147 -Kpreceding=148 -Kancestor_or_self=149 -Knode=150 -Kbinary=151 -Kdocument=152 -Kdocument_node=153 -Ktext=154 -Kpi=155 -Knamespace_node=156 -Kschema_attribute=157 -Kschema_element=158 -Karray_node=159 -Kboolean_node=160 -Knull_node=161 -Knumber_node=162 -Kobject_node=163 -Kcomment=164 -Karray=165 -Kmap=166 -STRING=167 -ArgumentPlaceholder=168 -NullLiteral=169 -Literal=170 -NumericLiteral=171 -IntegerLiteral=172 -DecimalLiteral=173 -DoubleLiteral=174 -WS=175 -NCName=176 -XQComment=177 -ContentChar=178 +Kimport=125 +Kschema=126 +Knamespace=127 +Kelement=128 +Kslash=129 +Kdslash=130 +Kat_symbol=131 +Kchild=132 +Kdescendant=133 +Kattribute=134 +Kself=135 +Kdescendant_or_self=136 +Kfollowing_sibling=137 +Kfollowing=138 +Kparent=139 +Kancestor=140 +Kpreceding_sibling=141 +Kpreceding=142 +Kancestor_or_self=143 +Knode=144 +Kbinary=145 +Kdocument=146 +Kdocument_node=147 +Ktext=148 +Kpi=149 +Knamespace_node=150 +Kschema_attribute=151 +Kschema_element=152 +Karray_node=153 +Kboolean_node=154 +Knull_node=155 +Knumber_node=156 +Kobject_node=157 +Kcomment=158 +Kbreak=159 +Kloop=160 +Kcontinue=161 +Kexit=162 +Kreturning=163 +Kwhile=164 +STRING=165 +ArgumentPlaceholder=166 +NullLiteral=167 +Literal=168 +NumericLiteral=169 +IntegerLiteral=170 +DecimalLiteral=171 +DoubleLiteral=172 +WS=173 +NCName=174 +XQComment=175 +ContentChar=176 ';'=1 'module'=2 '='=3 @@ -300,47 +298,45 @@ ContentChar=178 'json'=122 'with'=123 'position'=124 -'break'=125 -'loop'=126 -'continue'=127 -'exit'=128 -'returning'=129 -'while'=130 -'import'=131 -'schema'=132 -'namespace'=133 -'element'=134 -'/'=135 -'//'=136 -'@'=137 -'child'=138 -'descendant'=139 -'attribute'=140 -'self'=141 -'descendant-or-self'=142 -'following-sibling'=143 -'following'=144 -'parent'=145 -'ancestor'=146 -'preceding-sibling'=147 -'preceding'=148 -'ancestor-or-self'=149 -'node'=150 -'binary'=151 -'document'=152 -'document-node'=153 -'text'=154 -'processing-instruction'=155 -'namespace-node'=156 -'schema-attribute'=157 -'schema-element'=158 -'array-node'=159 -'boolean-node'=160 -'null-node'=161 -'number-node'=162 -'object-node'=163 -'comment'=164 -'array'=165 -'map'=166 -'?'=168 -'null'=169 +'import'=125 +'schema'=126 +'namespace'=127 +'element'=128 +'/'=129 +'//'=130 +'@'=131 +'child'=132 +'descendant'=133 +'attribute'=134 +'self'=135 +'descendant-or-self'=136 +'following-sibling'=137 +'following'=138 +'parent'=139 +'ancestor'=140 +'preceding-sibling'=141 +'preceding'=142 +'ancestor-or-self'=143 +'node'=144 +'binary'=145 +'document'=146 +'document-node'=147 +'text'=148 +'processing-instruction'=149 +'namespace-node'=150 +'schema-attribute'=151 +'schema-element'=152 +'array-node'=153 +'boolean-node'=154 +'null-node'=155 +'number-node'=156 +'object-node'=157 +'comment'=158 +'break'=159 +'loop'=160 +'continue'=161 +'exit'=162 +'returning'=163 +'while'=164 +'?'=166 +'null'=167 diff --git a/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java b/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java index dcd29befe..ef10d488d 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java +++ b/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java @@ -819,20 +819,6 @@ public class JsoniqBaseVisitor extends AbstractParseTreeVisitor implements * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitCopyDecl(JsoniqParser.CopyDeclContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitSchemaImport(JsoniqParser.SchemaImportContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitSchemaPrefix(JsoniqParser.SchemaPrefixContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -959,20 +945,6 @@ public class JsoniqBaseVisitor extends AbstractParseTreeVisitor implements * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitPredicateList(JsoniqParser.PredicateListContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitItemType(JsoniqParser.ItemTypeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitAtomicOrUnionType(JsoniqParser.AtomicOrUnionTypeContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1050,6 +1022,13 @@ public class JsoniqBaseVisitor extends AbstractParseTreeVisitor implements * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitSchemaAttributeTest(JsoniqParser.SchemaAttributeTestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAttributeDeclaration(JsoniqParser.AttributeDeclarationContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1112,112 +1091,21 @@ public class JsoniqBaseVisitor extends AbstractParseTreeVisitor implements *

The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.

*/ - @Override public T visitMapTest(JsoniqParser.MapTestContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitAnyMapTest(JsoniqParser.AnyMapTestContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitTypedMapTest(JsoniqParser.TypedMapTestContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitArrayTest(JsoniqParser.ArrayTestContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitAnyArrayTest(JsoniqParser.AnyArrayTestContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitTypedArrayTest(JsoniqParser.TypedArrayTestContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitParenthesizedItemTest(JsoniqParser.ParenthesizedItemTestContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitAttributeDeclaration(JsoniqParser.AttributeDeclarationContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitMlNodeTest(JsoniqParser.MlNodeTestContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitMlArrayNodeTest(JsoniqParser.MlArrayNodeTestContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitMlObjectNodeTest(JsoniqParser.MlObjectNodeTestContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitMlNumberNodeTest(JsoniqParser.MlNumberNodeTestContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitMlBooleanNodeTest(JsoniqParser.MlBooleanNodeTestContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitMlNullNodeTest(JsoniqParser.MlNullNodeTestContext ctx) { return visitChildren(ctx); } + @Override public T visitSequenceType(JsoniqParser.SequenceTypeContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * *

The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.

*/ - @Override public T visitSequenceType(JsoniqParser.SequenceTypeContext ctx) { return visitChildren(ctx); } + @Override public T visitObjectConstructor(JsoniqParser.ObjectConstructorContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * *

The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.

*/ - @Override public T visitObjectConstructor(JsoniqParser.ObjectConstructorContext ctx) { return visitChildren(ctx); } + @Override public T visitItemType(JsoniqParser.ItemTypeContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.interp b/src/main/java/org/rumbledb/parser/JsoniqLexer.interp index a9241f1e8..444f74a25 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.interp +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.interp @@ -124,12 +124,6 @@ null 'json' 'with' 'position' -'break' -'loop' -'continue' -'exit' -'returning' -'while' 'import' 'schema' 'namespace' @@ -164,8 +158,12 @@ null 'number-node' 'object-node' 'comment' -'array' -'map' +'break' +'loop' +'continue' +'exit' +'returning' +'while' null '?' 'null' @@ -305,12 +303,6 @@ Kvalue Kjson Kwith Kposition -Kbreak -Kloop -Kcontinue -Kexit -Kreturning -Kwhile Kimport Kschema Knamespace @@ -345,8 +337,12 @@ Knull_node Knumber_node Kobject_node Kcomment -Karray -Kmap +Kbreak +Kloop +Kcontinue +Kexit +Kreturning +Kwhile STRING ArgumentPlaceholder NullLiteral @@ -485,12 +481,6 @@ Kvalue Kjson Kwith Kposition -Kbreak -Kloop -Kcontinue -Kexit -Kreturning -Kwhile Kimport Kschema Knamespace @@ -525,8 +515,12 @@ Knull_node Knumber_node Kobject_node Kcomment -Karray -Kmap +Kbreak +Kloop +Kcontinue +Kexit +Kreturning +Kwhile STRING ESC UNICODE @@ -554,4 +548,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 180, 1610, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 4, 181, 9, 181, 4, 182, 9, 182, 4, 183, 9, 183, 4, 184, 9, 184, 4, 185, 9, 185, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 7, 168, 1496, 10, 168, 12, 168, 14, 168, 1499, 11, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 5, 169, 1506, 10, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 171, 3, 171, 3, 172, 3, 172, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 174, 3, 174, 3, 175, 3, 175, 3, 175, 5, 175, 1528, 10, 175, 3, 176, 3, 176, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 7, 177, 1537, 10, 177, 12, 177, 14, 177, 1540, 11, 177, 5, 177, 1542, 10, 177, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 7, 178, 1549, 10, 178, 12, 178, 14, 178, 1552, 11, 178, 5, 178, 1554, 10, 178, 5, 178, 1556, 10, 178, 3, 178, 3, 178, 5, 178, 1560, 10, 178, 3, 178, 3, 178, 3, 179, 6, 179, 1565, 10, 179, 13, 179, 14, 179, 1566, 3, 180, 3, 180, 3, 180, 3, 180, 3, 181, 3, 181, 7, 181, 1575, 10, 181, 12, 181, 14, 181, 1578, 11, 181, 3, 182, 5, 182, 1581, 10, 182, 3, 183, 3, 183, 5, 183, 1585, 10, 183, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 7, 184, 1595, 10, 184, 12, 184, 14, 184, 1598, 11, 184, 3, 184, 6, 184, 1601, 10, 184, 13, 184, 14, 184, 1602, 3, 184, 3, 184, 3, 184, 3, 184, 3, 185, 3, 185, 2, 2, 186, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 110, 219, 111, 221, 112, 223, 113, 225, 114, 227, 115, 229, 116, 231, 117, 233, 118, 235, 119, 237, 120, 239, 121, 241, 122, 243, 123, 245, 124, 247, 125, 249, 126, 251, 127, 253, 128, 255, 129, 257, 130, 259, 131, 261, 132, 263, 133, 265, 134, 267, 135, 269, 136, 271, 137, 273, 138, 275, 139, 277, 140, 279, 141, 281, 142, 283, 143, 285, 144, 287, 145, 289, 146, 291, 147, 293, 148, 295, 149, 297, 150, 299, 151, 301, 152, 303, 153, 305, 154, 307, 155, 309, 156, 311, 157, 313, 158, 315, 159, 317, 160, 319, 161, 321, 162, 323, 163, 325, 164, 327, 165, 329, 166, 331, 167, 333, 168, 335, 169, 337, 2, 339, 2, 341, 2, 343, 170, 345, 171, 347, 172, 349, 173, 351, 174, 353, 175, 355, 176, 357, 2, 359, 177, 361, 178, 363, 2, 365, 2, 367, 179, 369, 180, 3, 2, 15, 4, 2, 36, 36, 94, 94, 10, 2, 36, 36, 49, 49, 94, 94, 100, 100, 104, 104, 112, 112, 116, 116, 118, 118, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 50, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 5, 2, 11, 12, 15, 15, 34, 34, 16, 2, 67, 92, 97, 97, 99, 124, 194, 216, 218, 248, 250, 769, 882, 895, 897, 8193, 8206, 8207, 8306, 8593, 11266, 12273, 12291, 55297, 63746, 64977, 65010, 65535, 7, 2, 47, 47, 50, 59, 185, 185, 770, 881, 8257, 8258, 3, 2, 60, 60, 3, 2, 43, 43, 4, 2, 42, 42, 60, 60, 7, 2, 36, 36, 40, 41, 62, 62, 125, 125, 127, 127, 2, 1622, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 267, 3, 2, 2, 2, 2, 269, 3, 2, 2, 2, 2, 271, 3, 2, 2, 2, 2, 273, 3, 2, 2, 2, 2, 275, 3, 2, 2, 2, 2, 277, 3, 2, 2, 2, 2, 279, 3, 2, 2, 2, 2, 281, 3, 2, 2, 2, 2, 283, 3, 2, 2, 2, 2, 285, 3, 2, 2, 2, 2, 287, 3, 2, 2, 2, 2, 289, 3, 2, 2, 2, 2, 291, 3, 2, 2, 2, 2, 293, 3, 2, 2, 2, 2, 295, 3, 2, 2, 2, 2, 297, 3, 2, 2, 2, 2, 299, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 2, 303, 3, 2, 2, 2, 2, 305, 3, 2, 2, 2, 2, 307, 3, 2, 2, 2, 2, 309, 3, 2, 2, 2, 2, 311, 3, 2, 2, 2, 2, 313, 3, 2, 2, 2, 2, 315, 3, 2, 2, 2, 2, 317, 3, 2, 2, 2, 2, 319, 3, 2, 2, 2, 2, 321, 3, 2, 2, 2, 2, 323, 3, 2, 2, 2, 2, 325, 3, 2, 2, 2, 2, 327, 3, 2, 2, 2, 2, 329, 3, 2, 2, 2, 2, 331, 3, 2, 2, 2, 2, 333, 3, 2, 2, 2, 2, 335, 3, 2, 2, 2, 2, 343, 3, 2, 2, 2, 2, 345, 3, 2, 2, 2, 2, 347, 3, 2, 2, 2, 2, 349, 3, 2, 2, 2, 2, 351, 3, 2, 2, 2, 2, 353, 3, 2, 2, 2, 2, 355, 3, 2, 2, 2, 2, 359, 3, 2, 2, 2, 2, 361, 3, 2, 2, 2, 2, 367, 3, 2, 2, 2, 2, 369, 3, 2, 2, 2, 3, 371, 3, 2, 2, 2, 5, 373, 3, 2, 2, 2, 7, 380, 3, 2, 2, 2, 9, 382, 3, 2, 2, 2, 11, 384, 3, 2, 2, 2, 13, 387, 3, 2, 2, 2, 15, 389, 3, 2, 2, 2, 17, 391, 3, 2, 2, 2, 19, 393, 3, 2, 2, 2, 21, 395, 3, 2, 2, 2, 23, 397, 3, 2, 2, 2, 25, 399, 3, 2, 2, 2, 27, 401, 3, 2, 2, 2, 29, 403, 3, 2, 2, 2, 31, 412, 3, 2, 2, 2, 33, 420, 3, 2, 2, 2, 35, 435, 3, 2, 2, 2, 37, 437, 3, 2, 2, 2, 39, 455, 3, 2, 2, 2, 41, 474, 3, 2, 2, 2, 43, 483, 3, 2, 2, 2, 45, 494, 3, 2, 2, 2, 47, 498, 3, 2, 2, 2, 49, 506, 3, 2, 2, 2, 51, 516, 3, 2, 2, 2, 53, 527, 3, 2, 2, 2, 55, 533, 3, 2, 2, 2, 57, 551, 3, 2, 2, 2, 59, 560, 3, 2, 2, 2, 61, 569, 3, 2, 2, 2, 63, 576, 3, 2, 2, 2, 65, 584, 3, 2, 2, 2, 67, 592, 3, 2, 2, 2, 69, 595, 3, 2, 2, 2, 71, 598, 3, 2, 2, 2, 73, 601, 3, 2, 2, 2, 75, 604, 3, 2, 2, 2, 77, 607, 3, 2, 2, 2, 79, 610, 3, 2, 2, 2, 81, 613, 3, 2, 2, 2, 83, 615, 3, 2, 2, 2, 85, 618, 3, 2, 2, 2, 87, 620, 3, 2, 2, 2, 89, 623, 3, 2, 2, 2, 91, 626, 3, 2, 2, 2, 93, 628, 3, 2, 2, 2, 95, 630, 3, 2, 2, 2, 97, 634, 3, 2, 2, 2, 99, 639, 3, 2, 2, 2, 101, 643, 3, 2, 2, 2, 103, 645, 3, 2, 2, 2, 105, 647, 3, 2, 2, 2, 107, 649, 3, 2, 2, 2, 109, 651, 3, 2, 2, 2, 111, 654, 3, 2, 2, 2, 113, 656, 3, 2, 2, 2, 115, 659, 3, 2, 2, 2, 117, 662, 3, 2, 2, 2, 119, 665, 3, 2, 2, 2, 121, 669, 3, 2, 2, 2, 123, 673, 3, 2, 2, 2, 125, 679, 3, 2, 2, 2, 127, 685, 3, 2, 2, 2, 129, 688, 3, 2, 2, 2, 131, 694, 3, 2, 2, 2, 133, 701, 3, 2, 2, 2, 135, 704, 3, 2, 2, 2, 137, 707, 3, 2, 2, 2, 139, 710, 3, 2, 2, 2, 141, 713, 3, 2, 2, 2, 143, 722, 3, 2, 2, 2, 145, 728, 3, 2, 2, 2, 147, 734, 3, 2, 2, 2, 149, 741, 3, 2, 2, 2, 151, 751, 3, 2, 2, 2, 153, 762, 3, 2, 2, 2, 155, 767, 3, 2, 2, 2, 157, 773, 3, 2, 2, 2, 159, 783, 3, 2, 2, 2, 161, 793, 3, 2, 2, 2, 163, 802, 3, 2, 2, 2, 165, 808, 3, 2, 2, 2, 167, 815, 3, 2, 2, 2, 169, 820, 3, 2, 2, 2, 171, 824, 3, 2, 2, 2, 173, 830, 3, 2, 2, 2, 175, 838, 3, 2, 2, 2, 177, 843, 3, 2, 2, 2, 179, 848, 3, 2, 2, 2, 181, 859, 3, 2, 2, 2, 183, 862, 3, 2, 2, 2, 185, 866, 3, 2, 2, 2, 187, 870, 3, 2, 2, 2, 189, 873, 3, 2, 2, 2, 191, 882, 3, 2, 2, 2, 193, 885, 3, 2, 2, 2, 195, 896, 3, 2, 2, 2, 197, 899, 3, 2, 2, 2, 199, 905, 3, 2, 2, 2, 201, 910, 3, 2, 2, 2, 203, 919, 3, 2, 2, 2, 205, 927, 3, 2, 2, 2, 207, 934, 3, 2, 2, 2, 209, 944, 3, 2, 2, 2, 211, 949, 3, 2, 2, 2, 213, 955, 3, 2, 2, 2, 215, 960, 3, 2, 2, 2, 217, 969, 3, 2, 2, 2, 219, 978, 3, 2, 2, 2, 221, 986, 3, 2, 2, 2, 223, 994, 3, 2, 2, 2, 225, 999, 3, 2, 2, 2, 227, 1008, 3, 2, 2, 2, 229, 1015, 3, 2, 2, 2, 231, 1022, 3, 2, 2, 2, 233, 1029, 3, 2, 2, 2, 235, 1037, 3, 2, 2, 2, 237, 1042, 3, 2, 2, 2, 239, 1049, 3, 2, 2, 2, 241, 1056, 3, 2, 2, 2, 243, 1061, 3, 2, 2, 2, 245, 1067, 3, 2, 2, 2, 247, 1072, 3, 2, 2, 2, 249, 1077, 3, 2, 2, 2, 251, 1086, 3, 2, 2, 2, 253, 1092, 3, 2, 2, 2, 255, 1097, 3, 2, 2, 2, 257, 1106, 3, 2, 2, 2, 259, 1111, 3, 2, 2, 2, 261, 1121, 3, 2, 2, 2, 263, 1127, 3, 2, 2, 2, 265, 1134, 3, 2, 2, 2, 267, 1141, 3, 2, 2, 2, 269, 1151, 3, 2, 2, 2, 271, 1159, 3, 2, 2, 2, 273, 1161, 3, 2, 2, 2, 275, 1164, 3, 2, 2, 2, 277, 1166, 3, 2, 2, 2, 279, 1172, 3, 2, 2, 2, 281, 1183, 3, 2, 2, 2, 283, 1193, 3, 2, 2, 2, 285, 1198, 3, 2, 2, 2, 287, 1217, 3, 2, 2, 2, 289, 1235, 3, 2, 2, 2, 291, 1245, 3, 2, 2, 2, 293, 1252, 3, 2, 2, 2, 295, 1261, 3, 2, 2, 2, 297, 1279, 3, 2, 2, 2, 299, 1289, 3, 2, 2, 2, 301, 1306, 3, 2, 2, 2, 303, 1311, 3, 2, 2, 2, 305, 1318, 3, 2, 2, 2, 307, 1327, 3, 2, 2, 2, 309, 1341, 3, 2, 2, 2, 311, 1346, 3, 2, 2, 2, 313, 1369, 3, 2, 2, 2, 315, 1384, 3, 2, 2, 2, 317, 1401, 3, 2, 2, 2, 319, 1416, 3, 2, 2, 2, 321, 1427, 3, 2, 2, 2, 323, 1440, 3, 2, 2, 2, 325, 1450, 3, 2, 2, 2, 327, 1462, 3, 2, 2, 2, 329, 1474, 3, 2, 2, 2, 331, 1482, 3, 2, 2, 2, 333, 1488, 3, 2, 2, 2, 335, 1492, 3, 2, 2, 2, 337, 1502, 3, 2, 2, 2, 339, 1507, 3, 2, 2, 2, 341, 1513, 3, 2, 2, 2, 343, 1515, 3, 2, 2, 2, 345, 1517, 3, 2, 2, 2, 347, 1522, 3, 2, 2, 2, 349, 1527, 3, 2, 2, 2, 351, 1529, 3, 2, 2, 2, 353, 1541, 3, 2, 2, 2, 355, 1555, 3, 2, 2, 2, 357, 1564, 3, 2, 2, 2, 359, 1568, 3, 2, 2, 2, 361, 1572, 3, 2, 2, 2, 363, 1580, 3, 2, 2, 2, 365, 1584, 3, 2, 2, 2, 367, 1586, 3, 2, 2, 2, 369, 1608, 3, 2, 2, 2, 371, 372, 7, 61, 2, 2, 372, 4, 3, 2, 2, 2, 373, 374, 7, 111, 2, 2, 374, 375, 7, 113, 2, 2, 375, 376, 7, 102, 2, 2, 376, 377, 7, 119, 2, 2, 377, 378, 7, 110, 2, 2, 378, 379, 7, 103, 2, 2, 379, 6, 3, 2, 2, 2, 380, 381, 7, 63, 2, 2, 381, 8, 3, 2, 2, 2, 382, 383, 7, 38, 2, 2, 383, 10, 3, 2, 2, 2, 384, 385, 7, 60, 2, 2, 385, 386, 7, 63, 2, 2, 386, 12, 3, 2, 2, 2, 387, 388, 7, 125, 2, 2, 388, 14, 3, 2, 2, 2, 389, 390, 7, 127, 2, 2, 390, 16, 3, 2, 2, 2, 391, 392, 7, 42, 2, 2, 392, 18, 3, 2, 2, 2, 393, 394, 7, 43, 2, 2, 394, 20, 3, 2, 2, 2, 395, 396, 7, 44, 2, 2, 396, 22, 3, 2, 2, 2, 397, 398, 7, 126, 2, 2, 398, 24, 3, 2, 2, 2, 399, 400, 7, 39, 2, 2, 400, 26, 3, 2, 2, 2, 401, 402, 7, 46, 2, 2, 402, 28, 3, 2, 2, 2, 403, 404, 7, 113, 2, 2, 404, 405, 7, 116, 2, 2, 405, 406, 7, 102, 2, 2, 406, 407, 7, 103, 2, 2, 407, 408, 7, 116, 2, 2, 408, 409, 7, 107, 2, 2, 409, 410, 7, 112, 2, 2, 410, 411, 7, 105, 2, 2, 411, 30, 3, 2, 2, 2, 412, 413, 7, 113, 2, 2, 413, 414, 7, 116, 2, 2, 414, 415, 7, 102, 2, 2, 415, 416, 7, 103, 2, 2, 416, 417, 7, 116, 2, 2, 417, 418, 7, 103, 2, 2, 418, 419, 7, 102, 2, 2, 419, 32, 3, 2, 2, 2, 420, 421, 7, 102, 2, 2, 421, 422, 7, 103, 2, 2, 422, 423, 7, 101, 2, 2, 423, 424, 7, 107, 2, 2, 424, 425, 7, 111, 2, 2, 425, 426, 7, 99, 2, 2, 426, 427, 7, 110, 2, 2, 427, 428, 7, 47, 2, 2, 428, 429, 7, 104, 2, 2, 429, 430, 7, 113, 2, 2, 430, 431, 7, 116, 2, 2, 431, 432, 7, 111, 2, 2, 432, 433, 7, 99, 2, 2, 433, 434, 7, 118, 2, 2, 434, 34, 3, 2, 2, 2, 435, 436, 7, 60, 2, 2, 436, 36, 3, 2, 2, 2, 437, 438, 7, 102, 2, 2, 438, 439, 7, 103, 2, 2, 439, 440, 7, 101, 2, 2, 440, 441, 7, 107, 2, 2, 441, 442, 7, 111, 2, 2, 442, 443, 7, 99, 2, 2, 443, 444, 7, 110, 2, 2, 444, 445, 7, 47, 2, 2, 445, 446, 7, 117, 2, 2, 446, 447, 7, 103, 2, 2, 447, 448, 7, 114, 2, 2, 448, 449, 7, 99, 2, 2, 449, 450, 7, 116, 2, 2, 450, 451, 7, 99, 2, 2, 451, 452, 7, 118, 2, 2, 452, 453, 7, 113, 2, 2, 453, 454, 7, 116, 2, 2, 454, 38, 3, 2, 2, 2, 455, 456, 7, 105, 2, 2, 456, 457, 7, 116, 2, 2, 457, 458, 7, 113, 2, 2, 458, 459, 7, 119, 2, 2, 459, 460, 7, 114, 2, 2, 460, 461, 7, 107, 2, 2, 461, 462, 7, 112, 2, 2, 462, 463, 7, 105, 2, 2, 463, 464, 7, 47, 2, 2, 464, 465, 7, 117, 2, 2, 465, 466, 7, 103, 2, 2, 466, 467, 7, 114, 2, 2, 467, 468, 7, 99, 2, 2, 468, 469, 7, 116, 2, 2, 469, 470, 7, 99, 2, 2, 470, 471, 7, 118, 2, 2, 471, 472, 7, 113, 2, 2, 472, 473, 7, 116, 2, 2, 473, 40, 3, 2, 2, 2, 474, 475, 7, 107, 2, 2, 475, 476, 7, 112, 2, 2, 476, 477, 7, 104, 2, 2, 477, 478, 7, 107, 2, 2, 478, 479, 7, 112, 2, 2, 479, 480, 7, 107, 2, 2, 480, 481, 7, 118, 2, 2, 481, 482, 7, 123, 2, 2, 482, 42, 3, 2, 2, 2, 483, 484, 7, 111, 2, 2, 484, 485, 7, 107, 2, 2, 485, 486, 7, 112, 2, 2, 486, 487, 7, 119, 2, 2, 487, 488, 7, 117, 2, 2, 488, 489, 7, 47, 2, 2, 489, 490, 7, 117, 2, 2, 490, 491, 7, 107, 2, 2, 491, 492, 7, 105, 2, 2, 492, 493, 7, 112, 2, 2, 493, 44, 3, 2, 2, 2, 494, 495, 7, 80, 2, 2, 495, 496, 7, 99, 2, 2, 496, 497, 7, 80, 2, 2, 497, 46, 3, 2, 2, 2, 498, 499, 7, 114, 2, 2, 499, 500, 7, 103, 2, 2, 500, 501, 7, 116, 2, 2, 501, 502, 7, 101, 2, 2, 502, 503, 7, 103, 2, 2, 503, 504, 7, 112, 2, 2, 504, 505, 7, 118, 2, 2, 505, 48, 3, 2, 2, 2, 506, 507, 7, 114, 2, 2, 507, 508, 7, 103, 2, 2, 508, 509, 7, 116, 2, 2, 509, 510, 7, 47, 2, 2, 510, 511, 7, 111, 2, 2, 511, 512, 7, 107, 2, 2, 512, 513, 7, 110, 2, 2, 513, 514, 7, 110, 2, 2, 514, 515, 7, 103, 2, 2, 515, 50, 3, 2, 2, 2, 516, 517, 7, 124, 2, 2, 517, 518, 7, 103, 2, 2, 518, 519, 7, 116, 2, 2, 519, 520, 7, 113, 2, 2, 520, 521, 7, 47, 2, 2, 521, 522, 7, 102, 2, 2, 522, 523, 7, 107, 2, 2, 523, 524, 7, 105, 2, 2, 524, 525, 7, 107, 2, 2, 525, 526, 7, 118, 2, 2, 526, 52, 3, 2, 2, 2, 527, 528, 7, 102, 2, 2, 528, 529, 7, 107, 2, 2, 529, 530, 7, 105, 2, 2, 530, 531, 7, 107, 2, 2, 531, 532, 7, 118, 2, 2, 532, 54, 3, 2, 2, 2, 533, 534, 7, 114, 2, 2, 534, 535, 7, 99, 2, 2, 535, 536, 7, 118, 2, 2, 536, 537, 7, 118, 2, 2, 537, 538, 7, 103, 2, 2, 538, 539, 7, 116, 2, 2, 539, 540, 7, 112, 2, 2, 540, 541, 7, 47, 2, 2, 541, 542, 7, 117, 2, 2, 542, 543, 7, 103, 2, 2, 543, 544, 7, 114, 2, 2, 544, 545, 7, 99, 2, 2, 545, 546, 7, 116, 2, 2, 546, 547, 7, 99, 2, 2, 547, 548, 7, 118, 2, 2, 548, 549, 7, 113, 2, 2, 549, 550, 7, 116, 2, 2, 550, 56, 3, 2, 2, 2, 551, 552, 7, 103, 2, 2, 552, 553, 7, 122, 2, 2, 553, 554, 7, 118, 2, 2, 554, 555, 7, 103, 2, 2, 555, 556, 7, 116, 2, 2, 556, 557, 7, 112, 2, 2, 557, 558, 7, 99, 2, 2, 558, 559, 7, 110, 2, 2, 559, 58, 3, 2, 2, 2, 560, 561, 7, 104, 2, 2, 561, 562, 7, 119, 2, 2, 562, 563, 7, 112, 2, 2, 563, 564, 7, 101, 2, 2, 564, 565, 7, 118, 2, 2, 565, 566, 7, 107, 2, 2, 566, 567, 7, 113, 2, 2, 567, 568, 7, 112, 2, 2, 568, 60, 3, 2, 2, 2, 569, 570, 7, 108, 2, 2, 570, 571, 7, 117, 2, 2, 571, 572, 7, 113, 2, 2, 572, 573, 7, 119, 2, 2, 573, 574, 7, 112, 2, 2, 574, 575, 7, 102, 2, 2, 575, 62, 3, 2, 2, 2, 576, 577, 7, 101, 2, 2, 577, 578, 7, 113, 2, 2, 578, 579, 7, 111, 2, 2, 579, 580, 7, 114, 2, 2, 580, 581, 7, 99, 2, 2, 581, 582, 7, 101, 2, 2, 582, 583, 7, 118, 2, 2, 583, 64, 3, 2, 2, 2, 584, 585, 7, 120, 2, 2, 585, 586, 7, 103, 2, 2, 586, 587, 7, 116, 2, 2, 587, 588, 7, 100, 2, 2, 588, 589, 7, 113, 2, 2, 589, 590, 7, 117, 2, 2, 590, 591, 7, 103, 2, 2, 591, 66, 3, 2, 2, 2, 592, 593, 7, 103, 2, 2, 593, 594, 7, 115, 2, 2, 594, 68, 3, 2, 2, 2, 595, 596, 7, 112, 2, 2, 596, 597, 7, 103, 2, 2, 597, 70, 3, 2, 2, 2, 598, 599, 7, 110, 2, 2, 599, 600, 7, 118, 2, 2, 600, 72, 3, 2, 2, 2, 601, 602, 7, 110, 2, 2, 602, 603, 7, 103, 2, 2, 603, 74, 3, 2, 2, 2, 604, 605, 7, 105, 2, 2, 605, 606, 7, 118, 2, 2, 606, 76, 3, 2, 2, 2, 607, 608, 7, 105, 2, 2, 608, 609, 7, 103, 2, 2, 609, 78, 3, 2, 2, 2, 610, 611, 7, 35, 2, 2, 611, 612, 7, 63, 2, 2, 612, 80, 3, 2, 2, 2, 613, 614, 7, 62, 2, 2, 614, 82, 3, 2, 2, 2, 615, 616, 7, 62, 2, 2, 616, 617, 7, 63, 2, 2, 617, 84, 3, 2, 2, 2, 618, 619, 7, 64, 2, 2, 619, 86, 3, 2, 2, 2, 620, 621, 7, 64, 2, 2, 621, 622, 7, 63, 2, 2, 622, 88, 3, 2, 2, 2, 623, 624, 7, 126, 2, 2, 624, 625, 7, 126, 2, 2, 625, 90, 3, 2, 2, 2, 626, 627, 7, 45, 2, 2, 627, 92, 3, 2, 2, 2, 628, 629, 7, 47, 2, 2, 629, 94, 3, 2, 2, 2, 630, 631, 7, 102, 2, 2, 631, 632, 7, 107, 2, 2, 632, 633, 7, 120, 2, 2, 633, 96, 3, 2, 2, 2, 634, 635, 7, 107, 2, 2, 635, 636, 7, 102, 2, 2, 636, 637, 7, 107, 2, 2, 637, 638, 7, 120, 2, 2, 638, 98, 3, 2, 2, 2, 639, 640, 7, 111, 2, 2, 640, 641, 7, 113, 2, 2, 641, 642, 7, 102, 2, 2, 642, 100, 3, 2, 2, 2, 643, 644, 7, 35, 2, 2, 644, 102, 3, 2, 2, 2, 645, 646, 7, 93, 2, 2, 646, 104, 3, 2, 2, 2, 647, 648, 7, 95, 2, 2, 648, 106, 3, 2, 2, 2, 649, 650, 7, 48, 2, 2, 650, 108, 3, 2, 2, 2, 651, 652, 7, 38, 2, 2, 652, 653, 7, 38, 2, 2, 653, 110, 3, 2, 2, 2, 654, 655, 7, 37, 2, 2, 655, 112, 3, 2, 2, 2, 656, 657, 7, 48, 2, 2, 657, 658, 7, 48, 2, 2, 658, 114, 3, 2, 2, 2, 659, 660, 7, 125, 2, 2, 660, 661, 7, 126, 2, 2, 661, 116, 3, 2, 2, 2, 662, 663, 7, 126, 2, 2, 663, 664, 7, 127, 2, 2, 664, 118, 3, 2, 2, 2, 665, 666, 7, 104, 2, 2, 666, 667, 7, 113, 2, 2, 667, 668, 7, 116, 2, 2, 668, 120, 3, 2, 2, 2, 669, 670, 7, 110, 2, 2, 670, 671, 7, 103, 2, 2, 671, 672, 7, 118, 2, 2, 672, 122, 3, 2, 2, 2, 673, 674, 7, 121, 2, 2, 674, 675, 7, 106, 2, 2, 675, 676, 7, 103, 2, 2, 676, 677, 7, 116, 2, 2, 677, 678, 7, 103, 2, 2, 678, 124, 3, 2, 2, 2, 679, 680, 7, 105, 2, 2, 680, 681, 7, 116, 2, 2, 681, 682, 7, 113, 2, 2, 682, 683, 7, 119, 2, 2, 683, 684, 7, 114, 2, 2, 684, 126, 3, 2, 2, 2, 685, 686, 7, 100, 2, 2, 686, 687, 7, 123, 2, 2, 687, 128, 3, 2, 2, 2, 688, 689, 7, 113, 2, 2, 689, 690, 7, 116, 2, 2, 690, 691, 7, 102, 2, 2, 691, 692, 7, 103, 2, 2, 692, 693, 7, 116, 2, 2, 693, 130, 3, 2, 2, 2, 694, 695, 7, 116, 2, 2, 695, 696, 7, 103, 2, 2, 696, 697, 7, 118, 2, 2, 697, 698, 7, 119, 2, 2, 698, 699, 7, 116, 2, 2, 699, 700, 7, 112, 2, 2, 700, 132, 3, 2, 2, 2, 701, 702, 7, 107, 2, 2, 702, 703, 7, 104, 2, 2, 703, 134, 3, 2, 2, 2, 704, 705, 7, 107, 2, 2, 705, 706, 7, 112, 2, 2, 706, 136, 3, 2, 2, 2, 707, 708, 7, 99, 2, 2, 708, 709, 7, 117, 2, 2, 709, 138, 3, 2, 2, 2, 710, 711, 7, 99, 2, 2, 711, 712, 7, 118, 2, 2, 712, 140, 3, 2, 2, 2, 713, 714, 7, 99, 2, 2, 714, 715, 7, 110, 2, 2, 715, 716, 7, 110, 2, 2, 716, 717, 7, 113, 2, 2, 717, 718, 7, 121, 2, 2, 718, 719, 7, 107, 2, 2, 719, 720, 7, 112, 2, 2, 720, 721, 7, 105, 2, 2, 721, 142, 3, 2, 2, 2, 722, 723, 7, 103, 2, 2, 723, 724, 7, 111, 2, 2, 724, 725, 7, 114, 2, 2, 725, 726, 7, 118, 2, 2, 726, 727, 7, 123, 2, 2, 727, 144, 3, 2, 2, 2, 728, 729, 7, 101, 2, 2, 729, 730, 7, 113, 2, 2, 730, 731, 7, 119, 2, 2, 731, 732, 7, 112, 2, 2, 732, 733, 7, 118, 2, 2, 733, 146, 3, 2, 2, 2, 734, 735, 7, 117, 2, 2, 735, 736, 7, 118, 2, 2, 736, 737, 7, 99, 2, 2, 737, 738, 7, 100, 2, 2, 738, 739, 7, 110, 2, 2, 739, 740, 7, 103, 2, 2, 740, 148, 3, 2, 2, 2, 741, 742, 7, 99, 2, 2, 742, 743, 7, 117, 2, 2, 743, 744, 7, 101, 2, 2, 744, 745, 7, 103, 2, 2, 745, 746, 7, 112, 2, 2, 746, 747, 7, 102, 2, 2, 747, 748, 7, 107, 2, 2, 748, 749, 7, 112, 2, 2, 749, 750, 7, 105, 2, 2, 750, 150, 3, 2, 2, 2, 751, 752, 7, 102, 2, 2, 752, 753, 7, 103, 2, 2, 753, 754, 7, 117, 2, 2, 754, 755, 7, 101, 2, 2, 755, 756, 7, 103, 2, 2, 756, 757, 7, 112, 2, 2, 757, 758, 7, 102, 2, 2, 758, 759, 7, 107, 2, 2, 759, 760, 7, 112, 2, 2, 760, 761, 7, 105, 2, 2, 761, 152, 3, 2, 2, 2, 762, 763, 7, 117, 2, 2, 763, 764, 7, 113, 2, 2, 764, 765, 7, 111, 2, 2, 765, 766, 7, 103, 2, 2, 766, 154, 3, 2, 2, 2, 767, 768, 7, 103, 2, 2, 768, 769, 7, 120, 2, 2, 769, 770, 7, 103, 2, 2, 770, 771, 7, 116, 2, 2, 771, 772, 7, 123, 2, 2, 772, 156, 3, 2, 2, 2, 773, 774, 7, 117, 2, 2, 774, 775, 7, 99, 2, 2, 775, 776, 7, 118, 2, 2, 776, 777, 7, 107, 2, 2, 777, 778, 7, 117, 2, 2, 778, 779, 7, 104, 2, 2, 779, 780, 7, 107, 2, 2, 780, 781, 7, 103, 2, 2, 781, 782, 7, 117, 2, 2, 782, 158, 3, 2, 2, 2, 783, 784, 7, 101, 2, 2, 784, 785, 7, 113, 2, 2, 785, 786, 7, 110, 2, 2, 786, 787, 7, 110, 2, 2, 787, 788, 7, 99, 2, 2, 788, 789, 7, 118, 2, 2, 789, 790, 7, 107, 2, 2, 790, 791, 7, 113, 2, 2, 791, 792, 7, 112, 2, 2, 792, 160, 3, 2, 2, 2, 793, 794, 7, 105, 2, 2, 794, 795, 7, 116, 2, 2, 795, 796, 7, 103, 2, 2, 796, 797, 7, 99, 2, 2, 797, 798, 7, 118, 2, 2, 798, 799, 7, 103, 2, 2, 799, 800, 7, 117, 2, 2, 800, 801, 7, 118, 2, 2, 801, 162, 3, 2, 2, 2, 802, 803, 7, 110, 2, 2, 803, 804, 7, 103, 2, 2, 804, 805, 7, 99, 2, 2, 805, 806, 7, 117, 2, 2, 806, 807, 7, 118, 2, 2, 807, 164, 3, 2, 2, 2, 808, 809, 7, 117, 2, 2, 809, 810, 7, 121, 2, 2, 810, 811, 7, 107, 2, 2, 811, 812, 7, 118, 2, 2, 812, 813, 7, 101, 2, 2, 813, 814, 7, 106, 2, 2, 814, 166, 3, 2, 2, 2, 815, 816, 7, 101, 2, 2, 816, 817, 7, 99, 2, 2, 817, 818, 7, 117, 2, 2, 818, 819, 7, 103, 2, 2, 819, 168, 3, 2, 2, 2, 820, 821, 7, 118, 2, 2, 821, 822, 7, 116, 2, 2, 822, 823, 7, 123, 2, 2, 823, 170, 3, 2, 2, 2, 824, 825, 7, 101, 2, 2, 825, 826, 7, 99, 2, 2, 826, 827, 7, 118, 2, 2, 827, 828, 7, 101, 2, 2, 828, 829, 7, 106, 2, 2, 829, 172, 3, 2, 2, 2, 830, 831, 7, 102, 2, 2, 831, 832, 7, 103, 2, 2, 832, 833, 7, 104, 2, 2, 833, 834, 7, 99, 2, 2, 834, 835, 7, 119, 2, 2, 835, 836, 7, 110, 2, 2, 836, 837, 7, 118, 2, 2, 837, 174, 3, 2, 2, 2, 838, 839, 7, 118, 2, 2, 839, 840, 7, 106, 2, 2, 840, 841, 7, 103, 2, 2, 841, 842, 7, 112, 2, 2, 842, 176, 3, 2, 2, 2, 843, 844, 7, 103, 2, 2, 844, 845, 7, 110, 2, 2, 845, 846, 7, 117, 2, 2, 846, 847, 7, 103, 2, 2, 847, 178, 3, 2, 2, 2, 848, 849, 7, 118, 2, 2, 849, 850, 7, 123, 2, 2, 850, 851, 7, 114, 2, 2, 851, 852, 7, 103, 2, 2, 852, 853, 7, 117, 2, 2, 853, 854, 7, 121, 2, 2, 854, 855, 7, 107, 2, 2, 855, 856, 7, 118, 2, 2, 856, 857, 7, 101, 2, 2, 857, 858, 7, 106, 2, 2, 858, 180, 3, 2, 2, 2, 859, 860, 7, 113, 2, 2, 860, 861, 7, 116, 2, 2, 861, 182, 3, 2, 2, 2, 862, 863, 7, 99, 2, 2, 863, 864, 7, 112, 2, 2, 864, 865, 7, 102, 2, 2, 865, 184, 3, 2, 2, 2, 866, 867, 7, 112, 2, 2, 867, 868, 7, 113, 2, 2, 868, 869, 7, 118, 2, 2, 869, 186, 3, 2, 2, 2, 870, 871, 7, 118, 2, 2, 871, 872, 7, 113, 2, 2, 872, 188, 3, 2, 2, 2, 873, 874, 7, 107, 2, 2, 874, 875, 7, 112, 2, 2, 875, 876, 7, 117, 2, 2, 876, 877, 7, 118, 2, 2, 877, 878, 7, 99, 2, 2, 878, 879, 7, 112, 2, 2, 879, 880, 7, 101, 2, 2, 880, 881, 7, 103, 2, 2, 881, 190, 3, 2, 2, 2, 882, 883, 7, 113, 2, 2, 883, 884, 7, 104, 2, 2, 884, 192, 3, 2, 2, 2, 885, 886, 7, 117, 2, 2, 886, 887, 7, 118, 2, 2, 887, 888, 7, 99, 2, 2, 888, 889, 7, 118, 2, 2, 889, 890, 7, 107, 2, 2, 890, 891, 7, 101, 2, 2, 891, 892, 7, 99, 2, 2, 892, 893, 7, 110, 2, 2, 893, 894, 7, 110, 2, 2, 894, 895, 7, 123, 2, 2, 895, 194, 3, 2, 2, 2, 896, 897, 7, 107, 2, 2, 897, 898, 7, 117, 2, 2, 898, 196, 3, 2, 2, 2, 899, 900, 7, 118, 2, 2, 900, 901, 7, 116, 2, 2, 901, 902, 7, 103, 2, 2, 902, 903, 7, 99, 2, 2, 903, 904, 7, 118, 2, 2, 904, 198, 3, 2, 2, 2, 905, 906, 7, 101, 2, 2, 906, 907, 7, 99, 2, 2, 907, 908, 7, 117, 2, 2, 908, 909, 7, 118, 2, 2, 909, 200, 3, 2, 2, 2, 910, 911, 7, 101, 2, 2, 911, 912, 7, 99, 2, 2, 912, 913, 7, 117, 2, 2, 913, 914, 7, 118, 2, 2, 914, 915, 7, 99, 2, 2, 915, 916, 7, 100, 2, 2, 916, 917, 7, 110, 2, 2, 917, 918, 7, 103, 2, 2, 918, 202, 3, 2, 2, 2, 919, 920, 7, 120, 2, 2, 920, 921, 7, 103, 2, 2, 921, 922, 7, 116, 2, 2, 922, 923, 7, 117, 2, 2, 923, 924, 7, 107, 2, 2, 924, 925, 7, 113, 2, 2, 925, 926, 7, 112, 2, 2, 926, 204, 3, 2, 2, 2, 927, 928, 7, 108, 2, 2, 928, 929, 7, 117, 2, 2, 929, 930, 7, 113, 2, 2, 930, 931, 7, 112, 2, 2, 931, 932, 7, 107, 2, 2, 932, 933, 7, 115, 2, 2, 933, 206, 3, 2, 2, 2, 934, 935, 7, 119, 2, 2, 935, 936, 7, 112, 2, 2, 936, 937, 7, 113, 2, 2, 937, 938, 7, 116, 2, 2, 938, 939, 7, 102, 2, 2, 939, 940, 7, 103, 2, 2, 940, 941, 7, 116, 2, 2, 941, 942, 7, 103, 2, 2, 942, 943, 7, 102, 2, 2, 943, 208, 3, 2, 2, 2, 944, 945, 7, 118, 2, 2, 945, 946, 7, 116, 2, 2, 946, 947, 7, 119, 2, 2, 947, 948, 7, 103, 2, 2, 948, 210, 3, 2, 2, 2, 949, 950, 7, 104, 2, 2, 950, 951, 7, 99, 2, 2, 951, 952, 7, 110, 2, 2, 952, 953, 7, 117, 2, 2, 953, 954, 7, 103, 2, 2, 954, 212, 3, 2, 2, 2, 955, 956, 7, 118, 2, 2, 956, 957, 7, 123, 2, 2, 957, 958, 7, 114, 2, 2, 958, 959, 7, 103, 2, 2, 959, 214, 3, 2, 2, 2, 960, 961, 7, 120, 2, 2, 961, 962, 7, 99, 2, 2, 962, 963, 7, 110, 2, 2, 963, 964, 7, 107, 2, 2, 964, 965, 7, 102, 2, 2, 965, 966, 7, 99, 2, 2, 966, 967, 7, 118, 2, 2, 967, 968, 7, 103, 2, 2, 968, 216, 3, 2, 2, 2, 969, 970, 7, 99, 2, 2, 970, 971, 7, 112, 2, 2, 971, 972, 7, 112, 2, 2, 972, 973, 7, 113, 2, 2, 973, 974, 7, 118, 2, 2, 974, 975, 7, 99, 2, 2, 975, 976, 7, 118, 2, 2, 976, 977, 7, 103, 2, 2, 977, 218, 3, 2, 2, 2, 978, 979, 7, 102, 2, 2, 979, 980, 7, 103, 2, 2, 980, 981, 7, 101, 2, 2, 981, 982, 7, 110, 2, 2, 982, 983, 7, 99, 2, 2, 983, 984, 7, 116, 2, 2, 984, 985, 7, 103, 2, 2, 985, 220, 3, 2, 2, 2, 986, 987, 7, 101, 2, 2, 987, 988, 7, 113, 2, 2, 988, 989, 7, 112, 2, 2, 989, 990, 7, 118, 2, 2, 990, 991, 7, 103, 2, 2, 991, 992, 7, 122, 2, 2, 992, 993, 7, 118, 2, 2, 993, 222, 3, 2, 2, 2, 994, 995, 7, 107, 2, 2, 995, 996, 7, 118, 2, 2, 996, 997, 7, 103, 2, 2, 997, 998, 7, 111, 2, 2, 998, 224, 3, 2, 2, 2, 999, 1000, 7, 120, 2, 2, 1000, 1001, 7, 99, 2, 2, 1001, 1002, 7, 116, 2, 2, 1002, 1003, 7, 107, 2, 2, 1003, 1004, 7, 99, 2, 2, 1004, 1005, 7, 100, 2, 2, 1005, 1006, 7, 110, 2, 2, 1006, 1007, 7, 103, 2, 2, 1007, 226, 3, 2, 2, 2, 1008, 1009, 7, 107, 2, 2, 1009, 1010, 7, 112, 2, 2, 1010, 1011, 7, 117, 2, 2, 1011, 1012, 7, 103, 2, 2, 1012, 1013, 7, 116, 2, 2, 1013, 1014, 7, 118, 2, 2, 1014, 228, 3, 2, 2, 2, 1015, 1016, 7, 102, 2, 2, 1016, 1017, 7, 103, 2, 2, 1017, 1018, 7, 110, 2, 2, 1018, 1019, 7, 103, 2, 2, 1019, 1020, 7, 118, 2, 2, 1020, 1021, 7, 103, 2, 2, 1021, 230, 3, 2, 2, 2, 1022, 1023, 7, 116, 2, 2, 1023, 1024, 7, 103, 2, 2, 1024, 1025, 7, 112, 2, 2, 1025, 1026, 7, 99, 2, 2, 1026, 1027, 7, 111, 2, 2, 1027, 1028, 7, 103, 2, 2, 1028, 232, 3, 2, 2, 2, 1029, 1030, 7, 116, 2, 2, 1030, 1031, 7, 103, 2, 2, 1031, 1032, 7, 114, 2, 2, 1032, 1033, 7, 110, 2, 2, 1033, 1034, 7, 99, 2, 2, 1034, 1035, 7, 101, 2, 2, 1035, 1036, 7, 103, 2, 2, 1036, 234, 3, 2, 2, 2, 1037, 1038, 7, 101, 2, 2, 1038, 1039, 7, 113, 2, 2, 1039, 1040, 7, 114, 2, 2, 1040, 1041, 7, 123, 2, 2, 1041, 236, 3, 2, 2, 2, 1042, 1043, 7, 111, 2, 2, 1043, 1044, 7, 113, 2, 2, 1044, 1045, 7, 102, 2, 2, 1045, 1046, 7, 107, 2, 2, 1046, 1047, 7, 104, 2, 2, 1047, 1048, 7, 123, 2, 2, 1048, 238, 3, 2, 2, 2, 1049, 1050, 7, 99, 2, 2, 1050, 1051, 7, 114, 2, 2, 1051, 1052, 7, 114, 2, 2, 1052, 1053, 7, 103, 2, 2, 1053, 1054, 7, 112, 2, 2, 1054, 1055, 7, 102, 2, 2, 1055, 240, 3, 2, 2, 2, 1056, 1057, 7, 107, 2, 2, 1057, 1058, 7, 112, 2, 2, 1058, 1059, 7, 118, 2, 2, 1059, 1060, 7, 113, 2, 2, 1060, 242, 3, 2, 2, 2, 1061, 1062, 7, 120, 2, 2, 1062, 1063, 7, 99, 2, 2, 1063, 1064, 7, 110, 2, 2, 1064, 1065, 7, 119, 2, 2, 1065, 1066, 7, 103, 2, 2, 1066, 244, 3, 2, 2, 2, 1067, 1068, 7, 108, 2, 2, 1068, 1069, 7, 117, 2, 2, 1069, 1070, 7, 113, 2, 2, 1070, 1071, 7, 112, 2, 2, 1071, 246, 3, 2, 2, 2, 1072, 1073, 7, 121, 2, 2, 1073, 1074, 7, 107, 2, 2, 1074, 1075, 7, 118, 2, 2, 1075, 1076, 7, 106, 2, 2, 1076, 248, 3, 2, 2, 2, 1077, 1078, 7, 114, 2, 2, 1078, 1079, 7, 113, 2, 2, 1079, 1080, 7, 117, 2, 2, 1080, 1081, 7, 107, 2, 2, 1081, 1082, 7, 118, 2, 2, 1082, 1083, 7, 107, 2, 2, 1083, 1084, 7, 113, 2, 2, 1084, 1085, 7, 112, 2, 2, 1085, 250, 3, 2, 2, 2, 1086, 1087, 7, 100, 2, 2, 1087, 1088, 7, 116, 2, 2, 1088, 1089, 7, 103, 2, 2, 1089, 1090, 7, 99, 2, 2, 1090, 1091, 7, 109, 2, 2, 1091, 252, 3, 2, 2, 2, 1092, 1093, 7, 110, 2, 2, 1093, 1094, 7, 113, 2, 2, 1094, 1095, 7, 113, 2, 2, 1095, 1096, 7, 114, 2, 2, 1096, 254, 3, 2, 2, 2, 1097, 1098, 7, 101, 2, 2, 1098, 1099, 7, 113, 2, 2, 1099, 1100, 7, 112, 2, 2, 1100, 1101, 7, 118, 2, 2, 1101, 1102, 7, 107, 2, 2, 1102, 1103, 7, 112, 2, 2, 1103, 1104, 7, 119, 2, 2, 1104, 1105, 7, 103, 2, 2, 1105, 256, 3, 2, 2, 2, 1106, 1107, 7, 103, 2, 2, 1107, 1108, 7, 122, 2, 2, 1108, 1109, 7, 107, 2, 2, 1109, 1110, 7, 118, 2, 2, 1110, 258, 3, 2, 2, 2, 1111, 1112, 7, 116, 2, 2, 1112, 1113, 7, 103, 2, 2, 1113, 1114, 7, 118, 2, 2, 1114, 1115, 7, 119, 2, 2, 1115, 1116, 7, 116, 2, 2, 1116, 1117, 7, 112, 2, 2, 1117, 1118, 7, 107, 2, 2, 1118, 1119, 7, 112, 2, 2, 1119, 1120, 7, 105, 2, 2, 1120, 260, 3, 2, 2, 2, 1121, 1122, 7, 121, 2, 2, 1122, 1123, 7, 106, 2, 2, 1123, 1124, 7, 107, 2, 2, 1124, 1125, 7, 110, 2, 2, 1125, 1126, 7, 103, 2, 2, 1126, 262, 3, 2, 2, 2, 1127, 1128, 7, 107, 2, 2, 1128, 1129, 7, 111, 2, 2, 1129, 1130, 7, 114, 2, 2, 1130, 1131, 7, 113, 2, 2, 1131, 1132, 7, 116, 2, 2, 1132, 1133, 7, 118, 2, 2, 1133, 264, 3, 2, 2, 2, 1134, 1135, 7, 117, 2, 2, 1135, 1136, 7, 101, 2, 2, 1136, 1137, 7, 106, 2, 2, 1137, 1138, 7, 103, 2, 2, 1138, 1139, 7, 111, 2, 2, 1139, 1140, 7, 99, 2, 2, 1140, 266, 3, 2, 2, 2, 1141, 1142, 7, 112, 2, 2, 1142, 1143, 7, 99, 2, 2, 1143, 1144, 7, 111, 2, 2, 1144, 1145, 7, 103, 2, 2, 1145, 1146, 7, 117, 2, 2, 1146, 1147, 7, 114, 2, 2, 1147, 1148, 7, 99, 2, 2, 1148, 1149, 7, 101, 2, 2, 1149, 1150, 7, 103, 2, 2, 1150, 268, 3, 2, 2, 2, 1151, 1152, 7, 103, 2, 2, 1152, 1153, 7, 110, 2, 2, 1153, 1154, 7, 103, 2, 2, 1154, 1155, 7, 111, 2, 2, 1155, 1156, 7, 103, 2, 2, 1156, 1157, 7, 112, 2, 2, 1157, 1158, 7, 118, 2, 2, 1158, 270, 3, 2, 2, 2, 1159, 1160, 7, 49, 2, 2, 1160, 272, 3, 2, 2, 2, 1161, 1162, 7, 49, 2, 2, 1162, 1163, 7, 49, 2, 2, 1163, 274, 3, 2, 2, 2, 1164, 1165, 7, 66, 2, 2, 1165, 276, 3, 2, 2, 2, 1166, 1167, 7, 101, 2, 2, 1167, 1168, 7, 106, 2, 2, 1168, 1169, 7, 107, 2, 2, 1169, 1170, 7, 110, 2, 2, 1170, 1171, 7, 102, 2, 2, 1171, 278, 3, 2, 2, 2, 1172, 1173, 7, 102, 2, 2, 1173, 1174, 7, 103, 2, 2, 1174, 1175, 7, 117, 2, 2, 1175, 1176, 7, 101, 2, 2, 1176, 1177, 7, 103, 2, 2, 1177, 1178, 7, 112, 2, 2, 1178, 1179, 7, 102, 2, 2, 1179, 1180, 7, 99, 2, 2, 1180, 1181, 7, 112, 2, 2, 1181, 1182, 7, 118, 2, 2, 1182, 280, 3, 2, 2, 2, 1183, 1184, 7, 99, 2, 2, 1184, 1185, 7, 118, 2, 2, 1185, 1186, 7, 118, 2, 2, 1186, 1187, 7, 116, 2, 2, 1187, 1188, 7, 107, 2, 2, 1188, 1189, 7, 100, 2, 2, 1189, 1190, 7, 119, 2, 2, 1190, 1191, 7, 118, 2, 2, 1191, 1192, 7, 103, 2, 2, 1192, 282, 3, 2, 2, 2, 1193, 1194, 7, 117, 2, 2, 1194, 1195, 7, 103, 2, 2, 1195, 1196, 7, 110, 2, 2, 1196, 1197, 7, 104, 2, 2, 1197, 284, 3, 2, 2, 2, 1198, 1199, 7, 102, 2, 2, 1199, 1200, 7, 103, 2, 2, 1200, 1201, 7, 117, 2, 2, 1201, 1202, 7, 101, 2, 2, 1202, 1203, 7, 103, 2, 2, 1203, 1204, 7, 112, 2, 2, 1204, 1205, 7, 102, 2, 2, 1205, 1206, 7, 99, 2, 2, 1206, 1207, 7, 112, 2, 2, 1207, 1208, 7, 118, 2, 2, 1208, 1209, 7, 47, 2, 2, 1209, 1210, 7, 113, 2, 2, 1210, 1211, 7, 116, 2, 2, 1211, 1212, 7, 47, 2, 2, 1212, 1213, 7, 117, 2, 2, 1213, 1214, 7, 103, 2, 2, 1214, 1215, 7, 110, 2, 2, 1215, 1216, 7, 104, 2, 2, 1216, 286, 3, 2, 2, 2, 1217, 1218, 7, 104, 2, 2, 1218, 1219, 7, 113, 2, 2, 1219, 1220, 7, 110, 2, 2, 1220, 1221, 7, 110, 2, 2, 1221, 1222, 7, 113, 2, 2, 1222, 1223, 7, 121, 2, 2, 1223, 1224, 7, 107, 2, 2, 1224, 1225, 7, 112, 2, 2, 1225, 1226, 7, 105, 2, 2, 1226, 1227, 7, 47, 2, 2, 1227, 1228, 7, 117, 2, 2, 1228, 1229, 7, 107, 2, 2, 1229, 1230, 7, 100, 2, 2, 1230, 1231, 7, 110, 2, 2, 1231, 1232, 7, 107, 2, 2, 1232, 1233, 7, 112, 2, 2, 1233, 1234, 7, 105, 2, 2, 1234, 288, 3, 2, 2, 2, 1235, 1236, 7, 104, 2, 2, 1236, 1237, 7, 113, 2, 2, 1237, 1238, 7, 110, 2, 2, 1238, 1239, 7, 110, 2, 2, 1239, 1240, 7, 113, 2, 2, 1240, 1241, 7, 121, 2, 2, 1241, 1242, 7, 107, 2, 2, 1242, 1243, 7, 112, 2, 2, 1243, 1244, 7, 105, 2, 2, 1244, 290, 3, 2, 2, 2, 1245, 1246, 7, 114, 2, 2, 1246, 1247, 7, 99, 2, 2, 1247, 1248, 7, 116, 2, 2, 1248, 1249, 7, 103, 2, 2, 1249, 1250, 7, 112, 2, 2, 1250, 1251, 7, 118, 2, 2, 1251, 292, 3, 2, 2, 2, 1252, 1253, 7, 99, 2, 2, 1253, 1254, 7, 112, 2, 2, 1254, 1255, 7, 101, 2, 2, 1255, 1256, 7, 103, 2, 2, 1256, 1257, 7, 117, 2, 2, 1257, 1258, 7, 118, 2, 2, 1258, 1259, 7, 113, 2, 2, 1259, 1260, 7, 116, 2, 2, 1260, 294, 3, 2, 2, 2, 1261, 1262, 7, 114, 2, 2, 1262, 1263, 7, 116, 2, 2, 1263, 1264, 7, 103, 2, 2, 1264, 1265, 7, 101, 2, 2, 1265, 1266, 7, 103, 2, 2, 1266, 1267, 7, 102, 2, 2, 1267, 1268, 7, 107, 2, 2, 1268, 1269, 7, 112, 2, 2, 1269, 1270, 7, 105, 2, 2, 1270, 1271, 7, 47, 2, 2, 1271, 1272, 7, 117, 2, 2, 1272, 1273, 7, 107, 2, 2, 1273, 1274, 7, 100, 2, 2, 1274, 1275, 7, 110, 2, 2, 1275, 1276, 7, 107, 2, 2, 1276, 1277, 7, 112, 2, 2, 1277, 1278, 7, 105, 2, 2, 1278, 296, 3, 2, 2, 2, 1279, 1280, 7, 114, 2, 2, 1280, 1281, 7, 116, 2, 2, 1281, 1282, 7, 103, 2, 2, 1282, 1283, 7, 101, 2, 2, 1283, 1284, 7, 103, 2, 2, 1284, 1285, 7, 102, 2, 2, 1285, 1286, 7, 107, 2, 2, 1286, 1287, 7, 112, 2, 2, 1287, 1288, 7, 105, 2, 2, 1288, 298, 3, 2, 2, 2, 1289, 1290, 7, 99, 2, 2, 1290, 1291, 7, 112, 2, 2, 1291, 1292, 7, 101, 2, 2, 1292, 1293, 7, 103, 2, 2, 1293, 1294, 7, 117, 2, 2, 1294, 1295, 7, 118, 2, 2, 1295, 1296, 7, 113, 2, 2, 1296, 1297, 7, 116, 2, 2, 1297, 1298, 7, 47, 2, 2, 1298, 1299, 7, 113, 2, 2, 1299, 1300, 7, 116, 2, 2, 1300, 1301, 7, 47, 2, 2, 1301, 1302, 7, 117, 2, 2, 1302, 1303, 7, 103, 2, 2, 1303, 1304, 7, 110, 2, 2, 1304, 1305, 7, 104, 2, 2, 1305, 300, 3, 2, 2, 2, 1306, 1307, 7, 112, 2, 2, 1307, 1308, 7, 113, 2, 2, 1308, 1309, 7, 102, 2, 2, 1309, 1310, 7, 103, 2, 2, 1310, 302, 3, 2, 2, 2, 1311, 1312, 7, 100, 2, 2, 1312, 1313, 7, 107, 2, 2, 1313, 1314, 7, 112, 2, 2, 1314, 1315, 7, 99, 2, 2, 1315, 1316, 7, 116, 2, 2, 1316, 1317, 7, 123, 2, 2, 1317, 304, 3, 2, 2, 2, 1318, 1319, 7, 102, 2, 2, 1319, 1320, 7, 113, 2, 2, 1320, 1321, 7, 101, 2, 2, 1321, 1322, 7, 119, 2, 2, 1322, 1323, 7, 111, 2, 2, 1323, 1324, 7, 103, 2, 2, 1324, 1325, 7, 112, 2, 2, 1325, 1326, 7, 118, 2, 2, 1326, 306, 3, 2, 2, 2, 1327, 1328, 7, 102, 2, 2, 1328, 1329, 7, 113, 2, 2, 1329, 1330, 7, 101, 2, 2, 1330, 1331, 7, 119, 2, 2, 1331, 1332, 7, 111, 2, 2, 1332, 1333, 7, 103, 2, 2, 1333, 1334, 7, 112, 2, 2, 1334, 1335, 7, 118, 2, 2, 1335, 1336, 7, 47, 2, 2, 1336, 1337, 7, 112, 2, 2, 1337, 1338, 7, 113, 2, 2, 1338, 1339, 7, 102, 2, 2, 1339, 1340, 7, 103, 2, 2, 1340, 308, 3, 2, 2, 2, 1341, 1342, 7, 118, 2, 2, 1342, 1343, 7, 103, 2, 2, 1343, 1344, 7, 122, 2, 2, 1344, 1345, 7, 118, 2, 2, 1345, 310, 3, 2, 2, 2, 1346, 1347, 7, 114, 2, 2, 1347, 1348, 7, 116, 2, 2, 1348, 1349, 7, 113, 2, 2, 1349, 1350, 7, 101, 2, 2, 1350, 1351, 7, 103, 2, 2, 1351, 1352, 7, 117, 2, 2, 1352, 1353, 7, 117, 2, 2, 1353, 1354, 7, 107, 2, 2, 1354, 1355, 7, 112, 2, 2, 1355, 1356, 7, 105, 2, 2, 1356, 1357, 7, 47, 2, 2, 1357, 1358, 7, 107, 2, 2, 1358, 1359, 7, 112, 2, 2, 1359, 1360, 7, 117, 2, 2, 1360, 1361, 7, 118, 2, 2, 1361, 1362, 7, 116, 2, 2, 1362, 1363, 7, 119, 2, 2, 1363, 1364, 7, 101, 2, 2, 1364, 1365, 7, 118, 2, 2, 1365, 1366, 7, 107, 2, 2, 1366, 1367, 7, 113, 2, 2, 1367, 1368, 7, 112, 2, 2, 1368, 312, 3, 2, 2, 2, 1369, 1370, 7, 112, 2, 2, 1370, 1371, 7, 99, 2, 2, 1371, 1372, 7, 111, 2, 2, 1372, 1373, 7, 103, 2, 2, 1373, 1374, 7, 117, 2, 2, 1374, 1375, 7, 114, 2, 2, 1375, 1376, 7, 99, 2, 2, 1376, 1377, 7, 101, 2, 2, 1377, 1378, 7, 103, 2, 2, 1378, 1379, 7, 47, 2, 2, 1379, 1380, 7, 112, 2, 2, 1380, 1381, 7, 113, 2, 2, 1381, 1382, 7, 102, 2, 2, 1382, 1383, 7, 103, 2, 2, 1383, 314, 3, 2, 2, 2, 1384, 1385, 7, 117, 2, 2, 1385, 1386, 7, 101, 2, 2, 1386, 1387, 7, 106, 2, 2, 1387, 1388, 7, 103, 2, 2, 1388, 1389, 7, 111, 2, 2, 1389, 1390, 7, 99, 2, 2, 1390, 1391, 7, 47, 2, 2, 1391, 1392, 7, 99, 2, 2, 1392, 1393, 7, 118, 2, 2, 1393, 1394, 7, 118, 2, 2, 1394, 1395, 7, 116, 2, 2, 1395, 1396, 7, 107, 2, 2, 1396, 1397, 7, 100, 2, 2, 1397, 1398, 7, 119, 2, 2, 1398, 1399, 7, 118, 2, 2, 1399, 1400, 7, 103, 2, 2, 1400, 316, 3, 2, 2, 2, 1401, 1402, 7, 117, 2, 2, 1402, 1403, 7, 101, 2, 2, 1403, 1404, 7, 106, 2, 2, 1404, 1405, 7, 103, 2, 2, 1405, 1406, 7, 111, 2, 2, 1406, 1407, 7, 99, 2, 2, 1407, 1408, 7, 47, 2, 2, 1408, 1409, 7, 103, 2, 2, 1409, 1410, 7, 110, 2, 2, 1410, 1411, 7, 103, 2, 2, 1411, 1412, 7, 111, 2, 2, 1412, 1413, 7, 103, 2, 2, 1413, 1414, 7, 112, 2, 2, 1414, 1415, 7, 118, 2, 2, 1415, 318, 3, 2, 2, 2, 1416, 1417, 7, 99, 2, 2, 1417, 1418, 7, 116, 2, 2, 1418, 1419, 7, 116, 2, 2, 1419, 1420, 7, 99, 2, 2, 1420, 1421, 7, 123, 2, 2, 1421, 1422, 7, 47, 2, 2, 1422, 1423, 7, 112, 2, 2, 1423, 1424, 7, 113, 2, 2, 1424, 1425, 7, 102, 2, 2, 1425, 1426, 7, 103, 2, 2, 1426, 320, 3, 2, 2, 2, 1427, 1428, 7, 100, 2, 2, 1428, 1429, 7, 113, 2, 2, 1429, 1430, 7, 113, 2, 2, 1430, 1431, 7, 110, 2, 2, 1431, 1432, 7, 103, 2, 2, 1432, 1433, 7, 99, 2, 2, 1433, 1434, 7, 112, 2, 2, 1434, 1435, 7, 47, 2, 2, 1435, 1436, 7, 112, 2, 2, 1436, 1437, 7, 113, 2, 2, 1437, 1438, 7, 102, 2, 2, 1438, 1439, 7, 103, 2, 2, 1439, 322, 3, 2, 2, 2, 1440, 1441, 7, 112, 2, 2, 1441, 1442, 7, 119, 2, 2, 1442, 1443, 7, 110, 2, 2, 1443, 1444, 7, 110, 2, 2, 1444, 1445, 7, 47, 2, 2, 1445, 1446, 7, 112, 2, 2, 1446, 1447, 7, 113, 2, 2, 1447, 1448, 7, 102, 2, 2, 1448, 1449, 7, 103, 2, 2, 1449, 324, 3, 2, 2, 2, 1450, 1451, 7, 112, 2, 2, 1451, 1452, 7, 119, 2, 2, 1452, 1453, 7, 111, 2, 2, 1453, 1454, 7, 100, 2, 2, 1454, 1455, 7, 103, 2, 2, 1455, 1456, 7, 116, 2, 2, 1456, 1457, 7, 47, 2, 2, 1457, 1458, 7, 112, 2, 2, 1458, 1459, 7, 113, 2, 2, 1459, 1460, 7, 102, 2, 2, 1460, 1461, 7, 103, 2, 2, 1461, 326, 3, 2, 2, 2, 1462, 1463, 7, 113, 2, 2, 1463, 1464, 7, 100, 2, 2, 1464, 1465, 7, 108, 2, 2, 1465, 1466, 7, 103, 2, 2, 1466, 1467, 7, 101, 2, 2, 1467, 1468, 7, 118, 2, 2, 1468, 1469, 7, 47, 2, 2, 1469, 1470, 7, 112, 2, 2, 1470, 1471, 7, 113, 2, 2, 1471, 1472, 7, 102, 2, 2, 1472, 1473, 7, 103, 2, 2, 1473, 328, 3, 2, 2, 2, 1474, 1475, 7, 101, 2, 2, 1475, 1476, 7, 113, 2, 2, 1476, 1477, 7, 111, 2, 2, 1477, 1478, 7, 111, 2, 2, 1478, 1479, 7, 103, 2, 2, 1479, 1480, 7, 112, 2, 2, 1480, 1481, 7, 118, 2, 2, 1481, 330, 3, 2, 2, 2, 1482, 1483, 7, 99, 2, 2, 1483, 1484, 7, 116, 2, 2, 1484, 1485, 7, 116, 2, 2, 1485, 1486, 7, 99, 2, 2, 1486, 1487, 7, 123, 2, 2, 1487, 332, 3, 2, 2, 2, 1488, 1489, 7, 111, 2, 2, 1489, 1490, 7, 99, 2, 2, 1490, 1491, 7, 114, 2, 2, 1491, 334, 3, 2, 2, 2, 1492, 1497, 7, 36, 2, 2, 1493, 1496, 5, 337, 169, 2, 1494, 1496, 10, 2, 2, 2, 1495, 1493, 3, 2, 2, 2, 1495, 1494, 3, 2, 2, 2, 1496, 1499, 3, 2, 2, 2, 1497, 1495, 3, 2, 2, 2, 1497, 1498, 3, 2, 2, 2, 1498, 1500, 3, 2, 2, 2, 1499, 1497, 3, 2, 2, 2, 1500, 1501, 7, 36, 2, 2, 1501, 336, 3, 2, 2, 2, 1502, 1505, 7, 94, 2, 2, 1503, 1506, 9, 3, 2, 2, 1504, 1506, 5, 339, 170, 2, 1505, 1503, 3, 2, 2, 2, 1505, 1504, 3, 2, 2, 2, 1506, 338, 3, 2, 2, 2, 1507, 1508, 7, 119, 2, 2, 1508, 1509, 5, 341, 171, 2, 1509, 1510, 5, 341, 171, 2, 1510, 1511, 5, 341, 171, 2, 1511, 1512, 5, 341, 171, 2, 1512, 340, 3, 2, 2, 2, 1513, 1514, 9, 4, 2, 2, 1514, 342, 3, 2, 2, 2, 1515, 1516, 7, 65, 2, 2, 1516, 344, 3, 2, 2, 2, 1517, 1518, 7, 112, 2, 2, 1518, 1519, 7, 119, 2, 2, 1519, 1520, 7, 110, 2, 2, 1520, 1521, 7, 110, 2, 2, 1521, 346, 3, 2, 2, 2, 1522, 1523, 5, 349, 175, 2, 1523, 348, 3, 2, 2, 2, 1524, 1528, 5, 351, 176, 2, 1525, 1528, 5, 353, 177, 2, 1526, 1528, 5, 355, 178, 2, 1527, 1524, 3, 2, 2, 2, 1527, 1525, 3, 2, 2, 2, 1527, 1526, 3, 2, 2, 2, 1528, 350, 3, 2, 2, 2, 1529, 1530, 5, 357, 179, 2, 1530, 352, 3, 2, 2, 2, 1531, 1532, 7, 48, 2, 2, 1532, 1542, 5, 357, 179, 2, 1533, 1534, 5, 357, 179, 2, 1534, 1538, 7, 48, 2, 2, 1535, 1537, 9, 5, 2, 2, 1536, 1535, 3, 2, 2, 2, 1537, 1540, 3, 2, 2, 2, 1538, 1536, 3, 2, 2, 2, 1538, 1539, 3, 2, 2, 2, 1539, 1542, 3, 2, 2, 2, 1540, 1538, 3, 2, 2, 2, 1541, 1531, 3, 2, 2, 2, 1541, 1533, 3, 2, 2, 2, 1542, 354, 3, 2, 2, 2, 1543, 1544, 7, 48, 2, 2, 1544, 1556, 5, 357, 179, 2, 1545, 1553, 5, 357, 179, 2, 1546, 1550, 7, 48, 2, 2, 1547, 1549, 9, 5, 2, 2, 1548, 1547, 3, 2, 2, 2, 1549, 1552, 3, 2, 2, 2, 1550, 1548, 3, 2, 2, 2, 1550, 1551, 3, 2, 2, 2, 1551, 1554, 3, 2, 2, 2, 1552, 1550, 3, 2, 2, 2, 1553, 1546, 3, 2, 2, 2, 1553, 1554, 3, 2, 2, 2, 1554, 1556, 3, 2, 2, 2, 1555, 1543, 3, 2, 2, 2, 1555, 1545, 3, 2, 2, 2, 1556, 1557, 3, 2, 2, 2, 1557, 1559, 9, 6, 2, 2, 1558, 1560, 9, 7, 2, 2, 1559, 1558, 3, 2, 2, 2, 1559, 1560, 3, 2, 2, 2, 1560, 1561, 3, 2, 2, 2, 1561, 1562, 5, 357, 179, 2, 1562, 356, 3, 2, 2, 2, 1563, 1565, 9, 5, 2, 2, 1564, 1563, 3, 2, 2, 2, 1565, 1566, 3, 2, 2, 2, 1566, 1564, 3, 2, 2, 2, 1566, 1567, 3, 2, 2, 2, 1567, 358, 3, 2, 2, 2, 1568, 1569, 9, 8, 2, 2, 1569, 1570, 3, 2, 2, 2, 1570, 1571, 8, 180, 2, 2, 1571, 360, 3, 2, 2, 2, 1572, 1576, 5, 363, 182, 2, 1573, 1575, 5, 365, 183, 2, 1574, 1573, 3, 2, 2, 2, 1575, 1578, 3, 2, 2, 2, 1576, 1574, 3, 2, 2, 2, 1576, 1577, 3, 2, 2, 2, 1577, 362, 3, 2, 2, 2, 1578, 1576, 3, 2, 2, 2, 1579, 1581, 9, 9, 2, 2, 1580, 1579, 3, 2, 2, 2, 1581, 364, 3, 2, 2, 2, 1582, 1585, 5, 363, 182, 2, 1583, 1585, 9, 10, 2, 2, 1584, 1582, 3, 2, 2, 2, 1584, 1583, 3, 2, 2, 2, 1585, 366, 3, 2, 2, 2, 1586, 1587, 7, 42, 2, 2, 1587, 1596, 7, 60, 2, 2, 1588, 1595, 5, 367, 184, 2, 1589, 1590, 7, 42, 2, 2, 1590, 1595, 10, 11, 2, 2, 1591, 1592, 7, 60, 2, 2, 1592, 1595, 10, 12, 2, 2, 1593, 1595, 10, 13, 2, 2, 1594, 1588, 3, 2, 2, 2, 1594, 1589, 3, 2, 2, 2, 1594, 1591, 3, 2, 2, 2, 1594, 1593, 3, 2, 2, 2, 1595, 1598, 3, 2, 2, 2, 1596, 1594, 3, 2, 2, 2, 1596, 1597, 3, 2, 2, 2, 1597, 1600, 3, 2, 2, 2, 1598, 1596, 3, 2, 2, 2, 1599, 1601, 7, 60, 2, 2, 1600, 1599, 3, 2, 2, 2, 1601, 1602, 3, 2, 2, 2, 1602, 1600, 3, 2, 2, 2, 1602, 1603, 3, 2, 2, 2, 1603, 1604, 3, 2, 2, 2, 1604, 1605, 7, 43, 2, 2, 1605, 1606, 3, 2, 2, 2, 1606, 1607, 8, 184, 2, 2, 1607, 368, 3, 2, 2, 2, 1608, 1609, 10, 14, 2, 2, 1609, 370, 3, 2, 2, 2, 20, 2, 1495, 1497, 1505, 1527, 1538, 1541, 1550, 1553, 1555, 1559, 1566, 1576, 1580, 1584, 1594, 1596, 1602, 3, 2, 3, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 178, 1596, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 4, 181, 9, 181, 4, 182, 9, 182, 4, 183, 9, 183, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 7, 166, 1482, 10, 166, 12, 166, 14, 166, 1485, 11, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 5, 167, 1492, 10, 167, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 170, 3, 170, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 172, 3, 172, 3, 173, 3, 173, 3, 173, 5, 173, 1514, 10, 173, 3, 174, 3, 174, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 7, 175, 1523, 10, 175, 12, 175, 14, 175, 1526, 11, 175, 5, 175, 1528, 10, 175, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 7, 176, 1535, 10, 176, 12, 176, 14, 176, 1538, 11, 176, 5, 176, 1540, 10, 176, 5, 176, 1542, 10, 176, 3, 176, 3, 176, 5, 176, 1546, 10, 176, 3, 176, 3, 176, 3, 177, 6, 177, 1551, 10, 177, 13, 177, 14, 177, 1552, 3, 178, 3, 178, 3, 178, 3, 178, 3, 179, 3, 179, 7, 179, 1561, 10, 179, 12, 179, 14, 179, 1564, 11, 179, 3, 180, 5, 180, 1567, 10, 180, 3, 181, 3, 181, 5, 181, 1571, 10, 181, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 7, 182, 1581, 10, 182, 12, 182, 14, 182, 1584, 11, 182, 3, 182, 6, 182, 1587, 10, 182, 13, 182, 14, 182, 1588, 3, 182, 3, 182, 3, 182, 3, 182, 3, 183, 3, 183, 2, 2, 184, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 110, 219, 111, 221, 112, 223, 113, 225, 114, 227, 115, 229, 116, 231, 117, 233, 118, 235, 119, 237, 120, 239, 121, 241, 122, 243, 123, 245, 124, 247, 125, 249, 126, 251, 127, 253, 128, 255, 129, 257, 130, 259, 131, 261, 132, 263, 133, 265, 134, 267, 135, 269, 136, 271, 137, 273, 138, 275, 139, 277, 140, 279, 141, 281, 142, 283, 143, 285, 144, 287, 145, 289, 146, 291, 147, 293, 148, 295, 149, 297, 150, 299, 151, 301, 152, 303, 153, 305, 154, 307, 155, 309, 156, 311, 157, 313, 158, 315, 159, 317, 160, 319, 161, 321, 162, 323, 163, 325, 164, 327, 165, 329, 166, 331, 167, 333, 2, 335, 2, 337, 2, 339, 168, 341, 169, 343, 170, 345, 171, 347, 172, 349, 173, 351, 174, 353, 2, 355, 175, 357, 176, 359, 2, 361, 2, 363, 177, 365, 178, 3, 2, 15, 4, 2, 36, 36, 94, 94, 10, 2, 36, 36, 49, 49, 94, 94, 100, 100, 104, 104, 112, 112, 116, 116, 118, 118, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 50, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 5, 2, 11, 12, 15, 15, 34, 34, 16, 2, 67, 92, 97, 97, 99, 124, 194, 216, 218, 248, 250, 769, 882, 895, 897, 8193, 8206, 8207, 8306, 8593, 11266, 12273, 12291, 55297, 63746, 64977, 65010, 65535, 7, 2, 47, 47, 50, 59, 185, 185, 770, 881, 8257, 8258, 3, 2, 60, 60, 3, 2, 43, 43, 4, 2, 42, 42, 60, 60, 7, 2, 36, 36, 40, 41, 62, 62, 125, 125, 127, 127, 2, 1608, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 267, 3, 2, 2, 2, 2, 269, 3, 2, 2, 2, 2, 271, 3, 2, 2, 2, 2, 273, 3, 2, 2, 2, 2, 275, 3, 2, 2, 2, 2, 277, 3, 2, 2, 2, 2, 279, 3, 2, 2, 2, 2, 281, 3, 2, 2, 2, 2, 283, 3, 2, 2, 2, 2, 285, 3, 2, 2, 2, 2, 287, 3, 2, 2, 2, 2, 289, 3, 2, 2, 2, 2, 291, 3, 2, 2, 2, 2, 293, 3, 2, 2, 2, 2, 295, 3, 2, 2, 2, 2, 297, 3, 2, 2, 2, 2, 299, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 2, 303, 3, 2, 2, 2, 2, 305, 3, 2, 2, 2, 2, 307, 3, 2, 2, 2, 2, 309, 3, 2, 2, 2, 2, 311, 3, 2, 2, 2, 2, 313, 3, 2, 2, 2, 2, 315, 3, 2, 2, 2, 2, 317, 3, 2, 2, 2, 2, 319, 3, 2, 2, 2, 2, 321, 3, 2, 2, 2, 2, 323, 3, 2, 2, 2, 2, 325, 3, 2, 2, 2, 2, 327, 3, 2, 2, 2, 2, 329, 3, 2, 2, 2, 2, 331, 3, 2, 2, 2, 2, 339, 3, 2, 2, 2, 2, 341, 3, 2, 2, 2, 2, 343, 3, 2, 2, 2, 2, 345, 3, 2, 2, 2, 2, 347, 3, 2, 2, 2, 2, 349, 3, 2, 2, 2, 2, 351, 3, 2, 2, 2, 2, 355, 3, 2, 2, 2, 2, 357, 3, 2, 2, 2, 2, 363, 3, 2, 2, 2, 2, 365, 3, 2, 2, 2, 3, 367, 3, 2, 2, 2, 5, 369, 3, 2, 2, 2, 7, 376, 3, 2, 2, 2, 9, 378, 3, 2, 2, 2, 11, 380, 3, 2, 2, 2, 13, 383, 3, 2, 2, 2, 15, 385, 3, 2, 2, 2, 17, 387, 3, 2, 2, 2, 19, 389, 3, 2, 2, 2, 21, 391, 3, 2, 2, 2, 23, 393, 3, 2, 2, 2, 25, 395, 3, 2, 2, 2, 27, 397, 3, 2, 2, 2, 29, 399, 3, 2, 2, 2, 31, 408, 3, 2, 2, 2, 33, 416, 3, 2, 2, 2, 35, 431, 3, 2, 2, 2, 37, 433, 3, 2, 2, 2, 39, 451, 3, 2, 2, 2, 41, 470, 3, 2, 2, 2, 43, 479, 3, 2, 2, 2, 45, 490, 3, 2, 2, 2, 47, 494, 3, 2, 2, 2, 49, 502, 3, 2, 2, 2, 51, 512, 3, 2, 2, 2, 53, 523, 3, 2, 2, 2, 55, 529, 3, 2, 2, 2, 57, 547, 3, 2, 2, 2, 59, 556, 3, 2, 2, 2, 61, 565, 3, 2, 2, 2, 63, 572, 3, 2, 2, 2, 65, 580, 3, 2, 2, 2, 67, 588, 3, 2, 2, 2, 69, 591, 3, 2, 2, 2, 71, 594, 3, 2, 2, 2, 73, 597, 3, 2, 2, 2, 75, 600, 3, 2, 2, 2, 77, 603, 3, 2, 2, 2, 79, 606, 3, 2, 2, 2, 81, 609, 3, 2, 2, 2, 83, 611, 3, 2, 2, 2, 85, 614, 3, 2, 2, 2, 87, 616, 3, 2, 2, 2, 89, 619, 3, 2, 2, 2, 91, 622, 3, 2, 2, 2, 93, 624, 3, 2, 2, 2, 95, 626, 3, 2, 2, 2, 97, 630, 3, 2, 2, 2, 99, 635, 3, 2, 2, 2, 101, 639, 3, 2, 2, 2, 103, 641, 3, 2, 2, 2, 105, 643, 3, 2, 2, 2, 107, 645, 3, 2, 2, 2, 109, 647, 3, 2, 2, 2, 111, 650, 3, 2, 2, 2, 113, 652, 3, 2, 2, 2, 115, 655, 3, 2, 2, 2, 117, 658, 3, 2, 2, 2, 119, 661, 3, 2, 2, 2, 121, 665, 3, 2, 2, 2, 123, 669, 3, 2, 2, 2, 125, 675, 3, 2, 2, 2, 127, 681, 3, 2, 2, 2, 129, 684, 3, 2, 2, 2, 131, 690, 3, 2, 2, 2, 133, 697, 3, 2, 2, 2, 135, 700, 3, 2, 2, 2, 137, 703, 3, 2, 2, 2, 139, 706, 3, 2, 2, 2, 141, 709, 3, 2, 2, 2, 143, 718, 3, 2, 2, 2, 145, 724, 3, 2, 2, 2, 147, 730, 3, 2, 2, 2, 149, 737, 3, 2, 2, 2, 151, 747, 3, 2, 2, 2, 153, 758, 3, 2, 2, 2, 155, 763, 3, 2, 2, 2, 157, 769, 3, 2, 2, 2, 159, 779, 3, 2, 2, 2, 161, 789, 3, 2, 2, 2, 163, 798, 3, 2, 2, 2, 165, 804, 3, 2, 2, 2, 167, 811, 3, 2, 2, 2, 169, 816, 3, 2, 2, 2, 171, 820, 3, 2, 2, 2, 173, 826, 3, 2, 2, 2, 175, 834, 3, 2, 2, 2, 177, 839, 3, 2, 2, 2, 179, 844, 3, 2, 2, 2, 181, 855, 3, 2, 2, 2, 183, 858, 3, 2, 2, 2, 185, 862, 3, 2, 2, 2, 187, 866, 3, 2, 2, 2, 189, 869, 3, 2, 2, 2, 191, 878, 3, 2, 2, 2, 193, 881, 3, 2, 2, 2, 195, 892, 3, 2, 2, 2, 197, 895, 3, 2, 2, 2, 199, 901, 3, 2, 2, 2, 201, 906, 3, 2, 2, 2, 203, 915, 3, 2, 2, 2, 205, 923, 3, 2, 2, 2, 207, 930, 3, 2, 2, 2, 209, 940, 3, 2, 2, 2, 211, 945, 3, 2, 2, 2, 213, 951, 3, 2, 2, 2, 215, 956, 3, 2, 2, 2, 217, 965, 3, 2, 2, 2, 219, 974, 3, 2, 2, 2, 221, 982, 3, 2, 2, 2, 223, 990, 3, 2, 2, 2, 225, 995, 3, 2, 2, 2, 227, 1004, 3, 2, 2, 2, 229, 1011, 3, 2, 2, 2, 231, 1018, 3, 2, 2, 2, 233, 1025, 3, 2, 2, 2, 235, 1033, 3, 2, 2, 2, 237, 1038, 3, 2, 2, 2, 239, 1045, 3, 2, 2, 2, 241, 1052, 3, 2, 2, 2, 243, 1057, 3, 2, 2, 2, 245, 1063, 3, 2, 2, 2, 247, 1068, 3, 2, 2, 2, 249, 1073, 3, 2, 2, 2, 251, 1082, 3, 2, 2, 2, 253, 1089, 3, 2, 2, 2, 255, 1096, 3, 2, 2, 2, 257, 1106, 3, 2, 2, 2, 259, 1114, 3, 2, 2, 2, 261, 1116, 3, 2, 2, 2, 263, 1119, 3, 2, 2, 2, 265, 1121, 3, 2, 2, 2, 267, 1127, 3, 2, 2, 2, 269, 1138, 3, 2, 2, 2, 271, 1148, 3, 2, 2, 2, 273, 1153, 3, 2, 2, 2, 275, 1172, 3, 2, 2, 2, 277, 1190, 3, 2, 2, 2, 279, 1200, 3, 2, 2, 2, 281, 1207, 3, 2, 2, 2, 283, 1216, 3, 2, 2, 2, 285, 1234, 3, 2, 2, 2, 287, 1244, 3, 2, 2, 2, 289, 1261, 3, 2, 2, 2, 291, 1266, 3, 2, 2, 2, 293, 1273, 3, 2, 2, 2, 295, 1282, 3, 2, 2, 2, 297, 1296, 3, 2, 2, 2, 299, 1301, 3, 2, 2, 2, 301, 1324, 3, 2, 2, 2, 303, 1339, 3, 2, 2, 2, 305, 1356, 3, 2, 2, 2, 307, 1371, 3, 2, 2, 2, 309, 1382, 3, 2, 2, 2, 311, 1395, 3, 2, 2, 2, 313, 1405, 3, 2, 2, 2, 315, 1417, 3, 2, 2, 2, 317, 1429, 3, 2, 2, 2, 319, 1437, 3, 2, 2, 2, 321, 1443, 3, 2, 2, 2, 323, 1448, 3, 2, 2, 2, 325, 1457, 3, 2, 2, 2, 327, 1462, 3, 2, 2, 2, 329, 1472, 3, 2, 2, 2, 331, 1478, 3, 2, 2, 2, 333, 1488, 3, 2, 2, 2, 335, 1493, 3, 2, 2, 2, 337, 1499, 3, 2, 2, 2, 339, 1501, 3, 2, 2, 2, 341, 1503, 3, 2, 2, 2, 343, 1508, 3, 2, 2, 2, 345, 1513, 3, 2, 2, 2, 347, 1515, 3, 2, 2, 2, 349, 1527, 3, 2, 2, 2, 351, 1541, 3, 2, 2, 2, 353, 1550, 3, 2, 2, 2, 355, 1554, 3, 2, 2, 2, 357, 1558, 3, 2, 2, 2, 359, 1566, 3, 2, 2, 2, 361, 1570, 3, 2, 2, 2, 363, 1572, 3, 2, 2, 2, 365, 1594, 3, 2, 2, 2, 367, 368, 7, 61, 2, 2, 368, 4, 3, 2, 2, 2, 369, 370, 7, 111, 2, 2, 370, 371, 7, 113, 2, 2, 371, 372, 7, 102, 2, 2, 372, 373, 7, 119, 2, 2, 373, 374, 7, 110, 2, 2, 374, 375, 7, 103, 2, 2, 375, 6, 3, 2, 2, 2, 376, 377, 7, 63, 2, 2, 377, 8, 3, 2, 2, 2, 378, 379, 7, 38, 2, 2, 379, 10, 3, 2, 2, 2, 380, 381, 7, 60, 2, 2, 381, 382, 7, 63, 2, 2, 382, 12, 3, 2, 2, 2, 383, 384, 7, 125, 2, 2, 384, 14, 3, 2, 2, 2, 385, 386, 7, 127, 2, 2, 386, 16, 3, 2, 2, 2, 387, 388, 7, 42, 2, 2, 388, 18, 3, 2, 2, 2, 389, 390, 7, 43, 2, 2, 390, 20, 3, 2, 2, 2, 391, 392, 7, 44, 2, 2, 392, 22, 3, 2, 2, 2, 393, 394, 7, 126, 2, 2, 394, 24, 3, 2, 2, 2, 395, 396, 7, 39, 2, 2, 396, 26, 3, 2, 2, 2, 397, 398, 7, 46, 2, 2, 398, 28, 3, 2, 2, 2, 399, 400, 7, 113, 2, 2, 400, 401, 7, 116, 2, 2, 401, 402, 7, 102, 2, 2, 402, 403, 7, 103, 2, 2, 403, 404, 7, 116, 2, 2, 404, 405, 7, 107, 2, 2, 405, 406, 7, 112, 2, 2, 406, 407, 7, 105, 2, 2, 407, 30, 3, 2, 2, 2, 408, 409, 7, 113, 2, 2, 409, 410, 7, 116, 2, 2, 410, 411, 7, 102, 2, 2, 411, 412, 7, 103, 2, 2, 412, 413, 7, 116, 2, 2, 413, 414, 7, 103, 2, 2, 414, 415, 7, 102, 2, 2, 415, 32, 3, 2, 2, 2, 416, 417, 7, 102, 2, 2, 417, 418, 7, 103, 2, 2, 418, 419, 7, 101, 2, 2, 419, 420, 7, 107, 2, 2, 420, 421, 7, 111, 2, 2, 421, 422, 7, 99, 2, 2, 422, 423, 7, 110, 2, 2, 423, 424, 7, 47, 2, 2, 424, 425, 7, 104, 2, 2, 425, 426, 7, 113, 2, 2, 426, 427, 7, 116, 2, 2, 427, 428, 7, 111, 2, 2, 428, 429, 7, 99, 2, 2, 429, 430, 7, 118, 2, 2, 430, 34, 3, 2, 2, 2, 431, 432, 7, 60, 2, 2, 432, 36, 3, 2, 2, 2, 433, 434, 7, 102, 2, 2, 434, 435, 7, 103, 2, 2, 435, 436, 7, 101, 2, 2, 436, 437, 7, 107, 2, 2, 437, 438, 7, 111, 2, 2, 438, 439, 7, 99, 2, 2, 439, 440, 7, 110, 2, 2, 440, 441, 7, 47, 2, 2, 441, 442, 7, 117, 2, 2, 442, 443, 7, 103, 2, 2, 443, 444, 7, 114, 2, 2, 444, 445, 7, 99, 2, 2, 445, 446, 7, 116, 2, 2, 446, 447, 7, 99, 2, 2, 447, 448, 7, 118, 2, 2, 448, 449, 7, 113, 2, 2, 449, 450, 7, 116, 2, 2, 450, 38, 3, 2, 2, 2, 451, 452, 7, 105, 2, 2, 452, 453, 7, 116, 2, 2, 453, 454, 7, 113, 2, 2, 454, 455, 7, 119, 2, 2, 455, 456, 7, 114, 2, 2, 456, 457, 7, 107, 2, 2, 457, 458, 7, 112, 2, 2, 458, 459, 7, 105, 2, 2, 459, 460, 7, 47, 2, 2, 460, 461, 7, 117, 2, 2, 461, 462, 7, 103, 2, 2, 462, 463, 7, 114, 2, 2, 463, 464, 7, 99, 2, 2, 464, 465, 7, 116, 2, 2, 465, 466, 7, 99, 2, 2, 466, 467, 7, 118, 2, 2, 467, 468, 7, 113, 2, 2, 468, 469, 7, 116, 2, 2, 469, 40, 3, 2, 2, 2, 470, 471, 7, 107, 2, 2, 471, 472, 7, 112, 2, 2, 472, 473, 7, 104, 2, 2, 473, 474, 7, 107, 2, 2, 474, 475, 7, 112, 2, 2, 475, 476, 7, 107, 2, 2, 476, 477, 7, 118, 2, 2, 477, 478, 7, 123, 2, 2, 478, 42, 3, 2, 2, 2, 479, 480, 7, 111, 2, 2, 480, 481, 7, 107, 2, 2, 481, 482, 7, 112, 2, 2, 482, 483, 7, 119, 2, 2, 483, 484, 7, 117, 2, 2, 484, 485, 7, 47, 2, 2, 485, 486, 7, 117, 2, 2, 486, 487, 7, 107, 2, 2, 487, 488, 7, 105, 2, 2, 488, 489, 7, 112, 2, 2, 489, 44, 3, 2, 2, 2, 490, 491, 7, 80, 2, 2, 491, 492, 7, 99, 2, 2, 492, 493, 7, 80, 2, 2, 493, 46, 3, 2, 2, 2, 494, 495, 7, 114, 2, 2, 495, 496, 7, 103, 2, 2, 496, 497, 7, 116, 2, 2, 497, 498, 7, 101, 2, 2, 498, 499, 7, 103, 2, 2, 499, 500, 7, 112, 2, 2, 500, 501, 7, 118, 2, 2, 501, 48, 3, 2, 2, 2, 502, 503, 7, 114, 2, 2, 503, 504, 7, 103, 2, 2, 504, 505, 7, 116, 2, 2, 505, 506, 7, 47, 2, 2, 506, 507, 7, 111, 2, 2, 507, 508, 7, 107, 2, 2, 508, 509, 7, 110, 2, 2, 509, 510, 7, 110, 2, 2, 510, 511, 7, 103, 2, 2, 511, 50, 3, 2, 2, 2, 512, 513, 7, 124, 2, 2, 513, 514, 7, 103, 2, 2, 514, 515, 7, 116, 2, 2, 515, 516, 7, 113, 2, 2, 516, 517, 7, 47, 2, 2, 517, 518, 7, 102, 2, 2, 518, 519, 7, 107, 2, 2, 519, 520, 7, 105, 2, 2, 520, 521, 7, 107, 2, 2, 521, 522, 7, 118, 2, 2, 522, 52, 3, 2, 2, 2, 523, 524, 7, 102, 2, 2, 524, 525, 7, 107, 2, 2, 525, 526, 7, 105, 2, 2, 526, 527, 7, 107, 2, 2, 527, 528, 7, 118, 2, 2, 528, 54, 3, 2, 2, 2, 529, 530, 7, 114, 2, 2, 530, 531, 7, 99, 2, 2, 531, 532, 7, 118, 2, 2, 532, 533, 7, 118, 2, 2, 533, 534, 7, 103, 2, 2, 534, 535, 7, 116, 2, 2, 535, 536, 7, 112, 2, 2, 536, 537, 7, 47, 2, 2, 537, 538, 7, 117, 2, 2, 538, 539, 7, 103, 2, 2, 539, 540, 7, 114, 2, 2, 540, 541, 7, 99, 2, 2, 541, 542, 7, 116, 2, 2, 542, 543, 7, 99, 2, 2, 543, 544, 7, 118, 2, 2, 544, 545, 7, 113, 2, 2, 545, 546, 7, 116, 2, 2, 546, 56, 3, 2, 2, 2, 547, 548, 7, 103, 2, 2, 548, 549, 7, 122, 2, 2, 549, 550, 7, 118, 2, 2, 550, 551, 7, 103, 2, 2, 551, 552, 7, 116, 2, 2, 552, 553, 7, 112, 2, 2, 553, 554, 7, 99, 2, 2, 554, 555, 7, 110, 2, 2, 555, 58, 3, 2, 2, 2, 556, 557, 7, 104, 2, 2, 557, 558, 7, 119, 2, 2, 558, 559, 7, 112, 2, 2, 559, 560, 7, 101, 2, 2, 560, 561, 7, 118, 2, 2, 561, 562, 7, 107, 2, 2, 562, 563, 7, 113, 2, 2, 563, 564, 7, 112, 2, 2, 564, 60, 3, 2, 2, 2, 565, 566, 7, 108, 2, 2, 566, 567, 7, 117, 2, 2, 567, 568, 7, 113, 2, 2, 568, 569, 7, 119, 2, 2, 569, 570, 7, 112, 2, 2, 570, 571, 7, 102, 2, 2, 571, 62, 3, 2, 2, 2, 572, 573, 7, 101, 2, 2, 573, 574, 7, 113, 2, 2, 574, 575, 7, 111, 2, 2, 575, 576, 7, 114, 2, 2, 576, 577, 7, 99, 2, 2, 577, 578, 7, 101, 2, 2, 578, 579, 7, 118, 2, 2, 579, 64, 3, 2, 2, 2, 580, 581, 7, 120, 2, 2, 581, 582, 7, 103, 2, 2, 582, 583, 7, 116, 2, 2, 583, 584, 7, 100, 2, 2, 584, 585, 7, 113, 2, 2, 585, 586, 7, 117, 2, 2, 586, 587, 7, 103, 2, 2, 587, 66, 3, 2, 2, 2, 588, 589, 7, 103, 2, 2, 589, 590, 7, 115, 2, 2, 590, 68, 3, 2, 2, 2, 591, 592, 7, 112, 2, 2, 592, 593, 7, 103, 2, 2, 593, 70, 3, 2, 2, 2, 594, 595, 7, 110, 2, 2, 595, 596, 7, 118, 2, 2, 596, 72, 3, 2, 2, 2, 597, 598, 7, 110, 2, 2, 598, 599, 7, 103, 2, 2, 599, 74, 3, 2, 2, 2, 600, 601, 7, 105, 2, 2, 601, 602, 7, 118, 2, 2, 602, 76, 3, 2, 2, 2, 603, 604, 7, 105, 2, 2, 604, 605, 7, 103, 2, 2, 605, 78, 3, 2, 2, 2, 606, 607, 7, 35, 2, 2, 607, 608, 7, 63, 2, 2, 608, 80, 3, 2, 2, 2, 609, 610, 7, 62, 2, 2, 610, 82, 3, 2, 2, 2, 611, 612, 7, 62, 2, 2, 612, 613, 7, 63, 2, 2, 613, 84, 3, 2, 2, 2, 614, 615, 7, 64, 2, 2, 615, 86, 3, 2, 2, 2, 616, 617, 7, 64, 2, 2, 617, 618, 7, 63, 2, 2, 618, 88, 3, 2, 2, 2, 619, 620, 7, 126, 2, 2, 620, 621, 7, 126, 2, 2, 621, 90, 3, 2, 2, 2, 622, 623, 7, 45, 2, 2, 623, 92, 3, 2, 2, 2, 624, 625, 7, 47, 2, 2, 625, 94, 3, 2, 2, 2, 626, 627, 7, 102, 2, 2, 627, 628, 7, 107, 2, 2, 628, 629, 7, 120, 2, 2, 629, 96, 3, 2, 2, 2, 630, 631, 7, 107, 2, 2, 631, 632, 7, 102, 2, 2, 632, 633, 7, 107, 2, 2, 633, 634, 7, 120, 2, 2, 634, 98, 3, 2, 2, 2, 635, 636, 7, 111, 2, 2, 636, 637, 7, 113, 2, 2, 637, 638, 7, 102, 2, 2, 638, 100, 3, 2, 2, 2, 639, 640, 7, 35, 2, 2, 640, 102, 3, 2, 2, 2, 641, 642, 7, 93, 2, 2, 642, 104, 3, 2, 2, 2, 643, 644, 7, 95, 2, 2, 644, 106, 3, 2, 2, 2, 645, 646, 7, 48, 2, 2, 646, 108, 3, 2, 2, 2, 647, 648, 7, 38, 2, 2, 648, 649, 7, 38, 2, 2, 649, 110, 3, 2, 2, 2, 650, 651, 7, 37, 2, 2, 651, 112, 3, 2, 2, 2, 652, 653, 7, 48, 2, 2, 653, 654, 7, 48, 2, 2, 654, 114, 3, 2, 2, 2, 655, 656, 7, 125, 2, 2, 656, 657, 7, 126, 2, 2, 657, 116, 3, 2, 2, 2, 658, 659, 7, 126, 2, 2, 659, 660, 7, 127, 2, 2, 660, 118, 3, 2, 2, 2, 661, 662, 7, 104, 2, 2, 662, 663, 7, 113, 2, 2, 663, 664, 7, 116, 2, 2, 664, 120, 3, 2, 2, 2, 665, 666, 7, 110, 2, 2, 666, 667, 7, 103, 2, 2, 667, 668, 7, 118, 2, 2, 668, 122, 3, 2, 2, 2, 669, 670, 7, 121, 2, 2, 670, 671, 7, 106, 2, 2, 671, 672, 7, 103, 2, 2, 672, 673, 7, 116, 2, 2, 673, 674, 7, 103, 2, 2, 674, 124, 3, 2, 2, 2, 675, 676, 7, 105, 2, 2, 676, 677, 7, 116, 2, 2, 677, 678, 7, 113, 2, 2, 678, 679, 7, 119, 2, 2, 679, 680, 7, 114, 2, 2, 680, 126, 3, 2, 2, 2, 681, 682, 7, 100, 2, 2, 682, 683, 7, 123, 2, 2, 683, 128, 3, 2, 2, 2, 684, 685, 7, 113, 2, 2, 685, 686, 7, 116, 2, 2, 686, 687, 7, 102, 2, 2, 687, 688, 7, 103, 2, 2, 688, 689, 7, 116, 2, 2, 689, 130, 3, 2, 2, 2, 690, 691, 7, 116, 2, 2, 691, 692, 7, 103, 2, 2, 692, 693, 7, 118, 2, 2, 693, 694, 7, 119, 2, 2, 694, 695, 7, 116, 2, 2, 695, 696, 7, 112, 2, 2, 696, 132, 3, 2, 2, 2, 697, 698, 7, 107, 2, 2, 698, 699, 7, 104, 2, 2, 699, 134, 3, 2, 2, 2, 700, 701, 7, 107, 2, 2, 701, 702, 7, 112, 2, 2, 702, 136, 3, 2, 2, 2, 703, 704, 7, 99, 2, 2, 704, 705, 7, 117, 2, 2, 705, 138, 3, 2, 2, 2, 706, 707, 7, 99, 2, 2, 707, 708, 7, 118, 2, 2, 708, 140, 3, 2, 2, 2, 709, 710, 7, 99, 2, 2, 710, 711, 7, 110, 2, 2, 711, 712, 7, 110, 2, 2, 712, 713, 7, 113, 2, 2, 713, 714, 7, 121, 2, 2, 714, 715, 7, 107, 2, 2, 715, 716, 7, 112, 2, 2, 716, 717, 7, 105, 2, 2, 717, 142, 3, 2, 2, 2, 718, 719, 7, 103, 2, 2, 719, 720, 7, 111, 2, 2, 720, 721, 7, 114, 2, 2, 721, 722, 7, 118, 2, 2, 722, 723, 7, 123, 2, 2, 723, 144, 3, 2, 2, 2, 724, 725, 7, 101, 2, 2, 725, 726, 7, 113, 2, 2, 726, 727, 7, 119, 2, 2, 727, 728, 7, 112, 2, 2, 728, 729, 7, 118, 2, 2, 729, 146, 3, 2, 2, 2, 730, 731, 7, 117, 2, 2, 731, 732, 7, 118, 2, 2, 732, 733, 7, 99, 2, 2, 733, 734, 7, 100, 2, 2, 734, 735, 7, 110, 2, 2, 735, 736, 7, 103, 2, 2, 736, 148, 3, 2, 2, 2, 737, 738, 7, 99, 2, 2, 738, 739, 7, 117, 2, 2, 739, 740, 7, 101, 2, 2, 740, 741, 7, 103, 2, 2, 741, 742, 7, 112, 2, 2, 742, 743, 7, 102, 2, 2, 743, 744, 7, 107, 2, 2, 744, 745, 7, 112, 2, 2, 745, 746, 7, 105, 2, 2, 746, 150, 3, 2, 2, 2, 747, 748, 7, 102, 2, 2, 748, 749, 7, 103, 2, 2, 749, 750, 7, 117, 2, 2, 750, 751, 7, 101, 2, 2, 751, 752, 7, 103, 2, 2, 752, 753, 7, 112, 2, 2, 753, 754, 7, 102, 2, 2, 754, 755, 7, 107, 2, 2, 755, 756, 7, 112, 2, 2, 756, 757, 7, 105, 2, 2, 757, 152, 3, 2, 2, 2, 758, 759, 7, 117, 2, 2, 759, 760, 7, 113, 2, 2, 760, 761, 7, 111, 2, 2, 761, 762, 7, 103, 2, 2, 762, 154, 3, 2, 2, 2, 763, 764, 7, 103, 2, 2, 764, 765, 7, 120, 2, 2, 765, 766, 7, 103, 2, 2, 766, 767, 7, 116, 2, 2, 767, 768, 7, 123, 2, 2, 768, 156, 3, 2, 2, 2, 769, 770, 7, 117, 2, 2, 770, 771, 7, 99, 2, 2, 771, 772, 7, 118, 2, 2, 772, 773, 7, 107, 2, 2, 773, 774, 7, 117, 2, 2, 774, 775, 7, 104, 2, 2, 775, 776, 7, 107, 2, 2, 776, 777, 7, 103, 2, 2, 777, 778, 7, 117, 2, 2, 778, 158, 3, 2, 2, 2, 779, 780, 7, 101, 2, 2, 780, 781, 7, 113, 2, 2, 781, 782, 7, 110, 2, 2, 782, 783, 7, 110, 2, 2, 783, 784, 7, 99, 2, 2, 784, 785, 7, 118, 2, 2, 785, 786, 7, 107, 2, 2, 786, 787, 7, 113, 2, 2, 787, 788, 7, 112, 2, 2, 788, 160, 3, 2, 2, 2, 789, 790, 7, 105, 2, 2, 790, 791, 7, 116, 2, 2, 791, 792, 7, 103, 2, 2, 792, 793, 7, 99, 2, 2, 793, 794, 7, 118, 2, 2, 794, 795, 7, 103, 2, 2, 795, 796, 7, 117, 2, 2, 796, 797, 7, 118, 2, 2, 797, 162, 3, 2, 2, 2, 798, 799, 7, 110, 2, 2, 799, 800, 7, 103, 2, 2, 800, 801, 7, 99, 2, 2, 801, 802, 7, 117, 2, 2, 802, 803, 7, 118, 2, 2, 803, 164, 3, 2, 2, 2, 804, 805, 7, 117, 2, 2, 805, 806, 7, 121, 2, 2, 806, 807, 7, 107, 2, 2, 807, 808, 7, 118, 2, 2, 808, 809, 7, 101, 2, 2, 809, 810, 7, 106, 2, 2, 810, 166, 3, 2, 2, 2, 811, 812, 7, 101, 2, 2, 812, 813, 7, 99, 2, 2, 813, 814, 7, 117, 2, 2, 814, 815, 7, 103, 2, 2, 815, 168, 3, 2, 2, 2, 816, 817, 7, 118, 2, 2, 817, 818, 7, 116, 2, 2, 818, 819, 7, 123, 2, 2, 819, 170, 3, 2, 2, 2, 820, 821, 7, 101, 2, 2, 821, 822, 7, 99, 2, 2, 822, 823, 7, 118, 2, 2, 823, 824, 7, 101, 2, 2, 824, 825, 7, 106, 2, 2, 825, 172, 3, 2, 2, 2, 826, 827, 7, 102, 2, 2, 827, 828, 7, 103, 2, 2, 828, 829, 7, 104, 2, 2, 829, 830, 7, 99, 2, 2, 830, 831, 7, 119, 2, 2, 831, 832, 7, 110, 2, 2, 832, 833, 7, 118, 2, 2, 833, 174, 3, 2, 2, 2, 834, 835, 7, 118, 2, 2, 835, 836, 7, 106, 2, 2, 836, 837, 7, 103, 2, 2, 837, 838, 7, 112, 2, 2, 838, 176, 3, 2, 2, 2, 839, 840, 7, 103, 2, 2, 840, 841, 7, 110, 2, 2, 841, 842, 7, 117, 2, 2, 842, 843, 7, 103, 2, 2, 843, 178, 3, 2, 2, 2, 844, 845, 7, 118, 2, 2, 845, 846, 7, 123, 2, 2, 846, 847, 7, 114, 2, 2, 847, 848, 7, 103, 2, 2, 848, 849, 7, 117, 2, 2, 849, 850, 7, 121, 2, 2, 850, 851, 7, 107, 2, 2, 851, 852, 7, 118, 2, 2, 852, 853, 7, 101, 2, 2, 853, 854, 7, 106, 2, 2, 854, 180, 3, 2, 2, 2, 855, 856, 7, 113, 2, 2, 856, 857, 7, 116, 2, 2, 857, 182, 3, 2, 2, 2, 858, 859, 7, 99, 2, 2, 859, 860, 7, 112, 2, 2, 860, 861, 7, 102, 2, 2, 861, 184, 3, 2, 2, 2, 862, 863, 7, 112, 2, 2, 863, 864, 7, 113, 2, 2, 864, 865, 7, 118, 2, 2, 865, 186, 3, 2, 2, 2, 866, 867, 7, 118, 2, 2, 867, 868, 7, 113, 2, 2, 868, 188, 3, 2, 2, 2, 869, 870, 7, 107, 2, 2, 870, 871, 7, 112, 2, 2, 871, 872, 7, 117, 2, 2, 872, 873, 7, 118, 2, 2, 873, 874, 7, 99, 2, 2, 874, 875, 7, 112, 2, 2, 875, 876, 7, 101, 2, 2, 876, 877, 7, 103, 2, 2, 877, 190, 3, 2, 2, 2, 878, 879, 7, 113, 2, 2, 879, 880, 7, 104, 2, 2, 880, 192, 3, 2, 2, 2, 881, 882, 7, 117, 2, 2, 882, 883, 7, 118, 2, 2, 883, 884, 7, 99, 2, 2, 884, 885, 7, 118, 2, 2, 885, 886, 7, 107, 2, 2, 886, 887, 7, 101, 2, 2, 887, 888, 7, 99, 2, 2, 888, 889, 7, 110, 2, 2, 889, 890, 7, 110, 2, 2, 890, 891, 7, 123, 2, 2, 891, 194, 3, 2, 2, 2, 892, 893, 7, 107, 2, 2, 893, 894, 7, 117, 2, 2, 894, 196, 3, 2, 2, 2, 895, 896, 7, 118, 2, 2, 896, 897, 7, 116, 2, 2, 897, 898, 7, 103, 2, 2, 898, 899, 7, 99, 2, 2, 899, 900, 7, 118, 2, 2, 900, 198, 3, 2, 2, 2, 901, 902, 7, 101, 2, 2, 902, 903, 7, 99, 2, 2, 903, 904, 7, 117, 2, 2, 904, 905, 7, 118, 2, 2, 905, 200, 3, 2, 2, 2, 906, 907, 7, 101, 2, 2, 907, 908, 7, 99, 2, 2, 908, 909, 7, 117, 2, 2, 909, 910, 7, 118, 2, 2, 910, 911, 7, 99, 2, 2, 911, 912, 7, 100, 2, 2, 912, 913, 7, 110, 2, 2, 913, 914, 7, 103, 2, 2, 914, 202, 3, 2, 2, 2, 915, 916, 7, 120, 2, 2, 916, 917, 7, 103, 2, 2, 917, 918, 7, 116, 2, 2, 918, 919, 7, 117, 2, 2, 919, 920, 7, 107, 2, 2, 920, 921, 7, 113, 2, 2, 921, 922, 7, 112, 2, 2, 922, 204, 3, 2, 2, 2, 923, 924, 7, 108, 2, 2, 924, 925, 7, 117, 2, 2, 925, 926, 7, 113, 2, 2, 926, 927, 7, 112, 2, 2, 927, 928, 7, 107, 2, 2, 928, 929, 7, 115, 2, 2, 929, 206, 3, 2, 2, 2, 930, 931, 7, 119, 2, 2, 931, 932, 7, 112, 2, 2, 932, 933, 7, 113, 2, 2, 933, 934, 7, 116, 2, 2, 934, 935, 7, 102, 2, 2, 935, 936, 7, 103, 2, 2, 936, 937, 7, 116, 2, 2, 937, 938, 7, 103, 2, 2, 938, 939, 7, 102, 2, 2, 939, 208, 3, 2, 2, 2, 940, 941, 7, 118, 2, 2, 941, 942, 7, 116, 2, 2, 942, 943, 7, 119, 2, 2, 943, 944, 7, 103, 2, 2, 944, 210, 3, 2, 2, 2, 945, 946, 7, 104, 2, 2, 946, 947, 7, 99, 2, 2, 947, 948, 7, 110, 2, 2, 948, 949, 7, 117, 2, 2, 949, 950, 7, 103, 2, 2, 950, 212, 3, 2, 2, 2, 951, 952, 7, 118, 2, 2, 952, 953, 7, 123, 2, 2, 953, 954, 7, 114, 2, 2, 954, 955, 7, 103, 2, 2, 955, 214, 3, 2, 2, 2, 956, 957, 7, 120, 2, 2, 957, 958, 7, 99, 2, 2, 958, 959, 7, 110, 2, 2, 959, 960, 7, 107, 2, 2, 960, 961, 7, 102, 2, 2, 961, 962, 7, 99, 2, 2, 962, 963, 7, 118, 2, 2, 963, 964, 7, 103, 2, 2, 964, 216, 3, 2, 2, 2, 965, 966, 7, 99, 2, 2, 966, 967, 7, 112, 2, 2, 967, 968, 7, 112, 2, 2, 968, 969, 7, 113, 2, 2, 969, 970, 7, 118, 2, 2, 970, 971, 7, 99, 2, 2, 971, 972, 7, 118, 2, 2, 972, 973, 7, 103, 2, 2, 973, 218, 3, 2, 2, 2, 974, 975, 7, 102, 2, 2, 975, 976, 7, 103, 2, 2, 976, 977, 7, 101, 2, 2, 977, 978, 7, 110, 2, 2, 978, 979, 7, 99, 2, 2, 979, 980, 7, 116, 2, 2, 980, 981, 7, 103, 2, 2, 981, 220, 3, 2, 2, 2, 982, 983, 7, 101, 2, 2, 983, 984, 7, 113, 2, 2, 984, 985, 7, 112, 2, 2, 985, 986, 7, 118, 2, 2, 986, 987, 7, 103, 2, 2, 987, 988, 7, 122, 2, 2, 988, 989, 7, 118, 2, 2, 989, 222, 3, 2, 2, 2, 990, 991, 7, 107, 2, 2, 991, 992, 7, 118, 2, 2, 992, 993, 7, 103, 2, 2, 993, 994, 7, 111, 2, 2, 994, 224, 3, 2, 2, 2, 995, 996, 7, 120, 2, 2, 996, 997, 7, 99, 2, 2, 997, 998, 7, 116, 2, 2, 998, 999, 7, 107, 2, 2, 999, 1000, 7, 99, 2, 2, 1000, 1001, 7, 100, 2, 2, 1001, 1002, 7, 110, 2, 2, 1002, 1003, 7, 103, 2, 2, 1003, 226, 3, 2, 2, 2, 1004, 1005, 7, 107, 2, 2, 1005, 1006, 7, 112, 2, 2, 1006, 1007, 7, 117, 2, 2, 1007, 1008, 7, 103, 2, 2, 1008, 1009, 7, 116, 2, 2, 1009, 1010, 7, 118, 2, 2, 1010, 228, 3, 2, 2, 2, 1011, 1012, 7, 102, 2, 2, 1012, 1013, 7, 103, 2, 2, 1013, 1014, 7, 110, 2, 2, 1014, 1015, 7, 103, 2, 2, 1015, 1016, 7, 118, 2, 2, 1016, 1017, 7, 103, 2, 2, 1017, 230, 3, 2, 2, 2, 1018, 1019, 7, 116, 2, 2, 1019, 1020, 7, 103, 2, 2, 1020, 1021, 7, 112, 2, 2, 1021, 1022, 7, 99, 2, 2, 1022, 1023, 7, 111, 2, 2, 1023, 1024, 7, 103, 2, 2, 1024, 232, 3, 2, 2, 2, 1025, 1026, 7, 116, 2, 2, 1026, 1027, 7, 103, 2, 2, 1027, 1028, 7, 114, 2, 2, 1028, 1029, 7, 110, 2, 2, 1029, 1030, 7, 99, 2, 2, 1030, 1031, 7, 101, 2, 2, 1031, 1032, 7, 103, 2, 2, 1032, 234, 3, 2, 2, 2, 1033, 1034, 7, 101, 2, 2, 1034, 1035, 7, 113, 2, 2, 1035, 1036, 7, 114, 2, 2, 1036, 1037, 7, 123, 2, 2, 1037, 236, 3, 2, 2, 2, 1038, 1039, 7, 111, 2, 2, 1039, 1040, 7, 113, 2, 2, 1040, 1041, 7, 102, 2, 2, 1041, 1042, 7, 107, 2, 2, 1042, 1043, 7, 104, 2, 2, 1043, 1044, 7, 123, 2, 2, 1044, 238, 3, 2, 2, 2, 1045, 1046, 7, 99, 2, 2, 1046, 1047, 7, 114, 2, 2, 1047, 1048, 7, 114, 2, 2, 1048, 1049, 7, 103, 2, 2, 1049, 1050, 7, 112, 2, 2, 1050, 1051, 7, 102, 2, 2, 1051, 240, 3, 2, 2, 2, 1052, 1053, 7, 107, 2, 2, 1053, 1054, 7, 112, 2, 2, 1054, 1055, 7, 118, 2, 2, 1055, 1056, 7, 113, 2, 2, 1056, 242, 3, 2, 2, 2, 1057, 1058, 7, 120, 2, 2, 1058, 1059, 7, 99, 2, 2, 1059, 1060, 7, 110, 2, 2, 1060, 1061, 7, 119, 2, 2, 1061, 1062, 7, 103, 2, 2, 1062, 244, 3, 2, 2, 2, 1063, 1064, 7, 108, 2, 2, 1064, 1065, 7, 117, 2, 2, 1065, 1066, 7, 113, 2, 2, 1066, 1067, 7, 112, 2, 2, 1067, 246, 3, 2, 2, 2, 1068, 1069, 7, 121, 2, 2, 1069, 1070, 7, 107, 2, 2, 1070, 1071, 7, 118, 2, 2, 1071, 1072, 7, 106, 2, 2, 1072, 248, 3, 2, 2, 2, 1073, 1074, 7, 114, 2, 2, 1074, 1075, 7, 113, 2, 2, 1075, 1076, 7, 117, 2, 2, 1076, 1077, 7, 107, 2, 2, 1077, 1078, 7, 118, 2, 2, 1078, 1079, 7, 107, 2, 2, 1079, 1080, 7, 113, 2, 2, 1080, 1081, 7, 112, 2, 2, 1081, 250, 3, 2, 2, 2, 1082, 1083, 7, 107, 2, 2, 1083, 1084, 7, 111, 2, 2, 1084, 1085, 7, 114, 2, 2, 1085, 1086, 7, 113, 2, 2, 1086, 1087, 7, 116, 2, 2, 1087, 1088, 7, 118, 2, 2, 1088, 252, 3, 2, 2, 2, 1089, 1090, 7, 117, 2, 2, 1090, 1091, 7, 101, 2, 2, 1091, 1092, 7, 106, 2, 2, 1092, 1093, 7, 103, 2, 2, 1093, 1094, 7, 111, 2, 2, 1094, 1095, 7, 99, 2, 2, 1095, 254, 3, 2, 2, 2, 1096, 1097, 7, 112, 2, 2, 1097, 1098, 7, 99, 2, 2, 1098, 1099, 7, 111, 2, 2, 1099, 1100, 7, 103, 2, 2, 1100, 1101, 7, 117, 2, 2, 1101, 1102, 7, 114, 2, 2, 1102, 1103, 7, 99, 2, 2, 1103, 1104, 7, 101, 2, 2, 1104, 1105, 7, 103, 2, 2, 1105, 256, 3, 2, 2, 2, 1106, 1107, 7, 103, 2, 2, 1107, 1108, 7, 110, 2, 2, 1108, 1109, 7, 103, 2, 2, 1109, 1110, 7, 111, 2, 2, 1110, 1111, 7, 103, 2, 2, 1111, 1112, 7, 112, 2, 2, 1112, 1113, 7, 118, 2, 2, 1113, 258, 3, 2, 2, 2, 1114, 1115, 7, 49, 2, 2, 1115, 260, 3, 2, 2, 2, 1116, 1117, 7, 49, 2, 2, 1117, 1118, 7, 49, 2, 2, 1118, 262, 3, 2, 2, 2, 1119, 1120, 7, 66, 2, 2, 1120, 264, 3, 2, 2, 2, 1121, 1122, 7, 101, 2, 2, 1122, 1123, 7, 106, 2, 2, 1123, 1124, 7, 107, 2, 2, 1124, 1125, 7, 110, 2, 2, 1125, 1126, 7, 102, 2, 2, 1126, 266, 3, 2, 2, 2, 1127, 1128, 7, 102, 2, 2, 1128, 1129, 7, 103, 2, 2, 1129, 1130, 7, 117, 2, 2, 1130, 1131, 7, 101, 2, 2, 1131, 1132, 7, 103, 2, 2, 1132, 1133, 7, 112, 2, 2, 1133, 1134, 7, 102, 2, 2, 1134, 1135, 7, 99, 2, 2, 1135, 1136, 7, 112, 2, 2, 1136, 1137, 7, 118, 2, 2, 1137, 268, 3, 2, 2, 2, 1138, 1139, 7, 99, 2, 2, 1139, 1140, 7, 118, 2, 2, 1140, 1141, 7, 118, 2, 2, 1141, 1142, 7, 116, 2, 2, 1142, 1143, 7, 107, 2, 2, 1143, 1144, 7, 100, 2, 2, 1144, 1145, 7, 119, 2, 2, 1145, 1146, 7, 118, 2, 2, 1146, 1147, 7, 103, 2, 2, 1147, 270, 3, 2, 2, 2, 1148, 1149, 7, 117, 2, 2, 1149, 1150, 7, 103, 2, 2, 1150, 1151, 7, 110, 2, 2, 1151, 1152, 7, 104, 2, 2, 1152, 272, 3, 2, 2, 2, 1153, 1154, 7, 102, 2, 2, 1154, 1155, 7, 103, 2, 2, 1155, 1156, 7, 117, 2, 2, 1156, 1157, 7, 101, 2, 2, 1157, 1158, 7, 103, 2, 2, 1158, 1159, 7, 112, 2, 2, 1159, 1160, 7, 102, 2, 2, 1160, 1161, 7, 99, 2, 2, 1161, 1162, 7, 112, 2, 2, 1162, 1163, 7, 118, 2, 2, 1163, 1164, 7, 47, 2, 2, 1164, 1165, 7, 113, 2, 2, 1165, 1166, 7, 116, 2, 2, 1166, 1167, 7, 47, 2, 2, 1167, 1168, 7, 117, 2, 2, 1168, 1169, 7, 103, 2, 2, 1169, 1170, 7, 110, 2, 2, 1170, 1171, 7, 104, 2, 2, 1171, 274, 3, 2, 2, 2, 1172, 1173, 7, 104, 2, 2, 1173, 1174, 7, 113, 2, 2, 1174, 1175, 7, 110, 2, 2, 1175, 1176, 7, 110, 2, 2, 1176, 1177, 7, 113, 2, 2, 1177, 1178, 7, 121, 2, 2, 1178, 1179, 7, 107, 2, 2, 1179, 1180, 7, 112, 2, 2, 1180, 1181, 7, 105, 2, 2, 1181, 1182, 7, 47, 2, 2, 1182, 1183, 7, 117, 2, 2, 1183, 1184, 7, 107, 2, 2, 1184, 1185, 7, 100, 2, 2, 1185, 1186, 7, 110, 2, 2, 1186, 1187, 7, 107, 2, 2, 1187, 1188, 7, 112, 2, 2, 1188, 1189, 7, 105, 2, 2, 1189, 276, 3, 2, 2, 2, 1190, 1191, 7, 104, 2, 2, 1191, 1192, 7, 113, 2, 2, 1192, 1193, 7, 110, 2, 2, 1193, 1194, 7, 110, 2, 2, 1194, 1195, 7, 113, 2, 2, 1195, 1196, 7, 121, 2, 2, 1196, 1197, 7, 107, 2, 2, 1197, 1198, 7, 112, 2, 2, 1198, 1199, 7, 105, 2, 2, 1199, 278, 3, 2, 2, 2, 1200, 1201, 7, 114, 2, 2, 1201, 1202, 7, 99, 2, 2, 1202, 1203, 7, 116, 2, 2, 1203, 1204, 7, 103, 2, 2, 1204, 1205, 7, 112, 2, 2, 1205, 1206, 7, 118, 2, 2, 1206, 280, 3, 2, 2, 2, 1207, 1208, 7, 99, 2, 2, 1208, 1209, 7, 112, 2, 2, 1209, 1210, 7, 101, 2, 2, 1210, 1211, 7, 103, 2, 2, 1211, 1212, 7, 117, 2, 2, 1212, 1213, 7, 118, 2, 2, 1213, 1214, 7, 113, 2, 2, 1214, 1215, 7, 116, 2, 2, 1215, 282, 3, 2, 2, 2, 1216, 1217, 7, 114, 2, 2, 1217, 1218, 7, 116, 2, 2, 1218, 1219, 7, 103, 2, 2, 1219, 1220, 7, 101, 2, 2, 1220, 1221, 7, 103, 2, 2, 1221, 1222, 7, 102, 2, 2, 1222, 1223, 7, 107, 2, 2, 1223, 1224, 7, 112, 2, 2, 1224, 1225, 7, 105, 2, 2, 1225, 1226, 7, 47, 2, 2, 1226, 1227, 7, 117, 2, 2, 1227, 1228, 7, 107, 2, 2, 1228, 1229, 7, 100, 2, 2, 1229, 1230, 7, 110, 2, 2, 1230, 1231, 7, 107, 2, 2, 1231, 1232, 7, 112, 2, 2, 1232, 1233, 7, 105, 2, 2, 1233, 284, 3, 2, 2, 2, 1234, 1235, 7, 114, 2, 2, 1235, 1236, 7, 116, 2, 2, 1236, 1237, 7, 103, 2, 2, 1237, 1238, 7, 101, 2, 2, 1238, 1239, 7, 103, 2, 2, 1239, 1240, 7, 102, 2, 2, 1240, 1241, 7, 107, 2, 2, 1241, 1242, 7, 112, 2, 2, 1242, 1243, 7, 105, 2, 2, 1243, 286, 3, 2, 2, 2, 1244, 1245, 7, 99, 2, 2, 1245, 1246, 7, 112, 2, 2, 1246, 1247, 7, 101, 2, 2, 1247, 1248, 7, 103, 2, 2, 1248, 1249, 7, 117, 2, 2, 1249, 1250, 7, 118, 2, 2, 1250, 1251, 7, 113, 2, 2, 1251, 1252, 7, 116, 2, 2, 1252, 1253, 7, 47, 2, 2, 1253, 1254, 7, 113, 2, 2, 1254, 1255, 7, 116, 2, 2, 1255, 1256, 7, 47, 2, 2, 1256, 1257, 7, 117, 2, 2, 1257, 1258, 7, 103, 2, 2, 1258, 1259, 7, 110, 2, 2, 1259, 1260, 7, 104, 2, 2, 1260, 288, 3, 2, 2, 2, 1261, 1262, 7, 112, 2, 2, 1262, 1263, 7, 113, 2, 2, 1263, 1264, 7, 102, 2, 2, 1264, 1265, 7, 103, 2, 2, 1265, 290, 3, 2, 2, 2, 1266, 1267, 7, 100, 2, 2, 1267, 1268, 7, 107, 2, 2, 1268, 1269, 7, 112, 2, 2, 1269, 1270, 7, 99, 2, 2, 1270, 1271, 7, 116, 2, 2, 1271, 1272, 7, 123, 2, 2, 1272, 292, 3, 2, 2, 2, 1273, 1274, 7, 102, 2, 2, 1274, 1275, 7, 113, 2, 2, 1275, 1276, 7, 101, 2, 2, 1276, 1277, 7, 119, 2, 2, 1277, 1278, 7, 111, 2, 2, 1278, 1279, 7, 103, 2, 2, 1279, 1280, 7, 112, 2, 2, 1280, 1281, 7, 118, 2, 2, 1281, 294, 3, 2, 2, 2, 1282, 1283, 7, 102, 2, 2, 1283, 1284, 7, 113, 2, 2, 1284, 1285, 7, 101, 2, 2, 1285, 1286, 7, 119, 2, 2, 1286, 1287, 7, 111, 2, 2, 1287, 1288, 7, 103, 2, 2, 1288, 1289, 7, 112, 2, 2, 1289, 1290, 7, 118, 2, 2, 1290, 1291, 7, 47, 2, 2, 1291, 1292, 7, 112, 2, 2, 1292, 1293, 7, 113, 2, 2, 1293, 1294, 7, 102, 2, 2, 1294, 1295, 7, 103, 2, 2, 1295, 296, 3, 2, 2, 2, 1296, 1297, 7, 118, 2, 2, 1297, 1298, 7, 103, 2, 2, 1298, 1299, 7, 122, 2, 2, 1299, 1300, 7, 118, 2, 2, 1300, 298, 3, 2, 2, 2, 1301, 1302, 7, 114, 2, 2, 1302, 1303, 7, 116, 2, 2, 1303, 1304, 7, 113, 2, 2, 1304, 1305, 7, 101, 2, 2, 1305, 1306, 7, 103, 2, 2, 1306, 1307, 7, 117, 2, 2, 1307, 1308, 7, 117, 2, 2, 1308, 1309, 7, 107, 2, 2, 1309, 1310, 7, 112, 2, 2, 1310, 1311, 7, 105, 2, 2, 1311, 1312, 7, 47, 2, 2, 1312, 1313, 7, 107, 2, 2, 1313, 1314, 7, 112, 2, 2, 1314, 1315, 7, 117, 2, 2, 1315, 1316, 7, 118, 2, 2, 1316, 1317, 7, 116, 2, 2, 1317, 1318, 7, 119, 2, 2, 1318, 1319, 7, 101, 2, 2, 1319, 1320, 7, 118, 2, 2, 1320, 1321, 7, 107, 2, 2, 1321, 1322, 7, 113, 2, 2, 1322, 1323, 7, 112, 2, 2, 1323, 300, 3, 2, 2, 2, 1324, 1325, 7, 112, 2, 2, 1325, 1326, 7, 99, 2, 2, 1326, 1327, 7, 111, 2, 2, 1327, 1328, 7, 103, 2, 2, 1328, 1329, 7, 117, 2, 2, 1329, 1330, 7, 114, 2, 2, 1330, 1331, 7, 99, 2, 2, 1331, 1332, 7, 101, 2, 2, 1332, 1333, 7, 103, 2, 2, 1333, 1334, 7, 47, 2, 2, 1334, 1335, 7, 112, 2, 2, 1335, 1336, 7, 113, 2, 2, 1336, 1337, 7, 102, 2, 2, 1337, 1338, 7, 103, 2, 2, 1338, 302, 3, 2, 2, 2, 1339, 1340, 7, 117, 2, 2, 1340, 1341, 7, 101, 2, 2, 1341, 1342, 7, 106, 2, 2, 1342, 1343, 7, 103, 2, 2, 1343, 1344, 7, 111, 2, 2, 1344, 1345, 7, 99, 2, 2, 1345, 1346, 7, 47, 2, 2, 1346, 1347, 7, 99, 2, 2, 1347, 1348, 7, 118, 2, 2, 1348, 1349, 7, 118, 2, 2, 1349, 1350, 7, 116, 2, 2, 1350, 1351, 7, 107, 2, 2, 1351, 1352, 7, 100, 2, 2, 1352, 1353, 7, 119, 2, 2, 1353, 1354, 7, 118, 2, 2, 1354, 1355, 7, 103, 2, 2, 1355, 304, 3, 2, 2, 2, 1356, 1357, 7, 117, 2, 2, 1357, 1358, 7, 101, 2, 2, 1358, 1359, 7, 106, 2, 2, 1359, 1360, 7, 103, 2, 2, 1360, 1361, 7, 111, 2, 2, 1361, 1362, 7, 99, 2, 2, 1362, 1363, 7, 47, 2, 2, 1363, 1364, 7, 103, 2, 2, 1364, 1365, 7, 110, 2, 2, 1365, 1366, 7, 103, 2, 2, 1366, 1367, 7, 111, 2, 2, 1367, 1368, 7, 103, 2, 2, 1368, 1369, 7, 112, 2, 2, 1369, 1370, 7, 118, 2, 2, 1370, 306, 3, 2, 2, 2, 1371, 1372, 7, 99, 2, 2, 1372, 1373, 7, 116, 2, 2, 1373, 1374, 7, 116, 2, 2, 1374, 1375, 7, 99, 2, 2, 1375, 1376, 7, 123, 2, 2, 1376, 1377, 7, 47, 2, 2, 1377, 1378, 7, 112, 2, 2, 1378, 1379, 7, 113, 2, 2, 1379, 1380, 7, 102, 2, 2, 1380, 1381, 7, 103, 2, 2, 1381, 308, 3, 2, 2, 2, 1382, 1383, 7, 100, 2, 2, 1383, 1384, 7, 113, 2, 2, 1384, 1385, 7, 113, 2, 2, 1385, 1386, 7, 110, 2, 2, 1386, 1387, 7, 103, 2, 2, 1387, 1388, 7, 99, 2, 2, 1388, 1389, 7, 112, 2, 2, 1389, 1390, 7, 47, 2, 2, 1390, 1391, 7, 112, 2, 2, 1391, 1392, 7, 113, 2, 2, 1392, 1393, 7, 102, 2, 2, 1393, 1394, 7, 103, 2, 2, 1394, 310, 3, 2, 2, 2, 1395, 1396, 7, 112, 2, 2, 1396, 1397, 7, 119, 2, 2, 1397, 1398, 7, 110, 2, 2, 1398, 1399, 7, 110, 2, 2, 1399, 1400, 7, 47, 2, 2, 1400, 1401, 7, 112, 2, 2, 1401, 1402, 7, 113, 2, 2, 1402, 1403, 7, 102, 2, 2, 1403, 1404, 7, 103, 2, 2, 1404, 312, 3, 2, 2, 2, 1405, 1406, 7, 112, 2, 2, 1406, 1407, 7, 119, 2, 2, 1407, 1408, 7, 111, 2, 2, 1408, 1409, 7, 100, 2, 2, 1409, 1410, 7, 103, 2, 2, 1410, 1411, 7, 116, 2, 2, 1411, 1412, 7, 47, 2, 2, 1412, 1413, 7, 112, 2, 2, 1413, 1414, 7, 113, 2, 2, 1414, 1415, 7, 102, 2, 2, 1415, 1416, 7, 103, 2, 2, 1416, 314, 3, 2, 2, 2, 1417, 1418, 7, 113, 2, 2, 1418, 1419, 7, 100, 2, 2, 1419, 1420, 7, 108, 2, 2, 1420, 1421, 7, 103, 2, 2, 1421, 1422, 7, 101, 2, 2, 1422, 1423, 7, 118, 2, 2, 1423, 1424, 7, 47, 2, 2, 1424, 1425, 7, 112, 2, 2, 1425, 1426, 7, 113, 2, 2, 1426, 1427, 7, 102, 2, 2, 1427, 1428, 7, 103, 2, 2, 1428, 316, 3, 2, 2, 2, 1429, 1430, 7, 101, 2, 2, 1430, 1431, 7, 113, 2, 2, 1431, 1432, 7, 111, 2, 2, 1432, 1433, 7, 111, 2, 2, 1433, 1434, 7, 103, 2, 2, 1434, 1435, 7, 112, 2, 2, 1435, 1436, 7, 118, 2, 2, 1436, 318, 3, 2, 2, 2, 1437, 1438, 7, 100, 2, 2, 1438, 1439, 7, 116, 2, 2, 1439, 1440, 7, 103, 2, 2, 1440, 1441, 7, 99, 2, 2, 1441, 1442, 7, 109, 2, 2, 1442, 320, 3, 2, 2, 2, 1443, 1444, 7, 110, 2, 2, 1444, 1445, 7, 113, 2, 2, 1445, 1446, 7, 113, 2, 2, 1446, 1447, 7, 114, 2, 2, 1447, 322, 3, 2, 2, 2, 1448, 1449, 7, 101, 2, 2, 1449, 1450, 7, 113, 2, 2, 1450, 1451, 7, 112, 2, 2, 1451, 1452, 7, 118, 2, 2, 1452, 1453, 7, 107, 2, 2, 1453, 1454, 7, 112, 2, 2, 1454, 1455, 7, 119, 2, 2, 1455, 1456, 7, 103, 2, 2, 1456, 324, 3, 2, 2, 2, 1457, 1458, 7, 103, 2, 2, 1458, 1459, 7, 122, 2, 2, 1459, 1460, 7, 107, 2, 2, 1460, 1461, 7, 118, 2, 2, 1461, 326, 3, 2, 2, 2, 1462, 1463, 7, 116, 2, 2, 1463, 1464, 7, 103, 2, 2, 1464, 1465, 7, 118, 2, 2, 1465, 1466, 7, 119, 2, 2, 1466, 1467, 7, 116, 2, 2, 1467, 1468, 7, 112, 2, 2, 1468, 1469, 7, 107, 2, 2, 1469, 1470, 7, 112, 2, 2, 1470, 1471, 7, 105, 2, 2, 1471, 328, 3, 2, 2, 2, 1472, 1473, 7, 121, 2, 2, 1473, 1474, 7, 106, 2, 2, 1474, 1475, 7, 107, 2, 2, 1475, 1476, 7, 110, 2, 2, 1476, 1477, 7, 103, 2, 2, 1477, 330, 3, 2, 2, 2, 1478, 1483, 7, 36, 2, 2, 1479, 1482, 5, 333, 167, 2, 1480, 1482, 10, 2, 2, 2, 1481, 1479, 3, 2, 2, 2, 1481, 1480, 3, 2, 2, 2, 1482, 1485, 3, 2, 2, 2, 1483, 1481, 3, 2, 2, 2, 1483, 1484, 3, 2, 2, 2, 1484, 1486, 3, 2, 2, 2, 1485, 1483, 3, 2, 2, 2, 1486, 1487, 7, 36, 2, 2, 1487, 332, 3, 2, 2, 2, 1488, 1491, 7, 94, 2, 2, 1489, 1492, 9, 3, 2, 2, 1490, 1492, 5, 335, 168, 2, 1491, 1489, 3, 2, 2, 2, 1491, 1490, 3, 2, 2, 2, 1492, 334, 3, 2, 2, 2, 1493, 1494, 7, 119, 2, 2, 1494, 1495, 5, 337, 169, 2, 1495, 1496, 5, 337, 169, 2, 1496, 1497, 5, 337, 169, 2, 1497, 1498, 5, 337, 169, 2, 1498, 336, 3, 2, 2, 2, 1499, 1500, 9, 4, 2, 2, 1500, 338, 3, 2, 2, 2, 1501, 1502, 7, 65, 2, 2, 1502, 340, 3, 2, 2, 2, 1503, 1504, 7, 112, 2, 2, 1504, 1505, 7, 119, 2, 2, 1505, 1506, 7, 110, 2, 2, 1506, 1507, 7, 110, 2, 2, 1507, 342, 3, 2, 2, 2, 1508, 1509, 5, 345, 173, 2, 1509, 344, 3, 2, 2, 2, 1510, 1514, 5, 347, 174, 2, 1511, 1514, 5, 349, 175, 2, 1512, 1514, 5, 351, 176, 2, 1513, 1510, 3, 2, 2, 2, 1513, 1511, 3, 2, 2, 2, 1513, 1512, 3, 2, 2, 2, 1514, 346, 3, 2, 2, 2, 1515, 1516, 5, 353, 177, 2, 1516, 348, 3, 2, 2, 2, 1517, 1518, 7, 48, 2, 2, 1518, 1528, 5, 353, 177, 2, 1519, 1520, 5, 353, 177, 2, 1520, 1524, 7, 48, 2, 2, 1521, 1523, 9, 5, 2, 2, 1522, 1521, 3, 2, 2, 2, 1523, 1526, 3, 2, 2, 2, 1524, 1522, 3, 2, 2, 2, 1524, 1525, 3, 2, 2, 2, 1525, 1528, 3, 2, 2, 2, 1526, 1524, 3, 2, 2, 2, 1527, 1517, 3, 2, 2, 2, 1527, 1519, 3, 2, 2, 2, 1528, 350, 3, 2, 2, 2, 1529, 1530, 7, 48, 2, 2, 1530, 1542, 5, 353, 177, 2, 1531, 1539, 5, 353, 177, 2, 1532, 1536, 7, 48, 2, 2, 1533, 1535, 9, 5, 2, 2, 1534, 1533, 3, 2, 2, 2, 1535, 1538, 3, 2, 2, 2, 1536, 1534, 3, 2, 2, 2, 1536, 1537, 3, 2, 2, 2, 1537, 1540, 3, 2, 2, 2, 1538, 1536, 3, 2, 2, 2, 1539, 1532, 3, 2, 2, 2, 1539, 1540, 3, 2, 2, 2, 1540, 1542, 3, 2, 2, 2, 1541, 1529, 3, 2, 2, 2, 1541, 1531, 3, 2, 2, 2, 1542, 1543, 3, 2, 2, 2, 1543, 1545, 9, 6, 2, 2, 1544, 1546, 9, 7, 2, 2, 1545, 1544, 3, 2, 2, 2, 1545, 1546, 3, 2, 2, 2, 1546, 1547, 3, 2, 2, 2, 1547, 1548, 5, 353, 177, 2, 1548, 352, 3, 2, 2, 2, 1549, 1551, 9, 5, 2, 2, 1550, 1549, 3, 2, 2, 2, 1551, 1552, 3, 2, 2, 2, 1552, 1550, 3, 2, 2, 2, 1552, 1553, 3, 2, 2, 2, 1553, 354, 3, 2, 2, 2, 1554, 1555, 9, 8, 2, 2, 1555, 1556, 3, 2, 2, 2, 1556, 1557, 8, 178, 2, 2, 1557, 356, 3, 2, 2, 2, 1558, 1562, 5, 359, 180, 2, 1559, 1561, 5, 361, 181, 2, 1560, 1559, 3, 2, 2, 2, 1561, 1564, 3, 2, 2, 2, 1562, 1560, 3, 2, 2, 2, 1562, 1563, 3, 2, 2, 2, 1563, 358, 3, 2, 2, 2, 1564, 1562, 3, 2, 2, 2, 1565, 1567, 9, 9, 2, 2, 1566, 1565, 3, 2, 2, 2, 1567, 360, 3, 2, 2, 2, 1568, 1571, 5, 359, 180, 2, 1569, 1571, 9, 10, 2, 2, 1570, 1568, 3, 2, 2, 2, 1570, 1569, 3, 2, 2, 2, 1571, 362, 3, 2, 2, 2, 1572, 1573, 7, 42, 2, 2, 1573, 1582, 7, 60, 2, 2, 1574, 1581, 5, 363, 182, 2, 1575, 1576, 7, 42, 2, 2, 1576, 1581, 10, 11, 2, 2, 1577, 1578, 7, 60, 2, 2, 1578, 1581, 10, 12, 2, 2, 1579, 1581, 10, 13, 2, 2, 1580, 1574, 3, 2, 2, 2, 1580, 1575, 3, 2, 2, 2, 1580, 1577, 3, 2, 2, 2, 1580, 1579, 3, 2, 2, 2, 1581, 1584, 3, 2, 2, 2, 1582, 1580, 3, 2, 2, 2, 1582, 1583, 3, 2, 2, 2, 1583, 1586, 3, 2, 2, 2, 1584, 1582, 3, 2, 2, 2, 1585, 1587, 7, 60, 2, 2, 1586, 1585, 3, 2, 2, 2, 1587, 1588, 3, 2, 2, 2, 1588, 1586, 3, 2, 2, 2, 1588, 1589, 3, 2, 2, 2, 1589, 1590, 3, 2, 2, 2, 1590, 1591, 7, 43, 2, 2, 1591, 1592, 3, 2, 2, 2, 1592, 1593, 8, 182, 2, 2, 1593, 364, 3, 2, 2, 2, 1594, 1595, 10, 14, 2, 2, 1595, 366, 3, 2, 2, 2, 20, 2, 1481, 1483, 1491, 1513, 1524, 1527, 1536, 1539, 1541, 1545, 1552, 1562, 1566, 1570, 1580, 1582, 1588, 3, 2, 3, 2] \ No newline at end of file diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.java b/src/main/java/org/rumbledb/parser/JsoniqLexer.java index 562da73a5..3c8a2743d 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.java +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.java @@ -37,18 +37,18 @@ public class JsoniqLexer extends Lexer { Kjsoniq=102, Kunordered=103, Ktrue=104, Kfalse=105, Ktype=106, Kvalidate=107, Kannotate=108, Kdeclare=109, Kcontext=110, Kitem=111, Kvariable=112, Kinsert=113, Kdelete=114, Krename=115, Kreplace=116, Kcopy=117, Kmodify=118, Kappend=119, - Kinto=120, Kvalue=121, Kjson=122, Kwith=123, Kposition=124, Kbreak=125, - Kloop=126, Kcontinue=127, Kexit=128, Kreturning=129, Kwhile=130, Kimport=131, - Kschema=132, Knamespace=133, Kelement=134, Kslash=135, Kdslash=136, Kat_symbol=137, - Kchild=138, Kdescendant=139, Kattribute=140, Kself=141, Kdescendant_or_self=142, - Kfollowing_sibling=143, Kfollowing=144, Kparent=145, Kancestor=146, Kpreceding_sibling=147, - Kpreceding=148, Kancestor_or_self=149, Knode=150, Kbinary=151, Kdocument=152, - Kdocument_node=153, Ktext=154, Kpi=155, Knamespace_node=156, Kschema_attribute=157, - Kschema_element=158, Karray_node=159, Kboolean_node=160, Knull_node=161, - Knumber_node=162, Kobject_node=163, Kcomment=164, Karray=165, Kmap=166, - STRING=167, ArgumentPlaceholder=168, NullLiteral=169, Literal=170, NumericLiteral=171, - IntegerLiteral=172, DecimalLiteral=173, DoubleLiteral=174, WS=175, NCName=176, - XQComment=177, ContentChar=178; + Kinto=120, Kvalue=121, Kjson=122, Kwith=123, Kposition=124, Kimport=125, + Kschema=126, Knamespace=127, Kelement=128, Kslash=129, Kdslash=130, Kat_symbol=131, + Kchild=132, Kdescendant=133, Kattribute=134, Kself=135, Kdescendant_or_self=136, + Kfollowing_sibling=137, Kfollowing=138, Kparent=139, Kancestor=140, Kpreceding_sibling=141, + Kpreceding=142, Kancestor_or_self=143, Knode=144, Kbinary=145, Kdocument=146, + Kdocument_node=147, Ktext=148, Kpi=149, Knamespace_node=150, Kschema_attribute=151, + Kschema_element=152, Karray_node=153, Kboolean_node=154, Knull_node=155, + Knumber_node=156, Kobject_node=157, Kcomment=158, Kbreak=159, Kloop=160, + Kcontinue=161, Kexit=162, Kreturning=163, Kwhile=164, STRING=165, ArgumentPlaceholder=166, + NullLiteral=167, Literal=168, NumericLiteral=169, IntegerLiteral=170, + DecimalLiteral=171, DoubleLiteral=172, WS=173, NCName=174, XQComment=175, + ContentChar=176; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -75,17 +75,17 @@ private static String[] makeRuleNames() { "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", "Kdeclare", "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename", "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson", - "Kwith", "Kposition", "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning", - "Kwhile", "Kimport", "Kschema", "Knamespace", "Kelement", "Kslash", "Kdslash", - "Kat_symbol", "Kchild", "Kdescendant", "Kattribute", "Kself", "Kdescendant_or_self", - "Kfollowing_sibling", "Kfollowing", "Kparent", "Kancestor", "Kpreceding_sibling", - "Kpreceding", "Kancestor_or_self", "Knode", "Kbinary", "Kdocument", "Kdocument_node", - "Ktext", "Kpi", "Knamespace_node", "Kschema_attribute", "Kschema_element", - "Karray_node", "Kboolean_node", "Knull_node", "Knumber_node", "Kobject_node", - "Kcomment", "Karray", "Kmap", "STRING", "ESC", "UNICODE", "HEX", "ArgumentPlaceholder", - "NullLiteral", "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", - "DoubleLiteral", "Digits", "WS", "NCName", "NameStartChar", "NameChar", - "XQComment", "ContentChar" + "Kwith", "Kposition", "Kimport", "Kschema", "Knamespace", "Kelement", + "Kslash", "Kdslash", "Kat_symbol", "Kchild", "Kdescendant", "Kattribute", + "Kself", "Kdescendant_or_self", "Kfollowing_sibling", "Kfollowing", "Kparent", + "Kancestor", "Kpreceding_sibling", "Kpreceding", "Kancestor_or_self", + "Knode", "Kbinary", "Kdocument", "Kdocument_node", "Ktext", "Kpi", "Knamespace_node", + "Kschema_attribute", "Kschema_element", "Karray_node", "Kboolean_node", + "Knull_node", "Knumber_node", "Kobject_node", "Kcomment", "Kbreak", "Kloop", + "Kcontinue", "Kexit", "Kreturning", "Kwhile", "STRING", "ESC", "UNICODE", + "HEX", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral", + "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "Digits", "WS", + "NCName", "NameStartChar", "NameChar", "XQComment", "ContentChar" }; } public static final String[] ruleNames = makeRuleNames(); @@ -109,16 +109,15 @@ private static String[] makeLiteralNames() { "'jsoniq'", "'unordered'", "'true'", "'false'", "'type'", "'validate'", "'annotate'", "'declare'", "'context'", "'item'", "'variable'", "'insert'", "'delete'", "'rename'", "'replace'", "'copy'", "'modify'", "'append'", - "'into'", "'value'", "'json'", "'with'", "'position'", "'break'", "'loop'", - "'continue'", "'exit'", "'returning'", "'while'", "'import'", "'schema'", + "'into'", "'value'", "'json'", "'with'", "'position'", "'import'", "'schema'", "'namespace'", "'element'", "'/'", "'//'", "'@'", "'child'", "'descendant'", "'attribute'", "'self'", "'descendant-or-self'", "'following-sibling'", "'following'", "'parent'", "'ancestor'", "'preceding-sibling'", "'preceding'", "'ancestor-or-self'", "'node'", "'binary'", "'document'", "'document-node'", "'text'", "'processing-instruction'", "'namespace-node'", "'schema-attribute'", "'schema-element'", "'array-node'", "'boolean-node'", "'null-node'", - "'number-node'", "'object-node'", "'comment'", "'array'", "'map'", null, - "'?'", "'null'" + "'number-node'", "'object-node'", "'comment'", "'break'", "'loop'", "'continue'", + "'exit'", "'returning'", "'while'", null, "'?'", "'null'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -138,16 +137,16 @@ private static String[] makeSymbolicNames() { "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", "Kdeclare", "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename", "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson", "Kwith", "Kposition", - "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning", "Kwhile", "Kimport", - "Kschema", "Knamespace", "Kelement", "Kslash", "Kdslash", "Kat_symbol", - "Kchild", "Kdescendant", "Kattribute", "Kself", "Kdescendant_or_self", + "Kimport", "Kschema", "Knamespace", "Kelement", "Kslash", "Kdslash", + "Kat_symbol", "Kchild", "Kdescendant", "Kattribute", "Kself", "Kdescendant_or_self", "Kfollowing_sibling", "Kfollowing", "Kparent", "Kancestor", "Kpreceding_sibling", "Kpreceding", "Kancestor_or_self", "Knode", "Kbinary", "Kdocument", "Kdocument_node", "Ktext", "Kpi", "Knamespace_node", "Kschema_attribute", "Kschema_element", "Karray_node", "Kboolean_node", "Knull_node", "Knumber_node", "Kobject_node", - "Kcomment", "Karray", "Kmap", "STRING", "ArgumentPlaceholder", "NullLiteral", - "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", - "WS", "NCName", "XQComment", "ContentChar" + "Kcomment", "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning", "Kwhile", + "STRING", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral", + "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "WS", "NCName", + "XQComment", "ContentChar" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -209,7 +208,7 @@ public JsoniqLexer(CharStream input) { public ATN getATN() { return _ATN; } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00b4\u064a\b\1\4"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00b2\u063c\b\1\4"+ "\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n"+ "\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+ "\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+ @@ -235,557 +234,551 @@ public JsoniqLexer(CharStream input) { "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad"+ "\t\u00ad\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1\t\u00b1"+ "\4\u00b2\t\u00b2\4\u00b3\t\u00b3\4\u00b4\t\u00b4\4\u00b5\t\u00b5\4\u00b6"+ - "\t\u00b6\4\u00b7\t\u00b7\4\u00b8\t\u00b8\4\u00b9\t\u00b9\3\2\3\2\3\3\3"+ - "\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\7\3\7\3\b\3\b\3\t"+ - "\3\t\3\n\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\17\3\17\3\17\3\17\3"+ - "\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3"+ - "\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3"+ - "\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3"+ - "\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3"+ - "\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3"+ - "\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3"+ - "\26\3\26\3\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3"+ - "\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3"+ - "\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3"+ - "\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3"+ - "\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3"+ - "\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3"+ - "\37\3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3#\3#"+ - "\3#\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3*\3*\3*\3+"+ - "\3+\3,\3,\3,\3-\3-\3-\3.\3.\3/\3/\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3"+ - "\61\3\61\3\62\3\62\3\62\3\62\3\63\3\63\3\64\3\64\3\65\3\65\3\66\3\66\3"+ - "\67\3\67\3\67\38\38\39\39\39\3:\3:\3:\3;\3;\3;\3<\3<\3<\3<\3=\3=\3=\3"+ - "=\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3@\3@\3@\3A\3A\3A\3A\3A\3A\3B\3"+ - "B\3B\3B\3B\3B\3B\3C\3C\3C\3D\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3G\3G\3"+ - "G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3"+ - "K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3"+ - "M\3M\3M\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3"+ - "P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3S\3S\3"+ - "S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3V\3V\3V\3V\3V\3V\3W\3W\3W\3"+ - "W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3"+ - "Z\3Z\3Z\3[\3[\3[\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3^\3^\3^\3_\3_\3_\3_\3_\3"+ - "_\3_\3_\3_\3`\3`\3`\3a\3a\3a\3a\3a\3a\3a\3a\3a\3a\3a\3b\3b\3b\3c\3c\3"+ - "c\3c\3c\3c\3d\3d\3d\3d\3d\3e\3e\3e\3e\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3"+ - "f\3f\3f\3g\3g\3g\3g\3g\3g\3g\3h\3h\3h\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3"+ - "i\3i\3j\3j\3j\3j\3j\3j\3k\3k\3k\3k\3k\3l\3l\3l\3l\3l\3l\3l\3l\3l\3m\3"+ - "m\3m\3m\3m\3m\3m\3m\3m\3n\3n\3n\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3o\3"+ - "o\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3r\3r\3s\3"+ - "s\3s\3s\3s\3s\3s\3t\3t\3t\3t\3t\3t\3t\3u\3u\3u\3u\3u\3u\3u\3u\3v\3v\3"+ - "v\3v\3v\3w\3w\3w\3w\3w\3w\3w\3x\3x\3x\3x\3x\3x\3x\3y\3y\3y\3y\3y\3z\3"+ - "z\3z\3z\3z\3z\3{\3{\3{\3{\3{\3|\3|\3|\3|\3|\3}\3}\3}\3}\3}\3}\3}\3}\3"+ - "}\3~\3~\3~\3~\3~\3~\3\177\3\177\3\177\3\177\3\177\3\u0080\3\u0080\3\u0080"+ - "\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081"+ - "\3\u0081\3\u0081\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082"+ - "\3\u0082\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083"+ - "\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085"+ - "\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\3\u0086"+ - "\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087"+ - "\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0088\3\u0088\3\u0089\3\u0089"+ - "\3\u0089\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b"+ - "\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c"+ - "\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d"+ - "\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f"+ - "\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f"+ - "\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f"+ - "\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090"+ + "\t\u00b6\4\u00b7\t\u00b7\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3"+ + "\5\3\5\3\6\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3\13\3\13\3\f\3\f\3"+ + "\r\3\r\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20"+ + "\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+ + "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\23\3\23\3\23\3\23\3\23"+ + "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24"+ + "\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ + "\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26"+ + "\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27"+ + "\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31"+ + "\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32"+ + "\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+ + "\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35"+ + "\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36"+ + "\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3!\3"+ + "!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3#\3#\3#\3$\3$\3$\3%\3%\3%\3&\3&\3&\3"+ + "\'\3\'\3\'\3(\3(\3(\3)\3)\3*\3*\3*\3+\3+\3,\3,\3,\3-\3-\3-\3.\3.\3/\3"+ + "/\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\63"+ + "\3\63\3\64\3\64\3\65\3\65\3\66\3\66\3\67\3\67\3\67\38\38\39\39\39\3:\3"+ + ":\3:\3;\3;\3;\3<\3<\3<\3<\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3"+ + "?\3?\3@\3@\3@\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3D\3D\3"+ + "D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3I\3"+ + "I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3"+ + "L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3O\3O\3"+ + "O\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3"+ + "Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3"+ + "U\3U\3U\3V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3Y\3"+ + "Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3\\\3\\\3\\\3\\\3"+ + "]\3]\3]\3]\3^\3^\3^\3_\3_\3_\3_\3_\3_\3_\3_\3_\3`\3`\3`\3a\3a\3a\3a\3"+ + "a\3a\3a\3a\3a\3a\3a\3b\3b\3b\3c\3c\3c\3c\3c\3c\3d\3d\3d\3d\3d\3e\3e\3"+ + "e\3e\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3g\3g\3h\3"+ + "h\3h\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i\3j\3j\3j\3j\3j\3j\3k\3k\3k\3"+ + "k\3k\3l\3l\3l\3l\3l\3l\3l\3l\3l\3m\3m\3m\3m\3m\3m\3m\3m\3m\3n\3n\3n\3"+ + "n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3o\3o\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\3"+ + "q\3q\3q\3q\3r\3r\3r\3r\3r\3r\3r\3s\3s\3s\3s\3s\3s\3s\3t\3t\3t\3t\3t\3"+ + "t\3t\3u\3u\3u\3u\3u\3u\3u\3u\3v\3v\3v\3v\3v\3w\3w\3w\3w\3w\3w\3w\3x\3"+ + "x\3x\3x\3x\3x\3x\3y\3y\3y\3y\3y\3z\3z\3z\3z\3z\3z\3{\3{\3{\3{\3{\3|\3"+ + "|\3|\3|\3|\3}\3}\3}\3}\3}\3}\3}\3}\3}\3~\3~\3~\3~\3~\3~\3~\3\177\3\177"+ + "\3\177\3\177\3\177\3\177\3\177\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080"+ + "\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081\3\u0081"+ + "\3\u0081\3\u0081\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083"+ + "\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086"+ + "\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086"+ + "\3\u0086\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087"+ + "\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+ + "\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089"+ + "\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u008a"+ + "\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a"+ + "\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008b"+ + "\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b"+ + "\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d"+ + "\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e"+ + "\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e"+ + "\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f\3\u008f"+ + "\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090"+ "\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090"+ - "\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091"+ - "\3\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093"+ - "\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094"+ - "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094"+ - "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095"+ - "\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095"+ + "\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0091\3\u0091"+ + "\3\u0091\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092"+ + "\3\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093"+ + "\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094"+ + "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095"+ + "\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+ "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+ - "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097"+ + "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097"+ + "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097"+ "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098"+ - "\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+ - "\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a"+ - "\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009b\3\u009b"+ - "\3\u009b\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c"+ - "\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c"+ - "\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009d"+ + "\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098"+ + "\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+ + "\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+ + "\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a"+ + "\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b"+ + "\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c"+ + "\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009d\3\u009d"+ "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e"+ - "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+ - "\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+ - "\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0"+ - "\3\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1"+ - "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2"+ - "\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a3"+ - "\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3"+ - "\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4"+ - "\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5"+ - "\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6"+ - "\3\u00a6\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8\7\u00a8"+ - "\u05d8\n\u00a8\f\u00a8\16\u00a8\u05db\13\u00a8\3\u00a8\3\u00a8\3\u00a9"+ - "\3\u00a9\3\u00a9\5\u00a9\u05e2\n\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa"+ - "\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad"+ - "\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00af\5\u00af\u05f8"+ - "\n\u00af\3\u00b0\3\u00b0\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b1\7\u00b1"+ - "\u0601\n\u00b1\f\u00b1\16\u00b1\u0604\13\u00b1\5\u00b1\u0606\n\u00b1\3"+ - "\u00b2\3\u00b2\3\u00b2\3\u00b2\3\u00b2\7\u00b2\u060d\n\u00b2\f\u00b2\16"+ - "\u00b2\u0610\13\u00b2\5\u00b2\u0612\n\u00b2\5\u00b2\u0614\n\u00b2\3\u00b2"+ - "\3\u00b2\5\u00b2\u0618\n\u00b2\3\u00b2\3\u00b2\3\u00b3\6\u00b3\u061d\n"+ - "\u00b3\r\u00b3\16\u00b3\u061e\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b5"+ - "\3\u00b5\7\u00b5\u0627\n\u00b5\f\u00b5\16\u00b5\u062a\13\u00b5\3\u00b6"+ - "\5\u00b6\u062d\n\u00b6\3\u00b7\3\u00b7\5\u00b7\u0631\n\u00b7\3\u00b8\3"+ - "\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b8\7\u00b8\u063b\n"+ - "\u00b8\f\u00b8\16\u00b8\u063e\13\u00b8\3\u00b8\6\u00b8\u0641\n\u00b8\r"+ - "\u00b8\16\u00b8\u0642\3\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b9\3\u00b9"+ - "\2\2\u00ba\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33"+ - "\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67"+ - "\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65"+ - "i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008b"+ - "G\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009f"+ - "Q\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3"+ - "[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7"+ - "e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00db"+ - "o\u00ddp\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00ebw\u00edx\u00ef"+ - "y\u00f1z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb\177\u00fd\u0080\u00ff\u0081"+ - "\u0101\u0082\u0103\u0083\u0105\u0084\u0107\u0085\u0109\u0086\u010b\u0087"+ - "\u010d\u0088\u010f\u0089\u0111\u008a\u0113\u008b\u0115\u008c\u0117\u008d"+ - "\u0119\u008e\u011b\u008f\u011d\u0090\u011f\u0091\u0121\u0092\u0123\u0093"+ - "\u0125\u0094\u0127\u0095\u0129\u0096\u012b\u0097\u012d\u0098\u012f\u0099"+ - "\u0131\u009a\u0133\u009b\u0135\u009c\u0137\u009d\u0139\u009e\u013b\u009f"+ - "\u013d\u00a0\u013f\u00a1\u0141\u00a2\u0143\u00a3\u0145\u00a4\u0147\u00a5"+ - "\u0149\u00a6\u014b\u00a7\u014d\u00a8\u014f\u00a9\u0151\2\u0153\2\u0155"+ - "\2\u0157\u00aa\u0159\u00ab\u015b\u00ac\u015d\u00ad\u015f\u00ae\u0161\u00af"+ - "\u0163\u00b0\u0165\2\u0167\u00b1\u0169\u00b2\u016b\2\u016d\2\u016f\u00b3"+ - "\u0171\u00b4\3\2\17\4\2$$^^\n\2$$\61\61^^ddhhppttvv\5\2\62;CHch\3\2\62"+ - ";\4\2GGgg\4\2--//\5\2\13\f\17\17\"\"\20\2C\\aac|\u00c2\u00d8\u00da\u00f8"+ - "\u00fa\u0301\u0372\u037f\u0381\u2001\u200e\u200f\u2072\u2191\u2c02\u2ff1"+ - "\u3003\ud801\uf902\ufdd1\ufdf2\uffff\7\2//\62;\u00b9\u00b9\u0302\u0371"+ - "\u2041\u2042\3\2<<\3\2++\4\2**<<\7\2$$()>>}}\177\177\2\u0656\2\3\3\2\2"+ - "\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3"+ - "\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2"+ - "\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2"+ - "\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2"+ - "\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3"+ - "\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2"+ - "\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2"+ - "W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3"+ - "\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2"+ - "\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2"+ - "}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2"+ - "\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f"+ - "\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2"+ - "\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1"+ - "\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2"+ - "\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3"+ - "\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2"+ - "\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5"+ - "\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2"+ - "\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7"+ - "\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2"+ - "\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9"+ - "\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2"+ - "\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb"+ - "\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff\3\2\2\2\2\u0101\3\2\2\2\2\u0103\3\2\2"+ - "\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\2\u0109\3\2\2\2\2\u010b\3\2\2\2\2\u010d"+ - "\3\2\2\2\2\u010f\3\2\2\2\2\u0111\3\2\2\2\2\u0113\3\2\2\2\2\u0115\3\2\2"+ - "\2\2\u0117\3\2\2\2\2\u0119\3\2\2\2\2\u011b\3\2\2\2\2\u011d\3\2\2\2\2\u011f"+ - "\3\2\2\2\2\u0121\3\2\2\2\2\u0123\3\2\2\2\2\u0125\3\2\2\2\2\u0127\3\2\2"+ - "\2\2\u0129\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2\2\2\u012f\3\2\2\2\2\u0131"+ - "\3\2\2\2\2\u0133\3\2\2\2\2\u0135\3\2\2\2\2\u0137\3\2\2\2\2\u0139\3\2\2"+ - "\2\2\u013b\3\2\2\2\2\u013d\3\2\2\2\2\u013f\3\2\2\2\2\u0141\3\2\2\2\2\u0143"+ - "\3\2\2\2\2\u0145\3\2\2\2\2\u0147\3\2\2\2\2\u0149\3\2\2\2\2\u014b\3\2\2"+ - "\2\2\u014d\3\2\2\2\2\u014f\3\2\2\2\2\u0157\3\2\2\2\2\u0159\3\2\2\2\2\u015b"+ - "\3\2\2\2\2\u015d\3\2\2\2\2\u015f\3\2\2\2\2\u0161\3\2\2\2\2\u0163\3\2\2"+ - "\2\2\u0167\3\2\2\2\2\u0169\3\2\2\2\2\u016f\3\2\2\2\2\u0171\3\2\2\2\3\u0173"+ - "\3\2\2\2\5\u0175\3\2\2\2\7\u017c\3\2\2\2\t\u017e\3\2\2\2\13\u0180\3\2"+ - "\2\2\r\u0183\3\2\2\2\17\u0185\3\2\2\2\21\u0187\3\2\2\2\23\u0189\3\2\2"+ - "\2\25\u018b\3\2\2\2\27\u018d\3\2\2\2\31\u018f\3\2\2\2\33\u0191\3\2\2\2"+ - "\35\u0193\3\2\2\2\37\u019c\3\2\2\2!\u01a4\3\2\2\2#\u01b3\3\2\2\2%\u01b5"+ - "\3\2\2\2\'\u01c7\3\2\2\2)\u01da\3\2\2\2+\u01e3\3\2\2\2-\u01ee\3\2\2\2"+ - "/\u01f2\3\2\2\2\61\u01fa\3\2\2\2\63\u0204\3\2\2\2\65\u020f\3\2\2\2\67"+ - "\u0215\3\2\2\29\u0227\3\2\2\2;\u0230\3\2\2\2=\u0239\3\2\2\2?\u0240\3\2"+ - "\2\2A\u0248\3\2\2\2C\u0250\3\2\2\2E\u0253\3\2\2\2G\u0256\3\2\2\2I\u0259"+ - "\3\2\2\2K\u025c\3\2\2\2M\u025f\3\2\2\2O\u0262\3\2\2\2Q\u0265\3\2\2\2S"+ - "\u0267\3\2\2\2U\u026a\3\2\2\2W\u026c\3\2\2\2Y\u026f\3\2\2\2[\u0272\3\2"+ - "\2\2]\u0274\3\2\2\2_\u0276\3\2\2\2a\u027a\3\2\2\2c\u027f\3\2\2\2e\u0283"+ - "\3\2\2\2g\u0285\3\2\2\2i\u0287\3\2\2\2k\u0289\3\2\2\2m\u028b\3\2\2\2o"+ - "\u028e\3\2\2\2q\u0290\3\2\2\2s\u0293\3\2\2\2u\u0296\3\2\2\2w\u0299\3\2"+ - "\2\2y\u029d\3\2\2\2{\u02a1\3\2\2\2}\u02a7\3\2\2\2\177\u02ad\3\2\2\2\u0081"+ - "\u02b0\3\2\2\2\u0083\u02b6\3\2\2\2\u0085\u02bd\3\2\2\2\u0087\u02c0\3\2"+ - "\2\2\u0089\u02c3\3\2\2\2\u008b\u02c6\3\2\2\2\u008d\u02c9\3\2\2\2\u008f"+ - "\u02d2\3\2\2\2\u0091\u02d8\3\2\2\2\u0093\u02de\3\2\2\2\u0095\u02e5\3\2"+ - "\2\2\u0097\u02ef\3\2\2\2\u0099\u02fa\3\2\2\2\u009b\u02ff\3\2\2\2\u009d"+ - "\u0305\3\2\2\2\u009f\u030f\3\2\2\2\u00a1\u0319\3\2\2\2\u00a3\u0322\3\2"+ - "\2\2\u00a5\u0328\3\2\2\2\u00a7\u032f\3\2\2\2\u00a9\u0334\3\2\2\2\u00ab"+ - "\u0338\3\2\2\2\u00ad\u033e\3\2\2\2\u00af\u0346\3\2\2\2\u00b1\u034b\3\2"+ - "\2\2\u00b3\u0350\3\2\2\2\u00b5\u035b\3\2\2\2\u00b7\u035e\3\2\2\2\u00b9"+ - "\u0362\3\2\2\2\u00bb\u0366\3\2\2\2\u00bd\u0369\3\2\2\2\u00bf\u0372\3\2"+ - "\2\2\u00c1\u0375\3\2\2\2\u00c3\u0380\3\2\2\2\u00c5\u0383\3\2\2\2\u00c7"+ - "\u0389\3\2\2\2\u00c9\u038e\3\2\2\2\u00cb\u0397\3\2\2\2\u00cd\u039f\3\2"+ - "\2\2\u00cf\u03a6\3\2\2\2\u00d1\u03b0\3\2\2\2\u00d3\u03b5\3\2\2\2\u00d5"+ - "\u03bb\3\2\2\2\u00d7\u03c0\3\2\2\2\u00d9\u03c9\3\2\2\2\u00db\u03d2\3\2"+ - "\2\2\u00dd\u03da\3\2\2\2\u00df\u03e2\3\2\2\2\u00e1\u03e7\3\2\2\2\u00e3"+ - "\u03f0\3\2\2\2\u00e5\u03f7\3\2\2\2\u00e7\u03fe\3\2\2\2\u00e9\u0405\3\2"+ - "\2\2\u00eb\u040d\3\2\2\2\u00ed\u0412\3\2\2\2\u00ef\u0419\3\2\2\2\u00f1"+ - "\u0420\3\2\2\2\u00f3\u0425\3\2\2\2\u00f5\u042b\3\2\2\2\u00f7\u0430\3\2"+ - "\2\2\u00f9\u0435\3\2\2\2\u00fb\u043e\3\2\2\2\u00fd\u0444\3\2\2\2\u00ff"+ - "\u0449\3\2\2\2\u0101\u0452\3\2\2\2\u0103\u0457\3\2\2\2\u0105\u0461\3\2"+ - "\2\2\u0107\u0467\3\2\2\2\u0109\u046e\3\2\2\2\u010b\u0475\3\2\2\2\u010d"+ - "\u047f\3\2\2\2\u010f\u0487\3\2\2\2\u0111\u0489\3\2\2\2\u0113\u048c\3\2"+ - "\2\2\u0115\u048e\3\2\2\2\u0117\u0494\3\2\2\2\u0119\u049f\3\2\2\2\u011b"+ - "\u04a9\3\2\2\2\u011d\u04ae\3\2\2\2\u011f\u04c1\3\2\2\2\u0121\u04d3\3\2"+ - "\2\2\u0123\u04dd\3\2\2\2\u0125\u04e4\3\2\2\2\u0127\u04ed\3\2\2\2\u0129"+ - "\u04ff\3\2\2\2\u012b\u0509\3\2\2\2\u012d\u051a\3\2\2\2\u012f\u051f\3\2"+ - "\2\2\u0131\u0526\3\2\2\2\u0133\u052f\3\2\2\2\u0135\u053d\3\2\2\2\u0137"+ - "\u0542\3\2\2\2\u0139\u0559\3\2\2\2\u013b\u0568\3\2\2\2\u013d\u0579\3\2"+ - "\2\2\u013f\u0588\3\2\2\2\u0141\u0593\3\2\2\2\u0143\u05a0\3\2\2\2\u0145"+ - "\u05aa\3\2\2\2\u0147\u05b6\3\2\2\2\u0149\u05c2\3\2\2\2\u014b\u05ca\3\2"+ - "\2\2\u014d\u05d0\3\2\2\2\u014f\u05d4\3\2\2\2\u0151\u05de\3\2\2\2\u0153"+ - "\u05e3\3\2\2\2\u0155\u05e9\3\2\2\2\u0157\u05eb\3\2\2\2\u0159\u05ed\3\2"+ - "\2\2\u015b\u05f2\3\2\2\2\u015d\u05f7\3\2\2\2\u015f\u05f9\3\2\2\2\u0161"+ - "\u0605\3\2\2\2\u0163\u0613\3\2\2\2\u0165\u061c\3\2\2\2\u0167\u0620\3\2"+ - "\2\2\u0169\u0624\3\2\2\2\u016b\u062c\3\2\2\2\u016d\u0630\3\2\2\2\u016f"+ - "\u0632\3\2\2\2\u0171\u0648\3\2\2\2\u0173\u0174\7=\2\2\u0174\4\3\2\2\2"+ - "\u0175\u0176\7o\2\2\u0176\u0177\7q\2\2\u0177\u0178\7f\2\2\u0178\u0179"+ - "\7w\2\2\u0179\u017a\7n\2\2\u017a\u017b\7g\2\2\u017b\6\3\2\2\2\u017c\u017d"+ - "\7?\2\2\u017d\b\3\2\2\2\u017e\u017f\7&\2\2\u017f\n\3\2\2\2\u0180\u0181"+ - "\7<\2\2\u0181\u0182\7?\2\2\u0182\f\3\2\2\2\u0183\u0184\7}\2\2\u0184\16"+ - "\3\2\2\2\u0185\u0186\7\177\2\2\u0186\20\3\2\2\2\u0187\u0188\7*\2\2\u0188"+ - "\22\3\2\2\2\u0189\u018a\7+\2\2\u018a\24\3\2\2\2\u018b\u018c\7,\2\2\u018c"+ - "\26\3\2\2\2\u018d\u018e\7~\2\2\u018e\30\3\2\2\2\u018f\u0190\7\'\2\2\u0190"+ - "\32\3\2\2\2\u0191\u0192\7.\2\2\u0192\34\3\2\2\2\u0193\u0194\7q\2\2\u0194"+ - "\u0195\7t\2\2\u0195\u0196\7f\2\2\u0196\u0197\7g\2\2\u0197\u0198\7t\2\2"+ - "\u0198\u0199\7k\2\2\u0199\u019a\7p\2\2\u019a\u019b\7i\2\2\u019b\36\3\2"+ - "\2\2\u019c\u019d\7q\2\2\u019d\u019e\7t\2\2\u019e\u019f\7f\2\2\u019f\u01a0"+ - "\7g\2\2\u01a0\u01a1\7t\2\2\u01a1\u01a2\7g\2\2\u01a2\u01a3\7f\2\2\u01a3"+ - " \3\2\2\2\u01a4\u01a5\7f\2\2\u01a5\u01a6\7g\2\2\u01a6\u01a7\7e\2\2\u01a7"+ - "\u01a8\7k\2\2\u01a8\u01a9\7o\2\2\u01a9\u01aa\7c\2\2\u01aa\u01ab\7n\2\2"+ - "\u01ab\u01ac\7/\2\2\u01ac\u01ad\7h\2\2\u01ad\u01ae\7q\2\2\u01ae\u01af"+ - "\7t\2\2\u01af\u01b0\7o\2\2\u01b0\u01b1\7c\2\2\u01b1\u01b2\7v\2\2\u01b2"+ - "\"\3\2\2\2\u01b3\u01b4\7<\2\2\u01b4$\3\2\2\2\u01b5\u01b6\7f\2\2\u01b6"+ - "\u01b7\7g\2\2\u01b7\u01b8\7e\2\2\u01b8\u01b9\7k\2\2\u01b9\u01ba\7o\2\2"+ - "\u01ba\u01bb\7c\2\2\u01bb\u01bc\7n\2\2\u01bc\u01bd\7/\2\2\u01bd\u01be"+ - "\7u\2\2\u01be\u01bf\7g\2\2\u01bf\u01c0\7r\2\2\u01c0\u01c1\7c\2\2\u01c1"+ - "\u01c2\7t\2\2\u01c2\u01c3\7c\2\2\u01c3\u01c4\7v\2\2\u01c4\u01c5\7q\2\2"+ - "\u01c5\u01c6\7t\2\2\u01c6&\3\2\2\2\u01c7\u01c8\7i\2\2\u01c8\u01c9\7t\2"+ - "\2\u01c9\u01ca\7q\2\2\u01ca\u01cb\7w\2\2\u01cb\u01cc\7r\2\2\u01cc\u01cd"+ - "\7k\2\2\u01cd\u01ce\7p\2\2\u01ce\u01cf\7i\2\2\u01cf\u01d0\7/\2\2\u01d0"+ - "\u01d1\7u\2\2\u01d1\u01d2\7g\2\2\u01d2\u01d3\7r\2\2\u01d3\u01d4\7c\2\2"+ - "\u01d4\u01d5\7t\2\2\u01d5\u01d6\7c\2\2\u01d6\u01d7\7v\2\2\u01d7\u01d8"+ - "\7q\2\2\u01d8\u01d9\7t\2\2\u01d9(\3\2\2\2\u01da\u01db\7k\2\2\u01db\u01dc"+ - "\7p\2\2\u01dc\u01dd\7h\2\2\u01dd\u01de\7k\2\2\u01de\u01df\7p\2\2\u01df"+ - "\u01e0\7k\2\2\u01e0\u01e1\7v\2\2\u01e1\u01e2\7{\2\2\u01e2*\3\2\2\2\u01e3"+ - "\u01e4\7o\2\2\u01e4\u01e5\7k\2\2\u01e5\u01e6\7p\2\2\u01e6\u01e7\7w\2\2"+ - "\u01e7\u01e8\7u\2\2\u01e8\u01e9\7/\2\2\u01e9\u01ea\7u\2\2\u01ea\u01eb"+ - "\7k\2\2\u01eb\u01ec\7i\2\2\u01ec\u01ed\7p\2\2\u01ed,\3\2\2\2\u01ee\u01ef"+ - "\7P\2\2\u01ef\u01f0\7c\2\2\u01f0\u01f1\7P\2\2\u01f1.\3\2\2\2\u01f2\u01f3"+ - "\7r\2\2\u01f3\u01f4\7g\2\2\u01f4\u01f5\7t\2\2\u01f5\u01f6\7e\2\2\u01f6"+ - "\u01f7\7g\2\2\u01f7\u01f8\7p\2\2\u01f8\u01f9\7v\2\2\u01f9\60\3\2\2\2\u01fa"+ - "\u01fb\7r\2\2\u01fb\u01fc\7g\2\2\u01fc\u01fd\7t\2\2\u01fd\u01fe\7/\2\2"+ - "\u01fe\u01ff\7o\2\2\u01ff\u0200\7k\2\2\u0200\u0201\7n\2\2\u0201\u0202"+ - "\7n\2\2\u0202\u0203\7g\2\2\u0203\62\3\2\2\2\u0204\u0205\7|\2\2\u0205\u0206"+ - "\7g\2\2\u0206\u0207\7t\2\2\u0207\u0208\7q\2\2\u0208\u0209\7/\2\2\u0209"+ - "\u020a\7f\2\2\u020a\u020b\7k\2\2\u020b\u020c\7i\2\2\u020c\u020d\7k\2\2"+ - "\u020d\u020e\7v\2\2\u020e\64\3\2\2\2\u020f\u0210\7f\2\2\u0210\u0211\7"+ - "k\2\2\u0211\u0212\7i\2\2\u0212\u0213\7k\2\2\u0213\u0214\7v\2\2\u0214\66"+ - "\3\2\2\2\u0215\u0216\7r\2\2\u0216\u0217\7c\2\2\u0217\u0218\7v\2\2\u0218"+ - "\u0219\7v\2\2\u0219\u021a\7g\2\2\u021a\u021b\7t\2\2\u021b\u021c\7p\2\2"+ - "\u021c\u021d\7/\2\2\u021d\u021e\7u\2\2\u021e\u021f\7g\2\2\u021f\u0220"+ - "\7r\2\2\u0220\u0221\7c\2\2\u0221\u0222\7t\2\2\u0222\u0223\7c\2\2\u0223"+ - "\u0224\7v\2\2\u0224\u0225\7q\2\2\u0225\u0226\7t\2\2\u02268\3\2\2\2\u0227"+ - "\u0228\7g\2\2\u0228\u0229\7z\2\2\u0229\u022a\7v\2\2\u022a\u022b\7g\2\2"+ - "\u022b\u022c\7t\2\2\u022c\u022d\7p\2\2\u022d\u022e\7c\2\2\u022e\u022f"+ - "\7n\2\2\u022f:\3\2\2\2\u0230\u0231\7h\2\2\u0231\u0232\7w\2\2\u0232\u0233"+ - "\7p\2\2\u0233\u0234\7e\2\2\u0234\u0235\7v\2\2\u0235\u0236\7k\2\2\u0236"+ - "\u0237\7q\2\2\u0237\u0238\7p\2\2\u0238<\3\2\2\2\u0239\u023a\7l\2\2\u023a"+ - "\u023b\7u\2\2\u023b\u023c\7q\2\2\u023c\u023d\7w\2\2\u023d\u023e\7p\2\2"+ - "\u023e\u023f\7f\2\2\u023f>\3\2\2\2\u0240\u0241\7e\2\2\u0241\u0242\7q\2"+ - "\2\u0242\u0243\7o\2\2\u0243\u0244\7r\2\2\u0244\u0245\7c\2\2\u0245\u0246"+ - "\7e\2\2\u0246\u0247\7v\2\2\u0247@\3\2\2\2\u0248\u0249\7x\2\2\u0249\u024a"+ - "\7g\2\2\u024a\u024b\7t\2\2\u024b\u024c\7d\2\2\u024c\u024d\7q\2\2\u024d"+ - "\u024e\7u\2\2\u024e\u024f\7g\2\2\u024fB\3\2\2\2\u0250\u0251\7g\2\2\u0251"+ - "\u0252\7s\2\2\u0252D\3\2\2\2\u0253\u0254\7p\2\2\u0254\u0255\7g\2\2\u0255"+ - "F\3\2\2\2\u0256\u0257\7n\2\2\u0257\u0258\7v\2\2\u0258H\3\2\2\2\u0259\u025a"+ - "\7n\2\2\u025a\u025b\7g\2\2\u025bJ\3\2\2\2\u025c\u025d\7i\2\2\u025d\u025e"+ - "\7v\2\2\u025eL\3\2\2\2\u025f\u0260\7i\2\2\u0260\u0261\7g\2\2\u0261N\3"+ - "\2\2\2\u0262\u0263\7#\2\2\u0263\u0264\7?\2\2\u0264P\3\2\2\2\u0265\u0266"+ - "\7>\2\2\u0266R\3\2\2\2\u0267\u0268\7>\2\2\u0268\u0269\7?\2\2\u0269T\3"+ - "\2\2\2\u026a\u026b\7@\2\2\u026bV\3\2\2\2\u026c\u026d\7@\2\2\u026d\u026e"+ - "\7?\2\2\u026eX\3\2\2\2\u026f\u0270\7~\2\2\u0270\u0271\7~\2\2\u0271Z\3"+ - "\2\2\2\u0272\u0273\7-\2\2\u0273\\\3\2\2\2\u0274\u0275\7/\2\2\u0275^\3"+ - "\2\2\2\u0276\u0277\7f\2\2\u0277\u0278\7k\2\2\u0278\u0279\7x\2\2\u0279"+ - "`\3\2\2\2\u027a\u027b\7k\2\2\u027b\u027c\7f\2\2\u027c\u027d\7k\2\2\u027d"+ - "\u027e\7x\2\2\u027eb\3\2\2\2\u027f\u0280\7o\2\2\u0280\u0281\7q\2\2\u0281"+ - "\u0282\7f\2\2\u0282d\3\2\2\2\u0283\u0284\7#\2\2\u0284f\3\2\2\2\u0285\u0286"+ - "\7]\2\2\u0286h\3\2\2\2\u0287\u0288\7_\2\2\u0288j\3\2\2\2\u0289\u028a\7"+ - "\60\2\2\u028al\3\2\2\2\u028b\u028c\7&\2\2\u028c\u028d\7&\2\2\u028dn\3"+ - "\2\2\2\u028e\u028f\7%\2\2\u028fp\3\2\2\2\u0290\u0291\7\60\2\2\u0291\u0292"+ - "\7\60\2\2\u0292r\3\2\2\2\u0293\u0294\7}\2\2\u0294\u0295\7~\2\2\u0295t"+ - "\3\2\2\2\u0296\u0297\7~\2\2\u0297\u0298\7\177\2\2\u0298v\3\2\2\2\u0299"+ - "\u029a\7h\2\2\u029a\u029b\7q\2\2\u029b\u029c\7t\2\2\u029cx\3\2\2\2\u029d"+ - "\u029e\7n\2\2\u029e\u029f\7g\2\2\u029f\u02a0\7v\2\2\u02a0z\3\2\2\2\u02a1"+ - "\u02a2\7y\2\2\u02a2\u02a3\7j\2\2\u02a3\u02a4\7g\2\2\u02a4\u02a5\7t\2\2"+ - "\u02a5\u02a6\7g\2\2\u02a6|\3\2\2\2\u02a7\u02a8\7i\2\2\u02a8\u02a9\7t\2"+ - "\2\u02a9\u02aa\7q\2\2\u02aa\u02ab\7w\2\2\u02ab\u02ac\7r\2\2\u02ac~\3\2"+ - "\2\2\u02ad\u02ae\7d\2\2\u02ae\u02af\7{\2\2\u02af\u0080\3\2\2\2\u02b0\u02b1"+ - "\7q\2\2\u02b1\u02b2\7t\2\2\u02b2\u02b3\7f\2\2\u02b3\u02b4\7g\2\2\u02b4"+ - "\u02b5\7t\2\2\u02b5\u0082\3\2\2\2\u02b6\u02b7\7t\2\2\u02b7\u02b8\7g\2"+ - "\2\u02b8\u02b9\7v\2\2\u02b9\u02ba\7w\2\2\u02ba\u02bb\7t\2\2\u02bb\u02bc"+ - "\7p\2\2\u02bc\u0084\3\2\2\2\u02bd\u02be\7k\2\2\u02be\u02bf\7h\2\2\u02bf"+ - "\u0086\3\2\2\2\u02c0\u02c1\7k\2\2\u02c1\u02c2\7p\2\2\u02c2\u0088\3\2\2"+ - "\2\u02c3\u02c4\7c\2\2\u02c4\u02c5\7u\2\2\u02c5\u008a\3\2\2\2\u02c6\u02c7"+ - "\7c\2\2\u02c7\u02c8\7v\2\2\u02c8\u008c\3\2\2\2\u02c9\u02ca\7c\2\2\u02ca"+ - "\u02cb\7n\2\2\u02cb\u02cc\7n\2\2\u02cc\u02cd\7q\2\2\u02cd\u02ce\7y\2\2"+ - "\u02ce\u02cf\7k\2\2\u02cf\u02d0\7p\2\2\u02d0\u02d1\7i\2\2\u02d1\u008e"+ - "\3\2\2\2\u02d2\u02d3\7g\2\2\u02d3\u02d4\7o\2\2\u02d4\u02d5\7r\2\2\u02d5"+ - "\u02d6\7v\2\2\u02d6\u02d7\7{\2\2\u02d7\u0090\3\2\2\2\u02d8\u02d9\7e\2"+ - "\2\u02d9\u02da\7q\2\2\u02da\u02db\7w\2\2\u02db\u02dc\7p\2\2\u02dc\u02dd"+ - "\7v\2\2\u02dd\u0092\3\2\2\2\u02de\u02df\7u\2\2\u02df\u02e0\7v\2\2\u02e0"+ - "\u02e1\7c\2\2\u02e1\u02e2\7d\2\2\u02e2\u02e3\7n\2\2\u02e3\u02e4\7g\2\2"+ - "\u02e4\u0094\3\2\2\2\u02e5\u02e6\7c\2\2\u02e6\u02e7\7u\2\2\u02e7\u02e8"+ - "\7e\2\2\u02e8\u02e9\7g\2\2\u02e9\u02ea\7p\2\2\u02ea\u02eb\7f\2\2\u02eb"+ - "\u02ec\7k\2\2\u02ec\u02ed\7p\2\2\u02ed\u02ee\7i\2\2\u02ee\u0096\3\2\2"+ - "\2\u02ef\u02f0\7f\2\2\u02f0\u02f1\7g\2\2\u02f1\u02f2\7u\2\2\u02f2\u02f3"+ - "\7e\2\2\u02f3\u02f4\7g\2\2\u02f4\u02f5\7p\2\2\u02f5\u02f6\7f\2\2\u02f6"+ - "\u02f7\7k\2\2\u02f7\u02f8\7p\2\2\u02f8\u02f9\7i\2\2\u02f9\u0098\3\2\2"+ - "\2\u02fa\u02fb\7u\2\2\u02fb\u02fc\7q\2\2\u02fc\u02fd\7o\2\2\u02fd\u02fe"+ - "\7g\2\2\u02fe\u009a\3\2\2\2\u02ff\u0300\7g\2\2\u0300\u0301\7x\2\2\u0301"+ - "\u0302\7g\2\2\u0302\u0303\7t\2\2\u0303\u0304\7{\2\2\u0304\u009c\3\2\2"+ - "\2\u0305\u0306\7u\2\2\u0306\u0307\7c\2\2\u0307\u0308\7v\2\2\u0308\u0309"+ - "\7k\2\2\u0309\u030a\7u\2\2\u030a\u030b\7h\2\2\u030b\u030c\7k\2\2\u030c"+ - "\u030d\7g\2\2\u030d\u030e\7u\2\2\u030e\u009e\3\2\2\2\u030f\u0310\7e\2"+ - "\2\u0310\u0311\7q\2\2\u0311\u0312\7n\2\2\u0312\u0313\7n\2\2\u0313\u0314"+ - "\7c\2\2\u0314\u0315\7v\2\2\u0315\u0316\7k\2\2\u0316\u0317\7q\2\2\u0317"+ - "\u0318\7p\2\2\u0318\u00a0\3\2\2\2\u0319\u031a\7i\2\2\u031a\u031b\7t\2"+ - "\2\u031b\u031c\7g\2\2\u031c\u031d\7c\2\2\u031d\u031e\7v\2\2\u031e\u031f"+ - "\7g\2\2\u031f\u0320\7u\2\2\u0320\u0321\7v\2\2\u0321\u00a2\3\2\2\2\u0322"+ - "\u0323\7n\2\2\u0323\u0324\7g\2\2\u0324\u0325\7c\2\2\u0325\u0326\7u\2\2"+ - "\u0326\u0327\7v\2\2\u0327\u00a4\3\2\2\2\u0328\u0329\7u\2\2\u0329\u032a"+ - "\7y\2\2\u032a\u032b\7k\2\2\u032b\u032c\7v\2\2\u032c\u032d\7e\2\2\u032d"+ - "\u032e\7j\2\2\u032e\u00a6\3\2\2\2\u032f\u0330\7e\2\2\u0330\u0331\7c\2"+ - "\2\u0331\u0332\7u\2\2\u0332\u0333\7g\2\2\u0333\u00a8\3\2\2\2\u0334\u0335"+ - "\7v\2\2\u0335\u0336\7t\2\2\u0336\u0337\7{\2\2\u0337\u00aa\3\2\2\2\u0338"+ - "\u0339\7e\2\2\u0339\u033a\7c\2\2\u033a\u033b\7v\2\2\u033b\u033c\7e\2\2"+ - "\u033c\u033d\7j\2\2\u033d\u00ac\3\2\2\2\u033e\u033f\7f\2\2\u033f\u0340"+ - "\7g\2\2\u0340\u0341\7h\2\2\u0341\u0342\7c\2\2\u0342\u0343\7w\2\2\u0343"+ - "\u0344\7n\2\2\u0344\u0345\7v\2\2\u0345\u00ae\3\2\2\2\u0346\u0347\7v\2"+ - "\2\u0347\u0348\7j\2\2\u0348\u0349\7g\2\2\u0349\u034a\7p\2\2\u034a\u00b0"+ - "\3\2\2\2\u034b\u034c\7g\2\2\u034c\u034d\7n\2\2\u034d\u034e\7u\2\2\u034e"+ - "\u034f\7g\2\2\u034f\u00b2\3\2\2\2\u0350\u0351\7v\2\2\u0351\u0352\7{\2"+ - "\2\u0352\u0353\7r\2\2\u0353\u0354\7g\2\2\u0354\u0355\7u\2\2\u0355\u0356"+ - "\7y\2\2\u0356\u0357\7k\2\2\u0357\u0358\7v\2\2\u0358\u0359\7e\2\2\u0359"+ - "\u035a\7j\2\2\u035a\u00b4\3\2\2\2\u035b\u035c\7q\2\2\u035c\u035d\7t\2"+ - "\2\u035d\u00b6\3\2\2\2\u035e\u035f\7c\2\2\u035f\u0360\7p\2\2\u0360\u0361"+ - "\7f\2\2\u0361\u00b8\3\2\2\2\u0362\u0363\7p\2\2\u0363\u0364\7q\2\2\u0364"+ - "\u0365\7v\2\2\u0365\u00ba\3\2\2\2\u0366\u0367\7v\2\2\u0367\u0368\7q\2"+ - "\2\u0368\u00bc\3\2\2\2\u0369\u036a\7k\2\2\u036a\u036b\7p\2\2\u036b\u036c"+ - "\7u\2\2\u036c\u036d\7v\2\2\u036d\u036e\7c\2\2\u036e\u036f\7p\2\2\u036f"+ - "\u0370\7e\2\2\u0370\u0371\7g\2\2\u0371\u00be\3\2\2\2\u0372\u0373\7q\2"+ - "\2\u0373\u0374\7h\2\2\u0374\u00c0\3\2\2\2\u0375\u0376\7u\2\2\u0376\u0377"+ - "\7v\2\2\u0377\u0378\7c\2\2\u0378\u0379\7v\2\2\u0379\u037a\7k\2\2\u037a"+ - "\u037b\7e\2\2\u037b\u037c\7c\2\2\u037c\u037d\7n\2\2\u037d\u037e\7n\2\2"+ - "\u037e\u037f\7{\2\2\u037f\u00c2\3\2\2\2\u0380\u0381\7k\2\2\u0381\u0382"+ - "\7u\2\2\u0382\u00c4\3\2\2\2\u0383\u0384\7v\2\2\u0384\u0385\7t\2\2\u0385"+ - "\u0386\7g\2\2\u0386\u0387\7c\2\2\u0387\u0388\7v\2\2\u0388\u00c6\3\2\2"+ - "\2\u0389\u038a\7e\2\2\u038a\u038b\7c\2\2\u038b\u038c\7u\2\2\u038c\u038d"+ - "\7v\2\2\u038d\u00c8\3\2\2\2\u038e\u038f\7e\2\2\u038f\u0390\7c\2\2\u0390"+ - "\u0391\7u\2\2\u0391\u0392\7v\2\2\u0392\u0393\7c\2\2\u0393\u0394\7d\2\2"+ - "\u0394\u0395\7n\2\2\u0395\u0396\7g\2\2\u0396\u00ca\3\2\2\2\u0397\u0398"+ - "\7x\2\2\u0398\u0399\7g\2\2\u0399\u039a\7t\2\2\u039a\u039b\7u\2\2\u039b"+ - "\u039c\7k\2\2\u039c\u039d\7q\2\2\u039d\u039e\7p\2\2\u039e\u00cc\3\2\2"+ - "\2\u039f\u03a0\7l\2\2\u03a0\u03a1\7u\2\2\u03a1\u03a2\7q\2\2\u03a2\u03a3"+ - "\7p\2\2\u03a3\u03a4\7k\2\2\u03a4\u03a5\7s\2\2\u03a5\u00ce\3\2\2\2\u03a6"+ - "\u03a7\7w\2\2\u03a7\u03a8\7p\2\2\u03a8\u03a9\7q\2\2\u03a9\u03aa\7t\2\2"+ - "\u03aa\u03ab\7f\2\2\u03ab\u03ac\7g\2\2\u03ac\u03ad\7t\2\2\u03ad\u03ae"+ - "\7g\2\2\u03ae\u03af\7f\2\2\u03af\u00d0\3\2\2\2\u03b0\u03b1\7v\2\2\u03b1"+ - "\u03b2\7t\2\2\u03b2\u03b3\7w\2\2\u03b3\u03b4\7g\2\2\u03b4\u00d2\3\2\2"+ - "\2\u03b5\u03b6\7h\2\2\u03b6\u03b7\7c\2\2\u03b7\u03b8\7n\2\2\u03b8\u03b9"+ - "\7u\2\2\u03b9\u03ba\7g\2\2\u03ba\u00d4\3\2\2\2\u03bb\u03bc\7v\2\2\u03bc"+ - "\u03bd\7{\2\2\u03bd\u03be\7r\2\2\u03be\u03bf\7g\2\2\u03bf\u00d6\3\2\2"+ - "\2\u03c0\u03c1\7x\2\2\u03c1\u03c2\7c\2\2\u03c2\u03c3\7n\2\2\u03c3\u03c4"+ - "\7k\2\2\u03c4\u03c5\7f\2\2\u03c5\u03c6\7c\2\2\u03c6\u03c7\7v\2\2\u03c7"+ - "\u03c8\7g\2\2\u03c8\u00d8\3\2\2\2\u03c9\u03ca\7c\2\2\u03ca\u03cb\7p\2"+ - "\2\u03cb\u03cc\7p\2\2\u03cc\u03cd\7q\2\2\u03cd\u03ce\7v\2\2\u03ce\u03cf"+ - "\7c\2\2\u03cf\u03d0\7v\2\2\u03d0\u03d1\7g\2\2\u03d1\u00da\3\2\2\2\u03d2"+ - "\u03d3\7f\2\2\u03d3\u03d4\7g\2\2\u03d4\u03d5\7e\2\2\u03d5\u03d6\7n\2\2"+ - "\u03d6\u03d7\7c\2\2\u03d7\u03d8\7t\2\2\u03d8\u03d9\7g\2\2\u03d9\u00dc"+ - "\3\2\2\2\u03da\u03db\7e\2\2\u03db\u03dc\7q\2\2\u03dc\u03dd\7p\2\2\u03dd"+ - "\u03de\7v\2\2\u03de\u03df\7g\2\2\u03df\u03e0\7z\2\2\u03e0\u03e1\7v\2\2"+ - "\u03e1\u00de\3\2\2\2\u03e2\u03e3\7k\2\2\u03e3\u03e4\7v\2\2\u03e4\u03e5"+ - "\7g\2\2\u03e5\u03e6\7o\2\2\u03e6\u00e0\3\2\2\2\u03e7\u03e8\7x\2\2\u03e8"+ - "\u03e9\7c\2\2\u03e9\u03ea\7t\2\2\u03ea\u03eb\7k\2\2\u03eb\u03ec\7c\2\2"+ - "\u03ec\u03ed\7d\2\2\u03ed\u03ee\7n\2\2\u03ee\u03ef\7g\2\2\u03ef\u00e2"+ - "\3\2\2\2\u03f0\u03f1\7k\2\2\u03f1\u03f2\7p\2\2\u03f2\u03f3\7u\2\2\u03f3"+ - "\u03f4\7g\2\2\u03f4\u03f5\7t\2\2\u03f5\u03f6\7v\2\2\u03f6\u00e4\3\2\2"+ - "\2\u03f7\u03f8\7f\2\2\u03f8\u03f9\7g\2\2\u03f9\u03fa\7n\2\2\u03fa\u03fb"+ - "\7g\2\2\u03fb\u03fc\7v\2\2\u03fc\u03fd\7g\2\2\u03fd\u00e6\3\2\2\2\u03fe"+ - "\u03ff\7t\2\2\u03ff\u0400\7g\2\2\u0400\u0401\7p\2\2\u0401\u0402\7c\2\2"+ - "\u0402\u0403\7o\2\2\u0403\u0404\7g\2\2\u0404\u00e8\3\2\2\2\u0405\u0406"+ - "\7t\2\2\u0406\u0407\7g\2\2\u0407\u0408\7r\2\2\u0408\u0409\7n\2\2\u0409"+ - "\u040a\7c\2\2\u040a\u040b\7e\2\2\u040b\u040c\7g\2\2\u040c\u00ea\3\2\2"+ - "\2\u040d\u040e\7e\2\2\u040e\u040f\7q\2\2\u040f\u0410\7r\2\2\u0410\u0411"+ - "\7{\2\2\u0411\u00ec\3\2\2\2\u0412\u0413\7o\2\2\u0413\u0414\7q\2\2\u0414"+ - "\u0415\7f\2\2\u0415\u0416\7k\2\2\u0416\u0417\7h\2\2\u0417\u0418\7{\2\2"+ - "\u0418\u00ee\3\2\2\2\u0419\u041a\7c\2\2\u041a\u041b\7r\2\2\u041b\u041c"+ - "\7r\2\2\u041c\u041d\7g\2\2\u041d\u041e\7p\2\2\u041e\u041f\7f\2\2\u041f"+ - "\u00f0\3\2\2\2\u0420\u0421\7k\2\2\u0421\u0422\7p\2\2\u0422\u0423\7v\2"+ - "\2\u0423\u0424\7q\2\2\u0424\u00f2\3\2\2\2\u0425\u0426\7x\2\2\u0426\u0427"+ - "\7c\2\2\u0427\u0428\7n\2\2\u0428\u0429\7w\2\2\u0429\u042a\7g\2\2\u042a"+ - "\u00f4\3\2\2\2\u042b\u042c\7l\2\2\u042c\u042d\7u\2\2\u042d\u042e\7q\2"+ - "\2\u042e\u042f\7p\2\2\u042f\u00f6\3\2\2\2\u0430\u0431\7y\2\2\u0431\u0432"+ - "\7k\2\2\u0432\u0433\7v\2\2\u0433\u0434\7j\2\2\u0434\u00f8\3\2\2\2\u0435"+ - "\u0436\7r\2\2\u0436\u0437\7q\2\2\u0437\u0438\7u\2\2\u0438\u0439\7k\2\2"+ - "\u0439\u043a\7v\2\2\u043a\u043b\7k\2\2\u043b\u043c\7q\2\2\u043c\u043d"+ - "\7p\2\2\u043d\u00fa\3\2\2\2\u043e\u043f\7d\2\2\u043f\u0440\7t\2\2\u0440"+ - "\u0441\7g\2\2\u0441\u0442\7c\2\2\u0442\u0443\7m\2\2\u0443\u00fc\3\2\2"+ - "\2\u0444\u0445\7n\2\2\u0445\u0446\7q\2\2\u0446\u0447\7q\2\2\u0447\u0448"+ - "\7r\2\2\u0448\u00fe\3\2\2\2\u0449\u044a\7e\2\2\u044a\u044b\7q\2\2\u044b"+ - "\u044c\7p\2\2\u044c\u044d\7v\2\2\u044d\u044e\7k\2\2\u044e\u044f\7p\2\2"+ - "\u044f\u0450\7w\2\2\u0450\u0451\7g\2\2\u0451\u0100\3\2\2\2\u0452\u0453"+ - "\7g\2\2\u0453\u0454\7z\2\2\u0454\u0455\7k\2\2\u0455\u0456\7v\2\2\u0456"+ - "\u0102\3\2\2\2\u0457\u0458\7t\2\2\u0458\u0459\7g\2\2\u0459\u045a\7v\2"+ - "\2\u045a\u045b\7w\2\2\u045b\u045c\7t\2\2\u045c\u045d\7p\2\2\u045d\u045e"+ - "\7k\2\2\u045e\u045f\7p\2\2\u045f\u0460\7i\2\2\u0460\u0104\3\2\2\2\u0461"+ - "\u0462\7y\2\2\u0462\u0463\7j\2\2\u0463\u0464\7k\2\2\u0464\u0465\7n\2\2"+ - "\u0465\u0466\7g\2\2\u0466\u0106\3\2\2\2\u0467\u0468\7k\2\2\u0468\u0469"+ - "\7o\2\2\u0469\u046a\7r\2\2\u046a\u046b\7q\2\2\u046b\u046c\7t\2\2\u046c"+ - "\u046d\7v\2\2\u046d\u0108\3\2\2\2\u046e\u046f\7u\2\2\u046f\u0470\7e\2"+ - "\2\u0470\u0471\7j\2\2\u0471\u0472\7g\2\2\u0472\u0473\7o\2\2\u0473\u0474"+ - "\7c\2\2\u0474\u010a\3\2\2\2\u0475\u0476\7p\2\2\u0476\u0477\7c\2\2\u0477"+ - "\u0478\7o\2\2\u0478\u0479\7g\2\2\u0479\u047a\7u\2\2\u047a\u047b\7r\2\2"+ - "\u047b\u047c\7c\2\2\u047c\u047d\7e\2\2\u047d\u047e\7g\2\2\u047e\u010c"+ - "\3\2\2\2\u047f\u0480\7g\2\2\u0480\u0481\7n\2\2\u0481\u0482\7g\2\2\u0482"+ - "\u0483\7o\2\2\u0483\u0484\7g\2\2\u0484\u0485\7p\2\2\u0485\u0486\7v\2\2"+ - "\u0486\u010e\3\2\2\2\u0487\u0488\7\61\2\2\u0488\u0110\3\2\2\2\u0489\u048a"+ - "\7\61\2\2\u048a\u048b\7\61\2\2\u048b\u0112\3\2\2\2\u048c\u048d\7B\2\2"+ - "\u048d\u0114\3\2\2\2\u048e\u048f\7e\2\2\u048f\u0490\7j\2\2\u0490\u0491"+ - "\7k\2\2\u0491\u0492\7n\2\2\u0492\u0493\7f\2\2\u0493\u0116\3\2\2\2\u0494"+ - "\u0495\7f\2\2\u0495\u0496\7g\2\2\u0496\u0497\7u\2\2\u0497\u0498\7e\2\2"+ - "\u0498\u0499\7g\2\2\u0499\u049a\7p\2\2\u049a\u049b\7f\2\2\u049b\u049c"+ - "\7c\2\2\u049c\u049d\7p\2\2\u049d\u049e\7v\2\2\u049e\u0118\3\2\2\2\u049f"+ - "\u04a0\7c\2\2\u04a0\u04a1\7v\2\2\u04a1\u04a2\7v\2\2\u04a2\u04a3\7t\2\2"+ - "\u04a3\u04a4\7k\2\2\u04a4\u04a5\7d\2\2\u04a5\u04a6\7w\2\2\u04a6\u04a7"+ - "\7v\2\2\u04a7\u04a8\7g\2\2\u04a8\u011a\3\2\2\2\u04a9\u04aa\7u\2\2\u04aa"+ - "\u04ab\7g\2\2\u04ab\u04ac\7n\2\2\u04ac\u04ad\7h\2\2\u04ad\u011c\3\2\2"+ - "\2\u04ae\u04af\7f\2\2\u04af\u04b0\7g\2\2\u04b0\u04b1\7u\2\2\u04b1\u04b2"+ - "\7e\2\2\u04b2\u04b3\7g\2\2\u04b3\u04b4\7p\2\2\u04b4\u04b5\7f\2\2\u04b5"+ - "\u04b6\7c\2\2\u04b6\u04b7\7p\2\2\u04b7\u04b8\7v\2\2\u04b8\u04b9\7/\2\2"+ - "\u04b9\u04ba\7q\2\2\u04ba\u04bb\7t\2\2\u04bb\u04bc\7/\2\2\u04bc\u04bd"+ - "\7u\2\2\u04bd\u04be\7g\2\2\u04be\u04bf\7n\2\2\u04bf\u04c0\7h\2\2\u04c0"+ - "\u011e\3\2\2\2\u04c1\u04c2\7h\2\2\u04c2\u04c3\7q\2\2\u04c3\u04c4\7n\2"+ - "\2\u04c4\u04c5\7n\2\2\u04c5\u04c6\7q\2\2\u04c6\u04c7\7y\2\2\u04c7\u04c8"+ - "\7k\2\2\u04c8\u04c9\7p\2\2\u04c9\u04ca\7i\2\2\u04ca\u04cb\7/\2\2\u04cb"+ - "\u04cc\7u\2\2\u04cc\u04cd\7k\2\2\u04cd\u04ce\7d\2\2\u04ce\u04cf\7n\2\2"+ - "\u04cf\u04d0\7k\2\2\u04d0\u04d1\7p\2\2\u04d1\u04d2\7i\2\2\u04d2\u0120"+ - "\3\2\2\2\u04d3\u04d4\7h\2\2\u04d4\u04d5\7q\2\2\u04d5\u04d6\7n\2\2\u04d6"+ - "\u04d7\7n\2\2\u04d7\u04d8\7q\2\2\u04d8\u04d9\7y\2\2\u04d9\u04da\7k\2\2"+ - "\u04da\u04db\7p\2\2\u04db\u04dc\7i\2\2\u04dc\u0122\3\2\2\2\u04dd\u04de"+ - "\7r\2\2\u04de\u04df\7c\2\2\u04df\u04e0\7t\2\2\u04e0\u04e1\7g\2\2\u04e1"+ - "\u04e2\7p\2\2\u04e2\u04e3\7v\2\2\u04e3\u0124\3\2\2\2\u04e4\u04e5\7c\2"+ - "\2\u04e5\u04e6\7p\2\2\u04e6\u04e7\7e\2\2\u04e7\u04e8\7g\2\2\u04e8\u04e9"+ - "\7u\2\2\u04e9\u04ea\7v\2\2\u04ea\u04eb\7q\2\2\u04eb\u04ec\7t\2\2\u04ec"+ - "\u0126\3\2\2\2\u04ed\u04ee\7r\2\2\u04ee\u04ef\7t\2\2\u04ef\u04f0\7g\2"+ - "\2\u04f0\u04f1\7e\2\2\u04f1\u04f2\7g\2\2\u04f2\u04f3\7f\2\2\u04f3\u04f4"+ - "\7k\2\2\u04f4\u04f5\7p\2\2\u04f5\u04f6\7i\2\2\u04f6\u04f7\7/\2\2\u04f7"+ - "\u04f8\7u\2\2\u04f8\u04f9\7k\2\2\u04f9\u04fa\7d\2\2\u04fa\u04fb\7n\2\2"+ - "\u04fb\u04fc\7k\2\2\u04fc\u04fd\7p\2\2\u04fd\u04fe\7i\2\2\u04fe\u0128"+ - "\3\2\2\2\u04ff\u0500\7r\2\2\u0500\u0501\7t\2\2\u0501\u0502\7g\2\2\u0502"+ - "\u0503\7e\2\2\u0503\u0504\7g\2\2\u0504\u0505\7f\2\2\u0505\u0506\7k\2\2"+ - "\u0506\u0507\7p\2\2\u0507\u0508\7i\2\2\u0508\u012a\3\2\2\2\u0509\u050a"+ - "\7c\2\2\u050a\u050b\7p\2\2\u050b\u050c\7e\2\2\u050c\u050d\7g\2\2\u050d"+ - "\u050e\7u\2\2\u050e\u050f\7v\2\2\u050f\u0510\7q\2\2\u0510\u0511\7t\2\2"+ - "\u0511\u0512\7/\2\2\u0512\u0513\7q\2\2\u0513\u0514\7t\2\2\u0514\u0515"+ - "\7/\2\2\u0515\u0516\7u\2\2\u0516\u0517\7g\2\2\u0517\u0518\7n\2\2\u0518"+ - "\u0519\7h\2\2\u0519\u012c\3\2\2\2\u051a\u051b\7p\2\2\u051b\u051c\7q\2"+ - "\2\u051c\u051d\7f\2\2\u051d\u051e\7g\2\2\u051e\u012e\3\2\2\2\u051f\u0520"+ - "\7d\2\2\u0520\u0521\7k\2\2\u0521\u0522\7p\2\2\u0522\u0523\7c\2\2\u0523"+ - "\u0524\7t\2\2\u0524\u0525\7{\2\2\u0525\u0130\3\2\2\2\u0526\u0527\7f\2"+ - "\2\u0527\u0528\7q\2\2\u0528\u0529\7e\2\2\u0529\u052a\7w\2\2\u052a\u052b"+ - "\7o\2\2\u052b\u052c\7g\2\2\u052c\u052d\7p\2\2\u052d\u052e\7v\2\2\u052e"+ - "\u0132\3\2\2\2\u052f\u0530\7f\2\2\u0530\u0531\7q\2\2\u0531\u0532\7e\2"+ - "\2\u0532\u0533\7w\2\2\u0533\u0534\7o\2\2\u0534\u0535\7g\2\2\u0535\u0536"+ - "\7p\2\2\u0536\u0537\7v\2\2\u0537\u0538\7/\2\2\u0538\u0539\7p\2\2\u0539"+ - "\u053a\7q\2\2\u053a\u053b\7f\2\2\u053b\u053c\7g\2\2\u053c\u0134\3\2\2"+ - "\2\u053d\u053e\7v\2\2\u053e\u053f\7g\2\2\u053f\u0540\7z\2\2\u0540\u0541"+ - "\7v\2\2\u0541\u0136\3\2\2\2\u0542\u0543\7r\2\2\u0543\u0544\7t\2\2\u0544"+ - "\u0545\7q\2\2\u0545\u0546\7e\2\2\u0546\u0547\7g\2\2\u0547\u0548\7u\2\2"+ - "\u0548\u0549\7u\2\2\u0549\u054a\7k\2\2\u054a\u054b\7p\2\2\u054b\u054c"+ - "\7i\2\2\u054c\u054d\7/\2\2\u054d\u054e\7k\2\2\u054e\u054f\7p\2\2\u054f"+ - "\u0550\7u\2\2\u0550\u0551\7v\2\2\u0551\u0552\7t\2\2\u0552\u0553\7w\2\2"+ - "\u0553\u0554\7e\2\2\u0554\u0555\7v\2\2\u0555\u0556\7k\2\2\u0556\u0557"+ - "\7q\2\2\u0557\u0558\7p\2\2\u0558\u0138\3\2\2\2\u0559\u055a\7p\2\2\u055a"+ - "\u055b\7c\2\2\u055b\u055c\7o\2\2\u055c\u055d\7g\2\2\u055d\u055e\7u\2\2"+ - "\u055e\u055f\7r\2\2\u055f\u0560\7c\2\2\u0560\u0561\7e\2\2\u0561\u0562"+ - "\7g\2\2\u0562\u0563\7/\2\2\u0563\u0564\7p\2\2\u0564\u0565\7q\2\2\u0565"+ - "\u0566\7f\2\2\u0566\u0567\7g\2\2\u0567\u013a\3\2\2\2\u0568\u0569\7u\2"+ - "\2\u0569\u056a\7e\2\2\u056a\u056b\7j\2\2\u056b\u056c\7g\2\2\u056c\u056d"+ - "\7o\2\2\u056d\u056e\7c\2\2\u056e\u056f\7/\2\2\u056f\u0570\7c\2\2\u0570"+ - "\u0571\7v\2\2\u0571\u0572\7v\2\2\u0572\u0573\7t\2\2\u0573\u0574\7k\2\2"+ - "\u0574\u0575\7d\2\2\u0575\u0576\7w\2\2\u0576\u0577\7v\2\2\u0577\u0578"+ - "\7g\2\2\u0578\u013c\3\2\2\2\u0579\u057a\7u\2\2\u057a\u057b\7e\2\2\u057b"+ - "\u057c\7j\2\2\u057c\u057d\7g\2\2\u057d\u057e\7o\2\2\u057e\u057f\7c\2\2"+ - "\u057f\u0580\7/\2\2\u0580\u0581\7g\2\2\u0581\u0582\7n\2\2\u0582\u0583"+ - "\7g\2\2\u0583\u0584\7o\2\2\u0584\u0585\7g\2\2\u0585\u0586\7p\2\2\u0586"+ - "\u0587\7v\2\2\u0587\u013e\3\2\2\2\u0588\u0589\7c\2\2\u0589\u058a\7t\2"+ - "\2\u058a\u058b\7t\2\2\u058b\u058c\7c\2\2\u058c\u058d\7{\2\2\u058d\u058e"+ - "\7/\2\2\u058e\u058f\7p\2\2\u058f\u0590\7q\2\2\u0590\u0591\7f\2\2\u0591"+ - "\u0592\7g\2\2\u0592\u0140\3\2\2\2\u0593\u0594\7d\2\2\u0594\u0595\7q\2"+ - "\2\u0595\u0596\7q\2\2\u0596\u0597\7n\2\2\u0597\u0598\7g\2\2\u0598\u0599"+ - "\7c\2\2\u0599\u059a\7p\2\2\u059a\u059b\7/\2\2\u059b\u059c\7p\2\2\u059c"+ - "\u059d\7q\2\2\u059d\u059e\7f\2\2\u059e\u059f\7g\2\2\u059f\u0142\3\2\2"+ - "\2\u05a0\u05a1\7p\2\2\u05a1\u05a2\7w\2\2\u05a2\u05a3\7n\2\2\u05a3\u05a4"+ - "\7n\2\2\u05a4\u05a5\7/\2\2\u05a5\u05a6\7p\2\2\u05a6\u05a7\7q\2\2\u05a7"+ - "\u05a8\7f\2\2\u05a8\u05a9\7g\2\2\u05a9\u0144\3\2\2\2\u05aa\u05ab\7p\2"+ - "\2\u05ab\u05ac\7w\2\2\u05ac\u05ad\7o\2\2\u05ad\u05ae\7d\2\2\u05ae\u05af"+ - "\7g\2\2\u05af\u05b0\7t\2\2\u05b0\u05b1\7/\2\2\u05b1\u05b2\7p\2\2\u05b2"+ - "\u05b3\7q\2\2\u05b3\u05b4\7f\2\2\u05b4\u05b5\7g\2\2\u05b5\u0146\3\2\2"+ - "\2\u05b6\u05b7\7q\2\2\u05b7\u05b8\7d\2\2\u05b8\u05b9\7l\2\2\u05b9\u05ba"+ - "\7g\2\2\u05ba\u05bb\7e\2\2\u05bb\u05bc\7v\2\2\u05bc\u05bd\7/\2\2\u05bd"+ - "\u05be\7p\2\2\u05be\u05bf\7q\2\2\u05bf\u05c0\7f\2\2\u05c0\u05c1\7g\2\2"+ - "\u05c1\u0148\3\2\2\2\u05c2\u05c3\7e\2\2\u05c3\u05c4\7q\2\2\u05c4\u05c5"+ - "\7o\2\2\u05c5\u05c6\7o\2\2\u05c6\u05c7\7g\2\2\u05c7\u05c8\7p\2\2\u05c8"+ - "\u05c9\7v\2\2\u05c9\u014a\3\2\2\2\u05ca\u05cb\7c\2\2\u05cb\u05cc\7t\2"+ - "\2\u05cc\u05cd\7t\2\2\u05cd\u05ce\7c\2\2\u05ce\u05cf\7{\2\2\u05cf\u014c"+ - "\3\2\2\2\u05d0\u05d1\7o\2\2\u05d1\u05d2\7c\2\2\u05d2\u05d3\7r\2\2\u05d3"+ - "\u014e\3\2\2\2\u05d4\u05d9\7$\2\2\u05d5\u05d8\5\u0151\u00a9\2\u05d6\u05d8"+ - "\n\2\2\2\u05d7\u05d5\3\2\2\2\u05d7\u05d6\3\2\2\2\u05d8\u05db\3\2\2\2\u05d9"+ - "\u05d7\3\2\2\2\u05d9\u05da\3\2\2\2\u05da\u05dc\3\2\2\2\u05db\u05d9\3\2"+ - "\2\2\u05dc\u05dd\7$\2\2\u05dd\u0150\3\2\2\2\u05de\u05e1\7^\2\2\u05df\u05e2"+ - "\t\3\2\2\u05e0\u05e2\5\u0153\u00aa\2\u05e1\u05df\3\2\2\2\u05e1\u05e0\3"+ - "\2\2\2\u05e2\u0152\3\2\2\2\u05e3\u05e4\7w\2\2\u05e4\u05e5\5\u0155\u00ab"+ - "\2\u05e5\u05e6\5\u0155\u00ab\2\u05e6\u05e7\5\u0155\u00ab\2\u05e7\u05e8"+ - "\5\u0155\u00ab\2\u05e8\u0154\3\2\2\2\u05e9\u05ea\t\4\2\2\u05ea\u0156\3"+ - "\2\2\2\u05eb\u05ec\7A\2\2\u05ec\u0158\3\2\2\2\u05ed\u05ee\7p\2\2\u05ee"+ - "\u05ef\7w\2\2\u05ef\u05f0\7n\2\2\u05f0\u05f1\7n\2\2\u05f1\u015a\3\2\2"+ - "\2\u05f2\u05f3\5\u015d\u00af\2\u05f3\u015c\3\2\2\2\u05f4\u05f8\5\u015f"+ - "\u00b0\2\u05f5\u05f8\5\u0161\u00b1\2\u05f6\u05f8\5\u0163\u00b2\2\u05f7"+ - "\u05f4\3\2\2\2\u05f7\u05f5\3\2\2\2\u05f7\u05f6\3\2\2\2\u05f8\u015e\3\2"+ - "\2\2\u05f9\u05fa\5\u0165\u00b3\2\u05fa\u0160\3\2\2\2\u05fb\u05fc\7\60"+ - "\2\2\u05fc\u0606\5\u0165\u00b3\2\u05fd\u05fe\5\u0165\u00b3\2\u05fe\u0602"+ - "\7\60\2\2\u05ff\u0601\t\5\2\2\u0600\u05ff\3\2\2\2\u0601\u0604\3\2\2\2"+ - "\u0602\u0600\3\2\2\2\u0602\u0603\3\2\2\2\u0603\u0606\3\2\2\2\u0604\u0602"+ - "\3\2\2\2\u0605\u05fb\3\2\2\2\u0605\u05fd\3\2\2\2\u0606\u0162\3\2\2\2\u0607"+ - "\u0608\7\60\2\2\u0608\u0614\5\u0165\u00b3\2\u0609\u0611\5\u0165\u00b3"+ - "\2\u060a\u060e\7\60\2\2\u060b\u060d\t\5\2\2\u060c\u060b\3\2\2\2\u060d"+ - "\u0610\3\2\2\2\u060e\u060c\3\2\2\2\u060e\u060f\3\2\2\2\u060f\u0612\3\2"+ - "\2\2\u0610\u060e\3\2\2\2\u0611\u060a\3\2\2\2\u0611\u0612\3\2\2\2\u0612"+ - "\u0614\3\2\2\2\u0613\u0607\3\2\2\2\u0613\u0609\3\2\2\2\u0614\u0615\3\2"+ - "\2\2\u0615\u0617\t\6\2\2\u0616\u0618\t\7\2\2\u0617\u0616\3\2\2\2\u0617"+ - "\u0618\3\2\2\2\u0618\u0619\3\2\2\2\u0619\u061a\5\u0165\u00b3\2\u061a\u0164"+ - "\3\2\2\2\u061b\u061d\t\5\2\2\u061c\u061b\3\2\2\2\u061d\u061e\3\2\2\2\u061e"+ - "\u061c\3\2\2\2\u061e\u061f\3\2\2\2\u061f\u0166\3\2\2\2\u0620\u0621\t\b"+ - "\2\2\u0621\u0622\3\2\2\2\u0622\u0623\b\u00b4\2\2\u0623\u0168\3\2\2\2\u0624"+ - "\u0628\5\u016b\u00b6\2\u0625\u0627\5\u016d\u00b7\2\u0626\u0625\3\2\2\2"+ - "\u0627\u062a\3\2\2\2\u0628\u0626\3\2\2\2\u0628\u0629\3\2\2\2\u0629\u016a"+ - "\3\2\2\2\u062a\u0628\3\2\2\2\u062b\u062d\t\t\2\2\u062c\u062b\3\2\2\2\u062d"+ - "\u016c\3\2\2\2\u062e\u0631\5\u016b\u00b6\2\u062f\u0631\t\n\2\2\u0630\u062e"+ - "\3\2\2\2\u0630\u062f\3\2\2\2\u0631\u016e\3\2\2\2\u0632\u0633\7*\2\2\u0633"+ - "\u063c\7<\2\2\u0634\u063b\5\u016f\u00b8\2\u0635\u0636\7*\2\2\u0636\u063b"+ - "\n\13\2\2\u0637\u0638\7<\2\2\u0638\u063b\n\f\2\2\u0639\u063b\n\r\2\2\u063a"+ - "\u0634\3\2\2\2\u063a\u0635\3\2\2\2\u063a\u0637\3\2\2\2\u063a\u0639\3\2"+ - "\2\2\u063b\u063e\3\2\2\2\u063c\u063a\3\2\2\2\u063c\u063d\3\2\2\2\u063d"+ - "\u0640\3\2\2\2\u063e\u063c\3\2\2\2\u063f\u0641\7<\2\2\u0640\u063f\3\2"+ - "\2\2\u0641\u0642\3\2\2\2\u0642\u0640\3\2\2\2\u0642\u0643\3\2\2\2\u0643"+ - "\u0644\3\2\2\2\u0644\u0645\7+\2\2\u0645\u0646\3\2\2\2\u0646\u0647\b\u00b8"+ - "\2\2\u0647\u0170\3\2\2\2\u0648\u0649\n\16\2\2\u0649\u0172\3\2\2\2\24\2"+ - "\u05d7\u05d9\u05e1\u05f7\u0602\u0605\u060e\u0611\u0613\u0617\u061e\u0628"+ - "\u062c\u0630\u063a\u063c\u0642\3\2\3\2"; + "\3\u009f\3\u009f\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0"+ + "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a2\3\u00a2"+ + "\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3\u00a3"+ + "\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4"+ + "\3\u00a4\3\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a6"+ + "\3\u00a6\3\u00a6\7\u00a6\u05ca\n\u00a6\f\u00a6\16\u00a6\u05cd\13\u00a6"+ + "\3\u00a6\3\u00a6\3\u00a7\3\u00a7\3\u00a7\5\u00a7\u05d4\n\u00a7\3\u00a8"+ + "\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00aa\3\u00aa"+ + "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ad\3\u00ad"+ + "\3\u00ad\5\u00ad\u05ea\n\u00ad\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00af"+ + "\3\u00af\3\u00af\7\u00af\u05f3\n\u00af\f\u00af\16\u00af\u05f6\13\u00af"+ + "\5\u00af\u05f8\n\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b0\7\u00b0"+ + "\u05ff\n\u00b0\f\u00b0\16\u00b0\u0602\13\u00b0\5\u00b0\u0604\n\u00b0\5"+ + "\u00b0\u0606\n\u00b0\3\u00b0\3\u00b0\5\u00b0\u060a\n\u00b0\3\u00b0\3\u00b0"+ + "\3\u00b1\6\u00b1\u060f\n\u00b1\r\u00b1\16\u00b1\u0610\3\u00b2\3\u00b2"+ + "\3\u00b2\3\u00b2\3\u00b3\3\u00b3\7\u00b3\u0619\n\u00b3\f\u00b3\16\u00b3"+ + "\u061c\13\u00b3\3\u00b4\5\u00b4\u061f\n\u00b4\3\u00b5\3\u00b5\5\u00b5"+ + "\u0623\n\u00b5\3\u00b6\3\u00b6\3\u00b6\3\u00b6\3\u00b6\3\u00b6\3\u00b6"+ + "\3\u00b6\7\u00b6\u062d\n\u00b6\f\u00b6\16\u00b6\u0630\13\u00b6\3\u00b6"+ + "\6\u00b6\u0633\n\u00b6\r\u00b6\16\u00b6\u0634\3\u00b6\3\u00b6\3\u00b6"+ + "\3\u00b6\3\u00b7\3\u00b7\2\2\u00b8\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n"+ + "\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30"+ + "/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.["+ + "/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083"+ + "C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097"+ + "M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00ab"+ + "W\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bf"+ + "a\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3"+ + "k\u00d5l\u00d7m\u00d9n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3s\u00e5t\u00e7"+ + "u\u00e9v\u00ebw\u00edx\u00efy\u00f1z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb"+ + "\177\u00fd\u0080\u00ff\u0081\u0101\u0082\u0103\u0083\u0105\u0084\u0107"+ + "\u0085\u0109\u0086\u010b\u0087\u010d\u0088\u010f\u0089\u0111\u008a\u0113"+ + "\u008b\u0115\u008c\u0117\u008d\u0119\u008e\u011b\u008f\u011d\u0090\u011f"+ + "\u0091\u0121\u0092\u0123\u0093\u0125\u0094\u0127\u0095\u0129\u0096\u012b"+ + "\u0097\u012d\u0098\u012f\u0099\u0131\u009a\u0133\u009b\u0135\u009c\u0137"+ + "\u009d\u0139\u009e\u013b\u009f\u013d\u00a0\u013f\u00a1\u0141\u00a2\u0143"+ + "\u00a3\u0145\u00a4\u0147\u00a5\u0149\u00a6\u014b\u00a7\u014d\2\u014f\2"+ + "\u0151\2\u0153\u00a8\u0155\u00a9\u0157\u00aa\u0159\u00ab\u015b\u00ac\u015d"+ + "\u00ad\u015f\u00ae\u0161\2\u0163\u00af\u0165\u00b0\u0167\2\u0169\2\u016b"+ + "\u00b1\u016d\u00b2\3\2\17\4\2$$^^\n\2$$\61\61^^ddhhppttvv\5\2\62;CHch"+ + "\3\2\62;\4\2GGgg\4\2--//\5\2\13\f\17\17\"\"\20\2C\\aac|\u00c2\u00d8\u00da"+ + "\u00f8\u00fa\u0301\u0372\u037f\u0381\u2001\u200e\u200f\u2072\u2191\u2c02"+ + "\u2ff1\u3003\ud801\uf902\ufdd1\ufdf2\uffff\7\2//\62;\u00b9\u00b9\u0302"+ + "\u0371\u2041\u2042\3\2<<\3\2++\4\2**<<\7\2$$()>>}}\177\177\2\u0648\2\3"+ + "\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2"+ + "\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31"+ + "\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2"+ + "\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2"+ + "\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2"+ + "\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2"+ + "I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3"+ + "\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2"+ + "\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2"+ + "o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3"+ + "\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085"+ + "\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2"+ + "\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097"+ + "\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2"+ + "\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9"+ + "\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2"+ + "\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb"+ + "\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2"+ + "\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd"+ + "\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2"+ + "\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df"+ + "\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2"+ + "\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1"+ + "\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2"+ + "\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff\3\2\2\2\2\u0101\3\2\2\2\2\u0103"+ + "\3\2\2\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\2\u0109\3\2\2\2\2\u010b\3\2\2"+ + "\2\2\u010d\3\2\2\2\2\u010f\3\2\2\2\2\u0111\3\2\2\2\2\u0113\3\2\2\2\2\u0115"+ + "\3\2\2\2\2\u0117\3\2\2\2\2\u0119\3\2\2\2\2\u011b\3\2\2\2\2\u011d\3\2\2"+ + "\2\2\u011f\3\2\2\2\2\u0121\3\2\2\2\2\u0123\3\2\2\2\2\u0125\3\2\2\2\2\u0127"+ + "\3\2\2\2\2\u0129\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2\2\2\u012f\3\2\2"+ + "\2\2\u0131\3\2\2\2\2\u0133\3\2\2\2\2\u0135\3\2\2\2\2\u0137\3\2\2\2\2\u0139"+ + "\3\2\2\2\2\u013b\3\2\2\2\2\u013d\3\2\2\2\2\u013f\3\2\2\2\2\u0141\3\2\2"+ + "\2\2\u0143\3\2\2\2\2\u0145\3\2\2\2\2\u0147\3\2\2\2\2\u0149\3\2\2\2\2\u014b"+ + "\3\2\2\2\2\u0153\3\2\2\2\2\u0155\3\2\2\2\2\u0157\3\2\2\2\2\u0159\3\2\2"+ + "\2\2\u015b\3\2\2\2\2\u015d\3\2\2\2\2\u015f\3\2\2\2\2\u0163\3\2\2\2\2\u0165"+ + "\3\2\2\2\2\u016b\3\2\2\2\2\u016d\3\2\2\2\3\u016f\3\2\2\2\5\u0171\3\2\2"+ + "\2\7\u0178\3\2\2\2\t\u017a\3\2\2\2\13\u017c\3\2\2\2\r\u017f\3\2\2\2\17"+ + "\u0181\3\2\2\2\21\u0183\3\2\2\2\23\u0185\3\2\2\2\25\u0187\3\2\2\2\27\u0189"+ + "\3\2\2\2\31\u018b\3\2\2\2\33\u018d\3\2\2\2\35\u018f\3\2\2\2\37\u0198\3"+ + "\2\2\2!\u01a0\3\2\2\2#\u01af\3\2\2\2%\u01b1\3\2\2\2\'\u01c3\3\2\2\2)\u01d6"+ + "\3\2\2\2+\u01df\3\2\2\2-\u01ea\3\2\2\2/\u01ee\3\2\2\2\61\u01f6\3\2\2\2"+ + "\63\u0200\3\2\2\2\65\u020b\3\2\2\2\67\u0211\3\2\2\29\u0223\3\2\2\2;\u022c"+ + "\3\2\2\2=\u0235\3\2\2\2?\u023c\3\2\2\2A\u0244\3\2\2\2C\u024c\3\2\2\2E"+ + "\u024f\3\2\2\2G\u0252\3\2\2\2I\u0255\3\2\2\2K\u0258\3\2\2\2M\u025b\3\2"+ + "\2\2O\u025e\3\2\2\2Q\u0261\3\2\2\2S\u0263\3\2\2\2U\u0266\3\2\2\2W\u0268"+ + "\3\2\2\2Y\u026b\3\2\2\2[\u026e\3\2\2\2]\u0270\3\2\2\2_\u0272\3\2\2\2a"+ + "\u0276\3\2\2\2c\u027b\3\2\2\2e\u027f\3\2\2\2g\u0281\3\2\2\2i\u0283\3\2"+ + "\2\2k\u0285\3\2\2\2m\u0287\3\2\2\2o\u028a\3\2\2\2q\u028c\3\2\2\2s\u028f"+ + "\3\2\2\2u\u0292\3\2\2\2w\u0295\3\2\2\2y\u0299\3\2\2\2{\u029d\3\2\2\2}"+ + "\u02a3\3\2\2\2\177\u02a9\3\2\2\2\u0081\u02ac\3\2\2\2\u0083\u02b2\3\2\2"+ + "\2\u0085\u02b9\3\2\2\2\u0087\u02bc\3\2\2\2\u0089\u02bf\3\2\2\2\u008b\u02c2"+ + "\3\2\2\2\u008d\u02c5\3\2\2\2\u008f\u02ce\3\2\2\2\u0091\u02d4\3\2\2\2\u0093"+ + "\u02da\3\2\2\2\u0095\u02e1\3\2\2\2\u0097\u02eb\3\2\2\2\u0099\u02f6\3\2"+ + "\2\2\u009b\u02fb\3\2\2\2\u009d\u0301\3\2\2\2\u009f\u030b\3\2\2\2\u00a1"+ + "\u0315\3\2\2\2\u00a3\u031e\3\2\2\2\u00a5\u0324\3\2\2\2\u00a7\u032b\3\2"+ + "\2\2\u00a9\u0330\3\2\2\2\u00ab\u0334\3\2\2\2\u00ad\u033a\3\2\2\2\u00af"+ + "\u0342\3\2\2\2\u00b1\u0347\3\2\2\2\u00b3\u034c\3\2\2\2\u00b5\u0357\3\2"+ + "\2\2\u00b7\u035a\3\2\2\2\u00b9\u035e\3\2\2\2\u00bb\u0362\3\2\2\2\u00bd"+ + "\u0365\3\2\2\2\u00bf\u036e\3\2\2\2\u00c1\u0371\3\2\2\2\u00c3\u037c\3\2"+ + "\2\2\u00c5\u037f\3\2\2\2\u00c7\u0385\3\2\2\2\u00c9\u038a\3\2\2\2\u00cb"+ + "\u0393\3\2\2\2\u00cd\u039b\3\2\2\2\u00cf\u03a2\3\2\2\2\u00d1\u03ac\3\2"+ + "\2\2\u00d3\u03b1\3\2\2\2\u00d5\u03b7\3\2\2\2\u00d7\u03bc\3\2\2\2\u00d9"+ + "\u03c5\3\2\2\2\u00db\u03ce\3\2\2\2\u00dd\u03d6\3\2\2\2\u00df\u03de\3\2"+ + "\2\2\u00e1\u03e3\3\2\2\2\u00e3\u03ec\3\2\2\2\u00e5\u03f3\3\2\2\2\u00e7"+ + "\u03fa\3\2\2\2\u00e9\u0401\3\2\2\2\u00eb\u0409\3\2\2\2\u00ed\u040e\3\2"+ + "\2\2\u00ef\u0415\3\2\2\2\u00f1\u041c\3\2\2\2\u00f3\u0421\3\2\2\2\u00f5"+ + "\u0427\3\2\2\2\u00f7\u042c\3\2\2\2\u00f9\u0431\3\2\2\2\u00fb\u043a\3\2"+ + "\2\2\u00fd\u0441\3\2\2\2\u00ff\u0448\3\2\2\2\u0101\u0452\3\2\2\2\u0103"+ + "\u045a\3\2\2\2\u0105\u045c\3\2\2\2\u0107\u045f\3\2\2\2\u0109\u0461\3\2"+ + "\2\2\u010b\u0467\3\2\2\2\u010d\u0472\3\2\2\2\u010f\u047c\3\2\2\2\u0111"+ + "\u0481\3\2\2\2\u0113\u0494\3\2\2\2\u0115\u04a6\3\2\2\2\u0117\u04b0\3\2"+ + "\2\2\u0119\u04b7\3\2\2\2\u011b\u04c0\3\2\2\2\u011d\u04d2\3\2\2\2\u011f"+ + "\u04dc\3\2\2\2\u0121\u04ed\3\2\2\2\u0123\u04f2\3\2\2\2\u0125\u04f9\3\2"+ + "\2\2\u0127\u0502\3\2\2\2\u0129\u0510\3\2\2\2\u012b\u0515\3\2\2\2\u012d"+ + "\u052c\3\2\2\2\u012f\u053b\3\2\2\2\u0131\u054c\3\2\2\2\u0133\u055b\3\2"+ + "\2\2\u0135\u0566\3\2\2\2\u0137\u0573\3\2\2\2\u0139\u057d\3\2\2\2\u013b"+ + "\u0589\3\2\2\2\u013d\u0595\3\2\2\2\u013f\u059d\3\2\2\2\u0141\u05a3\3\2"+ + "\2\2\u0143\u05a8\3\2\2\2\u0145\u05b1\3\2\2\2\u0147\u05b6\3\2\2\2\u0149"+ + "\u05c0\3\2\2\2\u014b\u05c6\3\2\2\2\u014d\u05d0\3\2\2\2\u014f\u05d5\3\2"+ + "\2\2\u0151\u05db\3\2\2\2\u0153\u05dd\3\2\2\2\u0155\u05df\3\2\2\2\u0157"+ + "\u05e4\3\2\2\2\u0159\u05e9\3\2\2\2\u015b\u05eb\3\2\2\2\u015d\u05f7\3\2"+ + "\2\2\u015f\u0605\3\2\2\2\u0161\u060e\3\2\2\2\u0163\u0612\3\2\2\2\u0165"+ + "\u0616\3\2\2\2\u0167\u061e\3\2\2\2\u0169\u0622\3\2\2\2\u016b\u0624\3\2"+ + "\2\2\u016d\u063a\3\2\2\2\u016f\u0170\7=\2\2\u0170\4\3\2\2\2\u0171\u0172"+ + "\7o\2\2\u0172\u0173\7q\2\2\u0173\u0174\7f\2\2\u0174\u0175\7w\2\2\u0175"+ + "\u0176\7n\2\2\u0176\u0177\7g\2\2\u0177\6\3\2\2\2\u0178\u0179\7?\2\2\u0179"+ + "\b\3\2\2\2\u017a\u017b\7&\2\2\u017b\n\3\2\2\2\u017c\u017d\7<\2\2\u017d"+ + "\u017e\7?\2\2\u017e\f\3\2\2\2\u017f\u0180\7}\2\2\u0180\16\3\2\2\2\u0181"+ + "\u0182\7\177\2\2\u0182\20\3\2\2\2\u0183\u0184\7*\2\2\u0184\22\3\2\2\2"+ + "\u0185\u0186\7+\2\2\u0186\24\3\2\2\2\u0187\u0188\7,\2\2\u0188\26\3\2\2"+ + "\2\u0189\u018a\7~\2\2\u018a\30\3\2\2\2\u018b\u018c\7\'\2\2\u018c\32\3"+ + "\2\2\2\u018d\u018e\7.\2\2\u018e\34\3\2\2\2\u018f\u0190\7q\2\2\u0190\u0191"+ + "\7t\2\2\u0191\u0192\7f\2\2\u0192\u0193\7g\2\2\u0193\u0194\7t\2\2\u0194"+ + "\u0195\7k\2\2\u0195\u0196\7p\2\2\u0196\u0197\7i\2\2\u0197\36\3\2\2\2\u0198"+ + "\u0199\7q\2\2\u0199\u019a\7t\2\2\u019a\u019b\7f\2\2\u019b\u019c\7g\2\2"+ + "\u019c\u019d\7t\2\2\u019d\u019e\7g\2\2\u019e\u019f\7f\2\2\u019f \3\2\2"+ + "\2\u01a0\u01a1\7f\2\2\u01a1\u01a2\7g\2\2\u01a2\u01a3\7e\2\2\u01a3\u01a4"+ + "\7k\2\2\u01a4\u01a5\7o\2\2\u01a5\u01a6\7c\2\2\u01a6\u01a7\7n\2\2\u01a7"+ + "\u01a8\7/\2\2\u01a8\u01a9\7h\2\2\u01a9\u01aa\7q\2\2\u01aa\u01ab\7t\2\2"+ + "\u01ab\u01ac\7o\2\2\u01ac\u01ad\7c\2\2\u01ad\u01ae\7v\2\2\u01ae\"\3\2"+ + "\2\2\u01af\u01b0\7<\2\2\u01b0$\3\2\2\2\u01b1\u01b2\7f\2\2\u01b2\u01b3"+ + "\7g\2\2\u01b3\u01b4\7e\2\2\u01b4\u01b5\7k\2\2\u01b5\u01b6\7o\2\2\u01b6"+ + "\u01b7\7c\2\2\u01b7\u01b8\7n\2\2\u01b8\u01b9\7/\2\2\u01b9\u01ba\7u\2\2"+ + "\u01ba\u01bb\7g\2\2\u01bb\u01bc\7r\2\2\u01bc\u01bd\7c\2\2\u01bd\u01be"+ + "\7t\2\2\u01be\u01bf\7c\2\2\u01bf\u01c0\7v\2\2\u01c0\u01c1\7q\2\2\u01c1"+ + "\u01c2\7t\2\2\u01c2&\3\2\2\2\u01c3\u01c4\7i\2\2\u01c4\u01c5\7t\2\2\u01c5"+ + "\u01c6\7q\2\2\u01c6\u01c7\7w\2\2\u01c7\u01c8\7r\2\2\u01c8\u01c9\7k\2\2"+ + "\u01c9\u01ca\7p\2\2\u01ca\u01cb\7i\2\2\u01cb\u01cc\7/\2\2\u01cc\u01cd"+ + "\7u\2\2\u01cd\u01ce\7g\2\2\u01ce\u01cf\7r\2\2\u01cf\u01d0\7c\2\2\u01d0"+ + "\u01d1\7t\2\2\u01d1\u01d2\7c\2\2\u01d2\u01d3\7v\2\2\u01d3\u01d4\7q\2\2"+ + "\u01d4\u01d5\7t\2\2\u01d5(\3\2\2\2\u01d6\u01d7\7k\2\2\u01d7\u01d8\7p\2"+ + "\2\u01d8\u01d9\7h\2\2\u01d9\u01da\7k\2\2\u01da\u01db\7p\2\2\u01db\u01dc"+ + "\7k\2\2\u01dc\u01dd\7v\2\2\u01dd\u01de\7{\2\2\u01de*\3\2\2\2\u01df\u01e0"+ + "\7o\2\2\u01e0\u01e1\7k\2\2\u01e1\u01e2\7p\2\2\u01e2\u01e3\7w\2\2\u01e3"+ + "\u01e4\7u\2\2\u01e4\u01e5\7/\2\2\u01e5\u01e6\7u\2\2\u01e6\u01e7\7k\2\2"+ + "\u01e7\u01e8\7i\2\2\u01e8\u01e9\7p\2\2\u01e9,\3\2\2\2\u01ea\u01eb\7P\2"+ + "\2\u01eb\u01ec\7c\2\2\u01ec\u01ed\7P\2\2\u01ed.\3\2\2\2\u01ee\u01ef\7"+ + "r\2\2\u01ef\u01f0\7g\2\2\u01f0\u01f1\7t\2\2\u01f1\u01f2\7e\2\2\u01f2\u01f3"+ + "\7g\2\2\u01f3\u01f4\7p\2\2\u01f4\u01f5\7v\2\2\u01f5\60\3\2\2\2\u01f6\u01f7"+ + "\7r\2\2\u01f7\u01f8\7g\2\2\u01f8\u01f9\7t\2\2\u01f9\u01fa\7/\2\2\u01fa"+ + "\u01fb\7o\2\2\u01fb\u01fc\7k\2\2\u01fc\u01fd\7n\2\2\u01fd\u01fe\7n\2\2"+ + "\u01fe\u01ff\7g\2\2\u01ff\62\3\2\2\2\u0200\u0201\7|\2\2\u0201\u0202\7"+ + "g\2\2\u0202\u0203\7t\2\2\u0203\u0204\7q\2\2\u0204\u0205\7/\2\2\u0205\u0206"+ + "\7f\2\2\u0206\u0207\7k\2\2\u0207\u0208\7i\2\2\u0208\u0209\7k\2\2\u0209"+ + "\u020a\7v\2\2\u020a\64\3\2\2\2\u020b\u020c\7f\2\2\u020c\u020d\7k\2\2\u020d"+ + "\u020e\7i\2\2\u020e\u020f\7k\2\2\u020f\u0210\7v\2\2\u0210\66\3\2\2\2\u0211"+ + "\u0212\7r\2\2\u0212\u0213\7c\2\2\u0213\u0214\7v\2\2\u0214\u0215\7v\2\2"+ + "\u0215\u0216\7g\2\2\u0216\u0217\7t\2\2\u0217\u0218\7p\2\2\u0218\u0219"+ + "\7/\2\2\u0219\u021a\7u\2\2\u021a\u021b\7g\2\2\u021b\u021c\7r\2\2\u021c"+ + "\u021d\7c\2\2\u021d\u021e\7t\2\2\u021e\u021f\7c\2\2\u021f\u0220\7v\2\2"+ + "\u0220\u0221\7q\2\2\u0221\u0222\7t\2\2\u02228\3\2\2\2\u0223\u0224\7g\2"+ + "\2\u0224\u0225\7z\2\2\u0225\u0226\7v\2\2\u0226\u0227\7g\2\2\u0227\u0228"+ + "\7t\2\2\u0228\u0229\7p\2\2\u0229\u022a\7c\2\2\u022a\u022b\7n\2\2\u022b"+ + ":\3\2\2\2\u022c\u022d\7h\2\2\u022d\u022e\7w\2\2\u022e\u022f\7p\2\2\u022f"+ + "\u0230\7e\2\2\u0230\u0231\7v\2\2\u0231\u0232\7k\2\2\u0232\u0233\7q\2\2"+ + "\u0233\u0234\7p\2\2\u0234<\3\2\2\2\u0235\u0236\7l\2\2\u0236\u0237\7u\2"+ + "\2\u0237\u0238\7q\2\2\u0238\u0239\7w\2\2\u0239\u023a\7p\2\2\u023a\u023b"+ + "\7f\2\2\u023b>\3\2\2\2\u023c\u023d\7e\2\2\u023d\u023e\7q\2\2\u023e\u023f"+ + "\7o\2\2\u023f\u0240\7r\2\2\u0240\u0241\7c\2\2\u0241\u0242\7e\2\2\u0242"+ + "\u0243\7v\2\2\u0243@\3\2\2\2\u0244\u0245\7x\2\2\u0245\u0246\7g\2\2\u0246"+ + "\u0247\7t\2\2\u0247\u0248\7d\2\2\u0248\u0249\7q\2\2\u0249\u024a\7u\2\2"+ + "\u024a\u024b\7g\2\2\u024bB\3\2\2\2\u024c\u024d\7g\2\2\u024d\u024e\7s\2"+ + "\2\u024eD\3\2\2\2\u024f\u0250\7p\2\2\u0250\u0251\7g\2\2\u0251F\3\2\2\2"+ + "\u0252\u0253\7n\2\2\u0253\u0254\7v\2\2\u0254H\3\2\2\2\u0255\u0256\7n\2"+ + "\2\u0256\u0257\7g\2\2\u0257J\3\2\2\2\u0258\u0259\7i\2\2\u0259\u025a\7"+ + "v\2\2\u025aL\3\2\2\2\u025b\u025c\7i\2\2\u025c\u025d\7g\2\2\u025dN\3\2"+ + "\2\2\u025e\u025f\7#\2\2\u025f\u0260\7?\2\2\u0260P\3\2\2\2\u0261\u0262"+ + "\7>\2\2\u0262R\3\2\2\2\u0263\u0264\7>\2\2\u0264\u0265\7?\2\2\u0265T\3"+ + "\2\2\2\u0266\u0267\7@\2\2\u0267V\3\2\2\2\u0268\u0269\7@\2\2\u0269\u026a"+ + "\7?\2\2\u026aX\3\2\2\2\u026b\u026c\7~\2\2\u026c\u026d\7~\2\2\u026dZ\3"+ + "\2\2\2\u026e\u026f\7-\2\2\u026f\\\3\2\2\2\u0270\u0271\7/\2\2\u0271^\3"+ + "\2\2\2\u0272\u0273\7f\2\2\u0273\u0274\7k\2\2\u0274\u0275\7x\2\2\u0275"+ + "`\3\2\2\2\u0276\u0277\7k\2\2\u0277\u0278\7f\2\2\u0278\u0279\7k\2\2\u0279"+ + "\u027a\7x\2\2\u027ab\3\2\2\2\u027b\u027c\7o\2\2\u027c\u027d\7q\2\2\u027d"+ + "\u027e\7f\2\2\u027ed\3\2\2\2\u027f\u0280\7#\2\2\u0280f\3\2\2\2\u0281\u0282"+ + "\7]\2\2\u0282h\3\2\2\2\u0283\u0284\7_\2\2\u0284j\3\2\2\2\u0285\u0286\7"+ + "\60\2\2\u0286l\3\2\2\2\u0287\u0288\7&\2\2\u0288\u0289\7&\2\2\u0289n\3"+ + "\2\2\2\u028a\u028b\7%\2\2\u028bp\3\2\2\2\u028c\u028d\7\60\2\2\u028d\u028e"+ + "\7\60\2\2\u028er\3\2\2\2\u028f\u0290\7}\2\2\u0290\u0291\7~\2\2\u0291t"+ + "\3\2\2\2\u0292\u0293\7~\2\2\u0293\u0294\7\177\2\2\u0294v\3\2\2\2\u0295"+ + "\u0296\7h\2\2\u0296\u0297\7q\2\2\u0297\u0298\7t\2\2\u0298x\3\2\2\2\u0299"+ + "\u029a\7n\2\2\u029a\u029b\7g\2\2\u029b\u029c\7v\2\2\u029cz\3\2\2\2\u029d"+ + "\u029e\7y\2\2\u029e\u029f\7j\2\2\u029f\u02a0\7g\2\2\u02a0\u02a1\7t\2\2"+ + "\u02a1\u02a2\7g\2\2\u02a2|\3\2\2\2\u02a3\u02a4\7i\2\2\u02a4\u02a5\7t\2"+ + "\2\u02a5\u02a6\7q\2\2\u02a6\u02a7\7w\2\2\u02a7\u02a8\7r\2\2\u02a8~\3\2"+ + "\2\2\u02a9\u02aa\7d\2\2\u02aa\u02ab\7{\2\2\u02ab\u0080\3\2\2\2\u02ac\u02ad"+ + "\7q\2\2\u02ad\u02ae\7t\2\2\u02ae\u02af\7f\2\2\u02af\u02b0\7g\2\2\u02b0"+ + "\u02b1\7t\2\2\u02b1\u0082\3\2\2\2\u02b2\u02b3\7t\2\2\u02b3\u02b4\7g\2"+ + "\2\u02b4\u02b5\7v\2\2\u02b5\u02b6\7w\2\2\u02b6\u02b7\7t\2\2\u02b7\u02b8"+ + "\7p\2\2\u02b8\u0084\3\2\2\2\u02b9\u02ba\7k\2\2\u02ba\u02bb\7h\2\2\u02bb"+ + "\u0086\3\2\2\2\u02bc\u02bd\7k\2\2\u02bd\u02be\7p\2\2\u02be\u0088\3\2\2"+ + "\2\u02bf\u02c0\7c\2\2\u02c0\u02c1\7u\2\2\u02c1\u008a\3\2\2\2\u02c2\u02c3"+ + "\7c\2\2\u02c3\u02c4\7v\2\2\u02c4\u008c\3\2\2\2\u02c5\u02c6\7c\2\2\u02c6"+ + "\u02c7\7n\2\2\u02c7\u02c8\7n\2\2\u02c8\u02c9\7q\2\2\u02c9\u02ca\7y\2\2"+ + "\u02ca\u02cb\7k\2\2\u02cb\u02cc\7p\2\2\u02cc\u02cd\7i\2\2\u02cd\u008e"+ + "\3\2\2\2\u02ce\u02cf\7g\2\2\u02cf\u02d0\7o\2\2\u02d0\u02d1\7r\2\2\u02d1"+ + "\u02d2\7v\2\2\u02d2\u02d3\7{\2\2\u02d3\u0090\3\2\2\2\u02d4\u02d5\7e\2"+ + "\2\u02d5\u02d6\7q\2\2\u02d6\u02d7\7w\2\2\u02d7\u02d8\7p\2\2\u02d8\u02d9"+ + "\7v\2\2\u02d9\u0092\3\2\2\2\u02da\u02db\7u\2\2\u02db\u02dc\7v\2\2\u02dc"+ + "\u02dd\7c\2\2\u02dd\u02de\7d\2\2\u02de\u02df\7n\2\2\u02df\u02e0\7g\2\2"+ + "\u02e0\u0094\3\2\2\2\u02e1\u02e2\7c\2\2\u02e2\u02e3\7u\2\2\u02e3\u02e4"+ + "\7e\2\2\u02e4\u02e5\7g\2\2\u02e5\u02e6\7p\2\2\u02e6\u02e7\7f\2\2\u02e7"+ + "\u02e8\7k\2\2\u02e8\u02e9\7p\2\2\u02e9\u02ea\7i\2\2\u02ea\u0096\3\2\2"+ + "\2\u02eb\u02ec\7f\2\2\u02ec\u02ed\7g\2\2\u02ed\u02ee\7u\2\2\u02ee\u02ef"+ + "\7e\2\2\u02ef\u02f0\7g\2\2\u02f0\u02f1\7p\2\2\u02f1\u02f2\7f\2\2\u02f2"+ + "\u02f3\7k\2\2\u02f3\u02f4\7p\2\2\u02f4\u02f5\7i\2\2\u02f5\u0098\3\2\2"+ + "\2\u02f6\u02f7\7u\2\2\u02f7\u02f8\7q\2\2\u02f8\u02f9\7o\2\2\u02f9\u02fa"+ + "\7g\2\2\u02fa\u009a\3\2\2\2\u02fb\u02fc\7g\2\2\u02fc\u02fd\7x\2\2\u02fd"+ + "\u02fe\7g\2\2\u02fe\u02ff\7t\2\2\u02ff\u0300\7{\2\2\u0300\u009c\3\2\2"+ + "\2\u0301\u0302\7u\2\2\u0302\u0303\7c\2\2\u0303\u0304\7v\2\2\u0304\u0305"+ + "\7k\2\2\u0305\u0306\7u\2\2\u0306\u0307\7h\2\2\u0307\u0308\7k\2\2\u0308"+ + "\u0309\7g\2\2\u0309\u030a\7u\2\2\u030a\u009e\3\2\2\2\u030b\u030c\7e\2"+ + "\2\u030c\u030d\7q\2\2\u030d\u030e\7n\2\2\u030e\u030f\7n\2\2\u030f\u0310"+ + "\7c\2\2\u0310\u0311\7v\2\2\u0311\u0312\7k\2\2\u0312\u0313\7q\2\2\u0313"+ + "\u0314\7p\2\2\u0314\u00a0\3\2\2\2\u0315\u0316\7i\2\2\u0316\u0317\7t\2"+ + "\2\u0317\u0318\7g\2\2\u0318\u0319\7c\2\2\u0319\u031a\7v\2\2\u031a\u031b"+ + "\7g\2\2\u031b\u031c\7u\2\2\u031c\u031d\7v\2\2\u031d\u00a2\3\2\2\2\u031e"+ + "\u031f\7n\2\2\u031f\u0320\7g\2\2\u0320\u0321\7c\2\2\u0321\u0322\7u\2\2"+ + "\u0322\u0323\7v\2\2\u0323\u00a4\3\2\2\2\u0324\u0325\7u\2\2\u0325\u0326"+ + "\7y\2\2\u0326\u0327\7k\2\2\u0327\u0328\7v\2\2\u0328\u0329\7e\2\2\u0329"+ + "\u032a\7j\2\2\u032a\u00a6\3\2\2\2\u032b\u032c\7e\2\2\u032c\u032d\7c\2"+ + "\2\u032d\u032e\7u\2\2\u032e\u032f\7g\2\2\u032f\u00a8\3\2\2\2\u0330\u0331"+ + "\7v\2\2\u0331\u0332\7t\2\2\u0332\u0333\7{\2\2\u0333\u00aa\3\2\2\2\u0334"+ + "\u0335\7e\2\2\u0335\u0336\7c\2\2\u0336\u0337\7v\2\2\u0337\u0338\7e\2\2"+ + "\u0338\u0339\7j\2\2\u0339\u00ac\3\2\2\2\u033a\u033b\7f\2\2\u033b\u033c"+ + "\7g\2\2\u033c\u033d\7h\2\2\u033d\u033e\7c\2\2\u033e\u033f\7w\2\2\u033f"+ + "\u0340\7n\2\2\u0340\u0341\7v\2\2\u0341\u00ae\3\2\2\2\u0342\u0343\7v\2"+ + "\2\u0343\u0344\7j\2\2\u0344\u0345\7g\2\2\u0345\u0346\7p\2\2\u0346\u00b0"+ + "\3\2\2\2\u0347\u0348\7g\2\2\u0348\u0349\7n\2\2\u0349\u034a\7u\2\2\u034a"+ + "\u034b\7g\2\2\u034b\u00b2\3\2\2\2\u034c\u034d\7v\2\2\u034d\u034e\7{\2"+ + "\2\u034e\u034f\7r\2\2\u034f\u0350\7g\2\2\u0350\u0351\7u\2\2\u0351\u0352"+ + "\7y\2\2\u0352\u0353\7k\2\2\u0353\u0354\7v\2\2\u0354\u0355\7e\2\2\u0355"+ + "\u0356\7j\2\2\u0356\u00b4\3\2\2\2\u0357\u0358\7q\2\2\u0358\u0359\7t\2"+ + "\2\u0359\u00b6\3\2\2\2\u035a\u035b\7c\2\2\u035b\u035c\7p\2\2\u035c\u035d"+ + "\7f\2\2\u035d\u00b8\3\2\2\2\u035e\u035f\7p\2\2\u035f\u0360\7q\2\2\u0360"+ + "\u0361\7v\2\2\u0361\u00ba\3\2\2\2\u0362\u0363\7v\2\2\u0363\u0364\7q\2"+ + "\2\u0364\u00bc\3\2\2\2\u0365\u0366\7k\2\2\u0366\u0367\7p\2\2\u0367\u0368"+ + "\7u\2\2\u0368\u0369\7v\2\2\u0369\u036a\7c\2\2\u036a\u036b\7p\2\2\u036b"+ + "\u036c\7e\2\2\u036c\u036d\7g\2\2\u036d\u00be\3\2\2\2\u036e\u036f\7q\2"+ + "\2\u036f\u0370\7h\2\2\u0370\u00c0\3\2\2\2\u0371\u0372\7u\2\2\u0372\u0373"+ + "\7v\2\2\u0373\u0374\7c\2\2\u0374\u0375\7v\2\2\u0375\u0376\7k\2\2\u0376"+ + "\u0377\7e\2\2\u0377\u0378\7c\2\2\u0378\u0379\7n\2\2\u0379\u037a\7n\2\2"+ + "\u037a\u037b\7{\2\2\u037b\u00c2\3\2\2\2\u037c\u037d\7k\2\2\u037d\u037e"+ + "\7u\2\2\u037e\u00c4\3\2\2\2\u037f\u0380\7v\2\2\u0380\u0381\7t\2\2\u0381"+ + "\u0382\7g\2\2\u0382\u0383\7c\2\2\u0383\u0384\7v\2\2\u0384\u00c6\3\2\2"+ + "\2\u0385\u0386\7e\2\2\u0386\u0387\7c\2\2\u0387\u0388\7u\2\2\u0388\u0389"+ + "\7v\2\2\u0389\u00c8\3\2\2\2\u038a\u038b\7e\2\2\u038b\u038c\7c\2\2\u038c"+ + "\u038d\7u\2\2\u038d\u038e\7v\2\2\u038e\u038f\7c\2\2\u038f\u0390\7d\2\2"+ + "\u0390\u0391\7n\2\2\u0391\u0392\7g\2\2\u0392\u00ca\3\2\2\2\u0393\u0394"+ + "\7x\2\2\u0394\u0395\7g\2\2\u0395\u0396\7t\2\2\u0396\u0397\7u\2\2\u0397"+ + "\u0398\7k\2\2\u0398\u0399\7q\2\2\u0399\u039a\7p\2\2\u039a\u00cc\3\2\2"+ + "\2\u039b\u039c\7l\2\2\u039c\u039d\7u\2\2\u039d\u039e\7q\2\2\u039e\u039f"+ + "\7p\2\2\u039f\u03a0\7k\2\2\u03a0\u03a1\7s\2\2\u03a1\u00ce\3\2\2\2\u03a2"+ + "\u03a3\7w\2\2\u03a3\u03a4\7p\2\2\u03a4\u03a5\7q\2\2\u03a5\u03a6\7t\2\2"+ + "\u03a6\u03a7\7f\2\2\u03a7\u03a8\7g\2\2\u03a8\u03a9\7t\2\2\u03a9\u03aa"+ + "\7g\2\2\u03aa\u03ab\7f\2\2\u03ab\u00d0\3\2\2\2\u03ac\u03ad\7v\2\2\u03ad"+ + "\u03ae\7t\2\2\u03ae\u03af\7w\2\2\u03af\u03b0\7g\2\2\u03b0\u00d2\3\2\2"+ + "\2\u03b1\u03b2\7h\2\2\u03b2\u03b3\7c\2\2\u03b3\u03b4\7n\2\2\u03b4\u03b5"+ + "\7u\2\2\u03b5\u03b6\7g\2\2\u03b6\u00d4\3\2\2\2\u03b7\u03b8\7v\2\2\u03b8"+ + "\u03b9\7{\2\2\u03b9\u03ba\7r\2\2\u03ba\u03bb\7g\2\2\u03bb\u00d6\3\2\2"+ + "\2\u03bc\u03bd\7x\2\2\u03bd\u03be\7c\2\2\u03be\u03bf\7n\2\2\u03bf\u03c0"+ + "\7k\2\2\u03c0\u03c1\7f\2\2\u03c1\u03c2\7c\2\2\u03c2\u03c3\7v\2\2\u03c3"+ + "\u03c4\7g\2\2\u03c4\u00d8\3\2\2\2\u03c5\u03c6\7c\2\2\u03c6\u03c7\7p\2"+ + "\2\u03c7\u03c8\7p\2\2\u03c8\u03c9\7q\2\2\u03c9\u03ca\7v\2\2\u03ca\u03cb"+ + "\7c\2\2\u03cb\u03cc\7v\2\2\u03cc\u03cd\7g\2\2\u03cd\u00da\3\2\2\2\u03ce"+ + "\u03cf\7f\2\2\u03cf\u03d0\7g\2\2\u03d0\u03d1\7e\2\2\u03d1\u03d2\7n\2\2"+ + "\u03d2\u03d3\7c\2\2\u03d3\u03d4\7t\2\2\u03d4\u03d5\7g\2\2\u03d5\u00dc"+ + "\3\2\2\2\u03d6\u03d7\7e\2\2\u03d7\u03d8\7q\2\2\u03d8\u03d9\7p\2\2\u03d9"+ + "\u03da\7v\2\2\u03da\u03db\7g\2\2\u03db\u03dc\7z\2\2\u03dc\u03dd\7v\2\2"+ + "\u03dd\u00de\3\2\2\2\u03de\u03df\7k\2\2\u03df\u03e0\7v\2\2\u03e0\u03e1"+ + "\7g\2\2\u03e1\u03e2\7o\2\2\u03e2\u00e0\3\2\2\2\u03e3\u03e4\7x\2\2\u03e4"+ + "\u03e5\7c\2\2\u03e5\u03e6\7t\2\2\u03e6\u03e7\7k\2\2\u03e7\u03e8\7c\2\2"+ + "\u03e8\u03e9\7d\2\2\u03e9\u03ea\7n\2\2\u03ea\u03eb\7g\2\2\u03eb\u00e2"+ + "\3\2\2\2\u03ec\u03ed\7k\2\2\u03ed\u03ee\7p\2\2\u03ee\u03ef\7u\2\2\u03ef"+ + "\u03f0\7g\2\2\u03f0\u03f1\7t\2\2\u03f1\u03f2\7v\2\2\u03f2\u00e4\3\2\2"+ + "\2\u03f3\u03f4\7f\2\2\u03f4\u03f5\7g\2\2\u03f5\u03f6\7n\2\2\u03f6\u03f7"+ + "\7g\2\2\u03f7\u03f8\7v\2\2\u03f8\u03f9\7g\2\2\u03f9\u00e6\3\2\2\2\u03fa"+ + "\u03fb\7t\2\2\u03fb\u03fc\7g\2\2\u03fc\u03fd\7p\2\2\u03fd\u03fe\7c\2\2"+ + "\u03fe\u03ff\7o\2\2\u03ff\u0400\7g\2\2\u0400\u00e8\3\2\2\2\u0401\u0402"+ + "\7t\2\2\u0402\u0403\7g\2\2\u0403\u0404\7r\2\2\u0404\u0405\7n\2\2\u0405"+ + "\u0406\7c\2\2\u0406\u0407\7e\2\2\u0407\u0408\7g\2\2\u0408\u00ea\3\2\2"+ + "\2\u0409\u040a\7e\2\2\u040a\u040b\7q\2\2\u040b\u040c\7r\2\2\u040c\u040d"+ + "\7{\2\2\u040d\u00ec\3\2\2\2\u040e\u040f\7o\2\2\u040f\u0410\7q\2\2\u0410"+ + "\u0411\7f\2\2\u0411\u0412\7k\2\2\u0412\u0413\7h\2\2\u0413\u0414\7{\2\2"+ + "\u0414\u00ee\3\2\2\2\u0415\u0416\7c\2\2\u0416\u0417\7r\2\2\u0417\u0418"+ + "\7r\2\2\u0418\u0419\7g\2\2\u0419\u041a\7p\2\2\u041a\u041b\7f\2\2\u041b"+ + "\u00f0\3\2\2\2\u041c\u041d\7k\2\2\u041d\u041e\7p\2\2\u041e\u041f\7v\2"+ + "\2\u041f\u0420\7q\2\2\u0420\u00f2\3\2\2\2\u0421\u0422\7x\2\2\u0422\u0423"+ + "\7c\2\2\u0423\u0424\7n\2\2\u0424\u0425\7w\2\2\u0425\u0426\7g\2\2\u0426"+ + "\u00f4\3\2\2\2\u0427\u0428\7l\2\2\u0428\u0429\7u\2\2\u0429\u042a\7q\2"+ + "\2\u042a\u042b\7p\2\2\u042b\u00f6\3\2\2\2\u042c\u042d\7y\2\2\u042d\u042e"+ + "\7k\2\2\u042e\u042f\7v\2\2\u042f\u0430\7j\2\2\u0430\u00f8\3\2\2\2\u0431"+ + "\u0432\7r\2\2\u0432\u0433\7q\2\2\u0433\u0434\7u\2\2\u0434\u0435\7k\2\2"+ + "\u0435\u0436\7v\2\2\u0436\u0437\7k\2\2\u0437\u0438\7q\2\2\u0438\u0439"+ + "\7p\2\2\u0439\u00fa\3\2\2\2\u043a\u043b\7k\2\2\u043b\u043c\7o\2\2\u043c"+ + "\u043d\7r\2\2\u043d\u043e\7q\2\2\u043e\u043f\7t\2\2\u043f\u0440\7v\2\2"+ + "\u0440\u00fc\3\2\2\2\u0441\u0442\7u\2\2\u0442\u0443\7e\2\2\u0443\u0444"+ + "\7j\2\2\u0444\u0445\7g\2\2\u0445\u0446\7o\2\2\u0446\u0447\7c\2\2\u0447"+ + "\u00fe\3\2\2\2\u0448\u0449\7p\2\2\u0449\u044a\7c\2\2\u044a\u044b\7o\2"+ + "\2\u044b\u044c\7g\2\2\u044c\u044d\7u\2\2\u044d\u044e\7r\2\2\u044e\u044f"+ + "\7c\2\2\u044f\u0450\7e\2\2\u0450\u0451\7g\2\2\u0451\u0100\3\2\2\2\u0452"+ + "\u0453\7g\2\2\u0453\u0454\7n\2\2\u0454\u0455\7g\2\2\u0455\u0456\7o\2\2"+ + "\u0456\u0457\7g\2\2\u0457\u0458\7p\2\2\u0458\u0459\7v\2\2\u0459\u0102"+ + "\3\2\2\2\u045a\u045b\7\61\2\2\u045b\u0104\3\2\2\2\u045c\u045d\7\61\2\2"+ + "\u045d\u045e\7\61\2\2\u045e\u0106\3\2\2\2\u045f\u0460\7B\2\2\u0460\u0108"+ + "\3\2\2\2\u0461\u0462\7e\2\2\u0462\u0463\7j\2\2\u0463\u0464\7k\2\2\u0464"+ + "\u0465\7n\2\2\u0465\u0466\7f\2\2\u0466\u010a\3\2\2\2\u0467\u0468\7f\2"+ + "\2\u0468\u0469\7g\2\2\u0469\u046a\7u\2\2\u046a\u046b\7e\2\2\u046b\u046c"+ + "\7g\2\2\u046c\u046d\7p\2\2\u046d\u046e\7f\2\2\u046e\u046f\7c\2\2\u046f"+ + "\u0470\7p\2\2\u0470\u0471\7v\2\2\u0471\u010c\3\2\2\2\u0472\u0473\7c\2"+ + "\2\u0473\u0474\7v\2\2\u0474\u0475\7v\2\2\u0475\u0476\7t\2\2\u0476\u0477"+ + "\7k\2\2\u0477\u0478\7d\2\2\u0478\u0479\7w\2\2\u0479\u047a\7v\2\2\u047a"+ + "\u047b\7g\2\2\u047b\u010e\3\2\2\2\u047c\u047d\7u\2\2\u047d\u047e\7g\2"+ + "\2\u047e\u047f\7n\2\2\u047f\u0480\7h\2\2\u0480\u0110\3\2\2\2\u0481\u0482"+ + "\7f\2\2\u0482\u0483\7g\2\2\u0483\u0484\7u\2\2\u0484\u0485\7e\2\2\u0485"+ + "\u0486\7g\2\2\u0486\u0487\7p\2\2\u0487\u0488\7f\2\2\u0488\u0489\7c\2\2"+ + "\u0489\u048a\7p\2\2\u048a\u048b\7v\2\2\u048b\u048c\7/\2\2\u048c\u048d"+ + "\7q\2\2\u048d\u048e\7t\2\2\u048e\u048f\7/\2\2\u048f\u0490\7u\2\2\u0490"+ + "\u0491\7g\2\2\u0491\u0492\7n\2\2\u0492\u0493\7h\2\2\u0493\u0112\3\2\2"+ + "\2\u0494\u0495\7h\2\2\u0495\u0496\7q\2\2\u0496\u0497\7n\2\2\u0497\u0498"+ + "\7n\2\2\u0498\u0499\7q\2\2\u0499\u049a\7y\2\2\u049a\u049b\7k\2\2\u049b"+ + "\u049c\7p\2\2\u049c\u049d\7i\2\2\u049d\u049e\7/\2\2\u049e\u049f\7u\2\2"+ + "\u049f\u04a0\7k\2\2\u04a0\u04a1\7d\2\2\u04a1\u04a2\7n\2\2\u04a2\u04a3"+ + "\7k\2\2\u04a3\u04a4\7p\2\2\u04a4\u04a5\7i\2\2\u04a5\u0114\3\2\2\2\u04a6"+ + "\u04a7\7h\2\2\u04a7\u04a8\7q\2\2\u04a8\u04a9\7n\2\2\u04a9\u04aa\7n\2\2"+ + "\u04aa\u04ab\7q\2\2\u04ab\u04ac\7y\2\2\u04ac\u04ad\7k\2\2\u04ad\u04ae"+ + "\7p\2\2\u04ae\u04af\7i\2\2\u04af\u0116\3\2\2\2\u04b0\u04b1\7r\2\2\u04b1"+ + "\u04b2\7c\2\2\u04b2\u04b3\7t\2\2\u04b3\u04b4\7g\2\2\u04b4\u04b5\7p\2\2"+ + "\u04b5\u04b6\7v\2\2\u04b6\u0118\3\2\2\2\u04b7\u04b8\7c\2\2\u04b8\u04b9"+ + "\7p\2\2\u04b9\u04ba\7e\2\2\u04ba\u04bb\7g\2\2\u04bb\u04bc\7u\2\2\u04bc"+ + "\u04bd\7v\2\2\u04bd\u04be\7q\2\2\u04be\u04bf\7t\2\2\u04bf\u011a\3\2\2"+ + "\2\u04c0\u04c1\7r\2\2\u04c1\u04c2\7t\2\2\u04c2\u04c3\7g\2\2\u04c3\u04c4"+ + "\7e\2\2\u04c4\u04c5\7g\2\2\u04c5\u04c6\7f\2\2\u04c6\u04c7\7k\2\2\u04c7"+ + "\u04c8\7p\2\2\u04c8\u04c9\7i\2\2\u04c9\u04ca\7/\2\2\u04ca\u04cb\7u\2\2"+ + "\u04cb\u04cc\7k\2\2\u04cc\u04cd\7d\2\2\u04cd\u04ce\7n\2\2\u04ce\u04cf"+ + "\7k\2\2\u04cf\u04d0\7p\2\2\u04d0\u04d1\7i\2\2\u04d1\u011c\3\2\2\2\u04d2"+ + "\u04d3\7r\2\2\u04d3\u04d4\7t\2\2\u04d4\u04d5\7g\2\2\u04d5\u04d6\7e\2\2"+ + "\u04d6\u04d7\7g\2\2\u04d7\u04d8\7f\2\2\u04d8\u04d9\7k\2\2\u04d9\u04da"+ + "\7p\2\2\u04da\u04db\7i\2\2\u04db\u011e\3\2\2\2\u04dc\u04dd\7c\2\2\u04dd"+ + "\u04de\7p\2\2\u04de\u04df\7e\2\2\u04df\u04e0\7g\2\2\u04e0\u04e1\7u\2\2"+ + "\u04e1\u04e2\7v\2\2\u04e2\u04e3\7q\2\2\u04e3\u04e4\7t\2\2\u04e4\u04e5"+ + "\7/\2\2\u04e5\u04e6\7q\2\2\u04e6\u04e7\7t\2\2\u04e7\u04e8\7/\2\2\u04e8"+ + "\u04e9\7u\2\2\u04e9\u04ea\7g\2\2\u04ea\u04eb\7n\2\2\u04eb\u04ec\7h\2\2"+ + "\u04ec\u0120\3\2\2\2\u04ed\u04ee\7p\2\2\u04ee\u04ef\7q\2\2\u04ef\u04f0"+ + "\7f\2\2\u04f0\u04f1\7g\2\2\u04f1\u0122\3\2\2\2\u04f2\u04f3\7d\2\2\u04f3"+ + "\u04f4\7k\2\2\u04f4\u04f5\7p\2\2\u04f5\u04f6\7c\2\2\u04f6\u04f7\7t\2\2"+ + "\u04f7\u04f8\7{\2\2\u04f8\u0124\3\2\2\2\u04f9\u04fa\7f\2\2\u04fa\u04fb"+ + "\7q\2\2\u04fb\u04fc\7e\2\2\u04fc\u04fd\7w\2\2\u04fd\u04fe\7o\2\2\u04fe"+ + "\u04ff\7g\2\2\u04ff\u0500\7p\2\2\u0500\u0501\7v\2\2\u0501\u0126\3\2\2"+ + "\2\u0502\u0503\7f\2\2\u0503\u0504\7q\2\2\u0504\u0505\7e\2\2\u0505\u0506"+ + "\7w\2\2\u0506\u0507\7o\2\2\u0507\u0508\7g\2\2\u0508\u0509\7p\2\2\u0509"+ + "\u050a\7v\2\2\u050a\u050b\7/\2\2\u050b\u050c\7p\2\2\u050c\u050d\7q\2\2"+ + "\u050d\u050e\7f\2\2\u050e\u050f\7g\2\2\u050f\u0128\3\2\2\2\u0510\u0511"+ + "\7v\2\2\u0511\u0512\7g\2\2\u0512\u0513\7z\2\2\u0513\u0514\7v\2\2\u0514"+ + "\u012a\3\2\2\2\u0515\u0516\7r\2\2\u0516\u0517\7t\2\2\u0517\u0518\7q\2"+ + "\2\u0518\u0519\7e\2\2\u0519\u051a\7g\2\2\u051a\u051b\7u\2\2\u051b\u051c"+ + "\7u\2\2\u051c\u051d\7k\2\2\u051d\u051e\7p\2\2\u051e\u051f\7i\2\2\u051f"+ + "\u0520\7/\2\2\u0520\u0521\7k\2\2\u0521\u0522\7p\2\2\u0522\u0523\7u\2\2"+ + "\u0523\u0524\7v\2\2\u0524\u0525\7t\2\2\u0525\u0526\7w\2\2\u0526\u0527"+ + "\7e\2\2\u0527\u0528\7v\2\2\u0528\u0529\7k\2\2\u0529\u052a\7q\2\2\u052a"+ + "\u052b\7p\2\2\u052b\u012c\3\2\2\2\u052c\u052d\7p\2\2\u052d\u052e\7c\2"+ + "\2\u052e\u052f\7o\2\2\u052f\u0530\7g\2\2\u0530\u0531\7u\2\2\u0531\u0532"+ + "\7r\2\2\u0532\u0533\7c\2\2\u0533\u0534\7e\2\2\u0534\u0535\7g\2\2\u0535"+ + "\u0536\7/\2\2\u0536\u0537\7p\2\2\u0537\u0538\7q\2\2\u0538\u0539\7f\2\2"+ + "\u0539\u053a\7g\2\2\u053a\u012e\3\2\2\2\u053b\u053c\7u\2\2\u053c\u053d"+ + "\7e\2\2\u053d\u053e\7j\2\2\u053e\u053f\7g\2\2\u053f\u0540\7o\2\2\u0540"+ + "\u0541\7c\2\2\u0541\u0542\7/\2\2\u0542\u0543\7c\2\2\u0543\u0544\7v\2\2"+ + "\u0544\u0545\7v\2\2\u0545\u0546\7t\2\2\u0546\u0547\7k\2\2\u0547\u0548"+ + "\7d\2\2\u0548\u0549\7w\2\2\u0549\u054a\7v\2\2\u054a\u054b\7g\2\2\u054b"+ + "\u0130\3\2\2\2\u054c\u054d\7u\2\2\u054d\u054e\7e\2\2\u054e\u054f\7j\2"+ + "\2\u054f\u0550\7g\2\2\u0550\u0551\7o\2\2\u0551\u0552\7c\2\2\u0552\u0553"+ + "\7/\2\2\u0553\u0554\7g\2\2\u0554\u0555\7n\2\2\u0555\u0556\7g\2\2\u0556"+ + "\u0557\7o\2\2\u0557\u0558\7g\2\2\u0558\u0559\7p\2\2\u0559\u055a\7v\2\2"+ + "\u055a\u0132\3\2\2\2\u055b\u055c\7c\2\2\u055c\u055d\7t\2\2\u055d\u055e"+ + "\7t\2\2\u055e\u055f\7c\2\2\u055f\u0560\7{\2\2\u0560\u0561\7/\2\2\u0561"+ + "\u0562\7p\2\2\u0562\u0563\7q\2\2\u0563\u0564\7f\2\2\u0564\u0565\7g\2\2"+ + "\u0565\u0134\3\2\2\2\u0566\u0567\7d\2\2\u0567\u0568\7q\2\2\u0568\u0569"+ + "\7q\2\2\u0569\u056a\7n\2\2\u056a\u056b\7g\2\2\u056b\u056c\7c\2\2\u056c"+ + "\u056d\7p\2\2\u056d\u056e\7/\2\2\u056e\u056f\7p\2\2\u056f\u0570\7q\2\2"+ + "\u0570\u0571\7f\2\2\u0571\u0572\7g\2\2\u0572\u0136\3\2\2\2\u0573\u0574"+ + "\7p\2\2\u0574\u0575\7w\2\2\u0575\u0576\7n\2\2\u0576\u0577\7n\2\2\u0577"+ + "\u0578\7/\2\2\u0578\u0579\7p\2\2\u0579\u057a\7q\2\2\u057a\u057b\7f\2\2"+ + "\u057b\u057c\7g\2\2\u057c\u0138\3\2\2\2\u057d\u057e\7p\2\2\u057e\u057f"+ + "\7w\2\2\u057f\u0580\7o\2\2\u0580\u0581\7d\2\2\u0581\u0582\7g\2\2\u0582"+ + "\u0583\7t\2\2\u0583\u0584\7/\2\2\u0584\u0585\7p\2\2\u0585\u0586\7q\2\2"+ + "\u0586\u0587\7f\2\2\u0587\u0588\7g\2\2\u0588\u013a\3\2\2\2\u0589\u058a"+ + "\7q\2\2\u058a\u058b\7d\2\2\u058b\u058c\7l\2\2\u058c\u058d\7g\2\2\u058d"+ + "\u058e\7e\2\2\u058e\u058f\7v\2\2\u058f\u0590\7/\2\2\u0590\u0591\7p\2\2"+ + "\u0591\u0592\7q\2\2\u0592\u0593\7f\2\2\u0593\u0594\7g\2\2\u0594\u013c"+ + "\3\2\2\2\u0595\u0596\7e\2\2\u0596\u0597\7q\2\2\u0597\u0598\7o\2\2\u0598"+ + "\u0599\7o\2\2\u0599\u059a\7g\2\2\u059a\u059b\7p\2\2\u059b\u059c\7v\2\2"+ + "\u059c\u013e\3\2\2\2\u059d\u059e\7d\2\2\u059e\u059f\7t\2\2\u059f\u05a0"+ + "\7g\2\2\u05a0\u05a1\7c\2\2\u05a1\u05a2\7m\2\2\u05a2\u0140\3\2\2\2\u05a3"+ + "\u05a4\7n\2\2\u05a4\u05a5\7q\2\2\u05a5\u05a6\7q\2\2\u05a6\u05a7\7r\2\2"+ + "\u05a7\u0142\3\2\2\2\u05a8\u05a9\7e\2\2\u05a9\u05aa\7q\2\2\u05aa\u05ab"+ + "\7p\2\2\u05ab\u05ac\7v\2\2\u05ac\u05ad\7k\2\2\u05ad\u05ae\7p\2\2\u05ae"+ + "\u05af\7w\2\2\u05af\u05b0\7g\2\2\u05b0\u0144\3\2\2\2\u05b1\u05b2\7g\2"+ + "\2\u05b2\u05b3\7z\2\2\u05b3\u05b4\7k\2\2\u05b4\u05b5\7v\2\2\u05b5\u0146"+ + "\3\2\2\2\u05b6\u05b7\7t\2\2\u05b7\u05b8\7g\2\2\u05b8\u05b9\7v\2\2\u05b9"+ + "\u05ba\7w\2\2\u05ba\u05bb\7t\2\2\u05bb\u05bc\7p\2\2\u05bc\u05bd\7k\2\2"+ + "\u05bd\u05be\7p\2\2\u05be\u05bf\7i\2\2\u05bf\u0148\3\2\2\2\u05c0\u05c1"+ + "\7y\2\2\u05c1\u05c2\7j\2\2\u05c2\u05c3\7k\2\2\u05c3\u05c4\7n\2\2\u05c4"+ + "\u05c5\7g\2\2\u05c5\u014a\3\2\2\2\u05c6\u05cb\7$\2\2\u05c7\u05ca\5\u014d"+ + "\u00a7\2\u05c8\u05ca\n\2\2\2\u05c9\u05c7\3\2\2\2\u05c9\u05c8\3\2\2\2\u05ca"+ + "\u05cd\3\2\2\2\u05cb\u05c9\3\2\2\2\u05cb\u05cc\3\2\2\2\u05cc\u05ce\3\2"+ + "\2\2\u05cd\u05cb\3\2\2\2\u05ce\u05cf\7$\2\2\u05cf\u014c\3\2\2\2\u05d0"+ + "\u05d3\7^\2\2\u05d1\u05d4\t\3\2\2\u05d2\u05d4\5\u014f\u00a8\2\u05d3\u05d1"+ + "\3\2\2\2\u05d3\u05d2\3\2\2\2\u05d4\u014e\3\2\2\2\u05d5\u05d6\7w\2\2\u05d6"+ + "\u05d7\5\u0151\u00a9\2\u05d7\u05d8\5\u0151\u00a9\2\u05d8\u05d9\5\u0151"+ + "\u00a9\2\u05d9\u05da\5\u0151\u00a9\2\u05da\u0150\3\2\2\2\u05db\u05dc\t"+ + "\4\2\2\u05dc\u0152\3\2\2\2\u05dd\u05de\7A\2\2\u05de\u0154\3\2\2\2\u05df"+ + "\u05e0\7p\2\2\u05e0\u05e1\7w\2\2\u05e1\u05e2\7n\2\2\u05e2\u05e3\7n\2\2"+ + "\u05e3\u0156\3\2\2\2\u05e4\u05e5\5\u0159\u00ad\2\u05e5\u0158\3\2\2\2\u05e6"+ + "\u05ea\5\u015b\u00ae\2\u05e7\u05ea\5\u015d\u00af\2\u05e8\u05ea\5\u015f"+ + "\u00b0\2\u05e9\u05e6\3\2\2\2\u05e9\u05e7\3\2\2\2\u05e9\u05e8\3\2\2\2\u05ea"+ + "\u015a\3\2\2\2\u05eb\u05ec\5\u0161\u00b1\2\u05ec\u015c\3\2\2\2\u05ed\u05ee"+ + "\7\60\2\2\u05ee\u05f8\5\u0161\u00b1\2\u05ef\u05f0\5\u0161\u00b1\2\u05f0"+ + "\u05f4\7\60\2\2\u05f1\u05f3\t\5\2\2\u05f2\u05f1\3\2\2\2\u05f3\u05f6\3"+ + "\2\2\2\u05f4\u05f2\3\2\2\2\u05f4\u05f5\3\2\2\2\u05f5\u05f8\3\2\2\2\u05f6"+ + "\u05f4\3\2\2\2\u05f7\u05ed\3\2\2\2\u05f7\u05ef\3\2\2\2\u05f8\u015e\3\2"+ + "\2\2\u05f9\u05fa\7\60\2\2\u05fa\u0606\5\u0161\u00b1\2\u05fb\u0603\5\u0161"+ + "\u00b1\2\u05fc\u0600\7\60\2\2\u05fd\u05ff\t\5\2\2\u05fe\u05fd\3\2\2\2"+ + "\u05ff\u0602\3\2\2\2\u0600\u05fe\3\2\2\2\u0600\u0601\3\2\2\2\u0601\u0604"+ + "\3\2\2\2\u0602\u0600\3\2\2\2\u0603\u05fc\3\2\2\2\u0603\u0604\3\2\2\2\u0604"+ + "\u0606\3\2\2\2\u0605\u05f9\3\2\2\2\u0605\u05fb\3\2\2\2\u0606\u0607\3\2"+ + "\2\2\u0607\u0609\t\6\2\2\u0608\u060a\t\7\2\2\u0609\u0608\3\2\2\2\u0609"+ + "\u060a\3\2\2\2\u060a\u060b\3\2\2\2\u060b\u060c\5\u0161\u00b1\2\u060c\u0160"+ + "\3\2\2\2\u060d\u060f\t\5\2\2\u060e\u060d\3\2\2\2\u060f\u0610\3\2\2\2\u0610"+ + "\u060e\3\2\2\2\u0610\u0611\3\2\2\2\u0611\u0162\3\2\2\2\u0612\u0613\t\b"+ + "\2\2\u0613\u0614\3\2\2\2\u0614\u0615\b\u00b2\2\2\u0615\u0164\3\2\2\2\u0616"+ + "\u061a\5\u0167\u00b4\2\u0617\u0619\5\u0169\u00b5\2\u0618\u0617\3\2\2\2"+ + "\u0619\u061c\3\2\2\2\u061a\u0618\3\2\2\2\u061a\u061b\3\2\2\2\u061b\u0166"+ + "\3\2\2\2\u061c\u061a\3\2\2\2\u061d\u061f\t\t\2\2\u061e\u061d\3\2\2\2\u061f"+ + "\u0168\3\2\2\2\u0620\u0623\5\u0167\u00b4\2\u0621\u0623\t\n\2\2\u0622\u0620"+ + "\3\2\2\2\u0622\u0621\3\2\2\2\u0623\u016a\3\2\2\2\u0624\u0625\7*\2\2\u0625"+ + "\u062e\7<\2\2\u0626\u062d\5\u016b\u00b6\2\u0627\u0628\7*\2\2\u0628\u062d"+ + "\n\13\2\2\u0629\u062a\7<\2\2\u062a\u062d\n\f\2\2\u062b\u062d\n\r\2\2\u062c"+ + "\u0626\3\2\2\2\u062c\u0627\3\2\2\2\u062c\u0629\3\2\2\2\u062c\u062b\3\2"+ + "\2\2\u062d\u0630\3\2\2\2\u062e\u062c\3\2\2\2\u062e\u062f\3\2\2\2\u062f"+ + "\u0632\3\2\2\2\u0630\u062e\3\2\2\2\u0631\u0633\7<\2\2\u0632\u0631\3\2"+ + "\2\2\u0633\u0634\3\2\2\2\u0634\u0632\3\2\2\2\u0634\u0635\3\2\2\2\u0635"+ + "\u0636\3\2\2\2\u0636\u0637\7+\2\2\u0637\u0638\3\2\2\2\u0638\u0639\b\u00b6"+ + "\2\2\u0639\u016c\3\2\2\2\u063a\u063b\n\16\2\2\u063b\u016e\3\2\2\2\24\2"+ + "\u05c9\u05cb\u05d3\u05e9\u05f4\u05f7\u0600\u0603\u0605\u0609\u0610\u061a"+ + "\u061e\u0622\u062c\u062e\u0634\3\2\3\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens b/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens index ee3ace15f..488d2a227 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens @@ -122,60 +122,58 @@ Kvalue=121 Kjson=122 Kwith=123 Kposition=124 -Kbreak=125 -Kloop=126 -Kcontinue=127 -Kexit=128 -Kreturning=129 -Kwhile=130 -Kimport=131 -Kschema=132 -Knamespace=133 -Kelement=134 -Kslash=135 -Kdslash=136 -Kat_symbol=137 -Kchild=138 -Kdescendant=139 -Kattribute=140 -Kself=141 -Kdescendant_or_self=142 -Kfollowing_sibling=143 -Kfollowing=144 -Kparent=145 -Kancestor=146 -Kpreceding_sibling=147 -Kpreceding=148 -Kancestor_or_self=149 -Knode=150 -Kbinary=151 -Kdocument=152 -Kdocument_node=153 -Ktext=154 -Kpi=155 -Knamespace_node=156 -Kschema_attribute=157 -Kschema_element=158 -Karray_node=159 -Kboolean_node=160 -Knull_node=161 -Knumber_node=162 -Kobject_node=163 -Kcomment=164 -Karray=165 -Kmap=166 -STRING=167 -ArgumentPlaceholder=168 -NullLiteral=169 -Literal=170 -NumericLiteral=171 -IntegerLiteral=172 -DecimalLiteral=173 -DoubleLiteral=174 -WS=175 -NCName=176 -XQComment=177 -ContentChar=178 +Kimport=125 +Kschema=126 +Knamespace=127 +Kelement=128 +Kslash=129 +Kdslash=130 +Kat_symbol=131 +Kchild=132 +Kdescendant=133 +Kattribute=134 +Kself=135 +Kdescendant_or_self=136 +Kfollowing_sibling=137 +Kfollowing=138 +Kparent=139 +Kancestor=140 +Kpreceding_sibling=141 +Kpreceding=142 +Kancestor_or_self=143 +Knode=144 +Kbinary=145 +Kdocument=146 +Kdocument_node=147 +Ktext=148 +Kpi=149 +Knamespace_node=150 +Kschema_attribute=151 +Kschema_element=152 +Karray_node=153 +Kboolean_node=154 +Knull_node=155 +Knumber_node=156 +Kobject_node=157 +Kcomment=158 +Kbreak=159 +Kloop=160 +Kcontinue=161 +Kexit=162 +Kreturning=163 +Kwhile=164 +STRING=165 +ArgumentPlaceholder=166 +NullLiteral=167 +Literal=168 +NumericLiteral=169 +IntegerLiteral=170 +DecimalLiteral=171 +DoubleLiteral=172 +WS=173 +NCName=174 +XQComment=175 +ContentChar=176 ';'=1 'module'=2 '='=3 @@ -300,47 +298,45 @@ ContentChar=178 'json'=122 'with'=123 'position'=124 -'break'=125 -'loop'=126 -'continue'=127 -'exit'=128 -'returning'=129 -'while'=130 -'import'=131 -'schema'=132 -'namespace'=133 -'element'=134 -'/'=135 -'//'=136 -'@'=137 -'child'=138 -'descendant'=139 -'attribute'=140 -'self'=141 -'descendant-or-self'=142 -'following-sibling'=143 -'following'=144 -'parent'=145 -'ancestor'=146 -'preceding-sibling'=147 -'preceding'=148 -'ancestor-or-self'=149 -'node'=150 -'binary'=151 -'document'=152 -'document-node'=153 -'text'=154 -'processing-instruction'=155 -'namespace-node'=156 -'schema-attribute'=157 -'schema-element'=158 -'array-node'=159 -'boolean-node'=160 -'null-node'=161 -'number-node'=162 -'object-node'=163 -'comment'=164 -'array'=165 -'map'=166 -'?'=168 -'null'=169 +'import'=125 +'schema'=126 +'namespace'=127 +'element'=128 +'/'=129 +'//'=130 +'@'=131 +'child'=132 +'descendant'=133 +'attribute'=134 +'self'=135 +'descendant-or-self'=136 +'following-sibling'=137 +'following'=138 +'parent'=139 +'ancestor'=140 +'preceding-sibling'=141 +'preceding'=142 +'ancestor-or-self'=143 +'node'=144 +'binary'=145 +'document'=146 +'document-node'=147 +'text'=148 +'processing-instruction'=149 +'namespace-node'=150 +'schema-attribute'=151 +'schema-element'=152 +'array-node'=153 +'boolean-node'=154 +'null-node'=155 +'number-node'=156 +'object-node'=157 +'comment'=158 +'break'=159 +'loop'=160 +'continue'=161 +'exit'=162 +'returning'=163 +'while'=164 +'?'=166 +'null'=167 diff --git a/src/main/java/org/rumbledb/parser/JsoniqParser.java b/src/main/java/org/rumbledb/parser/JsoniqParser.java index 35bee14a3..68d965cd7 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqParser.java +++ b/src/main/java/org/rumbledb/parser/JsoniqParser.java @@ -37,18 +37,18 @@ public class JsoniqParser extends Parser { Kjsoniq=102, Kunordered=103, Ktrue=104, Kfalse=105, Ktype=106, Kvalidate=107, Kannotate=108, Kdeclare=109, Kcontext=110, Kitem=111, Kvariable=112, Kinsert=113, Kdelete=114, Krename=115, Kreplace=116, Kcopy=117, Kmodify=118, Kappend=119, - Kinto=120, Kvalue=121, Kjson=122, Kwith=123, Kposition=124, Kbreak=125, - Kloop=126, Kcontinue=127, Kexit=128, Kreturning=129, Kwhile=130, Kimport=131, - Kschema=132, Knamespace=133, Kelement=134, Kslash=135, Kdslash=136, Kat_symbol=137, - Kchild=138, Kdescendant=139, Kattribute=140, Kself=141, Kdescendant_or_self=142, - Kfollowing_sibling=143, Kfollowing=144, Kparent=145, Kancestor=146, Kpreceding_sibling=147, - Kpreceding=148, Kancestor_or_self=149, Knode=150, Kbinary=151, Kdocument=152, - Kdocument_node=153, Ktext=154, Kpi=155, Knamespace_node=156, Kschema_attribute=157, - Kschema_element=158, Karray_node=159, Kboolean_node=160, Knull_node=161, - Knumber_node=162, Kobject_node=163, Kcomment=164, Karray=165, Kmap=166, - STRING=167, ArgumentPlaceholder=168, NullLiteral=169, Literal=170, NumericLiteral=171, - IntegerLiteral=172, DecimalLiteral=173, DoubleLiteral=174, WS=175, NCName=176, - XQComment=177, ContentChar=178; + Kinto=120, Kvalue=121, Kjson=122, Kwith=123, Kposition=124, Kimport=125, + Kschema=126, Knamespace=127, Kelement=128, Kslash=129, Kdslash=130, Kat_symbol=131, + Kchild=132, Kdescendant=133, Kattribute=134, Kself=135, Kdescendant_or_self=136, + Kfollowing_sibling=137, Kfollowing=138, Kparent=139, Kancestor=140, Kpreceding_sibling=141, + Kpreceding=142, Kancestor_or_self=143, Knode=144, Kbinary=145, Kdocument=146, + Kdocument_node=147, Ktext=148, Kpi=149, Knamespace_node=150, Kschema_attribute=151, + Kschema_element=152, Karray_node=153, Kboolean_node=154, Knull_node=155, + Knumber_node=156, Kobject_node=157, Kcomment=158, Kbreak=159, Kloop=160, + Kcontinue=161, Kexit=162, Kreturning=163, Kwhile=164, STRING=165, ArgumentPlaceholder=166, + NullLiteral=167, Literal=168, NumericLiteral=169, IntegerLiteral=170, + DecimalLiteral=171, DoubleLiteral=172, WS=173, NCName=174, XQComment=175, + ContentChar=176; public static final int RULE_moduleAndThisIsIt = 0, RULE_module = 1, RULE_mainModule = 2, RULE_libraryModule = 3, RULE_prolog = 4, RULE_program = 5, RULE_statements = 6, RULE_statementsAndExpr = 7, @@ -84,27 +84,22 @@ public class JsoniqParser extends Parser { RULE_functionItemExpr = 104, RULE_namedFunctionRef = 105, RULE_inlineFunctionExpr = 106, RULE_insertExpr = 107, RULE_deleteExpr = 108, RULE_renameExpr = 109, RULE_replaceExpr = 110, RULE_transformExpr = 111, RULE_appendExpr = 112, RULE_updateLocator = 113, - RULE_copyDecl = 114, RULE_schemaImport = 115, RULE_schemaPrefix = 116, - RULE_pathExpr = 117, RULE_relativePathExpr = 118, RULE_stepExpr = 119, - RULE_axisStep = 120, RULE_forwardStep = 121, RULE_forwardAxis = 122, RULE_abbrevForwardStep = 123, - RULE_reverseStep = 124, RULE_reverseAxis = 125, RULE_abbrevReverseStep = 126, - RULE_nodeTest = 127, RULE_nameTest = 128, RULE_wildcard = 129, RULE_nCNameWithLocalWildcard = 130, - RULE_nCNameWithPrefixWildcard = 131, RULE_predicateList = 132, RULE_itemType = 133, - RULE_atomicOrUnionType = 134, RULE_kindTest = 135, RULE_anyKindTest = 136, - RULE_binaryNodeTest = 137, RULE_documentTest = 138, RULE_textTest = 139, - RULE_commentTest = 140, RULE_namespaceNodeTest = 141, RULE_piTest = 142, - RULE_attributeTest = 143, RULE_attributeNameOrWildcard = 144, RULE_schemaAttributeTest = 145, - RULE_elementTest = 146, RULE_elementNameOrWildcard = 147, RULE_schemaElementTest = 148, - RULE_elementDeclaration = 149, RULE_attributeName = 150, RULE_elementName = 151, - RULE_simpleTypeName = 152, RULE_typeName = 153, RULE_mapTest = 154, RULE_anyMapTest = 155, - RULE_typedMapTest = 156, RULE_arrayTest = 157, RULE_anyArrayTest = 158, - RULE_typedArrayTest = 159, RULE_parenthesizedItemTest = 160, RULE_attributeDeclaration = 161, - RULE_mlNodeTest = 162, RULE_mlArrayNodeTest = 163, RULE_mlObjectNodeTest = 164, - RULE_mlNumberNodeTest = 165, RULE_mlBooleanNodeTest = 166, RULE_mlNullNodeTest = 167, - RULE_sequenceType = 168, RULE_objectConstructor = 169, RULE_functionTest = 170, - RULE_anyFunctionTest = 171, RULE_typedFunctionTest = 172, RULE_singleType = 173, - RULE_pairConstructor = 174, RULE_arrayConstructor = 175, RULE_uriLiteral = 176, - RULE_stringLiteral = 177, RULE_keyWords = 178; + RULE_copyDecl = 114, RULE_pathExpr = 115, RULE_relativePathExpr = 116, + RULE_stepExpr = 117, RULE_axisStep = 118, RULE_forwardStep = 119, RULE_forwardAxis = 120, + RULE_abbrevForwardStep = 121, RULE_reverseStep = 122, RULE_reverseAxis = 123, + RULE_abbrevReverseStep = 124, RULE_nodeTest = 125, RULE_nameTest = 126, + RULE_wildcard = 127, RULE_nCNameWithLocalWildcard = 128, RULE_nCNameWithPrefixWildcard = 129, + RULE_predicateList = 130, RULE_kindTest = 131, RULE_anyKindTest = 132, + RULE_binaryNodeTest = 133, RULE_documentTest = 134, RULE_textTest = 135, + RULE_commentTest = 136, RULE_namespaceNodeTest = 137, RULE_piTest = 138, + RULE_attributeTest = 139, RULE_attributeNameOrWildcard = 140, RULE_schemaAttributeTest = 141, + RULE_attributeDeclaration = 142, RULE_elementTest = 143, RULE_elementNameOrWildcard = 144, + RULE_schemaElementTest = 145, RULE_elementDeclaration = 146, RULE_attributeName = 147, + RULE_elementName = 148, RULE_simpleTypeName = 149, RULE_typeName = 150, + RULE_sequenceType = 151, RULE_objectConstructor = 152, RULE_itemType = 153, + RULE_functionTest = 154, RULE_anyFunctionTest = 155, RULE_typedFunctionTest = 156, + RULE_singleType = 157, RULE_pairConstructor = 158, RULE_arrayConstructor = 159, + RULE_uriLiteral = 160, RULE_stringLiteral = 161, RULE_keyWords = 162; private static String[] makeRuleNames() { return new String[] { "moduleAndThisIsIt", "module", "mainModule", "libraryModule", "prolog", @@ -131,19 +126,15 @@ private static String[] makeRuleNames() { "unorderedExpr", "functionCall", "argumentList", "argument", "functionItemExpr", "namedFunctionRef", "inlineFunctionExpr", "insertExpr", "deleteExpr", "renameExpr", "replaceExpr", "transformExpr", "appendExpr", "updateLocator", - "copyDecl", "schemaImport", "schemaPrefix", "pathExpr", "relativePathExpr", - "stepExpr", "axisStep", "forwardStep", "forwardAxis", "abbrevForwardStep", - "reverseStep", "reverseAxis", "abbrevReverseStep", "nodeTest", "nameTest", - "wildcard", "nCNameWithLocalWildcard", "nCNameWithPrefixWildcard", "predicateList", - "itemType", "atomicOrUnionType", "kindTest", "anyKindTest", "binaryNodeTest", - "documentTest", "textTest", "commentTest", "namespaceNodeTest", "piTest", - "attributeTest", "attributeNameOrWildcard", "schemaAttributeTest", "elementTest", - "elementNameOrWildcard", "schemaElementTest", "elementDeclaration", "attributeName", - "elementName", "simpleTypeName", "typeName", "mapTest", "anyMapTest", - "typedMapTest", "arrayTest", "anyArrayTest", "typedArrayTest", "parenthesizedItemTest", - "attributeDeclaration", "mlNodeTest", "mlArrayNodeTest", "mlObjectNodeTest", - "mlNumberNodeTest", "mlBooleanNodeTest", "mlNullNodeTest", "sequenceType", - "objectConstructor", "functionTest", "anyFunctionTest", "typedFunctionTest", + "copyDecl", "pathExpr", "relativePathExpr", "stepExpr", "axisStep", "forwardStep", + "forwardAxis", "abbrevForwardStep", "reverseStep", "reverseAxis", "abbrevReverseStep", + "nodeTest", "nameTest", "wildcard", "nCNameWithLocalWildcard", "nCNameWithPrefixWildcard", + "predicateList", "kindTest", "anyKindTest", "binaryNodeTest", "documentTest", + "textTest", "commentTest", "namespaceNodeTest", "piTest", "attributeTest", + "attributeNameOrWildcard", "schemaAttributeTest", "attributeDeclaration", + "elementTest", "elementNameOrWildcard", "schemaElementTest", "elementDeclaration", + "attributeName", "elementName", "simpleTypeName", "typeName", "sequenceType", + "objectConstructor", "itemType", "functionTest", "anyFunctionTest", "typedFunctionTest", "singleType", "pairConstructor", "arrayConstructor", "uriLiteral", "stringLiteral", "keyWords" }; @@ -169,16 +160,15 @@ private static String[] makeLiteralNames() { "'jsoniq'", "'unordered'", "'true'", "'false'", "'type'", "'validate'", "'annotate'", "'declare'", "'context'", "'item'", "'variable'", "'insert'", "'delete'", "'rename'", "'replace'", "'copy'", "'modify'", "'append'", - "'into'", "'value'", "'json'", "'with'", "'position'", "'break'", "'loop'", - "'continue'", "'exit'", "'returning'", "'while'", "'import'", "'schema'", + "'into'", "'value'", "'json'", "'with'", "'position'", "'import'", "'schema'", "'namespace'", "'element'", "'/'", "'//'", "'@'", "'child'", "'descendant'", "'attribute'", "'self'", "'descendant-or-self'", "'following-sibling'", "'following'", "'parent'", "'ancestor'", "'preceding-sibling'", "'preceding'", "'ancestor-or-self'", "'node'", "'binary'", "'document'", "'document-node'", "'text'", "'processing-instruction'", "'namespace-node'", "'schema-attribute'", "'schema-element'", "'array-node'", "'boolean-node'", "'null-node'", - "'number-node'", "'object-node'", "'comment'", "'array'", "'map'", null, - "'?'", "'null'" + "'number-node'", "'object-node'", "'comment'", "'break'", "'loop'", "'continue'", + "'exit'", "'returning'", "'while'", null, "'?'", "'null'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -198,16 +188,16 @@ private static String[] makeSymbolicNames() { "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", "Kdeclare", "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename", "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson", "Kwith", "Kposition", - "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning", "Kwhile", "Kimport", - "Kschema", "Knamespace", "Kelement", "Kslash", "Kdslash", "Kat_symbol", - "Kchild", "Kdescendant", "Kattribute", "Kself", "Kdescendant_or_self", + "Kimport", "Kschema", "Knamespace", "Kelement", "Kslash", "Kdslash", + "Kat_symbol", "Kchild", "Kdescendant", "Kattribute", "Kself", "Kdescendant_or_self", "Kfollowing_sibling", "Kfollowing", "Kparent", "Kancestor", "Kpreceding_sibling", "Kpreceding", "Kancestor_or_self", "Knode", "Kbinary", "Kdocument", "Kdocument_node", "Ktext", "Kpi", "Knamespace_node", "Kschema_attribute", "Kschema_element", "Karray_node", "Kboolean_node", "Knull_node", "Knumber_node", "Kobject_node", - "Kcomment", "Karray", "Kmap", "STRING", "ArgumentPlaceholder", "NullLiteral", - "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", - "WS", "NCName", "XQComment", "ContentChar" + "Kcomment", "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning", "Kwhile", + "STRING", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral", + "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "WS", "NCName", + "XQComment", "ContentChar" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -283,9 +273,9 @@ public final ModuleAndThisIsItContext moduleAndThisIsIt() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(358); + setState(326); module(); - setState(359); + setState(327); match(EOF); } } @@ -331,28 +321,28 @@ public final ModuleContext module() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(366); + setState(334); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,0,_ctx) ) { case 1: { - setState(361); + setState(329); match(Kjsoniq); - setState(362); + setState(330); match(Kversion); - setState(363); + setState(331); ((ModuleContext)_localctx).vers = stringLiteral(); - setState(364); + setState(332); match(T__0); } break; } - setState(370); + setState(338); _errHandler.sync(this); switch (_input.LA(1)) { case T__1: { - setState(368); + setState(336); libraryModule(); } break; @@ -360,7 +350,6 @@ public final ModuleContext module() throws RecognitionException { case T__3: case T__5: case T__7: - case T__9: case T__11: case T__14: case T__28: @@ -436,14 +425,7 @@ public final ModuleContext module() throws RecognitionException { case Kjson: case Kwith: case Kposition: - case Kbreak: - case Kloop: - case Kcontinue: - case Kexit: - case Kreturning: - case Kwhile: case Kimport: - case Kelement: case Kslash: case Kdslash: case Kat_symbol: @@ -459,26 +441,18 @@ public final ModuleContext module() throws RecognitionException { case Kpreceding_sibling: case Kpreceding: case Kancestor_or_self: - case Knode: - case Kbinary: - case Kdocument_node: - case Ktext: - case Kpi: - case Knamespace_node: - case Kschema_attribute: - case Kschema_element: - case Karray_node: - case Kboolean_node: - case Knull_node: - case Knumber_node: - case Kobject_node: - case Kcomment: + case Kbreak: + case Kloop: + case Kcontinue: + case Kexit: + case Kreturning: + case Kwhile: case STRING: case NullLiteral: case Literal: case NCName: { - setState(369); + setState(337); ((ModuleContext)_localctx).main = mainModule(); } break; @@ -522,9 +496,9 @@ public final MainModuleContext mainModule() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(372); + setState(340); prolog(); - setState(373); + setState(341); program(); } } @@ -565,19 +539,19 @@ public final LibraryModuleContext libraryModule() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(375); + setState(343); match(T__1); - setState(376); + setState(344); match(Knamespace); - setState(377); + setState(345); match(NCName); - setState(378); + setState(346); match(T__2); - setState(379); + setState(347); uriLiteral(); - setState(380); + setState(348); match(T__0); - setState(381); + setState(349); prolog(); } } @@ -635,59 +609,59 @@ public final PrologContext prolog() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(392); + setState(360); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,3,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(386); + setState(354); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { case 1: { - setState(383); + setState(351); setter(); } break; case 2: { - setState(384); + setState(352); namespaceDecl(); } break; case 3: { - setState(385); + setState(353); moduleImport(); } break; } - setState(388); + setState(356); match(T__0); } } } - setState(394); + setState(362); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,3,_ctx); } - setState(400); + setState(368); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,4,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(395); + setState(363); annotatedDecl(); - setState(396); + setState(364); match(T__0); } } } - setState(402); + setState(370); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,4,_ctx); } @@ -725,7 +699,7 @@ public final ProgramContext program() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(403); + setState(371); statementsAndOptionalExpr(); } } @@ -765,19 +739,19 @@ public final StatementsContext statements() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(408); + setState(376); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,5,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(405); + setState(373); statement(); } } } - setState(410); + setState(378); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,5,_ctx); } @@ -818,9 +792,9 @@ public final StatementsAndExprContext statementsAndExpr() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(411); + setState(379); statements(); - setState(412); + setState(380); expr(); } } @@ -860,14 +834,14 @@ public final StatementsAndOptionalExprContext statementsAndOptionalExpr() throws try { enterOuterAlt(_localctx, 1); { - setState(414); + setState(382); statements(); - setState(416); + setState(384); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { { - setState(415); + setState(383); expr(); } } @@ -940,97 +914,97 @@ public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 18, RULE_statement); try { - setState(431); + setState(399); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(418); + setState(386); applyStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(419); + setState(387); assignStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(420); + setState(388); blockStatement(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(421); + setState(389); breakStatement(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(422); + setState(390); continueStatement(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(423); + setState(391); exitStatement(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(424); + setState(392); flowrStatement(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(425); + setState(393); ifStatement(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(426); + setState(394); switchStatement(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(427); + setState(395); tryCatchStatement(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(428); + setState(396); typeSwitchStatement(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(429); + setState(397); varDeclStatement(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(430); + setState(398); whileStatement(); } break; @@ -1068,9 +1042,9 @@ public final ApplyStatementContext applyStatement() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(433); + setState(401); exprSimple(); - setState(434); + setState(402); match(T__0); } } @@ -1109,15 +1083,15 @@ public final AssignStatementContext assignStatement() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(436); + setState(404); match(T__3); - setState(437); + setState(405); qname(); - setState(438); + setState(406); match(T__4); - setState(439); + setState(407); exprSingle(); - setState(440); + setState(408); match(T__0); } } @@ -1153,11 +1127,11 @@ public final BlockStatementContext blockStatement() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(442); + setState(410); match(T__5); - setState(443); + setState(411); statements(); - setState(444); + setState(412); match(T__6); } } @@ -1192,11 +1166,11 @@ public final BreakStatementContext breakStatement() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(446); + setState(414); match(Kbreak); - setState(447); + setState(415); match(Kloop); - setState(448); + setState(416); match(T__0); } } @@ -1231,11 +1205,11 @@ public final ContinueStatementContext continueStatement() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(450); + setState(418); match(Kcontinue); - setState(451); + setState(419); match(Kloop); - setState(452); + setState(420); match(T__0); } } @@ -1273,13 +1247,13 @@ public final ExitStatementContext exitStatement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(454); + setState(422); match(Kexit); - setState(455); + setState(423); match(Kreturning); - setState(456); + setState(424); exprSingle(); - setState(457); + setState(425); match(T__0); } } @@ -1356,66 +1330,66 @@ public final FlowrStatementContext flowrStatement() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(461); + setState(429); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: { - setState(459); + setState(427); ((FlowrStatementContext)_localctx).start_for = forClause(); } break; case Klet: { - setState(460); + setState(428); ((FlowrStatementContext)_localctx).start_let = letClause(); } break; default: throw new NoViableAltException(this); } - setState(471); + setState(439); _errHandler.sync(this); _la = _input.LA(1); while (((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (Kfor - 59)) | (1L << (Klet - 59)) | (1L << (Kwhere - 59)) | (1L << (Kgroup - 59)) | (1L << (Korder - 59)) | (1L << (Kcount - 59)) | (1L << (Kstable - 59)))) != 0)) { { - setState(469); + setState(437); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: { - setState(463); + setState(431); forClause(); } break; case Klet: { - setState(464); + setState(432); letClause(); } break; case Kwhere: { - setState(465); + setState(433); whereClause(); } break; case Kgroup: { - setState(466); + setState(434); groupByClause(); } break; case Korder: case Kstable: { - setState(467); + setState(435); orderByClause(); } break; case Kcount: { - setState(468); + setState(436); countClause(); } break; @@ -1423,13 +1397,13 @@ public final FlowrStatementContext flowrStatement() throws RecognitionException throw new NoViableAltException(this); } } - setState(473); + setState(441); _errHandler.sync(this); _la = _input.LA(1); } - setState(474); + setState(442); match(Kreturn); - setState(475); + setState(443); ((FlowrStatementContext)_localctx).returnStmt = statement(); } } @@ -1477,21 +1451,21 @@ public final IfStatementContext ifStatement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(477); + setState(445); match(Kif); - setState(478); + setState(446); match(T__7); - setState(479); + setState(447); ((IfStatementContext)_localctx).test_expr = expr(); - setState(480); + setState(448); match(T__8); - setState(481); + setState(449); match(Kthen); - setState(482); + setState(450); ((IfStatementContext)_localctx).branch = statement(); - setState(483); + setState(451); match(Kelse); - setState(484); + setState(452); ((IfStatementContext)_localctx).else_branch = statement(); } } @@ -1544,34 +1518,34 @@ public final SwitchStatementContext switchStatement() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(486); + setState(454); match(Kswitch); - setState(487); + setState(455); match(T__7); - setState(488); + setState(456); ((SwitchStatementContext)_localctx).condExpr = expr(); - setState(489); + setState(457); match(T__8); - setState(491); + setState(459); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(490); + setState(458); ((SwitchStatementContext)_localctx).switchCaseStatement = switchCaseStatement(); ((SwitchStatementContext)_localctx).cases.add(((SwitchStatementContext)_localctx).switchCaseStatement); } } - setState(493); + setState(461); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(495); + setState(463); match(Kdefault); - setState(496); + setState(464); match(Kreturn); - setState(497); + setState(465); ((SwitchStatementContext)_localctx).def = statement(); } } @@ -1622,26 +1596,26 @@ public final SwitchCaseStatementContext switchCaseStatement() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(501); + setState(469); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(499); + setState(467); match(Kcase); - setState(500); + setState(468); ((SwitchCaseStatementContext)_localctx).exprSingle = exprSingle(); ((SwitchCaseStatementContext)_localctx).cond.add(((SwitchCaseStatementContext)_localctx).exprSingle); } } - setState(503); + setState(471); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(505); + setState(473); match(Kreturn); - setState(506); + setState(474); ((SwitchCaseStatementContext)_localctx).ret = statement(); } } @@ -1688,11 +1662,11 @@ public final TryCatchStatementContext tryCatchStatement() throws RecognitionExce int _alt; enterOuterAlt(_localctx, 1); { - setState(508); + setState(476); match(Ktry); - setState(509); + setState(477); ((TryCatchStatementContext)_localctx).try_block = blockStatement(); - setState(511); + setState(479); _errHandler.sync(this); _alt = 1; do { @@ -1700,7 +1674,7 @@ public final TryCatchStatementContext tryCatchStatement() throws RecognitionExce case 1: { { - setState(510); + setState(478); ((TryCatchStatementContext)_localctx).catchCaseStatement = catchCaseStatement(); ((TryCatchStatementContext)_localctx).catches.add(((TryCatchStatementContext)_localctx).catchCaseStatement); } @@ -1709,7 +1683,7 @@ public final TryCatchStatementContext tryCatchStatement() throws RecognitionExce default: throw new NoViableAltException(this); } - setState(513); + setState(481); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,13,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -1760,14 +1734,14 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(515); + setState(483); match(Kcatch); - setState(518); + setState(486); _errHandler.sync(this); switch (_input.LA(1)) { case T__9: { - setState(516); + setState(484); ((CatchCaseStatementContext)_localctx).s10 = match(T__9); ((CatchCaseStatementContext)_localctx).jokers.add(((CatchCaseStatementContext)_localctx).s10); } @@ -1847,7 +1821,7 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx case NullLiteral: case NCName: { - setState(517); + setState(485); ((CatchCaseStatementContext)_localctx).qname = qname(); ((CatchCaseStatementContext)_localctx).errors.add(((CatchCaseStatementContext)_localctx).qname); } @@ -1855,20 +1829,20 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx default: throw new NoViableAltException(this); } - setState(527); + setState(495); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__10) { { { - setState(520); + setState(488); match(T__10); - setState(523); + setState(491); _errHandler.sync(this); switch (_input.LA(1)) { case T__9: { - setState(521); + setState(489); ((CatchCaseStatementContext)_localctx).s10 = match(T__9); ((CatchCaseStatementContext)_localctx).jokers.add(((CatchCaseStatementContext)_localctx).s10); } @@ -1948,7 +1922,7 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx case NullLiteral: case NCName: { - setState(522); + setState(490); ((CatchCaseStatementContext)_localctx).qname = qname(); ((CatchCaseStatementContext)_localctx).errors.add(((CatchCaseStatementContext)_localctx).qname); } @@ -1958,11 +1932,11 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx } } } - setState(529); + setState(497); _errHandler.sync(this); _la = _input.LA(1); } - setState(530); + setState(498); ((CatchCaseStatementContext)_localctx).catch_block = blockStatement(); } } @@ -2019,44 +1993,44 @@ public final TypeSwitchStatementContext typeSwitchStatement() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(532); + setState(500); match(Ktypeswitch); - setState(533); + setState(501); match(T__7); - setState(534); + setState(502); ((TypeSwitchStatementContext)_localctx).cond = expr(); - setState(535); + setState(503); match(T__8); - setState(537); + setState(505); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(536); + setState(504); ((TypeSwitchStatementContext)_localctx).caseStatement = caseStatement(); ((TypeSwitchStatementContext)_localctx).cases.add(((TypeSwitchStatementContext)_localctx).caseStatement); } } - setState(539); + setState(507); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(541); + setState(509); match(Kdefault); - setState(543); + setState(511); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__3) { { - setState(542); + setState(510); ((TypeSwitchStatementContext)_localctx).var_ref = varRef(); } } - setState(545); + setState(513); match(Kreturn); - setState(546); + setState(514); ((TypeSwitchStatementContext)_localctx).def = statement(); } } @@ -2109,43 +2083,43 @@ public final CaseStatementContext caseStatement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(548); + setState(516); match(Kcase); - setState(552); + setState(520); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__3) { { - setState(549); + setState(517); ((CaseStatementContext)_localctx).var_ref = varRef(); - setState(550); + setState(518); match(Kas); } } - setState(554); + setState(522); ((CaseStatementContext)_localctx).sequenceType = sequenceType(); ((CaseStatementContext)_localctx).union.add(((CaseStatementContext)_localctx).sequenceType); - setState(559); + setState(527); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__10) { { { - setState(555); + setState(523); match(T__10); - setState(556); + setState(524); ((CaseStatementContext)_localctx).sequenceType = sequenceType(); ((CaseStatementContext)_localctx).union.add(((CaseStatementContext)_localctx).sequenceType); } } - setState(561); + setState(529); _errHandler.sync(this); _la = _input.LA(1); } - setState(562); + setState(530); match(Kreturn); - setState(563); + setState(531); ((CaseStatementContext)_localctx).ret = statement(); } } @@ -2187,36 +2161,36 @@ public final AnnotationContext annotation() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(565); + setState(533); match(T__11); - setState(566); + setState(534); ((AnnotationContext)_localctx).name = qname(); - setState(577); + setState(545); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__7) { { - setState(567); + setState(535); match(T__7); - setState(568); + setState(536); match(Literal); - setState(573); + setState(541); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(569); + setState(537); match(T__12); - setState(570); + setState(538); match(Literal); } } - setState(575); + setState(543); _errHandler.sync(this); _la = _input.LA(1); } - setState(576); + setState(544); match(T__8); } } @@ -2259,17 +2233,17 @@ public final AnnotationsContext annotations() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(582); + setState(550); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__11) { { { - setState(579); + setState(547); annotation(); } } - setState(584); + setState(552); _errHandler.sync(this); _la = _input.LA(1); } @@ -2315,29 +2289,29 @@ public final VarDeclStatementContext varDeclStatement() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(585); + setState(553); annotations(); - setState(586); + setState(554); match(Kvariable); - setState(587); + setState(555); varDeclForStatement(); - setState(592); + setState(560); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(588); + setState(556); match(T__12); - setState(589); + setState(557); varDeclForStatement(); } } - setState(594); + setState(562); _errHandler.sync(this); _la = _input.LA(1); } - setState(595); + setState(563); match(T__0); } } @@ -2384,28 +2358,28 @@ public final VarDeclForStatementContext varDeclForStatement() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(597); + setState(565); ((VarDeclForStatementContext)_localctx).var_ref = varRef(); - setState(600); + setState(568); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(598); + setState(566); match(Kas); - setState(599); + setState(567); sequenceType(); } } - setState(604); + setState(572); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__4) { { - setState(602); + setState(570); match(T__4); - setState(603); + setState(571); ((VarDeclForStatementContext)_localctx).exprSingle = exprSingle(); ((VarDeclForStatementContext)_localctx).expr_vals.add(((VarDeclForStatementContext)_localctx).exprSingle); } @@ -2451,15 +2425,15 @@ public final WhileStatementContext whileStatement() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(606); + setState(574); match(Kwhile); - setState(607); + setState(575); match(T__7); - setState(608); + setState(576); ((WhileStatementContext)_localctx).test_expr = expr(); - setState(609); + setState(577); match(T__8); - setState(610); + setState(578); ((WhileStatementContext)_localctx).stmt = statement(); } } @@ -2502,34 +2476,34 @@ public final SetterContext setter() throws RecognitionException { SetterContext _localctx = new SetterContext(_ctx, getState()); enterRule(_localctx, 58, RULE_setter); try { - setState(616); + setState(584); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(612); + setState(580); defaultCollationDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(613); + setState(581); orderingModeDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(614); + setState(582); emptyOrderDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(615); + setState(583); decimalFormatDecl(); } break; @@ -2570,15 +2544,15 @@ public final NamespaceDeclContext namespaceDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(618); + setState(586); match(Kdeclare); - setState(619); + setState(587); match(Knamespace); - setState(620); + setState(588); match(NCName); - setState(621); + setState(589); match(T__2); - setState(622); + setState(590); uriLiteral(); } } @@ -2621,34 +2595,34 @@ public final AnnotatedDeclContext annotatedDecl() throws RecognitionException { AnnotatedDeclContext _localctx = new AnnotatedDeclContext(_ctx, getState()); enterRule(_localctx, 62, RULE_annotatedDecl); try { - setState(628); + setState(596); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(624); + setState(592); functionDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(625); + setState(593); varDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(626); + setState(594); typeDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(627); + setState(595); contextItemDecl(); } break; @@ -2689,13 +2663,13 @@ public final DefaultCollationDeclContext defaultCollationDecl() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(630); + setState(598); match(Kdeclare); - setState(631); + setState(599); match(Kdefault); - setState(632); + setState(600); match(Kcollation); - setState(633); + setState(601); uriLiteral(); } } @@ -2731,11 +2705,11 @@ public final OrderingModeDeclContext orderingModeDecl() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(635); + setState(603); match(Kdeclare); - setState(636); + setState(604); match(T__13); - setState(637); + setState(605); _la = _input.LA(1); if ( !(_la==T__14 || _la==Kunordered) ) { _errHandler.recoverInline(this); @@ -2784,16 +2758,16 @@ public final EmptyOrderDeclContext emptyOrderDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(639); + setState(607); match(Kdeclare); - setState(640); + setState(608); match(Kdefault); - setState(641); + setState(609); match(Korder); - setState(642); + setState(610); match(Kempty); { - setState(643); + setState(611); ((EmptyOrderDeclContext)_localctx).emptySequenceOrder = _input.LT(1); _la = _input.LA(1); if ( !(_la==Kgreatest || _la==Kleast) ) { @@ -2854,17 +2828,17 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(645); + setState(613); match(Kdeclare); - setState(650); + setState(618); _errHandler.sync(this); switch (_input.LA(1)) { case T__15: { { - setState(646); + setState(614); match(T__15); - setState(647); + setState(615); qname(); } } @@ -2872,9 +2846,9 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce case Kdefault: { { - setState(648); + setState(616); match(Kdefault); - setState(649); + setState(617); match(T__15); } } @@ -2882,21 +2856,21 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce default: throw new NoViableAltException(this); } - setState(658); + setState(626); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26))) != 0)) { { { - setState(652); + setState(620); dfPropertyName(); - setState(653); + setState(621); match(T__2); - setState(654); + setState(622); stringLiteral(); } } - setState(660); + setState(628); _errHandler.sync(this); _la = _input.LA(1); } @@ -2945,17 +2919,17 @@ public final QnameContext qname() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(666); + setState(634); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { case 1: { - setState(663); + setState(631); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(661); + setState(629); ((QnameContext)_localctx).ns = match(NCName); } break; @@ -3033,24 +3007,24 @@ public final QnameContext qname() throws RecognitionException { case Kwhile: case NullLiteral: { - setState(662); + setState(630); ((QnameContext)_localctx).nskw = keyWords(); } break; default: throw new NoViableAltException(this); } - setState(665); + setState(633); match(T__16); } break; } - setState(670); + setState(638); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(668); + setState(636); ((QnameContext)_localctx).local_name = match(NCName); } break; @@ -3128,7 +3102,7 @@ public final QnameContext qname() throws RecognitionException { case Kwhile: case NullLiteral: { - setState(669); + setState(637); ((QnameContext)_localctx).local_namekw = keyWords(); } break; @@ -3167,7 +3141,7 @@ public final DfPropertyNameContext dfPropertyName() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(672); + setState(640); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26))) != 0)) ) { _errHandler.recoverInline(this); @@ -3221,48 +3195,48 @@ public final ModuleImportContext moduleImport() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(674); + setState(642); match(Kimport); - setState(675); + setState(643); match(T__1); - setState(679); + setState(647); _errHandler.sync(this); _la = _input.LA(1); if (_la==Knamespace) { { - setState(676); + setState(644); match(Knamespace); - setState(677); + setState(645); ((ModuleImportContext)_localctx).prefix = match(NCName); - setState(678); + setState(646); match(T__2); } } - setState(681); + setState(649); ((ModuleImportContext)_localctx).targetNamespace = uriLiteral(); - setState(691); + setState(659); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kat) { { - setState(682); + setState(650); match(Kat); - setState(683); + setState(651); uriLiteral(); - setState(688); + setState(656); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(684); + setState(652); match(T__12); - setState(685); + setState(653); uriLiteral(); } } - setState(690); + setState(658); _errHandler.sync(this); _la = _input.LA(1); } @@ -3317,35 +3291,35 @@ public final VarDeclContext varDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(693); + setState(661); match(Kdeclare); - setState(694); + setState(662); annotations(); - setState(695); + setState(663); match(Kvariable); - setState(696); + setState(664); varRef(); - setState(699); + setState(667); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(697); + setState(665); match(Kas); - setState(698); + setState(666); sequenceType(); } } - setState(708); + setState(676); _errHandler.sync(this); switch (_input.LA(1)) { case T__4: { { - setState(701); + setState(669); match(T__4); - setState(702); + setState(670); exprSingle(); } } @@ -3353,16 +3327,16 @@ public final VarDeclContext varDecl() throws RecognitionException { case T__27: { { - setState(703); + setState(671); ((VarDeclContext)_localctx).external = match(T__27); - setState(706); + setState(674); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__4) { { - setState(704); + setState(672); match(T__4); - setState(705); + setState(673); exprSingle(); } } @@ -3416,33 +3390,33 @@ public final ContextItemDeclContext contextItemDecl() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(710); + setState(678); match(Kdeclare); - setState(711); + setState(679); match(Kcontext); - setState(712); + setState(680); match(Kitem); - setState(715); + setState(683); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(713); + setState(681); match(Kas); - setState(714); + setState(682); sequenceType(); } } - setState(724); + setState(692); _errHandler.sync(this); switch (_input.LA(1)) { case T__4: { { - setState(717); + setState(685); match(T__4); - setState(718); + setState(686); exprSingle(); } } @@ -3450,16 +3424,16 @@ public final ContextItemDeclContext contextItemDecl() throws RecognitionExceptio case T__27: { { - setState(719); + setState(687); ((ContextItemDeclContext)_localctx).external = match(T__27); - setState(722); + setState(690); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__4) { { - setState(720); + setState(688); match(T__4); - setState(721); + setState(689); exprSingle(); } } @@ -3522,58 +3496,58 @@ public final FunctionDeclContext functionDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(726); + setState(694); match(Kdeclare); - setState(727); + setState(695); annotations(); - setState(728); + setState(696); match(T__28); - setState(729); + setState(697); ((FunctionDeclContext)_localctx).fn_name = qname(); - setState(730); + setState(698); match(T__7); - setState(732); + setState(700); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__3) { { - setState(731); + setState(699); paramList(); } } - setState(734); + setState(702); match(T__8); - setState(737); + setState(705); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(735); + setState(703); match(Kas); - setState(736); + setState(704); ((FunctionDeclContext)_localctx).return_type = sequenceType(); } } - setState(744); + setState(712); _errHandler.sync(this); switch (_input.LA(1)) { case T__5: { - setState(739); + setState(707); match(T__5); { - setState(740); + setState(708); ((FunctionDeclContext)_localctx).fn_body = statementsAndOptionalExpr(); } - setState(741); + setState(709); match(T__6); } break; case T__27: { - setState(743); + setState(711); match(T__27); } break; @@ -3626,25 +3600,25 @@ public final TypeDeclContext typeDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(746); + setState(714); match(Kdeclare); - setState(747); + setState(715); match(Ktype); - setState(748); + setState(716); ((TypeDeclContext)_localctx).type_name = qname(); - setState(749); + setState(717); match(Kas); - setState(751); + setState(719); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { case 1: { - setState(750); + setState(718); ((TypeDeclContext)_localctx).schema = schemaLanguage(); } break; } - setState(753); + setState(721); ((TypeDeclContext)_localctx).type_definition = exprSingle(); } } @@ -3677,33 +3651,33 @@ public final SchemaLanguageContext schemaLanguage() throws RecognitionException SchemaLanguageContext _localctx = new SchemaLanguageContext(_ctx, getState()); enterRule(_localctx, 86, RULE_schemaLanguage); try { - setState(761); + setState(729); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(755); + setState(723); match(T__29); - setState(756); + setState(724); match(T__30); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(757); + setState(725); match(T__29); - setState(758); + setState(726); match(T__31); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(759); + setState(727); match(Kjson); - setState(760); + setState(728); match(Kschema); } break; @@ -3745,21 +3719,21 @@ public final ParamListContext paramList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(763); + setState(731); param(); - setState(768); + setState(736); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(764); + setState(732); match(T__12); - setState(765); + setState(733); param(); } } - setState(770); + setState(738); _errHandler.sync(this); _la = _input.LA(1); } @@ -3802,18 +3776,18 @@ public final ParamContext param() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(771); + setState(739); match(T__3); - setState(772); + setState(740); qname(); - setState(775); + setState(743); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(773); + setState(741); match(Kas); - setState(774); + setState(742); sequenceType(); } } @@ -3856,21 +3830,21 @@ public final ExprContext expr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(777); + setState(745); exprSingle(); - setState(782); + setState(750); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(778); + setState(746); match(T__12); - setState(779); + setState(747); exprSingle(); } } - setState(784); + setState(752); _errHandler.sync(this); _la = _input.LA(1); } @@ -3921,48 +3895,48 @@ public final ExprSingleContext exprSingle() throws RecognitionException { ExprSingleContext _localctx = new ExprSingleContext(_ctx, getState()); enterRule(_localctx, 94, RULE_exprSingle); try { - setState(791); + setState(759); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(785); + setState(753); exprSimple(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(786); + setState(754); flowrExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(787); + setState(755); switchExpr(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(788); + setState(756); typeSwitchExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(789); + setState(757); ifExpr(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(790); + setState(758); tryCatchExpr(); } break; @@ -4019,62 +3993,62 @@ public final ExprSimpleContext exprSimple() throws RecognitionException { ExprSimpleContext _localctx = new ExprSimpleContext(_ctx, getState()); enterRule(_localctx, 96, RULE_exprSimple); try { - setState(801); + setState(769); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(793); + setState(761); quantifiedExpr(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(794); + setState(762); orExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(795); + setState(763); insertExpr(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(796); + setState(764); deleteExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(797); + setState(765); renameExpr(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(798); + setState(766); replaceExpr(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(799); + setState(767); transformExpr(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(800); + setState(768); appendExpr(); } break; @@ -4153,66 +4127,66 @@ public final FlowrExprContext flowrExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(805); + setState(773); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: { - setState(803); + setState(771); ((FlowrExprContext)_localctx).start_for = forClause(); } break; case Klet: { - setState(804); + setState(772); ((FlowrExprContext)_localctx).start_let = letClause(); } break; default: throw new NoViableAltException(this); } - setState(815); + setState(783); _errHandler.sync(this); _la = _input.LA(1); while (((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (Kfor - 59)) | (1L << (Klet - 59)) | (1L << (Kwhere - 59)) | (1L << (Kgroup - 59)) | (1L << (Korder - 59)) | (1L << (Kcount - 59)) | (1L << (Kstable - 59)))) != 0)) { { - setState(813); + setState(781); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: { - setState(807); + setState(775); forClause(); } break; case Klet: { - setState(808); + setState(776); letClause(); } break; case Kwhere: { - setState(809); + setState(777); whereClause(); } break; case Kgroup: { - setState(810); + setState(778); groupByClause(); } break; case Korder: case Kstable: { - setState(811); + setState(779); orderByClause(); } break; case Kcount: { - setState(812); + setState(780); countClause(); } break; @@ -4220,13 +4194,13 @@ public final FlowrExprContext flowrExpr() throws RecognitionException { throw new NoViableAltException(this); } } - setState(817); + setState(785); _errHandler.sync(this); _la = _input.LA(1); } - setState(818); + setState(786); match(Kreturn); - setState(819); + setState(787); ((FlowrExprContext)_localctx).return_expr = exprSingle(); } } @@ -4269,25 +4243,25 @@ public final ForClauseContext forClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(821); + setState(789); match(Kfor); - setState(822); + setState(790); ((ForClauseContext)_localctx).forVar = forVar(); ((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar); - setState(827); + setState(795); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(823); + setState(791); match(T__12); - setState(824); + setState(792); ((ForClauseContext)_localctx).forVar = forVar(); ((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar); } } - setState(829); + setState(797); _errHandler.sync(this); _la = _input.LA(1); } @@ -4345,47 +4319,47 @@ public final ForVarContext forVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(830); + setState(798); ((ForVarContext)_localctx).var_ref = varRef(); - setState(833); + setState(801); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(831); + setState(799); match(Kas); - setState(832); + setState(800); ((ForVarContext)_localctx).seq = sequenceType(); } } - setState(837); + setState(805); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kallowing) { { - setState(835); + setState(803); ((ForVarContext)_localctx).flag = match(Kallowing); - setState(836); + setState(804); match(Kempty); } } - setState(841); + setState(809); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kat) { { - setState(839); + setState(807); match(Kat); - setState(840); + setState(808); ((ForVarContext)_localctx).at = varRef(); } } - setState(843); + setState(811); match(Kin); - setState(844); + setState(812); ((ForVarContext)_localctx).ex = exprSingle(); } } @@ -4428,25 +4402,25 @@ public final LetClauseContext letClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(846); + setState(814); match(Klet); - setState(847); + setState(815); ((LetClauseContext)_localctx).letVar = letVar(); ((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar); - setState(852); + setState(820); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(848); + setState(816); match(T__12); - setState(849); + setState(817); ((LetClauseContext)_localctx).letVar = letVar(); ((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar); } } - setState(854); + setState(822); _errHandler.sync(this); _la = _input.LA(1); } @@ -4495,23 +4469,23 @@ public final LetVarContext letVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(855); + setState(823); ((LetVarContext)_localctx).var_ref = varRef(); - setState(858); + setState(826); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(856); + setState(824); match(Kas); - setState(857); + setState(825); ((LetVarContext)_localctx).seq = sequenceType(); } } - setState(860); + setState(828); match(T__4); - setState(861); + setState(829); ((LetVarContext)_localctx).ex = exprSingle(); } } @@ -4548,9 +4522,9 @@ public final WhereClauseContext whereClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(863); + setState(831); match(Kwhere); - setState(864); + setState(832); exprSingle(); } } @@ -4594,27 +4568,27 @@ public final GroupByClauseContext groupByClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(866); + setState(834); match(Kgroup); - setState(867); + setState(835); match(Kby); - setState(868); + setState(836); ((GroupByClauseContext)_localctx).groupByVar = groupByVar(); ((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar); - setState(873); + setState(841); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(869); + setState(837); match(T__12); - setState(870); + setState(838); ((GroupByClauseContext)_localctx).groupByVar = groupByVar(); ((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar); } } - setState(875); + setState(843); _errHandler.sync(this); _la = _input.LA(1); } @@ -4669,40 +4643,40 @@ public final GroupByVarContext groupByVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(876); + setState(844); ((GroupByVarContext)_localctx).var_ref = varRef(); - setState(883); + setState(851); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__4 || _la==Kas) { { - setState(879); + setState(847); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(877); + setState(845); match(Kas); - setState(878); + setState(846); ((GroupByVarContext)_localctx).seq = sequenceType(); } } - setState(881); + setState(849); ((GroupByVarContext)_localctx).decl = match(T__4); - setState(882); + setState(850); ((GroupByVarContext)_localctx).ex = exprSingle(); } } - setState(887); + setState(855); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kcollation) { { - setState(885); + setState(853); match(Kcollation); - setState(886); + setState(854); ((GroupByVarContext)_localctx).uri = uriLiteral(); } } @@ -4749,15 +4723,15 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(894); + setState(862); _errHandler.sync(this); switch (_input.LA(1)) { case Korder: { { - setState(889); + setState(857); match(Korder); - setState(890); + setState(858); match(Kby); } } @@ -4765,11 +4739,11 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { case Kstable: { { - setState(891); + setState(859); ((OrderByClauseContext)_localctx).stb = match(Kstable); - setState(892); + setState(860); match(Korder); - setState(893); + setState(861); match(Kby); } } @@ -4777,21 +4751,21 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(896); + setState(864); orderByExpr(); - setState(901); + setState(869); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(897); + setState(865); match(T__12); - setState(898); + setState(866); orderByExpr(); } } - setState(903); + setState(871); _errHandler.sync(this); _la = _input.LA(1); } @@ -4844,20 +4818,20 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(904); + setState(872); ((OrderByExprContext)_localctx).ex = exprSingle(); - setState(907); + setState(875); _errHandler.sync(this); switch (_input.LA(1)) { case Kascending: { - setState(905); + setState(873); match(Kascending); } break; case Kdescending: { - setState(906); + setState(874); ((OrderByExprContext)_localctx).desc = match(Kdescending); } break; @@ -4876,25 +4850,25 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { default: break; } - setState(914); + setState(882); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kempty) { { - setState(909); + setState(877); match(Kempty); - setState(912); + setState(880); _errHandler.sync(this); switch (_input.LA(1)) { case Kgreatest: { - setState(910); + setState(878); ((OrderByExprContext)_localctx).gr = match(Kgreatest); } break; case Kleast: { - setState(911); + setState(879); ((OrderByExprContext)_localctx).ls = match(Kleast); } break; @@ -4904,14 +4878,14 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { } } - setState(918); + setState(886); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kcollation) { { - setState(916); + setState(884); match(Kcollation); - setState(917); + setState(885); ((OrderByExprContext)_localctx).uril = uriLiteral(); } } @@ -4951,9 +4925,9 @@ public final CountClauseContext countClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(920); + setState(888); match(Kcount); - setState(921); + setState(889); varRef(); } } @@ -5003,47 +4977,47 @@ public final QuantifiedExprContext quantifiedExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(925); + setState(893); _errHandler.sync(this); switch (_input.LA(1)) { case Ksome: { - setState(923); + setState(891); ((QuantifiedExprContext)_localctx).so = match(Ksome); } break; case Kevery: { - setState(924); + setState(892); ((QuantifiedExprContext)_localctx).ev = match(Kevery); } break; default: throw new NoViableAltException(this); } - setState(927); + setState(895); ((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar(); ((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar); - setState(932); + setState(900); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(928); + setState(896); match(T__12); - setState(929); + setState(897); ((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar(); ((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar); } } - setState(934); + setState(902); _errHandler.sync(this); _la = _input.LA(1); } - setState(935); + setState(903); match(Ksatisfies); - setState(936); + setState(904); exprSingle(); } } @@ -5088,23 +5062,23 @@ public final QuantifiedExprVarContext quantifiedExprVar() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(938); + setState(906); varRef(); - setState(941); + setState(909); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(939); + setState(907); match(Kas); - setState(940); + setState(908); sequenceType(); } } - setState(943); + setState(911); match(Kin); - setState(944); + setState(912); exprSingle(); } } @@ -5157,34 +5131,34 @@ public final SwitchExprContext switchExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(946); + setState(914); match(Kswitch); - setState(947); + setState(915); match(T__7); - setState(948); + setState(916); ((SwitchExprContext)_localctx).cond = expr(); - setState(949); + setState(917); match(T__8); - setState(951); + setState(919); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(950); + setState(918); ((SwitchExprContext)_localctx).switchCaseClause = switchCaseClause(); ((SwitchExprContext)_localctx).cases.add(((SwitchExprContext)_localctx).switchCaseClause); } } - setState(953); + setState(921); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(955); + setState(923); match(Kdefault); - setState(956); + setState(924); match(Kreturn); - setState(957); + setState(925); ((SwitchExprContext)_localctx).def = exprSingle(); } } @@ -5232,26 +5206,26 @@ public final SwitchCaseClauseContext switchCaseClause() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(961); + setState(929); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(959); + setState(927); match(Kcase); - setState(960); + setState(928); ((SwitchCaseClauseContext)_localctx).exprSingle = exprSingle(); ((SwitchCaseClauseContext)_localctx).cond.add(((SwitchCaseClauseContext)_localctx).exprSingle); } } - setState(963); + setState(931); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(965); + setState(933); match(Kreturn); - setState(966); + setState(934); ((SwitchCaseClauseContext)_localctx).ret = exprSingle(); } } @@ -5308,44 +5282,44 @@ public final TypeSwitchExprContext typeSwitchExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(968); + setState(936); match(Ktypeswitch); - setState(969); + setState(937); match(T__7); - setState(970); + setState(938); ((TypeSwitchExprContext)_localctx).cond = expr(); - setState(971); + setState(939); match(T__8); - setState(973); + setState(941); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(972); + setState(940); ((TypeSwitchExprContext)_localctx).caseClause = caseClause(); ((TypeSwitchExprContext)_localctx).cses.add(((TypeSwitchExprContext)_localctx).caseClause); } } - setState(975); + setState(943); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(977); + setState(945); match(Kdefault); - setState(979); + setState(947); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__3) { { - setState(978); + setState(946); ((TypeSwitchExprContext)_localctx).var_ref = varRef(); } } - setState(981); + setState(949); match(Kreturn); - setState(982); + setState(950); ((TypeSwitchExprContext)_localctx).def = exprSingle(); } } @@ -5398,43 +5372,43 @@ public final CaseClauseContext caseClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(984); + setState(952); match(Kcase); - setState(988); + setState(956); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__3) { { - setState(985); + setState(953); ((CaseClauseContext)_localctx).var_ref = varRef(); - setState(986); + setState(954); match(Kas); } } - setState(990); + setState(958); ((CaseClauseContext)_localctx).sequenceType = sequenceType(); ((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType); - setState(995); + setState(963); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__10) { { { - setState(991); + setState(959); match(T__10); - setState(992); + setState(960); ((CaseClauseContext)_localctx).sequenceType = sequenceType(); ((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType); } } - setState(997); + setState(965); _errHandler.sync(this); _la = _input.LA(1); } - setState(998); + setState(966); match(Kreturn); - setState(999); + setState(967); ((CaseClauseContext)_localctx).ret = exprSingle(); } } @@ -5482,21 +5456,21 @@ public final IfExprContext ifExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1001); + setState(969); match(Kif); - setState(1002); + setState(970); match(T__7); - setState(1003); + setState(971); ((IfExprContext)_localctx).test_condition = expr(); - setState(1004); + setState(972); match(T__8); - setState(1005); + setState(973); match(Kthen); - setState(1006); + setState(974); ((IfExprContext)_localctx).branch = exprSingle(); - setState(1007); + setState(975); match(Kelse); - setState(1008); + setState(976); ((IfExprContext)_localctx).else_branch = exprSingle(); } } @@ -5543,15 +5517,15 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1010); + setState(978); match(Ktry); - setState(1011); + setState(979); match(T__5); - setState(1012); + setState(980); ((TryCatchExprContext)_localctx).try_expression = expr(); - setState(1013); + setState(981); match(T__6); - setState(1015); + setState(983); _errHandler.sync(this); _alt = 1; do { @@ -5559,7 +5533,7 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { case 1: { { - setState(1014); + setState(982); ((TryCatchExprContext)_localctx).catchClause = catchClause(); ((TryCatchExprContext)_localctx).catches.add(((TryCatchExprContext)_localctx).catchClause); } @@ -5568,7 +5542,7 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1017); + setState(985); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,81,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -5619,14 +5593,14 @@ public final CatchClauseContext catchClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1019); + setState(987); match(Kcatch); - setState(1022); + setState(990); _errHandler.sync(this); switch (_input.LA(1)) { case T__9: { - setState(1020); + setState(988); ((CatchClauseContext)_localctx).s10 = match(T__9); ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s10); } @@ -5706,7 +5680,7 @@ public final CatchClauseContext catchClause() throws RecognitionException { case NullLiteral: case NCName: { - setState(1021); + setState(989); ((CatchClauseContext)_localctx).qname = qname(); ((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname); } @@ -5714,20 +5688,20 @@ public final CatchClauseContext catchClause() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1031); + setState(999); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__10) { { { - setState(1024); + setState(992); match(T__10); - setState(1027); + setState(995); _errHandler.sync(this); switch (_input.LA(1)) { case T__9: { - setState(1025); + setState(993); ((CatchClauseContext)_localctx).s10 = match(T__9); ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s10); } @@ -5807,7 +5781,7 @@ public final CatchClauseContext catchClause() throws RecognitionException { case NullLiteral: case NCName: { - setState(1026); + setState(994); ((CatchClauseContext)_localctx).qname = qname(); ((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname); } @@ -5817,15 +5791,15 @@ public final CatchClauseContext catchClause() throws RecognitionException { } } } - setState(1033); + setState(1001); _errHandler.sync(this); _la = _input.LA(1); } - setState(1034); + setState(1002); match(T__5); - setState(1035); + setState(1003); ((CatchClauseContext)_localctx).catch_expression = expr(); - setState(1036); + setState(1004); match(T__6); } } @@ -5872,24 +5846,24 @@ public final OrExprContext orExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1038); + setState(1006); ((OrExprContext)_localctx).main_expr = andExpr(); - setState(1043); + setState(1011); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,85,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1039); + setState(1007); match(Kor); - setState(1040); + setState(1008); ((OrExprContext)_localctx).andExpr = andExpr(); ((OrExprContext)_localctx).rhs.add(((OrExprContext)_localctx).andExpr); } } } - setState(1045); + setState(1013); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,85,_ctx); } @@ -5938,24 +5912,24 @@ public final AndExprContext andExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1046); + setState(1014); ((AndExprContext)_localctx).main_expr = notExpr(); - setState(1051); + setState(1019); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,86,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1047); + setState(1015); match(Kand); - setState(1048); + setState(1016); ((AndExprContext)_localctx).notExpr = notExpr(); ((AndExprContext)_localctx).rhs.add(((AndExprContext)_localctx).notExpr); } } } - setState(1053); + setState(1021); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,86,_ctx); } @@ -5997,18 +5971,18 @@ public final NotExprContext notExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1055); + setState(1023); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: { - setState(1054); + setState(1022); ((NotExprContext)_localctx).Knot = match(Knot); ((NotExprContext)_localctx).op.add(((NotExprContext)_localctx).Knot); } break; } - setState(1057); + setState(1025); ((NotExprContext)_localctx).main_expr = comparisonExpr(); } } @@ -6065,14 +6039,14 @@ public final ComparisonExprContext comparisonExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1059); + setState(1027); ((ComparisonExprContext)_localctx).main_expr = stringConcatExpr(); - setState(1062); + setState(1030); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42))) != 0)) { { - setState(1060); + setState(1028); ((ComparisonExprContext)_localctx)._tset1828 = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42))) != 0)) ) { @@ -6084,7 +6058,7 @@ public final ComparisonExprContext comparisonExpr() throws RecognitionException consume(); } ((ComparisonExprContext)_localctx).op.add(((ComparisonExprContext)_localctx)._tset1828); - setState(1061); + setState(1029); ((ComparisonExprContext)_localctx).stringConcatExpr = stringConcatExpr(); ((ComparisonExprContext)_localctx).rhs.add(((ComparisonExprContext)_localctx).stringConcatExpr); } @@ -6131,22 +6105,22 @@ public final StringConcatExprContext stringConcatExpr() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1064); + setState(1032); ((StringConcatExprContext)_localctx).main_expr = rangeExpr(); - setState(1069); + setState(1037); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__43) { { { - setState(1065); + setState(1033); match(T__43); - setState(1066); + setState(1034); ((StringConcatExprContext)_localctx).rangeExpr = rangeExpr(); ((StringConcatExprContext)_localctx).rhs.add(((StringConcatExprContext)_localctx).rangeExpr); } } - setState(1071); + setState(1039); _errHandler.sync(this); _la = _input.LA(1); } @@ -6191,16 +6165,16 @@ public final RangeExprContext rangeExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1072); + setState(1040); ((RangeExprContext)_localctx).main_expr = additiveExpr(); - setState(1075); + setState(1043); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: { - setState(1073); + setState(1041); match(Kto); - setState(1074); + setState(1042); ((RangeExprContext)_localctx).additiveExpr = additiveExpr(); ((RangeExprContext)_localctx).rhs.add(((RangeExprContext)_localctx).additiveExpr); } @@ -6252,16 +6226,16 @@ public final AdditiveExprContext additiveExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1077); + setState(1045); ((AdditiveExprContext)_localctx).main_expr = multiplicativeExpr(); - setState(1082); + setState(1050); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,91,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1078); + setState(1046); ((AdditiveExprContext)_localctx)._tset1937 = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__44 || _la==T__45) ) { @@ -6273,13 +6247,13 @@ public final AdditiveExprContext additiveExpr() throws RecognitionException { consume(); } ((AdditiveExprContext)_localctx).op.add(((AdditiveExprContext)_localctx)._tset1937); - setState(1079); + setState(1047); ((AdditiveExprContext)_localctx).multiplicativeExpr = multiplicativeExpr(); ((AdditiveExprContext)_localctx).rhs.add(((AdditiveExprContext)_localctx).multiplicativeExpr); } } } - setState(1084); + setState(1052); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,91,_ctx); } @@ -6328,39 +6302,36 @@ public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionEx enterRule(_localctx, 152, RULE_multiplicativeExpr); int _la; try { - int _alt; enterOuterAlt(_localctx, 1); { - setState(1085); + setState(1053); ((MultiplicativeExprContext)_localctx).main_expr = instanceOfExpr(); - setState(1090); + setState(1058); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,92,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(1086); - ((MultiplicativeExprContext)_localctx)._tset1965 = _input.LT(1); - _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) ) { - ((MultiplicativeExprContext)_localctx)._tset1965 = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1965); - setState(1087); - ((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr(); - ((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr); - } - } + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) { + { + { + setState(1054); + ((MultiplicativeExprContext)_localctx)._tset1965 = _input.LT(1); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) ) { + ((MultiplicativeExprContext)_localctx)._tset1965 = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1965); + setState(1055); + ((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr(); + ((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr); + } } - setState(1092); + setState(1060); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,92,_ctx); + _la = _input.LA(1); } } } @@ -6403,18 +6374,18 @@ public final InstanceOfExprContext instanceOfExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1093); + setState(1061); ((InstanceOfExprContext)_localctx).main_expr = isStaticallyExpr(); - setState(1097); + setState(1065); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: { - setState(1094); + setState(1062); match(Kinstance); - setState(1095); + setState(1063); match(Kof); - setState(1096); + setState(1064); ((InstanceOfExprContext)_localctx).seq = sequenceType(); } break; @@ -6460,18 +6431,18 @@ public final IsStaticallyExprContext isStaticallyExpr() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1099); + setState(1067); ((IsStaticallyExprContext)_localctx).main_expr = treatExpr(); - setState(1103); + setState(1071); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) { case 1: { - setState(1100); + setState(1068); match(Kis); - setState(1101); + setState(1069); match(Kstatically); - setState(1102); + setState(1070); ((IsStaticallyExprContext)_localctx).seq = sequenceType(); } break; @@ -6517,18 +6488,18 @@ public final TreatExprContext treatExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1105); + setState(1073); ((TreatExprContext)_localctx).main_expr = castableExpr(); - setState(1109); + setState(1077); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { case 1: { - setState(1106); + setState(1074); match(Ktreat); - setState(1107); + setState(1075); match(Kas); - setState(1108); + setState(1076); ((TreatExprContext)_localctx).seq = sequenceType(); } break; @@ -6574,18 +6545,18 @@ public final CastableExprContext castableExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1111); + setState(1079); ((CastableExprContext)_localctx).main_expr = castExpr(); - setState(1115); + setState(1083); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { case 1: { - setState(1112); + setState(1080); match(Kcastable); - setState(1113); + setState(1081); match(Kas); - setState(1114); + setState(1082); ((CastableExprContext)_localctx).single = singleType(); } break; @@ -6631,18 +6602,18 @@ public final CastExprContext castExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1117); + setState(1085); ((CastExprContext)_localctx).main_expr = arrowExpr(); - setState(1121); + setState(1089); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { case 1: { - setState(1118); + setState(1086); match(Kcast); - setState(1119); + setState(1087); match(Kas); - setState(1120); + setState(1088); ((CastExprContext)_localctx).single = singleType(); } break; @@ -6699,9 +6670,9 @@ public final ArrowExprContext arrowExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1123); + setState(1091); ((ArrowExprContext)_localctx).main_expr = unaryExpr(); - setState(1132); + setState(1100); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,98,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -6709,21 +6680,21 @@ public final ArrowExprContext arrowExpr() throws RecognitionException { { { { - setState(1124); + setState(1092); match(T__2); - setState(1125); + setState(1093); match(T__41); } - setState(1127); + setState(1095); ((ArrowExprContext)_localctx).arrowFunctionSpecifier = arrowFunctionSpecifier(); ((ArrowExprContext)_localctx).function.add(((ArrowExprContext)_localctx).arrowFunctionSpecifier); - setState(1128); + setState(1096); ((ArrowExprContext)_localctx).argumentList = argumentList(); ((ArrowExprContext)_localctx).arguments.add(((ArrowExprContext)_localctx).argumentList); } } } - setState(1134); + setState(1102); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,98,_ctx); } @@ -6765,7 +6736,7 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog ArrowFunctionSpecifierContext _localctx = new ArrowFunctionSpecifierContext(_ctx, getState()); enterRule(_localctx, 166, RULE_arrowFunctionSpecifier); try { - setState(1138); + setState(1106); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -6844,21 +6815,21 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog case NCName: enterOuterAlt(_localctx, 1); { - setState(1135); + setState(1103); qname(); } break; case T__3: enterOuterAlt(_localctx, 2); { - setState(1136); + setState(1104); varRef(); } break; case T__7: enterOuterAlt(_localctx, 3); { - setState(1137); + setState(1105); parenthesizedExpr(); } break; @@ -6904,13 +6875,13 @@ public final UnaryExprContext unaryExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1143); + setState(1111); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__44 || _la==T__45) { { { - setState(1140); + setState(1108); ((UnaryExprContext)_localctx)._tset2144 = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__44 || _la==T__45) ) { @@ -6924,11 +6895,11 @@ public final UnaryExprContext unaryExpr() throws RecognitionException { ((UnaryExprContext)_localctx).op.add(((UnaryExprContext)_localctx)._tset2144); } } - setState(1145); + setState(1113); _errHandler.sync(this); _la = _input.LA(1); } - setState(1146); + setState(1114); ((UnaryExprContext)_localctx).main_expr = valueExpr(); } } @@ -6971,27 +6942,27 @@ public final ValueExprContext valueExpr() throws RecognitionException { ValueExprContext _localctx = new ValueExprContext(_ctx, getState()); enterRule(_localctx, 170, RULE_valueExpr); try { - setState(1151); + setState(1119); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1148); + setState(1116); ((ValueExprContext)_localctx).simpleMap_expr = simpleMapExpr(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1149); + setState(1117); ((ValueExprContext)_localctx).validate_expr = validateExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1150); + setState(1118); ((ValueExprContext)_localctx).annotate_expr = annotateExpr(); } break; @@ -7034,17 +7005,17 @@ public final ValidateExprContext validateExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1153); + setState(1121); match(Kvalidate); - setState(1154); + setState(1122); match(Ktype); - setState(1155); + setState(1123); sequenceType(); - setState(1156); + setState(1124); match(T__5); - setState(1157); + setState(1125); expr(); - setState(1158); + setState(1126); match(T__6); } } @@ -7085,17 +7056,17 @@ public final AnnotateExprContext annotateExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1160); + setState(1128); match(Kannotate); - setState(1161); + setState(1129); match(Ktype); - setState(1162); + setState(1130); sequenceType(); - setState(1163); + setState(1131); match(T__5); - setState(1164); + setState(1132); expr(); - setState(1165); + setState(1133); match(T__6); } } @@ -7138,22 +7109,22 @@ public final SimpleMapExprContext simpleMapExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1167); + setState(1135); ((SimpleMapExprContext)_localctx).main_expr = pathExpr(); - setState(1172); + setState(1140); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__49) { { { - setState(1168); + setState(1136); match(T__49); - setState(1169); + setState(1137); ((SimpleMapExprContext)_localctx).pathExpr = pathExpr(); ((SimpleMapExprContext)_localctx).map_expr.add(((SimpleMapExprContext)_localctx).pathExpr); } } - setState(1174); + setState(1142); _errHandler.sync(this); _la = _input.LA(1); } @@ -7223,51 +7194,51 @@ public final PostFixExprContext postFixExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1175); + setState(1143); ((PostFixExprContext)_localctx).main_expr = primaryExpr(); - setState(1183); + setState(1151); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,104,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { - setState(1181); + setState(1149); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { case 1: { - setState(1176); + setState(1144); arrayLookup(); } break; case 2: { - setState(1177); + setState(1145); predicate(); } break; case 3: { - setState(1178); + setState(1146); objectLookup(); } break; case 4: { - setState(1179); + setState(1147); arrayUnboxing(); } break; case 5: { - setState(1180); + setState(1148); argumentList(); } break; } } } - setState(1185); + setState(1153); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,104,_ctx); } @@ -7305,15 +7276,15 @@ public final ArrayLookupContext arrayLookup() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1186); + setState(1154); match(T__50); - setState(1187); + setState(1155); match(T__50); - setState(1188); + setState(1156); expr(); - setState(1189); + setState(1157); match(T__51); - setState(1190); + setState(1158); match(T__51); } } @@ -7346,9 +7317,9 @@ public final ArrayUnboxingContext arrayUnboxing() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1192); + setState(1160); match(T__50); - setState(1193); + setState(1161); match(T__51); } } @@ -7384,11 +7355,11 @@ public final PredicateContext predicate() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1195); + setState(1163); match(T__50); - setState(1196); + setState(1164); expr(); - setState(1197); + setState(1165); match(T__51); } } @@ -7443,9 +7414,9 @@ public final ObjectLookupContext objectLookup() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1199); + setState(1167); match(T__52); - setState(1206); + setState(1174); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -7522,37 +7493,37 @@ public final ObjectLookupContext objectLookup() throws RecognitionException { case Kwhile: case NullLiteral: { - setState(1200); + setState(1168); ((ObjectLookupContext)_localctx).kw = keyWords(); } break; case STRING: { - setState(1201); + setState(1169); ((ObjectLookupContext)_localctx).lt = stringLiteral(); } break; case NCName: { - setState(1202); + setState(1170); ((ObjectLookupContext)_localctx).nc = match(NCName); } break; case T__7: { - setState(1203); + setState(1171); ((ObjectLookupContext)_localctx).pe = parenthesizedExpr(); } break; case T__3: { - setState(1204); + setState(1172); ((ObjectLookupContext)_localctx).vr = varRef(); } break; case T__53: { - setState(1205); + setState(1173); ((ObjectLookupContext)_localctx).ci = contextItemExpr(); } break; @@ -7625,111 +7596,111 @@ public final PrimaryExprContext primaryExpr() throws RecognitionException { PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, getState()); enterRule(_localctx, 188, RULE_primaryExpr); try { - setState(1223); + setState(1191); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1208); + setState(1176); match(NullLiteral); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1209); + setState(1177); match(Ktrue); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1210); + setState(1178); match(Kfalse); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1211); + setState(1179); match(Literal); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1212); + setState(1180); stringLiteral(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1213); + setState(1181); varRef(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1214); + setState(1182); parenthesizedExpr(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1215); + setState(1183); contextItemExpr(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1216); + setState(1184); objectConstructor(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1217); + setState(1185); functionCall(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1218); + setState(1186); orderedExpr(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1219); + setState(1187); unorderedExpr(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1220); + setState(1188); arrayConstructor(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1221); + setState(1189); functionItemExpr(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1222); + setState(1190); blockExpr(); } break; @@ -7767,11 +7738,11 @@ public final BlockExprContext blockExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1225); + setState(1193); match(T__5); - setState(1226); + setState(1194); statementsAndExpr(); - setState(1227); + setState(1195); match(T__6); } } @@ -7808,9 +7779,9 @@ public final VarRefContext varRef() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1229); + setState(1197); match(T__3); - setState(1230); + setState(1198); ((VarRefContext)_localctx).var_name = qname(); } } @@ -7847,19 +7818,19 @@ public final ParenthesizedExprContext parenthesizedExpr() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1232); + setState(1200); match(T__7); - setState(1234); + setState(1202); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { { - setState(1233); + setState(1201); expr(); } } - setState(1236); + setState(1204); match(T__8); } } @@ -7892,7 +7863,7 @@ public final ContextItemExprContext contextItemExpr() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1238); + setState(1206); match(T__53); } } @@ -7928,13 +7899,13 @@ public final OrderedExprContext orderedExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1240); + setState(1208); match(T__14); - setState(1241); + setState(1209); match(T__5); - setState(1242); + setState(1210); expr(); - setState(1243); + setState(1211); match(T__6); } } @@ -7971,13 +7942,13 @@ public final UnorderedExprContext unorderedExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1245); + setState(1213); match(Kunordered); - setState(1246); + setState(1214); match(T__5); - setState(1247); + setState(1215); expr(); - setState(1248); + setState(1216); match(T__6); } } @@ -8017,9 +7988,9 @@ public final FunctionCallContext functionCall() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1250); + setState(1218); ((FunctionCallContext)_localctx).fn_name = qname(); - setState(1251); + setState(1219); argumentList(); } } @@ -8061,34 +8032,34 @@ public final ArgumentListContext argumentList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1253); + setState(1221); match(T__7); - setState(1260); + setState(1228); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (STRING - 128)) | (1L << (ArgumentPlaceholder - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (ArgumentPlaceholder - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { { { - setState(1254); + setState(1222); ((ArgumentListContext)_localctx).argument = argument(); ((ArgumentListContext)_localctx).args.add(((ArgumentListContext)_localctx).argument); - setState(1256); + setState(1224); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__12) { { - setState(1255); + setState(1223); match(T__12); } } } } - setState(1262); + setState(1230); _errHandler.sync(this); _la = _input.LA(1); } - setState(1263); + setState(1231); match(T__8); } } @@ -8123,13 +8094,12 @@ public final ArgumentContext argument() throws RecognitionException { ArgumentContext _localctx = new ArgumentContext(_ctx, getState()); enterRule(_localctx, 206, RULE_argument); try { - setState(1267); + setState(1235); _errHandler.sync(this); switch (_input.LA(1)) { case T__3: case T__5: case T__7: - case T__9: case T__11: case T__14: case T__28: @@ -8205,13 +8175,6 @@ public final ArgumentContext argument() throws RecognitionException { case Kjson: case Kwith: case Kposition: - case Kbreak: - case Kloop: - case Kcontinue: - case Kexit: - case Kreturning: - case Kwhile: - case Kelement: case Kslash: case Kdslash: case Kat_symbol: @@ -8227,34 +8190,26 @@ public final ArgumentContext argument() throws RecognitionException { case Kpreceding_sibling: case Kpreceding: case Kancestor_or_self: - case Knode: - case Kbinary: - case Kdocument_node: - case Ktext: - case Kpi: - case Knamespace_node: - case Kschema_attribute: - case Kschema_element: - case Karray_node: - case Kboolean_node: - case Knull_node: - case Knumber_node: - case Kobject_node: - case Kcomment: + case Kbreak: + case Kloop: + case Kcontinue: + case Kexit: + case Kreturning: + case Kwhile: case STRING: case NullLiteral: case Literal: case NCName: enterOuterAlt(_localctx, 1); { - setState(1265); + setState(1233); exprSingle(); } break; case ArgumentPlaceholder: enterOuterAlt(_localctx, 2); { - setState(1266); + setState(1234); match(ArgumentPlaceholder); } break; @@ -8295,7 +8250,7 @@ public final FunctionItemExprContext functionItemExpr() throws RecognitionExcept FunctionItemExprContext _localctx = new FunctionItemExprContext(_ctx, getState()); enterRule(_localctx, 208, RULE_functionItemExpr); try { - setState(1271); + setState(1239); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -8374,7 +8329,7 @@ public final FunctionItemExprContext functionItemExpr() throws RecognitionExcept case NCName: enterOuterAlt(_localctx, 1); { - setState(1269); + setState(1237); namedFunctionRef(); } break; @@ -8382,7 +8337,7 @@ public final FunctionItemExprContext functionItemExpr() throws RecognitionExcept case T__28: enterOuterAlt(_localctx, 2); { - setState(1270); + setState(1238); inlineFunctionExpr(); } break; @@ -8425,11 +8380,11 @@ public final NamedFunctionRefContext namedFunctionRef() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1273); + setState(1241); ((NamedFunctionRefContext)_localctx).fn_name = qname(); - setState(1274); + setState(1242); match(T__54); - setState(1275); + setState(1243); ((NamedFunctionRefContext)_localctx).arity = match(Literal); } } @@ -8478,44 +8433,44 @@ public final InlineFunctionExprContext inlineFunctionExpr() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(1277); + setState(1245); annotations(); - setState(1278); + setState(1246); match(T__28); - setState(1279); + setState(1247); match(T__7); - setState(1281); + setState(1249); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__3) { { - setState(1280); + setState(1248); paramList(); } } - setState(1283); + setState(1251); match(T__8); - setState(1286); + setState(1254); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(1284); + setState(1252); match(Kas); - setState(1285); + setState(1253); ((InlineFunctionExprContext)_localctx).return_type = sequenceType(); } } { - setState(1288); + setState(1256); match(T__5); { - setState(1289); + setState(1257); ((InlineFunctionExprContext)_localctx).fn_body = statementsAndOptionalExpr(); } - setState(1290); + setState(1258); match(T__6); } } @@ -8568,32 +8523,32 @@ public final InsertExprContext insertExpr() throws RecognitionException { enterRule(_localctx, 214, RULE_insertExpr); int _la; try { - setState(1315); + setState(1283); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1292); + setState(1260); match(Kinsert); - setState(1293); + setState(1261); match(Kjson); - setState(1294); + setState(1262); ((InsertExprContext)_localctx).to_insert_expr = exprSingle(); - setState(1295); + setState(1263); match(Kinto); - setState(1296); + setState(1264); ((InsertExprContext)_localctx).main_expr = exprSingle(); - setState(1300); + setState(1268); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) { case 1: { - setState(1297); + setState(1265); match(Kat); - setState(1298); + setState(1266); match(Kposition); - setState(1299); + setState(1267); ((InsertExprContext)_localctx).pos_expr = exprSingle(); } break; @@ -8603,31 +8558,31 @@ public final InsertExprContext insertExpr() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(1302); + setState(1270); match(Kinsert); - setState(1303); + setState(1271); match(Kjson); - setState(1304); + setState(1272); pairConstructor(); - setState(1309); + setState(1277); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(1305); + setState(1273); match(T__12); - setState(1306); + setState(1274); pairConstructor(); } } - setState(1311); + setState(1279); _errHandler.sync(this); _la = _input.LA(1); } - setState(1312); + setState(1280); match(Kinto); - setState(1313); + setState(1281); ((InsertExprContext)_localctx).main_expr = exprSingle(); } break; @@ -8667,11 +8622,11 @@ public final DeleteExprContext deleteExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1317); + setState(1285); match(Kdelete); - setState(1318); + setState(1286); match(Kjson); - setState(1319); + setState(1287); updateLocator(); } } @@ -8714,15 +8669,15 @@ public final RenameExprContext renameExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1321); + setState(1289); match(Krename); - setState(1322); + setState(1290); match(Kjson); - setState(1323); + setState(1291); updateLocator(); - setState(1324); + setState(1292); match(Kas); - setState(1325); + setState(1293); ((RenameExprContext)_localctx).name_expr = exprSingle(); } } @@ -8740,9 +8695,9 @@ public final RenameExprContext renameExpr() throws RecognitionException { public static class ReplaceExprContext extends ParserRuleContext { public ExprSingleContext replacer_expr; public TerminalNode Kreplace() { return getToken(JsoniqParser.Kreplace, 0); } - public TerminalNode Kjson() { return getToken(JsoniqParser.Kjson, 0); } public TerminalNode Kvalue() { return getToken(JsoniqParser.Kvalue, 0); } public TerminalNode Kof() { return getToken(JsoniqParser.Kof, 0); } + public TerminalNode Kjson() { return getToken(JsoniqParser.Kjson, 0); } public UpdateLocatorContext updateLocator() { return getRuleContext(UpdateLocatorContext.class,0); } @@ -8767,19 +8722,19 @@ public final ReplaceExprContext replaceExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1327); + setState(1295); match(Kreplace); - setState(1328); - match(Kjson); - setState(1329); + setState(1296); match(Kvalue); - setState(1330); + setState(1297); match(Kof); - setState(1331); + setState(1298); + match(Kjson); + setState(1299); updateLocator(); - setState(1332); + setState(1300); match(Kwith); - setState(1333); + setState(1301); ((ReplaceExprContext)_localctx).replacer_expr = exprSingle(); } } @@ -8798,7 +8753,6 @@ public static class TransformExprContext extends ParserRuleContext { public ExprSingleContext mod_expr; public ExprSingleContext ret_expr; public TerminalNode Kcopy() { return getToken(JsoniqParser.Kcopy, 0); } - public TerminalNode Kjson() { return getToken(JsoniqParser.Kjson, 0); } public List copyDecl() { return getRuleContexts(CopyDeclContext.class); } @@ -8831,35 +8785,33 @@ public final TransformExprContext transformExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1335); + setState(1303); match(Kcopy); - setState(1336); - match(Kjson); - setState(1337); + setState(1304); copyDecl(); - setState(1342); + setState(1309); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(1338); + setState(1305); match(T__12); - setState(1339); + setState(1306); copyDecl(); } } - setState(1344); + setState(1311); _errHandler.sync(this); _la = _input.LA(1); } - setState(1345); + setState(1312); match(Kmodify); - setState(1346); + setState(1313); ((TransformExprContext)_localctx).mod_expr = exprSingle(); - setState(1347); + setState(1314); match(Kreturn); - setState(1348); + setState(1315); ((TransformExprContext)_localctx).ret_expr = exprSingle(); } } @@ -8903,15 +8855,15 @@ public final AppendExprContext appendExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1350); + setState(1317); match(Kappend); - setState(1351); + setState(1318); match(Kjson); - setState(1352); + setState(1319); ((AppendExprContext)_localctx).to_append_expr = exprSingle(); - setState(1353); + setState(1320); match(Kinto); - setState(1354); + setState(1321); ((AppendExprContext)_localctx).array_expr = exprSingle(); } } @@ -8961,27 +8913,27 @@ public final UpdateLocatorContext updateLocator() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1356); + setState(1323); ((UpdateLocatorContext)_localctx).main_expr = primaryExpr(); - setState(1359); + setState(1326); _errHandler.sync(this); _alt = 1; do { switch (_alt) { case 1: { - setState(1359); + setState(1326); _errHandler.sync(this); switch (_input.LA(1)) { case T__50: { - setState(1357); + setState(1324); arrayLookup(); } break; case T__52: { - setState(1358); + setState(1325); objectLookup(); } break; @@ -8993,7 +8945,7 @@ public final UpdateLocatorContext updateLocator() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1361); + setState(1328); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,119,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -9036,11 +8988,11 @@ public final CopyDeclContext copyDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1363); + setState(1330); ((CopyDeclContext)_localctx).var_ref = varRef(); - setState(1364); + setState(1331); match(T__4); - setState(1365); + setState(1332); ((CopyDeclContext)_localctx).src_expr = exprSingle(); } } @@ -9055,199 +9007,45 @@ public final CopyDeclContext copyDecl() throws RecognitionException { return _localctx; } - public static class SchemaImportContext extends ParserRuleContext { - public UriLiteralContext nsURI; - public UriLiteralContext uriLiteral; - public List locations = new ArrayList(); - public TerminalNode Kimport() { return getToken(JsoniqParser.Kimport, 0); } - public TerminalNode Kschema() { return getToken(JsoniqParser.Kschema, 0); } - public List uriLiteral() { - return getRuleContexts(UriLiteralContext.class); - } - public UriLiteralContext uriLiteral(int i) { - return getRuleContext(UriLiteralContext.class,i); - } - public SchemaPrefixContext schemaPrefix() { - return getRuleContext(SchemaPrefixContext.class,0); + public static class PathExprContext extends ParserRuleContext { + public RelativePathExprContext singleslash; + public RelativePathExprContext doubleslash; + public RelativePathExprContext relative; + public TerminalNode Kslash() { return getToken(JsoniqParser.Kslash, 0); } + public RelativePathExprContext relativePathExpr() { + return getRuleContext(RelativePathExprContext.class,0); } - public TerminalNode Kat() { return getToken(JsoniqParser.Kat, 0); } - public SchemaImportContext(ParserRuleContext parent, int invokingState) { + public TerminalNode Kdslash() { return getToken(JsoniqParser.Kdslash, 0); } + public PathExprContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_schemaImport; } + @Override public int getRuleIndex() { return RULE_pathExpr; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitSchemaImport(this); + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitPathExpr(this); else return visitor.visitChildren(this); } } - public final SchemaImportContext schemaImport() throws RecognitionException { - SchemaImportContext _localctx = new SchemaImportContext(_ctx, getState()); - enterRule(_localctx, 230, RULE_schemaImport); - int _la; + public final PathExprContext pathExpr() throws RecognitionException { + PathExprContext _localctx = new PathExprContext(_ctx, getState()); + enterRule(_localctx, 230, RULE_pathExpr); try { - enterOuterAlt(_localctx, 1); - { - setState(1367); - match(Kimport); - setState(1368); - match(Kschema); - setState(1370); + setState(1341); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==Kdefault || _la==Knamespace) { + switch (_input.LA(1)) { + case Kslash: + enterOuterAlt(_localctx, 1); { - setState(1369); - schemaPrefix(); - } - } - - setState(1372); - ((SchemaImportContext)_localctx).nsURI = uriLiteral(); - setState(1382); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==Kat) { - { - setState(1373); - match(Kat); - setState(1374); - ((SchemaImportContext)_localctx).uriLiteral = uriLiteral(); - ((SchemaImportContext)_localctx).locations.add(((SchemaImportContext)_localctx).uriLiteral); - setState(1379); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==T__12) { - { - { - setState(1375); - match(T__12); - setState(1376); - ((SchemaImportContext)_localctx).uriLiteral = uriLiteral(); - ((SchemaImportContext)_localctx).locations.add(((SchemaImportContext)_localctx).uriLiteral); - } - } - setState(1381); - _errHandler.sync(this); - _la = _input.LA(1); - } - } - } - - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class SchemaPrefixContext extends ParserRuleContext { - public TerminalNode Knamespace() { return getToken(JsoniqParser.Knamespace, 0); } - public TerminalNode NCName() { return getToken(JsoniqParser.NCName, 0); } - public TerminalNode Kdefault() { return getToken(JsoniqParser.Kdefault, 0); } - public TerminalNode Kelement() { return getToken(JsoniqParser.Kelement, 0); } - public SchemaPrefixContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_schemaPrefix; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitSchemaPrefix(this); - else return visitor.visitChildren(this); - } - } - - public final SchemaPrefixContext schemaPrefix() throws RecognitionException { - SchemaPrefixContext _localctx = new SchemaPrefixContext(_ctx, getState()); - enterRule(_localctx, 232, RULE_schemaPrefix); - try { - enterOuterAlt(_localctx, 1); - { - setState(1390); - _errHandler.sync(this); - switch (_input.LA(1)) { - case Knamespace: - { - setState(1384); - match(Knamespace); - setState(1385); - match(NCName); - setState(1386); - match(T__2); - } - break; - case Kdefault: - { - setState(1387); - match(Kdefault); - setState(1388); - match(Kelement); - setState(1389); - match(Knamespace); - } - break; - default: - throw new NoViableAltException(this); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class PathExprContext extends ParserRuleContext { - public RelativePathExprContext singleslash; - public RelativePathExprContext doubleslash; - public RelativePathExprContext relative; - public TerminalNode Kslash() { return getToken(JsoniqParser.Kslash, 0); } - public RelativePathExprContext relativePathExpr() { - return getRuleContext(RelativePathExprContext.class,0); - } - public TerminalNode Kdslash() { return getToken(JsoniqParser.Kdslash, 0); } - public PathExprContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_pathExpr; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitPathExpr(this); - else return visitor.visitChildren(this); - } - } - - public final PathExprContext pathExpr() throws RecognitionException { - PathExprContext _localctx = new PathExprContext(_ctx, getState()); - enterRule(_localctx, 234, RULE_pathExpr); - try { - setState(1399); - _errHandler.sync(this); - switch (_input.LA(1)) { - case Kslash: - enterOuterAlt(_localctx, 1); { - { - setState(1392); + setState(1334); match(Kslash); - setState(1394); + setState(1336); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) { case 1: { - setState(1393); + setState(1335); ((PathExprContext)_localctx).singleslash = relativePathExpr(); } break; @@ -9259,9 +9057,9 @@ public final PathExprContext pathExpr() throws RecognitionException { enterOuterAlt(_localctx, 2); { { - setState(1396); + setState(1338); match(Kdslash); - setState(1397); + setState(1339); ((PathExprContext)_localctx).doubleslash = relativePathExpr(); } } @@ -9269,7 +9067,6 @@ public final PathExprContext pathExpr() throws RecognitionException { case T__3: case T__5: case T__7: - case T__9: case T__11: case T__14: case T__28: @@ -9343,13 +9140,6 @@ public final PathExprContext pathExpr() throws RecognitionException { case Kjson: case Kwith: case Kposition: - case Kbreak: - case Kloop: - case Kcontinue: - case Kexit: - case Kreturning: - case Kwhile: - case Kelement: case Kat_symbol: case Kchild: case Kdescendant: @@ -9363,27 +9153,19 @@ public final PathExprContext pathExpr() throws RecognitionException { case Kpreceding_sibling: case Kpreceding: case Kancestor_or_self: - case Knode: - case Kbinary: - case Kdocument_node: - case Ktext: - case Kpi: - case Knamespace_node: - case Kschema_attribute: - case Kschema_element: - case Karray_node: - case Kboolean_node: - case Knull_node: - case Knumber_node: - case Kobject_node: - case Kcomment: + case Kbreak: + case Kloop: + case Kcontinue: + case Kexit: + case Kreturning: + case Kwhile: case STRING: case NullLiteral: case Literal: case NCName: enterOuterAlt(_localctx, 3); { - setState(1398); + setState(1340); ((PathExprContext)_localctx).relative = relativePathExpr(); } break; @@ -9406,7 +9188,7 @@ public static class RelativePathExprContext extends ParserRuleContext { public Token Kslash; public List sep = new ArrayList(); public Token Kdslash; - public Token _tset2889; + public Token _tset2808; public List stepExpr() { return getRuleContexts(StepExprContext.class); } @@ -9434,41 +9216,41 @@ public T accept(ParseTreeVisitor visitor) { public final RelativePathExprContext relativePathExpr() throws RecognitionException { RelativePathExprContext _localctx = new RelativePathExprContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_relativePathExpr); + enterRule(_localctx, 232, RULE_relativePathExpr); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1401); + setState(1343); stepExpr(); - setState(1406); + setState(1348); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,126,_ctx); + _alt = getInterpreter().adaptivePredict(_input,122,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1402); - ((RelativePathExprContext)_localctx)._tset2889 = _input.LT(1); + setState(1344); + ((RelativePathExprContext)_localctx)._tset2808 = _input.LT(1); _la = _input.LA(1); if ( !(_la==Kslash || _la==Kdslash) ) { - ((RelativePathExprContext)_localctx)._tset2889 = (Token)_errHandler.recoverInline(this); + ((RelativePathExprContext)_localctx)._tset2808 = (Token)_errHandler.recoverInline(this); } else { if ( _input.LA(1)==Token.EOF ) matchedEOF = true; _errHandler.reportMatch(this); consume(); } - ((RelativePathExprContext)_localctx).sep.add(((RelativePathExprContext)_localctx)._tset2889); - setState(1403); + ((RelativePathExprContext)_localctx).sep.add(((RelativePathExprContext)_localctx)._tset2808); + setState(1345); stepExpr(); } } } - setState(1408); + setState(1350); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,126,_ctx); + _alt = getInterpreter().adaptivePredict(_input,122,_ctx); } } } @@ -9503,80 +9285,20 @@ public T accept(ParseTreeVisitor visitor) { public final StepExprContext stepExpr() throws RecognitionException { StepExprContext _localctx = new StepExprContext(_ctx, getState()); - enterRule(_localctx, 238, RULE_stepExpr); - try { - setState(1411); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(1409); - postFixExpr(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(1410); - axisStep(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class AxisStepContext extends ParserRuleContext { - public PredicateListContext predicateList() { - return getRuleContext(PredicateListContext.class,0); - } - public ReverseStepContext reverseStep() { - return getRuleContext(ReverseStepContext.class,0); - } - public ForwardStepContext forwardStep() { - return getRuleContext(ForwardStepContext.class,0); - } - public AxisStepContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_axisStep; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAxisStep(this); - else return visitor.visitChildren(this); - } - } - - public final AxisStepContext axisStep() throws RecognitionException { - AxisStepContext _localctx = new AxisStepContext(_ctx, getState()); - enterRule(_localctx, 240, RULE_axisStep); + enterRule(_localctx, 234, RULE_stepExpr); try { - enterOuterAlt(_localctx, 1); - { - setState(1415); + setState(1353); _errHandler.sync(this); switch (_input.LA(1)) { - case T__55: - case Kparent: - case Kancestor: - case Kpreceding_sibling: - case Kpreceding: - case Kancestor_or_self: - { - setState(1413); - reverseStep(); - } - break; - case T__9: + case T__3: + case T__5: + case T__7: + case T__11: + case T__14: + case T__28: + case T__50: + case T__53: + case T__56: case Kfor: case Klet: case Kwhere: @@ -9649,7 +9371,17 @@ public final AxisStepContext axisStep() throws RecognitionException { case Kexit: case Kreturning: case Kwhile: - case Kelement: + case STRING: + case NullLiteral: + case Literal: + case NCName: + enterOuterAlt(_localctx, 1); + { + setState(1351); + postFixExpr(); + } + break; + case T__55: case Kat_symbol: case Kchild: case Kdescendant: @@ -9658,33 +9390,20 @@ public final AxisStepContext axisStep() throws RecognitionException { case Kdescendant_or_self: case Kfollowing_sibling: case Kfollowing: - case Knode: - case Kbinary: - case Kdocument_node: - case Ktext: - case Kpi: - case Knamespace_node: - case Kschema_attribute: - case Kschema_element: - case Karray_node: - case Kboolean_node: - case Knull_node: - case Knumber_node: - case Kobject_node: - case Kcomment: - case NullLiteral: - case NCName: + case Kparent: + case Kancestor: + case Kpreceding_sibling: + case Kpreceding: + case Kancestor_or_self: + enterOuterAlt(_localctx, 2); { - setState(1414); - forwardStep(); + setState(1352); + axisStep(); } break; default: throw new NoViableAltException(this); } - setState(1417); - predicateList(); - } } catch (RecognitionException re) { _localctx.exception = re; @@ -9697,14 +9416,86 @@ public final AxisStepContext axisStep() throws RecognitionException { return _localctx; } - public static class ForwardStepContext extends ParserRuleContext { - public ForwardAxisContext forwardAxis() { - return getRuleContext(ForwardAxisContext.class,0); + public static class AxisStepContext extends ParserRuleContext { + public PredicateListContext predicateList() { + return getRuleContext(PredicateListContext.class,0); } - public NodeTestContext nodeTest() { - return getRuleContext(NodeTestContext.class,0); + public ReverseStepContext reverseStep() { + return getRuleContext(ReverseStepContext.class,0); } - public AbbrevForwardStepContext abbrevForwardStep() { + public ForwardStepContext forwardStep() { + return getRuleContext(ForwardStepContext.class,0); + } + public AxisStepContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_axisStep; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAxisStep(this); + else return visitor.visitChildren(this); + } + } + + public final AxisStepContext axisStep() throws RecognitionException { + AxisStepContext _localctx = new AxisStepContext(_ctx, getState()); + enterRule(_localctx, 236, RULE_axisStep); + try { + enterOuterAlt(_localctx, 1); + { + setState(1357); + _errHandler.sync(this); + switch (_input.LA(1)) { + case T__55: + case Kparent: + case Kancestor: + case Kpreceding_sibling: + case Kpreceding: + case Kancestor_or_self: + { + setState(1355); + reverseStep(); + } + break; + case Kat_symbol: + case Kchild: + case Kdescendant: + case Kattribute: + case Kself: + case Kdescendant_or_self: + case Kfollowing_sibling: + case Kfollowing: + { + setState(1356); + forwardStep(); + } + break; + default: + throw new NoViableAltException(this); + } + setState(1359); + predicateList(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ForwardStepContext extends ParserRuleContext { + public ForwardAxisContext forwardAxis() { + return getRuleContext(ForwardAxisContext.class,0); + } + public NodeTestContext nodeTest() { + return getRuleContext(NodeTestContext.class,0); + } + public AbbrevForwardStepContext abbrevForwardStep() { return getRuleContext(AbbrevForwardStepContext.class,0); } public ForwardStepContext(ParserRuleContext parent, int invokingState) { @@ -9720,29 +9511,37 @@ public T accept(ParseTreeVisitor visitor) { public final ForwardStepContext forwardStep() throws RecognitionException { ForwardStepContext _localctx = new ForwardStepContext(_ctx, getState()); - enterRule(_localctx, 242, RULE_forwardStep); + enterRule(_localctx, 238, RULE_forwardStep); try { - setState(1423); + setState(1365); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { - case 1: + switch (_input.LA(1)) { + case Kchild: + case Kdescendant: + case Kattribute: + case Kself: + case Kdescendant_or_self: + case Kfollowing_sibling: + case Kfollowing: enterOuterAlt(_localctx, 1); { { - setState(1419); + setState(1361); forwardAxis(); - setState(1420); + setState(1362); nodeTest(); } } break; - case 2: + case Kat_symbol: enterOuterAlt(_localctx, 2); { - setState(1422); + setState(1364); abbrevForwardStep(); } break; + default: + throw new NoViableAltException(this); } } catch (RecognitionException re) { @@ -9777,14 +9576,14 @@ public T accept(ParseTreeVisitor visitor) { public final ForwardAxisContext forwardAxis() throws RecognitionException { ForwardAxisContext _localctx = new ForwardAxisContext(_ctx, getState()); - enterRule(_localctx, 244, RULE_forwardAxis); + enterRule(_localctx, 240, RULE_forwardAxis); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1425); + setState(1367); _la = _input.LA(1); - if ( !(((((_la - 138)) & ~0x3f) == 0 && ((1L << (_la - 138)) & ((1L << (Kchild - 138)) | (1L << (Kdescendant - 138)) | (1L << (Kattribute - 138)) | (1L << (Kself - 138)) | (1L << (Kdescendant_or_self - 138)) | (1L << (Kfollowing_sibling - 138)) | (1L << (Kfollowing - 138)))) != 0)) ) { + if ( !(((((_la - 132)) & ~0x3f) == 0 && ((1L << (_la - 132)) & ((1L << (Kchild - 132)) | (1L << (Kdescendant - 132)) | (1L << (Kattribute - 132)) | (1L << (Kself - 132)) | (1L << (Kdescendant_or_self - 132)) | (1L << (Kfollowing_sibling - 132)) | (1L << (Kfollowing - 132)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -9792,9 +9591,9 @@ public final ForwardAxisContext forwardAxis() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1426); + setState(1368); match(T__16); - setState(1427); + setState(1369); match(T__16); } } @@ -9810,10 +9609,10 @@ public final ForwardAxisContext forwardAxis() throws RecognitionException { } public static class AbbrevForwardStepContext extends ParserRuleContext { + public TerminalNode Kat_symbol() { return getToken(JsoniqParser.Kat_symbol, 0); } public NodeTestContext nodeTest() { return getRuleContext(NodeTestContext.class,0); } - public TerminalNode Kat_symbol() { return getToken(JsoniqParser.Kat_symbol, 0); } public AbbrevForwardStepContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -9827,22 +9626,13 @@ public T accept(ParseTreeVisitor visitor) { public final AbbrevForwardStepContext abbrevForwardStep() throws RecognitionException { AbbrevForwardStepContext _localctx = new AbbrevForwardStepContext(_ctx, getState()); - enterRule(_localctx, 246, RULE_abbrevForwardStep); - int _la; + enterRule(_localctx, 242, RULE_abbrevForwardStep); try { enterOuterAlt(_localctx, 1); { - setState(1430); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==Kat_symbol) { - { - setState(1429); - match(Kat_symbol); - } - } - - setState(1432); + setState(1371); + match(Kat_symbol); + setState(1372); nodeTest(); } } @@ -9880,9 +9670,9 @@ public T accept(ParseTreeVisitor visitor) { public final ReverseStepContext reverseStep() throws RecognitionException { ReverseStepContext _localctx = new ReverseStepContext(_ctx, getState()); - enterRule(_localctx, 248, RULE_reverseStep); + enterRule(_localctx, 244, RULE_reverseStep); try { - setState(1438); + setState(1378); _errHandler.sync(this); switch (_input.LA(1)) { case Kparent: @@ -9893,9 +9683,9 @@ public final ReverseStepContext reverseStep() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(1434); + setState(1374); reverseAxis(); - setState(1435); + setState(1375); nodeTest(); } } @@ -9903,7 +9693,7 @@ public final ReverseStepContext reverseStep() throws RecognitionException { case T__55: enterOuterAlt(_localctx, 2); { - setState(1437); + setState(1377); abbrevReverseStep(); } break; @@ -9941,14 +9731,14 @@ public T accept(ParseTreeVisitor visitor) { public final ReverseAxisContext reverseAxis() throws RecognitionException { ReverseAxisContext _localctx = new ReverseAxisContext(_ctx, getState()); - enterRule(_localctx, 250, RULE_reverseAxis); + enterRule(_localctx, 246, RULE_reverseAxis); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1440); + setState(1380); _la = _input.LA(1); - if ( !(((((_la - 145)) & ~0x3f) == 0 && ((1L << (_la - 145)) & ((1L << (Kparent - 145)) | (1L << (Kancestor - 145)) | (1L << (Kpreceding_sibling - 145)) | (1L << (Kpreceding - 145)) | (1L << (Kancestor_or_self - 145)))) != 0)) ) { + if ( !(((((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & ((1L << (Kparent - 139)) | (1L << (Kancestor - 139)) | (1L << (Kpreceding_sibling - 139)) | (1L << (Kpreceding - 139)) | (1L << (Kancestor_or_self - 139)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -9956,9 +9746,9 @@ public final ReverseAxisContext reverseAxis() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1441); + setState(1381); match(T__16); - setState(1442); + setState(1382); match(T__16); } } @@ -9987,11 +9777,11 @@ public T accept(ParseTreeVisitor visitor) { public final AbbrevReverseStepContext abbrevReverseStep() throws RecognitionException { AbbrevReverseStepContext _localctx = new AbbrevReverseStepContext(_ctx, getState()); - enterRule(_localctx, 252, RULE_abbrevReverseStep); + enterRule(_localctx, 248, RULE_abbrevReverseStep); try { enterOuterAlt(_localctx, 1); { - setState(1444); + setState(1384); match(T__55); } } @@ -10026,9 +9816,9 @@ public T accept(ParseTreeVisitor visitor) { public final NodeTestContext nodeTest() throws RecognitionException { NodeTestContext _localctx = new NodeTestContext(_ctx, getState()); - enterRule(_localctx, 254, RULE_nodeTest); + enterRule(_localctx, 250, RULE_nodeTest); try { - setState(1448); + setState(1388); _errHandler.sync(this); switch (_input.LA(1)) { case T__9: @@ -10108,7 +9898,7 @@ public final NodeTestContext nodeTest() throws RecognitionException { case NCName: enterOuterAlt(_localctx, 1); { - setState(1446); + setState(1386); nameTest(); } break; @@ -10122,15 +9912,10 @@ public final NodeTestContext nodeTest() throws RecognitionException { case Knamespace_node: case Kschema_attribute: case Kschema_element: - case Karray_node: - case Kboolean_node: - case Knull_node: - case Knumber_node: - case Kobject_node: case Kcomment: enterOuterAlt(_localctx, 2); { - setState(1447); + setState(1387); kindTest(); } break; @@ -10169,22 +9954,22 @@ public T accept(ParseTreeVisitor visitor) { public final NameTestContext nameTest() throws RecognitionException { NameTestContext _localctx = new NameTestContext(_ctx, getState()); - enterRule(_localctx, 256, RULE_nameTest); + enterRule(_localctx, 252, RULE_nameTest); try { - setState(1452); + setState(1392); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1450); + setState(1390); qname(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1451); + setState(1391); wildcard(); } break; @@ -10245,16 +10030,16 @@ public T accept(ParseTreeVisitor visitor) { public final WildcardContext wildcard() throws RecognitionException { WildcardContext _localctx = new WildcardContext(_ctx, getState()); - enterRule(_localctx, 258, RULE_wildcard); + enterRule(_localctx, 254, RULE_wildcard); try { - setState(1457); + setState(1397); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { case 1: _localctx = new AllNamesContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(1454); + setState(1394); match(T__9); } break; @@ -10262,7 +10047,7 @@ public final WildcardContext wildcard() throws RecognitionException { _localctx = new AllWithNSContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(1455); + setState(1395); nCNameWithLocalWildcard(); } break; @@ -10270,7 +10055,7 @@ public final WildcardContext wildcard() throws RecognitionException { _localctx = new AllWithLocalContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(1456); + setState(1396); nCNameWithPrefixWildcard(); } break; @@ -10302,15 +10087,15 @@ public T accept(ParseTreeVisitor visitor) { public final NCNameWithLocalWildcardContext nCNameWithLocalWildcard() throws RecognitionException { NCNameWithLocalWildcardContext _localctx = new NCNameWithLocalWildcardContext(_ctx, getState()); - enterRule(_localctx, 260, RULE_nCNameWithLocalWildcard); + enterRule(_localctx, 256, RULE_nCNameWithLocalWildcard); try { enterOuterAlt(_localctx, 1); { - setState(1459); + setState(1399); match(NCName); - setState(1460); + setState(1400); match(T__16); - setState(1461); + setState(1401); match(T__9); } } @@ -10340,15 +10125,15 @@ public T accept(ParseTreeVisitor visitor) { public final NCNameWithPrefixWildcardContext nCNameWithPrefixWildcard() throws RecognitionException { NCNameWithPrefixWildcardContext _localctx = new NCNameWithPrefixWildcardContext(_ctx, getState()); - enterRule(_localctx, 262, RULE_nCNameWithPrefixWildcard); + enterRule(_localctx, 258, RULE_nCNameWithPrefixWildcard); try { enterOuterAlt(_localctx, 1); { - setState(1463); + setState(1403); match(T__9); - setState(1464); + setState(1404); match(T__16); - setState(1465); + setState(1405); match(NCName); } } @@ -10383,187 +10168,27 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateListContext predicateList() throws RecognitionException { PredicateListContext _localctx = new PredicateListContext(_ctx, getState()); - enterRule(_localctx, 264, RULE_predicateList); + enterRule(_localctx, 260, RULE_predicateList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1470); + setState(1410); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,135,_ctx); + _alt = getInterpreter().adaptivePredict(_input,130,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1467); + setState(1407); predicate(); } } } - setState(1472); + setState(1412); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,135,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ItemTypeContext extends ParserRuleContext { - public QnameContext qname() { - return getRuleContext(QnameContext.class,0); - } - public TerminalNode NullLiteral() { return getToken(JsoniqParser.NullLiteral, 0); } - public KindTestContext kindTest() { - return getRuleContext(KindTestContext.class,0); - } - public TerminalNode Kitem() { return getToken(JsoniqParser.Kitem, 0); } - public FunctionTestContext functionTest() { - return getRuleContext(FunctionTestContext.class,0); - } - public MapTestContext mapTest() { - return getRuleContext(MapTestContext.class,0); - } - public ArrayTestContext arrayTest() { - return getRuleContext(ArrayTestContext.class,0); - } - public AtomicOrUnionTypeContext atomicOrUnionType() { - return getRuleContext(AtomicOrUnionTypeContext.class,0); - } - public ParenthesizedItemTestContext parenthesizedItemTest() { - return getRuleContext(ParenthesizedItemTestContext.class,0); - } - public ItemTypeContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_itemType; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitItemType(this); - else return visitor.visitChildren(this); - } - } - - public final ItemTypeContext itemType() throws RecognitionException { - ItemTypeContext _localctx = new ItemTypeContext(_ctx, getState()); - enterRule(_localctx, 266, RULE_itemType); - try { - setState(1484); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(1473); - qname(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(1474); - match(NullLiteral); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(1475); - kindTest(); - } - break; - case 4: - enterOuterAlt(_localctx, 4); - { - { - setState(1476); - match(Kitem); - setState(1477); - match(T__7); - setState(1478); - match(T__8); - } - } - break; - case 5: - enterOuterAlt(_localctx, 5); - { - setState(1479); - functionTest(); - } - break; - case 6: - enterOuterAlt(_localctx, 6); - { - setState(1480); - mapTest(); - } - break; - case 7: - enterOuterAlt(_localctx, 7); - { - setState(1481); - arrayTest(); - } - break; - case 8: - enterOuterAlt(_localctx, 8); - { - setState(1482); - atomicOrUnionType(); - } - break; - case 9: - enterOuterAlt(_localctx, 9); - { - setState(1483); - parenthesizedItemTest(); - } - break; + _alt = getInterpreter().adaptivePredict(_input,130,_ctx); } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class AtomicOrUnionTypeContext extends ParserRuleContext { - public QnameContext qname() { - return getRuleContext(QnameContext.class,0); - } - public AtomicOrUnionTypeContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_atomicOrUnionType; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAtomicOrUnionType(this); - else return visitor.visitChildren(this); - } - } - - public final AtomicOrUnionTypeContext atomicOrUnionType() throws RecognitionException { - AtomicOrUnionTypeContext _localctx = new AtomicOrUnionTypeContext(_ctx, getState()); - enterRule(_localctx, 268, RULE_atomicOrUnionType); - try { - enterOuterAlt(_localctx, 1); - { - setState(1486); - qname(); } } catch (RecognitionException re) { @@ -10605,9 +10230,6 @@ public TextTestContext textTest() { public NamespaceNodeTestContext namespaceNodeTest() { return getRuleContext(NamespaceNodeTestContext.class,0); } - public MlNodeTestContext mlNodeTest() { - return getRuleContext(MlNodeTestContext.class,0); - } public BinaryNodeTestContext binaryNodeTest() { return getRuleContext(BinaryNodeTestContext.class,0); } @@ -10627,96 +10249,85 @@ public T accept(ParseTreeVisitor visitor) { public final KindTestContext kindTest() throws RecognitionException { KindTestContext _localctx = new KindTestContext(_ctx, getState()); - enterRule(_localctx, 270, RULE_kindTest); + enterRule(_localctx, 262, RULE_kindTest); try { - setState(1500); + setState(1424); _errHandler.sync(this); switch (_input.LA(1)) { case Kdocument_node: enterOuterAlt(_localctx, 1); { - setState(1488); + setState(1413); documentTest(); } break; case Kelement: enterOuterAlt(_localctx, 2); { - setState(1489); + setState(1414); elementTest(); } break; case Kattribute: enterOuterAlt(_localctx, 3); { - setState(1490); + setState(1415); attributeTest(); } break; case Kschema_element: enterOuterAlt(_localctx, 4); { - setState(1491); + setState(1416); schemaElementTest(); } break; case Kschema_attribute: enterOuterAlt(_localctx, 5); { - setState(1492); + setState(1417); schemaAttributeTest(); } break; case Kpi: enterOuterAlt(_localctx, 6); { - setState(1493); + setState(1418); piTest(); } break; case Kcomment: enterOuterAlt(_localctx, 7); { - setState(1494); + setState(1419); commentTest(); } break; case Ktext: enterOuterAlt(_localctx, 8); { - setState(1495); + setState(1420); textTest(); } break; case Knamespace_node: enterOuterAlt(_localctx, 9); { - setState(1496); + setState(1421); namespaceNodeTest(); } break; - case Karray_node: - case Kboolean_node: - case Knull_node: - case Knumber_node: - case Kobject_node: - enterOuterAlt(_localctx, 10); - { - setState(1497); - mlNodeTest(); - } - break; case Kbinary: - enterOuterAlt(_localctx, 11); + enterOuterAlt(_localctx, 10); { - setState(1498); + setState(1422); binaryNodeTest(); } break; case Knode: - enterOuterAlt(_localctx, 12); + enterOuterAlt(_localctx, 11); { - setState(1499); + setState(1423); anyKindTest(); } break; @@ -10750,15 +10361,15 @@ public T accept(ParseTreeVisitor visitor) { public final AnyKindTestContext anyKindTest() throws RecognitionException { AnyKindTestContext _localctx = new AnyKindTestContext(_ctx, getState()); - enterRule(_localctx, 272, RULE_anyKindTest); + enterRule(_localctx, 264, RULE_anyKindTest); try { enterOuterAlt(_localctx, 1); { - setState(1502); + setState(1426); match(Knode); - setState(1503); + setState(1427); match(T__7); - setState(1504); + setState(1428); match(T__8); } } @@ -10788,15 +10399,15 @@ public T accept(ParseTreeVisitor visitor) { public final BinaryNodeTestContext binaryNodeTest() throws RecognitionException { BinaryNodeTestContext _localctx = new BinaryNodeTestContext(_ctx, getState()); - enterRule(_localctx, 274, RULE_binaryNodeTest); + enterRule(_localctx, 266, RULE_binaryNodeTest); try { enterOuterAlt(_localctx, 1); { - setState(1506); + setState(1430); match(Kbinary); - setState(1507); + setState(1431); match(T__7); - setState(1508); + setState(1432); match(T__8); } } @@ -10832,26 +10443,26 @@ public T accept(ParseTreeVisitor visitor) { public final DocumentTestContext documentTest() throws RecognitionException { DocumentTestContext _localctx = new DocumentTestContext(_ctx, getState()); - enterRule(_localctx, 276, RULE_documentTest); + enterRule(_localctx, 268, RULE_documentTest); try { enterOuterAlt(_localctx, 1); { - setState(1510); + setState(1434); match(Kdocument_node); - setState(1511); + setState(1435); match(T__7); - setState(1514); + setState(1438); _errHandler.sync(this); switch (_input.LA(1)) { case Kelement: { - setState(1512); + setState(1436); elementTest(); } break; case Kschema_element: { - setState(1513); + setState(1437); schemaElementTest(); } break; @@ -10860,7 +10471,7 @@ public final DocumentTestContext documentTest() throws RecognitionException { default: break; } - setState(1516); + setState(1440); match(T__8); } } @@ -10890,15 +10501,15 @@ public T accept(ParseTreeVisitor visitor) { public final TextTestContext textTest() throws RecognitionException { TextTestContext _localctx = new TextTestContext(_ctx, getState()); - enterRule(_localctx, 278, RULE_textTest); + enterRule(_localctx, 270, RULE_textTest); try { enterOuterAlt(_localctx, 1); { - setState(1518); + setState(1442); match(Ktext); - setState(1519); + setState(1443); match(T__7); - setState(1520); + setState(1444); match(T__8); } } @@ -10928,15 +10539,15 @@ public T accept(ParseTreeVisitor visitor) { public final CommentTestContext commentTest() throws RecognitionException { CommentTestContext _localctx = new CommentTestContext(_ctx, getState()); - enterRule(_localctx, 280, RULE_commentTest); + enterRule(_localctx, 272, RULE_commentTest); try { enterOuterAlt(_localctx, 1); { - setState(1522); + setState(1446); match(Kcomment); - setState(1523); + setState(1447); match(T__7); - setState(1524); + setState(1448); match(T__8); } } @@ -10966,15 +10577,15 @@ public T accept(ParseTreeVisitor visitor) { public final NamespaceNodeTestContext namespaceNodeTest() throws RecognitionException { NamespaceNodeTestContext _localctx = new NamespaceNodeTestContext(_ctx, getState()); - enterRule(_localctx, 282, RULE_namespaceNodeTest); + enterRule(_localctx, 274, RULE_namespaceNodeTest); try { enterOuterAlt(_localctx, 1); { - setState(1526); + setState(1450); match(Knamespace_node); - setState(1527); + setState(1451); match(T__7); - setState(1528); + setState(1452); match(T__8); } } @@ -11008,26 +10619,26 @@ public T accept(ParseTreeVisitor visitor) { public final PiTestContext piTest() throws RecognitionException { PiTestContext _localctx = new PiTestContext(_ctx, getState()); - enterRule(_localctx, 284, RULE_piTest); + enterRule(_localctx, 276, RULE_piTest); try { enterOuterAlt(_localctx, 1); { - setState(1530); + setState(1454); match(Kpi); - setState(1531); + setState(1455); match(T__7); - setState(1534); + setState(1458); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(1532); + setState(1456); match(NCName); } break; case STRING: { - setState(1533); + setState(1457); stringLiteral(); } break; @@ -11036,7 +10647,7 @@ public final PiTestContext piTest() throws RecognitionException { default: break; } - setState(1536); + setState(1460); match(T__8); } } @@ -11073,30 +10684,30 @@ public T accept(ParseTreeVisitor visitor) { public final AttributeTestContext attributeTest() throws RecognitionException { AttributeTestContext _localctx = new AttributeTestContext(_ctx, getState()); - enterRule(_localctx, 286, RULE_attributeTest); + enterRule(_localctx, 278, RULE_attributeTest); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1538); + setState(1462); match(Kattribute); - setState(1539); + setState(1463); match(T__7); - setState(1545); + setState(1469); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 159)) & ~0x3f) == 0 && ((1L << (_la - 159)) & ((1L << (Kbreak - 159)) | (1L << (Kloop - 159)) | (1L << (Kcontinue - 159)) | (1L << (Kexit - 159)) | (1L << (Kreturning - 159)) | (1L << (Kwhile - 159)) | (1L << (NullLiteral - 159)) | (1L << (NCName - 159)))) != 0)) { { - setState(1540); + setState(1464); attributeNameOrWildcard(); - setState(1543); + setState(1467); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__12) { { - setState(1541); + setState(1465); match(T__12); - setState(1542); + setState(1466); ((AttributeTestContext)_localctx).type = typeName(); } } @@ -11104,7 +10715,7 @@ public final AttributeTestContext attributeTest() throws RecognitionException { } } - setState(1547); + setState(1471); match(T__8); } } @@ -11136,9 +10747,9 @@ public T accept(ParseTreeVisitor visitor) { public final AttributeNameOrWildcardContext attributeNameOrWildcard() throws RecognitionException { AttributeNameOrWildcardContext _localctx = new AttributeNameOrWildcardContext(_ctx, getState()); - enterRule(_localctx, 288, RULE_attributeNameOrWildcard); + enterRule(_localctx, 280, RULE_attributeNameOrWildcard); try { - setState(1551); + setState(1475); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -11217,14 +10828,14 @@ public final AttributeNameOrWildcardContext attributeNameOrWildcard() throws Rec case NCName: enterOuterAlt(_localctx, 1); { - setState(1549); + setState(1473); attributeName(); } break; case T__9: enterOuterAlt(_localctx, 2); { - setState(1550); + setState(1474); match(T__9); } break; @@ -11261,17 +10872,17 @@ public T accept(ParseTreeVisitor visitor) { public final SchemaAttributeTestContext schemaAttributeTest() throws RecognitionException { SchemaAttributeTestContext _localctx = new SchemaAttributeTestContext(_ctx, getState()); - enterRule(_localctx, 290, RULE_schemaAttributeTest); + enterRule(_localctx, 282, RULE_schemaAttributeTest); try { enterOuterAlt(_localctx, 1); { - setState(1553); + setState(1477); match(Kschema_attribute); - setState(1554); + setState(1478); match(T__7); - setState(1555); + setState(1479); attributeDeclaration(); - setState(1556); + setState(1480); match(T__8); } } @@ -11286,6 +10897,42 @@ public final SchemaAttributeTestContext schemaAttributeTest() throws Recognition return _localctx; } + public static class AttributeDeclarationContext extends ParserRuleContext { + public AttributeNameContext attributeName() { + return getRuleContext(AttributeNameContext.class,0); + } + public AttributeDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_attributeDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAttributeDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final AttributeDeclarationContext attributeDeclaration() throws RecognitionException { + AttributeDeclarationContext _localctx = new AttributeDeclarationContext(_ctx, getState()); + enterRule(_localctx, 284, RULE_attributeDeclaration); + try { + enterOuterAlt(_localctx, 1); + { + setState(1482); + attributeName(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public static class ElementTestContext extends ParserRuleContext { public TypeNameContext type; public Token optional; @@ -11310,37 +10957,37 @@ public T accept(ParseTreeVisitor visitor) { public final ElementTestContext elementTest() throws RecognitionException { ElementTestContext _localctx = new ElementTestContext(_ctx, getState()); - enterRule(_localctx, 292, RULE_elementTest); + enterRule(_localctx, 286, RULE_elementTest); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1558); + setState(1484); match(Kelement); - setState(1559); + setState(1485); match(T__7); - setState(1568); + setState(1494); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 159)) & ~0x3f) == 0 && ((1L << (_la - 159)) & ((1L << (Kbreak - 159)) | (1L << (Kloop - 159)) | (1L << (Kcontinue - 159)) | (1L << (Kexit - 159)) | (1L << (Kreturning - 159)) | (1L << (Kwhile - 159)) | (1L << (NullLiteral - 159)) | (1L << (NCName - 159)))) != 0)) { { - setState(1560); + setState(1486); elementNameOrWildcard(); - setState(1566); + setState(1492); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__12) { { - setState(1561); + setState(1487); match(T__12); - setState(1562); + setState(1488); ((ElementTestContext)_localctx).type = typeName(); - setState(1564); + setState(1490); _errHandler.sync(this); _la = _input.LA(1); if (_la==ArgumentPlaceholder) { { - setState(1563); + setState(1489); ((ElementTestContext)_localctx).optional = match(ArgumentPlaceholder); } } @@ -11351,7 +10998,7 @@ public final ElementTestContext elementTest() throws RecognitionException { } } - setState(1570); + setState(1496); match(T__8); } } @@ -11383,9 +11030,9 @@ public T accept(ParseTreeVisitor visitor) { public final ElementNameOrWildcardContext elementNameOrWildcard() throws RecognitionException { ElementNameOrWildcardContext _localctx = new ElementNameOrWildcardContext(_ctx, getState()); - enterRule(_localctx, 294, RULE_elementNameOrWildcard); + enterRule(_localctx, 288, RULE_elementNameOrWildcard); try { - setState(1574); + setState(1500); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -11464,14 +11111,14 @@ public final ElementNameOrWildcardContext elementNameOrWildcard() throws Recogni case NCName: enterOuterAlt(_localctx, 1); { - setState(1572); + setState(1498); elementName(); } break; case T__9: enterOuterAlt(_localctx, 2); { - setState(1573); + setState(1499); match(T__9); } break; @@ -11508,635 +11155,18 @@ public T accept(ParseTreeVisitor visitor) { public final SchemaElementTestContext schemaElementTest() throws RecognitionException { SchemaElementTestContext _localctx = new SchemaElementTestContext(_ctx, getState()); - enterRule(_localctx, 296, RULE_schemaElementTest); + enterRule(_localctx, 290, RULE_schemaElementTest); try { enterOuterAlt(_localctx, 1); { - setState(1576); + setState(1502); match(Kschema_element); - setState(1577); + setState(1503); match(T__7); - setState(1578); + setState(1504); elementDeclaration(); - setState(1579); - match(T__8); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ElementDeclarationContext extends ParserRuleContext { - public ElementNameContext elementName() { - return getRuleContext(ElementNameContext.class,0); - } - public ElementDeclarationContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_elementDeclaration; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitElementDeclaration(this); - else return visitor.visitChildren(this); - } - } - - public final ElementDeclarationContext elementDeclaration() throws RecognitionException { - ElementDeclarationContext _localctx = new ElementDeclarationContext(_ctx, getState()); - enterRule(_localctx, 298, RULE_elementDeclaration); - try { - enterOuterAlt(_localctx, 1); - { - setState(1581); - elementName(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class AttributeNameContext extends ParserRuleContext { - public QnameContext qname() { - return getRuleContext(QnameContext.class,0); - } - public AttributeNameContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_attributeName; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAttributeName(this); - else return visitor.visitChildren(this); - } - } - - public final AttributeNameContext attributeName() throws RecognitionException { - AttributeNameContext _localctx = new AttributeNameContext(_ctx, getState()); - enterRule(_localctx, 300, RULE_attributeName); - try { - enterOuterAlt(_localctx, 1); - { - setState(1583); - qname(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ElementNameContext extends ParserRuleContext { - public QnameContext qname() { - return getRuleContext(QnameContext.class,0); - } - public ElementNameContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_elementName; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitElementName(this); - else return visitor.visitChildren(this); - } - } - - public final ElementNameContext elementName() throws RecognitionException { - ElementNameContext _localctx = new ElementNameContext(_ctx, getState()); - enterRule(_localctx, 302, RULE_elementName); - try { - enterOuterAlt(_localctx, 1); - { - setState(1585); - qname(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class SimpleTypeNameContext extends ParserRuleContext { - public TypeNameContext typeName() { - return getRuleContext(TypeNameContext.class,0); - } - public SimpleTypeNameContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_simpleTypeName; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitSimpleTypeName(this); - else return visitor.visitChildren(this); - } - } - - public final SimpleTypeNameContext simpleTypeName() throws RecognitionException { - SimpleTypeNameContext _localctx = new SimpleTypeNameContext(_ctx, getState()); - enterRule(_localctx, 304, RULE_simpleTypeName); - try { - enterOuterAlt(_localctx, 1); - { - setState(1587); - typeName(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class TypeNameContext extends ParserRuleContext { - public QnameContext qname() { - return getRuleContext(QnameContext.class,0); - } - public TypeNameContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_typeName; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitTypeName(this); - else return visitor.visitChildren(this); - } - } - - public final TypeNameContext typeName() throws RecognitionException { - TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); - enterRule(_localctx, 306, RULE_typeName); - try { - enterOuterAlt(_localctx, 1); - { - setState(1589); - qname(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class MapTestContext extends ParserRuleContext { - public AnyMapTestContext anyMapTest() { - return getRuleContext(AnyMapTestContext.class,0); - } - public TypedMapTestContext typedMapTest() { - return getRuleContext(TypedMapTestContext.class,0); - } - public MapTestContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_mapTest; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitMapTest(this); - else return visitor.visitChildren(this); - } - } - - public final MapTestContext mapTest() throws RecognitionException { - MapTestContext _localctx = new MapTestContext(_ctx, getState()); - enterRule(_localctx, 308, RULE_mapTest); - try { - setState(1593); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(1591); - anyMapTest(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(1592); - typedMapTest(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class AnyMapTestContext extends ParserRuleContext { - public TerminalNode Kmap() { return getToken(JsoniqParser.Kmap, 0); } - public AnyMapTestContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_anyMapTest; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAnyMapTest(this); - else return visitor.visitChildren(this); - } - } - - public final AnyMapTestContext anyMapTest() throws RecognitionException { - AnyMapTestContext _localctx = new AnyMapTestContext(_ctx, getState()); - enterRule(_localctx, 310, RULE_anyMapTest); - try { - enterOuterAlt(_localctx, 1); - { - setState(1595); - match(Kmap); - setState(1596); - match(T__7); - setState(1597); - match(T__9); - setState(1598); - match(T__8); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class TypedMapTestContext extends ParserRuleContext { - public TerminalNode Kmap() { return getToken(JsoniqParser.Kmap, 0); } - public QnameContext qname() { - return getRuleContext(QnameContext.class,0); - } - public SequenceTypeContext sequenceType() { - return getRuleContext(SequenceTypeContext.class,0); - } - public TypedMapTestContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_typedMapTest; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitTypedMapTest(this); - else return visitor.visitChildren(this); - } - } - - public final TypedMapTestContext typedMapTest() throws RecognitionException { - TypedMapTestContext _localctx = new TypedMapTestContext(_ctx, getState()); - enterRule(_localctx, 312, RULE_typedMapTest); - try { - enterOuterAlt(_localctx, 1); - { - setState(1600); - match(Kmap); - setState(1601); - match(T__7); - setState(1602); - qname(); - setState(1603); - match(T__12); - setState(1604); - sequenceType(); - setState(1605); - match(T__8); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ArrayTestContext extends ParserRuleContext { - public AnyArrayTestContext anyArrayTest() { - return getRuleContext(AnyArrayTestContext.class,0); - } - public TypedArrayTestContext typedArrayTest() { - return getRuleContext(TypedArrayTestContext.class,0); - } - public ArrayTestContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_arrayTest; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitArrayTest(this); - else return visitor.visitChildren(this); - } - } - - public final ArrayTestContext arrayTest() throws RecognitionException { - ArrayTestContext _localctx = new ArrayTestContext(_ctx, getState()); - enterRule(_localctx, 314, RULE_arrayTest); - try { - setState(1609); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(1607); - anyArrayTest(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(1608); - typedArrayTest(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class AnyArrayTestContext extends ParserRuleContext { - public TerminalNode Karray() { return getToken(JsoniqParser.Karray, 0); } - public AnyArrayTestContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_anyArrayTest; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAnyArrayTest(this); - else return visitor.visitChildren(this); - } - } - - public final AnyArrayTestContext anyArrayTest() throws RecognitionException { - AnyArrayTestContext _localctx = new AnyArrayTestContext(_ctx, getState()); - enterRule(_localctx, 316, RULE_anyArrayTest); - try { - enterOuterAlt(_localctx, 1); - { - setState(1611); - match(Karray); - setState(1612); - match(T__7); - setState(1613); - match(T__9); - setState(1614); - match(T__8); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class TypedArrayTestContext extends ParserRuleContext { - public TerminalNode Karray() { return getToken(JsoniqParser.Karray, 0); } - public SequenceTypeContext sequenceType() { - return getRuleContext(SequenceTypeContext.class,0); - } - public TypedArrayTestContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_typedArrayTest; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitTypedArrayTest(this); - else return visitor.visitChildren(this); - } - } - - public final TypedArrayTestContext typedArrayTest() throws RecognitionException { - TypedArrayTestContext _localctx = new TypedArrayTestContext(_ctx, getState()); - enterRule(_localctx, 318, RULE_typedArrayTest); - try { - enterOuterAlt(_localctx, 1); - { - setState(1616); - match(Karray); - setState(1617); - match(T__7); - setState(1618); - sequenceType(); - setState(1619); - match(T__8); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ParenthesizedItemTestContext extends ParserRuleContext { - public ItemTypeContext itemType() { - return getRuleContext(ItemTypeContext.class,0); - } - public ParenthesizedItemTestContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_parenthesizedItemTest; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitParenthesizedItemTest(this); - else return visitor.visitChildren(this); - } - } - - public final ParenthesizedItemTestContext parenthesizedItemTest() throws RecognitionException { - ParenthesizedItemTestContext _localctx = new ParenthesizedItemTestContext(_ctx, getState()); - enterRule(_localctx, 320, RULE_parenthesizedItemTest); - try { - enterOuterAlt(_localctx, 1); - { - setState(1621); - match(T__7); - setState(1622); - itemType(); - setState(1623); - match(T__8); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class AttributeDeclarationContext extends ParserRuleContext { - public AttributeNameContext attributeName() { - return getRuleContext(AttributeNameContext.class,0); - } - public AttributeDeclarationContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_attributeDeclaration; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAttributeDeclaration(this); - else return visitor.visitChildren(this); - } - } - - public final AttributeDeclarationContext attributeDeclaration() throws RecognitionException { - AttributeDeclarationContext _localctx = new AttributeDeclarationContext(_ctx, getState()); - enterRule(_localctx, 322, RULE_attributeDeclaration); - try { - enterOuterAlt(_localctx, 1); - { - setState(1625); - attributeName(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class MlNodeTestContext extends ParserRuleContext { - public MlArrayNodeTestContext mlArrayNodeTest() { - return getRuleContext(MlArrayNodeTestContext.class,0); - } - public MlObjectNodeTestContext mlObjectNodeTest() { - return getRuleContext(MlObjectNodeTestContext.class,0); - } - public MlNumberNodeTestContext mlNumberNodeTest() { - return getRuleContext(MlNumberNodeTestContext.class,0); - } - public MlBooleanNodeTestContext mlBooleanNodeTest() { - return getRuleContext(MlBooleanNodeTestContext.class,0); - } - public MlNullNodeTestContext mlNullNodeTest() { - return getRuleContext(MlNullNodeTestContext.class,0); - } - public MlNodeTestContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_mlNodeTest; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitMlNodeTest(this); - else return visitor.visitChildren(this); - } - } - - public final MlNodeTestContext mlNodeTest() throws RecognitionException { - MlNodeTestContext _localctx = new MlNodeTestContext(_ctx, getState()); - enterRule(_localctx, 324, RULE_mlNodeTest); - try { - setState(1632); - _errHandler.sync(this); - switch (_input.LA(1)) { - case Karray_node: - enterOuterAlt(_localctx, 1); - { - setState(1627); - mlArrayNodeTest(); - } - break; - case Kobject_node: - enterOuterAlt(_localctx, 2); - { - setState(1628); - mlObjectNodeTest(); - } - break; - case Knumber_node: - enterOuterAlt(_localctx, 3); - { - setState(1629); - mlNumberNodeTest(); - } - break; - case Kboolean_node: - enterOuterAlt(_localctx, 4); - { - setState(1630); - mlBooleanNodeTest(); - } - break; - case Knull_node: - enterOuterAlt(_localctx, 5); - { - setState(1631); - mlNullNodeTest(); - } - break; - default: - throw new NoViableAltException(this); + setState(1505); + match(T__8); } } catch (RecognitionException re) { @@ -12150,45 +11180,29 @@ public final MlNodeTestContext mlNodeTest() throws RecognitionException { return _localctx; } - public static class MlArrayNodeTestContext extends ParserRuleContext { - public TerminalNode Karray_node() { return getToken(JsoniqParser.Karray_node, 0); } - public StringLiteralContext stringLiteral() { - return getRuleContext(StringLiteralContext.class,0); + public static class ElementDeclarationContext extends ParserRuleContext { + public ElementNameContext elementName() { + return getRuleContext(ElementNameContext.class,0); } - public MlArrayNodeTestContext(ParserRuleContext parent, int invokingState) { + public ElementDeclarationContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_mlArrayNodeTest; } + @Override public int getRuleIndex() { return RULE_elementDeclaration; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitMlArrayNodeTest(this); + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitElementDeclaration(this); else return visitor.visitChildren(this); } } - public final MlArrayNodeTestContext mlArrayNodeTest() throws RecognitionException { - MlArrayNodeTestContext _localctx = new MlArrayNodeTestContext(_ctx, getState()); - enterRule(_localctx, 326, RULE_mlArrayNodeTest); - int _la; + public final ElementDeclarationContext elementDeclaration() throws RecognitionException { + ElementDeclarationContext _localctx = new ElementDeclarationContext(_ctx, getState()); + enterRule(_localctx, 292, RULE_elementDeclaration); try { enterOuterAlt(_localctx, 1); { - setState(1634); - match(Karray_node); - setState(1635); - match(T__7); - setState(1637); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==STRING) { - { - setState(1636); - stringLiteral(); - } - } - - setState(1639); - match(T__8); + setState(1507); + elementName(); } } catch (RecognitionException re) { @@ -12202,45 +11216,29 @@ public final MlArrayNodeTestContext mlArrayNodeTest() throws RecognitionExceptio return _localctx; } - public static class MlObjectNodeTestContext extends ParserRuleContext { - public TerminalNode Kobject_node() { return getToken(JsoniqParser.Kobject_node, 0); } - public StringLiteralContext stringLiteral() { - return getRuleContext(StringLiteralContext.class,0); + public static class AttributeNameContext extends ParserRuleContext { + public QnameContext qname() { + return getRuleContext(QnameContext.class,0); } - public MlObjectNodeTestContext(ParserRuleContext parent, int invokingState) { + public AttributeNameContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_mlObjectNodeTest; } + @Override public int getRuleIndex() { return RULE_attributeName; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitMlObjectNodeTest(this); + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAttributeName(this); else return visitor.visitChildren(this); } } - public final MlObjectNodeTestContext mlObjectNodeTest() throws RecognitionException { - MlObjectNodeTestContext _localctx = new MlObjectNodeTestContext(_ctx, getState()); - enterRule(_localctx, 328, RULE_mlObjectNodeTest); - int _la; + public final AttributeNameContext attributeName() throws RecognitionException { + AttributeNameContext _localctx = new AttributeNameContext(_ctx, getState()); + enterRule(_localctx, 294, RULE_attributeName); try { enterOuterAlt(_localctx, 1); { - setState(1641); - match(Kobject_node); - setState(1642); - match(T__7); - setState(1644); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==STRING) { - { - setState(1643); - stringLiteral(); - } - } - - setState(1646); - match(T__8); + setState(1509); + qname(); } } catch (RecognitionException re) { @@ -12254,45 +11252,29 @@ public final MlObjectNodeTestContext mlObjectNodeTest() throws RecognitionExcept return _localctx; } - public static class MlNumberNodeTestContext extends ParserRuleContext { - public TerminalNode Knumber_node() { return getToken(JsoniqParser.Knumber_node, 0); } - public StringLiteralContext stringLiteral() { - return getRuleContext(StringLiteralContext.class,0); + public static class ElementNameContext extends ParserRuleContext { + public QnameContext qname() { + return getRuleContext(QnameContext.class,0); } - public MlNumberNodeTestContext(ParserRuleContext parent, int invokingState) { + public ElementNameContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_mlNumberNodeTest; } + @Override public int getRuleIndex() { return RULE_elementName; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitMlNumberNodeTest(this); + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitElementName(this); else return visitor.visitChildren(this); } } - public final MlNumberNodeTestContext mlNumberNodeTest() throws RecognitionException { - MlNumberNodeTestContext _localctx = new MlNumberNodeTestContext(_ctx, getState()); - enterRule(_localctx, 330, RULE_mlNumberNodeTest); - int _la; + public final ElementNameContext elementName() throws RecognitionException { + ElementNameContext _localctx = new ElementNameContext(_ctx, getState()); + enterRule(_localctx, 296, RULE_elementName); try { enterOuterAlt(_localctx, 1); { - setState(1648); - match(Knumber_node); - setState(1649); - match(T__7); - setState(1651); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==STRING) { - { - setState(1650); - stringLiteral(); - } - } - - setState(1653); - match(T__8); + setState(1511); + qname(); } } catch (RecognitionException re) { @@ -12306,45 +11288,29 @@ public final MlNumberNodeTestContext mlNumberNodeTest() throws RecognitionExcept return _localctx; } - public static class MlBooleanNodeTestContext extends ParserRuleContext { - public TerminalNode Kboolean_node() { return getToken(JsoniqParser.Kboolean_node, 0); } - public StringLiteralContext stringLiteral() { - return getRuleContext(StringLiteralContext.class,0); + public static class SimpleTypeNameContext extends ParserRuleContext { + public TypeNameContext typeName() { + return getRuleContext(TypeNameContext.class,0); } - public MlBooleanNodeTestContext(ParserRuleContext parent, int invokingState) { + public SimpleTypeNameContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_mlBooleanNodeTest; } + @Override public int getRuleIndex() { return RULE_simpleTypeName; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitMlBooleanNodeTest(this); + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitSimpleTypeName(this); else return visitor.visitChildren(this); } } - public final MlBooleanNodeTestContext mlBooleanNodeTest() throws RecognitionException { - MlBooleanNodeTestContext _localctx = new MlBooleanNodeTestContext(_ctx, getState()); - enterRule(_localctx, 332, RULE_mlBooleanNodeTest); - int _la; + public final SimpleTypeNameContext simpleTypeName() throws RecognitionException { + SimpleTypeNameContext _localctx = new SimpleTypeNameContext(_ctx, getState()); + enterRule(_localctx, 298, RULE_simpleTypeName); try { enterOuterAlt(_localctx, 1); { - setState(1655); - match(Kboolean_node); - setState(1656); - match(T__7); - setState(1658); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==STRING) { - { - setState(1657); - stringLiteral(); - } - } - - setState(1660); - match(T__8); + setState(1513); + typeName(); } } catch (RecognitionException re) { @@ -12358,45 +11324,29 @@ public final MlBooleanNodeTestContext mlBooleanNodeTest() throws RecognitionExce return _localctx; } - public static class MlNullNodeTestContext extends ParserRuleContext { - public TerminalNode Knull_node() { return getToken(JsoniqParser.Knull_node, 0); } - public StringLiteralContext stringLiteral() { - return getRuleContext(StringLiteralContext.class,0); + public static class TypeNameContext extends ParserRuleContext { + public QnameContext qname() { + return getRuleContext(QnameContext.class,0); } - public MlNullNodeTestContext(ParserRuleContext parent, int invokingState) { + public TypeNameContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_mlNullNodeTest; } + @Override public int getRuleIndex() { return RULE_typeName; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitMlNullNodeTest(this); + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitTypeName(this); else return visitor.visitChildren(this); } } - public final MlNullNodeTestContext mlNullNodeTest() throws RecognitionException { - MlNullNodeTestContext _localctx = new MlNullNodeTestContext(_ctx, getState()); - enterRule(_localctx, 334, RULE_mlNullNodeTest); - int _la; + public final TypeNameContext typeName() throws RecognitionException { + TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); + enterRule(_localctx, 300, RULE_typeName); try { enterOuterAlt(_localctx, 1); { - setState(1662); - match(Knull_node); - setState(1663); - match(T__7); - setState(1665); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==STRING) { - { - setState(1664); - stringLiteral(); - } - } - - setState(1667); - match(T__8); + setState(1515); + qname(); } } catch (RecognitionException re) { @@ -12412,7 +11362,7 @@ public final MlNullNodeTestContext mlNullNodeTest() throws RecognitionException public static class SequenceTypeContext extends ParserRuleContext { public ItemTypeContext item; - public Token s168; + public Token s166; public List question = new ArrayList(); public Token s10; public List star = new ArrayList(); @@ -12435,45 +11385,119 @@ public T accept(ParseTreeVisitor visitor) { public final SequenceTypeContext sequenceType() throws RecognitionException { SequenceTypeContext _localctx = new SequenceTypeContext(_ctx, getState()); - enterRule(_localctx, 336, RULE_sequenceType); + enterRule(_localctx, 302, RULE_sequenceType); try { - setState(1677); + setState(1525); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { - case 1: + switch (_input.LA(1)) { + case T__7: enterOuterAlt(_localctx, 1); { - setState(1669); + setState(1517); match(T__7); - setState(1670); + setState(1518); match(T__8); } break; - case 2: + case T__28: + case Kfor: + case Klet: + case Kwhere: + case Kgroup: + case Kby: + case Korder: + case Kreturn: + case Kif: + case Kin: + case Kas: + case Kat: + case Kallowing: + case Kempty: + case Kcount: + case Kstable: + case Kascending: + case Kdescending: + case Ksome: + case Kevery: + case Ksatisfies: + case Kcollation: + case Kgreatest: + case Kleast: + case Kswitch: + case Kcase: + case Ktry: + case Kcatch: + case Kdefault: + case Kthen: + case Kelse: + case Ktypeswitch: + case Kor: + case Kand: + case Knot: + case Kto: + case Kinstance: + case Kof: + case Kstatically: + case Kis: + case Ktreat: + case Kcast: + case Kcastable: + case Kversion: + case Kjsoniq: + case Kunordered: + case Ktrue: + case Kfalse: + case Ktype: + case Kvalidate: + case Kannotate: + case Kdeclare: + case Kcontext: + case Kitem: + case Kvariable: + case Kinsert: + case Kdelete: + case Krename: + case Kreplace: + case Kcopy: + case Kmodify: + case Kappend: + case Kinto: + case Kvalue: + case Kjson: + case Kwith: + case Kposition: + case Kbreak: + case Kloop: + case Kcontinue: + case Kexit: + case Kreturning: + case Kwhile: + case NullLiteral: + case NCName: enterOuterAlt(_localctx, 2); { - setState(1671); + setState(1519); ((SequenceTypeContext)_localctx).item = itemType(); - setState(1675); + setState(1523); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { case 1: { - setState(1672); - ((SequenceTypeContext)_localctx).s168 = match(ArgumentPlaceholder); - ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s168); + setState(1520); + ((SequenceTypeContext)_localctx).s166 = match(ArgumentPlaceholder); + ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s166); } break; case 2: { - setState(1673); + setState(1521); ((SequenceTypeContext)_localctx).s10 = match(T__9); ((SequenceTypeContext)_localctx).star.add(((SequenceTypeContext)_localctx).s10); } break; case 3: { - setState(1674); + setState(1522); ((SequenceTypeContext)_localctx).s45 = match(T__44); ((SequenceTypeContext)_localctx).plus.add(((SequenceTypeContext)_localctx).s45); } @@ -12481,6 +11505,8 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { } } break; + default: + throw new NoViableAltException(this); } } catch (RecognitionException re) { @@ -12519,56 +11545,56 @@ public T accept(ParseTreeVisitor visitor) { public final ObjectConstructorContext objectConstructor() throws RecognitionException { ObjectConstructorContext _localctx = new ObjectConstructorContext(_ctx, getState()); - enterRule(_localctx, 338, RULE_objectConstructor); + enterRule(_localctx, 304, RULE_objectConstructor); int _la; try { - setState(1695); + setState(1543); _errHandler.sync(this); switch (_input.LA(1)) { case T__5: enterOuterAlt(_localctx, 1); { - setState(1679); + setState(1527); match(T__5); - setState(1688); + setState(1536); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { { - setState(1680); + setState(1528); pairConstructor(); - setState(1685); + setState(1533); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(1681); + setState(1529); match(T__12); - setState(1682); + setState(1530); pairConstructor(); } } - setState(1687); + setState(1535); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1690); + setState(1538); match(T__6); } break; case T__56: enterOuterAlt(_localctx, 2); { - setState(1691); + setState(1539); ((ObjectConstructorContext)_localctx).s57 = match(T__56); ((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s57); - setState(1692); + setState(1540); expr(); - setState(1693); + setState(1541); match(T__57); } break; @@ -12587,6 +11613,66 @@ public final ObjectConstructorContext objectConstructor() throws RecognitionExce return _localctx; } + public static class ItemTypeContext extends ParserRuleContext { + public QnameContext qname() { + return getRuleContext(QnameContext.class,0); + } + public TerminalNode NullLiteral() { return getToken(JsoniqParser.NullLiteral, 0); } + public FunctionTestContext functionTest() { + return getRuleContext(FunctionTestContext.class,0); + } + public ItemTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_itemType; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitItemType(this); + else return visitor.visitChildren(this); + } + } + + public final ItemTypeContext itemType() throws RecognitionException { + ItemTypeContext _localctx = new ItemTypeContext(_ctx, getState()); + enterRule(_localctx, 306, RULE_itemType); + try { + setState(1548); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1545); + qname(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1546); + match(NullLiteral); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1547); + functionTest(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public static class FunctionTestContext extends ParserRuleContext { public AnyFunctionTestContext anyFunctionTest() { return getRuleContext(AnyFunctionTestContext.class,0); @@ -12607,22 +11693,22 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTestContext functionTest() throws RecognitionException { FunctionTestContext _localctx = new FunctionTestContext(_ctx, getState()); - enterRule(_localctx, 340, RULE_functionTest); + enterRule(_localctx, 308, RULE_functionTest); try { enterOuterAlt(_localctx, 1); { - setState(1699); + setState(1552); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { case 1: { - setState(1697); + setState(1550); anyFunctionTest(); } break; case 2: { - setState(1698); + setState(1551); typedFunctionTest(); } break; @@ -12654,17 +11740,17 @@ public T accept(ParseTreeVisitor visitor) { public final AnyFunctionTestContext anyFunctionTest() throws RecognitionException { AnyFunctionTestContext _localctx = new AnyFunctionTestContext(_ctx, getState()); - enterRule(_localctx, 342, RULE_anyFunctionTest); + enterRule(_localctx, 310, RULE_anyFunctionTest); try { enterOuterAlt(_localctx, 1); { - setState(1701); + setState(1554); match(T__28); - setState(1702); + setState(1555); match(T__7); - setState(1703); + setState(1556); match(T__9); - setState(1704); + setState(1557); match(T__8); } } @@ -12703,48 +11789,48 @@ public T accept(ParseTreeVisitor visitor) { public final TypedFunctionTestContext typedFunctionTest() throws RecognitionException { TypedFunctionTestContext _localctx = new TypedFunctionTestContext(_ctx, getState()); - enterRule(_localctx, 344, RULE_typedFunctionTest); + enterRule(_localctx, 312, RULE_typedFunctionTest); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1706); + setState(1559); match(T__28); - setState(1707); + setState(1560); match(T__7); - setState(1716); + setState(1569); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__7) | (1L << T__28) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kattribute - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (Karray - 128)) | (1L << (Kmap - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__7) | (1L << T__28) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 159)) & ~0x3f) == 0 && ((1L << (_la - 159)) & ((1L << (Kbreak - 159)) | (1L << (Kloop - 159)) | (1L << (Kcontinue - 159)) | (1L << (Kexit - 159)) | (1L << (Kreturning - 159)) | (1L << (Kwhile - 159)) | (1L << (NullLiteral - 159)) | (1L << (NCName - 159)))) != 0)) { { - setState(1708); + setState(1561); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); - setState(1713); + setState(1566); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(1709); + setState(1562); match(T__12); - setState(1710); + setState(1563); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); } } - setState(1715); + setState(1568); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1718); + setState(1571); match(T__8); - setState(1719); + setState(1572); match(Kas); - setState(1720); + setState(1573); ((TypedFunctionTestContext)_localctx).rt = sequenceType(); } } @@ -12761,7 +11847,7 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce public static class SingleTypeContext extends ParserRuleContext { public ItemTypeContext item; - public Token s168; + public Token s166; public List question = new ArrayList(); public ItemTypeContext itemType() { return getRuleContext(ItemTypeContext.class,0); @@ -12780,20 +11866,20 @@ public T accept(ParseTreeVisitor visitor) { public final SingleTypeContext singleType() throws RecognitionException { SingleTypeContext _localctx = new SingleTypeContext(_ctx, getState()); - enterRule(_localctx, 346, RULE_singleType); + enterRule(_localctx, 314, RULE_singleType); try { enterOuterAlt(_localctx, 1); { - setState(1722); + setState(1575); ((SingleTypeContext)_localctx).item = itemType(); - setState(1724); + setState(1577); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { case 1: { - setState(1723); - ((SingleTypeContext)_localctx).s168 = match(ArgumentPlaceholder); - ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s168); + setState(1576); + ((SingleTypeContext)_localctx).s166 = match(ArgumentPlaceholder); + ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s166); } break; } @@ -12835,28 +11921,28 @@ public T accept(ParseTreeVisitor visitor) { public final PairConstructorContext pairConstructor() throws RecognitionException { PairConstructorContext _localctx = new PairConstructorContext(_ctx, getState()); - enterRule(_localctx, 348, RULE_pairConstructor); + enterRule(_localctx, 316, RULE_pairConstructor); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1728); + setState(1581); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { case 1: { - setState(1726); + setState(1579); ((PairConstructorContext)_localctx).lhs = exprSingle(); } break; case 2: { - setState(1727); + setState(1580); ((PairConstructorContext)_localctx).name = match(NCName); } break; } - setState(1730); + setState(1583); _la = _input.LA(1); if ( !(_la==T__16 || _la==ArgumentPlaceholder) ) { _errHandler.recoverInline(this); @@ -12866,7 +11952,7 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio _errHandler.reportMatch(this); consume(); } - setState(1731); + setState(1584); ((PairConstructorContext)_localctx).rhs = exprSingle(); } } @@ -12898,24 +11984,24 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayConstructorContext arrayConstructor() throws RecognitionException { ArrayConstructorContext _localctx = new ArrayConstructorContext(_ctx, getState()); - enterRule(_localctx, 350, RULE_arrayConstructor); + enterRule(_localctx, 318, RULE_arrayConstructor); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1733); + setState(1586); match(T__50); - setState(1735); + setState(1588); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)) | (1L << (Kloop - 64)) | (1L << (Kcontinue - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Karray_node - 128)) | (1L << (Kboolean_node - 128)) | (1L << (Knull_node - 128)) | (1L << (Knumber_node - 128)) | (1L << (Kobject_node - 128)) | (1L << (Kcomment - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { { - setState(1734); + setState(1587); expr(); } } - setState(1737); + setState(1590); match(T__51); } } @@ -12947,11 +12033,11 @@ public T accept(ParseTreeVisitor visitor) { public final UriLiteralContext uriLiteral() throws RecognitionException { UriLiteralContext _localctx = new UriLiteralContext(_ctx, getState()); - enterRule(_localctx, 352, RULE_uriLiteral); + enterRule(_localctx, 320, RULE_uriLiteral); try { enterOuterAlt(_localctx, 1); { - setState(1739); + setState(1592); stringLiteral(); } } @@ -12981,11 +12067,11 @@ public T accept(ParseTreeVisitor visitor) { public final StringLiteralContext stringLiteral() throws RecognitionException { StringLiteralContext _localctx = new StringLiteralContext(_ctx, getState()); - enterRule(_localctx, 354, RULE_stringLiteral); + enterRule(_localctx, 322, RULE_stringLiteral); try { enterOuterAlt(_localctx, 1); { - setState(1741); + setState(1594); match(STRING); } } @@ -13087,12 +12173,12 @@ public T accept(ParseTreeVisitor visitor) { public final KeyWordsContext keyWords() throws RecognitionException { KeyWordsContext _localctx = new KeyWordsContext(_ctx, getState()); - enterRule(_localctx, 356, RULE_keyWords); + enterRule(_localctx, 324, RULE_keyWords); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1743); + setState(1596); _la = _input.LA(1); if ( !(((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (Kfor - 59)) | (1L << (Klet - 59)) | (1L << (Kwhere - 59)) | (1L << (Kgroup - 59)) | (1L << (Kby - 59)) | (1L << (Korder - 59)) | (1L << (Kreturn - 59)) | (1L << (Kif - 59)) | (1L << (Kin - 59)) | (1L << (Kas - 59)) | (1L << (Kat - 59)) | (1L << (Kallowing - 59)) | (1L << (Kempty - 59)) | (1L << (Kcount - 59)) | (1L << (Kstable - 59)) | (1L << (Kascending - 59)) | (1L << (Kdescending - 59)) | (1L << (Ksome - 59)) | (1L << (Kevery - 59)) | (1L << (Ksatisfies - 59)) | (1L << (Kcollation - 59)) | (1L << (Kgreatest - 59)) | (1L << (Kleast - 59)) | (1L << (Kswitch - 59)) | (1L << (Kcase - 59)) | (1L << (Ktry - 59)) | (1L << (Kcatch - 59)) | (1L << (Kdefault - 59)) | (1L << (Kthen - 59)) | (1L << (Kelse - 59)) | (1L << (Ktypeswitch - 59)) | (1L << (Kor - 59)) | (1L << (Kand - 59)) | (1L << (Knot - 59)) | (1L << (Kto - 59)) | (1L << (Kinstance - 59)) | (1L << (Kof - 59)) | (1L << (Kstatically - 59)) | (1L << (Kis - 59)) | (1L << (Ktreat - 59)) | (1L << (Kcast - 59)) | (1L << (Kcastable - 59)) | (1L << (Kversion - 59)) | (1L << (Kjsoniq - 59)) | (1L << (Kunordered - 59)) | (1L << (Ktrue - 59)) | (1L << (Kfalse - 59)) | (1L << (Ktype - 59)) | (1L << (Kvalidate - 59)) | (1L << (Kannotate - 59)) | (1L << (Kdeclare - 59)) | (1L << (Kcontext - 59)) | (1L << (Kitem - 59)) | (1L << (Kvariable - 59)) | (1L << (Kinsert - 59)) | (1L << (Kdelete - 59)) | (1L << (Krename - 59)) | (1L << (Kreplace - 59)) | (1L << (Kcopy - 59)) | (1L << (Kmodify - 59)) | (1L << (Kappend - 59)) | (1L << (Kinto - 59)) | (1L << (Kvalue - 59)) | (1L << (Kjson - 59)))) != 0) || ((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (Kwith - 123)) | (1L << (Kposition - 123)) | (1L << (Kbreak - 123)) | (1L << (Kloop - 123)) | (1L << (Kcontinue - 123)) | (1L << (Kexit - 123)) | (1L << (Kreturning - 123)) | (1L << (Kwhile - 123)) | (1L << (NullLiteral - 123)))) != 0)) ) { _errHandler.recoverInline(this); @@ -13116,7 +12202,7 @@ public final KeyWordsContext keyWords() throws RecognitionException { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00b4\u06d4\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00b2\u0641\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -13138,119 +12224,103 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b\t\u009b"+ "\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f\4\u00a0"+ "\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4\t\u00a4"+ - "\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8\4\u00a9"+ - "\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad\t\u00ad"+ - "\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1\t\u00b1\4\u00b2"+ - "\t\u00b2\4\u00b3\t\u00b3\4\u00b4\t\u00b4\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3"+ - "\3\5\3\u0171\n\3\3\3\3\3\5\3\u0175\n\3\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5"+ - "\3\5\3\5\3\5\3\6\3\6\3\6\5\6\u0185\n\6\3\6\3\6\7\6\u0189\n\6\f\6\16\6"+ - "\u018c\13\6\3\6\3\6\3\6\7\6\u0191\n\6\f\6\16\6\u0194\13\6\3\7\3\7\3\b"+ - "\7\b\u0199\n\b\f\b\16\b\u019c\13\b\3\t\3\t\3\t\3\n\3\n\5\n\u01a3\n\n\3"+ - "\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\5\13\u01b2"+ - "\n\13\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\17\3\17"+ - "\3\17\3\17\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\22\3\22\5\22"+ - "\u01d0\n\22\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u01d8\n\22\f\22\16\22\u01db"+ - "\13\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24"+ - "\3\24\3\24\3\24\3\24\6\24\u01ee\n\24\r\24\16\24\u01ef\3\24\3\24\3\24\3"+ - "\24\3\25\3\25\6\25\u01f8\n\25\r\25\16\25\u01f9\3\25\3\25\3\25\3\26\3\26"+ - "\3\26\6\26\u0202\n\26\r\26\16\26\u0203\3\27\3\27\3\27\5\27\u0209\n\27"+ - "\3\27\3\27\3\27\5\27\u020e\n\27\7\27\u0210\n\27\f\27\16\27\u0213\13\27"+ - "\3\27\3\27\3\30\3\30\3\30\3\30\3\30\6\30\u021c\n\30\r\30\16\30\u021d\3"+ - "\30\3\30\5\30\u0222\n\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\5\31\u022b"+ - "\n\31\3\31\3\31\3\31\7\31\u0230\n\31\f\31\16\31\u0233\13\31\3\31\3\31"+ - "\3\31\3\32\3\32\3\32\3\32\3\32\3\32\7\32\u023e\n\32\f\32\16\32\u0241\13"+ - "\32\3\32\5\32\u0244\n\32\3\33\7\33\u0247\n\33\f\33\16\33\u024a\13\33\3"+ - "\34\3\34\3\34\3\34\3\34\7\34\u0251\n\34\f\34\16\34\u0254\13\34\3\34\3"+ - "\34\3\35\3\35\3\35\5\35\u025b\n\35\3\35\3\35\5\35\u025f\n\35\3\36\3\36"+ - "\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\5\37\u026b\n\37\3 \3 \3 \3 \3"+ - " \3 \3!\3!\3!\3!\5!\u0277\n!\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$"+ - "\3$\3$\3$\3%\3%\3%\3%\3%\5%\u028d\n%\3%\3%\3%\3%\7%\u0293\n%\f%\16%\u0296"+ - "\13%\3&\3&\5&\u029a\n&\3&\5&\u029d\n&\3&\3&\5&\u02a1\n&\3\'\3\'\3(\3("+ - "\3(\3(\3(\5(\u02aa\n(\3(\3(\3(\3(\3(\7(\u02b1\n(\f(\16(\u02b4\13(\5(\u02b6"+ - "\n(\3)\3)\3)\3)\3)\3)\5)\u02be\n)\3)\3)\3)\3)\3)\5)\u02c5\n)\5)\u02c7"+ - "\n)\3*\3*\3*\3*\3*\5*\u02ce\n*\3*\3*\3*\3*\3*\5*\u02d5\n*\5*\u02d7\n*"+ - "\3+\3+\3+\3+\3+\3+\5+\u02df\n+\3+\3+\3+\5+\u02e4\n+\3+\3+\3+\3+\3+\5+"+ - "\u02eb\n+\3,\3,\3,\3,\3,\5,\u02f2\n,\3,\3,\3-\3-\3-\3-\3-\3-\5-\u02fc"+ - "\n-\3.\3.\3.\7.\u0301\n.\f.\16.\u0304\13.\3/\3/\3/\3/\5/\u030a\n/\3\60"+ - "\3\60\3\60\7\60\u030f\n\60\f\60\16\60\u0312\13\60\3\61\3\61\3\61\3\61"+ - "\3\61\3\61\5\61\u031a\n\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\5\62"+ - "\u0324\n\62\3\63\3\63\5\63\u0328\n\63\3\63\3\63\3\63\3\63\3\63\3\63\7"+ - "\63\u0330\n\63\f\63\16\63\u0333\13\63\3\63\3\63\3\63\3\64\3\64\3\64\3"+ - "\64\7\64\u033c\n\64\f\64\16\64\u033f\13\64\3\65\3\65\3\65\5\65\u0344\n"+ - "\65\3\65\3\65\5\65\u0348\n\65\3\65\3\65\5\65\u034c\n\65\3\65\3\65\3\65"+ - "\3\66\3\66\3\66\3\66\7\66\u0355\n\66\f\66\16\66\u0358\13\66\3\67\3\67"+ - "\3\67\5\67\u035d\n\67\3\67\3\67\3\67\38\38\38\39\39\39\39\39\79\u036a"+ - "\n9\f9\169\u036d\139\3:\3:\3:\5:\u0372\n:\3:\3:\5:\u0376\n:\3:\3:\5:\u037a"+ - "\n:\3;\3;\3;\3;\3;\5;\u0381\n;\3;\3;\3;\7;\u0386\n;\f;\16;\u0389\13;\3"+ - "<\3<\3<\5<\u038e\n<\3<\3<\3<\5<\u0393\n<\5<\u0395\n<\3<\3<\5<\u0399\n"+ - "<\3=\3=\3=\3>\3>\5>\u03a0\n>\3>\3>\3>\7>\u03a5\n>\f>\16>\u03a8\13>\3>"+ - "\3>\3>\3?\3?\3?\5?\u03b0\n?\3?\3?\3?\3@\3@\3@\3@\3@\6@\u03ba\n@\r@\16"+ - "@\u03bb\3@\3@\3@\3@\3A\3A\6A\u03c4\nA\rA\16A\u03c5\3A\3A\3A\3B\3B\3B\3"+ - "B\3B\6B\u03d0\nB\rB\16B\u03d1\3B\3B\5B\u03d6\nB\3B\3B\3B\3C\3C\3C\3C\5"+ - "C\u03df\nC\3C\3C\3C\7C\u03e4\nC\fC\16C\u03e7\13C\3C\3C\3C\3D\3D\3D\3D"+ - "\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\6E\u03fa\nE\rE\16E\u03fb\3F\3F\3F\5F\u0401"+ - "\nF\3F\3F\3F\5F\u0406\nF\7F\u0408\nF\fF\16F\u040b\13F\3F\3F\3F\3F\3G\3"+ - "G\3G\7G\u0414\nG\fG\16G\u0417\13G\3H\3H\3H\7H\u041c\nH\fH\16H\u041f\13"+ - "H\3I\5I\u0422\nI\3I\3I\3J\3J\3J\5J\u0429\nJ\3K\3K\3K\7K\u042e\nK\fK\16"+ - "K\u0431\13K\3L\3L\3L\5L\u0436\nL\3M\3M\3M\7M\u043b\nM\fM\16M\u043e\13"+ - "M\3N\3N\3N\7N\u0443\nN\fN\16N\u0446\13N\3O\3O\3O\3O\5O\u044c\nO\3P\3P"+ - "\3P\3P\5P\u0452\nP\3Q\3Q\3Q\3Q\5Q\u0458\nQ\3R\3R\3R\3R\5R\u045e\nR\3S"+ - "\3S\3S\3S\5S\u0464\nS\3T\3T\3T\3T\3T\3T\3T\7T\u046d\nT\fT\16T\u0470\13"+ - "T\3U\3U\3U\5U\u0475\nU\3V\7V\u0478\nV\fV\16V\u047b\13V\3V\3V\3W\3W\3W"+ - "\5W\u0482\nW\3X\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\7Z\u0495"+ - "\nZ\fZ\16Z\u0498\13Z\3[\3[\3[\3[\3[\3[\7[\u04a0\n[\f[\16[\u04a3\13[\3"+ - "\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3_\5_\u04b9"+ - "\n_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\5`\u04ca\n`\3a\3a\3a"+ - "\3a\3b\3b\3b\3c\3c\5c\u04d5\nc\3c\3c\3d\3d\3e\3e\3e\3e\3e\3f\3f\3f\3f"+ - "\3f\3g\3g\3g\3h\3h\3h\5h\u04eb\nh\7h\u04ed\nh\fh\16h\u04f0\13h\3h\3h\3"+ - "i\3i\5i\u04f6\ni\3j\3j\5j\u04fa\nj\3k\3k\3k\3k\3l\3l\3l\3l\5l\u0504\n"+ - "l\3l\3l\3l\5l\u0509\nl\3l\3l\3l\3l\3m\3m\3m\3m\3m\3m\3m\3m\5m\u0517\n"+ - "m\3m\3m\3m\3m\3m\7m\u051e\nm\fm\16m\u0521\13m\3m\3m\3m\5m\u0526\nm\3n"+ - "\3n\3n\3n\3o\3o\3o\3o\3o\3o\3p\3p\3p\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\7q"+ - "\u053f\nq\fq\16q\u0542\13q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3r\3s\3s\3s\6"+ - "s\u0552\ns\rs\16s\u0553\3t\3t\3t\3t\3u\3u\3u\5u\u055d\nu\3u\3u\3u\3u\3"+ - "u\7u\u0564\nu\fu\16u\u0567\13u\5u\u0569\nu\3v\3v\3v\3v\3v\3v\5v\u0571"+ - "\nv\3w\3w\5w\u0575\nw\3w\3w\3w\5w\u057a\nw\3x\3x\3x\7x\u057f\nx\fx\16"+ - "x\u0582\13x\3y\3y\5y\u0586\ny\3z\3z\5z\u058a\nz\3z\3z\3{\3{\3{\3{\5{\u0592"+ - "\n{\3|\3|\3|\3|\3}\5}\u0599\n}\3}\3}\3~\3~\3~\3~\5~\u05a1\n~\3\177\3\177"+ - "\3\177\3\177\3\u0080\3\u0080\3\u0081\3\u0081\5\u0081\u05ab\n\u0081\3\u0082"+ - "\3\u0082\5\u0082\u05af\n\u0082\3\u0083\3\u0083\3\u0083\5\u0083\u05b4\n"+ - "\u0083\3\u0084\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085\3\u0085"+ - "\3\u0086\7\u0086\u05bf\n\u0086\f\u0086\16\u0086\u05c2\13\u0086\3\u0087"+ - "\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087"+ - "\3\u0087\5\u0087\u05cf\n\u0087\3\u0088\3\u0088\3\u0089\3\u0089\3\u0089"+ - "\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089"+ - "\5\u0089\u05df\n\u0089\3\u008a\3\u008a\3\u008a\3\u008a\3\u008b\3\u008b"+ - "\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u05ed\n\u008c"+ - "\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e"+ - "\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\3\u0090"+ - "\5\u0090\u0601\n\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091"+ - "\3\u0091\5\u0091\u060a\n\u0091\5\u0091\u060c\n\u0091\3\u0091\3\u0091\3"+ - "\u0092\3\u0092\5\u0092\u0612\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3"+ - "\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\5\u0094\u061f\n"+ - "\u0094\5\u0094\u0621\n\u0094\5\u0094\u0623\n\u0094\3\u0094\3\u0094\3\u0095"+ - "\3\u0095\5\u0095\u0629\n\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+ - "\3\u0097\3\u0097\3\u0098\3\u0098\3\u0099\3\u0099\3\u009a\3\u009a\3\u009b"+ - "\3\u009b\3\u009c\3\u009c\5\u009c\u063c\n\u009c\3\u009d\3\u009d\3\u009d"+ - "\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ - "\3\u009f\3\u009f\5\u009f\u064c\n\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0"+ - "\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a2"+ - "\3\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\5\u00a4"+ - "\u0663\n\u00a4\3\u00a5\3\u00a5\3\u00a5\5\u00a5\u0668\n\u00a5\3\u00a5\3"+ - "\u00a5\3\u00a6\3\u00a6\3\u00a6\5\u00a6\u066f\n\u00a6\3\u00a6\3\u00a6\3"+ - "\u00a7\3\u00a7\3\u00a7\5\u00a7\u0676\n\u00a7\3\u00a7\3\u00a7\3\u00a8\3"+ - "\u00a8\3\u00a8\5\u00a8\u067d\n\u00a8\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3"+ - "\u00a9\5\u00a9\u0684\n\u00a9\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3"+ - "\u00aa\3\u00aa\3\u00aa\5\u00aa\u068e\n\u00aa\5\u00aa\u0690\n\u00aa\3\u00ab"+ - "\3\u00ab\3\u00ab\3\u00ab\7\u00ab\u0696\n\u00ab\f\u00ab\16\u00ab\u0699"+ - "\13\u00ab\5\u00ab\u069b\n\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab"+ - "\5\u00ab\u06a2\n\u00ab\3\u00ac\3\u00ac\5\u00ac\u06a6\n\u00ac\3\u00ad\3"+ - "\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae"+ - "\7\u00ae\u06b2\n\u00ae\f\u00ae\16\u00ae\u06b5\13\u00ae\5\u00ae\u06b7\n"+ - "\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\5\u00af\u06bf\n"+ - "\u00af\3\u00b0\3\u00b0\5\u00b0\u06c3\n\u00b0\3\u00b0\3\u00b0\3\u00b0\3"+ - "\u00b1\3\u00b1\5\u00b1\u06ca\n\u00b1\3\u00b1\3\u00b1\3\u00b2\3\u00b2\3"+ - "\u00b3\3\u00b3\3\u00b4\3\u00b4\3\u00b4\2\2\u00b5\2\4\6\b\n\f\16\20\22"+ + "\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\5\3\u0151\n\3\3\3\3\3\5\3\u0155\n\3\3"+ + "\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\5\6\u0165\n\6\3"+ + "\6\3\6\7\6\u0169\n\6\f\6\16\6\u016c\13\6\3\6\3\6\3\6\7\6\u0171\n\6\f\6"+ + "\16\6\u0174\13\6\3\7\3\7\3\b\7\b\u0179\n\b\f\b\16\b\u017c\13\b\3\t\3\t"+ + "\3\t\3\n\3\n\5\n\u0183\n\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+ + "\3\13\3\13\3\13\3\13\5\13\u0192\n\13\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3"+ + "\r\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\21\3"+ + "\21\3\21\3\21\3\21\3\22\3\22\5\22\u01b0\n\22\3\22\3\22\3\22\3\22\3\22"+ + "\3\22\7\22\u01b8\n\22\f\22\16\22\u01bb\13\22\3\22\3\22\3\22\3\23\3\23"+ + "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\6\24\u01ce"+ + "\n\24\r\24\16\24\u01cf\3\24\3\24\3\24\3\24\3\25\3\25\6\25\u01d8\n\25\r"+ + "\25\16\25\u01d9\3\25\3\25\3\25\3\26\3\26\3\26\6\26\u01e2\n\26\r\26\16"+ + "\26\u01e3\3\27\3\27\3\27\5\27\u01e9\n\27\3\27\3\27\3\27\5\27\u01ee\n\27"+ + "\7\27\u01f0\n\27\f\27\16\27\u01f3\13\27\3\27\3\27\3\30\3\30\3\30\3\30"+ + "\3\30\6\30\u01fc\n\30\r\30\16\30\u01fd\3\30\3\30\5\30\u0202\n\30\3\30"+ + "\3\30\3\30\3\31\3\31\3\31\3\31\5\31\u020b\n\31\3\31\3\31\3\31\7\31\u0210"+ + "\n\31\f\31\16\31\u0213\13\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3"+ + "\32\7\32\u021e\n\32\f\32\16\32\u0221\13\32\3\32\5\32\u0224\n\32\3\33\7"+ + "\33\u0227\n\33\f\33\16\33\u022a\13\33\3\34\3\34\3\34\3\34\3\34\7\34\u0231"+ + "\n\34\f\34\16\34\u0234\13\34\3\34\3\34\3\35\3\35\3\35\5\35\u023b\n\35"+ + "\3\35\3\35\5\35\u023f\n\35\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37"+ + "\3\37\5\37\u024b\n\37\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\5!\u0257\n!\3\"\3"+ + "\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\5%\u026d\n"+ + "%\3%\3%\3%\3%\7%\u0273\n%\f%\16%\u0276\13%\3&\3&\5&\u027a\n&\3&\5&\u027d"+ + "\n&\3&\3&\5&\u0281\n&\3\'\3\'\3(\3(\3(\3(\3(\5(\u028a\n(\3(\3(\3(\3(\3"+ + "(\7(\u0291\n(\f(\16(\u0294\13(\5(\u0296\n(\3)\3)\3)\3)\3)\3)\5)\u029e"+ + "\n)\3)\3)\3)\3)\3)\5)\u02a5\n)\5)\u02a7\n)\3*\3*\3*\3*\3*\5*\u02ae\n*"+ + "\3*\3*\3*\3*\3*\5*\u02b5\n*\5*\u02b7\n*\3+\3+\3+\3+\3+\3+\5+\u02bf\n+"+ + "\3+\3+\3+\5+\u02c4\n+\3+\3+\3+\3+\3+\5+\u02cb\n+\3,\3,\3,\3,\3,\5,\u02d2"+ + "\n,\3,\3,\3-\3-\3-\3-\3-\3-\5-\u02dc\n-\3.\3.\3.\7.\u02e1\n.\f.\16.\u02e4"+ + "\13.\3/\3/\3/\3/\5/\u02ea\n/\3\60\3\60\3\60\7\60\u02ef\n\60\f\60\16\60"+ + "\u02f2\13\60\3\61\3\61\3\61\3\61\3\61\3\61\5\61\u02fa\n\61\3\62\3\62\3"+ + "\62\3\62\3\62\3\62\3\62\3\62\5\62\u0304\n\62\3\63\3\63\5\63\u0308\n\63"+ + "\3\63\3\63\3\63\3\63\3\63\3\63\7\63\u0310\n\63\f\63\16\63\u0313\13\63"+ + "\3\63\3\63\3\63\3\64\3\64\3\64\3\64\7\64\u031c\n\64\f\64\16\64\u031f\13"+ + "\64\3\65\3\65\3\65\5\65\u0324\n\65\3\65\3\65\5\65\u0328\n\65\3\65\3\65"+ + "\5\65\u032c\n\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\7\66\u0335\n\66\f"+ + "\66\16\66\u0338\13\66\3\67\3\67\3\67\5\67\u033d\n\67\3\67\3\67\3\67\3"+ + "8\38\38\39\39\39\39\39\79\u034a\n9\f9\169\u034d\139\3:\3:\3:\5:\u0352"+ + "\n:\3:\3:\5:\u0356\n:\3:\3:\5:\u035a\n:\3;\3;\3;\3;\3;\5;\u0361\n;\3;"+ + "\3;\3;\7;\u0366\n;\f;\16;\u0369\13;\3<\3<\3<\5<\u036e\n<\3<\3<\3<\5<\u0373"+ + "\n<\5<\u0375\n<\3<\3<\5<\u0379\n<\3=\3=\3=\3>\3>\5>\u0380\n>\3>\3>\3>"+ + "\7>\u0385\n>\f>\16>\u0388\13>\3>\3>\3>\3?\3?\3?\5?\u0390\n?\3?\3?\3?\3"+ + "@\3@\3@\3@\3@\6@\u039a\n@\r@\16@\u039b\3@\3@\3@\3@\3A\3A\6A\u03a4\nA\r"+ + "A\16A\u03a5\3A\3A\3A\3B\3B\3B\3B\3B\6B\u03b0\nB\rB\16B\u03b1\3B\3B\5B"+ + "\u03b6\nB\3B\3B\3B\3C\3C\3C\3C\5C\u03bf\nC\3C\3C\3C\7C\u03c4\nC\fC\16"+ + "C\u03c7\13C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\6E\u03da"+ + "\nE\rE\16E\u03db\3F\3F\3F\5F\u03e1\nF\3F\3F\3F\5F\u03e6\nF\7F\u03e8\n"+ + "F\fF\16F\u03eb\13F\3F\3F\3F\3F\3G\3G\3G\7G\u03f4\nG\fG\16G\u03f7\13G\3"+ + "H\3H\3H\7H\u03fc\nH\fH\16H\u03ff\13H\3I\5I\u0402\nI\3I\3I\3J\3J\3J\5J"+ + "\u0409\nJ\3K\3K\3K\7K\u040e\nK\fK\16K\u0411\13K\3L\3L\3L\5L\u0416\nL\3"+ + "M\3M\3M\7M\u041b\nM\fM\16M\u041e\13M\3N\3N\3N\7N\u0423\nN\fN\16N\u0426"+ + "\13N\3O\3O\3O\3O\5O\u042c\nO\3P\3P\3P\3P\5P\u0432\nP\3Q\3Q\3Q\3Q\5Q\u0438"+ + "\nQ\3R\3R\3R\3R\5R\u043e\nR\3S\3S\3S\3S\5S\u0444\nS\3T\3T\3T\3T\3T\3T"+ + "\3T\7T\u044d\nT\fT\16T\u0450\13T\3U\3U\3U\5U\u0455\nU\3V\7V\u0458\nV\f"+ + "V\16V\u045b\13V\3V\3V\3W\3W\3W\5W\u0462\nW\3X\3X\3X\3X\3X\3X\3X\3Y\3Y"+ + "\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\7Z\u0475\nZ\fZ\16Z\u0478\13Z\3[\3[\3[\3[\3[\3"+ + "[\7[\u0480\n[\f[\16[\u0483\13[\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^"+ + "\3^\3^\3_\3_\3_\3_\3_\3_\3_\5_\u0499\n_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`"+ + "\3`\3`\3`\3`\3`\5`\u04aa\n`\3a\3a\3a\3a\3b\3b\3b\3c\3c\5c\u04b5\nc\3c"+ + "\3c\3d\3d\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3g\3g\3g\3h\3h\3h\5h\u04cb\nh"+ + "\7h\u04cd\nh\fh\16h\u04d0\13h\3h\3h\3i\3i\5i\u04d6\ni\3j\3j\5j\u04da\n"+ + "j\3k\3k\3k\3k\3l\3l\3l\3l\5l\u04e4\nl\3l\3l\3l\5l\u04e9\nl\3l\3l\3l\3"+ + "l\3m\3m\3m\3m\3m\3m\3m\3m\5m\u04f7\nm\3m\3m\3m\3m\3m\7m\u04fe\nm\fm\16"+ + "m\u0501\13m\3m\3m\3m\5m\u0506\nm\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3p\3p\3"+ + "p\3p\3p\3p\3p\3p\3q\3q\3q\3q\7q\u051e\nq\fq\16q\u0521\13q\3q\3q\3q\3q"+ + "\3q\3r\3r\3r\3r\3r\3r\3s\3s\3s\6s\u0531\ns\rs\16s\u0532\3t\3t\3t\3t\3"+ + "u\3u\5u\u053b\nu\3u\3u\3u\5u\u0540\nu\3v\3v\3v\7v\u0545\nv\fv\16v\u0548"+ + "\13v\3w\3w\5w\u054c\nw\3x\3x\5x\u0550\nx\3x\3x\3y\3y\3y\3y\5y\u0558\n"+ + "y\3z\3z\3z\3z\3{\3{\3{\3|\3|\3|\3|\5|\u0565\n|\3}\3}\3}\3}\3~\3~\3\177"+ + "\3\177\5\177\u056f\n\177\3\u0080\3\u0080\5\u0080\u0573\n\u0080\3\u0081"+ + "\3\u0081\3\u0081\5\u0081\u0578\n\u0081\3\u0082\3\u0082\3\u0082\3\u0082"+ + "\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\7\u0084\u0583\n\u0084\f\u0084"+ + "\16\u0084\u0586\13\u0084\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085"+ + "\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\5\u0085\u0593\n\u0085\3\u0086"+ + "\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\3\u0087\3\u0088\3\u0088"+ + "\3\u0088\3\u0088\5\u0088\u05a1\n\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+ + "\3\u0089\3\u0089\3\u008a\3\u008a\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b"+ + "\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u05b5\n\u008c\3\u008c"+ + "\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\5\u008d\u05be\n\u008d"+ + "\5\u008d\u05c0\n\u008d\3\u008d\3\u008d\3\u008e\3\u008e\5\u008e\u05c6\n"+ + "\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0091"+ + "\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\5\u0091\u05d5\n\u0091\5\u0091"+ + "\u05d7\n\u0091\5\u0091\u05d9\n\u0091\3\u0091\3\u0091\3\u0092\3\u0092\5"+ + "\u0092\u05df\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094\3"+ + "\u0094\3\u0095\3\u0095\3\u0096\3\u0096\3\u0097\3\u0097\3\u0098\3\u0098"+ + "\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\5\u0099\u05f6\n\u0099"+ + "\5\u0099\u05f8\n\u0099\3\u009a\3\u009a\3\u009a\3\u009a\7\u009a\u05fe\n"+ + "\u009a\f\u009a\16\u009a\u0601\13\u009a\5\u009a\u0603\n\u009a\3\u009a\3"+ + "\u009a\3\u009a\3\u009a\3\u009a\5\u009a\u060a\n\u009a\3\u009b\3\u009b\3"+ + "\u009b\5\u009b\u060f\n\u009b\3\u009c\3\u009c\5\u009c\u0613\n\u009c\3\u009d"+ + "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\7\u009e\u061f\n\u009e\f\u009e\16\u009e\u0622\13\u009e\5\u009e\u0624\n"+ + "\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f\5\u009f\u062c\n"+ + "\u009f\3\u00a0\3\u00a0\5\u00a0\u0630\n\u00a0\3\u00a0\3\u00a0\3\u00a0\3"+ + "\u00a1\3\u00a1\5\u00a1\u0637\n\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3"+ + "\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\2\2\u00a5\2\4\6\b\n\f\16\20\22"+ "\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnp"+ "rtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094"+ "\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac"+ @@ -13260,548 +12330,497 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c"+ "\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124"+ "\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c"+ - "\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154"+ - "\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\2\r\4\2\21\21i"+ - "i\3\2RS\3\2\24\35\4\2\5\5#-\3\2/\60\4\2\f\f\61\63\3\2\u0089\u008a\3\2"+ - "\u008c\u0092\3\2\u0093\u0097\4\2\23\23\u00aa\u00aa\4\2=\u0084\u00ab\u00ab"+ - "\2\u071a\2\u0168\3\2\2\2\4\u0170\3\2\2\2\6\u0176\3\2\2\2\b\u0179\3\2\2"+ - "\2\n\u018a\3\2\2\2\f\u0195\3\2\2\2\16\u019a\3\2\2\2\20\u019d\3\2\2\2\22"+ - "\u01a0\3\2\2\2\24\u01b1\3\2\2\2\26\u01b3\3\2\2\2\30\u01b6\3\2\2\2\32\u01bc"+ - "\3\2\2\2\34\u01c0\3\2\2\2\36\u01c4\3\2\2\2 \u01c8\3\2\2\2\"\u01cf\3\2"+ - "\2\2$\u01df\3\2\2\2&\u01e8\3\2\2\2(\u01f7\3\2\2\2*\u01fe\3\2\2\2,\u0205"+ - "\3\2\2\2.\u0216\3\2\2\2\60\u0226\3\2\2\2\62\u0237\3\2\2\2\64\u0248\3\2"+ - "\2\2\66\u024b\3\2\2\28\u0257\3\2\2\2:\u0260\3\2\2\2<\u026a\3\2\2\2>\u026c"+ - "\3\2\2\2@\u0276\3\2\2\2B\u0278\3\2\2\2D\u027d\3\2\2\2F\u0281\3\2\2\2H"+ - "\u0287\3\2\2\2J\u029c\3\2\2\2L\u02a2\3\2\2\2N\u02a4\3\2\2\2P\u02b7\3\2"+ - "\2\2R\u02c8\3\2\2\2T\u02d8\3\2\2\2V\u02ec\3\2\2\2X\u02fb\3\2\2\2Z\u02fd"+ - "\3\2\2\2\\\u0305\3\2\2\2^\u030b\3\2\2\2`\u0319\3\2\2\2b\u0323\3\2\2\2"+ - "d\u0327\3\2\2\2f\u0337\3\2\2\2h\u0340\3\2\2\2j\u0350\3\2\2\2l\u0359\3"+ - "\2\2\2n\u0361\3\2\2\2p\u0364\3\2\2\2r\u036e\3\2\2\2t\u0380\3\2\2\2v\u038a"+ - "\3\2\2\2x\u039a\3\2\2\2z\u039f\3\2\2\2|\u03ac\3\2\2\2~\u03b4\3\2\2\2\u0080"+ - "\u03c3\3\2\2\2\u0082\u03ca\3\2\2\2\u0084\u03da\3\2\2\2\u0086\u03eb\3\2"+ - "\2\2\u0088\u03f4\3\2\2\2\u008a\u03fd\3\2\2\2\u008c\u0410\3\2\2\2\u008e"+ - "\u0418\3\2\2\2\u0090\u0421\3\2\2\2\u0092\u0425\3\2\2\2\u0094\u042a\3\2"+ - "\2\2\u0096\u0432\3\2\2\2\u0098\u0437\3\2\2\2\u009a\u043f\3\2\2\2\u009c"+ - "\u0447\3\2\2\2\u009e\u044d\3\2\2\2\u00a0\u0453\3\2\2\2\u00a2\u0459\3\2"+ - "\2\2\u00a4\u045f\3\2\2\2\u00a6\u0465\3\2\2\2\u00a8\u0474\3\2\2\2\u00aa"+ - "\u0479\3\2\2\2\u00ac\u0481\3\2\2\2\u00ae\u0483\3\2\2\2\u00b0\u048a\3\2"+ - "\2\2\u00b2\u0491\3\2\2\2\u00b4\u0499\3\2\2\2\u00b6\u04a4\3\2\2\2\u00b8"+ - "\u04aa\3\2\2\2\u00ba\u04ad\3\2\2\2\u00bc\u04b1\3\2\2\2\u00be\u04c9\3\2"+ - "\2\2\u00c0\u04cb\3\2\2\2\u00c2\u04cf\3\2\2\2\u00c4\u04d2\3\2\2\2\u00c6"+ - "\u04d8\3\2\2\2\u00c8\u04da\3\2\2\2\u00ca\u04df\3\2\2\2\u00cc\u04e4\3\2"+ - "\2\2\u00ce\u04e7\3\2\2\2\u00d0\u04f5\3\2\2\2\u00d2\u04f9\3\2\2\2\u00d4"+ - "\u04fb\3\2\2\2\u00d6\u04ff\3\2\2\2\u00d8\u0525\3\2\2\2\u00da\u0527\3\2"+ - "\2\2\u00dc\u052b\3\2\2\2\u00de\u0531\3\2\2\2\u00e0\u0539\3\2\2\2\u00e2"+ - "\u0548\3\2\2\2\u00e4\u054e\3\2\2\2\u00e6\u0555\3\2\2\2\u00e8\u0559\3\2"+ - "\2\2\u00ea\u0570\3\2\2\2\u00ec\u0579\3\2\2\2\u00ee\u057b\3\2\2\2\u00f0"+ - "\u0585\3\2\2\2\u00f2\u0589\3\2\2\2\u00f4\u0591\3\2\2\2\u00f6\u0593\3\2"+ - "\2\2\u00f8\u0598\3\2\2\2\u00fa\u05a0\3\2\2\2\u00fc\u05a2\3\2\2\2\u00fe"+ - "\u05a6\3\2\2\2\u0100\u05aa\3\2\2\2\u0102\u05ae\3\2\2\2\u0104\u05b3\3\2"+ - "\2\2\u0106\u05b5\3\2\2\2\u0108\u05b9\3\2\2\2\u010a\u05c0\3\2\2\2\u010c"+ - "\u05ce\3\2\2\2\u010e\u05d0\3\2\2\2\u0110\u05de\3\2\2\2\u0112\u05e0\3\2"+ - "\2\2\u0114\u05e4\3\2\2\2\u0116\u05e8\3\2\2\2\u0118\u05f0\3\2\2\2\u011a"+ - "\u05f4\3\2\2\2\u011c\u05f8\3\2\2\2\u011e\u05fc\3\2\2\2\u0120\u0604\3\2"+ - "\2\2\u0122\u0611\3\2\2\2\u0124\u0613\3\2\2\2\u0126\u0618\3\2\2\2\u0128"+ - "\u0628\3\2\2\2\u012a\u062a\3\2\2\2\u012c\u062f\3\2\2\2\u012e\u0631\3\2"+ - "\2\2\u0130\u0633\3\2\2\2\u0132\u0635\3\2\2\2\u0134\u0637\3\2\2\2\u0136"+ - "\u063b\3\2\2\2\u0138\u063d\3\2\2\2\u013a\u0642\3\2\2\2\u013c\u064b\3\2"+ - "\2\2\u013e\u064d\3\2\2\2\u0140\u0652\3\2\2\2\u0142\u0657\3\2\2\2\u0144"+ - "\u065b\3\2\2\2\u0146\u0662\3\2\2\2\u0148\u0664\3\2\2\2\u014a\u066b\3\2"+ - "\2\2\u014c\u0672\3\2\2\2\u014e\u0679\3\2\2\2\u0150\u0680\3\2\2\2\u0152"+ - "\u068f\3\2\2\2\u0154\u06a1\3\2\2\2\u0156\u06a5\3\2\2\2\u0158\u06a7\3\2"+ - "\2\2\u015a\u06ac\3\2\2\2\u015c\u06bc\3\2\2\2\u015e\u06c2\3\2\2\2\u0160"+ - "\u06c7\3\2\2\2\u0162\u06cd\3\2\2\2\u0164\u06cf\3\2\2\2\u0166\u06d1\3\2"+ - "\2\2\u0168\u0169\5\4\3\2\u0169\u016a\7\2\2\3\u016a\3\3\2\2\2\u016b\u016c"+ - "\7h\2\2\u016c\u016d\7g\2\2\u016d\u016e\5\u0164\u00b3\2\u016e\u016f\7\3"+ - "\2\2\u016f\u0171\3\2\2\2\u0170\u016b\3\2\2\2\u0170\u0171\3\2\2\2\u0171"+ - "\u0174\3\2\2\2\u0172\u0175\5\b\5\2\u0173\u0175\5\6\4\2\u0174\u0172\3\2"+ - "\2\2\u0174\u0173\3\2\2\2\u0175\5\3\2\2\2\u0176\u0177\5\n\6\2\u0177\u0178"+ - "\5\f\7\2\u0178\7\3\2\2\2\u0179\u017a\7\4\2\2\u017a\u017b\7\u0087\2\2\u017b"+ - "\u017c\7\u00b2\2\2\u017c\u017d\7\5\2\2\u017d\u017e\5\u0162\u00b2\2\u017e"+ - "\u017f\7\3\2\2\u017f\u0180\5\n\6\2\u0180\t\3\2\2\2\u0181\u0185\5<\37\2"+ - "\u0182\u0185\5> \2\u0183\u0185\5N(\2\u0184\u0181\3\2\2\2\u0184\u0182\3"+ - "\2\2\2\u0184\u0183\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0187\7\3\2\2\u0187"+ - "\u0189\3\2\2\2\u0188\u0184\3\2\2\2\u0189\u018c\3\2\2\2\u018a\u0188\3\2"+ - "\2\2\u018a\u018b\3\2\2\2\u018b\u0192\3\2\2\2\u018c\u018a\3\2\2\2\u018d"+ - "\u018e\5@!\2\u018e\u018f\7\3\2\2\u018f\u0191\3\2\2\2\u0190\u018d\3\2\2"+ - "\2\u0191\u0194\3\2\2\2\u0192\u0190\3\2\2\2\u0192\u0193\3\2\2\2\u0193\13"+ - "\3\2\2\2\u0194\u0192\3\2\2\2\u0195\u0196\5\22\n\2\u0196\r\3\2\2\2\u0197"+ - "\u0199\5\24\13\2\u0198\u0197\3\2\2\2\u0199\u019c\3\2\2\2\u019a\u0198\3"+ - "\2\2\2\u019a\u019b\3\2\2\2\u019b\17\3\2\2\2\u019c\u019a\3\2\2\2\u019d"+ - "\u019e\5\16\b\2\u019e\u019f\5^\60\2\u019f\21\3\2\2\2\u01a0\u01a2\5\16"+ - "\b\2\u01a1\u01a3\5^\60\2\u01a2\u01a1\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3"+ - "\23\3\2\2\2\u01a4\u01b2\5\26\f\2\u01a5\u01b2\5\30\r\2\u01a6\u01b2\5\32"+ - "\16\2\u01a7\u01b2\5\34\17\2\u01a8\u01b2\5\36\20\2\u01a9\u01b2\5 \21\2"+ - "\u01aa\u01b2\5\"\22\2\u01ab\u01b2\5$\23\2\u01ac\u01b2\5&\24\2\u01ad\u01b2"+ - "\5*\26\2\u01ae\u01b2\5.\30\2\u01af\u01b2\5\66\34\2\u01b0\u01b2\5:\36\2"+ - "\u01b1\u01a4\3\2\2\2\u01b1\u01a5\3\2\2\2\u01b1\u01a6\3\2\2\2\u01b1\u01a7"+ - "\3\2\2\2\u01b1\u01a8\3\2\2\2\u01b1\u01a9\3\2\2\2\u01b1\u01aa\3\2\2\2\u01b1"+ - "\u01ab\3\2\2\2\u01b1\u01ac\3\2\2\2\u01b1\u01ad\3\2\2\2\u01b1\u01ae\3\2"+ - "\2\2\u01b1\u01af\3\2\2\2\u01b1\u01b0\3\2\2\2\u01b2\25\3\2\2\2\u01b3\u01b4"+ - "\5b\62\2\u01b4\u01b5\7\3\2\2\u01b5\27\3\2\2\2\u01b6\u01b7\7\6\2\2\u01b7"+ - "\u01b8\5J&\2\u01b8\u01b9\7\7\2\2\u01b9\u01ba\5`\61\2\u01ba\u01bb\7\3\2"+ - "\2\u01bb\31\3\2\2\2\u01bc\u01bd\7\b\2\2\u01bd\u01be\5\16\b\2\u01be\u01bf"+ - "\7\t\2\2\u01bf\33\3\2\2\2\u01c0\u01c1\7\177\2\2\u01c1\u01c2\7\u0080\2"+ - "\2\u01c2\u01c3\7\3\2\2\u01c3\35\3\2\2\2\u01c4\u01c5\7\u0081\2\2\u01c5"+ - "\u01c6\7\u0080\2\2\u01c6\u01c7\7\3\2\2\u01c7\37\3\2\2\2\u01c8\u01c9\7"+ - "\u0082\2\2\u01c9\u01ca\7\u0083\2\2\u01ca\u01cb\5`\61\2\u01cb\u01cc\7\3"+ - "\2\2\u01cc!\3\2\2\2\u01cd\u01d0\5f\64\2\u01ce\u01d0\5j\66\2\u01cf\u01cd"+ - "\3\2\2\2\u01cf\u01ce\3\2\2\2\u01d0\u01d9\3\2\2\2\u01d1\u01d8\5f\64\2\u01d2"+ - "\u01d8\5j\66\2\u01d3\u01d8\5n8\2\u01d4\u01d8\5p9\2\u01d5\u01d8\5t;\2\u01d6"+ - "\u01d8\5x=\2\u01d7\u01d1\3\2\2\2\u01d7\u01d2\3\2\2\2\u01d7\u01d3\3\2\2"+ - "\2\u01d7\u01d4\3\2\2\2\u01d7\u01d5\3\2\2\2\u01d7\u01d6\3\2\2\2\u01d8\u01db"+ - "\3\2\2\2\u01d9\u01d7\3\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01dc\3\2\2\2\u01db"+ - "\u01d9\3\2\2\2\u01dc\u01dd\7C\2\2\u01dd\u01de\5\24\13\2\u01de#\3\2\2\2"+ - "\u01df\u01e0\7D\2\2\u01e0\u01e1\7\n\2\2\u01e1\u01e2\5^\60\2\u01e2\u01e3"+ - "\7\13\2\2\u01e3\u01e4\7Y\2\2\u01e4\u01e5\5\24\13\2\u01e5\u01e6\7Z\2\2"+ - "\u01e6\u01e7\5\24\13\2\u01e7%\3\2\2\2\u01e8\u01e9\7T\2\2\u01e9\u01ea\7"+ - "\n\2\2\u01ea\u01eb\5^\60\2\u01eb\u01ed\7\13\2\2\u01ec\u01ee\5(\25\2\u01ed"+ - "\u01ec\3\2\2\2\u01ee\u01ef\3\2\2\2\u01ef\u01ed\3\2\2\2\u01ef\u01f0\3\2"+ - "\2\2\u01f0\u01f1\3\2\2\2\u01f1\u01f2\7X\2\2\u01f2\u01f3\7C\2\2\u01f3\u01f4"+ - "\5\24\13\2\u01f4\'\3\2\2\2\u01f5\u01f6\7U\2\2\u01f6\u01f8\5`\61\2\u01f7"+ - "\u01f5\3\2\2\2\u01f8\u01f9\3\2\2\2\u01f9\u01f7\3\2\2\2\u01f9\u01fa\3\2"+ - "\2\2\u01fa\u01fb\3\2\2\2\u01fb\u01fc\7C\2\2\u01fc\u01fd\5\24\13\2\u01fd"+ - ")\3\2\2\2\u01fe\u01ff\7V\2\2\u01ff\u0201\5\32\16\2\u0200\u0202\5,\27\2"+ - "\u0201\u0200\3\2\2\2\u0202\u0203\3\2\2\2\u0203\u0201\3\2\2\2\u0203\u0204"+ - "\3\2\2\2\u0204+\3\2\2\2\u0205\u0208\7W\2\2\u0206\u0209\7\f\2\2\u0207\u0209"+ - "\5J&\2\u0208\u0206\3\2\2\2\u0208\u0207\3\2\2\2\u0209\u0211\3\2\2\2\u020a"+ - "\u020d\7\r\2\2\u020b\u020e\7\f\2\2\u020c\u020e\5J&\2\u020d\u020b\3\2\2"+ - "\2\u020d\u020c\3\2\2\2\u020e\u0210\3\2\2\2\u020f\u020a\3\2\2\2\u0210\u0213"+ - "\3\2\2\2\u0211\u020f\3\2\2\2\u0211\u0212\3\2\2\2\u0212\u0214\3\2\2\2\u0213"+ - "\u0211\3\2\2\2\u0214\u0215\5\32\16\2\u0215-\3\2\2\2\u0216\u0217\7[\2\2"+ - "\u0217\u0218\7\n\2\2\u0218\u0219\5^\60\2\u0219\u021b\7\13\2\2\u021a\u021c"+ - "\5\60\31\2\u021b\u021a\3\2\2\2\u021c\u021d\3\2\2\2\u021d\u021b\3\2\2\2"+ - "\u021d\u021e\3\2\2\2\u021e\u021f\3\2\2\2\u021f\u0221\7X\2\2\u0220\u0222"+ - "\5\u00c2b\2\u0221\u0220\3\2\2\2\u0221\u0222\3\2\2\2\u0222\u0223\3\2\2"+ - "\2\u0223\u0224\7C\2\2\u0224\u0225\5\24\13\2\u0225/\3\2\2\2\u0226\u022a"+ - "\7U\2\2\u0227\u0228\5\u00c2b\2\u0228\u0229\7F\2\2\u0229\u022b\3\2\2\2"+ - "\u022a\u0227\3\2\2\2\u022a\u022b\3\2\2\2\u022b\u022c\3\2\2\2\u022c\u0231"+ - "\5\u0152\u00aa\2\u022d\u022e\7\r\2\2\u022e\u0230\5\u0152\u00aa\2\u022f"+ - "\u022d\3\2\2\2\u0230\u0233\3\2\2\2\u0231\u022f\3\2\2\2\u0231\u0232\3\2"+ - "\2\2\u0232\u0234\3\2\2\2\u0233\u0231\3\2\2\2\u0234\u0235\7C\2\2\u0235"+ - "\u0236\5\24\13\2\u0236\61\3\2\2\2\u0237\u0238\7\16\2\2\u0238\u0243\5J"+ - "&\2\u0239\u023a\7\n\2\2\u023a\u023f\7\u00ac\2\2\u023b\u023c\7\17\2\2\u023c"+ - "\u023e\7\u00ac\2\2\u023d\u023b\3\2\2\2\u023e\u0241\3\2\2\2\u023f\u023d"+ - "\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u0242\3\2\2\2\u0241\u023f\3\2\2\2\u0242"+ - "\u0244\7\13\2\2\u0243\u0239\3\2\2\2\u0243\u0244\3\2\2\2\u0244\63\3\2\2"+ - "\2\u0245\u0247\5\62\32\2\u0246\u0245\3\2\2\2\u0247\u024a\3\2\2\2\u0248"+ - "\u0246\3\2\2\2\u0248\u0249\3\2\2\2\u0249\65\3\2\2\2\u024a\u0248\3\2\2"+ - "\2\u024b\u024c\5\64\33\2\u024c\u024d\7r\2\2\u024d\u0252\58\35\2\u024e"+ - "\u024f\7\17\2\2\u024f\u0251\58\35\2\u0250\u024e\3\2\2\2\u0251\u0254\3"+ - "\2\2\2\u0252\u0250\3\2\2\2\u0252\u0253\3\2\2\2\u0253\u0255\3\2\2\2\u0254"+ - "\u0252\3\2\2\2\u0255\u0256\7\3\2\2\u0256\67\3\2\2\2\u0257\u025a\5\u00c2"+ - "b\2\u0258\u0259\7F\2\2\u0259\u025b\5\u0152\u00aa\2\u025a\u0258\3\2\2\2"+ - "\u025a\u025b\3\2\2\2\u025b\u025e\3\2\2\2\u025c\u025d\7\7\2\2\u025d\u025f"+ - "\5`\61\2\u025e\u025c\3\2\2\2\u025e\u025f\3\2\2\2\u025f9\3\2\2\2\u0260"+ - "\u0261\7\u0084\2\2\u0261\u0262\7\n\2\2\u0262\u0263\5^\60\2\u0263\u0264"+ - "\7\13\2\2\u0264\u0265\5\24\13\2\u0265;\3\2\2\2\u0266\u026b\5B\"\2\u0267"+ - "\u026b\5D#\2\u0268\u026b\5F$\2\u0269\u026b\5H%\2\u026a\u0266\3\2\2\2\u026a"+ - "\u0267\3\2\2\2\u026a\u0268\3\2\2\2\u026a\u0269\3\2\2\2\u026b=\3\2\2\2"+ - "\u026c\u026d\7o\2\2\u026d\u026e\7\u0087\2\2\u026e\u026f\7\u00b2\2\2\u026f"+ - "\u0270\7\5\2\2\u0270\u0271\5\u0162\u00b2\2\u0271?\3\2\2\2\u0272\u0277"+ - "\5T+\2\u0273\u0277\5P)\2\u0274\u0277\5V,\2\u0275\u0277\5R*\2\u0276\u0272"+ - "\3\2\2\2\u0276\u0273\3\2\2\2\u0276\u0274\3\2\2\2\u0276\u0275\3\2\2\2\u0277"+ - "A\3\2\2\2\u0278\u0279\7o\2\2\u0279\u027a\7X\2\2\u027a\u027b\7Q\2\2\u027b"+ - "\u027c\5\u0162\u00b2\2\u027cC\3\2\2\2\u027d\u027e\7o\2\2\u027e\u027f\7"+ - "\20\2\2\u027f\u0280\t\2\2\2\u0280E\3\2\2\2\u0281\u0282\7o\2\2\u0282\u0283"+ - "\7X\2\2\u0283\u0284\7B\2\2\u0284\u0285\7I\2\2\u0285\u0286\t\3\2\2\u0286"+ - "G\3\2\2\2\u0287\u028c\7o\2\2\u0288\u0289\7\22\2\2\u0289\u028d\5J&\2\u028a"+ - "\u028b\7X\2\2\u028b\u028d\7\22\2\2\u028c\u0288\3\2\2\2\u028c\u028a\3\2"+ - "\2\2\u028d\u0294\3\2\2\2\u028e\u028f\5L\'\2\u028f\u0290\7\5\2\2\u0290"+ - "\u0291\5\u0164\u00b3\2\u0291\u0293\3\2\2\2\u0292\u028e\3\2\2\2\u0293\u0296"+ - "\3\2\2\2\u0294\u0292\3\2\2\2\u0294\u0295\3\2\2\2\u0295I\3\2\2\2\u0296"+ - "\u0294\3\2\2\2\u0297\u029a\7\u00b2\2\2\u0298\u029a\5\u0166\u00b4\2\u0299"+ - "\u0297\3\2\2\2\u0299\u0298\3\2\2\2\u029a\u029b\3\2\2\2\u029b\u029d\7\23"+ - "\2\2\u029c\u0299\3\2\2\2\u029c\u029d\3\2\2\2\u029d\u02a0\3\2\2\2\u029e"+ - "\u02a1\7\u00b2\2\2\u029f\u02a1\5\u0166\u00b4\2\u02a0\u029e\3\2\2\2\u02a0"+ - "\u029f\3\2\2\2\u02a1K\3\2\2\2\u02a2\u02a3\t\4\2\2\u02a3M\3\2\2\2\u02a4"+ - "\u02a5\7\u0085\2\2\u02a5\u02a9\7\4\2\2\u02a6\u02a7\7\u0087\2\2\u02a7\u02a8"+ - "\7\u00b2\2\2\u02a8\u02aa\7\5\2\2\u02a9\u02a6\3\2\2\2\u02a9\u02aa\3\2\2"+ - "\2\u02aa\u02ab\3\2\2\2\u02ab\u02b5\5\u0162\u00b2\2\u02ac\u02ad\7G\2\2"+ - "\u02ad\u02b2\5\u0162\u00b2\2\u02ae\u02af\7\17\2\2\u02af\u02b1\5\u0162"+ - "\u00b2\2\u02b0\u02ae\3\2\2\2\u02b1\u02b4\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b2"+ - "\u02b3\3\2\2\2\u02b3\u02b6\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5\u02ac\3\2"+ - "\2\2\u02b5\u02b6\3\2\2\2\u02b6O\3\2\2\2\u02b7\u02b8\7o\2\2\u02b8\u02b9"+ - "\5\64\33\2\u02b9\u02ba\7r\2\2\u02ba\u02bd\5\u00c2b\2\u02bb\u02bc\7F\2"+ - "\2\u02bc\u02be\5\u0152\u00aa\2\u02bd\u02bb\3\2\2\2\u02bd\u02be\3\2\2\2"+ - "\u02be\u02c6\3\2\2\2\u02bf\u02c0\7\7\2\2\u02c0\u02c7\5`\61\2\u02c1\u02c4"+ - "\7\36\2\2\u02c2\u02c3\7\7\2\2\u02c3\u02c5\5`\61\2\u02c4\u02c2\3\2\2\2"+ - "\u02c4\u02c5\3\2\2\2\u02c5\u02c7\3\2\2\2\u02c6\u02bf\3\2\2\2\u02c6\u02c1"+ - "\3\2\2\2\u02c7Q\3\2\2\2\u02c8\u02c9\7o\2\2\u02c9\u02ca\7p\2\2\u02ca\u02cd"+ - "\7q\2\2\u02cb\u02cc\7F\2\2\u02cc\u02ce\5\u0152\u00aa\2\u02cd\u02cb\3\2"+ - "\2\2\u02cd\u02ce\3\2\2\2\u02ce\u02d6\3\2\2\2\u02cf\u02d0\7\7\2\2\u02d0"+ - "\u02d7\5`\61\2\u02d1\u02d4\7\36\2\2\u02d2\u02d3\7\7\2\2\u02d3\u02d5\5"+ - "`\61\2\u02d4\u02d2\3\2\2\2\u02d4\u02d5\3\2\2\2\u02d5\u02d7\3\2\2\2\u02d6"+ - "\u02cf\3\2\2\2\u02d6\u02d1\3\2\2\2\u02d7S\3\2\2\2\u02d8\u02d9\7o\2\2\u02d9"+ - "\u02da\5\64\33\2\u02da\u02db\7\37\2\2\u02db\u02dc\5J&\2\u02dc\u02de\7"+ - "\n\2\2\u02dd\u02df\5Z.\2\u02de\u02dd\3\2\2\2\u02de\u02df\3\2\2\2\u02df"+ - "\u02e0\3\2\2\2\u02e0\u02e3\7\13\2\2\u02e1\u02e2\7F\2\2\u02e2\u02e4\5\u0152"+ - "\u00aa\2\u02e3\u02e1\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4\u02ea\3\2\2\2\u02e5"+ - "\u02e6\7\b\2\2\u02e6\u02e7\5\22\n\2\u02e7\u02e8\7\t\2\2\u02e8\u02eb\3"+ - "\2\2\2\u02e9\u02eb\7\36\2\2\u02ea\u02e5\3\2\2\2\u02ea\u02e9\3\2\2\2\u02eb"+ - "U\3\2\2\2\u02ec\u02ed\7o\2\2\u02ed\u02ee\7l\2\2\u02ee\u02ef\5J&\2\u02ef"+ - "\u02f1\7F\2\2\u02f0\u02f2\5X-\2\u02f1\u02f0\3\2\2\2\u02f1\u02f2\3\2\2"+ - "\2\u02f2\u02f3\3\2\2\2\u02f3\u02f4\5`\61\2\u02f4W\3\2\2\2\u02f5\u02f6"+ - "\7 \2\2\u02f6\u02fc\7!\2\2\u02f7\u02f8\7 \2\2\u02f8\u02fc\7\"\2\2\u02f9"+ - "\u02fa\7|\2\2\u02fa\u02fc\7\u0086\2\2\u02fb\u02f5\3\2\2\2\u02fb\u02f7"+ - "\3\2\2\2\u02fb\u02f9\3\2\2\2\u02fcY\3\2\2\2\u02fd\u0302\5\\/\2\u02fe\u02ff"+ - "\7\17\2\2\u02ff\u0301\5\\/\2\u0300\u02fe\3\2\2\2\u0301\u0304\3\2\2\2\u0302"+ - "\u0300\3\2\2\2\u0302\u0303\3\2\2\2\u0303[\3\2\2\2\u0304\u0302\3\2\2\2"+ - "\u0305\u0306\7\6\2\2\u0306\u0309\5J&\2\u0307\u0308\7F\2\2\u0308\u030a"+ - "\5\u0152\u00aa\2\u0309\u0307\3\2\2\2\u0309\u030a\3\2\2\2\u030a]\3\2\2"+ - "\2\u030b\u0310\5`\61\2\u030c\u030d\7\17\2\2\u030d\u030f\5`\61\2\u030e"+ - "\u030c\3\2\2\2\u030f\u0312\3\2\2\2\u0310\u030e\3\2\2\2\u0310\u0311\3\2"+ - "\2\2\u0311_\3\2\2\2\u0312\u0310\3\2\2\2\u0313\u031a\5b\62\2\u0314\u031a"+ - "\5d\63\2\u0315\u031a\5~@\2\u0316\u031a\5\u0082B\2\u0317\u031a\5\u0086"+ - "D\2\u0318\u031a\5\u0088E\2\u0319\u0313\3\2\2\2\u0319\u0314\3\2\2\2\u0319"+ - "\u0315\3\2\2\2\u0319\u0316\3\2\2\2\u0319\u0317\3\2\2\2\u0319\u0318\3\2"+ - "\2\2\u031aa\3\2\2\2\u031b\u0324\5z>\2\u031c\u0324\5\u008cG\2\u031d\u0324"+ - "\5\u00d8m\2\u031e\u0324\5\u00dan\2\u031f\u0324\5\u00dco\2\u0320\u0324"+ - "\5\u00dep\2\u0321\u0324\5\u00e0q\2\u0322\u0324\5\u00e2r\2\u0323\u031b"+ - "\3\2\2\2\u0323\u031c\3\2\2\2\u0323\u031d\3\2\2\2\u0323\u031e\3\2\2\2\u0323"+ - "\u031f\3\2\2\2\u0323\u0320\3\2\2\2\u0323\u0321\3\2\2\2\u0323\u0322\3\2"+ - "\2\2\u0324c\3\2\2\2\u0325\u0328\5f\64\2\u0326\u0328\5j\66\2\u0327\u0325"+ - "\3\2\2\2\u0327\u0326\3\2\2\2\u0328\u0331\3\2\2\2\u0329\u0330\5f\64\2\u032a"+ - "\u0330\5j\66\2\u032b\u0330\5n8\2\u032c\u0330\5p9\2\u032d\u0330\5t;\2\u032e"+ - "\u0330\5x=\2\u032f\u0329\3\2\2\2\u032f\u032a\3\2\2\2\u032f\u032b\3\2\2"+ - "\2\u032f\u032c\3\2\2\2\u032f\u032d\3\2\2\2\u032f\u032e\3\2\2\2\u0330\u0333"+ - "\3\2\2\2\u0331\u032f\3\2\2\2\u0331\u0332\3\2\2\2\u0332\u0334\3\2\2\2\u0333"+ - "\u0331\3\2\2\2\u0334\u0335\7C\2\2\u0335\u0336\5`\61\2\u0336e\3\2\2\2\u0337"+ - "\u0338\7=\2\2\u0338\u033d\5h\65\2\u0339\u033a\7\17\2\2\u033a\u033c\5h"+ - "\65\2\u033b\u0339\3\2\2\2\u033c\u033f\3\2\2\2\u033d\u033b\3\2\2\2\u033d"+ - "\u033e\3\2\2\2\u033eg\3\2\2\2\u033f\u033d\3\2\2\2\u0340\u0343\5\u00c2"+ - "b\2\u0341\u0342\7F\2\2\u0342\u0344\5\u0152\u00aa\2\u0343\u0341\3\2\2\2"+ - "\u0343\u0344\3\2\2\2\u0344\u0347\3\2\2\2\u0345\u0346\7H\2\2\u0346\u0348"+ - "\7I\2\2\u0347\u0345\3\2\2\2\u0347\u0348\3\2\2\2\u0348\u034b\3\2\2\2\u0349"+ - "\u034a\7G\2\2\u034a\u034c\5\u00c2b\2\u034b\u0349\3\2\2\2\u034b\u034c\3"+ - "\2\2\2\u034c\u034d\3\2\2\2\u034d\u034e\7E\2\2\u034e\u034f\5`\61\2\u034f"+ - "i\3\2\2\2\u0350\u0351\7>\2\2\u0351\u0356\5l\67\2\u0352\u0353\7\17\2\2"+ - "\u0353\u0355\5l\67\2\u0354\u0352\3\2\2\2\u0355\u0358\3\2\2\2\u0356\u0354"+ - "\3\2\2\2\u0356\u0357\3\2\2\2\u0357k\3\2\2\2\u0358\u0356\3\2\2\2\u0359"+ - "\u035c\5\u00c2b\2\u035a\u035b\7F\2\2\u035b\u035d\5\u0152\u00aa\2\u035c"+ - "\u035a\3\2\2\2\u035c\u035d\3\2\2\2\u035d\u035e\3\2\2\2\u035e\u035f\7\7"+ - "\2\2\u035f\u0360\5`\61\2\u0360m\3\2\2\2\u0361\u0362\7?\2\2\u0362\u0363"+ - "\5`\61\2\u0363o\3\2\2\2\u0364\u0365\7@\2\2\u0365\u0366\7A\2\2\u0366\u036b"+ - "\5r:\2\u0367\u0368\7\17\2\2\u0368\u036a\5r:\2\u0369\u0367\3\2\2\2\u036a"+ - "\u036d\3\2\2\2\u036b\u0369\3\2\2\2\u036b\u036c\3\2\2\2\u036cq\3\2\2\2"+ - "\u036d\u036b\3\2\2\2\u036e\u0375\5\u00c2b\2\u036f\u0370\7F\2\2\u0370\u0372"+ - "\5\u0152\u00aa\2\u0371\u036f\3\2\2\2\u0371\u0372\3\2\2\2\u0372\u0373\3"+ - "\2\2\2\u0373\u0374\7\7\2\2\u0374\u0376\5`\61\2\u0375\u0371\3\2\2\2\u0375"+ - "\u0376\3\2\2\2\u0376\u0379\3\2\2\2\u0377\u0378\7Q\2\2\u0378\u037a\5\u0162"+ - "\u00b2\2\u0379\u0377\3\2\2\2\u0379\u037a\3\2\2\2\u037as\3\2\2\2\u037b"+ - "\u037c\7B\2\2\u037c\u0381\7A\2\2\u037d\u037e\7K\2\2\u037e\u037f\7B\2\2"+ - "\u037f\u0381\7A\2\2\u0380\u037b\3\2\2\2\u0380\u037d\3\2\2\2\u0381\u0382"+ - "\3\2\2\2\u0382\u0387\5v<\2\u0383\u0384\7\17\2\2\u0384\u0386\5v<\2\u0385"+ - "\u0383\3\2\2\2\u0386\u0389\3\2\2\2\u0387\u0385\3\2\2\2\u0387\u0388\3\2"+ - "\2\2\u0388u\3\2\2\2\u0389\u0387\3\2\2\2\u038a\u038d\5`\61\2\u038b\u038e"+ - "\7L\2\2\u038c\u038e\7M\2\2\u038d\u038b\3\2\2\2\u038d\u038c\3\2\2\2\u038d"+ - "\u038e\3\2\2\2\u038e\u0394\3\2\2\2\u038f\u0392\7I\2\2\u0390\u0393\7R\2"+ - "\2\u0391\u0393\7S\2\2\u0392\u0390\3\2\2\2\u0392\u0391\3\2\2\2\u0393\u0395"+ - "\3\2\2\2\u0394\u038f\3\2\2\2\u0394\u0395\3\2\2\2\u0395\u0398\3\2\2\2\u0396"+ - "\u0397\7Q\2\2\u0397\u0399\5\u0162\u00b2\2\u0398\u0396\3\2\2\2\u0398\u0399"+ - "\3\2\2\2\u0399w\3\2\2\2\u039a\u039b\7J\2\2\u039b\u039c\5\u00c2b\2\u039c"+ - "y\3\2\2\2\u039d\u03a0\7N\2\2\u039e\u03a0\7O\2\2\u039f\u039d\3\2\2\2\u039f"+ - "\u039e\3\2\2\2\u03a0\u03a1\3\2\2\2\u03a1\u03a6\5|?\2\u03a2\u03a3\7\17"+ - "\2\2\u03a3\u03a5\5|?\2\u03a4\u03a2\3\2\2\2\u03a5\u03a8\3\2\2\2\u03a6\u03a4"+ - "\3\2\2\2\u03a6\u03a7\3\2\2\2\u03a7\u03a9\3\2\2\2\u03a8\u03a6\3\2\2\2\u03a9"+ - "\u03aa\7P\2\2\u03aa\u03ab\5`\61\2\u03ab{\3\2\2\2\u03ac\u03af\5\u00c2b"+ - "\2\u03ad\u03ae\7F\2\2\u03ae\u03b0\5\u0152\u00aa\2\u03af\u03ad\3\2\2\2"+ - "\u03af\u03b0\3\2\2\2\u03b0\u03b1\3\2\2\2\u03b1\u03b2\7E\2\2\u03b2\u03b3"+ - "\5`\61\2\u03b3}\3\2\2\2\u03b4\u03b5\7T\2\2\u03b5\u03b6\7\n\2\2\u03b6\u03b7"+ - "\5^\60\2\u03b7\u03b9\7\13\2\2\u03b8\u03ba\5\u0080A\2\u03b9\u03b8\3\2\2"+ - "\2\u03ba\u03bb\3\2\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc\u03bd"+ - "\3\2\2\2\u03bd\u03be\7X\2\2\u03be\u03bf\7C\2\2\u03bf\u03c0\5`\61\2\u03c0"+ - "\177\3\2\2\2\u03c1\u03c2\7U\2\2\u03c2\u03c4\5`\61\2\u03c3\u03c1\3\2\2"+ - "\2\u03c4\u03c5\3\2\2\2\u03c5\u03c3\3\2\2\2\u03c5\u03c6\3\2\2\2\u03c6\u03c7"+ - "\3\2\2\2\u03c7\u03c8\7C\2\2\u03c8\u03c9\5`\61\2\u03c9\u0081\3\2\2\2\u03ca"+ - "\u03cb\7[\2\2\u03cb\u03cc\7\n\2\2\u03cc\u03cd\5^\60\2\u03cd\u03cf\7\13"+ - "\2\2\u03ce\u03d0\5\u0084C\2\u03cf\u03ce\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1"+ - "\u03cf\3\2\2\2\u03d1\u03d2\3\2\2\2\u03d2\u03d3\3\2\2\2\u03d3\u03d5\7X"+ - "\2\2\u03d4\u03d6\5\u00c2b\2\u03d5\u03d4\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6"+ - "\u03d7\3\2\2\2\u03d7\u03d8\7C\2\2\u03d8\u03d9\5`\61\2\u03d9\u0083\3\2"+ - "\2\2\u03da\u03de\7U\2\2\u03db\u03dc\5\u00c2b\2\u03dc\u03dd\7F\2\2\u03dd"+ - "\u03df\3\2\2\2\u03de\u03db\3\2\2\2\u03de\u03df\3\2\2\2\u03df\u03e0\3\2"+ - "\2\2\u03e0\u03e5\5\u0152\u00aa\2\u03e1\u03e2\7\r\2\2\u03e2\u03e4\5\u0152"+ - "\u00aa\2\u03e3\u03e1\3\2\2\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5"+ - "\u03e6\3\2\2\2\u03e6\u03e8\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7C"+ - "\2\2\u03e9\u03ea\5`\61\2\u03ea\u0085\3\2\2\2\u03eb\u03ec\7D\2\2\u03ec"+ - "\u03ed\7\n\2\2\u03ed\u03ee\5^\60\2\u03ee\u03ef\7\13\2\2\u03ef\u03f0\7"+ - "Y\2\2\u03f0\u03f1\5`\61\2\u03f1\u03f2\7Z\2\2\u03f2\u03f3\5`\61\2\u03f3"+ - "\u0087\3\2\2\2\u03f4\u03f5\7V\2\2\u03f5\u03f6\7\b\2\2\u03f6\u03f7\5^\60"+ - "\2\u03f7\u03f9\7\t\2\2\u03f8\u03fa\5\u008aF\2\u03f9\u03f8\3\2\2\2\u03fa"+ - "\u03fb\3\2\2\2\u03fb\u03f9\3\2\2\2\u03fb\u03fc\3\2\2\2\u03fc\u0089\3\2"+ - "\2\2\u03fd\u0400\7W\2\2\u03fe\u0401\7\f\2\2\u03ff\u0401\5J&\2\u0400\u03fe"+ - "\3\2\2\2\u0400\u03ff\3\2\2\2\u0401\u0409\3\2\2\2\u0402\u0405\7\r\2\2\u0403"+ - "\u0406\7\f\2\2\u0404\u0406\5J&\2\u0405\u0403\3\2\2\2\u0405\u0404\3\2\2"+ - "\2\u0406\u0408\3\2\2\2\u0407\u0402\3\2\2\2\u0408\u040b\3\2\2\2\u0409\u0407"+ - "\3\2\2\2\u0409\u040a\3\2\2\2\u040a\u040c\3\2\2\2\u040b\u0409\3\2\2\2\u040c"+ - "\u040d\7\b\2\2\u040d\u040e\5^\60\2\u040e\u040f\7\t\2\2\u040f\u008b\3\2"+ - "\2\2\u0410\u0415\5\u008eH\2\u0411\u0412\7\\\2\2\u0412\u0414\5\u008eH\2"+ - "\u0413\u0411\3\2\2\2\u0414\u0417\3\2\2\2\u0415\u0413\3\2\2\2\u0415\u0416"+ - "\3\2\2\2\u0416\u008d\3\2\2\2\u0417\u0415\3\2\2\2\u0418\u041d\5\u0090I"+ - "\2\u0419\u041a\7]\2\2\u041a\u041c\5\u0090I\2\u041b\u0419\3\2\2\2\u041c"+ - "\u041f\3\2\2\2\u041d\u041b\3\2\2\2\u041d\u041e\3\2\2\2\u041e\u008f\3\2"+ - "\2\2\u041f\u041d\3\2\2\2\u0420\u0422\7^\2\2\u0421\u0420\3\2\2\2\u0421"+ - "\u0422\3\2\2\2\u0422\u0423\3\2\2\2\u0423\u0424\5\u0092J\2\u0424\u0091"+ - "\3\2\2\2\u0425\u0428\5\u0094K\2\u0426\u0427\t\5\2\2\u0427\u0429\5\u0094"+ - "K\2\u0428\u0426\3\2\2\2\u0428\u0429\3\2\2\2\u0429\u0093\3\2\2\2\u042a"+ - "\u042f\5\u0096L\2\u042b\u042c\7.\2\2\u042c\u042e\5\u0096L\2\u042d\u042b"+ - "\3\2\2\2\u042e\u0431\3\2\2\2\u042f\u042d\3\2\2\2\u042f\u0430\3\2\2\2\u0430"+ - "\u0095\3\2\2\2\u0431\u042f\3\2\2\2\u0432\u0435\5\u0098M\2\u0433\u0434"+ - "\7_\2\2\u0434\u0436\5\u0098M\2\u0435\u0433\3\2\2\2\u0435\u0436\3\2\2\2"+ - "\u0436\u0097\3\2\2\2\u0437\u043c\5\u009aN\2\u0438\u0439\t\6\2\2\u0439"+ - "\u043b\5\u009aN\2\u043a\u0438\3\2\2\2\u043b\u043e\3\2\2\2\u043c\u043a"+ - "\3\2\2\2\u043c\u043d\3\2\2\2\u043d\u0099\3\2\2\2\u043e\u043c\3\2\2\2\u043f"+ - "\u0444\5\u009cO\2\u0440\u0441\t\7\2\2\u0441\u0443\5\u009cO\2\u0442\u0440"+ - "\3\2\2\2\u0443\u0446\3\2\2\2\u0444\u0442\3\2\2\2\u0444\u0445\3\2\2\2\u0445"+ - "\u009b\3\2\2\2\u0446\u0444\3\2\2\2\u0447\u044b\5\u009eP\2\u0448\u0449"+ - "\7`\2\2\u0449\u044a\7a\2\2\u044a\u044c\5\u0152\u00aa\2\u044b\u0448\3\2"+ - "\2\2\u044b\u044c\3\2\2\2\u044c\u009d\3\2\2\2\u044d\u0451\5\u00a0Q\2\u044e"+ - "\u044f\7c\2\2\u044f\u0450\7b\2\2\u0450\u0452\5\u0152\u00aa\2\u0451\u044e"+ - "\3\2\2\2\u0451\u0452\3\2\2\2\u0452\u009f\3\2\2\2\u0453\u0457\5\u00a2R"+ - "\2\u0454\u0455\7d\2\2\u0455\u0456\7F\2\2\u0456\u0458\5\u0152\u00aa\2\u0457"+ - "\u0454\3\2\2\2\u0457\u0458\3\2\2\2\u0458\u00a1\3\2\2\2\u0459\u045d\5\u00a4"+ - "S\2\u045a\u045b\7f\2\2\u045b\u045c\7F\2\2\u045c\u045e\5\u015c\u00af\2"+ - "\u045d\u045a\3\2\2\2\u045d\u045e\3\2\2\2\u045e\u00a3\3\2\2\2\u045f\u0463"+ - "\5\u00a6T\2\u0460\u0461\7e\2\2\u0461\u0462\7F\2\2\u0462\u0464\5\u015c"+ - "\u00af\2\u0463\u0460\3\2\2\2\u0463\u0464\3\2\2\2\u0464\u00a5\3\2\2\2\u0465"+ - "\u046e\5\u00aaV\2\u0466\u0467\7\5\2\2\u0467\u0468\7,\2\2\u0468\u0469\3"+ - "\2\2\2\u0469\u046a\5\u00a8U\2\u046a\u046b\5\u00ceh\2\u046b\u046d\3\2\2"+ - "\2\u046c\u0466\3\2\2\2\u046d\u0470\3\2\2\2\u046e\u046c\3\2\2\2\u046e\u046f"+ - "\3\2\2\2\u046f\u00a7\3\2\2\2\u0470\u046e\3\2\2\2\u0471\u0475\5J&\2\u0472"+ - "\u0475\5\u00c2b\2\u0473\u0475\5\u00c4c\2\u0474\u0471\3\2\2\2\u0474\u0472"+ - "\3\2\2\2\u0474\u0473\3\2\2\2\u0475\u00a9\3\2\2\2\u0476\u0478\t\6\2\2\u0477"+ - "\u0476\3\2\2\2\u0478\u047b\3\2\2\2\u0479\u0477\3\2\2\2\u0479\u047a\3\2"+ - "\2\2\u047a\u047c\3\2\2\2\u047b\u0479\3\2\2\2\u047c\u047d\5\u00acW\2\u047d"+ - "\u00ab\3\2\2\2\u047e\u0482\5\u00b2Z\2\u047f\u0482\5\u00aeX\2\u0480\u0482"+ - "\5\u00b0Y\2\u0481\u047e\3\2\2\2\u0481\u047f\3\2\2\2\u0481\u0480\3\2\2"+ - "\2\u0482\u00ad\3\2\2\2\u0483\u0484\7m\2\2\u0484\u0485\7l\2\2\u0485\u0486"+ - "\5\u0152\u00aa\2\u0486\u0487\7\b\2\2\u0487\u0488\5^\60\2\u0488\u0489\7"+ - "\t\2\2\u0489\u00af\3\2\2\2\u048a\u048b\7n\2\2\u048b\u048c\7l\2\2\u048c"+ - "\u048d\5\u0152\u00aa\2\u048d\u048e\7\b\2\2\u048e\u048f\5^\60\2\u048f\u0490"+ - "\7\t\2\2\u0490\u00b1\3\2\2\2\u0491\u0496\5\u00ecw\2\u0492\u0493\7\64\2"+ - "\2\u0493\u0495\5\u00ecw\2\u0494\u0492\3\2\2\2\u0495\u0498\3\2\2\2\u0496"+ - "\u0494\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u00b3\3\2\2\2\u0498\u0496\3\2"+ - "\2\2\u0499\u04a1\5\u00be`\2\u049a\u04a0\5\u00b6\\\2\u049b\u04a0\5\u00ba"+ - "^\2\u049c\u04a0\5\u00bc_\2\u049d\u04a0\5\u00b8]\2\u049e\u04a0\5\u00ce"+ - "h\2\u049f\u049a\3\2\2\2\u049f\u049b\3\2\2\2\u049f\u049c\3\2\2\2\u049f"+ - "\u049d\3\2\2\2\u049f\u049e\3\2\2\2\u04a0\u04a3\3\2\2\2\u04a1\u049f\3\2"+ - "\2\2\u04a1\u04a2\3\2\2\2\u04a2\u00b5\3\2\2\2\u04a3\u04a1\3\2\2\2\u04a4"+ - "\u04a5\7\65\2\2\u04a5\u04a6\7\65\2\2\u04a6\u04a7\5^\60\2\u04a7\u04a8\7"+ - "\66\2\2\u04a8\u04a9\7\66\2\2\u04a9\u00b7\3\2\2\2\u04aa\u04ab\7\65\2\2"+ - "\u04ab\u04ac\7\66\2\2\u04ac\u00b9\3\2\2\2\u04ad\u04ae\7\65\2\2\u04ae\u04af"+ - "\5^\60\2\u04af\u04b0\7\66\2\2\u04b0\u00bb\3\2\2\2\u04b1\u04b8\7\67\2\2"+ - "\u04b2\u04b9\5\u0166\u00b4\2\u04b3\u04b9\5\u0164\u00b3\2\u04b4\u04b9\7"+ - "\u00b2\2\2\u04b5\u04b9\5\u00c4c\2\u04b6\u04b9\5\u00c2b\2\u04b7\u04b9\5"+ - "\u00c6d\2\u04b8\u04b2\3\2\2\2\u04b8\u04b3\3\2\2\2\u04b8\u04b4\3\2\2\2"+ - "\u04b8\u04b5\3\2\2\2\u04b8\u04b6\3\2\2\2\u04b8\u04b7\3\2\2\2\u04b9\u00bd"+ - "\3\2\2\2\u04ba\u04ca\7\u00ab\2\2\u04bb\u04ca\7j\2\2\u04bc\u04ca\7k\2\2"+ - "\u04bd\u04ca\7\u00ac\2\2\u04be\u04ca\5\u0164\u00b3\2\u04bf\u04ca\5\u00c2"+ - "b\2\u04c0\u04ca\5\u00c4c\2\u04c1\u04ca\5\u00c6d\2\u04c2\u04ca\5\u0154"+ - "\u00ab\2\u04c3\u04ca\5\u00ccg\2\u04c4\u04ca\5\u00c8e\2\u04c5\u04ca\5\u00ca"+ - "f\2\u04c6\u04ca\5\u0160\u00b1\2\u04c7\u04ca\5\u00d2j\2\u04c8\u04ca\5\u00c0"+ - "a\2\u04c9\u04ba\3\2\2\2\u04c9\u04bb\3\2\2\2\u04c9\u04bc\3\2\2\2\u04c9"+ - "\u04bd\3\2\2\2\u04c9\u04be\3\2\2\2\u04c9\u04bf\3\2\2\2\u04c9\u04c0\3\2"+ - "\2\2\u04c9\u04c1\3\2\2\2\u04c9\u04c2\3\2\2\2\u04c9\u04c3\3\2\2\2\u04c9"+ - "\u04c4\3\2\2\2\u04c9\u04c5\3\2\2\2\u04c9\u04c6\3\2\2\2\u04c9\u04c7\3\2"+ - "\2\2\u04c9\u04c8\3\2\2\2\u04ca\u00bf\3\2\2\2\u04cb\u04cc\7\b\2\2\u04cc"+ - "\u04cd\5\20\t\2\u04cd\u04ce\7\t\2\2\u04ce\u00c1\3\2\2\2\u04cf\u04d0\7"+ - "\6\2\2\u04d0\u04d1\5J&\2\u04d1\u00c3\3\2\2\2\u04d2\u04d4\7\n\2\2\u04d3"+ - "\u04d5\5^\60\2\u04d4\u04d3\3\2\2\2\u04d4\u04d5\3\2\2\2\u04d5\u04d6\3\2"+ - "\2\2\u04d6\u04d7\7\13\2\2\u04d7\u00c5\3\2\2\2\u04d8\u04d9\78\2\2\u04d9"+ - "\u00c7\3\2\2\2\u04da\u04db\7\21\2\2\u04db\u04dc\7\b\2\2\u04dc\u04dd\5"+ - "^\60\2\u04dd\u04de\7\t\2\2\u04de\u00c9\3\2\2\2\u04df\u04e0\7i\2\2\u04e0"+ - "\u04e1\7\b\2\2\u04e1\u04e2\5^\60\2\u04e2\u04e3\7\t\2\2\u04e3\u00cb\3\2"+ - "\2\2\u04e4\u04e5\5J&\2\u04e5\u04e6\5\u00ceh\2\u04e6\u00cd\3\2\2\2\u04e7"+ - "\u04ee\7\n\2\2\u04e8\u04ea\5\u00d0i\2\u04e9\u04eb\7\17\2\2\u04ea\u04e9"+ - "\3\2\2\2\u04ea\u04eb\3\2\2\2\u04eb\u04ed\3\2\2\2\u04ec\u04e8\3\2\2\2\u04ed"+ - "\u04f0\3\2\2\2\u04ee\u04ec\3\2\2\2\u04ee\u04ef\3\2\2\2\u04ef\u04f1\3\2"+ - "\2\2\u04f0\u04ee\3\2\2\2\u04f1\u04f2\7\13\2\2\u04f2\u00cf\3\2\2\2\u04f3"+ - "\u04f6\5`\61\2\u04f4\u04f6\7\u00aa\2\2\u04f5\u04f3\3\2\2\2\u04f5\u04f4"+ - "\3\2\2\2\u04f6\u00d1\3\2\2\2\u04f7\u04fa\5\u00d4k\2\u04f8\u04fa\5\u00d6"+ - "l\2\u04f9\u04f7\3\2\2\2\u04f9\u04f8\3\2\2\2\u04fa\u00d3\3\2\2\2\u04fb"+ - "\u04fc\5J&\2\u04fc\u04fd\79\2\2\u04fd\u04fe\7\u00ac\2\2\u04fe\u00d5\3"+ - "\2\2\2\u04ff\u0500\5\64\33\2\u0500\u0501\7\37\2\2\u0501\u0503\7\n\2\2"+ - "\u0502\u0504\5Z.\2\u0503\u0502\3\2\2\2\u0503\u0504\3\2\2\2\u0504\u0505"+ - "\3\2\2\2\u0505\u0508\7\13\2\2\u0506\u0507\7F\2\2\u0507\u0509\5\u0152\u00aa"+ - "\2\u0508\u0506\3\2\2\2\u0508\u0509\3\2\2\2\u0509\u050a\3\2\2\2\u050a\u050b"+ - "\7\b\2\2\u050b\u050c\5\22\n\2\u050c\u050d\7\t\2\2\u050d\u00d7\3\2\2\2"+ - "\u050e\u050f\7s\2\2\u050f\u0510\7|\2\2\u0510\u0511\5`\61\2\u0511\u0512"+ - "\7z\2\2\u0512\u0516\5`\61\2\u0513\u0514\7G\2\2\u0514\u0515\7~\2\2\u0515"+ - "\u0517\5`\61\2\u0516\u0513\3\2\2\2\u0516\u0517\3\2\2\2\u0517\u0526\3\2"+ - "\2\2\u0518\u0519\7s\2\2\u0519\u051a\7|\2\2\u051a\u051f\5\u015e\u00b0\2"+ - "\u051b\u051c\7\17\2\2\u051c\u051e\5\u015e\u00b0\2\u051d\u051b\3\2\2\2"+ - "\u051e\u0521\3\2\2\2\u051f\u051d\3\2\2\2\u051f\u0520\3\2\2\2\u0520\u0522"+ - "\3\2\2\2\u0521\u051f\3\2\2\2\u0522\u0523\7z\2\2\u0523\u0524\5`\61\2\u0524"+ - "\u0526\3\2\2\2\u0525\u050e\3\2\2\2\u0525\u0518\3\2\2\2\u0526\u00d9\3\2"+ - "\2\2\u0527\u0528\7t\2\2\u0528\u0529\7|\2\2\u0529\u052a\5\u00e4s\2\u052a"+ - "\u00db\3\2\2\2\u052b\u052c\7u\2\2\u052c\u052d\7|\2\2\u052d\u052e\5\u00e4"+ - "s\2\u052e\u052f\7F\2\2\u052f\u0530\5`\61\2\u0530\u00dd\3\2\2\2\u0531\u0532"+ - "\7v\2\2\u0532\u0533\7|\2\2\u0533\u0534\7{\2\2\u0534\u0535\7a\2\2\u0535"+ - "\u0536\5\u00e4s\2\u0536\u0537\7}\2\2\u0537\u0538\5`\61\2\u0538\u00df\3"+ - "\2\2\2\u0539\u053a\7w\2\2\u053a\u053b\7|\2\2\u053b\u0540\5\u00e6t\2\u053c"+ - "\u053d\7\17\2\2\u053d\u053f\5\u00e6t\2\u053e\u053c\3\2\2\2\u053f\u0542"+ - "\3\2\2\2\u0540\u053e\3\2\2\2\u0540\u0541\3\2\2\2\u0541\u0543\3\2\2\2\u0542"+ - "\u0540\3\2\2\2\u0543\u0544\7x\2\2\u0544\u0545\5`\61\2\u0545\u0546\7C\2"+ - "\2\u0546\u0547\5`\61\2\u0547\u00e1\3\2\2\2\u0548\u0549\7y\2\2\u0549\u054a"+ - "\7|\2\2\u054a\u054b\5`\61\2\u054b\u054c\7z\2\2\u054c\u054d\5`\61\2\u054d"+ - "\u00e3\3\2\2\2\u054e\u0551\5\u00be`\2\u054f\u0552\5\u00b6\\\2\u0550\u0552"+ - "\5\u00bc_\2\u0551\u054f\3\2\2\2\u0551\u0550\3\2\2\2\u0552\u0553\3\2\2"+ - "\2\u0553\u0551\3\2\2\2\u0553\u0554\3\2\2\2\u0554\u00e5\3\2\2\2\u0555\u0556"+ - "\5\u00c2b\2\u0556\u0557\7\7\2\2\u0557\u0558\5`\61\2\u0558\u00e7\3\2\2"+ - "\2\u0559\u055a\7\u0085\2\2\u055a\u055c\7\u0086\2\2\u055b\u055d\5\u00ea"+ - "v\2\u055c\u055b\3\2\2\2\u055c\u055d\3\2\2\2\u055d\u055e\3\2\2\2\u055e"+ - "\u0568\5\u0162\u00b2\2\u055f\u0560\7G\2\2\u0560\u0565\5\u0162\u00b2\2"+ - "\u0561\u0562\7\17\2\2\u0562\u0564\5\u0162\u00b2\2\u0563\u0561\3\2\2\2"+ - "\u0564\u0567\3\2\2\2\u0565\u0563\3\2\2\2\u0565\u0566\3\2\2\2\u0566\u0569"+ - "\3\2\2\2\u0567\u0565\3\2\2\2\u0568\u055f\3\2\2\2\u0568\u0569\3\2\2\2\u0569"+ - "\u00e9\3\2\2\2\u056a\u056b\7\u0087\2\2\u056b\u056c\7\u00b2\2\2\u056c\u0571"+ - "\7\5\2\2\u056d\u056e\7X\2\2\u056e\u056f\7\u0088\2\2\u056f\u0571\7\u0087"+ - "\2\2\u0570\u056a\3\2\2\2\u0570\u056d\3\2\2\2\u0571\u00eb\3\2\2\2\u0572"+ - "\u0574\7\u0089\2\2\u0573\u0575\5\u00eex\2\u0574\u0573\3\2\2\2\u0574\u0575"+ - "\3\2\2\2\u0575\u057a\3\2\2\2\u0576\u0577\7\u008a\2\2\u0577\u057a\5\u00ee"+ - "x\2\u0578\u057a\5\u00eex\2\u0579\u0572\3\2\2\2\u0579\u0576\3\2\2\2\u0579"+ - "\u0578\3\2\2\2\u057a\u00ed\3\2\2\2\u057b\u0580\5\u00f0y\2\u057c\u057d"+ - "\t\b\2\2\u057d\u057f\5\u00f0y\2\u057e\u057c\3\2\2\2\u057f\u0582\3\2\2"+ - "\2\u0580\u057e\3\2\2\2\u0580\u0581\3\2\2\2\u0581\u00ef\3\2\2\2\u0582\u0580"+ - "\3\2\2\2\u0583\u0586\5\u00b4[\2\u0584\u0586\5\u00f2z\2\u0585\u0583\3\2"+ - "\2\2\u0585\u0584\3\2\2\2\u0586\u00f1\3\2\2\2\u0587\u058a\5\u00fa~\2\u0588"+ - "\u058a\5\u00f4{\2\u0589\u0587\3\2\2\2\u0589\u0588\3\2\2\2\u058a\u058b"+ - "\3\2\2\2\u058b\u058c\5\u010a\u0086\2\u058c\u00f3\3\2\2\2\u058d\u058e\5"+ - "\u00f6|\2\u058e\u058f\5\u0100\u0081\2\u058f\u0592\3\2\2\2\u0590\u0592"+ - "\5\u00f8}\2\u0591\u058d\3\2\2\2\u0591\u0590\3\2\2\2\u0592\u00f5\3\2\2"+ - "\2\u0593\u0594\t\t\2\2\u0594\u0595\7\23\2\2\u0595\u0596\7\23\2\2\u0596"+ - "\u00f7\3\2\2\2\u0597\u0599\7\u008b\2\2\u0598\u0597\3\2\2\2\u0598\u0599"+ - "\3\2\2\2\u0599\u059a\3\2\2\2\u059a\u059b\5\u0100\u0081\2\u059b\u00f9\3"+ - "\2\2\2\u059c\u059d\5\u00fc\177\2\u059d\u059e\5\u0100\u0081\2\u059e\u05a1"+ - "\3\2\2\2\u059f\u05a1\5\u00fe\u0080\2\u05a0\u059c\3\2\2\2\u05a0\u059f\3"+ - "\2\2\2\u05a1\u00fb\3\2\2\2\u05a2\u05a3\t\n\2\2\u05a3\u05a4\7\23\2\2\u05a4"+ - "\u05a5\7\23\2\2\u05a5\u00fd\3\2\2\2\u05a6\u05a7\7:\2\2\u05a7\u00ff\3\2"+ - "\2\2\u05a8\u05ab\5\u0102\u0082\2\u05a9\u05ab\5\u0110\u0089\2\u05aa\u05a8"+ - "\3\2\2\2\u05aa\u05a9\3\2\2\2\u05ab\u0101\3\2\2\2\u05ac\u05af\5J&\2\u05ad"+ - "\u05af\5\u0104\u0083\2\u05ae\u05ac\3\2\2\2\u05ae\u05ad\3\2\2\2\u05af\u0103"+ - "\3\2\2\2\u05b0\u05b4\7\f\2\2\u05b1\u05b4\5\u0106\u0084\2\u05b2\u05b4\5"+ - "\u0108\u0085\2\u05b3\u05b0\3\2\2\2\u05b3\u05b1\3\2\2\2\u05b3\u05b2\3\2"+ - "\2\2\u05b4\u0105\3\2\2\2\u05b5\u05b6\7\u00b2\2\2\u05b6\u05b7\7\23\2\2"+ - "\u05b7\u05b8\7\f\2\2\u05b8\u0107\3\2\2\2\u05b9\u05ba\7\f\2\2\u05ba\u05bb"+ - "\7\23\2\2\u05bb\u05bc\7\u00b2\2\2\u05bc\u0109\3\2\2\2\u05bd\u05bf\5\u00ba"+ - "^\2\u05be\u05bd\3\2\2\2\u05bf\u05c2\3\2\2\2\u05c0\u05be\3\2\2\2\u05c0"+ - "\u05c1\3\2\2\2\u05c1\u010b\3\2\2\2\u05c2\u05c0\3\2\2\2\u05c3\u05cf\5J"+ - "&\2\u05c4\u05cf\7\u00ab\2\2\u05c5\u05cf\5\u0110\u0089\2\u05c6\u05c7\7"+ - "q\2\2\u05c7\u05c8\7\n\2\2\u05c8\u05cf\7\13\2\2\u05c9\u05cf\5\u0156\u00ac"+ - "\2\u05ca\u05cf\5\u0136\u009c\2\u05cb\u05cf\5\u013c\u009f\2\u05cc\u05cf"+ - "\5\u010e\u0088\2\u05cd\u05cf\5\u0142\u00a2\2\u05ce\u05c3\3\2\2\2\u05ce"+ - "\u05c4\3\2\2\2\u05ce\u05c5\3\2\2\2\u05ce\u05c6\3\2\2\2\u05ce\u05c9\3\2"+ - "\2\2\u05ce\u05ca\3\2\2\2\u05ce\u05cb\3\2\2\2\u05ce\u05cc\3\2\2\2\u05ce"+ - "\u05cd\3\2\2\2\u05cf\u010d\3\2\2\2\u05d0\u05d1\5J&\2\u05d1\u010f\3\2\2"+ - "\2\u05d2\u05df\5\u0116\u008c\2\u05d3\u05df\5\u0126\u0094\2\u05d4\u05df"+ - "\5\u0120\u0091\2\u05d5\u05df\5\u012a\u0096\2\u05d6\u05df\5\u0124\u0093"+ - "\2\u05d7\u05df\5\u011e\u0090\2\u05d8\u05df\5\u011a\u008e\2\u05d9\u05df"+ - "\5\u0118\u008d\2\u05da\u05df\5\u011c\u008f\2\u05db\u05df\5\u0146\u00a4"+ - "\2\u05dc\u05df\5\u0114\u008b\2\u05dd\u05df\5\u0112\u008a\2\u05de\u05d2"+ - "\3\2\2\2\u05de\u05d3\3\2\2\2\u05de\u05d4\3\2\2\2\u05de\u05d5\3\2\2\2\u05de"+ - "\u05d6\3\2\2\2\u05de\u05d7\3\2\2\2\u05de\u05d8\3\2\2\2\u05de\u05d9\3\2"+ - "\2\2\u05de\u05da\3\2\2\2\u05de\u05db\3\2\2\2\u05de\u05dc\3\2\2\2\u05de"+ - "\u05dd\3\2\2\2\u05df\u0111\3\2\2\2\u05e0\u05e1\7\u0098\2\2\u05e1\u05e2"+ - "\7\n\2\2\u05e2\u05e3\7\13\2\2\u05e3\u0113\3\2\2\2\u05e4\u05e5\7\u0099"+ - "\2\2\u05e5\u05e6\7\n\2\2\u05e6\u05e7\7\13\2\2\u05e7\u0115\3\2\2\2\u05e8"+ - "\u05e9\7\u009b\2\2\u05e9\u05ec\7\n\2\2\u05ea\u05ed\5\u0126\u0094\2\u05eb"+ - "\u05ed\5\u012a\u0096\2\u05ec\u05ea\3\2\2\2\u05ec\u05eb\3\2\2\2\u05ec\u05ed"+ - "\3\2\2\2\u05ed\u05ee\3\2\2\2\u05ee\u05ef\7\13\2\2\u05ef\u0117\3\2\2\2"+ - "\u05f0\u05f1\7\u009c\2\2\u05f1\u05f2\7\n\2\2\u05f2\u05f3\7\13\2\2\u05f3"+ - "\u0119\3\2\2\2\u05f4\u05f5\7\u00a6\2\2\u05f5\u05f6\7\n\2\2\u05f6\u05f7"+ - "\7\13\2\2\u05f7\u011b\3\2\2\2\u05f8\u05f9\7\u009e\2\2\u05f9\u05fa\7\n"+ - "\2\2\u05fa\u05fb\7\13\2\2\u05fb\u011d\3\2\2\2\u05fc\u05fd\7\u009d\2\2"+ - "\u05fd\u0600\7\n\2\2\u05fe\u0601\7\u00b2\2\2\u05ff\u0601\5\u0164\u00b3"+ - "\2\u0600\u05fe\3\2\2\2\u0600\u05ff\3\2\2\2\u0600\u0601\3\2\2\2\u0601\u0602"+ - "\3\2\2\2\u0602\u0603\7\13\2\2\u0603\u011f\3\2\2\2\u0604\u0605\7\u008e"+ - "\2\2\u0605\u060b\7\n\2\2\u0606\u0609\5\u0122\u0092\2\u0607\u0608\7\17"+ - "\2\2\u0608\u060a\5\u0134\u009b\2\u0609\u0607\3\2\2\2\u0609\u060a\3\2\2"+ - "\2\u060a\u060c\3\2\2\2\u060b\u0606\3\2\2\2\u060b\u060c\3\2\2\2\u060c\u060d"+ - "\3\2\2\2\u060d\u060e\7\13\2\2\u060e\u0121\3\2\2\2\u060f\u0612\5\u012e"+ - "\u0098\2\u0610\u0612\7\f\2\2\u0611\u060f\3\2\2\2\u0611\u0610\3\2\2\2\u0612"+ - "\u0123\3\2\2\2\u0613\u0614\7\u009f\2\2\u0614\u0615\7\n\2\2\u0615\u0616"+ - "\5\u0144\u00a3\2\u0616\u0617\7\13\2\2\u0617\u0125\3\2\2\2\u0618\u0619"+ - "\7\u0088\2\2\u0619\u0622\7\n\2\2\u061a\u0620\5\u0128\u0095\2\u061b\u061c"+ - "\7\17\2\2\u061c\u061e\5\u0134\u009b\2\u061d\u061f\7\u00aa\2\2\u061e\u061d"+ - "\3\2\2\2\u061e\u061f\3\2\2\2\u061f\u0621\3\2\2\2\u0620\u061b\3\2\2\2\u0620"+ - "\u0621\3\2\2\2\u0621\u0623\3\2\2\2\u0622\u061a\3\2\2\2\u0622\u0623\3\2"+ - "\2\2\u0623\u0624\3\2\2\2\u0624\u0625\7\13\2\2\u0625\u0127\3\2\2\2\u0626"+ - "\u0629\5\u0130\u0099\2\u0627\u0629\7\f\2\2\u0628\u0626\3\2\2\2\u0628\u0627"+ - "\3\2\2\2\u0629\u0129\3\2\2\2\u062a\u062b\7\u00a0\2\2\u062b\u062c\7\n\2"+ - "\2\u062c\u062d\5\u012c\u0097\2\u062d\u062e\7\13\2\2\u062e\u012b\3\2\2"+ - "\2\u062f\u0630\5\u0130\u0099\2\u0630\u012d\3\2\2\2\u0631\u0632\5J&\2\u0632"+ - "\u012f\3\2\2\2\u0633\u0634\5J&\2\u0634\u0131\3\2\2\2\u0635\u0636\5\u0134"+ - "\u009b\2\u0636\u0133\3\2\2\2\u0637\u0638\5J&\2\u0638\u0135\3\2\2\2\u0639"+ - "\u063c\5\u0138\u009d\2\u063a\u063c\5\u013a\u009e\2\u063b\u0639\3\2\2\2"+ - "\u063b\u063a\3\2\2\2\u063c\u0137\3\2\2\2\u063d\u063e\7\u00a8\2\2\u063e"+ - "\u063f\7\n\2\2\u063f\u0640\7\f\2\2\u0640\u0641\7\13\2\2\u0641\u0139\3"+ - "\2\2\2\u0642\u0643\7\u00a8\2\2\u0643\u0644\7\n\2\2\u0644\u0645\5J&\2\u0645"+ - "\u0646\7\17\2\2\u0646\u0647\5\u0152\u00aa\2\u0647\u0648\7\13\2\2\u0648"+ - "\u013b\3\2\2\2\u0649\u064c\5\u013e\u00a0\2\u064a\u064c\5\u0140\u00a1\2"+ - "\u064b\u0649\3\2\2\2\u064b\u064a\3\2\2\2\u064c\u013d\3\2\2\2\u064d\u064e"+ - "\7\u00a7\2\2\u064e\u064f\7\n\2\2\u064f\u0650\7\f\2\2\u0650\u0651\7\13"+ - "\2\2\u0651\u013f\3\2\2\2\u0652\u0653\7\u00a7\2\2\u0653\u0654\7\n\2\2\u0654"+ - "\u0655\5\u0152\u00aa\2\u0655\u0656\7\13\2\2\u0656\u0141\3\2\2\2\u0657"+ - "\u0658\7\n\2\2\u0658\u0659\5\u010c\u0087\2\u0659\u065a\7\13\2\2\u065a"+ - "\u0143\3\2\2\2\u065b\u065c\5\u012e\u0098\2\u065c\u0145\3\2\2\2\u065d\u0663"+ - "\5\u0148\u00a5\2\u065e\u0663\5\u014a\u00a6\2\u065f\u0663\5\u014c\u00a7"+ - "\2\u0660\u0663\5\u014e\u00a8\2\u0661\u0663\5\u0150\u00a9\2\u0662\u065d"+ - "\3\2\2\2\u0662\u065e\3\2\2\2\u0662\u065f\3\2\2\2\u0662\u0660\3\2\2\2\u0662"+ - "\u0661\3\2\2\2\u0663\u0147\3\2\2\2\u0664\u0665\7\u00a1\2\2\u0665\u0667"+ - "\7\n\2\2\u0666\u0668\5\u0164\u00b3\2\u0667\u0666\3\2\2\2\u0667\u0668\3"+ - "\2\2\2\u0668\u0669\3\2\2\2\u0669\u066a\7\13\2\2\u066a\u0149\3\2\2\2\u066b"+ - "\u066c\7\u00a5\2\2\u066c\u066e\7\n\2\2\u066d\u066f\5\u0164\u00b3\2\u066e"+ - "\u066d\3\2\2\2\u066e\u066f\3\2\2\2\u066f\u0670\3\2\2\2\u0670\u0671\7\13"+ - "\2\2\u0671\u014b\3\2\2\2\u0672\u0673\7\u00a4\2\2\u0673\u0675\7\n\2\2\u0674"+ - "\u0676\5\u0164\u00b3\2\u0675\u0674\3\2\2\2\u0675\u0676\3\2\2\2\u0676\u0677"+ - "\3\2\2\2\u0677\u0678\7\13\2\2\u0678\u014d\3\2\2\2\u0679\u067a\7\u00a2"+ - "\2\2\u067a\u067c\7\n\2\2\u067b\u067d\5\u0164\u00b3\2\u067c\u067b\3\2\2"+ - "\2\u067c\u067d\3\2\2\2\u067d\u067e\3\2\2\2\u067e\u067f\7\13\2\2\u067f"+ - "\u014f\3\2\2\2\u0680\u0681\7\u00a3\2\2\u0681\u0683\7\n\2\2\u0682\u0684"+ - "\5\u0164\u00b3\2\u0683\u0682\3\2\2\2\u0683\u0684\3\2\2\2\u0684\u0685\3"+ - "\2\2\2\u0685\u0686\7\13\2\2\u0686\u0151\3\2\2\2\u0687\u0688\7\n\2\2\u0688"+ - "\u0690\7\13\2\2\u0689\u068d\5\u010c\u0087\2\u068a\u068e\7\u00aa\2\2\u068b"+ - "\u068e\7\f\2\2\u068c\u068e\7/\2\2\u068d\u068a\3\2\2\2\u068d\u068b\3\2"+ - "\2\2\u068d\u068c\3\2\2\2\u068d\u068e\3\2\2\2\u068e\u0690\3\2\2\2\u068f"+ - "\u0687\3\2\2\2\u068f\u0689\3\2\2\2\u0690\u0153\3\2\2\2\u0691\u069a\7\b"+ - "\2\2\u0692\u0697\5\u015e\u00b0\2\u0693\u0694\7\17\2\2\u0694\u0696\5\u015e"+ - "\u00b0\2\u0695\u0693\3\2\2\2\u0696\u0699\3\2\2\2\u0697\u0695\3\2\2\2\u0697"+ - "\u0698\3\2\2\2\u0698\u069b\3\2\2\2\u0699\u0697\3\2\2\2\u069a\u0692\3\2"+ - "\2\2\u069a\u069b\3\2\2\2\u069b\u069c\3\2\2\2\u069c\u06a2\7\t\2\2\u069d"+ - "\u069e\7;\2\2\u069e\u069f\5^\60\2\u069f\u06a0\7<\2\2\u06a0\u06a2\3\2\2"+ - "\2\u06a1\u0691\3\2\2\2\u06a1\u069d\3\2\2\2\u06a2\u0155\3\2\2\2\u06a3\u06a6"+ - "\5\u0158\u00ad\2\u06a4\u06a6\5\u015a\u00ae\2\u06a5\u06a3\3\2\2\2\u06a5"+ - "\u06a4\3\2\2\2\u06a6\u0157\3\2\2\2\u06a7\u06a8\7\37\2\2\u06a8\u06a9\7"+ - "\n\2\2\u06a9\u06aa\7\f\2\2\u06aa\u06ab\7\13\2\2\u06ab\u0159\3\2\2\2\u06ac"+ - "\u06ad\7\37\2\2\u06ad\u06b6\7\n\2\2\u06ae\u06b3\5\u0152\u00aa\2\u06af"+ - "\u06b0\7\17\2\2\u06b0\u06b2\5\u0152\u00aa\2\u06b1\u06af\3\2\2\2\u06b2"+ - "\u06b5\3\2\2\2\u06b3\u06b1\3\2\2\2\u06b3\u06b4\3\2\2\2\u06b4\u06b7\3\2"+ - "\2\2\u06b5\u06b3\3\2\2\2\u06b6\u06ae\3\2\2\2\u06b6\u06b7\3\2\2\2\u06b7"+ - "\u06b8\3\2\2\2\u06b8\u06b9\7\13\2\2\u06b9\u06ba\7F\2\2\u06ba\u06bb\5\u0152"+ - "\u00aa\2\u06bb\u015b\3\2\2\2\u06bc\u06be\5\u010c\u0087\2\u06bd\u06bf\7"+ - "\u00aa\2\2\u06be\u06bd\3\2\2\2\u06be\u06bf\3\2\2\2\u06bf\u015d\3\2\2\2"+ - "\u06c0\u06c3\5`\61\2\u06c1\u06c3\7\u00b2\2\2\u06c2\u06c0\3\2\2\2\u06c2"+ - "\u06c1\3\2\2\2\u06c3\u06c4\3\2\2\2\u06c4\u06c5\t\13\2\2\u06c5\u06c6\5"+ - "`\61\2\u06c6\u015f\3\2\2\2\u06c7\u06c9\7\65\2\2\u06c8\u06ca\5^\60\2\u06c9"+ - "\u06c8\3\2\2\2\u06c9\u06ca\3\2\2\2\u06ca\u06cb\3\2\2\2\u06cb\u06cc\7\66"+ - "\2\2\u06cc\u0161\3\2\2\2\u06cd\u06ce\5\u0164\u00b3\2\u06ce\u0163\3\2\2"+ - "\2\u06cf\u06d0\7\u00a9\2\2\u06d0\u0165\3\2\2\2\u06d1\u06d2\t\f\2\2\u06d2"+ - "\u0167\3\2\2\2\u00a8\u0170\u0174\u0184\u018a\u0192\u019a\u01a2\u01b1\u01cf"+ - "\u01d7\u01d9\u01ef\u01f9\u0203\u0208\u020d\u0211\u021d\u0221\u022a\u0231"+ - "\u023f\u0243\u0248\u0252\u025a\u025e\u026a\u0276\u028c\u0294\u0299\u029c"+ - "\u02a0\u02a9\u02b2\u02b5\u02bd\u02c4\u02c6\u02cd\u02d4\u02d6\u02de\u02e3"+ - "\u02ea\u02f1\u02fb\u0302\u0309\u0310\u0319\u0323\u0327\u032f\u0331\u033d"+ - "\u0343\u0347\u034b\u0356\u035c\u036b\u0371\u0375\u0379\u0380\u0387\u038d"+ - "\u0392\u0394\u0398\u039f\u03a6\u03af\u03bb\u03c5\u03d1\u03d5\u03de\u03e5"+ - "\u03fb\u0400\u0405\u0409\u0415\u041d\u0421\u0428\u042f\u0435\u043c\u0444"+ - "\u044b\u0451\u0457\u045d\u0463\u046e\u0474\u0479\u0481\u0496\u049f\u04a1"+ - "\u04b8\u04c9\u04d4\u04ea\u04ee\u04f5\u04f9\u0503\u0508\u0516\u051f\u0525"+ - "\u0540\u0551\u0553\u055c\u0565\u0568\u0570\u0574\u0579\u0580\u0585\u0589"+ - "\u0591\u0598\u05a0\u05aa\u05ae\u05b3\u05c0\u05ce\u05de\u05ec\u0600\u0609"+ - "\u060b\u0611\u061e\u0620\u0622\u0628\u063b\u064b\u0662\u0667\u066e\u0675"+ - "\u067c\u0683\u068d\u068f\u0697\u069a\u06a1\u06a5\u06b3\u06b6\u06be\u06c2"+ - "\u06c9"; + "\u013e\u0140\u0142\u0144\u0146\2\r\4\2\21\21ii\3\2RS\3\2\24\35\4\2\5\5"+ + "#-\3\2/\60\4\2\f\f\61\63\3\2\u0083\u0084\3\2\u0086\u008c\3\2\u008d\u0091"+ + "\4\2\23\23\u00a8\u00a8\5\2=~\u00a1\u00a6\u00a9\u00a9\2\u0680\2\u0148\3"+ + "\2\2\2\4\u0150\3\2\2\2\6\u0156\3\2\2\2\b\u0159\3\2\2\2\n\u016a\3\2\2\2"+ + "\f\u0175\3\2\2\2\16\u017a\3\2\2\2\20\u017d\3\2\2\2\22\u0180\3\2\2\2\24"+ + "\u0191\3\2\2\2\26\u0193\3\2\2\2\30\u0196\3\2\2\2\32\u019c\3\2\2\2\34\u01a0"+ + "\3\2\2\2\36\u01a4\3\2\2\2 \u01a8\3\2\2\2\"\u01af\3\2\2\2$\u01bf\3\2\2"+ + "\2&\u01c8\3\2\2\2(\u01d7\3\2\2\2*\u01de\3\2\2\2,\u01e5\3\2\2\2.\u01f6"+ + "\3\2\2\2\60\u0206\3\2\2\2\62\u0217\3\2\2\2\64\u0228\3\2\2\2\66\u022b\3"+ + "\2\2\28\u0237\3\2\2\2:\u0240\3\2\2\2<\u024a\3\2\2\2>\u024c\3\2\2\2@\u0256"+ + "\3\2\2\2B\u0258\3\2\2\2D\u025d\3\2\2\2F\u0261\3\2\2\2H\u0267\3\2\2\2J"+ + "\u027c\3\2\2\2L\u0282\3\2\2\2N\u0284\3\2\2\2P\u0297\3\2\2\2R\u02a8\3\2"+ + "\2\2T\u02b8\3\2\2\2V\u02cc\3\2\2\2X\u02db\3\2\2\2Z\u02dd\3\2\2\2\\\u02e5"+ + "\3\2\2\2^\u02eb\3\2\2\2`\u02f9\3\2\2\2b\u0303\3\2\2\2d\u0307\3\2\2\2f"+ + "\u0317\3\2\2\2h\u0320\3\2\2\2j\u0330\3\2\2\2l\u0339\3\2\2\2n\u0341\3\2"+ + "\2\2p\u0344\3\2\2\2r\u034e\3\2\2\2t\u0360\3\2\2\2v\u036a\3\2\2\2x\u037a"+ + "\3\2\2\2z\u037f\3\2\2\2|\u038c\3\2\2\2~\u0394\3\2\2\2\u0080\u03a3\3\2"+ + "\2\2\u0082\u03aa\3\2\2\2\u0084\u03ba\3\2\2\2\u0086\u03cb\3\2\2\2\u0088"+ + "\u03d4\3\2\2\2\u008a\u03dd\3\2\2\2\u008c\u03f0\3\2\2\2\u008e\u03f8\3\2"+ + "\2\2\u0090\u0401\3\2\2\2\u0092\u0405\3\2\2\2\u0094\u040a\3\2\2\2\u0096"+ + "\u0412\3\2\2\2\u0098\u0417\3\2\2\2\u009a\u041f\3\2\2\2\u009c\u0427\3\2"+ + "\2\2\u009e\u042d\3\2\2\2\u00a0\u0433\3\2\2\2\u00a2\u0439\3\2\2\2\u00a4"+ + "\u043f\3\2\2\2\u00a6\u0445\3\2\2\2\u00a8\u0454\3\2\2\2\u00aa\u0459\3\2"+ + "\2\2\u00ac\u0461\3\2\2\2\u00ae\u0463\3\2\2\2\u00b0\u046a\3\2\2\2\u00b2"+ + "\u0471\3\2\2\2\u00b4\u0479\3\2\2\2\u00b6\u0484\3\2\2\2\u00b8\u048a\3\2"+ + "\2\2\u00ba\u048d\3\2\2\2\u00bc\u0491\3\2\2\2\u00be\u04a9\3\2\2\2\u00c0"+ + "\u04ab\3\2\2\2\u00c2\u04af\3\2\2\2\u00c4\u04b2\3\2\2\2\u00c6\u04b8\3\2"+ + "\2\2\u00c8\u04ba\3\2\2\2\u00ca\u04bf\3\2\2\2\u00cc\u04c4\3\2\2\2\u00ce"+ + "\u04c7\3\2\2\2\u00d0\u04d5\3\2\2\2\u00d2\u04d9\3\2\2\2\u00d4\u04db\3\2"+ + "\2\2\u00d6\u04df\3\2\2\2\u00d8\u0505\3\2\2\2\u00da\u0507\3\2\2\2\u00dc"+ + "\u050b\3\2\2\2\u00de\u0511\3\2\2\2\u00e0\u0519\3\2\2\2\u00e2\u0527\3\2"+ + "\2\2\u00e4\u052d\3\2\2\2\u00e6\u0534\3\2\2\2\u00e8\u053f\3\2\2\2\u00ea"+ + "\u0541\3\2\2\2\u00ec\u054b\3\2\2\2\u00ee\u054f\3\2\2\2\u00f0\u0557\3\2"+ + "\2\2\u00f2\u0559\3\2\2\2\u00f4\u055d\3\2\2\2\u00f6\u0564\3\2\2\2\u00f8"+ + "\u0566\3\2\2\2\u00fa\u056a\3\2\2\2\u00fc\u056e\3\2\2\2\u00fe\u0572\3\2"+ + "\2\2\u0100\u0577\3\2\2\2\u0102\u0579\3\2\2\2\u0104\u057d\3\2\2\2\u0106"+ + "\u0584\3\2\2\2\u0108\u0592\3\2\2\2\u010a\u0594\3\2\2\2\u010c\u0598\3\2"+ + "\2\2\u010e\u059c\3\2\2\2\u0110\u05a4\3\2\2\2\u0112\u05a8\3\2\2\2\u0114"+ + "\u05ac\3\2\2\2\u0116\u05b0\3\2\2\2\u0118\u05b8\3\2\2\2\u011a\u05c5\3\2"+ + "\2\2\u011c\u05c7\3\2\2\2\u011e\u05cc\3\2\2\2\u0120\u05ce\3\2\2\2\u0122"+ + "\u05de\3\2\2\2\u0124\u05e0\3\2\2\2\u0126\u05e5\3\2\2\2\u0128\u05e7\3\2"+ + "\2\2\u012a\u05e9\3\2\2\2\u012c\u05eb\3\2\2\2\u012e\u05ed\3\2\2\2\u0130"+ + "\u05f7\3\2\2\2\u0132\u0609\3\2\2\2\u0134\u060e\3\2\2\2\u0136\u0612\3\2"+ + "\2\2\u0138\u0614\3\2\2\2\u013a\u0619\3\2\2\2\u013c\u0629\3\2\2\2\u013e"+ + "\u062f\3\2\2\2\u0140\u0634\3\2\2\2\u0142\u063a\3\2\2\2\u0144\u063c\3\2"+ + "\2\2\u0146\u063e\3\2\2\2\u0148\u0149\5\4\3\2\u0149\u014a\7\2\2\3\u014a"+ + "\3\3\2\2\2\u014b\u014c\7h\2\2\u014c\u014d\7g\2\2\u014d\u014e\5\u0144\u00a3"+ + "\2\u014e\u014f\7\3\2\2\u014f\u0151\3\2\2\2\u0150\u014b\3\2\2\2\u0150\u0151"+ + "\3\2\2\2\u0151\u0154\3\2\2\2\u0152\u0155\5\b\5\2\u0153\u0155\5\6\4\2\u0154"+ + "\u0152\3\2\2\2\u0154\u0153\3\2\2\2\u0155\5\3\2\2\2\u0156\u0157\5\n\6\2"+ + "\u0157\u0158\5\f\7\2\u0158\7\3\2\2\2\u0159\u015a\7\4\2\2\u015a\u015b\7"+ + "\u0081\2\2\u015b\u015c\7\u00b0\2\2\u015c\u015d\7\5\2\2\u015d\u015e\5\u0142"+ + "\u00a2\2\u015e\u015f\7\3\2\2\u015f\u0160\5\n\6\2\u0160\t\3\2\2\2\u0161"+ + "\u0165\5<\37\2\u0162\u0165\5> \2\u0163\u0165\5N(\2\u0164\u0161\3\2\2\2"+ + "\u0164\u0162\3\2\2\2\u0164\u0163\3\2\2\2\u0165\u0166\3\2\2\2\u0166\u0167"+ + "\7\3\2\2\u0167\u0169\3\2\2\2\u0168\u0164\3\2\2\2\u0169\u016c\3\2\2\2\u016a"+ + "\u0168\3\2\2\2\u016a\u016b\3\2\2\2\u016b\u0172\3\2\2\2\u016c\u016a\3\2"+ + "\2\2\u016d\u016e\5@!\2\u016e\u016f\7\3\2\2\u016f\u0171\3\2\2\2\u0170\u016d"+ + "\3\2\2\2\u0171\u0174\3\2\2\2\u0172\u0170\3\2\2\2\u0172\u0173\3\2\2\2\u0173"+ + "\13\3\2\2\2\u0174\u0172\3\2\2\2\u0175\u0176\5\22\n\2\u0176\r\3\2\2\2\u0177"+ + "\u0179\5\24\13\2\u0178\u0177\3\2\2\2\u0179\u017c\3\2\2\2\u017a\u0178\3"+ + "\2\2\2\u017a\u017b\3\2\2\2\u017b\17\3\2\2\2\u017c\u017a\3\2\2\2\u017d"+ + "\u017e\5\16\b\2\u017e\u017f\5^\60\2\u017f\21\3\2\2\2\u0180\u0182\5\16"+ + "\b\2\u0181\u0183\5^\60\2\u0182\u0181\3\2\2\2\u0182\u0183\3\2\2\2\u0183"+ + "\23\3\2\2\2\u0184\u0192\5\26\f\2\u0185\u0192\5\30\r\2\u0186\u0192\5\32"+ + "\16\2\u0187\u0192\5\34\17\2\u0188\u0192\5\36\20\2\u0189\u0192\5 \21\2"+ + "\u018a\u0192\5\"\22\2\u018b\u0192\5$\23\2\u018c\u0192\5&\24\2\u018d\u0192"+ + "\5*\26\2\u018e\u0192\5.\30\2\u018f\u0192\5\66\34\2\u0190\u0192\5:\36\2"+ + "\u0191\u0184\3\2\2\2\u0191\u0185\3\2\2\2\u0191\u0186\3\2\2\2\u0191\u0187"+ + "\3\2\2\2\u0191\u0188\3\2\2\2\u0191\u0189\3\2\2\2\u0191\u018a\3\2\2\2\u0191"+ + "\u018b\3\2\2\2\u0191\u018c\3\2\2\2\u0191\u018d\3\2\2\2\u0191\u018e\3\2"+ + "\2\2\u0191\u018f\3\2\2\2\u0191\u0190\3\2\2\2\u0192\25\3\2\2\2\u0193\u0194"+ + "\5b\62\2\u0194\u0195\7\3\2\2\u0195\27\3\2\2\2\u0196\u0197\7\6\2\2\u0197"+ + "\u0198\5J&\2\u0198\u0199\7\7\2\2\u0199\u019a\5`\61\2\u019a\u019b\7\3\2"+ + "\2\u019b\31\3\2\2\2\u019c\u019d\7\b\2\2\u019d\u019e\5\16\b\2\u019e\u019f"+ + "\7\t\2\2\u019f\33\3\2\2\2\u01a0\u01a1\7\u00a1\2\2\u01a1\u01a2\7\u00a2"+ + "\2\2\u01a2\u01a3\7\3\2\2\u01a3\35\3\2\2\2\u01a4\u01a5\7\u00a3\2\2\u01a5"+ + "\u01a6\7\u00a2\2\2\u01a6\u01a7\7\3\2\2\u01a7\37\3\2\2\2\u01a8\u01a9\7"+ + "\u00a4\2\2\u01a9\u01aa\7\u00a5\2\2\u01aa\u01ab\5`\61\2\u01ab\u01ac\7\3"+ + "\2\2\u01ac!\3\2\2\2\u01ad\u01b0\5f\64\2\u01ae\u01b0\5j\66\2\u01af\u01ad"+ + "\3\2\2\2\u01af\u01ae\3\2\2\2\u01b0\u01b9\3\2\2\2\u01b1\u01b8\5f\64\2\u01b2"+ + "\u01b8\5j\66\2\u01b3\u01b8\5n8\2\u01b4\u01b8\5p9\2\u01b5\u01b8\5t;\2\u01b6"+ + "\u01b8\5x=\2\u01b7\u01b1\3\2\2\2\u01b7\u01b2\3\2\2\2\u01b7\u01b3\3\2\2"+ + "\2\u01b7\u01b4\3\2\2\2\u01b7\u01b5\3\2\2\2\u01b7\u01b6\3\2\2\2\u01b8\u01bb"+ + "\3\2\2\2\u01b9\u01b7\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bc\3\2\2\2\u01bb"+ + "\u01b9\3\2\2\2\u01bc\u01bd\7C\2\2\u01bd\u01be\5\24\13\2\u01be#\3\2\2\2"+ + "\u01bf\u01c0\7D\2\2\u01c0\u01c1\7\n\2\2\u01c1\u01c2\5^\60\2\u01c2\u01c3"+ + "\7\13\2\2\u01c3\u01c4\7Y\2\2\u01c4\u01c5\5\24\13\2\u01c5\u01c6\7Z\2\2"+ + "\u01c6\u01c7\5\24\13\2\u01c7%\3\2\2\2\u01c8\u01c9\7T\2\2\u01c9\u01ca\7"+ + "\n\2\2\u01ca\u01cb\5^\60\2\u01cb\u01cd\7\13\2\2\u01cc\u01ce\5(\25\2\u01cd"+ + "\u01cc\3\2\2\2\u01ce\u01cf\3\2\2\2\u01cf\u01cd\3\2\2\2\u01cf\u01d0\3\2"+ + "\2\2\u01d0\u01d1\3\2\2\2\u01d1\u01d2\7X\2\2\u01d2\u01d3\7C\2\2\u01d3\u01d4"+ + "\5\24\13\2\u01d4\'\3\2\2\2\u01d5\u01d6\7U\2\2\u01d6\u01d8\5`\61\2\u01d7"+ + "\u01d5\3\2\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01d7\3\2\2\2\u01d9\u01da\3\2"+ + "\2\2\u01da\u01db\3\2\2\2\u01db\u01dc\7C\2\2\u01dc\u01dd\5\24\13\2\u01dd"+ + ")\3\2\2\2\u01de\u01df\7V\2\2\u01df\u01e1\5\32\16\2\u01e0\u01e2\5,\27\2"+ + "\u01e1\u01e0\3\2\2\2\u01e2\u01e3\3\2\2\2\u01e3\u01e1\3\2\2\2\u01e3\u01e4"+ + "\3\2\2\2\u01e4+\3\2\2\2\u01e5\u01e8\7W\2\2\u01e6\u01e9\7\f\2\2\u01e7\u01e9"+ + "\5J&\2\u01e8\u01e6\3\2\2\2\u01e8\u01e7\3\2\2\2\u01e9\u01f1\3\2\2\2\u01ea"+ + "\u01ed\7\r\2\2\u01eb\u01ee\7\f\2\2\u01ec\u01ee\5J&\2\u01ed\u01eb\3\2\2"+ + "\2\u01ed\u01ec\3\2\2\2\u01ee\u01f0\3\2\2\2\u01ef\u01ea\3\2\2\2\u01f0\u01f3"+ + "\3\2\2\2\u01f1\u01ef\3\2\2\2\u01f1\u01f2\3\2\2\2\u01f2\u01f4\3\2\2\2\u01f3"+ + "\u01f1\3\2\2\2\u01f4\u01f5\5\32\16\2\u01f5-\3\2\2\2\u01f6\u01f7\7[\2\2"+ + "\u01f7\u01f8\7\n\2\2\u01f8\u01f9\5^\60\2\u01f9\u01fb\7\13\2\2\u01fa\u01fc"+ + "\5\60\31\2\u01fb\u01fa\3\2\2\2\u01fc\u01fd\3\2\2\2\u01fd\u01fb\3\2\2\2"+ + "\u01fd\u01fe\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0201\7X\2\2\u0200\u0202"+ + "\5\u00c2b\2\u0201\u0200\3\2\2\2\u0201\u0202\3\2\2\2\u0202\u0203\3\2\2"+ + "\2\u0203\u0204\7C\2\2\u0204\u0205\5\24\13\2\u0205/\3\2\2\2\u0206\u020a"+ + "\7U\2\2\u0207\u0208\5\u00c2b\2\u0208\u0209\7F\2\2\u0209\u020b\3\2\2\2"+ + "\u020a\u0207\3\2\2\2\u020a\u020b\3\2\2\2\u020b\u020c\3\2\2\2\u020c\u0211"+ + "\5\u0130\u0099\2\u020d\u020e\7\r\2\2\u020e\u0210\5\u0130\u0099\2\u020f"+ + "\u020d\3\2\2\2\u0210\u0213\3\2\2\2\u0211\u020f\3\2\2\2\u0211\u0212\3\2"+ + "\2\2\u0212\u0214\3\2\2\2\u0213\u0211\3\2\2\2\u0214\u0215\7C\2\2\u0215"+ + "\u0216\5\24\13\2\u0216\61\3\2\2\2\u0217\u0218\7\16\2\2\u0218\u0223\5J"+ + "&\2\u0219\u021a\7\n\2\2\u021a\u021f\7\u00aa\2\2\u021b\u021c\7\17\2\2\u021c"+ + "\u021e\7\u00aa\2\2\u021d\u021b\3\2\2\2\u021e\u0221\3\2\2\2\u021f\u021d"+ + "\3\2\2\2\u021f\u0220\3\2\2\2\u0220\u0222\3\2\2\2\u0221\u021f\3\2\2\2\u0222"+ + "\u0224\7\13\2\2\u0223\u0219\3\2\2\2\u0223\u0224\3\2\2\2\u0224\63\3\2\2"+ + "\2\u0225\u0227\5\62\32\2\u0226\u0225\3\2\2\2\u0227\u022a\3\2\2\2\u0228"+ + "\u0226\3\2\2\2\u0228\u0229\3\2\2\2\u0229\65\3\2\2\2\u022a\u0228\3\2\2"+ + "\2\u022b\u022c\5\64\33\2\u022c\u022d\7r\2\2\u022d\u0232\58\35\2\u022e"+ + "\u022f\7\17\2\2\u022f\u0231\58\35\2\u0230\u022e\3\2\2\2\u0231\u0234\3"+ + "\2\2\2\u0232\u0230\3\2\2\2\u0232\u0233\3\2\2\2\u0233\u0235\3\2\2\2\u0234"+ + "\u0232\3\2\2\2\u0235\u0236\7\3\2\2\u0236\67\3\2\2\2\u0237\u023a\5\u00c2"+ + "b\2\u0238\u0239\7F\2\2\u0239\u023b\5\u0130\u0099\2\u023a\u0238\3\2\2\2"+ + "\u023a\u023b\3\2\2\2\u023b\u023e\3\2\2\2\u023c\u023d\7\7\2\2\u023d\u023f"+ + "\5`\61\2\u023e\u023c\3\2\2\2\u023e\u023f\3\2\2\2\u023f9\3\2\2\2\u0240"+ + "\u0241\7\u00a6\2\2\u0241\u0242\7\n\2\2\u0242\u0243\5^\60\2\u0243\u0244"+ + "\7\13\2\2\u0244\u0245\5\24\13\2\u0245;\3\2\2\2\u0246\u024b\5B\"\2\u0247"+ + "\u024b\5D#\2\u0248\u024b\5F$\2\u0249\u024b\5H%\2\u024a\u0246\3\2\2\2\u024a"+ + "\u0247\3\2\2\2\u024a\u0248\3\2\2\2\u024a\u0249\3\2\2\2\u024b=\3\2\2\2"+ + "\u024c\u024d\7o\2\2\u024d\u024e\7\u0081\2\2\u024e\u024f\7\u00b0\2\2\u024f"+ + "\u0250\7\5\2\2\u0250\u0251\5\u0142\u00a2\2\u0251?\3\2\2\2\u0252\u0257"+ + "\5T+\2\u0253\u0257\5P)\2\u0254\u0257\5V,\2\u0255\u0257\5R*\2\u0256\u0252"+ + "\3\2\2\2\u0256\u0253\3\2\2\2\u0256\u0254\3\2\2\2\u0256\u0255\3\2\2\2\u0257"+ + "A\3\2\2\2\u0258\u0259\7o\2\2\u0259\u025a\7X\2\2\u025a\u025b\7Q\2\2\u025b"+ + "\u025c\5\u0142\u00a2\2\u025cC\3\2\2\2\u025d\u025e\7o\2\2\u025e\u025f\7"+ + "\20\2\2\u025f\u0260\t\2\2\2\u0260E\3\2\2\2\u0261\u0262\7o\2\2\u0262\u0263"+ + "\7X\2\2\u0263\u0264\7B\2\2\u0264\u0265\7I\2\2\u0265\u0266\t\3\2\2\u0266"+ + "G\3\2\2\2\u0267\u026c\7o\2\2\u0268\u0269\7\22\2\2\u0269\u026d\5J&\2\u026a"+ + "\u026b\7X\2\2\u026b\u026d\7\22\2\2\u026c\u0268\3\2\2\2\u026c\u026a\3\2"+ + "\2\2\u026d\u0274\3\2\2\2\u026e\u026f\5L\'\2\u026f\u0270\7\5\2\2\u0270"+ + "\u0271\5\u0144\u00a3\2\u0271\u0273\3\2\2\2\u0272\u026e\3\2\2\2\u0273\u0276"+ + "\3\2\2\2\u0274\u0272\3\2\2\2\u0274\u0275\3\2\2\2\u0275I\3\2\2\2\u0276"+ + "\u0274\3\2\2\2\u0277\u027a\7\u00b0\2\2\u0278\u027a\5\u0146\u00a4\2\u0279"+ + "\u0277\3\2\2\2\u0279\u0278\3\2\2\2\u027a\u027b\3\2\2\2\u027b\u027d\7\23"+ + "\2\2\u027c\u0279\3\2\2\2\u027c\u027d\3\2\2\2\u027d\u0280\3\2\2\2\u027e"+ + "\u0281\7\u00b0\2\2\u027f\u0281\5\u0146\u00a4\2\u0280\u027e\3\2\2\2\u0280"+ + "\u027f\3\2\2\2\u0281K\3\2\2\2\u0282\u0283\t\4\2\2\u0283M\3\2\2\2\u0284"+ + "\u0285\7\177\2\2\u0285\u0289\7\4\2\2\u0286\u0287\7\u0081\2\2\u0287\u0288"+ + "\7\u00b0\2\2\u0288\u028a\7\5\2\2\u0289\u0286\3\2\2\2\u0289\u028a\3\2\2"+ + "\2\u028a\u028b\3\2\2\2\u028b\u0295\5\u0142\u00a2\2\u028c\u028d\7G\2\2"+ + "\u028d\u0292\5\u0142\u00a2\2\u028e\u028f\7\17\2\2\u028f\u0291\5\u0142"+ + "\u00a2\2\u0290\u028e\3\2\2\2\u0291\u0294\3\2\2\2\u0292\u0290\3\2\2\2\u0292"+ + "\u0293\3\2\2\2\u0293\u0296\3\2\2\2\u0294\u0292\3\2\2\2\u0295\u028c\3\2"+ + "\2\2\u0295\u0296\3\2\2\2\u0296O\3\2\2\2\u0297\u0298\7o\2\2\u0298\u0299"+ + "\5\64\33\2\u0299\u029a\7r\2\2\u029a\u029d\5\u00c2b\2\u029b\u029c\7F\2"+ + "\2\u029c\u029e\5\u0130\u0099\2\u029d\u029b\3\2\2\2\u029d\u029e\3\2\2\2"+ + "\u029e\u02a6\3\2\2\2\u029f\u02a0\7\7\2\2\u02a0\u02a7\5`\61\2\u02a1\u02a4"+ + "\7\36\2\2\u02a2\u02a3\7\7\2\2\u02a3\u02a5\5`\61\2\u02a4\u02a2\3\2\2\2"+ + "\u02a4\u02a5\3\2\2\2\u02a5\u02a7\3\2\2\2\u02a6\u029f\3\2\2\2\u02a6\u02a1"+ + "\3\2\2\2\u02a7Q\3\2\2\2\u02a8\u02a9\7o\2\2\u02a9\u02aa\7p\2\2\u02aa\u02ad"+ + "\7q\2\2\u02ab\u02ac\7F\2\2\u02ac\u02ae\5\u0130\u0099\2\u02ad\u02ab\3\2"+ + "\2\2\u02ad\u02ae\3\2\2\2\u02ae\u02b6\3\2\2\2\u02af\u02b0\7\7\2\2\u02b0"+ + "\u02b7\5`\61\2\u02b1\u02b4\7\36\2\2\u02b2\u02b3\7\7\2\2\u02b3\u02b5\5"+ + "`\61\2\u02b4\u02b2\3\2\2\2\u02b4\u02b5\3\2\2\2\u02b5\u02b7\3\2\2\2\u02b6"+ + "\u02af\3\2\2\2\u02b6\u02b1\3\2\2\2\u02b7S\3\2\2\2\u02b8\u02b9\7o\2\2\u02b9"+ + "\u02ba\5\64\33\2\u02ba\u02bb\7\37\2\2\u02bb\u02bc\5J&\2\u02bc\u02be\7"+ + "\n\2\2\u02bd\u02bf\5Z.\2\u02be\u02bd\3\2\2\2\u02be\u02bf\3\2\2\2\u02bf"+ + "\u02c0\3\2\2\2\u02c0\u02c3\7\13\2\2\u02c1\u02c2\7F\2\2\u02c2\u02c4\5\u0130"+ + "\u0099\2\u02c3\u02c1\3\2\2\2\u02c3\u02c4\3\2\2\2\u02c4\u02ca\3\2\2\2\u02c5"+ + "\u02c6\7\b\2\2\u02c6\u02c7\5\22\n\2\u02c7\u02c8\7\t\2\2\u02c8\u02cb\3"+ + "\2\2\2\u02c9\u02cb\7\36\2\2\u02ca\u02c5\3\2\2\2\u02ca\u02c9\3\2\2\2\u02cb"+ + "U\3\2\2\2\u02cc\u02cd\7o\2\2\u02cd\u02ce\7l\2\2\u02ce\u02cf\5J&\2\u02cf"+ + "\u02d1\7F\2\2\u02d0\u02d2\5X-\2\u02d1\u02d0\3\2\2\2\u02d1\u02d2\3\2\2"+ + "\2\u02d2\u02d3\3\2\2\2\u02d3\u02d4\5`\61\2\u02d4W\3\2\2\2\u02d5\u02d6"+ + "\7 \2\2\u02d6\u02dc\7!\2\2\u02d7\u02d8\7 \2\2\u02d8\u02dc\7\"\2\2\u02d9"+ + "\u02da\7|\2\2\u02da\u02dc\7\u0080\2\2\u02db\u02d5\3\2\2\2\u02db\u02d7"+ + "\3\2\2\2\u02db\u02d9\3\2\2\2\u02dcY\3\2\2\2\u02dd\u02e2\5\\/\2\u02de\u02df"+ + "\7\17\2\2\u02df\u02e1\5\\/\2\u02e0\u02de\3\2\2\2\u02e1\u02e4\3\2\2\2\u02e2"+ + "\u02e0\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3[\3\2\2\2\u02e4\u02e2\3\2\2\2"+ + "\u02e5\u02e6\7\6\2\2\u02e6\u02e9\5J&\2\u02e7\u02e8\7F\2\2\u02e8\u02ea"+ + "\5\u0130\u0099\2\u02e9\u02e7\3\2\2\2\u02e9\u02ea\3\2\2\2\u02ea]\3\2\2"+ + "\2\u02eb\u02f0\5`\61\2\u02ec\u02ed\7\17\2\2\u02ed\u02ef\5`\61\2\u02ee"+ + "\u02ec\3\2\2\2\u02ef\u02f2\3\2\2\2\u02f0\u02ee\3\2\2\2\u02f0\u02f1\3\2"+ + "\2\2\u02f1_\3\2\2\2\u02f2\u02f0\3\2\2\2\u02f3\u02fa\5b\62\2\u02f4\u02fa"+ + "\5d\63\2\u02f5\u02fa\5~@\2\u02f6\u02fa\5\u0082B\2\u02f7\u02fa\5\u0086"+ + "D\2\u02f8\u02fa\5\u0088E\2\u02f9\u02f3\3\2\2\2\u02f9\u02f4\3\2\2\2\u02f9"+ + "\u02f5\3\2\2\2\u02f9\u02f6\3\2\2\2\u02f9\u02f7\3\2\2\2\u02f9\u02f8\3\2"+ + "\2\2\u02faa\3\2\2\2\u02fb\u0304\5z>\2\u02fc\u0304\5\u008cG\2\u02fd\u0304"+ + "\5\u00d8m\2\u02fe\u0304\5\u00dan\2\u02ff\u0304\5\u00dco\2\u0300\u0304"+ + "\5\u00dep\2\u0301\u0304\5\u00e0q\2\u0302\u0304\5\u00e2r\2\u0303\u02fb"+ + "\3\2\2\2\u0303\u02fc\3\2\2\2\u0303\u02fd\3\2\2\2\u0303\u02fe\3\2\2\2\u0303"+ + "\u02ff\3\2\2\2\u0303\u0300\3\2\2\2\u0303\u0301\3\2\2\2\u0303\u0302\3\2"+ + "\2\2\u0304c\3\2\2\2\u0305\u0308\5f\64\2\u0306\u0308\5j\66\2\u0307\u0305"+ + "\3\2\2\2\u0307\u0306\3\2\2\2\u0308\u0311\3\2\2\2\u0309\u0310\5f\64\2\u030a"+ + "\u0310\5j\66\2\u030b\u0310\5n8\2\u030c\u0310\5p9\2\u030d\u0310\5t;\2\u030e"+ + "\u0310\5x=\2\u030f\u0309\3\2\2\2\u030f\u030a\3\2\2\2\u030f\u030b\3\2\2"+ + "\2\u030f\u030c\3\2\2\2\u030f\u030d\3\2\2\2\u030f\u030e\3\2\2\2\u0310\u0313"+ + "\3\2\2\2\u0311\u030f\3\2\2\2\u0311\u0312\3\2\2\2\u0312\u0314\3\2\2\2\u0313"+ + "\u0311\3\2\2\2\u0314\u0315\7C\2\2\u0315\u0316\5`\61\2\u0316e\3\2\2\2\u0317"+ + "\u0318\7=\2\2\u0318\u031d\5h\65\2\u0319\u031a\7\17\2\2\u031a\u031c\5h"+ + "\65\2\u031b\u0319\3\2\2\2\u031c\u031f\3\2\2\2\u031d\u031b\3\2\2\2\u031d"+ + "\u031e\3\2\2\2\u031eg\3\2\2\2\u031f\u031d\3\2\2\2\u0320\u0323\5\u00c2"+ + "b\2\u0321\u0322\7F\2\2\u0322\u0324\5\u0130\u0099\2\u0323\u0321\3\2\2\2"+ + "\u0323\u0324\3\2\2\2\u0324\u0327\3\2\2\2\u0325\u0326\7H\2\2\u0326\u0328"+ + "\7I\2\2\u0327\u0325\3\2\2\2\u0327\u0328\3\2\2\2\u0328\u032b\3\2\2\2\u0329"+ + "\u032a\7G\2\2\u032a\u032c\5\u00c2b\2\u032b\u0329\3\2\2\2\u032b\u032c\3"+ + "\2\2\2\u032c\u032d\3\2\2\2\u032d\u032e\7E\2\2\u032e\u032f\5`\61\2\u032f"+ + "i\3\2\2\2\u0330\u0331\7>\2\2\u0331\u0336\5l\67\2\u0332\u0333\7\17\2\2"+ + "\u0333\u0335\5l\67\2\u0334\u0332\3\2\2\2\u0335\u0338\3\2\2\2\u0336\u0334"+ + "\3\2\2\2\u0336\u0337\3\2\2\2\u0337k\3\2\2\2\u0338\u0336\3\2\2\2\u0339"+ + "\u033c\5\u00c2b\2\u033a\u033b\7F\2\2\u033b\u033d\5\u0130\u0099\2\u033c"+ + "\u033a\3\2\2\2\u033c\u033d\3\2\2\2\u033d\u033e\3\2\2\2\u033e\u033f\7\7"+ + "\2\2\u033f\u0340\5`\61\2\u0340m\3\2\2\2\u0341\u0342\7?\2\2\u0342\u0343"+ + "\5`\61\2\u0343o\3\2\2\2\u0344\u0345\7@\2\2\u0345\u0346\7A\2\2\u0346\u034b"+ + "\5r:\2\u0347\u0348\7\17\2\2\u0348\u034a\5r:\2\u0349\u0347\3\2\2\2\u034a"+ + "\u034d\3\2\2\2\u034b\u0349\3\2\2\2\u034b\u034c\3\2\2\2\u034cq\3\2\2\2"+ + "\u034d\u034b\3\2\2\2\u034e\u0355\5\u00c2b\2\u034f\u0350\7F\2\2\u0350\u0352"+ + "\5\u0130\u0099\2\u0351\u034f\3\2\2\2\u0351\u0352\3\2\2\2\u0352\u0353\3"+ + "\2\2\2\u0353\u0354\7\7\2\2\u0354\u0356\5`\61\2\u0355\u0351\3\2\2\2\u0355"+ + "\u0356\3\2\2\2\u0356\u0359\3\2\2\2\u0357\u0358\7Q\2\2\u0358\u035a\5\u0142"+ + "\u00a2\2\u0359\u0357\3\2\2\2\u0359\u035a\3\2\2\2\u035as\3\2\2\2\u035b"+ + "\u035c\7B\2\2\u035c\u0361\7A\2\2\u035d\u035e\7K\2\2\u035e\u035f\7B\2\2"+ + "\u035f\u0361\7A\2\2\u0360\u035b\3\2\2\2\u0360\u035d\3\2\2\2\u0361\u0362"+ + "\3\2\2\2\u0362\u0367\5v<\2\u0363\u0364\7\17\2\2\u0364\u0366\5v<\2\u0365"+ + "\u0363\3\2\2\2\u0366\u0369\3\2\2\2\u0367\u0365\3\2\2\2\u0367\u0368\3\2"+ + "\2\2\u0368u\3\2\2\2\u0369\u0367\3\2\2\2\u036a\u036d\5`\61\2\u036b\u036e"+ + "\7L\2\2\u036c\u036e\7M\2\2\u036d\u036b\3\2\2\2\u036d\u036c\3\2\2\2\u036d"+ + "\u036e\3\2\2\2\u036e\u0374\3\2\2\2\u036f\u0372\7I\2\2\u0370\u0373\7R\2"+ + "\2\u0371\u0373\7S\2\2\u0372\u0370\3\2\2\2\u0372\u0371\3\2\2\2\u0373\u0375"+ + "\3\2\2\2\u0374\u036f\3\2\2\2\u0374\u0375\3\2\2\2\u0375\u0378\3\2\2\2\u0376"+ + "\u0377\7Q\2\2\u0377\u0379\5\u0142\u00a2\2\u0378\u0376\3\2\2\2\u0378\u0379"+ + "\3\2\2\2\u0379w\3\2\2\2\u037a\u037b\7J\2\2\u037b\u037c\5\u00c2b\2\u037c"+ + "y\3\2\2\2\u037d\u0380\7N\2\2\u037e\u0380\7O\2\2\u037f\u037d\3\2\2\2\u037f"+ + "\u037e\3\2\2\2\u0380\u0381\3\2\2\2\u0381\u0386\5|?\2\u0382\u0383\7\17"+ + "\2\2\u0383\u0385\5|?\2\u0384\u0382\3\2\2\2\u0385\u0388\3\2\2\2\u0386\u0384"+ + "\3\2\2\2\u0386\u0387\3\2\2\2\u0387\u0389\3\2\2\2\u0388\u0386\3\2\2\2\u0389"+ + "\u038a\7P\2\2\u038a\u038b\5`\61\2\u038b{\3\2\2\2\u038c\u038f\5\u00c2b"+ + "\2\u038d\u038e\7F\2\2\u038e\u0390\5\u0130\u0099\2\u038f\u038d\3\2\2\2"+ + "\u038f\u0390\3\2\2\2\u0390\u0391\3\2\2\2\u0391\u0392\7E\2\2\u0392\u0393"+ + "\5`\61\2\u0393}\3\2\2\2\u0394\u0395\7T\2\2\u0395\u0396\7\n\2\2\u0396\u0397"+ + "\5^\60\2\u0397\u0399\7\13\2\2\u0398\u039a\5\u0080A\2\u0399\u0398\3\2\2"+ + "\2\u039a\u039b\3\2\2\2\u039b\u0399\3\2\2\2\u039b\u039c\3\2\2\2\u039c\u039d"+ + "\3\2\2\2\u039d\u039e\7X\2\2\u039e\u039f\7C\2\2\u039f\u03a0\5`\61\2\u03a0"+ + "\177\3\2\2\2\u03a1\u03a2\7U\2\2\u03a2\u03a4\5`\61\2\u03a3\u03a1\3\2\2"+ + "\2\u03a4\u03a5\3\2\2\2\u03a5\u03a3\3\2\2\2\u03a5\u03a6\3\2\2\2\u03a6\u03a7"+ + "\3\2\2\2\u03a7\u03a8\7C\2\2\u03a8\u03a9\5`\61\2\u03a9\u0081\3\2\2\2\u03aa"+ + "\u03ab\7[\2\2\u03ab\u03ac\7\n\2\2\u03ac\u03ad\5^\60\2\u03ad\u03af\7\13"+ + "\2\2\u03ae\u03b0\5\u0084C\2\u03af\u03ae\3\2\2\2\u03b0\u03b1\3\2\2\2\u03b1"+ + "\u03af\3\2\2\2\u03b1\u03b2\3\2\2\2\u03b2\u03b3\3\2\2\2\u03b3\u03b5\7X"+ + "\2\2\u03b4\u03b6\5\u00c2b\2\u03b5\u03b4\3\2\2\2\u03b5\u03b6\3\2\2\2\u03b6"+ + "\u03b7\3\2\2\2\u03b7\u03b8\7C\2\2\u03b8\u03b9\5`\61\2\u03b9\u0083\3\2"+ + "\2\2\u03ba\u03be\7U\2\2\u03bb\u03bc\5\u00c2b\2\u03bc\u03bd\7F\2\2\u03bd"+ + "\u03bf\3\2\2\2\u03be\u03bb\3\2\2\2\u03be\u03bf\3\2\2\2\u03bf\u03c0\3\2"+ + "\2\2\u03c0\u03c5\5\u0130\u0099\2\u03c1\u03c2\7\r\2\2\u03c2\u03c4\5\u0130"+ + "\u0099\2\u03c3\u03c1\3\2\2\2\u03c4\u03c7\3\2\2\2\u03c5\u03c3\3\2\2\2\u03c5"+ + "\u03c6\3\2\2\2\u03c6\u03c8\3\2\2\2\u03c7\u03c5\3\2\2\2\u03c8\u03c9\7C"+ + "\2\2\u03c9\u03ca\5`\61\2\u03ca\u0085\3\2\2\2\u03cb\u03cc\7D\2\2\u03cc"+ + "\u03cd\7\n\2\2\u03cd\u03ce\5^\60\2\u03ce\u03cf\7\13\2\2\u03cf\u03d0\7"+ + "Y\2\2\u03d0\u03d1\5`\61\2\u03d1\u03d2\7Z\2\2\u03d2\u03d3\5`\61\2\u03d3"+ + "\u0087\3\2\2\2\u03d4\u03d5\7V\2\2\u03d5\u03d6\7\b\2\2\u03d6\u03d7\5^\60"+ + "\2\u03d7\u03d9\7\t\2\2\u03d8\u03da\5\u008aF\2\u03d9\u03d8\3\2\2\2\u03da"+ + "\u03db\3\2\2\2\u03db\u03d9\3\2\2\2\u03db\u03dc\3\2\2\2\u03dc\u0089\3\2"+ + "\2\2\u03dd\u03e0\7W\2\2\u03de\u03e1\7\f\2\2\u03df\u03e1\5J&\2\u03e0\u03de"+ + "\3\2\2\2\u03e0\u03df\3\2\2\2\u03e1\u03e9\3\2\2\2\u03e2\u03e5\7\r\2\2\u03e3"+ + "\u03e6\7\f\2\2\u03e4\u03e6\5J&\2\u03e5\u03e3\3\2\2\2\u03e5\u03e4\3\2\2"+ + "\2\u03e6\u03e8\3\2\2\2\u03e7\u03e2\3\2\2\2\u03e8\u03eb\3\2\2\2\u03e9\u03e7"+ + "\3\2\2\2\u03e9\u03ea\3\2\2\2\u03ea\u03ec\3\2\2\2\u03eb\u03e9\3\2\2\2\u03ec"+ + "\u03ed\7\b\2\2\u03ed\u03ee\5^\60\2\u03ee\u03ef\7\t\2\2\u03ef\u008b\3\2"+ + "\2\2\u03f0\u03f5\5\u008eH\2\u03f1\u03f2\7\\\2\2\u03f2\u03f4\5\u008eH\2"+ + "\u03f3\u03f1\3\2\2\2\u03f4\u03f7\3\2\2\2\u03f5\u03f3\3\2\2\2\u03f5\u03f6"+ + "\3\2\2\2\u03f6\u008d\3\2\2\2\u03f7\u03f5\3\2\2\2\u03f8\u03fd\5\u0090I"+ + "\2\u03f9\u03fa\7]\2\2\u03fa\u03fc\5\u0090I\2\u03fb\u03f9\3\2\2\2\u03fc"+ + "\u03ff\3\2\2\2\u03fd\u03fb\3\2\2\2\u03fd\u03fe\3\2\2\2\u03fe\u008f\3\2"+ + "\2\2\u03ff\u03fd\3\2\2\2\u0400\u0402\7^\2\2\u0401\u0400\3\2\2\2\u0401"+ + "\u0402\3\2\2\2\u0402\u0403\3\2\2\2\u0403\u0404\5\u0092J\2\u0404\u0091"+ + "\3\2\2\2\u0405\u0408\5\u0094K\2\u0406\u0407\t\5\2\2\u0407\u0409\5\u0094"+ + "K\2\u0408\u0406\3\2\2\2\u0408\u0409\3\2\2\2\u0409\u0093\3\2\2\2\u040a"+ + "\u040f\5\u0096L\2\u040b\u040c\7.\2\2\u040c\u040e\5\u0096L\2\u040d\u040b"+ + "\3\2\2\2\u040e\u0411\3\2\2\2\u040f\u040d\3\2\2\2\u040f\u0410\3\2\2\2\u0410"+ + "\u0095\3\2\2\2\u0411\u040f\3\2\2\2\u0412\u0415\5\u0098M\2\u0413\u0414"+ + "\7_\2\2\u0414\u0416\5\u0098M\2\u0415\u0413\3\2\2\2\u0415\u0416\3\2\2\2"+ + "\u0416\u0097\3\2\2\2\u0417\u041c\5\u009aN\2\u0418\u0419\t\6\2\2\u0419"+ + "\u041b\5\u009aN\2\u041a\u0418\3\2\2\2\u041b\u041e\3\2\2\2\u041c\u041a"+ + "\3\2\2\2\u041c\u041d\3\2\2\2\u041d\u0099\3\2\2\2\u041e\u041c\3\2\2\2\u041f"+ + "\u0424\5\u009cO\2\u0420\u0421\t\7\2\2\u0421\u0423\5\u009cO\2\u0422\u0420"+ + "\3\2\2\2\u0423\u0426\3\2\2\2\u0424\u0422\3\2\2\2\u0424\u0425\3\2\2\2\u0425"+ + "\u009b\3\2\2\2\u0426\u0424\3\2\2\2\u0427\u042b\5\u009eP\2\u0428\u0429"+ + "\7`\2\2\u0429\u042a\7a\2\2\u042a\u042c\5\u0130\u0099\2\u042b\u0428\3\2"+ + "\2\2\u042b\u042c\3\2\2\2\u042c\u009d\3\2\2\2\u042d\u0431\5\u00a0Q\2\u042e"+ + "\u042f\7c\2\2\u042f\u0430\7b\2\2\u0430\u0432\5\u0130\u0099\2\u0431\u042e"+ + "\3\2\2\2\u0431\u0432\3\2\2\2\u0432\u009f\3\2\2\2\u0433\u0437\5\u00a2R"+ + "\2\u0434\u0435\7d\2\2\u0435\u0436\7F\2\2\u0436\u0438\5\u0130\u0099\2\u0437"+ + "\u0434\3\2\2\2\u0437\u0438\3\2\2\2\u0438\u00a1\3\2\2\2\u0439\u043d\5\u00a4"+ + "S\2\u043a\u043b\7f\2\2\u043b\u043c\7F\2\2\u043c\u043e\5\u013c\u009f\2"+ + "\u043d\u043a\3\2\2\2\u043d\u043e\3\2\2\2\u043e\u00a3\3\2\2\2\u043f\u0443"+ + "\5\u00a6T\2\u0440\u0441\7e\2\2\u0441\u0442\7F\2\2\u0442\u0444\5\u013c"+ + "\u009f\2\u0443\u0440\3\2\2\2\u0443\u0444\3\2\2\2\u0444\u00a5\3\2\2\2\u0445"+ + "\u044e\5\u00aaV\2\u0446\u0447\7\5\2\2\u0447\u0448\7,\2\2\u0448\u0449\3"+ + "\2\2\2\u0449\u044a\5\u00a8U\2\u044a\u044b\5\u00ceh\2\u044b\u044d\3\2\2"+ + "\2\u044c\u0446\3\2\2\2\u044d\u0450\3\2\2\2\u044e\u044c\3\2\2\2\u044e\u044f"+ + "\3\2\2\2\u044f\u00a7\3\2\2\2\u0450\u044e\3\2\2\2\u0451\u0455\5J&\2\u0452"+ + "\u0455\5\u00c2b\2\u0453\u0455\5\u00c4c\2\u0454\u0451\3\2\2\2\u0454\u0452"+ + "\3\2\2\2\u0454\u0453\3\2\2\2\u0455\u00a9\3\2\2\2\u0456\u0458\t\6\2\2\u0457"+ + "\u0456\3\2\2\2\u0458\u045b\3\2\2\2\u0459\u0457\3\2\2\2\u0459\u045a\3\2"+ + "\2\2\u045a\u045c\3\2\2\2\u045b\u0459\3\2\2\2\u045c\u045d\5\u00acW\2\u045d"+ + "\u00ab\3\2\2\2\u045e\u0462\5\u00b2Z\2\u045f\u0462\5\u00aeX\2\u0460\u0462"+ + "\5\u00b0Y\2\u0461\u045e\3\2\2\2\u0461\u045f\3\2\2\2\u0461\u0460\3\2\2"+ + "\2\u0462\u00ad\3\2\2\2\u0463\u0464\7m\2\2\u0464\u0465\7l\2\2\u0465\u0466"+ + "\5\u0130\u0099\2\u0466\u0467\7\b\2\2\u0467\u0468\5^\60\2\u0468\u0469\7"+ + "\t\2\2\u0469\u00af\3\2\2\2\u046a\u046b\7n\2\2\u046b\u046c\7l\2\2\u046c"+ + "\u046d\5\u0130\u0099\2\u046d\u046e\7\b\2\2\u046e\u046f\5^\60\2\u046f\u0470"+ + "\7\t\2\2\u0470\u00b1\3\2\2\2\u0471\u0476\5\u00e8u\2\u0472\u0473\7\64\2"+ + "\2\u0473\u0475\5\u00e8u\2\u0474\u0472\3\2\2\2\u0475\u0478\3\2\2\2\u0476"+ + "\u0474\3\2\2\2\u0476\u0477\3\2\2\2\u0477\u00b3\3\2\2\2\u0478\u0476\3\2"+ + "\2\2\u0479\u0481\5\u00be`\2\u047a\u0480\5\u00b6\\\2\u047b\u0480\5\u00ba"+ + "^\2\u047c\u0480\5\u00bc_\2\u047d\u0480\5\u00b8]\2\u047e\u0480\5\u00ce"+ + "h\2\u047f\u047a\3\2\2\2\u047f\u047b\3\2\2\2\u047f\u047c\3\2\2\2\u047f"+ + "\u047d\3\2\2\2\u047f\u047e\3\2\2\2\u0480\u0483\3\2\2\2\u0481\u047f\3\2"+ + "\2\2\u0481\u0482\3\2\2\2\u0482\u00b5\3\2\2\2\u0483\u0481\3\2\2\2\u0484"+ + "\u0485\7\65\2\2\u0485\u0486\7\65\2\2\u0486\u0487\5^\60\2\u0487\u0488\7"+ + "\66\2\2\u0488\u0489\7\66\2\2\u0489\u00b7\3\2\2\2\u048a\u048b\7\65\2\2"+ + "\u048b\u048c\7\66\2\2\u048c\u00b9\3\2\2\2\u048d\u048e\7\65\2\2\u048e\u048f"+ + "\5^\60\2\u048f\u0490\7\66\2\2\u0490\u00bb\3\2\2\2\u0491\u0498\7\67\2\2"+ + "\u0492\u0499\5\u0146\u00a4\2\u0493\u0499\5\u0144\u00a3\2\u0494\u0499\7"+ + "\u00b0\2\2\u0495\u0499\5\u00c4c\2\u0496\u0499\5\u00c2b\2\u0497\u0499\5"+ + "\u00c6d\2\u0498\u0492\3\2\2\2\u0498\u0493\3\2\2\2\u0498\u0494\3\2\2\2"+ + "\u0498\u0495\3\2\2\2\u0498\u0496\3\2\2\2\u0498\u0497\3\2\2\2\u0499\u00bd"+ + "\3\2\2\2\u049a\u04aa\7\u00a9\2\2\u049b\u04aa\7j\2\2\u049c\u04aa\7k\2\2"+ + "\u049d\u04aa\7\u00aa\2\2\u049e\u04aa\5\u0144\u00a3\2\u049f\u04aa\5\u00c2"+ + "b\2\u04a0\u04aa\5\u00c4c\2\u04a1\u04aa\5\u00c6d\2\u04a2\u04aa\5\u0132"+ + "\u009a\2\u04a3\u04aa\5\u00ccg\2\u04a4\u04aa\5\u00c8e\2\u04a5\u04aa\5\u00ca"+ + "f\2\u04a6\u04aa\5\u0140\u00a1\2\u04a7\u04aa\5\u00d2j\2\u04a8\u04aa\5\u00c0"+ + "a\2\u04a9\u049a\3\2\2\2\u04a9\u049b\3\2\2\2\u04a9\u049c\3\2\2\2\u04a9"+ + "\u049d\3\2\2\2\u04a9\u049e\3\2\2\2\u04a9\u049f\3\2\2\2\u04a9\u04a0\3\2"+ + "\2\2\u04a9\u04a1\3\2\2\2\u04a9\u04a2\3\2\2\2\u04a9\u04a3\3\2\2\2\u04a9"+ + "\u04a4\3\2\2\2\u04a9\u04a5\3\2\2\2\u04a9\u04a6\3\2\2\2\u04a9\u04a7\3\2"+ + "\2\2\u04a9\u04a8\3\2\2\2\u04aa\u00bf\3\2\2\2\u04ab\u04ac\7\b\2\2\u04ac"+ + "\u04ad\5\20\t\2\u04ad\u04ae\7\t\2\2\u04ae\u00c1\3\2\2\2\u04af\u04b0\7"+ + "\6\2\2\u04b0\u04b1\5J&\2\u04b1\u00c3\3\2\2\2\u04b2\u04b4\7\n\2\2\u04b3"+ + "\u04b5\5^\60\2\u04b4\u04b3\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b6\3\2"+ + "\2\2\u04b6\u04b7\7\13\2\2\u04b7\u00c5\3\2\2\2\u04b8\u04b9\78\2\2\u04b9"+ + "\u00c7\3\2\2\2\u04ba\u04bb\7\21\2\2\u04bb\u04bc\7\b\2\2\u04bc\u04bd\5"+ + "^\60\2\u04bd\u04be\7\t\2\2\u04be\u00c9\3\2\2\2\u04bf\u04c0\7i\2\2\u04c0"+ + "\u04c1\7\b\2\2\u04c1\u04c2\5^\60\2\u04c2\u04c3\7\t\2\2\u04c3\u00cb\3\2"+ + "\2\2\u04c4\u04c5\5J&\2\u04c5\u04c6\5\u00ceh\2\u04c6\u00cd\3\2\2\2\u04c7"+ + "\u04ce\7\n\2\2\u04c8\u04ca\5\u00d0i\2\u04c9\u04cb\7\17\2\2\u04ca\u04c9"+ + "\3\2\2\2\u04ca\u04cb\3\2\2\2\u04cb\u04cd\3\2\2\2\u04cc\u04c8\3\2\2\2\u04cd"+ + "\u04d0\3\2\2\2\u04ce\u04cc\3\2\2\2\u04ce\u04cf\3\2\2\2\u04cf\u04d1\3\2"+ + "\2\2\u04d0\u04ce\3\2\2\2\u04d1\u04d2\7\13\2\2\u04d2\u00cf\3\2\2\2\u04d3"+ + "\u04d6\5`\61\2\u04d4\u04d6\7\u00a8\2\2\u04d5\u04d3\3\2\2\2\u04d5\u04d4"+ + "\3\2\2\2\u04d6\u00d1\3\2\2\2\u04d7\u04da\5\u00d4k\2\u04d8\u04da\5\u00d6"+ + "l\2\u04d9\u04d7\3\2\2\2\u04d9\u04d8\3\2\2\2\u04da\u00d3\3\2\2\2\u04db"+ + "\u04dc\5J&\2\u04dc\u04dd\79\2\2\u04dd\u04de\7\u00aa\2\2\u04de\u00d5\3"+ + "\2\2\2\u04df\u04e0\5\64\33\2\u04e0\u04e1\7\37\2\2\u04e1\u04e3\7\n\2\2"+ + "\u04e2\u04e4\5Z.\2\u04e3\u04e2\3\2\2\2\u04e3\u04e4\3\2\2\2\u04e4\u04e5"+ + "\3\2\2\2\u04e5\u04e8\7\13\2\2\u04e6\u04e7\7F\2\2\u04e7\u04e9\5\u0130\u0099"+ + "\2\u04e8\u04e6\3\2\2\2\u04e8\u04e9\3\2\2\2\u04e9\u04ea\3\2\2\2\u04ea\u04eb"+ + "\7\b\2\2\u04eb\u04ec\5\22\n\2\u04ec\u04ed\7\t\2\2\u04ed\u00d7\3\2\2\2"+ + "\u04ee\u04ef\7s\2\2\u04ef\u04f0\7|\2\2\u04f0\u04f1\5`\61\2\u04f1\u04f2"+ + "\7z\2\2\u04f2\u04f6\5`\61\2\u04f3\u04f4\7G\2\2\u04f4\u04f5\7~\2\2\u04f5"+ + "\u04f7\5`\61\2\u04f6\u04f3\3\2\2\2\u04f6\u04f7\3\2\2\2\u04f7\u0506\3\2"+ + "\2\2\u04f8\u04f9\7s\2\2\u04f9\u04fa\7|\2\2\u04fa\u04ff\5\u013e\u00a0\2"+ + "\u04fb\u04fc\7\17\2\2\u04fc\u04fe\5\u013e\u00a0\2\u04fd\u04fb\3\2\2\2"+ + "\u04fe\u0501\3\2\2\2\u04ff\u04fd\3\2\2\2\u04ff\u0500\3\2\2\2\u0500\u0502"+ + "\3\2\2\2\u0501\u04ff\3\2\2\2\u0502\u0503\7z\2\2\u0503\u0504\5`\61\2\u0504"+ + "\u0506\3\2\2\2\u0505\u04ee\3\2\2\2\u0505\u04f8\3\2\2\2\u0506\u00d9\3\2"+ + "\2\2\u0507\u0508\7t\2\2\u0508\u0509\7|\2\2\u0509\u050a\5\u00e4s\2\u050a"+ + "\u00db\3\2\2\2\u050b\u050c\7u\2\2\u050c\u050d\7|\2\2\u050d\u050e\5\u00e4"+ + "s\2\u050e\u050f\7F\2\2\u050f\u0510\5`\61\2\u0510\u00dd\3\2\2\2\u0511\u0512"+ + "\7v\2\2\u0512\u0513\7{\2\2\u0513\u0514\7a\2\2\u0514\u0515\7|\2\2\u0515"+ + "\u0516\5\u00e4s\2\u0516\u0517\7}\2\2\u0517\u0518\5`\61\2\u0518\u00df\3"+ + "\2\2\2\u0519\u051a\7w\2\2\u051a\u051f\5\u00e6t\2\u051b\u051c\7\17\2\2"+ + "\u051c\u051e\5\u00e6t\2\u051d\u051b\3\2\2\2\u051e\u0521\3\2\2\2\u051f"+ + "\u051d\3\2\2\2\u051f\u0520\3\2\2\2\u0520\u0522\3\2\2\2\u0521\u051f\3\2"+ + "\2\2\u0522\u0523\7x\2\2\u0523\u0524\5`\61\2\u0524\u0525\7C\2\2\u0525\u0526"+ + "\5`\61\2\u0526\u00e1\3\2\2\2\u0527\u0528\7y\2\2\u0528\u0529\7|\2\2\u0529"+ + "\u052a\5`\61\2\u052a\u052b\7z\2\2\u052b\u052c\5`\61\2\u052c\u00e3\3\2"+ + "\2\2\u052d\u0530\5\u00be`\2\u052e\u0531\5\u00b6\\\2\u052f\u0531\5\u00bc"+ + "_\2\u0530\u052e\3\2\2\2\u0530\u052f\3\2\2\2\u0531\u0532\3\2\2\2\u0532"+ + "\u0530\3\2\2\2\u0532\u0533\3\2\2\2\u0533\u00e5\3\2\2\2\u0534\u0535\5\u00c2"+ + "b\2\u0535\u0536\7\7\2\2\u0536\u0537\5`\61\2\u0537\u00e7\3\2\2\2\u0538"+ + "\u053a\7\u0083\2\2\u0539\u053b\5\u00eav\2\u053a\u0539\3\2\2\2\u053a\u053b"+ + "\3\2\2\2\u053b\u0540\3\2\2\2\u053c\u053d\7\u0084\2\2\u053d\u0540\5\u00ea"+ + "v\2\u053e\u0540\5\u00eav\2\u053f\u0538\3\2\2\2\u053f\u053c\3\2\2\2\u053f"+ + "\u053e\3\2\2\2\u0540\u00e9\3\2\2\2\u0541\u0546\5\u00ecw\2\u0542\u0543"+ + "\t\b\2\2\u0543\u0545\5\u00ecw\2\u0544\u0542\3\2\2\2\u0545\u0548\3\2\2"+ + "\2\u0546\u0544\3\2\2\2\u0546\u0547\3\2\2\2\u0547\u00eb\3\2\2\2\u0548\u0546"+ + "\3\2\2\2\u0549\u054c\5\u00b4[\2\u054a\u054c\5\u00eex\2\u054b\u0549\3\2"+ + "\2\2\u054b\u054a\3\2\2\2\u054c\u00ed\3\2\2\2\u054d\u0550\5\u00f6|\2\u054e"+ + "\u0550\5\u00f0y\2\u054f\u054d\3\2\2\2\u054f\u054e\3\2\2\2\u0550\u0551"+ + "\3\2\2\2\u0551\u0552\5\u0106\u0084\2\u0552\u00ef\3\2\2\2\u0553\u0554\5"+ + "\u00f2z\2\u0554\u0555\5\u00fc\177\2\u0555\u0558\3\2\2\2\u0556\u0558\5"+ + "\u00f4{\2\u0557\u0553\3\2\2\2\u0557\u0556\3\2\2\2\u0558\u00f1\3\2\2\2"+ + "\u0559\u055a\t\t\2\2\u055a\u055b\7\23\2\2\u055b\u055c\7\23\2\2\u055c\u00f3"+ + "\3\2\2\2\u055d\u055e\7\u0085\2\2\u055e\u055f\5\u00fc\177\2\u055f\u00f5"+ + "\3\2\2\2\u0560\u0561\5\u00f8}\2\u0561\u0562\5\u00fc\177\2\u0562\u0565"+ + "\3\2\2\2\u0563\u0565\5\u00fa~\2\u0564\u0560\3\2\2\2\u0564\u0563\3\2\2"+ + "\2\u0565\u00f7\3\2\2\2\u0566\u0567\t\n\2\2\u0567\u0568\7\23\2\2\u0568"+ + "\u0569\7\23\2\2\u0569\u00f9\3\2\2\2\u056a\u056b\7:\2\2\u056b\u00fb\3\2"+ + "\2\2\u056c\u056f\5\u00fe\u0080\2\u056d\u056f\5\u0108\u0085\2\u056e\u056c"+ + "\3\2\2\2\u056e\u056d\3\2\2\2\u056f\u00fd\3\2\2\2\u0570\u0573\5J&\2\u0571"+ + "\u0573\5\u0100\u0081\2\u0572\u0570\3\2\2\2\u0572\u0571\3\2\2\2\u0573\u00ff"+ + "\3\2\2\2\u0574\u0578\7\f\2\2\u0575\u0578\5\u0102\u0082\2\u0576\u0578\5"+ + "\u0104\u0083\2\u0577\u0574\3\2\2\2\u0577\u0575\3\2\2\2\u0577\u0576\3\2"+ + "\2\2\u0578\u0101\3\2\2\2\u0579\u057a\7\u00b0\2\2\u057a\u057b\7\23\2\2"+ + "\u057b\u057c\7\f\2\2\u057c\u0103\3\2\2\2\u057d\u057e\7\f\2\2\u057e\u057f"+ + "\7\23\2\2\u057f\u0580\7\u00b0\2\2\u0580\u0105\3\2\2\2\u0581\u0583\5\u00ba"+ + "^\2\u0582\u0581\3\2\2\2\u0583\u0586\3\2\2\2\u0584\u0582\3\2\2\2\u0584"+ + "\u0585\3\2\2\2\u0585\u0107\3\2\2\2\u0586\u0584\3\2\2\2\u0587\u0593\5\u010e"+ + "\u0088\2\u0588\u0593\5\u0120\u0091\2\u0589\u0593\5\u0118\u008d\2\u058a"+ + "\u0593\5\u0124\u0093\2\u058b\u0593\5\u011c\u008f\2\u058c\u0593\5\u0116"+ + "\u008c\2\u058d\u0593\5\u0112\u008a\2\u058e\u0593\5\u0110\u0089\2\u058f"+ + "\u0593\5\u0114\u008b\2\u0590\u0593\5\u010c\u0087\2\u0591\u0593\5\u010a"+ + "\u0086\2\u0592\u0587\3\2\2\2\u0592\u0588\3\2\2\2\u0592\u0589\3\2\2\2\u0592"+ + "\u058a\3\2\2\2\u0592\u058b\3\2\2\2\u0592\u058c\3\2\2\2\u0592\u058d\3\2"+ + "\2\2\u0592\u058e\3\2\2\2\u0592\u058f\3\2\2\2\u0592\u0590\3\2\2\2\u0592"+ + "\u0591\3\2\2\2\u0593\u0109\3\2\2\2\u0594\u0595\7\u0092\2\2\u0595\u0596"+ + "\7\n\2\2\u0596\u0597\7\13\2\2\u0597\u010b\3\2\2\2\u0598\u0599\7\u0093"+ + "\2\2\u0599\u059a\7\n\2\2\u059a\u059b\7\13\2\2\u059b\u010d\3\2\2\2\u059c"+ + "\u059d\7\u0095\2\2\u059d\u05a0\7\n\2\2\u059e\u05a1\5\u0120\u0091\2\u059f"+ + "\u05a1\5\u0124\u0093\2\u05a0\u059e\3\2\2\2\u05a0\u059f\3\2\2\2\u05a0\u05a1"+ + "\3\2\2\2\u05a1\u05a2\3\2\2\2\u05a2\u05a3\7\13\2\2\u05a3\u010f\3\2\2\2"+ + "\u05a4\u05a5\7\u0096\2\2\u05a5\u05a6\7\n\2\2\u05a6\u05a7\7\13\2\2\u05a7"+ + "\u0111\3\2\2\2\u05a8\u05a9\7\u00a0\2\2\u05a9\u05aa\7\n\2\2\u05aa\u05ab"+ + "\7\13\2\2\u05ab\u0113\3\2\2\2\u05ac\u05ad\7\u0098\2\2\u05ad\u05ae\7\n"+ + "\2\2\u05ae\u05af\7\13\2\2\u05af\u0115\3\2\2\2\u05b0\u05b1\7\u0097\2\2"+ + "\u05b1\u05b4\7\n\2\2\u05b2\u05b5\7\u00b0\2\2\u05b3\u05b5\5\u0144\u00a3"+ + "\2\u05b4\u05b2\3\2\2\2\u05b4\u05b3\3\2\2\2\u05b4\u05b5\3\2\2\2\u05b5\u05b6"+ + "\3\2\2\2\u05b6\u05b7\7\13\2\2\u05b7\u0117\3\2\2\2\u05b8\u05b9\7\u0088"+ + "\2\2\u05b9\u05bf\7\n\2\2\u05ba\u05bd\5\u011a\u008e\2\u05bb\u05bc\7\17"+ + "\2\2\u05bc\u05be\5\u012e\u0098\2\u05bd\u05bb\3\2\2\2\u05bd\u05be\3\2\2"+ + "\2\u05be\u05c0\3\2\2\2\u05bf\u05ba\3\2\2\2\u05bf\u05c0\3\2\2\2\u05c0\u05c1"+ + "\3\2\2\2\u05c1\u05c2\7\13\2\2\u05c2\u0119\3\2\2\2\u05c3\u05c6\5\u0128"+ + "\u0095\2\u05c4\u05c6\7\f\2\2\u05c5\u05c3\3\2\2\2\u05c5\u05c4\3\2\2\2\u05c6"+ + "\u011b\3\2\2\2\u05c7\u05c8\7\u0099\2\2\u05c8\u05c9\7\n\2\2\u05c9\u05ca"+ + "\5\u011e\u0090\2\u05ca\u05cb\7\13\2\2\u05cb\u011d\3\2\2\2\u05cc\u05cd"+ + "\5\u0128\u0095\2\u05cd\u011f\3\2\2\2\u05ce\u05cf\7\u0082\2\2\u05cf\u05d8"+ + "\7\n\2\2\u05d0\u05d6\5\u0122\u0092\2\u05d1\u05d2\7\17\2\2\u05d2\u05d4"+ + "\5\u012e\u0098\2\u05d3\u05d5\7\u00a8\2\2\u05d4\u05d3\3\2\2\2\u05d4\u05d5"+ + "\3\2\2\2\u05d5\u05d7\3\2\2\2\u05d6\u05d1\3\2\2\2\u05d6\u05d7\3\2\2\2\u05d7"+ + "\u05d9\3\2\2\2\u05d8\u05d0\3\2\2\2\u05d8\u05d9\3\2\2\2\u05d9\u05da\3\2"+ + "\2\2\u05da\u05db\7\13\2\2\u05db\u0121\3\2\2\2\u05dc\u05df\5\u012a\u0096"+ + "\2\u05dd\u05df\7\f\2\2\u05de\u05dc\3\2\2\2\u05de\u05dd\3\2\2\2\u05df\u0123"+ + "\3\2\2\2\u05e0\u05e1\7\u009a\2\2\u05e1\u05e2\7\n\2\2\u05e2\u05e3\5\u0126"+ + "\u0094\2\u05e3\u05e4\7\13\2\2\u05e4\u0125\3\2\2\2\u05e5\u05e6\5\u012a"+ + "\u0096\2\u05e6\u0127\3\2\2\2\u05e7\u05e8\5J&\2\u05e8\u0129\3\2\2\2\u05e9"+ + "\u05ea\5J&\2\u05ea\u012b\3\2\2\2\u05eb\u05ec\5\u012e\u0098\2\u05ec\u012d"+ + "\3\2\2\2\u05ed\u05ee\5J&\2\u05ee\u012f\3\2\2\2\u05ef\u05f0\7\n\2\2\u05f0"+ + "\u05f8\7\13\2\2\u05f1\u05f5\5\u0134\u009b\2\u05f2\u05f6\7\u00a8\2\2\u05f3"+ + "\u05f6\7\f\2\2\u05f4\u05f6\7/\2\2\u05f5\u05f2\3\2\2\2\u05f5\u05f3\3\2"+ + "\2\2\u05f5\u05f4\3\2\2\2\u05f5\u05f6\3\2\2\2\u05f6\u05f8\3\2\2\2\u05f7"+ + "\u05ef\3\2\2\2\u05f7\u05f1\3\2\2\2\u05f8\u0131\3\2\2\2\u05f9\u0602\7\b"+ + "\2\2\u05fa\u05ff\5\u013e\u00a0\2\u05fb\u05fc\7\17\2\2\u05fc\u05fe\5\u013e"+ + "\u00a0\2\u05fd\u05fb\3\2\2\2\u05fe\u0601\3\2\2\2\u05ff\u05fd\3\2\2\2\u05ff"+ + "\u0600\3\2\2\2\u0600\u0603\3\2\2\2\u0601\u05ff\3\2\2\2\u0602\u05fa\3\2"+ + "\2\2\u0602\u0603\3\2\2\2\u0603\u0604\3\2\2\2\u0604\u060a\7\t\2\2\u0605"+ + "\u0606\7;\2\2\u0606\u0607\5^\60\2\u0607\u0608\7<\2\2\u0608\u060a\3\2\2"+ + "\2\u0609\u05f9\3\2\2\2\u0609\u0605\3\2\2\2\u060a\u0133\3\2\2\2\u060b\u060f"+ + "\5J&\2\u060c\u060f\7\u00a9\2\2\u060d\u060f\5\u0136\u009c\2\u060e\u060b"+ + "\3\2\2\2\u060e\u060c\3\2\2\2\u060e\u060d\3\2\2\2\u060f\u0135\3\2\2\2\u0610"+ + "\u0613\5\u0138\u009d\2\u0611\u0613\5\u013a\u009e\2\u0612\u0610\3\2\2\2"+ + "\u0612\u0611\3\2\2\2\u0613\u0137\3\2\2\2\u0614\u0615\7\37\2\2\u0615\u0616"+ + "\7\n\2\2\u0616\u0617\7\f\2\2\u0617\u0618\7\13\2\2\u0618\u0139\3\2\2\2"+ + "\u0619\u061a\7\37\2\2\u061a\u0623\7\n\2\2\u061b\u0620\5\u0130\u0099\2"+ + "\u061c\u061d\7\17\2\2\u061d\u061f\5\u0130\u0099\2\u061e\u061c\3\2\2\2"+ + "\u061f\u0622\3\2\2\2\u0620\u061e\3\2\2\2\u0620\u0621\3\2\2\2\u0621\u0624"+ + "\3\2\2\2\u0622\u0620\3\2\2\2\u0623\u061b\3\2\2\2\u0623\u0624\3\2\2\2\u0624"+ + "\u0625\3\2\2\2\u0625\u0626\7\13\2\2\u0626\u0627\7F\2\2\u0627\u0628\5\u0130"+ + "\u0099\2\u0628\u013b\3\2\2\2\u0629\u062b\5\u0134\u009b\2\u062a\u062c\7"+ + "\u00a8\2\2\u062b\u062a\3\2\2\2\u062b\u062c\3\2\2\2\u062c\u013d\3\2\2\2"+ + "\u062d\u0630\5`\61\2\u062e\u0630\7\u00b0\2\2\u062f\u062d\3\2\2\2\u062f"+ + "\u062e\3\2\2\2\u0630\u0631\3\2\2\2\u0631\u0632\t\13\2\2\u0632\u0633\5"+ + "`\61\2\u0633\u013f\3\2\2\2\u0634\u0636\7\65\2\2\u0635\u0637\5^\60\2\u0636"+ + "\u0635\3\2\2\2\u0636\u0637\3\2\2\2\u0637\u0638\3\2\2\2\u0638\u0639\7\66"+ + "\2\2\u0639\u0141\3\2\2\2\u063a\u063b\5\u0144\u00a3\2\u063b\u0143\3\2\2"+ + "\2\u063c\u063d\7\u00a7\2\2\u063d\u0145\3\2\2\2\u063e\u063f\t\f\2\2\u063f"+ + "\u0147\3\2\2\2\u009b\u0150\u0154\u0164\u016a\u0172\u017a\u0182\u0191\u01af"+ + "\u01b7\u01b9\u01cf\u01d9\u01e3\u01e8\u01ed\u01f1\u01fd\u0201\u020a\u0211"+ + "\u021f\u0223\u0228\u0232\u023a\u023e\u024a\u0256\u026c\u0274\u0279\u027c"+ + "\u0280\u0289\u0292\u0295\u029d\u02a4\u02a6\u02ad\u02b4\u02b6\u02be\u02c3"+ + "\u02ca\u02d1\u02db\u02e2\u02e9\u02f0\u02f9\u0303\u0307\u030f\u0311\u031d"+ + "\u0323\u0327\u032b\u0336\u033c\u034b\u0351\u0355\u0359\u0360\u0367\u036d"+ + "\u0372\u0374\u0378\u037f\u0386\u038f\u039b\u03a5\u03b1\u03b5\u03be\u03c5"+ + "\u03db\u03e0\u03e5\u03e9\u03f5\u03fd\u0401\u0408\u040f\u0415\u041c\u0424"+ + "\u042b\u0431\u0437\u043d\u0443\u044e\u0454\u0459\u0461\u0476\u047f\u0481"+ + "\u0498\u04a9\u04b4\u04ca\u04ce\u04d5\u04d9\u04e3\u04e8\u04f6\u04ff\u0505"+ + "\u051f\u0530\u0532\u053a\u053f\u0546\u054b\u054f\u0557\u0564\u056e\u0572"+ + "\u0577\u0584\u0592\u05a0\u05b4\u05bd\u05bf\u05c5\u05d4\u05d6\u05d8\u05de"+ + "\u05f5\u05f7\u05ff\u0602\u0609\u060e\u0612\u0620\u0623\u062b\u062f\u0636"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/org/rumbledb/parser/JsoniqVisitor.java b/src/main/java/org/rumbledb/parser/JsoniqVisitor.java index 46a22436a..04f2afde1 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqVisitor.java +++ b/src/main/java/org/rumbledb/parser/JsoniqVisitor.java @@ -703,18 +703,6 @@ public interface JsoniqVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitCopyDecl(JsoniqParser.CopyDeclContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#schemaImport}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitSchemaImport(JsoniqParser.SchemaImportContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#schemaPrefix}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitSchemaPrefix(JsoniqParser.SchemaPrefixContext ctx); /** * Visit a parse tree produced by {@link JsoniqParser#pathExpr}. * @param ctx the parse tree @@ -826,18 +814,6 @@ public interface JsoniqVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitPredicateList(JsoniqParser.PredicateListContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#itemType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitItemType(JsoniqParser.ItemTypeContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#atomicOrUnionType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitAtomicOrUnionType(JsoniqParser.AtomicOrUnionTypeContext ctx); /** * Visit a parse tree produced by {@link JsoniqParser#kindTest}. * @param ctx the parse tree @@ -904,6 +880,12 @@ public interface JsoniqVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitSchemaAttributeTest(JsoniqParser.SchemaAttributeTestContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#attributeDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAttributeDeclaration(JsoniqParser.AttributeDeclarationContext ctx); /** * Visit a parse tree produced by {@link JsoniqParser#elementTest}. * @param ctx the parse tree @@ -952,90 +934,6 @@ public interface JsoniqVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitTypeName(JsoniqParser.TypeNameContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#mapTest}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitMapTest(JsoniqParser.MapTestContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#anyMapTest}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitAnyMapTest(JsoniqParser.AnyMapTestContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#typedMapTest}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitTypedMapTest(JsoniqParser.TypedMapTestContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#arrayTest}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitArrayTest(JsoniqParser.ArrayTestContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#anyArrayTest}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitAnyArrayTest(JsoniqParser.AnyArrayTestContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#typedArrayTest}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitTypedArrayTest(JsoniqParser.TypedArrayTestContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#parenthesizedItemTest}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitParenthesizedItemTest(JsoniqParser.ParenthesizedItemTestContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#attributeDeclaration}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitAttributeDeclaration(JsoniqParser.AttributeDeclarationContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#mlNodeTest}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitMlNodeTest(JsoniqParser.MlNodeTestContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#mlArrayNodeTest}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitMlArrayNodeTest(JsoniqParser.MlArrayNodeTestContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#mlObjectNodeTest}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitMlObjectNodeTest(JsoniqParser.MlObjectNodeTestContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#mlNumberNodeTest}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitMlNumberNodeTest(JsoniqParser.MlNumberNodeTestContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#mlBooleanNodeTest}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitMlBooleanNodeTest(JsoniqParser.MlBooleanNodeTestContext ctx); - /** - * Visit a parse tree produced by {@link JsoniqParser#mlNullNodeTest}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitMlNullNodeTest(JsoniqParser.MlNullNodeTestContext ctx); /** * Visit a parse tree produced by {@link JsoniqParser#sequenceType}. * @param ctx the parse tree @@ -1048,6 +946,12 @@ public interface JsoniqVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitObjectConstructor(JsoniqParser.ObjectConstructorContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#itemType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitItemType(JsoniqParser.ItemTypeContext ctx); /** * Visit a parse tree produced by {@link JsoniqParser#functionTest}. * @param ctx the parse tree From a0e77c3f1d4dc7cf376757085ec6ef8843c2f162 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 25 Jul 2024 18:36:43 +0200 Subject: [PATCH 43/56] Fixed numpy tests --- .../test_files/runtime/numpy_lib/jsoniq_numpy.jq | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq index 8f8a3f754..6e59aa5b2 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq @@ -954,22 +954,22 @@ declare function jsoniq_numpy:sort($array as array, $low as integer, $high as in declare function jsoniq_numpy:partition($array as array, $low as integer, $high as integer) { variable $pivot := jsoniq_numpy:random_randint($low, {"high": $high + 1, "size": [1]})[1]; variable $end := $array[[$high]]; - replace json value of $array[[$high]] with $array[[$pivot]]; - replace json value of $array[[$pivot]] with $end; + replace value of json $array[[$high]] with $array[[$pivot]]; + replace value of json $array[[$pivot]] with $end; variable $i := $low; for $j in $low to $high - 1 return { if ($array[[$j]] le $array[[$high]]) then { variable $aux := $array[[$i]]; - replace json value of $array[[$i]] with $array[[$j]]; - replace json value of $array[[$j]] with $aux; + replace value of json $array[[$i]] with $array[[$j]]; + replace value of json $array[[$j]] with $aux; $i := $i + 1; } else (); } variable $aux := $array[[$i]]; - replace json value of $array[[$i]] with $array[[$high]]; - replace json value of $array[[$high]] with $aux; + replace value of json $array[[$i]] with $array[[$high]]; + replace value of json $array[[$high]] with $aux; exit returning ($array, $i); }; From b04f463f89168170121c0556fa1760ea97a21715 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Mon, 29 Jul 2024 14:39:48 +0200 Subject: [PATCH 44/56] Added initial runtime behavior --- .../compiler/RuntimeIteratorVisitor.java | 62 +++++ .../rumbledb/compiler/TranslationVisitor.java | 5 +- .../org/rumbledb/errorcodes/ErrorCode.java | 3 +- .../exceptions/UnexpectedNodeException.java | 9 + .../rumbledb/expressions/xml/PathExpr.java | 4 + .../rumbledb/expressions/xml/StepExpr.java | 5 + .../expressions/xml/axis/ForwardStep.java | 17 ++ .../expressions/xml/axis/ReverseStep.java | 17 ++ .../rumbledb/expressions/xml/axis/Step.java | 8 + .../xml/node_test/AttributeTest.java | 16 ++ .../xml/node_test/DocumentTest.java | 8 + .../xml/node_test/ElementTest.java | 16 ++ .../expressions/xml/node_test/NameTest.java | 16 ++ .../org/rumbledb/items/xml/AttributeItem.java | 9 + .../org/rumbledb/items/xml/DocumentItem.java | 9 + .../org/rumbledb/items/xml/ElementItem.java | 12 +- .../java/org/rumbledb/items/xml/TextItem.java | 19 +- .../runtime/xml/PathExprIterator.java | 56 ++++- .../runtime/xml/StepExprIterator.java | 216 ++++++++++++++++++ .../runtime/xml/axis/AxisIterator.java | 70 ++++++ .../runtime/xml/axis/AxisIteratorVisitor.java | 66 ++++++ .../axis/forward/AttributeAxisIterator.java | 29 +++ .../xml/axis/forward/ChildAxisIterator.java | 33 +++ .../axis/forward/DescendantAxisIterator.java | 29 +++ .../forward/DescendantOrSelfAxisIterator.java | 32 +++ .../axis/forward/FollowingAxisIterator.java | 54 +++++ .../forward/FollowingSiblingAxisIterator.java | 49 ++++ .../xml/axis/forward/SelfAxisIterator.java | 30 +++ .../axis/reverse/AncestorAxisIterator.java | 29 +++ .../reverse/AncestorOrSelfAxisIterator.java | 32 +++ .../xml/axis/reverse/ParentAxisIterator.java | 30 +++ .../axis/reverse/PrecedingAxisIterator.java | 55 +++++ .../reverse/PrecedingSiblingAxisIterator.java | 49 ++++ 33 files changed, 1068 insertions(+), 26 deletions(-) create mode 100644 src/main/java/org/rumbledb/exceptions/UnexpectedNodeException.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/axis/AxisIteratorVisitor.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/axis/forward/ChildAxisIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantAxisIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index 9d5354e40..d3a1dbb02 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -32,6 +32,7 @@ import org.rumbledb.exceptions.UnsupportedFeatureException; import org.rumbledb.expressions.AbstractNodeVisitor; import org.rumbledb.expressions.CommaExpression; +import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; import org.rumbledb.expressions.arithmetic.AdditiveExpression; @@ -114,6 +115,10 @@ import org.rumbledb.expressions.update.RenameExpression; import org.rumbledb.expressions.update.ReplaceExpression; import org.rumbledb.expressions.update.TransformExpression; +import org.rumbledb.expressions.xml.PathExpr; +import org.rumbledb.expressions.xml.StepExpr; +import org.rumbledb.expressions.xml.axis.Step; +import org.rumbledb.expressions.xml.node_test.NodeTest; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.CommaExpressionIterator; @@ -190,6 +195,10 @@ import org.rumbledb.runtime.update.expression.RenameExpressionIterator; import org.rumbledb.runtime.update.expression.ReplaceExpressionIterator; import org.rumbledb.runtime.update.expression.TransformExpressionIterator; +import org.rumbledb.runtime.xml.PathExprIterator; +import org.rumbledb.runtime.xml.StepExprIterator; +import org.rumbledb.runtime.xml.axis.AxisIterator; +import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.SequenceType; @@ -1414,4 +1423,57 @@ public RuntimeIterator visitFlowrStatement(FlowrStatement statement, RuntimeIter runtimeIterator.setStaticContext(statement.getStaticContext()); return runtimeIterator; } + + @Override + public RuntimeIterator visitPathExpr(PathExpr pathExpr, RuntimeIterator argument) { + List stepExprIterators = new ArrayList<>(); + pathExpr.getRelativePathExpressions() + .forEach(relativePathExpr -> stepExprIterators.add(this.visit(relativePathExpr, argument))); + if (pathExpr.needsRoot()) { + // TODO: add iterator for function getRoot() + } + RuntimeIterator runtimeIterator = new PathExprIterator( + stepExprIterators, + null, + new RuntimeStaticContext( + this.config, + pathExpr.getStaticSequenceType(), + pathExpr.getHighestExecutionMode(this.visitorConfig), + pathExpr.getMetadata() + ) + ); + runtimeIterator.setStaticContext(pathExpr.getStaticContext()); + return runtimeIterator; + } + + @Override + public RuntimeIterator visitStepExpr(StepExpr stepExpr, RuntimeIterator argument) { + AxisIterator axisIterator = this.visitAxisStep(stepExpr.getStep(), stepExpr.getMetadata()); + NodeTest nodeTest = stepExpr.getNodeTest(); + List predicatesIterator = new ArrayList<>(); + stepExpr.getPredicates().forEach(predicate -> predicatesIterator.add(this.visit(predicate, argument))); + return new StepExprIterator( + axisIterator, + nodeTest, + predicatesIterator, + new RuntimeStaticContext( + this.config, + stepExpr.getStaticSequenceType(), + stepExpr.getHighestExecutionMode(this.visitorConfig), + stepExpr.getMetadata() + ) + ); + } + + private AxisIterator visitAxisStep(Step step, ExceptionMetadata metadata) { + return step.accept( + new AxisIteratorVisitor(), + new RuntimeStaticContext( + this.config, + ExecutionMode.LOCAL, + metadata + ) + ); + } + } diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java index cd6dda57b..8aeee2c82 100644 --- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java @@ -2446,12 +2446,15 @@ private NodeTest getNodeTest(JsoniqParser.NodeTestContext nodeTestContext) { private NodeTest getKindTest(ParseTree kindTest) { if (kindTest instanceof JsoniqParser.DocumentTestContext) { JsoniqParser.DocumentTestContext docContext = (JsoniqParser.DocumentTestContext) kindTest; - if (docContext.elementTest().isEmpty()) { + if (docContext.schemaElementTest() != null) { throw new UnsupportedFeatureException( "Kind tests of type document, element, attribute, text and any are supported at the moment", createMetadataFromContext((ParserRuleContext) kindTest) ); } + if (docContext.elementTest() == null) { + return new DocumentTest(null); + } return new DocumentTest(getKindTest(docContext.elementTest())); } else if (kindTest instanceof JsoniqParser.ElementTestContext) { JsoniqParser.ElementTestContext elementContext = (JsoniqParser.ElementTestContext) kindTest; diff --git a/src/main/java/org/rumbledb/errorcodes/ErrorCode.java b/src/main/java/org/rumbledb/errorcodes/ErrorCode.java index c2f862160..4c452e3a3 100644 --- a/src/main/java/org/rumbledb/errorcodes/ErrorCode.java +++ b/src/main/java/org/rumbledb/errorcodes/ErrorCode.java @@ -149,8 +149,9 @@ public enum ErrorCode { InvalidAssignableVariableComposability("SCCP0005"), InvalidSequentialChildInNonSequentialParent("SCCP0006"), InvalidAnnotation("XQAN0001"), - InvalidVariableDeclaration("SCIN0001"); + InvalidVariableDeclaration("SCIN0001"), + UnexpectedNode("XPTY0019"); private String code; diff --git a/src/main/java/org/rumbledb/exceptions/UnexpectedNodeException.java b/src/main/java/org/rumbledb/exceptions/UnexpectedNodeException.java new file mode 100644 index 000000000..ec96e35ca --- /dev/null +++ b/src/main/java/org/rumbledb/exceptions/UnexpectedNodeException.java @@ -0,0 +1,9 @@ +package org.rumbledb.exceptions; + +import org.rumbledb.errorcodes.ErrorCode; + +public class UnexpectedNodeException extends RumbleException { + public UnexpectedNodeException(String message, ExceptionMetadata metadata) { + super(message, ErrorCode.UnexpectedNode, metadata); + } +} diff --git a/src/main/java/org/rumbledb/expressions/xml/PathExpr.java b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java index 83db51f11..af909f544 100644 --- a/src/main/java/org/rumbledb/expressions/xml/PathExpr.java +++ b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java @@ -52,4 +52,8 @@ public void serializeToJSONiq(StringBuffer sb, int indent) { public List getRelativePathExpressions() { return this.relativePathExpressions; } + + public boolean needsRoot() { + return this.fetchRoot; + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/StepExpr.java b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java index 64e90076e..0a1ed5e76 100644 --- a/src/main/java/org/rumbledb/expressions/xml/StepExpr.java +++ b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java @@ -5,6 +5,7 @@ import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; import org.rumbledb.expressions.xml.axis.Step; +import org.rumbledb.expressions.xml.node_test.NodeTest; import java.util.ArrayList; import java.util.List; @@ -53,4 +54,8 @@ public List getPredicates() { public Step getStep() { return this.step; } + + public NodeTest getNodeTest() { + return this.step.getNodeTest(); + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java index 9e9236ed9..4738c39b9 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java @@ -1,6 +1,9 @@ package org.rumbledb.expressions.xml.axis; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.expressions.xml.node_test.NodeTest; +import org.rumbledb.runtime.xml.axis.AxisIterator; +import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor; public class ForwardStep implements Step { private ForwardAxis forwardAxis; @@ -15,4 +18,18 @@ public ForwardStep(ForwardAxis forwardAxis, NodeTest nodeTest) { public String toString() { return forwardAxis.getAxisValue() + nodeTest.toString(); } + + public ForwardAxis getForwardAxis() { + return forwardAxis; + } + + @Override + public AxisIterator accept(AxisIteratorVisitor visitor, RuntimeStaticContext staticContext) { + return visitor.visit(this, staticContext); + } + + @Override + public NodeTest getNodeTest() { + return nodeTest; + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java index e069f3a8a..62fae2922 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java @@ -1,6 +1,9 @@ package org.rumbledb.expressions.xml.axis; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.expressions.xml.node_test.NodeTest; +import org.rumbledb.runtime.xml.axis.AxisIterator; +import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor; public class ReverseStep implements Step { private ReverseAxis reverseAxis; @@ -15,4 +18,18 @@ public ReverseStep(ReverseAxis reverseAxis, NodeTest nodeTest) { public String toString() { return reverseAxis.getAxisValue() + nodeTest.toString(); } + + public ReverseAxis getReverseAxis() { + return this.reverseAxis; + } + + @Override + public AxisIterator accept(AxisIteratorVisitor visitor, RuntimeStaticContext staticContext) { + return visitor.visit(this, staticContext); + } + + @Override + public NodeTest getNodeTest() { + return nodeTest; + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/Step.java b/src/main/java/org/rumbledb/expressions/xml/axis/Step.java index ef717fb61..84b38cf60 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/Step.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/Step.java @@ -1,4 +1,12 @@ package org.rumbledb.expressions.xml.axis; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.expressions.xml.node_test.NodeTest; +import org.rumbledb.runtime.xml.axis.AxisIterator; +import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor; + public interface Step { + public AxisIterator accept(AxisIteratorVisitor visitor, RuntimeStaticContext staticContext); + + public NodeTest getNodeTest(); } diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java index 1454ea8c2..163d16634 100644 --- a/src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java @@ -46,4 +46,20 @@ public String toString() { sb.append(")"); return sb.toString(); } + + public boolean isEmptyCheck() { + return !this.hasWildcard && this.attributeName == null; + } + + public boolean isNameWithoutTypeCheck() { + return this.attributeName != null && this.typeName == null; + } + + public String getAttributeName() { + return this.attributeName.getLocalName(); + } + + public boolean isWildcardOnly() { + return this.attributeName == null && this.typeName == null && this.hasWildcard; + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java index b0a6202a1..98ed97369 100644 --- a/src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java @@ -17,4 +17,12 @@ public String toString() { sb.append(")"); return sb.toString(); } + + public boolean isEmptyCheck() { + return nodeTest == null; + } + + public NodeTest getNodeTest() { + return this.nodeTest; + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java index c1b38914f..098458917 100644 --- a/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java @@ -47,4 +47,20 @@ public String toString() { sb.append(")"); return sb.toString(); } + + public boolean isEmptyCheck() { + return !this.hasWildcard && this.elementName == null; + } + + public boolean isNameWithoutTypeCheck() { + return this.elementName != null && this.typeName == null; + } + + public String getElementName() { + return elementName.getLocalName(); + } + + public boolean isWildcardOnly() { + return this.elementName == null && this.typeName == null && this.hasWildcard; + } } diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java index 602c030b0..061d2b413 100644 --- a/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java +++ b/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java @@ -24,4 +24,20 @@ public String toString() { } return this.wildcardWithNCName; } + + public boolean hasQName() { + return this.qname != null; + } + + public String getQName() { + return this.qname.toString(); + } + + public boolean hasWildcardOnly() { + return this.wildcardWithNCName != null && this.wildcardWithNCName.equals("*"); + } + + public String getWildcardQName() { + return this.wildcardWithNCName; + } } diff --git a/src/main/java/org/rumbledb/items/xml/AttributeItem.java b/src/main/java/org/rumbledb/items/xml/AttributeItem.java index 0c0e290e8..2f3b38833 100644 --- a/src/main/java/org/rumbledb/items/xml/AttributeItem.java +++ b/src/main/java/org/rumbledb/items/xml/AttributeItem.java @@ -63,4 +63,13 @@ public void setParent(Item parent) { public ItemType getDynamicType() { return BuiltinTypesCatalogue.item; } + + @Override + public boolean equals(Object other) { + if (!(other instanceof AttributeItem)) { + return false; + } + AttributeItem otherAttributeItem = (AttributeItem) other; + return otherAttributeItem.attributeNode.isEqualNode(this.attributeNode); + } } diff --git a/src/main/java/org/rumbledb/items/xml/DocumentItem.java b/src/main/java/org/rumbledb/items/xml/DocumentItem.java index c7d7f24f2..8850d9a32 100644 --- a/src/main/java/org/rumbledb/items/xml/DocumentItem.java +++ b/src/main/java/org/rumbledb/items/xml/DocumentItem.java @@ -68,4 +68,13 @@ public String stringValue() { public ItemType getDynamicType() { return BuiltinTypesCatalogue.item; } + + @Override + public boolean equals(Object other) { + if (!(other instanceof DocumentItem)) { + return false; + } + DocumentItem otherDocumentItem = (DocumentItem) other; + return otherDocumentItem.documentNode.isEqualNode(this.documentNode); + } } diff --git a/src/main/java/org/rumbledb/items/xml/ElementItem.java b/src/main/java/org/rumbledb/items/xml/ElementItem.java index 365e6cc2f..4030919bb 100644 --- a/src/main/java/org/rumbledb/items/xml/ElementItem.java +++ b/src/main/java/org/rumbledb/items/xml/ElementItem.java @@ -55,16 +55,12 @@ public boolean isElement() { @Override - public boolean equals(Object otherItem) { - if (!(otherItem instanceof Item)) { + public boolean equals(Object other) { + if (!(other instanceof ElementItem)) { return false; } - Item o = (Item) otherItem; - if (!o.isElement()) { - return false; - } - // TODO: Compare each element - return true; + ElementItem otherElementItem = (ElementItem) other; + return otherElementItem.elementNode.isEqualNode(this.elementNode); } @Override diff --git a/src/main/java/org/rumbledb/items/xml/TextItem.java b/src/main/java/org/rumbledb/items/xml/TextItem.java index 25ed93aba..fe2b12ada 100644 --- a/src/main/java/org/rumbledb/items/xml/TextItem.java +++ b/src/main/java/org/rumbledb/items/xml/TextItem.java @@ -4,9 +4,6 @@ import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import org.rumbledb.api.Item; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.comparison.ComparisonExpression; -import org.rumbledb.runtime.misc.ComparisonIterator; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.ItemType; import org.w3c.dom.Node; @@ -31,17 +28,12 @@ public void setParent(Item parent) { } @Override - public boolean equals(Object otherItem) { - if (otherItem instanceof Item) { - long c = ComparisonIterator.compareItems( - this, - (Item) otherItem, - ComparisonExpression.ComparisonOperator.VC_EQ, - ExceptionMetadata.EMPTY_METADATA - ); - return c == 0; + public boolean equals(Object other) { + if (!(other instanceof TextItem)) { + return false; } - return false; + TextItem otherTextItem = (TextItem) other; + return otherTextItem.textNode.isEqualNode(this.textNode); } @Override @@ -93,4 +85,5 @@ public Item parent() { public ItemType getDynamicType() { return BuiltinTypesCatalogue.item; } + } diff --git a/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java b/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java index c6744c1b8..66fc8e77e 100644 --- a/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java @@ -2,26 +2,76 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.Name; import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.runtime.LocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import java.util.List; public class PathExprIterator extends LocalRuntimeIterator { + private final RuntimeIterator getRootIterator; + private final List stepIterators; + private List results = null; + private int nextResultCounter = 0; + private Item nextResult; - protected PathExprIterator(List children, RuntimeStaticContext staticContext) { - super(children, staticContext); + public PathExprIterator( + List stepIterators, + RuntimeIterator getRootIterator, + RuntimeStaticContext staticContext + ) { + super(null, staticContext); + this.children.addAll(stepIterators); + this.children.add(getRootIterator); + this.stepIterators = stepIterators; + this.getRootIterator = getRootIterator; } @Override public void open(DynamicContext context) { super.open(context); + setNextResult(); + } + + private void setNextResult() { + if (this.results == null) { + RuntimeIterator finalIterator = this.stepIterators.get(this.stepIterators.size() - 1); + if (this.getRootIterator != null) { + List root = this.getRootIterator.materialize(this.currentDynamicContextForLocalExecution); + this.currentDynamicContextForLocalExecution.getVariableValues() + .addVariableValue(Name.CONTEXT_ITEM, root); + } + for (int i = 0; i < this.stepIterators.size() - 1; ++i) { + // TODO: Verify that the type of each item is node + // TODO: Remove duplicate nodes + // TODO: Sort non-nodes + List nextContext = this.stepIterators.get(i) + .materialize(this.currentDynamicContextForLocalExecution); + this.currentDynamicContextForLocalExecution.getVariableValues() + .addVariableValue(Name.CONTEXT_ITEM, nextContext); + } + results = finalIterator.materialize(this.currentDynamicContextForLocalExecution); + } + if (this.nextResultCounter < this.results.size()) { + this.nextResult = this.results.get(nextResultCounter++); + } else { + this.hasNext = false; + } } @Override public Item next() { - return null; + if (this.hasNext) { + Item nextResult = this.nextResult; + setNextResult(); + return nextResult; + } + throw new IteratorFlowException( + RuntimeIterator.FLOW_EXCEPTION_MESSAGE + " in Path Expression", + getMetadata() + ); } @Override diff --git a/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java b/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java new file mode 100644 index 000000000..04fd681b8 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java @@ -0,0 +1,216 @@ +package org.rumbledb.runtime.xml; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.IteratorFlowException; +import org.rumbledb.exceptions.UnsupportedFeatureException; +import org.rumbledb.expressions.xml.node_test.AnyKindTest; +import org.rumbledb.expressions.xml.node_test.AttributeTest; +import org.rumbledb.expressions.xml.node_test.DocumentTest; +import org.rumbledb.expressions.xml.node_test.ElementTest; +import org.rumbledb.expressions.xml.node_test.NameTest; +import org.rumbledb.expressions.xml.node_test.NodeTest; +import org.rumbledb.expressions.xml.node_test.TextTest; +import org.rumbledb.items.xml.AttributeItem; +import org.rumbledb.items.xml.DocumentItem; +import org.rumbledb.items.xml.ElementItem; +import org.rumbledb.items.xml.TextItem; +import org.rumbledb.runtime.LocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class StepExprIterator extends LocalRuntimeIterator { + private final RuntimeIterator axisIterator; + private NodeTest nodeTest; + private final List predicates; + private List results; + private Item nextResult; + private int resultCounter = 0; + + public StepExprIterator( + RuntimeIterator axisIterator, + NodeTest nodeTest, + List predicates, + RuntimeStaticContext staticContext + ) { + super(null, staticContext); + this.children.add(axisIterator); + this.children.addAll(predicates); + this.axisIterator = axisIterator; + this.nodeTest = nodeTest; + this.predicates = predicates; + } + + @Override + public void open(DynamicContext context) { + super.open(context); + setNextResult(); + } + + private void setNextResult() { + if (this.results == null) { + List axisResult = this.axisIterator.materialize(this.currentDynamicContextForLocalExecution); + List nodeTestResult = applyNodeTest(axisResult); + List predicateFilterResult = applyPredicateFilter(nodeTestResult); + this.results = predicateFilterResult; + } + storeNextResult(); + } + + private void storeNextResult() { + if (this.resultCounter < this.results.size()) { + this.nextResult = this.results.get(this.resultCounter++); + } else { + this.hasNext = false; + } + } + + private List applyPredicateFilter(List nodeTestResult) { + // TODO: Implement predicates. + return nodeTestResult; + } + + private List applyNodeTest(List axisResult) { + List nodeTestResults = new ArrayList<>(); + for (Item node : axisResult) { + // TODO: Check type of node + Item nodeTestResult = nodeTestItem(node); + if (nodeTestResult != null) { + nodeTestResults.add(nodeTestResult); + } + } + return nodeTestResults; + } + + private Item nodeTestItem(Item node) { + if (this.nodeTest instanceof AnyKindTest) { + return anyKindTest(node); + } else if (this.nodeTest instanceof TextTest) { + return textKindTest(node); + } else if (this.nodeTest instanceof AttributeTest) { + return attributeKindTest(node); + } else if (this.nodeTest instanceof ElementTest) { + return elementKindTest(node); + } else if (this.nodeTest instanceof NameTest) { + return nameKindTest(node); + } else if (this.nodeTest instanceof DocumentTest) { + return documentKindTest(node); + } else { + throw new UnsupportedFeatureException( + "Only node, text, attribute, element, document and name node tests are supported.", + getMetadata() + ); + } + } + + private Item documentKindTest(Item node) { + DocumentTest documentTest = (DocumentTest) this.nodeTest; + if (documentTest.isEmptyCheck()) { + if (node instanceof DocumentItem) { + return node; + } + return node; + } + this.nodeTest = documentTest.getNodeTest(); + return nodeTestItem(node); + } + + private Item nameKindTest(Item node) { + NameTest nameTest = (NameTest) this.nodeTest; + if (nameTest.hasQName()) { + // TODO: principal node kind test + if (node.nodeName().equals(nameTest.getQName())) { + return node; + } + return null; + } + if (nameTest.hasWildcardOnly()) { + // TODO: principal node kind test + return node; + } + if (nameTest.getWildcardQName().equals(node.nodeName())) { + return node; + } + return null; + } + + private Item elementKindTest(Item node) { + ElementTest elementTest = (ElementTest) this.nodeTest; + if (elementTest.isEmptyCheck()) { + if (node instanceof ElementItem) { + return node; + } + return null; + } + if (elementTest.isNameWithoutTypeCheck()) { + if (node instanceof ElementItem && node.nodeName().equals(elementTest.getElementName())) { + return node; + } + return null; + } + if (elementTest.isWildcardOnly()) { + if (node instanceof ElementItem) { + return node; + } + return null; + } + // TODO: add support for name and type + return null; + } + + private Item attributeKindTest(Item node) { + AttributeTest attributeTest = (AttributeTest) this.nodeTest; + if (attributeTest.isEmptyCheck()) { + if (node instanceof AttributeItem) { + return node; + } + return null; + } + if (attributeTest.isNameWithoutTypeCheck()) { + if (node instanceof AttributeItem && node.nodeName().equals(attributeTest.getAttributeName())) { + return node; + } + return null; + } + if (attributeTest.isWildcardOnly()) { + if (node instanceof AttributeItem) { + return node; + } + return null; + } + // TODO: add support for name and type + return null; + } + + private Item textKindTest(Item node) { + if (node instanceof TextItem) { + return node; + } + return null; + } + + private Item anyKindTest(Item node) { + return node; + } + + @Override + public Item next() { + if (this.hasNext) { + Item nextResult = this.nextResult; + setNextResult(); + return nextResult; + } + throw new IteratorFlowException( + RuntimeIterator.FLOW_EXCEPTION_MESSAGE + " in step expr", + getMetadata() + ); + } + + @Override + public boolean hasNext() { + return super.hasNext(); + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java new file mode 100644 index 000000000..f2b94f697 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java @@ -0,0 +1,70 @@ +package org.rumbledb.runtime.xml.axis; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.IteratorFlowException; +import org.rumbledb.runtime.LocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.ArrayList; +import java.util.List; + +public abstract class AxisIterator extends LocalRuntimeIterator { + protected List results; + protected int resultCounter = 0; + protected Item nextResult; + + public AxisIterator(RuntimeStaticContext staticContext) { + super(null, staticContext); + } + + @Override + public void open(DynamicContext context) { + super.open(context); + setNextResult(); + } + + + protected abstract void setNextResult(); + + protected void storeNextResult() { + if (this.resultCounter < this.results.size()) { + this.nextResult = this.results.get(this.resultCounter++); + } else { + this.hasNext = false; + } + } + + protected List getDescendants(Item node) { + List descendants = new ArrayList<>(); + for (Item child : node.children()) { + descendants.add(child); + descendants.addAll(getDescendants(child)); + } + return descendants; + } + + protected List getAncestors(Item node) { + List ancestors = new ArrayList<>(); + Item parent = node.parent(); + while (parent != null) { + ancestors.add(parent); + parent = parent.parent(); + } + return ancestors; + } + + @Override + public Item next() { + if (this.hasNext) { + Item nextResult = this.nextResult; + setNextResult(); + return nextResult; + } + throw new IteratorFlowException( + RuntimeIterator.FLOW_EXCEPTION_MESSAGE + " in axis", + getMetadata() + ); + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/AxisIteratorVisitor.java b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIteratorVisitor.java new file mode 100644 index 000000000..1d0a9282f --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIteratorVisitor.java @@ -0,0 +1,66 @@ +package org.rumbledb.runtime.xml.axis; + +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.exceptions.UnsupportedFeatureException; +import org.rumbledb.expressions.xml.axis.ForwardStep; +import org.rumbledb.expressions.xml.axis.ReverseStep; +import org.rumbledb.runtime.xml.axis.forward.AttributeAxisIterator; +import org.rumbledb.runtime.xml.axis.forward.ChildAxisIterator; +import org.rumbledb.runtime.xml.axis.forward.DescendantAxisIterator; +import org.rumbledb.runtime.xml.axis.forward.DescendantOrSelfAxisIterator; +import org.rumbledb.runtime.xml.axis.forward.FollowingAxisIterator; +import org.rumbledb.runtime.xml.axis.forward.FollowingSiblingAxisIterator; +import org.rumbledb.runtime.xml.axis.forward.SelfAxisIterator; +import org.rumbledb.runtime.xml.axis.reverse.AncestorAxisIterator; +import org.rumbledb.runtime.xml.axis.reverse.AncestorOrSelfAxisIterator; +import org.rumbledb.runtime.xml.axis.reverse.ParentAxisIterator; +import org.rumbledb.runtime.xml.axis.reverse.PrecedingAxisIterator; +import org.rumbledb.runtime.xml.axis.reverse.PrecedingSiblingAxisIterator; + +public class AxisIteratorVisitor { + + public AxisIterator visit(ForwardStep forwardStep, RuntimeStaticContext staticContext) { + switch (forwardStep.getForwardAxis()) { + case SELF: + return new SelfAxisIterator(staticContext); + case CHILD: + return new ChildAxisIterator(staticContext); + case ATTRIBUTE: + return new AttributeAxisIterator(staticContext); + case FOLLOWING: + return new FollowingAxisIterator(staticContext); + case DESCENDANT: + return new DescendantAxisIterator(staticContext); + case FOLLOWING_SIBLING: + return new FollowingSiblingAxisIterator(staticContext); + case DESCENDANT_OR_SELF: + return new DescendantOrSelfAxisIterator(staticContext); + default: + throw new UnsupportedFeatureException( + "Axis " + forwardStep.getForwardAxis() + "unrecognized", + ExceptionMetadata.EMPTY_METADATA + ); + } + } + + public AxisIterator visit(ReverseStep reverseStep, RuntimeStaticContext staticContext) { + switch (reverseStep.getReverseAxis()) { + case PARENT: + return new ParentAxisIterator(staticContext); + case ANCESTOR: + return new AncestorAxisIterator(staticContext); + case PRECEDING: + return new PrecedingAxisIterator(staticContext); + case ANCESTOR_OR_SELF: + return new AncestorOrSelfAxisIterator(staticContext); + case PRECEDING_SIBLING: + return new PrecedingSiblingAxisIterator(staticContext); + default: + throw new UnsupportedFeatureException( + "Axis " + reverseStep.getReverseAxis() + "unrecognized", + ExceptionMetadata.EMPTY_METADATA + ); + } + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java new file mode 100644 index 000000000..6823200f9 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java @@ -0,0 +1,29 @@ +package org.rumbledb.runtime.xml.axis.forward; + +import org.rumbledb.api.Item; +import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.UnexpectedNodeException; +import org.rumbledb.runtime.xml.axis.AxisIterator; + +import java.util.List; + +public class AttributeAxisIterator extends AxisIterator { + public AttributeAxisIterator(RuntimeStaticContext staticContext) { + super(staticContext); + } + + @Override + protected void setNextResult() { + if (this.results == null) { + List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() + .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); + if (currentContext.isEmpty()) { + throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); + } + Item node = currentContext.get(0); + this.results = node.attributes(); + } + storeNextResult(); + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/ChildAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/ChildAxisIterator.java new file mode 100644 index 000000000..80fad1649 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/ChildAxisIterator.java @@ -0,0 +1,33 @@ +package org.rumbledb.runtime.xml.axis.forward; + +import org.rumbledb.api.Item; +import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.UnexpectedNodeException; +import org.rumbledb.runtime.xml.axis.AxisIterator; + +import java.util.List; + +public class ChildAxisIterator extends AxisIterator { + + public ChildAxisIterator(RuntimeStaticContext staticContext) { + super(staticContext); + } + + protected void setNextResult() { + if (this.results == null) { + List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() + .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); + if (currentContext.isEmpty()) { + throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); + } + Item node = currentContext.get(0); + this.results = node.children(); + } + if (this.resultCounter < this.results.size()) { + this.nextResult = this.results.get(this.resultCounter++); + } else { + this.hasNext = false; + } + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantAxisIterator.java new file mode 100644 index 000000000..bdb05bd2e --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantAxisIterator.java @@ -0,0 +1,29 @@ +package org.rumbledb.runtime.xml.axis.forward; + +import org.rumbledb.api.Item; +import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.UnexpectedNodeException; +import org.rumbledb.runtime.xml.axis.AxisIterator; + +import java.util.List; + +public class DescendantAxisIterator extends AxisIterator { + public DescendantAxisIterator(RuntimeStaticContext staticContext) { + super(staticContext); + } + + @Override + protected void setNextResult() { + if (this.results == null) { + List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() + .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); + if (currentContext.isEmpty()) { + throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); + } + Item node = currentContext.get(0); + this.results = getDescendants(node); + } + storeNextResult(); + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java new file mode 100644 index 000000000..208adc8e5 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java @@ -0,0 +1,32 @@ +package org.rumbledb.runtime.xml.axis.forward; + +import org.rumbledb.api.Item; +import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.UnexpectedNodeException; +import org.rumbledb.runtime.xml.axis.AxisIterator; + +import java.util.ArrayList; +import java.util.List; + +public class DescendantOrSelfAxisIterator extends AxisIterator { + public DescendantOrSelfAxisIterator(RuntimeStaticContext staticContext) { + super(staticContext); + } + + @Override + protected void setNextResult() { + if (this.results == null) { + List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() + .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); + if (currentContext.isEmpty()) { + throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); + } + Item node = currentContext.get(0); + this.results = new ArrayList<>(); + this.results.add(node); + this.results.addAll(getDescendants(node)); + } + storeNextResult(); + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java new file mode 100644 index 000000000..34cb5d79a --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java @@ -0,0 +1,54 @@ +package org.rumbledb.runtime.xml.axis.forward; + +import org.rumbledb.api.Item; +import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.UnexpectedNodeException; +import org.rumbledb.runtime.xml.axis.AxisIterator; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class FollowingAxisIterator extends AxisIterator { + public FollowingAxisIterator(RuntimeStaticContext staticContext) { + super(staticContext); + } + + @Override + protected void setNextResult() { + if (this.results == null) { + List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() + .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); + if (currentContext.isEmpty()) { + throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); + } + Item node = currentContext.get(0); + this.results = getFollowingNodes(node.parent(), node); + } + storeNextResult(); + } + + /* + * Method adds the rest of the parent's descendants following the current node. Afterward, it visits the parent's + * parent and adds its descendants following the parent. + */ + private List getFollowingNodes(Item parent, Item node) { + if (parent == null) { + return Collections.emptyList(); + } + List followingNodes = new ArrayList<>(); + List parentChildren = parent.children(); + int followingIndex = -1; + for (int i = 0; i < parentChildren.size(); ++i) { + if (parentChildren.get(i).equals(node)) { + followingIndex = i + 1; + } + } + for (int i = followingIndex; i > 0 && i < parentChildren.size(); ++i) { + followingNodes.addAll(getDescendants(parentChildren.get(i))); + } + followingNodes.addAll(getFollowingNodes(parent.parent(), parent)); + return followingNodes; + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java new file mode 100644 index 000000000..27306ede7 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java @@ -0,0 +1,49 @@ +package org.rumbledb.runtime.xml.axis.forward; + +import org.rumbledb.api.Item; +import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.UnexpectedNodeException; +import org.rumbledb.runtime.xml.axis.AxisIterator; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class FollowingSiblingAxisIterator extends AxisIterator { + public FollowingSiblingAxisIterator(RuntimeStaticContext staticContext) { + super(staticContext); + } + + @Override + protected void setNextResult() { + if (this.results == null) { + List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() + .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); + if (currentContext.isEmpty()) { + throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); + } + Item node = currentContext.get(0); + this.results = getFollowingSiblings(node); + } + storeNextResult(); + } + + private List getFollowingSiblings(Item node) { + if (node.parent().isNull()) { + return Collections.emptyList(); + } + List result = new ArrayList<>(); + List parentChildren = node.parent().children(); + int siblingsStartIndex = 0; + for (int i = 0; i < parentChildren.size(); ++i) { + if (parentChildren.get(i).equals(node)) { + siblingsStartIndex = i + 1; + } + } + for (int i = siblingsStartIndex; i > 0 && i < parentChildren.size(); ++i) { + result.add(parentChildren.get(i)); + } + return result; + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java new file mode 100644 index 000000000..a41edd955 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java @@ -0,0 +1,30 @@ +package org.rumbledb.runtime.xml.axis.forward; + +import org.rumbledb.api.Item; +import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.UnexpectedNodeException; +import org.rumbledb.runtime.xml.axis.AxisIterator; + +import java.util.Collections; +import java.util.List; + +public class SelfAxisIterator extends AxisIterator { + public SelfAxisIterator(RuntimeStaticContext staticContext) { + super(staticContext); + } + + @Override + protected void setNextResult() { + if (this.results == null) { + List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() + .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); + if (currentContext.isEmpty()) { + throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); + } + Item node = currentContext.get(0); + this.results = Collections.singletonList(node); + } + storeNextResult(); + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java new file mode 100644 index 000000000..5d7ef9796 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java @@ -0,0 +1,29 @@ +package org.rumbledb.runtime.xml.axis.reverse; + +import org.rumbledb.api.Item; +import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.UnexpectedNodeException; +import org.rumbledb.runtime.xml.axis.AxisIterator; + +import java.util.List; + +public class AncestorAxisIterator extends AxisIterator { + public AncestorAxisIterator(RuntimeStaticContext staticContext) { + super(staticContext); + } + + @Override + protected void setNextResult() { + if (this.results == null) { + List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() + .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); + if (currentContext.isEmpty()) { + throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); + } + Item node = currentContext.get(0); + this.results = getAncestors(node); + } + storeNextResult(); + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java new file mode 100644 index 000000000..c970a29c0 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java @@ -0,0 +1,32 @@ +package org.rumbledb.runtime.xml.axis.reverse; + +import org.rumbledb.api.Item; +import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.UnexpectedNodeException; +import org.rumbledb.runtime.xml.axis.AxisIterator; + +import java.util.ArrayList; +import java.util.List; + +public class AncestorOrSelfAxisIterator extends AxisIterator { + public AncestorOrSelfAxisIterator(RuntimeStaticContext staticContext) { + super(staticContext); + } + + @Override + protected void setNextResult() { + if (this.results == null) { + List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() + .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); + if (currentContext.isEmpty()) { + throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); + } + Item node = currentContext.get(0); + this.results = new ArrayList<>(); + this.results.add(node); + this.results.addAll(getAncestors(node)); + } + storeNextResult(); + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java new file mode 100644 index 000000000..207e1c0e0 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java @@ -0,0 +1,30 @@ +package org.rumbledb.runtime.xml.axis.reverse; + +import org.rumbledb.api.Item; +import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.UnexpectedNodeException; +import org.rumbledb.runtime.xml.axis.AxisIterator; + +import java.util.Collections; +import java.util.List; + +public class ParentAxisIterator extends AxisIterator { + public ParentAxisIterator(RuntimeStaticContext staticContext) { + super(staticContext); + } + + @Override + protected void setNextResult() { + if (this.results == null) { + List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() + .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); + if (currentContext.isEmpty()) { + throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); + } + Item node = currentContext.get(0); + this.results = Collections.singletonList(node.parent()); + } + storeNextResult(); + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java new file mode 100644 index 000000000..8296636bd --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java @@ -0,0 +1,55 @@ +package org.rumbledb.runtime.xml.axis.reverse; + +import org.rumbledb.api.Item; +import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.UnexpectedNodeException; +import org.rumbledb.runtime.xml.axis.AxisIterator; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class PrecedingAxisIterator extends AxisIterator { + public PrecedingAxisIterator(RuntimeStaticContext staticContext) { + super(staticContext); + } + + + @Override + protected void setNextResult() { + if (this.results == null) { + List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() + .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); + if (currentContext.isEmpty()) { + throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); + } + Item node = currentContext.get(0); + this.results = getPrecedingNode(node.parent(), node); + } + storeNextResult(); + } + + /* + * Method adds the rest of the parent's descendants preceding the current node. Afterward, it visits the parent's + * parent and adds its descendants preceding the parent. + */ + private List getPrecedingNode(Item parent, Item node) { + if (parent == null) { + return Collections.emptyList(); + } + List precedingNodes = new ArrayList<>(); + List parentChildren = parent.children(); + int nodeIndex = parentChildren.size(); + for (int i = 0; i < parentChildren.size(); ++i) { + if (parentChildren.get(i).equals(node)) { + nodeIndex = i; + } + } + for (int i = 0; i < nodeIndex; ++i) { + precedingNodes.addAll(getDescendants(parentChildren.get(i))); + } + precedingNodes.addAll(getPrecedingNode(parent.parent(), parent)); + return precedingNodes; + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java new file mode 100644 index 000000000..5fee97aef --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java @@ -0,0 +1,49 @@ +package org.rumbledb.runtime.xml.axis.reverse; + +import org.rumbledb.api.Item; +import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.UnexpectedNodeException; +import org.rumbledb.runtime.xml.axis.AxisIterator; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class PrecedingSiblingAxisIterator extends AxisIterator { + public PrecedingSiblingAxisIterator(RuntimeStaticContext staticContext) { + super(staticContext); + } + + @Override + protected void setNextResult() { + if (this.results == null) { + List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() + .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); + if (currentContext.isEmpty()) { + throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); + } + Item node = currentContext.get(0); + this.results = getPrecedingSibling(node); + } + storeNextResult(); + } + + private List getPrecedingSibling(Item node) { + if (node.parent().isNull()) { + return Collections.emptyList(); + } + List result = new ArrayList<>(); + List parentChildren = node.parent().children(); + int siblingsEndIndex = 0; + for (int i = 0; i < parentChildren.size(); ++i) { + if (parentChildren.get(i).equals(node)) { + siblingsEndIndex = i; + } + } + for (int i = 0; i < siblingsEndIndex; ++i) { + result.add(parentChildren.get(i)); + } + return result; + } +} From 81f20c075b94993b4da3d734f0e33820f3042f5d Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Mon, 29 Jul 2024 15:00:40 +0200 Subject: [PATCH 45/56] Fixed XML reader --- .../rumbledb/expressions/xml/axis/NoStep.java | 15 + src/main/java/org/rumbledb/parser/Jsoniq.g4 | 2 +- .../java/org/rumbledb/parser/Jsoniq.interp | 2 +- .../org/rumbledb/parser/JsoniqParser.java | 974 +++++++++--------- .../functions/io/XmlDocFunctionIterator.java | 2 +- src/test/java/iq/ReadXMLTests.java | 7 +- 6 files changed, 522 insertions(+), 480 deletions(-) diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/NoStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/NoStep.java index eb5f80aec..d2575747c 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/NoStep.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/NoStep.java @@ -1,9 +1,24 @@ package org.rumbledb.expressions.xml.axis; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.expressions.xml.node_test.NodeTest; +import org.rumbledb.runtime.xml.axis.AxisIterator; +import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor; + public class NoStep implements Step { @Override public String toString() { return ""; } + + @Override + public AxisIterator accept(AxisIteratorVisitor visitor, RuntimeStaticContext staticContext) { + return null; + } + + @Override + public NodeTest getNodeTest() { + return null; + } } diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.g4 b/src/main/java/org/rumbledb/parser/Jsoniq.g4 index 29b9ec835..a82add5ba 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.g4 +++ b/src/main/java/org/rumbledb/parser/Jsoniq.g4 @@ -365,7 +365,7 @@ forwardAxis: ( Kchild | Kfollowing_sibling | Kfollowing ) ':' ':' ; -abbrevForwardStep: Kat_symbol nodeTest ; +abbrevForwardStep: Kat_symbol? nodeTest ; reverseStep: (reverseAxis nodeTest) | abbrevReverseStep ; diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.interp b/src/main/java/org/rumbledb/parser/Jsoniq.interp index c467abd2d..32c5d571a 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.interp +++ b/src/main/java/org/rumbledb/parser/Jsoniq.interp @@ -523,4 +523,4 @@ keyWords atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 178, 1601, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 337, 10, 3, 3, 3, 3, 3, 5, 3, 341, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 357, 10, 6, 3, 6, 3, 6, 7, 6, 361, 10, 6, 12, 6, 14, 6, 364, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 369, 10, 6, 12, 6, 14, 6, 372, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 377, 10, 8, 12, 8, 14, 8, 380, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 387, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 402, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 432, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 440, 10, 18, 12, 18, 14, 18, 443, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 462, 10, 20, 13, 20, 14, 20, 463, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 472, 10, 21, 13, 21, 14, 21, 473, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 482, 10, 22, 13, 22, 14, 22, 483, 3, 23, 3, 23, 3, 23, 5, 23, 489, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 494, 10, 23, 7, 23, 496, 10, 23, 12, 23, 14, 23, 499, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 508, 10, 24, 13, 24, 14, 24, 509, 3, 24, 3, 24, 5, 24, 514, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 523, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 528, 10, 25, 12, 25, 14, 25, 531, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 542, 10, 26, 12, 26, 14, 26, 545, 11, 26, 3, 26, 5, 26, 548, 10, 26, 3, 27, 7, 27, 551, 10, 27, 12, 27, 14, 27, 554, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 561, 10, 28, 12, 28, 14, 28, 564, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 571, 10, 29, 3, 29, 3, 29, 5, 29, 575, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 587, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 599, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 621, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 627, 10, 37, 12, 37, 14, 37, 630, 11, 37, 3, 38, 3, 38, 5, 38, 634, 10, 38, 3, 38, 5, 38, 637, 10, 38, 3, 38, 3, 38, 5, 38, 641, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 650, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 657, 10, 40, 12, 40, 14, 40, 660, 11, 40, 5, 40, 662, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 670, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 677, 10, 41, 5, 41, 679, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 686, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 693, 10, 42, 5, 42, 695, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 703, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 708, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 715, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 722, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 732, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 737, 10, 46, 12, 46, 14, 46, 740, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 746, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 751, 10, 48, 12, 48, 14, 48, 754, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 762, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 772, 10, 50, 3, 51, 3, 51, 5, 51, 776, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 784, 10, 51, 12, 51, 14, 51, 787, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 796, 10, 52, 12, 52, 14, 52, 799, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 804, 10, 53, 3, 53, 3, 53, 5, 53, 808, 10, 53, 3, 53, 3, 53, 5, 53, 812, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 821, 10, 54, 12, 54, 14, 54, 824, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 829, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 842, 10, 57, 12, 57, 14, 57, 845, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 850, 10, 58, 3, 58, 3, 58, 5, 58, 854, 10, 58, 3, 58, 3, 58, 5, 58, 858, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 865, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 870, 10, 59, 12, 59, 14, 59, 873, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 878, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 883, 10, 60, 5, 60, 885, 10, 60, 3, 60, 3, 60, 5, 60, 889, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 896, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 901, 10, 62, 12, 62, 14, 62, 904, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 912, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 922, 10, 64, 13, 64, 14, 64, 923, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 932, 10, 65, 13, 65, 14, 65, 933, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 944, 10, 66, 13, 66, 14, 66, 945, 3, 66, 3, 66, 5, 66, 950, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 959, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 964, 10, 67, 12, 67, 14, 67, 967, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 986, 10, 69, 13, 69, 14, 69, 987, 3, 70, 3, 70, 3, 70, 5, 70, 993, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 998, 10, 70, 7, 70, 1000, 10, 70, 12, 70, 14, 70, 1003, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 1012, 10, 71, 12, 71, 14, 71, 1015, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 1020, 10, 72, 12, 72, 14, 72, 1023, 11, 72, 3, 73, 5, 73, 1026, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 1033, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 1038, 10, 75, 12, 75, 14, 75, 1041, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 1046, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 1051, 10, 77, 12, 77, 14, 77, 1054, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 1059, 10, 78, 12, 78, 14, 78, 1062, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 1068, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1074, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1080, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1086, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1092, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1101, 10, 84, 12, 84, 14, 84, 1104, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1109, 10, 85, 3, 86, 7, 86, 1112, 10, 86, 12, 86, 14, 86, 1115, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1122, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1141, 10, 90, 12, 90, 14, 90, 1144, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1152, 10, 91, 12, 91, 14, 91, 1155, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1177, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1194, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1205, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1227, 10, 104, 7, 104, 1229, 10, 104, 12, 104, 14, 104, 1232, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1238, 10, 105, 3, 106, 3, 106, 5, 106, 1242, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1252, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1257, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1271, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1278, 10, 109, 12, 109, 14, 109, 1281, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1286, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1310, 10, 113, 12, 113, 14, 113, 1313, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1329, 10, 115, 13, 115, 14, 115, 1330, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 5, 117, 1339, 10, 117, 3, 117, 3, 117, 3, 117, 5, 117, 1344, 10, 117, 3, 118, 3, 118, 3, 118, 7, 118, 1349, 10, 118, 12, 118, 14, 118, 1352, 11, 118, 3, 119, 3, 119, 5, 119, 1356, 10, 119, 3, 120, 3, 120, 5, 120, 1360, 10, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 5, 121, 1368, 10, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 5, 124, 1381, 10, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 127, 3, 127, 5, 127, 1391, 10, 127, 3, 128, 3, 128, 5, 128, 1395, 10, 128, 3, 129, 3, 129, 3, 129, 5, 129, 1400, 10, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 7, 132, 1411, 10, 132, 12, 132, 14, 132, 1414, 11, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 5, 133, 1427, 10, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 5, 136, 1441, 10, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 5, 140, 1461, 10, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 5, 141, 1470, 10, 141, 5, 141, 1472, 10, 141, 3, 141, 3, 141, 3, 142, 3, 142, 5, 142, 1478, 10, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 5, 145, 1493, 10, 145, 5, 145, 1495, 10, 145, 5, 145, 1497, 10, 145, 3, 145, 3, 145, 3, 146, 3, 146, 5, 146, 1503, 10, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 149, 3, 149, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 5, 153, 1526, 10, 153, 5, 153, 1528, 10, 153, 3, 154, 3, 154, 3, 154, 3, 154, 7, 154, 1534, 10, 154, 12, 154, 14, 154, 1537, 11, 154, 5, 154, 1539, 10, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 5, 154, 1546, 10, 154, 3, 155, 3, 155, 3, 155, 5, 155, 1551, 10, 155, 3, 156, 3, 156, 5, 156, 1555, 10, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 7, 158, 1567, 10, 158, 12, 158, 14, 158, 1570, 11, 158, 5, 158, 1572, 10, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 5, 159, 1580, 10, 159, 3, 160, 3, 160, 5, 160, 1584, 10, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 5, 161, 1591, 10, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 2, 2, 165, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 2, 13, 4, 2, 17, 17, 105, 105, 3, 2, 82, 83, 3, 2, 20, 29, 4, 2, 5, 5, 35, 45, 3, 2, 47, 48, 4, 2, 12, 12, 49, 51, 3, 2, 131, 132, 3, 2, 134, 140, 3, 2, 141, 145, 4, 2, 19, 19, 168, 168, 5, 2, 61, 126, 161, 166, 169, 169, 2, 1664, 2, 328, 3, 2, 2, 2, 4, 336, 3, 2, 2, 2, 6, 342, 3, 2, 2, 2, 8, 345, 3, 2, 2, 2, 10, 362, 3, 2, 2, 2, 12, 373, 3, 2, 2, 2, 14, 378, 3, 2, 2, 2, 16, 381, 3, 2, 2, 2, 18, 384, 3, 2, 2, 2, 20, 401, 3, 2, 2, 2, 22, 403, 3, 2, 2, 2, 24, 406, 3, 2, 2, 2, 26, 412, 3, 2, 2, 2, 28, 416, 3, 2, 2, 2, 30, 420, 3, 2, 2, 2, 32, 424, 3, 2, 2, 2, 34, 431, 3, 2, 2, 2, 36, 447, 3, 2, 2, 2, 38, 456, 3, 2, 2, 2, 40, 471, 3, 2, 2, 2, 42, 478, 3, 2, 2, 2, 44, 485, 3, 2, 2, 2, 46, 502, 3, 2, 2, 2, 48, 518, 3, 2, 2, 2, 50, 535, 3, 2, 2, 2, 52, 552, 3, 2, 2, 2, 54, 555, 3, 2, 2, 2, 56, 567, 3, 2, 2, 2, 58, 576, 3, 2, 2, 2, 60, 586, 3, 2, 2, 2, 62, 588, 3, 2, 2, 2, 64, 598, 3, 2, 2, 2, 66, 600, 3, 2, 2, 2, 68, 605, 3, 2, 2, 2, 70, 609, 3, 2, 2, 2, 72, 615, 3, 2, 2, 2, 74, 636, 3, 2, 2, 2, 76, 642, 3, 2, 2, 2, 78, 644, 3, 2, 2, 2, 80, 663, 3, 2, 2, 2, 82, 680, 3, 2, 2, 2, 84, 696, 3, 2, 2, 2, 86, 716, 3, 2, 2, 2, 88, 731, 3, 2, 2, 2, 90, 733, 3, 2, 2, 2, 92, 741, 3, 2, 2, 2, 94, 747, 3, 2, 2, 2, 96, 761, 3, 2, 2, 2, 98, 771, 3, 2, 2, 2, 100, 775, 3, 2, 2, 2, 102, 791, 3, 2, 2, 2, 104, 800, 3, 2, 2, 2, 106, 816, 3, 2, 2, 2, 108, 825, 3, 2, 2, 2, 110, 833, 3, 2, 2, 2, 112, 836, 3, 2, 2, 2, 114, 846, 3, 2, 2, 2, 116, 864, 3, 2, 2, 2, 118, 874, 3, 2, 2, 2, 120, 890, 3, 2, 2, 2, 122, 895, 3, 2, 2, 2, 124, 908, 3, 2, 2, 2, 126, 916, 3, 2, 2, 2, 128, 931, 3, 2, 2, 2, 130, 938, 3, 2, 2, 2, 132, 954, 3, 2, 2, 2, 134, 971, 3, 2, 2, 2, 136, 980, 3, 2, 2, 2, 138, 989, 3, 2, 2, 2, 140, 1008, 3, 2, 2, 2, 142, 1016, 3, 2, 2, 2, 144, 1025, 3, 2, 2, 2, 146, 1029, 3, 2, 2, 2, 148, 1034, 3, 2, 2, 2, 150, 1042, 3, 2, 2, 2, 152, 1047, 3, 2, 2, 2, 154, 1055, 3, 2, 2, 2, 156, 1063, 3, 2, 2, 2, 158, 1069, 3, 2, 2, 2, 160, 1075, 3, 2, 2, 2, 162, 1081, 3, 2, 2, 2, 164, 1087, 3, 2, 2, 2, 166, 1093, 3, 2, 2, 2, 168, 1108, 3, 2, 2, 2, 170, 1113, 3, 2, 2, 2, 172, 1121, 3, 2, 2, 2, 174, 1123, 3, 2, 2, 2, 176, 1130, 3, 2, 2, 2, 178, 1137, 3, 2, 2, 2, 180, 1145, 3, 2, 2, 2, 182, 1156, 3, 2, 2, 2, 184, 1162, 3, 2, 2, 2, 186, 1165, 3, 2, 2, 2, 188, 1169, 3, 2, 2, 2, 190, 1193, 3, 2, 2, 2, 192, 1195, 3, 2, 2, 2, 194, 1199, 3, 2, 2, 2, 196, 1202, 3, 2, 2, 2, 198, 1208, 3, 2, 2, 2, 200, 1210, 3, 2, 2, 2, 202, 1215, 3, 2, 2, 2, 204, 1220, 3, 2, 2, 2, 206, 1223, 3, 2, 2, 2, 208, 1237, 3, 2, 2, 2, 210, 1241, 3, 2, 2, 2, 212, 1243, 3, 2, 2, 2, 214, 1247, 3, 2, 2, 2, 216, 1285, 3, 2, 2, 2, 218, 1287, 3, 2, 2, 2, 220, 1291, 3, 2, 2, 2, 222, 1297, 3, 2, 2, 2, 224, 1305, 3, 2, 2, 2, 226, 1319, 3, 2, 2, 2, 228, 1325, 3, 2, 2, 2, 230, 1332, 3, 2, 2, 2, 232, 1343, 3, 2, 2, 2, 234, 1345, 3, 2, 2, 2, 236, 1355, 3, 2, 2, 2, 238, 1359, 3, 2, 2, 2, 240, 1367, 3, 2, 2, 2, 242, 1369, 3, 2, 2, 2, 244, 1373, 3, 2, 2, 2, 246, 1380, 3, 2, 2, 2, 248, 1382, 3, 2, 2, 2, 250, 1386, 3, 2, 2, 2, 252, 1390, 3, 2, 2, 2, 254, 1394, 3, 2, 2, 2, 256, 1399, 3, 2, 2, 2, 258, 1401, 3, 2, 2, 2, 260, 1405, 3, 2, 2, 2, 262, 1412, 3, 2, 2, 2, 264, 1426, 3, 2, 2, 2, 266, 1428, 3, 2, 2, 2, 268, 1432, 3, 2, 2, 2, 270, 1436, 3, 2, 2, 2, 272, 1444, 3, 2, 2, 2, 274, 1448, 3, 2, 2, 2, 276, 1452, 3, 2, 2, 2, 278, 1456, 3, 2, 2, 2, 280, 1464, 3, 2, 2, 2, 282, 1477, 3, 2, 2, 2, 284, 1479, 3, 2, 2, 2, 286, 1484, 3, 2, 2, 2, 288, 1486, 3, 2, 2, 2, 290, 1502, 3, 2, 2, 2, 292, 1504, 3, 2, 2, 2, 294, 1509, 3, 2, 2, 2, 296, 1511, 3, 2, 2, 2, 298, 1513, 3, 2, 2, 2, 300, 1515, 3, 2, 2, 2, 302, 1517, 3, 2, 2, 2, 304, 1527, 3, 2, 2, 2, 306, 1545, 3, 2, 2, 2, 308, 1550, 3, 2, 2, 2, 310, 1554, 3, 2, 2, 2, 312, 1556, 3, 2, 2, 2, 314, 1561, 3, 2, 2, 2, 316, 1577, 3, 2, 2, 2, 318, 1583, 3, 2, 2, 2, 320, 1588, 3, 2, 2, 2, 322, 1594, 3, 2, 2, 2, 324, 1596, 3, 2, 2, 2, 326, 1598, 3, 2, 2, 2, 328, 329, 5, 4, 3, 2, 329, 330, 7, 2, 2, 3, 330, 3, 3, 2, 2, 2, 331, 332, 7, 104, 2, 2, 332, 333, 7, 103, 2, 2, 333, 334, 5, 324, 163, 2, 334, 335, 7, 3, 2, 2, 335, 337, 3, 2, 2, 2, 336, 331, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 341, 5, 8, 5, 2, 339, 341, 5, 6, 4, 2, 340, 338, 3, 2, 2, 2, 340, 339, 3, 2, 2, 2, 341, 5, 3, 2, 2, 2, 342, 343, 5, 10, 6, 2, 343, 344, 5, 12, 7, 2, 344, 7, 3, 2, 2, 2, 345, 346, 7, 4, 2, 2, 346, 347, 7, 129, 2, 2, 347, 348, 7, 176, 2, 2, 348, 349, 7, 5, 2, 2, 349, 350, 5, 322, 162, 2, 350, 351, 7, 3, 2, 2, 351, 352, 5, 10, 6, 2, 352, 9, 3, 2, 2, 2, 353, 357, 5, 60, 31, 2, 354, 357, 5, 62, 32, 2, 355, 357, 5, 78, 40, 2, 356, 353, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 355, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 359, 7, 3, 2, 2, 359, 361, 3, 2, 2, 2, 360, 356, 3, 2, 2, 2, 361, 364, 3, 2, 2, 2, 362, 360, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 370, 3, 2, 2, 2, 364, 362, 3, 2, 2, 2, 365, 366, 5, 64, 33, 2, 366, 367, 7, 3, 2, 2, 367, 369, 3, 2, 2, 2, 368, 365, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 368, 3, 2, 2, 2, 370, 371, 3, 2, 2, 2, 371, 11, 3, 2, 2, 2, 372, 370, 3, 2, 2, 2, 373, 374, 5, 18, 10, 2, 374, 13, 3, 2, 2, 2, 375, 377, 5, 20, 11, 2, 376, 375, 3, 2, 2, 2, 377, 380, 3, 2, 2, 2, 378, 376, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 15, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 381, 382, 5, 14, 8, 2, 382, 383, 5, 94, 48, 2, 383, 17, 3, 2, 2, 2, 384, 386, 5, 14, 8, 2, 385, 387, 5, 94, 48, 2, 386, 385, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 19, 3, 2, 2, 2, 388, 402, 5, 22, 12, 2, 389, 402, 5, 24, 13, 2, 390, 402, 5, 26, 14, 2, 391, 402, 5, 28, 15, 2, 392, 402, 5, 30, 16, 2, 393, 402, 5, 32, 17, 2, 394, 402, 5, 34, 18, 2, 395, 402, 5, 36, 19, 2, 396, 402, 5, 38, 20, 2, 397, 402, 5, 42, 22, 2, 398, 402, 5, 46, 24, 2, 399, 402, 5, 54, 28, 2, 400, 402, 5, 58, 30, 2, 401, 388, 3, 2, 2, 2, 401, 389, 3, 2, 2, 2, 401, 390, 3, 2, 2, 2, 401, 391, 3, 2, 2, 2, 401, 392, 3, 2, 2, 2, 401, 393, 3, 2, 2, 2, 401, 394, 3, 2, 2, 2, 401, 395, 3, 2, 2, 2, 401, 396, 3, 2, 2, 2, 401, 397, 3, 2, 2, 2, 401, 398, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 401, 400, 3, 2, 2, 2, 402, 21, 3, 2, 2, 2, 403, 404, 5, 98, 50, 2, 404, 405, 7, 3, 2, 2, 405, 23, 3, 2, 2, 2, 406, 407, 7, 6, 2, 2, 407, 408, 5, 74, 38, 2, 408, 409, 7, 7, 2, 2, 409, 410, 5, 96, 49, 2, 410, 411, 7, 3, 2, 2, 411, 25, 3, 2, 2, 2, 412, 413, 7, 8, 2, 2, 413, 414, 5, 14, 8, 2, 414, 415, 7, 9, 2, 2, 415, 27, 3, 2, 2, 2, 416, 417, 7, 161, 2, 2, 417, 418, 7, 162, 2, 2, 418, 419, 7, 3, 2, 2, 419, 29, 3, 2, 2, 2, 420, 421, 7, 163, 2, 2, 421, 422, 7, 162, 2, 2, 422, 423, 7, 3, 2, 2, 423, 31, 3, 2, 2, 2, 424, 425, 7, 164, 2, 2, 425, 426, 7, 165, 2, 2, 426, 427, 5, 96, 49, 2, 427, 428, 7, 3, 2, 2, 428, 33, 3, 2, 2, 2, 429, 432, 5, 102, 52, 2, 430, 432, 5, 106, 54, 2, 431, 429, 3, 2, 2, 2, 431, 430, 3, 2, 2, 2, 432, 441, 3, 2, 2, 2, 433, 440, 5, 102, 52, 2, 434, 440, 5, 106, 54, 2, 435, 440, 5, 110, 56, 2, 436, 440, 5, 112, 57, 2, 437, 440, 5, 116, 59, 2, 438, 440, 5, 120, 61, 2, 439, 433, 3, 2, 2, 2, 439, 434, 3, 2, 2, 2, 439, 435, 3, 2, 2, 2, 439, 436, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 438, 3, 2, 2, 2, 440, 443, 3, 2, 2, 2, 441, 439, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 444, 3, 2, 2, 2, 443, 441, 3, 2, 2, 2, 444, 445, 7, 67, 2, 2, 445, 446, 5, 20, 11, 2, 446, 35, 3, 2, 2, 2, 447, 448, 7, 68, 2, 2, 448, 449, 7, 10, 2, 2, 449, 450, 5, 94, 48, 2, 450, 451, 7, 11, 2, 2, 451, 452, 7, 89, 2, 2, 452, 453, 5, 20, 11, 2, 453, 454, 7, 90, 2, 2, 454, 455, 5, 20, 11, 2, 455, 37, 3, 2, 2, 2, 456, 457, 7, 84, 2, 2, 457, 458, 7, 10, 2, 2, 458, 459, 5, 94, 48, 2, 459, 461, 7, 11, 2, 2, 460, 462, 5, 40, 21, 2, 461, 460, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 461, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 88, 2, 2, 466, 467, 7, 67, 2, 2, 467, 468, 5, 20, 11, 2, 468, 39, 3, 2, 2, 2, 469, 470, 7, 85, 2, 2, 470, 472, 5, 96, 49, 2, 471, 469, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 7, 67, 2, 2, 476, 477, 5, 20, 11, 2, 477, 41, 3, 2, 2, 2, 478, 479, 7, 86, 2, 2, 479, 481, 5, 26, 14, 2, 480, 482, 5, 44, 23, 2, 481, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 43, 3, 2, 2, 2, 485, 488, 7, 87, 2, 2, 486, 489, 7, 12, 2, 2, 487, 489, 5, 74, 38, 2, 488, 486, 3, 2, 2, 2, 488, 487, 3, 2, 2, 2, 489, 497, 3, 2, 2, 2, 490, 493, 7, 13, 2, 2, 491, 494, 7, 12, 2, 2, 492, 494, 5, 74, 38, 2, 493, 491, 3, 2, 2, 2, 493, 492, 3, 2, 2, 2, 494, 496, 3, 2, 2, 2, 495, 490, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 500, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 500, 501, 5, 26, 14, 2, 501, 45, 3, 2, 2, 2, 502, 503, 7, 91, 2, 2, 503, 504, 7, 10, 2, 2, 504, 505, 5, 94, 48, 2, 505, 507, 7, 11, 2, 2, 506, 508, 5, 48, 25, 2, 507, 506, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 507, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 513, 7, 88, 2, 2, 512, 514, 5, 194, 98, 2, 513, 512, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 7, 67, 2, 2, 516, 517, 5, 20, 11, 2, 517, 47, 3, 2, 2, 2, 518, 522, 7, 85, 2, 2, 519, 520, 5, 194, 98, 2, 520, 521, 7, 70, 2, 2, 521, 523, 3, 2, 2, 2, 522, 519, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 524, 3, 2, 2, 2, 524, 529, 5, 304, 153, 2, 525, 526, 7, 13, 2, 2, 526, 528, 5, 304, 153, 2, 527, 525, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 532, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 533, 7, 67, 2, 2, 533, 534, 5, 20, 11, 2, 534, 49, 3, 2, 2, 2, 535, 536, 7, 14, 2, 2, 536, 547, 5, 74, 38, 2, 537, 538, 7, 10, 2, 2, 538, 543, 7, 170, 2, 2, 539, 540, 7, 15, 2, 2, 540, 542, 7, 170, 2, 2, 541, 539, 3, 2, 2, 2, 542, 545, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 546, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 546, 548, 7, 11, 2, 2, 547, 537, 3, 2, 2, 2, 547, 548, 3, 2, 2, 2, 548, 51, 3, 2, 2, 2, 549, 551, 5, 50, 26, 2, 550, 549, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 53, 3, 2, 2, 2, 554, 552, 3, 2, 2, 2, 555, 556, 5, 52, 27, 2, 556, 557, 7, 114, 2, 2, 557, 562, 5, 56, 29, 2, 558, 559, 7, 15, 2, 2, 559, 561, 5, 56, 29, 2, 560, 558, 3, 2, 2, 2, 561, 564, 3, 2, 2, 2, 562, 560, 3, 2, 2, 2, 562, 563, 3, 2, 2, 2, 563, 565, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 565, 566, 7, 3, 2, 2, 566, 55, 3, 2, 2, 2, 567, 570, 5, 194, 98, 2, 568, 569, 7, 70, 2, 2, 569, 571, 5, 304, 153, 2, 570, 568, 3, 2, 2, 2, 570, 571, 3, 2, 2, 2, 571, 574, 3, 2, 2, 2, 572, 573, 7, 7, 2, 2, 573, 575, 5, 96, 49, 2, 574, 572, 3, 2, 2, 2, 574, 575, 3, 2, 2, 2, 575, 57, 3, 2, 2, 2, 576, 577, 7, 166, 2, 2, 577, 578, 7, 10, 2, 2, 578, 579, 5, 94, 48, 2, 579, 580, 7, 11, 2, 2, 580, 581, 5, 20, 11, 2, 581, 59, 3, 2, 2, 2, 582, 587, 5, 66, 34, 2, 583, 587, 5, 68, 35, 2, 584, 587, 5, 70, 36, 2, 585, 587, 5, 72, 37, 2, 586, 582, 3, 2, 2, 2, 586, 583, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 586, 585, 3, 2, 2, 2, 587, 61, 3, 2, 2, 2, 588, 589, 7, 111, 2, 2, 589, 590, 7, 129, 2, 2, 590, 591, 7, 176, 2, 2, 591, 592, 7, 5, 2, 2, 592, 593, 5, 322, 162, 2, 593, 63, 3, 2, 2, 2, 594, 599, 5, 84, 43, 2, 595, 599, 5, 80, 41, 2, 596, 599, 5, 86, 44, 2, 597, 599, 5, 82, 42, 2, 598, 594, 3, 2, 2, 2, 598, 595, 3, 2, 2, 2, 598, 596, 3, 2, 2, 2, 598, 597, 3, 2, 2, 2, 599, 65, 3, 2, 2, 2, 600, 601, 7, 111, 2, 2, 601, 602, 7, 88, 2, 2, 602, 603, 7, 81, 2, 2, 603, 604, 5, 322, 162, 2, 604, 67, 3, 2, 2, 2, 605, 606, 7, 111, 2, 2, 606, 607, 7, 16, 2, 2, 607, 608, 9, 2, 2, 2, 608, 69, 3, 2, 2, 2, 609, 610, 7, 111, 2, 2, 610, 611, 7, 88, 2, 2, 611, 612, 7, 66, 2, 2, 612, 613, 7, 73, 2, 2, 613, 614, 9, 3, 2, 2, 614, 71, 3, 2, 2, 2, 615, 620, 7, 111, 2, 2, 616, 617, 7, 18, 2, 2, 617, 621, 5, 74, 38, 2, 618, 619, 7, 88, 2, 2, 619, 621, 7, 18, 2, 2, 620, 616, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 621, 628, 3, 2, 2, 2, 622, 623, 5, 76, 39, 2, 623, 624, 7, 5, 2, 2, 624, 625, 5, 324, 163, 2, 625, 627, 3, 2, 2, 2, 626, 622, 3, 2, 2, 2, 627, 630, 3, 2, 2, 2, 628, 626, 3, 2, 2, 2, 628, 629, 3, 2, 2, 2, 629, 73, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 631, 634, 7, 176, 2, 2, 632, 634, 5, 326, 164, 2, 633, 631, 3, 2, 2, 2, 633, 632, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 637, 7, 19, 2, 2, 636, 633, 3, 2, 2, 2, 636, 637, 3, 2, 2, 2, 637, 640, 3, 2, 2, 2, 638, 641, 7, 176, 2, 2, 639, 641, 5, 326, 164, 2, 640, 638, 3, 2, 2, 2, 640, 639, 3, 2, 2, 2, 641, 75, 3, 2, 2, 2, 642, 643, 9, 4, 2, 2, 643, 77, 3, 2, 2, 2, 644, 645, 7, 127, 2, 2, 645, 649, 7, 4, 2, 2, 646, 647, 7, 129, 2, 2, 647, 648, 7, 176, 2, 2, 648, 650, 7, 5, 2, 2, 649, 646, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 661, 5, 322, 162, 2, 652, 653, 7, 71, 2, 2, 653, 658, 5, 322, 162, 2, 654, 655, 7, 15, 2, 2, 655, 657, 5, 322, 162, 2, 656, 654, 3, 2, 2, 2, 657, 660, 3, 2, 2, 2, 658, 656, 3, 2, 2, 2, 658, 659, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 661, 652, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 79, 3, 2, 2, 2, 663, 664, 7, 111, 2, 2, 664, 665, 5, 52, 27, 2, 665, 666, 7, 114, 2, 2, 666, 669, 5, 194, 98, 2, 667, 668, 7, 70, 2, 2, 668, 670, 5, 304, 153, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 678, 3, 2, 2, 2, 671, 672, 7, 7, 2, 2, 672, 679, 5, 96, 49, 2, 673, 676, 7, 30, 2, 2, 674, 675, 7, 7, 2, 2, 675, 677, 5, 96, 49, 2, 676, 674, 3, 2, 2, 2, 676, 677, 3, 2, 2, 2, 677, 679, 3, 2, 2, 2, 678, 671, 3, 2, 2, 2, 678, 673, 3, 2, 2, 2, 679, 81, 3, 2, 2, 2, 680, 681, 7, 111, 2, 2, 681, 682, 7, 112, 2, 2, 682, 685, 7, 113, 2, 2, 683, 684, 7, 70, 2, 2, 684, 686, 5, 304, 153, 2, 685, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 694, 3, 2, 2, 2, 687, 688, 7, 7, 2, 2, 688, 695, 5, 96, 49, 2, 689, 692, 7, 30, 2, 2, 690, 691, 7, 7, 2, 2, 691, 693, 5, 96, 49, 2, 692, 690, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 695, 3, 2, 2, 2, 694, 687, 3, 2, 2, 2, 694, 689, 3, 2, 2, 2, 695, 83, 3, 2, 2, 2, 696, 697, 7, 111, 2, 2, 697, 698, 5, 52, 27, 2, 698, 699, 7, 31, 2, 2, 699, 700, 5, 74, 38, 2, 700, 702, 7, 10, 2, 2, 701, 703, 5, 90, 46, 2, 702, 701, 3, 2, 2, 2, 702, 703, 3, 2, 2, 2, 703, 704, 3, 2, 2, 2, 704, 707, 7, 11, 2, 2, 705, 706, 7, 70, 2, 2, 706, 708, 5, 304, 153, 2, 707, 705, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, 714, 3, 2, 2, 2, 709, 710, 7, 8, 2, 2, 710, 711, 5, 18, 10, 2, 711, 712, 7, 9, 2, 2, 712, 715, 3, 2, 2, 2, 713, 715, 7, 30, 2, 2, 714, 709, 3, 2, 2, 2, 714, 713, 3, 2, 2, 2, 715, 85, 3, 2, 2, 2, 716, 717, 7, 111, 2, 2, 717, 718, 7, 108, 2, 2, 718, 719, 5, 74, 38, 2, 719, 721, 7, 70, 2, 2, 720, 722, 5, 88, 45, 2, 721, 720, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 723, 3, 2, 2, 2, 723, 724, 5, 96, 49, 2, 724, 87, 3, 2, 2, 2, 725, 726, 7, 32, 2, 2, 726, 732, 7, 33, 2, 2, 727, 728, 7, 32, 2, 2, 728, 732, 7, 34, 2, 2, 729, 730, 7, 124, 2, 2, 730, 732, 7, 128, 2, 2, 731, 725, 3, 2, 2, 2, 731, 727, 3, 2, 2, 2, 731, 729, 3, 2, 2, 2, 732, 89, 3, 2, 2, 2, 733, 738, 5, 92, 47, 2, 734, 735, 7, 15, 2, 2, 735, 737, 5, 92, 47, 2, 736, 734, 3, 2, 2, 2, 737, 740, 3, 2, 2, 2, 738, 736, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 91, 3, 2, 2, 2, 740, 738, 3, 2, 2, 2, 741, 742, 7, 6, 2, 2, 742, 745, 5, 74, 38, 2, 743, 744, 7, 70, 2, 2, 744, 746, 5, 304, 153, 2, 745, 743, 3, 2, 2, 2, 745, 746, 3, 2, 2, 2, 746, 93, 3, 2, 2, 2, 747, 752, 5, 96, 49, 2, 748, 749, 7, 15, 2, 2, 749, 751, 5, 96, 49, 2, 750, 748, 3, 2, 2, 2, 751, 754, 3, 2, 2, 2, 752, 750, 3, 2, 2, 2, 752, 753, 3, 2, 2, 2, 753, 95, 3, 2, 2, 2, 754, 752, 3, 2, 2, 2, 755, 762, 5, 98, 50, 2, 756, 762, 5, 100, 51, 2, 757, 762, 5, 126, 64, 2, 758, 762, 5, 130, 66, 2, 759, 762, 5, 134, 68, 2, 760, 762, 5, 136, 69, 2, 761, 755, 3, 2, 2, 2, 761, 756, 3, 2, 2, 2, 761, 757, 3, 2, 2, 2, 761, 758, 3, 2, 2, 2, 761, 759, 3, 2, 2, 2, 761, 760, 3, 2, 2, 2, 762, 97, 3, 2, 2, 2, 763, 772, 5, 122, 62, 2, 764, 772, 5, 140, 71, 2, 765, 772, 5, 216, 109, 2, 766, 772, 5, 218, 110, 2, 767, 772, 5, 220, 111, 2, 768, 772, 5, 222, 112, 2, 769, 772, 5, 224, 113, 2, 770, 772, 5, 226, 114, 2, 771, 763, 3, 2, 2, 2, 771, 764, 3, 2, 2, 2, 771, 765, 3, 2, 2, 2, 771, 766, 3, 2, 2, 2, 771, 767, 3, 2, 2, 2, 771, 768, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 771, 770, 3, 2, 2, 2, 772, 99, 3, 2, 2, 2, 773, 776, 5, 102, 52, 2, 774, 776, 5, 106, 54, 2, 775, 773, 3, 2, 2, 2, 775, 774, 3, 2, 2, 2, 776, 785, 3, 2, 2, 2, 777, 784, 5, 102, 52, 2, 778, 784, 5, 106, 54, 2, 779, 784, 5, 110, 56, 2, 780, 784, 5, 112, 57, 2, 781, 784, 5, 116, 59, 2, 782, 784, 5, 120, 61, 2, 783, 777, 3, 2, 2, 2, 783, 778, 3, 2, 2, 2, 783, 779, 3, 2, 2, 2, 783, 780, 3, 2, 2, 2, 783, 781, 3, 2, 2, 2, 783, 782, 3, 2, 2, 2, 784, 787, 3, 2, 2, 2, 785, 783, 3, 2, 2, 2, 785, 786, 3, 2, 2, 2, 786, 788, 3, 2, 2, 2, 787, 785, 3, 2, 2, 2, 788, 789, 7, 67, 2, 2, 789, 790, 5, 96, 49, 2, 790, 101, 3, 2, 2, 2, 791, 792, 7, 61, 2, 2, 792, 797, 5, 104, 53, 2, 793, 794, 7, 15, 2, 2, 794, 796, 5, 104, 53, 2, 795, 793, 3, 2, 2, 2, 796, 799, 3, 2, 2, 2, 797, 795, 3, 2, 2, 2, 797, 798, 3, 2, 2, 2, 798, 103, 3, 2, 2, 2, 799, 797, 3, 2, 2, 2, 800, 803, 5, 194, 98, 2, 801, 802, 7, 70, 2, 2, 802, 804, 5, 304, 153, 2, 803, 801, 3, 2, 2, 2, 803, 804, 3, 2, 2, 2, 804, 807, 3, 2, 2, 2, 805, 806, 7, 72, 2, 2, 806, 808, 7, 73, 2, 2, 807, 805, 3, 2, 2, 2, 807, 808, 3, 2, 2, 2, 808, 811, 3, 2, 2, 2, 809, 810, 7, 71, 2, 2, 810, 812, 5, 194, 98, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 813, 3, 2, 2, 2, 813, 814, 7, 69, 2, 2, 814, 815, 5, 96, 49, 2, 815, 105, 3, 2, 2, 2, 816, 817, 7, 62, 2, 2, 817, 822, 5, 108, 55, 2, 818, 819, 7, 15, 2, 2, 819, 821, 5, 108, 55, 2, 820, 818, 3, 2, 2, 2, 821, 824, 3, 2, 2, 2, 822, 820, 3, 2, 2, 2, 822, 823, 3, 2, 2, 2, 823, 107, 3, 2, 2, 2, 824, 822, 3, 2, 2, 2, 825, 828, 5, 194, 98, 2, 826, 827, 7, 70, 2, 2, 827, 829, 5, 304, 153, 2, 828, 826, 3, 2, 2, 2, 828, 829, 3, 2, 2, 2, 829, 830, 3, 2, 2, 2, 830, 831, 7, 7, 2, 2, 831, 832, 5, 96, 49, 2, 832, 109, 3, 2, 2, 2, 833, 834, 7, 63, 2, 2, 834, 835, 5, 96, 49, 2, 835, 111, 3, 2, 2, 2, 836, 837, 7, 64, 2, 2, 837, 838, 7, 65, 2, 2, 838, 843, 5, 114, 58, 2, 839, 840, 7, 15, 2, 2, 840, 842, 5, 114, 58, 2, 841, 839, 3, 2, 2, 2, 842, 845, 3, 2, 2, 2, 843, 841, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 113, 3, 2, 2, 2, 845, 843, 3, 2, 2, 2, 846, 853, 5, 194, 98, 2, 847, 848, 7, 70, 2, 2, 848, 850, 5, 304, 153, 2, 849, 847, 3, 2, 2, 2, 849, 850, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 852, 7, 7, 2, 2, 852, 854, 5, 96, 49, 2, 853, 849, 3, 2, 2, 2, 853, 854, 3, 2, 2, 2, 854, 857, 3, 2, 2, 2, 855, 856, 7, 81, 2, 2, 856, 858, 5, 322, 162, 2, 857, 855, 3, 2, 2, 2, 857, 858, 3, 2, 2, 2, 858, 115, 3, 2, 2, 2, 859, 860, 7, 66, 2, 2, 860, 865, 7, 65, 2, 2, 861, 862, 7, 75, 2, 2, 862, 863, 7, 66, 2, 2, 863, 865, 7, 65, 2, 2, 864, 859, 3, 2, 2, 2, 864, 861, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 871, 5, 118, 60, 2, 867, 868, 7, 15, 2, 2, 868, 870, 5, 118, 60, 2, 869, 867, 3, 2, 2, 2, 870, 873, 3, 2, 2, 2, 871, 869, 3, 2, 2, 2, 871, 872, 3, 2, 2, 2, 872, 117, 3, 2, 2, 2, 873, 871, 3, 2, 2, 2, 874, 877, 5, 96, 49, 2, 875, 878, 7, 76, 2, 2, 876, 878, 7, 77, 2, 2, 877, 875, 3, 2, 2, 2, 877, 876, 3, 2, 2, 2, 877, 878, 3, 2, 2, 2, 878, 884, 3, 2, 2, 2, 879, 882, 7, 73, 2, 2, 880, 883, 7, 82, 2, 2, 881, 883, 7, 83, 2, 2, 882, 880, 3, 2, 2, 2, 882, 881, 3, 2, 2, 2, 883, 885, 3, 2, 2, 2, 884, 879, 3, 2, 2, 2, 884, 885, 3, 2, 2, 2, 885, 888, 3, 2, 2, 2, 886, 887, 7, 81, 2, 2, 887, 889, 5, 322, 162, 2, 888, 886, 3, 2, 2, 2, 888, 889, 3, 2, 2, 2, 889, 119, 3, 2, 2, 2, 890, 891, 7, 74, 2, 2, 891, 892, 5, 194, 98, 2, 892, 121, 3, 2, 2, 2, 893, 896, 7, 78, 2, 2, 894, 896, 7, 79, 2, 2, 895, 893, 3, 2, 2, 2, 895, 894, 3, 2, 2, 2, 896, 897, 3, 2, 2, 2, 897, 902, 5, 124, 63, 2, 898, 899, 7, 15, 2, 2, 899, 901, 5, 124, 63, 2, 900, 898, 3, 2, 2, 2, 901, 904, 3, 2, 2, 2, 902, 900, 3, 2, 2, 2, 902, 903, 3, 2, 2, 2, 903, 905, 3, 2, 2, 2, 904, 902, 3, 2, 2, 2, 905, 906, 7, 80, 2, 2, 906, 907, 5, 96, 49, 2, 907, 123, 3, 2, 2, 2, 908, 911, 5, 194, 98, 2, 909, 910, 7, 70, 2, 2, 910, 912, 5, 304, 153, 2, 911, 909, 3, 2, 2, 2, 911, 912, 3, 2, 2, 2, 912, 913, 3, 2, 2, 2, 913, 914, 7, 69, 2, 2, 914, 915, 5, 96, 49, 2, 915, 125, 3, 2, 2, 2, 916, 917, 7, 84, 2, 2, 917, 918, 7, 10, 2, 2, 918, 919, 5, 94, 48, 2, 919, 921, 7, 11, 2, 2, 920, 922, 5, 128, 65, 2, 921, 920, 3, 2, 2, 2, 922, 923, 3, 2, 2, 2, 923, 921, 3, 2, 2, 2, 923, 924, 3, 2, 2, 2, 924, 925, 3, 2, 2, 2, 925, 926, 7, 88, 2, 2, 926, 927, 7, 67, 2, 2, 927, 928, 5, 96, 49, 2, 928, 127, 3, 2, 2, 2, 929, 930, 7, 85, 2, 2, 930, 932, 5, 96, 49, 2, 931, 929, 3, 2, 2, 2, 932, 933, 3, 2, 2, 2, 933, 931, 3, 2, 2, 2, 933, 934, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 936, 7, 67, 2, 2, 936, 937, 5, 96, 49, 2, 937, 129, 3, 2, 2, 2, 938, 939, 7, 91, 2, 2, 939, 940, 7, 10, 2, 2, 940, 941, 5, 94, 48, 2, 941, 943, 7, 11, 2, 2, 942, 944, 5, 132, 67, 2, 943, 942, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 943, 3, 2, 2, 2, 945, 946, 3, 2, 2, 2, 946, 947, 3, 2, 2, 2, 947, 949, 7, 88, 2, 2, 948, 950, 5, 194, 98, 2, 949, 948, 3, 2, 2, 2, 949, 950, 3, 2, 2, 2, 950, 951, 3, 2, 2, 2, 951, 952, 7, 67, 2, 2, 952, 953, 5, 96, 49, 2, 953, 131, 3, 2, 2, 2, 954, 958, 7, 85, 2, 2, 955, 956, 5, 194, 98, 2, 956, 957, 7, 70, 2, 2, 957, 959, 3, 2, 2, 2, 958, 955, 3, 2, 2, 2, 958, 959, 3, 2, 2, 2, 959, 960, 3, 2, 2, 2, 960, 965, 5, 304, 153, 2, 961, 962, 7, 13, 2, 2, 962, 964, 5, 304, 153, 2, 963, 961, 3, 2, 2, 2, 964, 967, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 968, 3, 2, 2, 2, 967, 965, 3, 2, 2, 2, 968, 969, 7, 67, 2, 2, 969, 970, 5, 96, 49, 2, 970, 133, 3, 2, 2, 2, 971, 972, 7, 68, 2, 2, 972, 973, 7, 10, 2, 2, 973, 974, 5, 94, 48, 2, 974, 975, 7, 11, 2, 2, 975, 976, 7, 89, 2, 2, 976, 977, 5, 96, 49, 2, 977, 978, 7, 90, 2, 2, 978, 979, 5, 96, 49, 2, 979, 135, 3, 2, 2, 2, 980, 981, 7, 86, 2, 2, 981, 982, 7, 8, 2, 2, 982, 983, 5, 94, 48, 2, 983, 985, 7, 9, 2, 2, 984, 986, 5, 138, 70, 2, 985, 984, 3, 2, 2, 2, 986, 987, 3, 2, 2, 2, 987, 985, 3, 2, 2, 2, 987, 988, 3, 2, 2, 2, 988, 137, 3, 2, 2, 2, 989, 992, 7, 87, 2, 2, 990, 993, 7, 12, 2, 2, 991, 993, 5, 74, 38, 2, 992, 990, 3, 2, 2, 2, 992, 991, 3, 2, 2, 2, 993, 1001, 3, 2, 2, 2, 994, 997, 7, 13, 2, 2, 995, 998, 7, 12, 2, 2, 996, 998, 5, 74, 38, 2, 997, 995, 3, 2, 2, 2, 997, 996, 3, 2, 2, 2, 998, 1000, 3, 2, 2, 2, 999, 994, 3, 2, 2, 2, 1000, 1003, 3, 2, 2, 2, 1001, 999, 3, 2, 2, 2, 1001, 1002, 3, 2, 2, 2, 1002, 1004, 3, 2, 2, 2, 1003, 1001, 3, 2, 2, 2, 1004, 1005, 7, 8, 2, 2, 1005, 1006, 5, 94, 48, 2, 1006, 1007, 7, 9, 2, 2, 1007, 139, 3, 2, 2, 2, 1008, 1013, 5, 142, 72, 2, 1009, 1010, 7, 92, 2, 2, 1010, 1012, 5, 142, 72, 2, 1011, 1009, 3, 2, 2, 2, 1012, 1015, 3, 2, 2, 2, 1013, 1011, 3, 2, 2, 2, 1013, 1014, 3, 2, 2, 2, 1014, 141, 3, 2, 2, 2, 1015, 1013, 3, 2, 2, 2, 1016, 1021, 5, 144, 73, 2, 1017, 1018, 7, 93, 2, 2, 1018, 1020, 5, 144, 73, 2, 1019, 1017, 3, 2, 2, 2, 1020, 1023, 3, 2, 2, 2, 1021, 1019, 3, 2, 2, 2, 1021, 1022, 3, 2, 2, 2, 1022, 143, 3, 2, 2, 2, 1023, 1021, 3, 2, 2, 2, 1024, 1026, 7, 94, 2, 2, 1025, 1024, 3, 2, 2, 2, 1025, 1026, 3, 2, 2, 2, 1026, 1027, 3, 2, 2, 2, 1027, 1028, 5, 146, 74, 2, 1028, 145, 3, 2, 2, 2, 1029, 1032, 5, 148, 75, 2, 1030, 1031, 9, 5, 2, 2, 1031, 1033, 5, 148, 75, 2, 1032, 1030, 3, 2, 2, 2, 1032, 1033, 3, 2, 2, 2, 1033, 147, 3, 2, 2, 2, 1034, 1039, 5, 150, 76, 2, 1035, 1036, 7, 46, 2, 2, 1036, 1038, 5, 150, 76, 2, 1037, 1035, 3, 2, 2, 2, 1038, 1041, 3, 2, 2, 2, 1039, 1037, 3, 2, 2, 2, 1039, 1040, 3, 2, 2, 2, 1040, 149, 3, 2, 2, 2, 1041, 1039, 3, 2, 2, 2, 1042, 1045, 5, 152, 77, 2, 1043, 1044, 7, 95, 2, 2, 1044, 1046, 5, 152, 77, 2, 1045, 1043, 3, 2, 2, 2, 1045, 1046, 3, 2, 2, 2, 1046, 151, 3, 2, 2, 2, 1047, 1052, 5, 154, 78, 2, 1048, 1049, 9, 6, 2, 2, 1049, 1051, 5, 154, 78, 2, 1050, 1048, 3, 2, 2, 2, 1051, 1054, 3, 2, 2, 2, 1052, 1050, 3, 2, 2, 2, 1052, 1053, 3, 2, 2, 2, 1053, 153, 3, 2, 2, 2, 1054, 1052, 3, 2, 2, 2, 1055, 1060, 5, 156, 79, 2, 1056, 1057, 9, 7, 2, 2, 1057, 1059, 5, 156, 79, 2, 1058, 1056, 3, 2, 2, 2, 1059, 1062, 3, 2, 2, 2, 1060, 1058, 3, 2, 2, 2, 1060, 1061, 3, 2, 2, 2, 1061, 155, 3, 2, 2, 2, 1062, 1060, 3, 2, 2, 2, 1063, 1067, 5, 158, 80, 2, 1064, 1065, 7, 96, 2, 2, 1065, 1066, 7, 97, 2, 2, 1066, 1068, 5, 304, 153, 2, 1067, 1064, 3, 2, 2, 2, 1067, 1068, 3, 2, 2, 2, 1068, 157, 3, 2, 2, 2, 1069, 1073, 5, 160, 81, 2, 1070, 1071, 7, 99, 2, 2, 1071, 1072, 7, 98, 2, 2, 1072, 1074, 5, 304, 153, 2, 1073, 1070, 3, 2, 2, 2, 1073, 1074, 3, 2, 2, 2, 1074, 159, 3, 2, 2, 2, 1075, 1079, 5, 162, 82, 2, 1076, 1077, 7, 100, 2, 2, 1077, 1078, 7, 70, 2, 2, 1078, 1080, 5, 304, 153, 2, 1079, 1076, 3, 2, 2, 2, 1079, 1080, 3, 2, 2, 2, 1080, 161, 3, 2, 2, 2, 1081, 1085, 5, 164, 83, 2, 1082, 1083, 7, 102, 2, 2, 1083, 1084, 7, 70, 2, 2, 1084, 1086, 5, 316, 159, 2, 1085, 1082, 3, 2, 2, 2, 1085, 1086, 3, 2, 2, 2, 1086, 163, 3, 2, 2, 2, 1087, 1091, 5, 166, 84, 2, 1088, 1089, 7, 101, 2, 2, 1089, 1090, 7, 70, 2, 2, 1090, 1092, 5, 316, 159, 2, 1091, 1088, 3, 2, 2, 2, 1091, 1092, 3, 2, 2, 2, 1092, 165, 3, 2, 2, 2, 1093, 1102, 5, 170, 86, 2, 1094, 1095, 7, 5, 2, 2, 1095, 1096, 7, 44, 2, 2, 1096, 1097, 3, 2, 2, 2, 1097, 1098, 5, 168, 85, 2, 1098, 1099, 5, 206, 104, 2, 1099, 1101, 3, 2, 2, 2, 1100, 1094, 3, 2, 2, 2, 1101, 1104, 3, 2, 2, 2, 1102, 1100, 3, 2, 2, 2, 1102, 1103, 3, 2, 2, 2, 1103, 167, 3, 2, 2, 2, 1104, 1102, 3, 2, 2, 2, 1105, 1109, 5, 74, 38, 2, 1106, 1109, 5, 194, 98, 2, 1107, 1109, 5, 196, 99, 2, 1108, 1105, 3, 2, 2, 2, 1108, 1106, 3, 2, 2, 2, 1108, 1107, 3, 2, 2, 2, 1109, 169, 3, 2, 2, 2, 1110, 1112, 9, 6, 2, 2, 1111, 1110, 3, 2, 2, 2, 1112, 1115, 3, 2, 2, 2, 1113, 1111, 3, 2, 2, 2, 1113, 1114, 3, 2, 2, 2, 1114, 1116, 3, 2, 2, 2, 1115, 1113, 3, 2, 2, 2, 1116, 1117, 5, 172, 87, 2, 1117, 171, 3, 2, 2, 2, 1118, 1122, 5, 178, 90, 2, 1119, 1122, 5, 174, 88, 2, 1120, 1122, 5, 176, 89, 2, 1121, 1118, 3, 2, 2, 2, 1121, 1119, 3, 2, 2, 2, 1121, 1120, 3, 2, 2, 2, 1122, 173, 3, 2, 2, 2, 1123, 1124, 7, 109, 2, 2, 1124, 1125, 7, 108, 2, 2, 1125, 1126, 5, 304, 153, 2, 1126, 1127, 7, 8, 2, 2, 1127, 1128, 5, 94, 48, 2, 1128, 1129, 7, 9, 2, 2, 1129, 175, 3, 2, 2, 2, 1130, 1131, 7, 110, 2, 2, 1131, 1132, 7, 108, 2, 2, 1132, 1133, 5, 304, 153, 2, 1133, 1134, 7, 8, 2, 2, 1134, 1135, 5, 94, 48, 2, 1135, 1136, 7, 9, 2, 2, 1136, 177, 3, 2, 2, 2, 1137, 1142, 5, 232, 117, 2, 1138, 1139, 7, 52, 2, 2, 1139, 1141, 5, 232, 117, 2, 1140, 1138, 3, 2, 2, 2, 1141, 1144, 3, 2, 2, 2, 1142, 1140, 3, 2, 2, 2, 1142, 1143, 3, 2, 2, 2, 1143, 179, 3, 2, 2, 2, 1144, 1142, 3, 2, 2, 2, 1145, 1153, 5, 190, 96, 2, 1146, 1152, 5, 182, 92, 2, 1147, 1152, 5, 186, 94, 2, 1148, 1152, 5, 188, 95, 2, 1149, 1152, 5, 184, 93, 2, 1150, 1152, 5, 206, 104, 2, 1151, 1146, 3, 2, 2, 2, 1151, 1147, 3, 2, 2, 2, 1151, 1148, 3, 2, 2, 2, 1151, 1149, 3, 2, 2, 2, 1151, 1150, 3, 2, 2, 2, 1152, 1155, 3, 2, 2, 2, 1153, 1151, 3, 2, 2, 2, 1153, 1154, 3, 2, 2, 2, 1154, 181, 3, 2, 2, 2, 1155, 1153, 3, 2, 2, 2, 1156, 1157, 7, 53, 2, 2, 1157, 1158, 7, 53, 2, 2, 1158, 1159, 5, 94, 48, 2, 1159, 1160, 7, 54, 2, 2, 1160, 1161, 7, 54, 2, 2, 1161, 183, 3, 2, 2, 2, 1162, 1163, 7, 53, 2, 2, 1163, 1164, 7, 54, 2, 2, 1164, 185, 3, 2, 2, 2, 1165, 1166, 7, 53, 2, 2, 1166, 1167, 5, 94, 48, 2, 1167, 1168, 7, 54, 2, 2, 1168, 187, 3, 2, 2, 2, 1169, 1176, 7, 55, 2, 2, 1170, 1177, 5, 326, 164, 2, 1171, 1177, 5, 324, 163, 2, 1172, 1177, 7, 176, 2, 2, 1173, 1177, 5, 196, 99, 2, 1174, 1177, 5, 194, 98, 2, 1175, 1177, 5, 198, 100, 2, 1176, 1170, 3, 2, 2, 2, 1176, 1171, 3, 2, 2, 2, 1176, 1172, 3, 2, 2, 2, 1176, 1173, 3, 2, 2, 2, 1176, 1174, 3, 2, 2, 2, 1176, 1175, 3, 2, 2, 2, 1177, 189, 3, 2, 2, 2, 1178, 1194, 7, 169, 2, 2, 1179, 1194, 7, 106, 2, 2, 1180, 1194, 7, 107, 2, 2, 1181, 1194, 7, 170, 2, 2, 1182, 1194, 5, 324, 163, 2, 1183, 1194, 5, 194, 98, 2, 1184, 1194, 5, 196, 99, 2, 1185, 1194, 5, 198, 100, 2, 1186, 1194, 5, 306, 154, 2, 1187, 1194, 5, 204, 103, 2, 1188, 1194, 5, 200, 101, 2, 1189, 1194, 5, 202, 102, 2, 1190, 1194, 5, 320, 161, 2, 1191, 1194, 5, 210, 106, 2, 1192, 1194, 5, 192, 97, 2, 1193, 1178, 3, 2, 2, 2, 1193, 1179, 3, 2, 2, 2, 1193, 1180, 3, 2, 2, 2, 1193, 1181, 3, 2, 2, 2, 1193, 1182, 3, 2, 2, 2, 1193, 1183, 3, 2, 2, 2, 1193, 1184, 3, 2, 2, 2, 1193, 1185, 3, 2, 2, 2, 1193, 1186, 3, 2, 2, 2, 1193, 1187, 3, 2, 2, 2, 1193, 1188, 3, 2, 2, 2, 1193, 1189, 3, 2, 2, 2, 1193, 1190, 3, 2, 2, 2, 1193, 1191, 3, 2, 2, 2, 1193, 1192, 3, 2, 2, 2, 1194, 191, 3, 2, 2, 2, 1195, 1196, 7, 8, 2, 2, 1196, 1197, 5, 16, 9, 2, 1197, 1198, 7, 9, 2, 2, 1198, 193, 3, 2, 2, 2, 1199, 1200, 7, 6, 2, 2, 1200, 1201, 5, 74, 38, 2, 1201, 195, 3, 2, 2, 2, 1202, 1204, 7, 10, 2, 2, 1203, 1205, 5, 94, 48, 2, 1204, 1203, 3, 2, 2, 2, 1204, 1205, 3, 2, 2, 2, 1205, 1206, 3, 2, 2, 2, 1206, 1207, 7, 11, 2, 2, 1207, 197, 3, 2, 2, 2, 1208, 1209, 7, 56, 2, 2, 1209, 199, 3, 2, 2, 2, 1210, 1211, 7, 17, 2, 2, 1211, 1212, 7, 8, 2, 2, 1212, 1213, 5, 94, 48, 2, 1213, 1214, 7, 9, 2, 2, 1214, 201, 3, 2, 2, 2, 1215, 1216, 7, 105, 2, 2, 1216, 1217, 7, 8, 2, 2, 1217, 1218, 5, 94, 48, 2, 1218, 1219, 7, 9, 2, 2, 1219, 203, 3, 2, 2, 2, 1220, 1221, 5, 74, 38, 2, 1221, 1222, 5, 206, 104, 2, 1222, 205, 3, 2, 2, 2, 1223, 1230, 7, 10, 2, 2, 1224, 1226, 5, 208, 105, 2, 1225, 1227, 7, 15, 2, 2, 1226, 1225, 3, 2, 2, 2, 1226, 1227, 3, 2, 2, 2, 1227, 1229, 3, 2, 2, 2, 1228, 1224, 3, 2, 2, 2, 1229, 1232, 3, 2, 2, 2, 1230, 1228, 3, 2, 2, 2, 1230, 1231, 3, 2, 2, 2, 1231, 1233, 3, 2, 2, 2, 1232, 1230, 3, 2, 2, 2, 1233, 1234, 7, 11, 2, 2, 1234, 207, 3, 2, 2, 2, 1235, 1238, 5, 96, 49, 2, 1236, 1238, 7, 168, 2, 2, 1237, 1235, 3, 2, 2, 2, 1237, 1236, 3, 2, 2, 2, 1238, 209, 3, 2, 2, 2, 1239, 1242, 5, 212, 107, 2, 1240, 1242, 5, 214, 108, 2, 1241, 1239, 3, 2, 2, 2, 1241, 1240, 3, 2, 2, 2, 1242, 211, 3, 2, 2, 2, 1243, 1244, 5, 74, 38, 2, 1244, 1245, 7, 57, 2, 2, 1245, 1246, 7, 170, 2, 2, 1246, 213, 3, 2, 2, 2, 1247, 1248, 5, 52, 27, 2, 1248, 1249, 7, 31, 2, 2, 1249, 1251, 7, 10, 2, 2, 1250, 1252, 5, 90, 46, 2, 1251, 1250, 3, 2, 2, 2, 1251, 1252, 3, 2, 2, 2, 1252, 1253, 3, 2, 2, 2, 1253, 1256, 7, 11, 2, 2, 1254, 1255, 7, 70, 2, 2, 1255, 1257, 5, 304, 153, 2, 1256, 1254, 3, 2, 2, 2, 1256, 1257, 3, 2, 2, 2, 1257, 1258, 3, 2, 2, 2, 1258, 1259, 7, 8, 2, 2, 1259, 1260, 5, 18, 10, 2, 1260, 1261, 7, 9, 2, 2, 1261, 215, 3, 2, 2, 2, 1262, 1263, 7, 115, 2, 2, 1263, 1264, 7, 124, 2, 2, 1264, 1265, 5, 96, 49, 2, 1265, 1266, 7, 122, 2, 2, 1266, 1270, 5, 96, 49, 2, 1267, 1268, 7, 71, 2, 2, 1268, 1269, 7, 126, 2, 2, 1269, 1271, 5, 96, 49, 2, 1270, 1267, 3, 2, 2, 2, 1270, 1271, 3, 2, 2, 2, 1271, 1286, 3, 2, 2, 2, 1272, 1273, 7, 115, 2, 2, 1273, 1274, 7, 124, 2, 2, 1274, 1279, 5, 318, 160, 2, 1275, 1276, 7, 15, 2, 2, 1276, 1278, 5, 318, 160, 2, 1277, 1275, 3, 2, 2, 2, 1278, 1281, 3, 2, 2, 2, 1279, 1277, 3, 2, 2, 2, 1279, 1280, 3, 2, 2, 2, 1280, 1282, 3, 2, 2, 2, 1281, 1279, 3, 2, 2, 2, 1282, 1283, 7, 122, 2, 2, 1283, 1284, 5, 96, 49, 2, 1284, 1286, 3, 2, 2, 2, 1285, 1262, 3, 2, 2, 2, 1285, 1272, 3, 2, 2, 2, 1286, 217, 3, 2, 2, 2, 1287, 1288, 7, 116, 2, 2, 1288, 1289, 7, 124, 2, 2, 1289, 1290, 5, 228, 115, 2, 1290, 219, 3, 2, 2, 2, 1291, 1292, 7, 117, 2, 2, 1292, 1293, 7, 124, 2, 2, 1293, 1294, 5, 228, 115, 2, 1294, 1295, 7, 70, 2, 2, 1295, 1296, 5, 96, 49, 2, 1296, 221, 3, 2, 2, 2, 1297, 1298, 7, 118, 2, 2, 1298, 1299, 7, 123, 2, 2, 1299, 1300, 7, 97, 2, 2, 1300, 1301, 7, 124, 2, 2, 1301, 1302, 5, 228, 115, 2, 1302, 1303, 7, 125, 2, 2, 1303, 1304, 5, 96, 49, 2, 1304, 223, 3, 2, 2, 2, 1305, 1306, 7, 119, 2, 2, 1306, 1311, 5, 230, 116, 2, 1307, 1308, 7, 15, 2, 2, 1308, 1310, 5, 230, 116, 2, 1309, 1307, 3, 2, 2, 2, 1310, 1313, 3, 2, 2, 2, 1311, 1309, 3, 2, 2, 2, 1311, 1312, 3, 2, 2, 2, 1312, 1314, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1314, 1315, 7, 120, 2, 2, 1315, 1316, 5, 96, 49, 2, 1316, 1317, 7, 67, 2, 2, 1317, 1318, 5, 96, 49, 2, 1318, 225, 3, 2, 2, 2, 1319, 1320, 7, 121, 2, 2, 1320, 1321, 7, 124, 2, 2, 1321, 1322, 5, 96, 49, 2, 1322, 1323, 7, 122, 2, 2, 1323, 1324, 5, 96, 49, 2, 1324, 227, 3, 2, 2, 2, 1325, 1328, 5, 190, 96, 2, 1326, 1329, 5, 182, 92, 2, 1327, 1329, 5, 188, 95, 2, 1328, 1326, 3, 2, 2, 2, 1328, 1327, 3, 2, 2, 2, 1329, 1330, 3, 2, 2, 2, 1330, 1328, 3, 2, 2, 2, 1330, 1331, 3, 2, 2, 2, 1331, 229, 3, 2, 2, 2, 1332, 1333, 5, 194, 98, 2, 1333, 1334, 7, 7, 2, 2, 1334, 1335, 5, 96, 49, 2, 1335, 231, 3, 2, 2, 2, 1336, 1338, 7, 131, 2, 2, 1337, 1339, 5, 234, 118, 2, 1338, 1337, 3, 2, 2, 2, 1338, 1339, 3, 2, 2, 2, 1339, 1344, 3, 2, 2, 2, 1340, 1341, 7, 132, 2, 2, 1341, 1344, 5, 234, 118, 2, 1342, 1344, 5, 234, 118, 2, 1343, 1336, 3, 2, 2, 2, 1343, 1340, 3, 2, 2, 2, 1343, 1342, 3, 2, 2, 2, 1344, 233, 3, 2, 2, 2, 1345, 1350, 5, 236, 119, 2, 1346, 1347, 9, 8, 2, 2, 1347, 1349, 5, 236, 119, 2, 1348, 1346, 3, 2, 2, 2, 1349, 1352, 3, 2, 2, 2, 1350, 1348, 3, 2, 2, 2, 1350, 1351, 3, 2, 2, 2, 1351, 235, 3, 2, 2, 2, 1352, 1350, 3, 2, 2, 2, 1353, 1356, 5, 180, 91, 2, 1354, 1356, 5, 238, 120, 2, 1355, 1353, 3, 2, 2, 2, 1355, 1354, 3, 2, 2, 2, 1356, 237, 3, 2, 2, 2, 1357, 1360, 5, 246, 124, 2, 1358, 1360, 5, 240, 121, 2, 1359, 1357, 3, 2, 2, 2, 1359, 1358, 3, 2, 2, 2, 1360, 1361, 3, 2, 2, 2, 1361, 1362, 5, 262, 132, 2, 1362, 239, 3, 2, 2, 2, 1363, 1364, 5, 242, 122, 2, 1364, 1365, 5, 252, 127, 2, 1365, 1368, 3, 2, 2, 2, 1366, 1368, 5, 244, 123, 2, 1367, 1363, 3, 2, 2, 2, 1367, 1366, 3, 2, 2, 2, 1368, 241, 3, 2, 2, 2, 1369, 1370, 9, 9, 2, 2, 1370, 1371, 7, 19, 2, 2, 1371, 1372, 7, 19, 2, 2, 1372, 243, 3, 2, 2, 2, 1373, 1374, 7, 133, 2, 2, 1374, 1375, 5, 252, 127, 2, 1375, 245, 3, 2, 2, 2, 1376, 1377, 5, 248, 125, 2, 1377, 1378, 5, 252, 127, 2, 1378, 1381, 3, 2, 2, 2, 1379, 1381, 5, 250, 126, 2, 1380, 1376, 3, 2, 2, 2, 1380, 1379, 3, 2, 2, 2, 1381, 247, 3, 2, 2, 2, 1382, 1383, 9, 10, 2, 2, 1383, 1384, 7, 19, 2, 2, 1384, 1385, 7, 19, 2, 2, 1385, 249, 3, 2, 2, 2, 1386, 1387, 7, 58, 2, 2, 1387, 251, 3, 2, 2, 2, 1388, 1391, 5, 254, 128, 2, 1389, 1391, 5, 264, 133, 2, 1390, 1388, 3, 2, 2, 2, 1390, 1389, 3, 2, 2, 2, 1391, 253, 3, 2, 2, 2, 1392, 1395, 5, 74, 38, 2, 1393, 1395, 5, 256, 129, 2, 1394, 1392, 3, 2, 2, 2, 1394, 1393, 3, 2, 2, 2, 1395, 255, 3, 2, 2, 2, 1396, 1400, 7, 12, 2, 2, 1397, 1400, 5, 258, 130, 2, 1398, 1400, 5, 260, 131, 2, 1399, 1396, 3, 2, 2, 2, 1399, 1397, 3, 2, 2, 2, 1399, 1398, 3, 2, 2, 2, 1400, 257, 3, 2, 2, 2, 1401, 1402, 7, 176, 2, 2, 1402, 1403, 7, 19, 2, 2, 1403, 1404, 7, 12, 2, 2, 1404, 259, 3, 2, 2, 2, 1405, 1406, 7, 12, 2, 2, 1406, 1407, 7, 19, 2, 2, 1407, 1408, 7, 176, 2, 2, 1408, 261, 3, 2, 2, 2, 1409, 1411, 5, 186, 94, 2, 1410, 1409, 3, 2, 2, 2, 1411, 1414, 3, 2, 2, 2, 1412, 1410, 3, 2, 2, 2, 1412, 1413, 3, 2, 2, 2, 1413, 263, 3, 2, 2, 2, 1414, 1412, 3, 2, 2, 2, 1415, 1427, 5, 270, 136, 2, 1416, 1427, 5, 288, 145, 2, 1417, 1427, 5, 280, 141, 2, 1418, 1427, 5, 292, 147, 2, 1419, 1427, 5, 284, 143, 2, 1420, 1427, 5, 278, 140, 2, 1421, 1427, 5, 274, 138, 2, 1422, 1427, 5, 272, 137, 2, 1423, 1427, 5, 276, 139, 2, 1424, 1427, 5, 268, 135, 2, 1425, 1427, 5, 266, 134, 2, 1426, 1415, 3, 2, 2, 2, 1426, 1416, 3, 2, 2, 2, 1426, 1417, 3, 2, 2, 2, 1426, 1418, 3, 2, 2, 2, 1426, 1419, 3, 2, 2, 2, 1426, 1420, 3, 2, 2, 2, 1426, 1421, 3, 2, 2, 2, 1426, 1422, 3, 2, 2, 2, 1426, 1423, 3, 2, 2, 2, 1426, 1424, 3, 2, 2, 2, 1426, 1425, 3, 2, 2, 2, 1427, 265, 3, 2, 2, 2, 1428, 1429, 7, 146, 2, 2, 1429, 1430, 7, 10, 2, 2, 1430, 1431, 7, 11, 2, 2, 1431, 267, 3, 2, 2, 2, 1432, 1433, 7, 147, 2, 2, 1433, 1434, 7, 10, 2, 2, 1434, 1435, 7, 11, 2, 2, 1435, 269, 3, 2, 2, 2, 1436, 1437, 7, 149, 2, 2, 1437, 1440, 7, 10, 2, 2, 1438, 1441, 5, 288, 145, 2, 1439, 1441, 5, 292, 147, 2, 1440, 1438, 3, 2, 2, 2, 1440, 1439, 3, 2, 2, 2, 1440, 1441, 3, 2, 2, 2, 1441, 1442, 3, 2, 2, 2, 1442, 1443, 7, 11, 2, 2, 1443, 271, 3, 2, 2, 2, 1444, 1445, 7, 150, 2, 2, 1445, 1446, 7, 10, 2, 2, 1446, 1447, 7, 11, 2, 2, 1447, 273, 3, 2, 2, 2, 1448, 1449, 7, 160, 2, 2, 1449, 1450, 7, 10, 2, 2, 1450, 1451, 7, 11, 2, 2, 1451, 275, 3, 2, 2, 2, 1452, 1453, 7, 152, 2, 2, 1453, 1454, 7, 10, 2, 2, 1454, 1455, 7, 11, 2, 2, 1455, 277, 3, 2, 2, 2, 1456, 1457, 7, 151, 2, 2, 1457, 1460, 7, 10, 2, 2, 1458, 1461, 7, 176, 2, 2, 1459, 1461, 5, 324, 163, 2, 1460, 1458, 3, 2, 2, 2, 1460, 1459, 3, 2, 2, 2, 1460, 1461, 3, 2, 2, 2, 1461, 1462, 3, 2, 2, 2, 1462, 1463, 7, 11, 2, 2, 1463, 279, 3, 2, 2, 2, 1464, 1465, 7, 136, 2, 2, 1465, 1471, 7, 10, 2, 2, 1466, 1469, 5, 282, 142, 2, 1467, 1468, 7, 15, 2, 2, 1468, 1470, 5, 302, 152, 2, 1469, 1467, 3, 2, 2, 2, 1469, 1470, 3, 2, 2, 2, 1470, 1472, 3, 2, 2, 2, 1471, 1466, 3, 2, 2, 2, 1471, 1472, 3, 2, 2, 2, 1472, 1473, 3, 2, 2, 2, 1473, 1474, 7, 11, 2, 2, 1474, 281, 3, 2, 2, 2, 1475, 1478, 5, 296, 149, 2, 1476, 1478, 7, 12, 2, 2, 1477, 1475, 3, 2, 2, 2, 1477, 1476, 3, 2, 2, 2, 1478, 283, 3, 2, 2, 2, 1479, 1480, 7, 153, 2, 2, 1480, 1481, 7, 10, 2, 2, 1481, 1482, 5, 286, 144, 2, 1482, 1483, 7, 11, 2, 2, 1483, 285, 3, 2, 2, 2, 1484, 1485, 5, 296, 149, 2, 1485, 287, 3, 2, 2, 2, 1486, 1487, 7, 130, 2, 2, 1487, 1496, 7, 10, 2, 2, 1488, 1494, 5, 290, 146, 2, 1489, 1490, 7, 15, 2, 2, 1490, 1492, 5, 302, 152, 2, 1491, 1493, 7, 168, 2, 2, 1492, 1491, 3, 2, 2, 2, 1492, 1493, 3, 2, 2, 2, 1493, 1495, 3, 2, 2, 2, 1494, 1489, 3, 2, 2, 2, 1494, 1495, 3, 2, 2, 2, 1495, 1497, 3, 2, 2, 2, 1496, 1488, 3, 2, 2, 2, 1496, 1497, 3, 2, 2, 2, 1497, 1498, 3, 2, 2, 2, 1498, 1499, 7, 11, 2, 2, 1499, 289, 3, 2, 2, 2, 1500, 1503, 5, 298, 150, 2, 1501, 1503, 7, 12, 2, 2, 1502, 1500, 3, 2, 2, 2, 1502, 1501, 3, 2, 2, 2, 1503, 291, 3, 2, 2, 2, 1504, 1505, 7, 154, 2, 2, 1505, 1506, 7, 10, 2, 2, 1506, 1507, 5, 294, 148, 2, 1507, 1508, 7, 11, 2, 2, 1508, 293, 3, 2, 2, 2, 1509, 1510, 5, 298, 150, 2, 1510, 295, 3, 2, 2, 2, 1511, 1512, 5, 74, 38, 2, 1512, 297, 3, 2, 2, 2, 1513, 1514, 5, 74, 38, 2, 1514, 299, 3, 2, 2, 2, 1515, 1516, 5, 302, 152, 2, 1516, 301, 3, 2, 2, 2, 1517, 1518, 5, 74, 38, 2, 1518, 303, 3, 2, 2, 2, 1519, 1520, 7, 10, 2, 2, 1520, 1528, 7, 11, 2, 2, 1521, 1525, 5, 308, 155, 2, 1522, 1526, 7, 168, 2, 2, 1523, 1526, 7, 12, 2, 2, 1524, 1526, 7, 47, 2, 2, 1525, 1522, 3, 2, 2, 2, 1525, 1523, 3, 2, 2, 2, 1525, 1524, 3, 2, 2, 2, 1525, 1526, 3, 2, 2, 2, 1526, 1528, 3, 2, 2, 2, 1527, 1519, 3, 2, 2, 2, 1527, 1521, 3, 2, 2, 2, 1528, 305, 3, 2, 2, 2, 1529, 1538, 7, 8, 2, 2, 1530, 1535, 5, 318, 160, 2, 1531, 1532, 7, 15, 2, 2, 1532, 1534, 5, 318, 160, 2, 1533, 1531, 3, 2, 2, 2, 1534, 1537, 3, 2, 2, 2, 1535, 1533, 3, 2, 2, 2, 1535, 1536, 3, 2, 2, 2, 1536, 1539, 3, 2, 2, 2, 1537, 1535, 3, 2, 2, 2, 1538, 1530, 3, 2, 2, 2, 1538, 1539, 3, 2, 2, 2, 1539, 1540, 3, 2, 2, 2, 1540, 1546, 7, 9, 2, 2, 1541, 1542, 7, 59, 2, 2, 1542, 1543, 5, 94, 48, 2, 1543, 1544, 7, 60, 2, 2, 1544, 1546, 3, 2, 2, 2, 1545, 1529, 3, 2, 2, 2, 1545, 1541, 3, 2, 2, 2, 1546, 307, 3, 2, 2, 2, 1547, 1551, 5, 74, 38, 2, 1548, 1551, 7, 169, 2, 2, 1549, 1551, 5, 310, 156, 2, 1550, 1547, 3, 2, 2, 2, 1550, 1548, 3, 2, 2, 2, 1550, 1549, 3, 2, 2, 2, 1551, 309, 3, 2, 2, 2, 1552, 1555, 5, 312, 157, 2, 1553, 1555, 5, 314, 158, 2, 1554, 1552, 3, 2, 2, 2, 1554, 1553, 3, 2, 2, 2, 1555, 311, 3, 2, 2, 2, 1556, 1557, 7, 31, 2, 2, 1557, 1558, 7, 10, 2, 2, 1558, 1559, 7, 12, 2, 2, 1559, 1560, 7, 11, 2, 2, 1560, 313, 3, 2, 2, 2, 1561, 1562, 7, 31, 2, 2, 1562, 1571, 7, 10, 2, 2, 1563, 1568, 5, 304, 153, 2, 1564, 1565, 7, 15, 2, 2, 1565, 1567, 5, 304, 153, 2, 1566, 1564, 3, 2, 2, 2, 1567, 1570, 3, 2, 2, 2, 1568, 1566, 3, 2, 2, 2, 1568, 1569, 3, 2, 2, 2, 1569, 1572, 3, 2, 2, 2, 1570, 1568, 3, 2, 2, 2, 1571, 1563, 3, 2, 2, 2, 1571, 1572, 3, 2, 2, 2, 1572, 1573, 3, 2, 2, 2, 1573, 1574, 7, 11, 2, 2, 1574, 1575, 7, 70, 2, 2, 1575, 1576, 5, 304, 153, 2, 1576, 315, 3, 2, 2, 2, 1577, 1579, 5, 308, 155, 2, 1578, 1580, 7, 168, 2, 2, 1579, 1578, 3, 2, 2, 2, 1579, 1580, 3, 2, 2, 2, 1580, 317, 3, 2, 2, 2, 1581, 1584, 5, 96, 49, 2, 1582, 1584, 7, 176, 2, 2, 1583, 1581, 3, 2, 2, 2, 1583, 1582, 3, 2, 2, 2, 1584, 1585, 3, 2, 2, 2, 1585, 1586, 9, 11, 2, 2, 1586, 1587, 5, 96, 49, 2, 1587, 319, 3, 2, 2, 2, 1588, 1590, 7, 53, 2, 2, 1589, 1591, 5, 94, 48, 2, 1590, 1589, 3, 2, 2, 2, 1590, 1591, 3, 2, 2, 2, 1591, 1592, 3, 2, 2, 2, 1592, 1593, 7, 54, 2, 2, 1593, 321, 3, 2, 2, 2, 1594, 1595, 5, 324, 163, 2, 1595, 323, 3, 2, 2, 2, 1596, 1597, 7, 167, 2, 2, 1597, 325, 3, 2, 2, 2, 1598, 1599, 9, 12, 2, 2, 1599, 327, 3, 2, 2, 2, 155, 336, 340, 356, 362, 370, 378, 386, 401, 431, 439, 441, 463, 473, 483, 488, 493, 497, 509, 513, 522, 529, 543, 547, 552, 562, 570, 574, 586, 598, 620, 628, 633, 636, 640, 649, 658, 661, 669, 676, 678, 685, 692, 694, 702, 707, 714, 721, 731, 738, 745, 752, 761, 771, 775, 783, 785, 797, 803, 807, 811, 822, 828, 843, 849, 853, 857, 864, 871, 877, 882, 884, 888, 895, 902, 911, 923, 933, 945, 949, 958, 965, 987, 992, 997, 1001, 1013, 1021, 1025, 1032, 1039, 1045, 1052, 1060, 1067, 1073, 1079, 1085, 1091, 1102, 1108, 1113, 1121, 1142, 1151, 1153, 1176, 1193, 1204, 1226, 1230, 1237, 1241, 1251, 1256, 1270, 1279, 1285, 1311, 1328, 1330, 1338, 1343, 1350, 1355, 1359, 1367, 1380, 1390, 1394, 1399, 1412, 1426, 1440, 1460, 1469, 1471, 1477, 1492, 1494, 1496, 1502, 1525, 1527, 1535, 1538, 1545, 1550, 1554, 1568, 1571, 1579, 1583, 1590] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 178, 1603, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 337, 10, 3, 3, 3, 3, 3, 5, 3, 341, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 357, 10, 6, 3, 6, 3, 6, 7, 6, 361, 10, 6, 12, 6, 14, 6, 364, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 369, 10, 6, 12, 6, 14, 6, 372, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 377, 10, 8, 12, 8, 14, 8, 380, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 387, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 402, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 432, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 440, 10, 18, 12, 18, 14, 18, 443, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 462, 10, 20, 13, 20, 14, 20, 463, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 472, 10, 21, 13, 21, 14, 21, 473, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 482, 10, 22, 13, 22, 14, 22, 483, 3, 23, 3, 23, 3, 23, 5, 23, 489, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 494, 10, 23, 7, 23, 496, 10, 23, 12, 23, 14, 23, 499, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 508, 10, 24, 13, 24, 14, 24, 509, 3, 24, 3, 24, 5, 24, 514, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 523, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 528, 10, 25, 12, 25, 14, 25, 531, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 542, 10, 26, 12, 26, 14, 26, 545, 11, 26, 3, 26, 5, 26, 548, 10, 26, 3, 27, 7, 27, 551, 10, 27, 12, 27, 14, 27, 554, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 561, 10, 28, 12, 28, 14, 28, 564, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 571, 10, 29, 3, 29, 3, 29, 5, 29, 575, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 587, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 599, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 621, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 627, 10, 37, 12, 37, 14, 37, 630, 11, 37, 3, 38, 3, 38, 5, 38, 634, 10, 38, 3, 38, 5, 38, 637, 10, 38, 3, 38, 3, 38, 5, 38, 641, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 650, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 657, 10, 40, 12, 40, 14, 40, 660, 11, 40, 5, 40, 662, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 670, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 677, 10, 41, 5, 41, 679, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 686, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 693, 10, 42, 5, 42, 695, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 703, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 708, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 715, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 722, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 732, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 737, 10, 46, 12, 46, 14, 46, 740, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 746, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 751, 10, 48, 12, 48, 14, 48, 754, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 762, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 772, 10, 50, 3, 51, 3, 51, 5, 51, 776, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 784, 10, 51, 12, 51, 14, 51, 787, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 796, 10, 52, 12, 52, 14, 52, 799, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 804, 10, 53, 3, 53, 3, 53, 5, 53, 808, 10, 53, 3, 53, 3, 53, 5, 53, 812, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 821, 10, 54, 12, 54, 14, 54, 824, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 829, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 842, 10, 57, 12, 57, 14, 57, 845, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 850, 10, 58, 3, 58, 3, 58, 5, 58, 854, 10, 58, 3, 58, 3, 58, 5, 58, 858, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 865, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 870, 10, 59, 12, 59, 14, 59, 873, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 878, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 883, 10, 60, 5, 60, 885, 10, 60, 3, 60, 3, 60, 5, 60, 889, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 896, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 901, 10, 62, 12, 62, 14, 62, 904, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 912, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 922, 10, 64, 13, 64, 14, 64, 923, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 932, 10, 65, 13, 65, 14, 65, 933, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 944, 10, 66, 13, 66, 14, 66, 945, 3, 66, 3, 66, 5, 66, 950, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 959, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 964, 10, 67, 12, 67, 14, 67, 967, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 986, 10, 69, 13, 69, 14, 69, 987, 3, 70, 3, 70, 3, 70, 5, 70, 993, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 998, 10, 70, 7, 70, 1000, 10, 70, 12, 70, 14, 70, 1003, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 1012, 10, 71, 12, 71, 14, 71, 1015, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 1020, 10, 72, 12, 72, 14, 72, 1023, 11, 72, 3, 73, 5, 73, 1026, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 1033, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 1038, 10, 75, 12, 75, 14, 75, 1041, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 1046, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 1051, 10, 77, 12, 77, 14, 77, 1054, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 1059, 10, 78, 12, 78, 14, 78, 1062, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 1068, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1074, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1080, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1086, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1092, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1101, 10, 84, 12, 84, 14, 84, 1104, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1109, 10, 85, 3, 86, 7, 86, 1112, 10, 86, 12, 86, 14, 86, 1115, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1122, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1141, 10, 90, 12, 90, 14, 90, 1144, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1152, 10, 91, 12, 91, 14, 91, 1155, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1177, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1194, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1205, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1227, 10, 104, 7, 104, 1229, 10, 104, 12, 104, 14, 104, 1232, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1238, 10, 105, 3, 106, 3, 106, 5, 106, 1242, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1252, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1257, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1271, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1278, 10, 109, 12, 109, 14, 109, 1281, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1286, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1310, 10, 113, 12, 113, 14, 113, 1313, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1329, 10, 115, 13, 115, 14, 115, 1330, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 5, 117, 1339, 10, 117, 3, 117, 3, 117, 3, 117, 5, 117, 1344, 10, 117, 3, 118, 3, 118, 3, 118, 7, 118, 1349, 10, 118, 12, 118, 14, 118, 1352, 11, 118, 3, 119, 3, 119, 5, 119, 1356, 10, 119, 3, 120, 3, 120, 5, 120, 1360, 10, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 5, 121, 1368, 10, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 5, 123, 1375, 10, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 5, 124, 1383, 10, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 127, 3, 127, 5, 127, 1393, 10, 127, 3, 128, 3, 128, 5, 128, 1397, 10, 128, 3, 129, 3, 129, 3, 129, 5, 129, 1402, 10, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 7, 132, 1413, 10, 132, 12, 132, 14, 132, 1416, 11, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 5, 133, 1429, 10, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 5, 136, 1443, 10, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 5, 140, 1463, 10, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 5, 141, 1472, 10, 141, 5, 141, 1474, 10, 141, 3, 141, 3, 141, 3, 142, 3, 142, 5, 142, 1480, 10, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 5, 145, 1495, 10, 145, 5, 145, 1497, 10, 145, 5, 145, 1499, 10, 145, 3, 145, 3, 145, 3, 146, 3, 146, 5, 146, 1505, 10, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 149, 3, 149, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 5, 153, 1528, 10, 153, 5, 153, 1530, 10, 153, 3, 154, 3, 154, 3, 154, 3, 154, 7, 154, 1536, 10, 154, 12, 154, 14, 154, 1539, 11, 154, 5, 154, 1541, 10, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 5, 154, 1548, 10, 154, 3, 155, 3, 155, 3, 155, 5, 155, 1553, 10, 155, 3, 156, 3, 156, 5, 156, 1557, 10, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 7, 158, 1569, 10, 158, 12, 158, 14, 158, 1572, 11, 158, 5, 158, 1574, 10, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 5, 159, 1582, 10, 159, 3, 160, 3, 160, 5, 160, 1586, 10, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 5, 161, 1593, 10, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 2, 2, 165, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 2, 13, 4, 2, 17, 17, 105, 105, 3, 2, 82, 83, 3, 2, 20, 29, 4, 2, 5, 5, 35, 45, 3, 2, 47, 48, 4, 2, 12, 12, 49, 51, 3, 2, 131, 132, 3, 2, 134, 140, 3, 2, 141, 145, 4, 2, 19, 19, 168, 168, 5, 2, 61, 126, 161, 166, 169, 169, 2, 1667, 2, 328, 3, 2, 2, 2, 4, 336, 3, 2, 2, 2, 6, 342, 3, 2, 2, 2, 8, 345, 3, 2, 2, 2, 10, 362, 3, 2, 2, 2, 12, 373, 3, 2, 2, 2, 14, 378, 3, 2, 2, 2, 16, 381, 3, 2, 2, 2, 18, 384, 3, 2, 2, 2, 20, 401, 3, 2, 2, 2, 22, 403, 3, 2, 2, 2, 24, 406, 3, 2, 2, 2, 26, 412, 3, 2, 2, 2, 28, 416, 3, 2, 2, 2, 30, 420, 3, 2, 2, 2, 32, 424, 3, 2, 2, 2, 34, 431, 3, 2, 2, 2, 36, 447, 3, 2, 2, 2, 38, 456, 3, 2, 2, 2, 40, 471, 3, 2, 2, 2, 42, 478, 3, 2, 2, 2, 44, 485, 3, 2, 2, 2, 46, 502, 3, 2, 2, 2, 48, 518, 3, 2, 2, 2, 50, 535, 3, 2, 2, 2, 52, 552, 3, 2, 2, 2, 54, 555, 3, 2, 2, 2, 56, 567, 3, 2, 2, 2, 58, 576, 3, 2, 2, 2, 60, 586, 3, 2, 2, 2, 62, 588, 3, 2, 2, 2, 64, 598, 3, 2, 2, 2, 66, 600, 3, 2, 2, 2, 68, 605, 3, 2, 2, 2, 70, 609, 3, 2, 2, 2, 72, 615, 3, 2, 2, 2, 74, 636, 3, 2, 2, 2, 76, 642, 3, 2, 2, 2, 78, 644, 3, 2, 2, 2, 80, 663, 3, 2, 2, 2, 82, 680, 3, 2, 2, 2, 84, 696, 3, 2, 2, 2, 86, 716, 3, 2, 2, 2, 88, 731, 3, 2, 2, 2, 90, 733, 3, 2, 2, 2, 92, 741, 3, 2, 2, 2, 94, 747, 3, 2, 2, 2, 96, 761, 3, 2, 2, 2, 98, 771, 3, 2, 2, 2, 100, 775, 3, 2, 2, 2, 102, 791, 3, 2, 2, 2, 104, 800, 3, 2, 2, 2, 106, 816, 3, 2, 2, 2, 108, 825, 3, 2, 2, 2, 110, 833, 3, 2, 2, 2, 112, 836, 3, 2, 2, 2, 114, 846, 3, 2, 2, 2, 116, 864, 3, 2, 2, 2, 118, 874, 3, 2, 2, 2, 120, 890, 3, 2, 2, 2, 122, 895, 3, 2, 2, 2, 124, 908, 3, 2, 2, 2, 126, 916, 3, 2, 2, 2, 128, 931, 3, 2, 2, 2, 130, 938, 3, 2, 2, 2, 132, 954, 3, 2, 2, 2, 134, 971, 3, 2, 2, 2, 136, 980, 3, 2, 2, 2, 138, 989, 3, 2, 2, 2, 140, 1008, 3, 2, 2, 2, 142, 1016, 3, 2, 2, 2, 144, 1025, 3, 2, 2, 2, 146, 1029, 3, 2, 2, 2, 148, 1034, 3, 2, 2, 2, 150, 1042, 3, 2, 2, 2, 152, 1047, 3, 2, 2, 2, 154, 1055, 3, 2, 2, 2, 156, 1063, 3, 2, 2, 2, 158, 1069, 3, 2, 2, 2, 160, 1075, 3, 2, 2, 2, 162, 1081, 3, 2, 2, 2, 164, 1087, 3, 2, 2, 2, 166, 1093, 3, 2, 2, 2, 168, 1108, 3, 2, 2, 2, 170, 1113, 3, 2, 2, 2, 172, 1121, 3, 2, 2, 2, 174, 1123, 3, 2, 2, 2, 176, 1130, 3, 2, 2, 2, 178, 1137, 3, 2, 2, 2, 180, 1145, 3, 2, 2, 2, 182, 1156, 3, 2, 2, 2, 184, 1162, 3, 2, 2, 2, 186, 1165, 3, 2, 2, 2, 188, 1169, 3, 2, 2, 2, 190, 1193, 3, 2, 2, 2, 192, 1195, 3, 2, 2, 2, 194, 1199, 3, 2, 2, 2, 196, 1202, 3, 2, 2, 2, 198, 1208, 3, 2, 2, 2, 200, 1210, 3, 2, 2, 2, 202, 1215, 3, 2, 2, 2, 204, 1220, 3, 2, 2, 2, 206, 1223, 3, 2, 2, 2, 208, 1237, 3, 2, 2, 2, 210, 1241, 3, 2, 2, 2, 212, 1243, 3, 2, 2, 2, 214, 1247, 3, 2, 2, 2, 216, 1285, 3, 2, 2, 2, 218, 1287, 3, 2, 2, 2, 220, 1291, 3, 2, 2, 2, 222, 1297, 3, 2, 2, 2, 224, 1305, 3, 2, 2, 2, 226, 1319, 3, 2, 2, 2, 228, 1325, 3, 2, 2, 2, 230, 1332, 3, 2, 2, 2, 232, 1343, 3, 2, 2, 2, 234, 1345, 3, 2, 2, 2, 236, 1355, 3, 2, 2, 2, 238, 1359, 3, 2, 2, 2, 240, 1367, 3, 2, 2, 2, 242, 1369, 3, 2, 2, 2, 244, 1374, 3, 2, 2, 2, 246, 1382, 3, 2, 2, 2, 248, 1384, 3, 2, 2, 2, 250, 1388, 3, 2, 2, 2, 252, 1392, 3, 2, 2, 2, 254, 1396, 3, 2, 2, 2, 256, 1401, 3, 2, 2, 2, 258, 1403, 3, 2, 2, 2, 260, 1407, 3, 2, 2, 2, 262, 1414, 3, 2, 2, 2, 264, 1428, 3, 2, 2, 2, 266, 1430, 3, 2, 2, 2, 268, 1434, 3, 2, 2, 2, 270, 1438, 3, 2, 2, 2, 272, 1446, 3, 2, 2, 2, 274, 1450, 3, 2, 2, 2, 276, 1454, 3, 2, 2, 2, 278, 1458, 3, 2, 2, 2, 280, 1466, 3, 2, 2, 2, 282, 1479, 3, 2, 2, 2, 284, 1481, 3, 2, 2, 2, 286, 1486, 3, 2, 2, 2, 288, 1488, 3, 2, 2, 2, 290, 1504, 3, 2, 2, 2, 292, 1506, 3, 2, 2, 2, 294, 1511, 3, 2, 2, 2, 296, 1513, 3, 2, 2, 2, 298, 1515, 3, 2, 2, 2, 300, 1517, 3, 2, 2, 2, 302, 1519, 3, 2, 2, 2, 304, 1529, 3, 2, 2, 2, 306, 1547, 3, 2, 2, 2, 308, 1552, 3, 2, 2, 2, 310, 1556, 3, 2, 2, 2, 312, 1558, 3, 2, 2, 2, 314, 1563, 3, 2, 2, 2, 316, 1579, 3, 2, 2, 2, 318, 1585, 3, 2, 2, 2, 320, 1590, 3, 2, 2, 2, 322, 1596, 3, 2, 2, 2, 324, 1598, 3, 2, 2, 2, 326, 1600, 3, 2, 2, 2, 328, 329, 5, 4, 3, 2, 329, 330, 7, 2, 2, 3, 330, 3, 3, 2, 2, 2, 331, 332, 7, 104, 2, 2, 332, 333, 7, 103, 2, 2, 333, 334, 5, 324, 163, 2, 334, 335, 7, 3, 2, 2, 335, 337, 3, 2, 2, 2, 336, 331, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 341, 5, 8, 5, 2, 339, 341, 5, 6, 4, 2, 340, 338, 3, 2, 2, 2, 340, 339, 3, 2, 2, 2, 341, 5, 3, 2, 2, 2, 342, 343, 5, 10, 6, 2, 343, 344, 5, 12, 7, 2, 344, 7, 3, 2, 2, 2, 345, 346, 7, 4, 2, 2, 346, 347, 7, 129, 2, 2, 347, 348, 7, 176, 2, 2, 348, 349, 7, 5, 2, 2, 349, 350, 5, 322, 162, 2, 350, 351, 7, 3, 2, 2, 351, 352, 5, 10, 6, 2, 352, 9, 3, 2, 2, 2, 353, 357, 5, 60, 31, 2, 354, 357, 5, 62, 32, 2, 355, 357, 5, 78, 40, 2, 356, 353, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 355, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 359, 7, 3, 2, 2, 359, 361, 3, 2, 2, 2, 360, 356, 3, 2, 2, 2, 361, 364, 3, 2, 2, 2, 362, 360, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 370, 3, 2, 2, 2, 364, 362, 3, 2, 2, 2, 365, 366, 5, 64, 33, 2, 366, 367, 7, 3, 2, 2, 367, 369, 3, 2, 2, 2, 368, 365, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 368, 3, 2, 2, 2, 370, 371, 3, 2, 2, 2, 371, 11, 3, 2, 2, 2, 372, 370, 3, 2, 2, 2, 373, 374, 5, 18, 10, 2, 374, 13, 3, 2, 2, 2, 375, 377, 5, 20, 11, 2, 376, 375, 3, 2, 2, 2, 377, 380, 3, 2, 2, 2, 378, 376, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 15, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 381, 382, 5, 14, 8, 2, 382, 383, 5, 94, 48, 2, 383, 17, 3, 2, 2, 2, 384, 386, 5, 14, 8, 2, 385, 387, 5, 94, 48, 2, 386, 385, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 19, 3, 2, 2, 2, 388, 402, 5, 22, 12, 2, 389, 402, 5, 24, 13, 2, 390, 402, 5, 26, 14, 2, 391, 402, 5, 28, 15, 2, 392, 402, 5, 30, 16, 2, 393, 402, 5, 32, 17, 2, 394, 402, 5, 34, 18, 2, 395, 402, 5, 36, 19, 2, 396, 402, 5, 38, 20, 2, 397, 402, 5, 42, 22, 2, 398, 402, 5, 46, 24, 2, 399, 402, 5, 54, 28, 2, 400, 402, 5, 58, 30, 2, 401, 388, 3, 2, 2, 2, 401, 389, 3, 2, 2, 2, 401, 390, 3, 2, 2, 2, 401, 391, 3, 2, 2, 2, 401, 392, 3, 2, 2, 2, 401, 393, 3, 2, 2, 2, 401, 394, 3, 2, 2, 2, 401, 395, 3, 2, 2, 2, 401, 396, 3, 2, 2, 2, 401, 397, 3, 2, 2, 2, 401, 398, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 401, 400, 3, 2, 2, 2, 402, 21, 3, 2, 2, 2, 403, 404, 5, 98, 50, 2, 404, 405, 7, 3, 2, 2, 405, 23, 3, 2, 2, 2, 406, 407, 7, 6, 2, 2, 407, 408, 5, 74, 38, 2, 408, 409, 7, 7, 2, 2, 409, 410, 5, 96, 49, 2, 410, 411, 7, 3, 2, 2, 411, 25, 3, 2, 2, 2, 412, 413, 7, 8, 2, 2, 413, 414, 5, 14, 8, 2, 414, 415, 7, 9, 2, 2, 415, 27, 3, 2, 2, 2, 416, 417, 7, 161, 2, 2, 417, 418, 7, 162, 2, 2, 418, 419, 7, 3, 2, 2, 419, 29, 3, 2, 2, 2, 420, 421, 7, 163, 2, 2, 421, 422, 7, 162, 2, 2, 422, 423, 7, 3, 2, 2, 423, 31, 3, 2, 2, 2, 424, 425, 7, 164, 2, 2, 425, 426, 7, 165, 2, 2, 426, 427, 5, 96, 49, 2, 427, 428, 7, 3, 2, 2, 428, 33, 3, 2, 2, 2, 429, 432, 5, 102, 52, 2, 430, 432, 5, 106, 54, 2, 431, 429, 3, 2, 2, 2, 431, 430, 3, 2, 2, 2, 432, 441, 3, 2, 2, 2, 433, 440, 5, 102, 52, 2, 434, 440, 5, 106, 54, 2, 435, 440, 5, 110, 56, 2, 436, 440, 5, 112, 57, 2, 437, 440, 5, 116, 59, 2, 438, 440, 5, 120, 61, 2, 439, 433, 3, 2, 2, 2, 439, 434, 3, 2, 2, 2, 439, 435, 3, 2, 2, 2, 439, 436, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 438, 3, 2, 2, 2, 440, 443, 3, 2, 2, 2, 441, 439, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 444, 3, 2, 2, 2, 443, 441, 3, 2, 2, 2, 444, 445, 7, 67, 2, 2, 445, 446, 5, 20, 11, 2, 446, 35, 3, 2, 2, 2, 447, 448, 7, 68, 2, 2, 448, 449, 7, 10, 2, 2, 449, 450, 5, 94, 48, 2, 450, 451, 7, 11, 2, 2, 451, 452, 7, 89, 2, 2, 452, 453, 5, 20, 11, 2, 453, 454, 7, 90, 2, 2, 454, 455, 5, 20, 11, 2, 455, 37, 3, 2, 2, 2, 456, 457, 7, 84, 2, 2, 457, 458, 7, 10, 2, 2, 458, 459, 5, 94, 48, 2, 459, 461, 7, 11, 2, 2, 460, 462, 5, 40, 21, 2, 461, 460, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 461, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 88, 2, 2, 466, 467, 7, 67, 2, 2, 467, 468, 5, 20, 11, 2, 468, 39, 3, 2, 2, 2, 469, 470, 7, 85, 2, 2, 470, 472, 5, 96, 49, 2, 471, 469, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 7, 67, 2, 2, 476, 477, 5, 20, 11, 2, 477, 41, 3, 2, 2, 2, 478, 479, 7, 86, 2, 2, 479, 481, 5, 26, 14, 2, 480, 482, 5, 44, 23, 2, 481, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 43, 3, 2, 2, 2, 485, 488, 7, 87, 2, 2, 486, 489, 7, 12, 2, 2, 487, 489, 5, 74, 38, 2, 488, 486, 3, 2, 2, 2, 488, 487, 3, 2, 2, 2, 489, 497, 3, 2, 2, 2, 490, 493, 7, 13, 2, 2, 491, 494, 7, 12, 2, 2, 492, 494, 5, 74, 38, 2, 493, 491, 3, 2, 2, 2, 493, 492, 3, 2, 2, 2, 494, 496, 3, 2, 2, 2, 495, 490, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 500, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 500, 501, 5, 26, 14, 2, 501, 45, 3, 2, 2, 2, 502, 503, 7, 91, 2, 2, 503, 504, 7, 10, 2, 2, 504, 505, 5, 94, 48, 2, 505, 507, 7, 11, 2, 2, 506, 508, 5, 48, 25, 2, 507, 506, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 507, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 513, 7, 88, 2, 2, 512, 514, 5, 194, 98, 2, 513, 512, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 7, 67, 2, 2, 516, 517, 5, 20, 11, 2, 517, 47, 3, 2, 2, 2, 518, 522, 7, 85, 2, 2, 519, 520, 5, 194, 98, 2, 520, 521, 7, 70, 2, 2, 521, 523, 3, 2, 2, 2, 522, 519, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 524, 3, 2, 2, 2, 524, 529, 5, 304, 153, 2, 525, 526, 7, 13, 2, 2, 526, 528, 5, 304, 153, 2, 527, 525, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 532, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 533, 7, 67, 2, 2, 533, 534, 5, 20, 11, 2, 534, 49, 3, 2, 2, 2, 535, 536, 7, 14, 2, 2, 536, 547, 5, 74, 38, 2, 537, 538, 7, 10, 2, 2, 538, 543, 7, 170, 2, 2, 539, 540, 7, 15, 2, 2, 540, 542, 7, 170, 2, 2, 541, 539, 3, 2, 2, 2, 542, 545, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 546, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 546, 548, 7, 11, 2, 2, 547, 537, 3, 2, 2, 2, 547, 548, 3, 2, 2, 2, 548, 51, 3, 2, 2, 2, 549, 551, 5, 50, 26, 2, 550, 549, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 53, 3, 2, 2, 2, 554, 552, 3, 2, 2, 2, 555, 556, 5, 52, 27, 2, 556, 557, 7, 114, 2, 2, 557, 562, 5, 56, 29, 2, 558, 559, 7, 15, 2, 2, 559, 561, 5, 56, 29, 2, 560, 558, 3, 2, 2, 2, 561, 564, 3, 2, 2, 2, 562, 560, 3, 2, 2, 2, 562, 563, 3, 2, 2, 2, 563, 565, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 565, 566, 7, 3, 2, 2, 566, 55, 3, 2, 2, 2, 567, 570, 5, 194, 98, 2, 568, 569, 7, 70, 2, 2, 569, 571, 5, 304, 153, 2, 570, 568, 3, 2, 2, 2, 570, 571, 3, 2, 2, 2, 571, 574, 3, 2, 2, 2, 572, 573, 7, 7, 2, 2, 573, 575, 5, 96, 49, 2, 574, 572, 3, 2, 2, 2, 574, 575, 3, 2, 2, 2, 575, 57, 3, 2, 2, 2, 576, 577, 7, 166, 2, 2, 577, 578, 7, 10, 2, 2, 578, 579, 5, 94, 48, 2, 579, 580, 7, 11, 2, 2, 580, 581, 5, 20, 11, 2, 581, 59, 3, 2, 2, 2, 582, 587, 5, 66, 34, 2, 583, 587, 5, 68, 35, 2, 584, 587, 5, 70, 36, 2, 585, 587, 5, 72, 37, 2, 586, 582, 3, 2, 2, 2, 586, 583, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 586, 585, 3, 2, 2, 2, 587, 61, 3, 2, 2, 2, 588, 589, 7, 111, 2, 2, 589, 590, 7, 129, 2, 2, 590, 591, 7, 176, 2, 2, 591, 592, 7, 5, 2, 2, 592, 593, 5, 322, 162, 2, 593, 63, 3, 2, 2, 2, 594, 599, 5, 84, 43, 2, 595, 599, 5, 80, 41, 2, 596, 599, 5, 86, 44, 2, 597, 599, 5, 82, 42, 2, 598, 594, 3, 2, 2, 2, 598, 595, 3, 2, 2, 2, 598, 596, 3, 2, 2, 2, 598, 597, 3, 2, 2, 2, 599, 65, 3, 2, 2, 2, 600, 601, 7, 111, 2, 2, 601, 602, 7, 88, 2, 2, 602, 603, 7, 81, 2, 2, 603, 604, 5, 322, 162, 2, 604, 67, 3, 2, 2, 2, 605, 606, 7, 111, 2, 2, 606, 607, 7, 16, 2, 2, 607, 608, 9, 2, 2, 2, 608, 69, 3, 2, 2, 2, 609, 610, 7, 111, 2, 2, 610, 611, 7, 88, 2, 2, 611, 612, 7, 66, 2, 2, 612, 613, 7, 73, 2, 2, 613, 614, 9, 3, 2, 2, 614, 71, 3, 2, 2, 2, 615, 620, 7, 111, 2, 2, 616, 617, 7, 18, 2, 2, 617, 621, 5, 74, 38, 2, 618, 619, 7, 88, 2, 2, 619, 621, 7, 18, 2, 2, 620, 616, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 621, 628, 3, 2, 2, 2, 622, 623, 5, 76, 39, 2, 623, 624, 7, 5, 2, 2, 624, 625, 5, 324, 163, 2, 625, 627, 3, 2, 2, 2, 626, 622, 3, 2, 2, 2, 627, 630, 3, 2, 2, 2, 628, 626, 3, 2, 2, 2, 628, 629, 3, 2, 2, 2, 629, 73, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 631, 634, 7, 176, 2, 2, 632, 634, 5, 326, 164, 2, 633, 631, 3, 2, 2, 2, 633, 632, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 637, 7, 19, 2, 2, 636, 633, 3, 2, 2, 2, 636, 637, 3, 2, 2, 2, 637, 640, 3, 2, 2, 2, 638, 641, 7, 176, 2, 2, 639, 641, 5, 326, 164, 2, 640, 638, 3, 2, 2, 2, 640, 639, 3, 2, 2, 2, 641, 75, 3, 2, 2, 2, 642, 643, 9, 4, 2, 2, 643, 77, 3, 2, 2, 2, 644, 645, 7, 127, 2, 2, 645, 649, 7, 4, 2, 2, 646, 647, 7, 129, 2, 2, 647, 648, 7, 176, 2, 2, 648, 650, 7, 5, 2, 2, 649, 646, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 661, 5, 322, 162, 2, 652, 653, 7, 71, 2, 2, 653, 658, 5, 322, 162, 2, 654, 655, 7, 15, 2, 2, 655, 657, 5, 322, 162, 2, 656, 654, 3, 2, 2, 2, 657, 660, 3, 2, 2, 2, 658, 656, 3, 2, 2, 2, 658, 659, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 661, 652, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 79, 3, 2, 2, 2, 663, 664, 7, 111, 2, 2, 664, 665, 5, 52, 27, 2, 665, 666, 7, 114, 2, 2, 666, 669, 5, 194, 98, 2, 667, 668, 7, 70, 2, 2, 668, 670, 5, 304, 153, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 678, 3, 2, 2, 2, 671, 672, 7, 7, 2, 2, 672, 679, 5, 96, 49, 2, 673, 676, 7, 30, 2, 2, 674, 675, 7, 7, 2, 2, 675, 677, 5, 96, 49, 2, 676, 674, 3, 2, 2, 2, 676, 677, 3, 2, 2, 2, 677, 679, 3, 2, 2, 2, 678, 671, 3, 2, 2, 2, 678, 673, 3, 2, 2, 2, 679, 81, 3, 2, 2, 2, 680, 681, 7, 111, 2, 2, 681, 682, 7, 112, 2, 2, 682, 685, 7, 113, 2, 2, 683, 684, 7, 70, 2, 2, 684, 686, 5, 304, 153, 2, 685, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 694, 3, 2, 2, 2, 687, 688, 7, 7, 2, 2, 688, 695, 5, 96, 49, 2, 689, 692, 7, 30, 2, 2, 690, 691, 7, 7, 2, 2, 691, 693, 5, 96, 49, 2, 692, 690, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 695, 3, 2, 2, 2, 694, 687, 3, 2, 2, 2, 694, 689, 3, 2, 2, 2, 695, 83, 3, 2, 2, 2, 696, 697, 7, 111, 2, 2, 697, 698, 5, 52, 27, 2, 698, 699, 7, 31, 2, 2, 699, 700, 5, 74, 38, 2, 700, 702, 7, 10, 2, 2, 701, 703, 5, 90, 46, 2, 702, 701, 3, 2, 2, 2, 702, 703, 3, 2, 2, 2, 703, 704, 3, 2, 2, 2, 704, 707, 7, 11, 2, 2, 705, 706, 7, 70, 2, 2, 706, 708, 5, 304, 153, 2, 707, 705, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, 714, 3, 2, 2, 2, 709, 710, 7, 8, 2, 2, 710, 711, 5, 18, 10, 2, 711, 712, 7, 9, 2, 2, 712, 715, 3, 2, 2, 2, 713, 715, 7, 30, 2, 2, 714, 709, 3, 2, 2, 2, 714, 713, 3, 2, 2, 2, 715, 85, 3, 2, 2, 2, 716, 717, 7, 111, 2, 2, 717, 718, 7, 108, 2, 2, 718, 719, 5, 74, 38, 2, 719, 721, 7, 70, 2, 2, 720, 722, 5, 88, 45, 2, 721, 720, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 723, 3, 2, 2, 2, 723, 724, 5, 96, 49, 2, 724, 87, 3, 2, 2, 2, 725, 726, 7, 32, 2, 2, 726, 732, 7, 33, 2, 2, 727, 728, 7, 32, 2, 2, 728, 732, 7, 34, 2, 2, 729, 730, 7, 124, 2, 2, 730, 732, 7, 128, 2, 2, 731, 725, 3, 2, 2, 2, 731, 727, 3, 2, 2, 2, 731, 729, 3, 2, 2, 2, 732, 89, 3, 2, 2, 2, 733, 738, 5, 92, 47, 2, 734, 735, 7, 15, 2, 2, 735, 737, 5, 92, 47, 2, 736, 734, 3, 2, 2, 2, 737, 740, 3, 2, 2, 2, 738, 736, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 91, 3, 2, 2, 2, 740, 738, 3, 2, 2, 2, 741, 742, 7, 6, 2, 2, 742, 745, 5, 74, 38, 2, 743, 744, 7, 70, 2, 2, 744, 746, 5, 304, 153, 2, 745, 743, 3, 2, 2, 2, 745, 746, 3, 2, 2, 2, 746, 93, 3, 2, 2, 2, 747, 752, 5, 96, 49, 2, 748, 749, 7, 15, 2, 2, 749, 751, 5, 96, 49, 2, 750, 748, 3, 2, 2, 2, 751, 754, 3, 2, 2, 2, 752, 750, 3, 2, 2, 2, 752, 753, 3, 2, 2, 2, 753, 95, 3, 2, 2, 2, 754, 752, 3, 2, 2, 2, 755, 762, 5, 98, 50, 2, 756, 762, 5, 100, 51, 2, 757, 762, 5, 126, 64, 2, 758, 762, 5, 130, 66, 2, 759, 762, 5, 134, 68, 2, 760, 762, 5, 136, 69, 2, 761, 755, 3, 2, 2, 2, 761, 756, 3, 2, 2, 2, 761, 757, 3, 2, 2, 2, 761, 758, 3, 2, 2, 2, 761, 759, 3, 2, 2, 2, 761, 760, 3, 2, 2, 2, 762, 97, 3, 2, 2, 2, 763, 772, 5, 122, 62, 2, 764, 772, 5, 140, 71, 2, 765, 772, 5, 216, 109, 2, 766, 772, 5, 218, 110, 2, 767, 772, 5, 220, 111, 2, 768, 772, 5, 222, 112, 2, 769, 772, 5, 224, 113, 2, 770, 772, 5, 226, 114, 2, 771, 763, 3, 2, 2, 2, 771, 764, 3, 2, 2, 2, 771, 765, 3, 2, 2, 2, 771, 766, 3, 2, 2, 2, 771, 767, 3, 2, 2, 2, 771, 768, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 771, 770, 3, 2, 2, 2, 772, 99, 3, 2, 2, 2, 773, 776, 5, 102, 52, 2, 774, 776, 5, 106, 54, 2, 775, 773, 3, 2, 2, 2, 775, 774, 3, 2, 2, 2, 776, 785, 3, 2, 2, 2, 777, 784, 5, 102, 52, 2, 778, 784, 5, 106, 54, 2, 779, 784, 5, 110, 56, 2, 780, 784, 5, 112, 57, 2, 781, 784, 5, 116, 59, 2, 782, 784, 5, 120, 61, 2, 783, 777, 3, 2, 2, 2, 783, 778, 3, 2, 2, 2, 783, 779, 3, 2, 2, 2, 783, 780, 3, 2, 2, 2, 783, 781, 3, 2, 2, 2, 783, 782, 3, 2, 2, 2, 784, 787, 3, 2, 2, 2, 785, 783, 3, 2, 2, 2, 785, 786, 3, 2, 2, 2, 786, 788, 3, 2, 2, 2, 787, 785, 3, 2, 2, 2, 788, 789, 7, 67, 2, 2, 789, 790, 5, 96, 49, 2, 790, 101, 3, 2, 2, 2, 791, 792, 7, 61, 2, 2, 792, 797, 5, 104, 53, 2, 793, 794, 7, 15, 2, 2, 794, 796, 5, 104, 53, 2, 795, 793, 3, 2, 2, 2, 796, 799, 3, 2, 2, 2, 797, 795, 3, 2, 2, 2, 797, 798, 3, 2, 2, 2, 798, 103, 3, 2, 2, 2, 799, 797, 3, 2, 2, 2, 800, 803, 5, 194, 98, 2, 801, 802, 7, 70, 2, 2, 802, 804, 5, 304, 153, 2, 803, 801, 3, 2, 2, 2, 803, 804, 3, 2, 2, 2, 804, 807, 3, 2, 2, 2, 805, 806, 7, 72, 2, 2, 806, 808, 7, 73, 2, 2, 807, 805, 3, 2, 2, 2, 807, 808, 3, 2, 2, 2, 808, 811, 3, 2, 2, 2, 809, 810, 7, 71, 2, 2, 810, 812, 5, 194, 98, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 813, 3, 2, 2, 2, 813, 814, 7, 69, 2, 2, 814, 815, 5, 96, 49, 2, 815, 105, 3, 2, 2, 2, 816, 817, 7, 62, 2, 2, 817, 822, 5, 108, 55, 2, 818, 819, 7, 15, 2, 2, 819, 821, 5, 108, 55, 2, 820, 818, 3, 2, 2, 2, 821, 824, 3, 2, 2, 2, 822, 820, 3, 2, 2, 2, 822, 823, 3, 2, 2, 2, 823, 107, 3, 2, 2, 2, 824, 822, 3, 2, 2, 2, 825, 828, 5, 194, 98, 2, 826, 827, 7, 70, 2, 2, 827, 829, 5, 304, 153, 2, 828, 826, 3, 2, 2, 2, 828, 829, 3, 2, 2, 2, 829, 830, 3, 2, 2, 2, 830, 831, 7, 7, 2, 2, 831, 832, 5, 96, 49, 2, 832, 109, 3, 2, 2, 2, 833, 834, 7, 63, 2, 2, 834, 835, 5, 96, 49, 2, 835, 111, 3, 2, 2, 2, 836, 837, 7, 64, 2, 2, 837, 838, 7, 65, 2, 2, 838, 843, 5, 114, 58, 2, 839, 840, 7, 15, 2, 2, 840, 842, 5, 114, 58, 2, 841, 839, 3, 2, 2, 2, 842, 845, 3, 2, 2, 2, 843, 841, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 113, 3, 2, 2, 2, 845, 843, 3, 2, 2, 2, 846, 853, 5, 194, 98, 2, 847, 848, 7, 70, 2, 2, 848, 850, 5, 304, 153, 2, 849, 847, 3, 2, 2, 2, 849, 850, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 852, 7, 7, 2, 2, 852, 854, 5, 96, 49, 2, 853, 849, 3, 2, 2, 2, 853, 854, 3, 2, 2, 2, 854, 857, 3, 2, 2, 2, 855, 856, 7, 81, 2, 2, 856, 858, 5, 322, 162, 2, 857, 855, 3, 2, 2, 2, 857, 858, 3, 2, 2, 2, 858, 115, 3, 2, 2, 2, 859, 860, 7, 66, 2, 2, 860, 865, 7, 65, 2, 2, 861, 862, 7, 75, 2, 2, 862, 863, 7, 66, 2, 2, 863, 865, 7, 65, 2, 2, 864, 859, 3, 2, 2, 2, 864, 861, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 871, 5, 118, 60, 2, 867, 868, 7, 15, 2, 2, 868, 870, 5, 118, 60, 2, 869, 867, 3, 2, 2, 2, 870, 873, 3, 2, 2, 2, 871, 869, 3, 2, 2, 2, 871, 872, 3, 2, 2, 2, 872, 117, 3, 2, 2, 2, 873, 871, 3, 2, 2, 2, 874, 877, 5, 96, 49, 2, 875, 878, 7, 76, 2, 2, 876, 878, 7, 77, 2, 2, 877, 875, 3, 2, 2, 2, 877, 876, 3, 2, 2, 2, 877, 878, 3, 2, 2, 2, 878, 884, 3, 2, 2, 2, 879, 882, 7, 73, 2, 2, 880, 883, 7, 82, 2, 2, 881, 883, 7, 83, 2, 2, 882, 880, 3, 2, 2, 2, 882, 881, 3, 2, 2, 2, 883, 885, 3, 2, 2, 2, 884, 879, 3, 2, 2, 2, 884, 885, 3, 2, 2, 2, 885, 888, 3, 2, 2, 2, 886, 887, 7, 81, 2, 2, 887, 889, 5, 322, 162, 2, 888, 886, 3, 2, 2, 2, 888, 889, 3, 2, 2, 2, 889, 119, 3, 2, 2, 2, 890, 891, 7, 74, 2, 2, 891, 892, 5, 194, 98, 2, 892, 121, 3, 2, 2, 2, 893, 896, 7, 78, 2, 2, 894, 896, 7, 79, 2, 2, 895, 893, 3, 2, 2, 2, 895, 894, 3, 2, 2, 2, 896, 897, 3, 2, 2, 2, 897, 902, 5, 124, 63, 2, 898, 899, 7, 15, 2, 2, 899, 901, 5, 124, 63, 2, 900, 898, 3, 2, 2, 2, 901, 904, 3, 2, 2, 2, 902, 900, 3, 2, 2, 2, 902, 903, 3, 2, 2, 2, 903, 905, 3, 2, 2, 2, 904, 902, 3, 2, 2, 2, 905, 906, 7, 80, 2, 2, 906, 907, 5, 96, 49, 2, 907, 123, 3, 2, 2, 2, 908, 911, 5, 194, 98, 2, 909, 910, 7, 70, 2, 2, 910, 912, 5, 304, 153, 2, 911, 909, 3, 2, 2, 2, 911, 912, 3, 2, 2, 2, 912, 913, 3, 2, 2, 2, 913, 914, 7, 69, 2, 2, 914, 915, 5, 96, 49, 2, 915, 125, 3, 2, 2, 2, 916, 917, 7, 84, 2, 2, 917, 918, 7, 10, 2, 2, 918, 919, 5, 94, 48, 2, 919, 921, 7, 11, 2, 2, 920, 922, 5, 128, 65, 2, 921, 920, 3, 2, 2, 2, 922, 923, 3, 2, 2, 2, 923, 921, 3, 2, 2, 2, 923, 924, 3, 2, 2, 2, 924, 925, 3, 2, 2, 2, 925, 926, 7, 88, 2, 2, 926, 927, 7, 67, 2, 2, 927, 928, 5, 96, 49, 2, 928, 127, 3, 2, 2, 2, 929, 930, 7, 85, 2, 2, 930, 932, 5, 96, 49, 2, 931, 929, 3, 2, 2, 2, 932, 933, 3, 2, 2, 2, 933, 931, 3, 2, 2, 2, 933, 934, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 936, 7, 67, 2, 2, 936, 937, 5, 96, 49, 2, 937, 129, 3, 2, 2, 2, 938, 939, 7, 91, 2, 2, 939, 940, 7, 10, 2, 2, 940, 941, 5, 94, 48, 2, 941, 943, 7, 11, 2, 2, 942, 944, 5, 132, 67, 2, 943, 942, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 943, 3, 2, 2, 2, 945, 946, 3, 2, 2, 2, 946, 947, 3, 2, 2, 2, 947, 949, 7, 88, 2, 2, 948, 950, 5, 194, 98, 2, 949, 948, 3, 2, 2, 2, 949, 950, 3, 2, 2, 2, 950, 951, 3, 2, 2, 2, 951, 952, 7, 67, 2, 2, 952, 953, 5, 96, 49, 2, 953, 131, 3, 2, 2, 2, 954, 958, 7, 85, 2, 2, 955, 956, 5, 194, 98, 2, 956, 957, 7, 70, 2, 2, 957, 959, 3, 2, 2, 2, 958, 955, 3, 2, 2, 2, 958, 959, 3, 2, 2, 2, 959, 960, 3, 2, 2, 2, 960, 965, 5, 304, 153, 2, 961, 962, 7, 13, 2, 2, 962, 964, 5, 304, 153, 2, 963, 961, 3, 2, 2, 2, 964, 967, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 968, 3, 2, 2, 2, 967, 965, 3, 2, 2, 2, 968, 969, 7, 67, 2, 2, 969, 970, 5, 96, 49, 2, 970, 133, 3, 2, 2, 2, 971, 972, 7, 68, 2, 2, 972, 973, 7, 10, 2, 2, 973, 974, 5, 94, 48, 2, 974, 975, 7, 11, 2, 2, 975, 976, 7, 89, 2, 2, 976, 977, 5, 96, 49, 2, 977, 978, 7, 90, 2, 2, 978, 979, 5, 96, 49, 2, 979, 135, 3, 2, 2, 2, 980, 981, 7, 86, 2, 2, 981, 982, 7, 8, 2, 2, 982, 983, 5, 94, 48, 2, 983, 985, 7, 9, 2, 2, 984, 986, 5, 138, 70, 2, 985, 984, 3, 2, 2, 2, 986, 987, 3, 2, 2, 2, 987, 985, 3, 2, 2, 2, 987, 988, 3, 2, 2, 2, 988, 137, 3, 2, 2, 2, 989, 992, 7, 87, 2, 2, 990, 993, 7, 12, 2, 2, 991, 993, 5, 74, 38, 2, 992, 990, 3, 2, 2, 2, 992, 991, 3, 2, 2, 2, 993, 1001, 3, 2, 2, 2, 994, 997, 7, 13, 2, 2, 995, 998, 7, 12, 2, 2, 996, 998, 5, 74, 38, 2, 997, 995, 3, 2, 2, 2, 997, 996, 3, 2, 2, 2, 998, 1000, 3, 2, 2, 2, 999, 994, 3, 2, 2, 2, 1000, 1003, 3, 2, 2, 2, 1001, 999, 3, 2, 2, 2, 1001, 1002, 3, 2, 2, 2, 1002, 1004, 3, 2, 2, 2, 1003, 1001, 3, 2, 2, 2, 1004, 1005, 7, 8, 2, 2, 1005, 1006, 5, 94, 48, 2, 1006, 1007, 7, 9, 2, 2, 1007, 139, 3, 2, 2, 2, 1008, 1013, 5, 142, 72, 2, 1009, 1010, 7, 92, 2, 2, 1010, 1012, 5, 142, 72, 2, 1011, 1009, 3, 2, 2, 2, 1012, 1015, 3, 2, 2, 2, 1013, 1011, 3, 2, 2, 2, 1013, 1014, 3, 2, 2, 2, 1014, 141, 3, 2, 2, 2, 1015, 1013, 3, 2, 2, 2, 1016, 1021, 5, 144, 73, 2, 1017, 1018, 7, 93, 2, 2, 1018, 1020, 5, 144, 73, 2, 1019, 1017, 3, 2, 2, 2, 1020, 1023, 3, 2, 2, 2, 1021, 1019, 3, 2, 2, 2, 1021, 1022, 3, 2, 2, 2, 1022, 143, 3, 2, 2, 2, 1023, 1021, 3, 2, 2, 2, 1024, 1026, 7, 94, 2, 2, 1025, 1024, 3, 2, 2, 2, 1025, 1026, 3, 2, 2, 2, 1026, 1027, 3, 2, 2, 2, 1027, 1028, 5, 146, 74, 2, 1028, 145, 3, 2, 2, 2, 1029, 1032, 5, 148, 75, 2, 1030, 1031, 9, 5, 2, 2, 1031, 1033, 5, 148, 75, 2, 1032, 1030, 3, 2, 2, 2, 1032, 1033, 3, 2, 2, 2, 1033, 147, 3, 2, 2, 2, 1034, 1039, 5, 150, 76, 2, 1035, 1036, 7, 46, 2, 2, 1036, 1038, 5, 150, 76, 2, 1037, 1035, 3, 2, 2, 2, 1038, 1041, 3, 2, 2, 2, 1039, 1037, 3, 2, 2, 2, 1039, 1040, 3, 2, 2, 2, 1040, 149, 3, 2, 2, 2, 1041, 1039, 3, 2, 2, 2, 1042, 1045, 5, 152, 77, 2, 1043, 1044, 7, 95, 2, 2, 1044, 1046, 5, 152, 77, 2, 1045, 1043, 3, 2, 2, 2, 1045, 1046, 3, 2, 2, 2, 1046, 151, 3, 2, 2, 2, 1047, 1052, 5, 154, 78, 2, 1048, 1049, 9, 6, 2, 2, 1049, 1051, 5, 154, 78, 2, 1050, 1048, 3, 2, 2, 2, 1051, 1054, 3, 2, 2, 2, 1052, 1050, 3, 2, 2, 2, 1052, 1053, 3, 2, 2, 2, 1053, 153, 3, 2, 2, 2, 1054, 1052, 3, 2, 2, 2, 1055, 1060, 5, 156, 79, 2, 1056, 1057, 9, 7, 2, 2, 1057, 1059, 5, 156, 79, 2, 1058, 1056, 3, 2, 2, 2, 1059, 1062, 3, 2, 2, 2, 1060, 1058, 3, 2, 2, 2, 1060, 1061, 3, 2, 2, 2, 1061, 155, 3, 2, 2, 2, 1062, 1060, 3, 2, 2, 2, 1063, 1067, 5, 158, 80, 2, 1064, 1065, 7, 96, 2, 2, 1065, 1066, 7, 97, 2, 2, 1066, 1068, 5, 304, 153, 2, 1067, 1064, 3, 2, 2, 2, 1067, 1068, 3, 2, 2, 2, 1068, 157, 3, 2, 2, 2, 1069, 1073, 5, 160, 81, 2, 1070, 1071, 7, 99, 2, 2, 1071, 1072, 7, 98, 2, 2, 1072, 1074, 5, 304, 153, 2, 1073, 1070, 3, 2, 2, 2, 1073, 1074, 3, 2, 2, 2, 1074, 159, 3, 2, 2, 2, 1075, 1079, 5, 162, 82, 2, 1076, 1077, 7, 100, 2, 2, 1077, 1078, 7, 70, 2, 2, 1078, 1080, 5, 304, 153, 2, 1079, 1076, 3, 2, 2, 2, 1079, 1080, 3, 2, 2, 2, 1080, 161, 3, 2, 2, 2, 1081, 1085, 5, 164, 83, 2, 1082, 1083, 7, 102, 2, 2, 1083, 1084, 7, 70, 2, 2, 1084, 1086, 5, 316, 159, 2, 1085, 1082, 3, 2, 2, 2, 1085, 1086, 3, 2, 2, 2, 1086, 163, 3, 2, 2, 2, 1087, 1091, 5, 166, 84, 2, 1088, 1089, 7, 101, 2, 2, 1089, 1090, 7, 70, 2, 2, 1090, 1092, 5, 316, 159, 2, 1091, 1088, 3, 2, 2, 2, 1091, 1092, 3, 2, 2, 2, 1092, 165, 3, 2, 2, 2, 1093, 1102, 5, 170, 86, 2, 1094, 1095, 7, 5, 2, 2, 1095, 1096, 7, 44, 2, 2, 1096, 1097, 3, 2, 2, 2, 1097, 1098, 5, 168, 85, 2, 1098, 1099, 5, 206, 104, 2, 1099, 1101, 3, 2, 2, 2, 1100, 1094, 3, 2, 2, 2, 1101, 1104, 3, 2, 2, 2, 1102, 1100, 3, 2, 2, 2, 1102, 1103, 3, 2, 2, 2, 1103, 167, 3, 2, 2, 2, 1104, 1102, 3, 2, 2, 2, 1105, 1109, 5, 74, 38, 2, 1106, 1109, 5, 194, 98, 2, 1107, 1109, 5, 196, 99, 2, 1108, 1105, 3, 2, 2, 2, 1108, 1106, 3, 2, 2, 2, 1108, 1107, 3, 2, 2, 2, 1109, 169, 3, 2, 2, 2, 1110, 1112, 9, 6, 2, 2, 1111, 1110, 3, 2, 2, 2, 1112, 1115, 3, 2, 2, 2, 1113, 1111, 3, 2, 2, 2, 1113, 1114, 3, 2, 2, 2, 1114, 1116, 3, 2, 2, 2, 1115, 1113, 3, 2, 2, 2, 1116, 1117, 5, 172, 87, 2, 1117, 171, 3, 2, 2, 2, 1118, 1122, 5, 178, 90, 2, 1119, 1122, 5, 174, 88, 2, 1120, 1122, 5, 176, 89, 2, 1121, 1118, 3, 2, 2, 2, 1121, 1119, 3, 2, 2, 2, 1121, 1120, 3, 2, 2, 2, 1122, 173, 3, 2, 2, 2, 1123, 1124, 7, 109, 2, 2, 1124, 1125, 7, 108, 2, 2, 1125, 1126, 5, 304, 153, 2, 1126, 1127, 7, 8, 2, 2, 1127, 1128, 5, 94, 48, 2, 1128, 1129, 7, 9, 2, 2, 1129, 175, 3, 2, 2, 2, 1130, 1131, 7, 110, 2, 2, 1131, 1132, 7, 108, 2, 2, 1132, 1133, 5, 304, 153, 2, 1133, 1134, 7, 8, 2, 2, 1134, 1135, 5, 94, 48, 2, 1135, 1136, 7, 9, 2, 2, 1136, 177, 3, 2, 2, 2, 1137, 1142, 5, 232, 117, 2, 1138, 1139, 7, 52, 2, 2, 1139, 1141, 5, 232, 117, 2, 1140, 1138, 3, 2, 2, 2, 1141, 1144, 3, 2, 2, 2, 1142, 1140, 3, 2, 2, 2, 1142, 1143, 3, 2, 2, 2, 1143, 179, 3, 2, 2, 2, 1144, 1142, 3, 2, 2, 2, 1145, 1153, 5, 190, 96, 2, 1146, 1152, 5, 182, 92, 2, 1147, 1152, 5, 186, 94, 2, 1148, 1152, 5, 188, 95, 2, 1149, 1152, 5, 184, 93, 2, 1150, 1152, 5, 206, 104, 2, 1151, 1146, 3, 2, 2, 2, 1151, 1147, 3, 2, 2, 2, 1151, 1148, 3, 2, 2, 2, 1151, 1149, 3, 2, 2, 2, 1151, 1150, 3, 2, 2, 2, 1152, 1155, 3, 2, 2, 2, 1153, 1151, 3, 2, 2, 2, 1153, 1154, 3, 2, 2, 2, 1154, 181, 3, 2, 2, 2, 1155, 1153, 3, 2, 2, 2, 1156, 1157, 7, 53, 2, 2, 1157, 1158, 7, 53, 2, 2, 1158, 1159, 5, 94, 48, 2, 1159, 1160, 7, 54, 2, 2, 1160, 1161, 7, 54, 2, 2, 1161, 183, 3, 2, 2, 2, 1162, 1163, 7, 53, 2, 2, 1163, 1164, 7, 54, 2, 2, 1164, 185, 3, 2, 2, 2, 1165, 1166, 7, 53, 2, 2, 1166, 1167, 5, 94, 48, 2, 1167, 1168, 7, 54, 2, 2, 1168, 187, 3, 2, 2, 2, 1169, 1176, 7, 55, 2, 2, 1170, 1177, 5, 326, 164, 2, 1171, 1177, 5, 324, 163, 2, 1172, 1177, 7, 176, 2, 2, 1173, 1177, 5, 196, 99, 2, 1174, 1177, 5, 194, 98, 2, 1175, 1177, 5, 198, 100, 2, 1176, 1170, 3, 2, 2, 2, 1176, 1171, 3, 2, 2, 2, 1176, 1172, 3, 2, 2, 2, 1176, 1173, 3, 2, 2, 2, 1176, 1174, 3, 2, 2, 2, 1176, 1175, 3, 2, 2, 2, 1177, 189, 3, 2, 2, 2, 1178, 1194, 7, 169, 2, 2, 1179, 1194, 7, 106, 2, 2, 1180, 1194, 7, 107, 2, 2, 1181, 1194, 7, 170, 2, 2, 1182, 1194, 5, 324, 163, 2, 1183, 1194, 5, 194, 98, 2, 1184, 1194, 5, 196, 99, 2, 1185, 1194, 5, 198, 100, 2, 1186, 1194, 5, 306, 154, 2, 1187, 1194, 5, 204, 103, 2, 1188, 1194, 5, 200, 101, 2, 1189, 1194, 5, 202, 102, 2, 1190, 1194, 5, 320, 161, 2, 1191, 1194, 5, 210, 106, 2, 1192, 1194, 5, 192, 97, 2, 1193, 1178, 3, 2, 2, 2, 1193, 1179, 3, 2, 2, 2, 1193, 1180, 3, 2, 2, 2, 1193, 1181, 3, 2, 2, 2, 1193, 1182, 3, 2, 2, 2, 1193, 1183, 3, 2, 2, 2, 1193, 1184, 3, 2, 2, 2, 1193, 1185, 3, 2, 2, 2, 1193, 1186, 3, 2, 2, 2, 1193, 1187, 3, 2, 2, 2, 1193, 1188, 3, 2, 2, 2, 1193, 1189, 3, 2, 2, 2, 1193, 1190, 3, 2, 2, 2, 1193, 1191, 3, 2, 2, 2, 1193, 1192, 3, 2, 2, 2, 1194, 191, 3, 2, 2, 2, 1195, 1196, 7, 8, 2, 2, 1196, 1197, 5, 16, 9, 2, 1197, 1198, 7, 9, 2, 2, 1198, 193, 3, 2, 2, 2, 1199, 1200, 7, 6, 2, 2, 1200, 1201, 5, 74, 38, 2, 1201, 195, 3, 2, 2, 2, 1202, 1204, 7, 10, 2, 2, 1203, 1205, 5, 94, 48, 2, 1204, 1203, 3, 2, 2, 2, 1204, 1205, 3, 2, 2, 2, 1205, 1206, 3, 2, 2, 2, 1206, 1207, 7, 11, 2, 2, 1207, 197, 3, 2, 2, 2, 1208, 1209, 7, 56, 2, 2, 1209, 199, 3, 2, 2, 2, 1210, 1211, 7, 17, 2, 2, 1211, 1212, 7, 8, 2, 2, 1212, 1213, 5, 94, 48, 2, 1213, 1214, 7, 9, 2, 2, 1214, 201, 3, 2, 2, 2, 1215, 1216, 7, 105, 2, 2, 1216, 1217, 7, 8, 2, 2, 1217, 1218, 5, 94, 48, 2, 1218, 1219, 7, 9, 2, 2, 1219, 203, 3, 2, 2, 2, 1220, 1221, 5, 74, 38, 2, 1221, 1222, 5, 206, 104, 2, 1222, 205, 3, 2, 2, 2, 1223, 1230, 7, 10, 2, 2, 1224, 1226, 5, 208, 105, 2, 1225, 1227, 7, 15, 2, 2, 1226, 1225, 3, 2, 2, 2, 1226, 1227, 3, 2, 2, 2, 1227, 1229, 3, 2, 2, 2, 1228, 1224, 3, 2, 2, 2, 1229, 1232, 3, 2, 2, 2, 1230, 1228, 3, 2, 2, 2, 1230, 1231, 3, 2, 2, 2, 1231, 1233, 3, 2, 2, 2, 1232, 1230, 3, 2, 2, 2, 1233, 1234, 7, 11, 2, 2, 1234, 207, 3, 2, 2, 2, 1235, 1238, 5, 96, 49, 2, 1236, 1238, 7, 168, 2, 2, 1237, 1235, 3, 2, 2, 2, 1237, 1236, 3, 2, 2, 2, 1238, 209, 3, 2, 2, 2, 1239, 1242, 5, 212, 107, 2, 1240, 1242, 5, 214, 108, 2, 1241, 1239, 3, 2, 2, 2, 1241, 1240, 3, 2, 2, 2, 1242, 211, 3, 2, 2, 2, 1243, 1244, 5, 74, 38, 2, 1244, 1245, 7, 57, 2, 2, 1245, 1246, 7, 170, 2, 2, 1246, 213, 3, 2, 2, 2, 1247, 1248, 5, 52, 27, 2, 1248, 1249, 7, 31, 2, 2, 1249, 1251, 7, 10, 2, 2, 1250, 1252, 5, 90, 46, 2, 1251, 1250, 3, 2, 2, 2, 1251, 1252, 3, 2, 2, 2, 1252, 1253, 3, 2, 2, 2, 1253, 1256, 7, 11, 2, 2, 1254, 1255, 7, 70, 2, 2, 1255, 1257, 5, 304, 153, 2, 1256, 1254, 3, 2, 2, 2, 1256, 1257, 3, 2, 2, 2, 1257, 1258, 3, 2, 2, 2, 1258, 1259, 7, 8, 2, 2, 1259, 1260, 5, 18, 10, 2, 1260, 1261, 7, 9, 2, 2, 1261, 215, 3, 2, 2, 2, 1262, 1263, 7, 115, 2, 2, 1263, 1264, 7, 124, 2, 2, 1264, 1265, 5, 96, 49, 2, 1265, 1266, 7, 122, 2, 2, 1266, 1270, 5, 96, 49, 2, 1267, 1268, 7, 71, 2, 2, 1268, 1269, 7, 126, 2, 2, 1269, 1271, 5, 96, 49, 2, 1270, 1267, 3, 2, 2, 2, 1270, 1271, 3, 2, 2, 2, 1271, 1286, 3, 2, 2, 2, 1272, 1273, 7, 115, 2, 2, 1273, 1274, 7, 124, 2, 2, 1274, 1279, 5, 318, 160, 2, 1275, 1276, 7, 15, 2, 2, 1276, 1278, 5, 318, 160, 2, 1277, 1275, 3, 2, 2, 2, 1278, 1281, 3, 2, 2, 2, 1279, 1277, 3, 2, 2, 2, 1279, 1280, 3, 2, 2, 2, 1280, 1282, 3, 2, 2, 2, 1281, 1279, 3, 2, 2, 2, 1282, 1283, 7, 122, 2, 2, 1283, 1284, 5, 96, 49, 2, 1284, 1286, 3, 2, 2, 2, 1285, 1262, 3, 2, 2, 2, 1285, 1272, 3, 2, 2, 2, 1286, 217, 3, 2, 2, 2, 1287, 1288, 7, 116, 2, 2, 1288, 1289, 7, 124, 2, 2, 1289, 1290, 5, 228, 115, 2, 1290, 219, 3, 2, 2, 2, 1291, 1292, 7, 117, 2, 2, 1292, 1293, 7, 124, 2, 2, 1293, 1294, 5, 228, 115, 2, 1294, 1295, 7, 70, 2, 2, 1295, 1296, 5, 96, 49, 2, 1296, 221, 3, 2, 2, 2, 1297, 1298, 7, 118, 2, 2, 1298, 1299, 7, 123, 2, 2, 1299, 1300, 7, 97, 2, 2, 1300, 1301, 7, 124, 2, 2, 1301, 1302, 5, 228, 115, 2, 1302, 1303, 7, 125, 2, 2, 1303, 1304, 5, 96, 49, 2, 1304, 223, 3, 2, 2, 2, 1305, 1306, 7, 119, 2, 2, 1306, 1311, 5, 230, 116, 2, 1307, 1308, 7, 15, 2, 2, 1308, 1310, 5, 230, 116, 2, 1309, 1307, 3, 2, 2, 2, 1310, 1313, 3, 2, 2, 2, 1311, 1309, 3, 2, 2, 2, 1311, 1312, 3, 2, 2, 2, 1312, 1314, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1314, 1315, 7, 120, 2, 2, 1315, 1316, 5, 96, 49, 2, 1316, 1317, 7, 67, 2, 2, 1317, 1318, 5, 96, 49, 2, 1318, 225, 3, 2, 2, 2, 1319, 1320, 7, 121, 2, 2, 1320, 1321, 7, 124, 2, 2, 1321, 1322, 5, 96, 49, 2, 1322, 1323, 7, 122, 2, 2, 1323, 1324, 5, 96, 49, 2, 1324, 227, 3, 2, 2, 2, 1325, 1328, 5, 190, 96, 2, 1326, 1329, 5, 182, 92, 2, 1327, 1329, 5, 188, 95, 2, 1328, 1326, 3, 2, 2, 2, 1328, 1327, 3, 2, 2, 2, 1329, 1330, 3, 2, 2, 2, 1330, 1328, 3, 2, 2, 2, 1330, 1331, 3, 2, 2, 2, 1331, 229, 3, 2, 2, 2, 1332, 1333, 5, 194, 98, 2, 1333, 1334, 7, 7, 2, 2, 1334, 1335, 5, 96, 49, 2, 1335, 231, 3, 2, 2, 2, 1336, 1338, 7, 131, 2, 2, 1337, 1339, 5, 234, 118, 2, 1338, 1337, 3, 2, 2, 2, 1338, 1339, 3, 2, 2, 2, 1339, 1344, 3, 2, 2, 2, 1340, 1341, 7, 132, 2, 2, 1341, 1344, 5, 234, 118, 2, 1342, 1344, 5, 234, 118, 2, 1343, 1336, 3, 2, 2, 2, 1343, 1340, 3, 2, 2, 2, 1343, 1342, 3, 2, 2, 2, 1344, 233, 3, 2, 2, 2, 1345, 1350, 5, 236, 119, 2, 1346, 1347, 9, 8, 2, 2, 1347, 1349, 5, 236, 119, 2, 1348, 1346, 3, 2, 2, 2, 1349, 1352, 3, 2, 2, 2, 1350, 1348, 3, 2, 2, 2, 1350, 1351, 3, 2, 2, 2, 1351, 235, 3, 2, 2, 2, 1352, 1350, 3, 2, 2, 2, 1353, 1356, 5, 180, 91, 2, 1354, 1356, 5, 238, 120, 2, 1355, 1353, 3, 2, 2, 2, 1355, 1354, 3, 2, 2, 2, 1356, 237, 3, 2, 2, 2, 1357, 1360, 5, 246, 124, 2, 1358, 1360, 5, 240, 121, 2, 1359, 1357, 3, 2, 2, 2, 1359, 1358, 3, 2, 2, 2, 1360, 1361, 3, 2, 2, 2, 1361, 1362, 5, 262, 132, 2, 1362, 239, 3, 2, 2, 2, 1363, 1364, 5, 242, 122, 2, 1364, 1365, 5, 252, 127, 2, 1365, 1368, 3, 2, 2, 2, 1366, 1368, 5, 244, 123, 2, 1367, 1363, 3, 2, 2, 2, 1367, 1366, 3, 2, 2, 2, 1368, 241, 3, 2, 2, 2, 1369, 1370, 9, 9, 2, 2, 1370, 1371, 7, 19, 2, 2, 1371, 1372, 7, 19, 2, 2, 1372, 243, 3, 2, 2, 2, 1373, 1375, 7, 133, 2, 2, 1374, 1373, 3, 2, 2, 2, 1374, 1375, 3, 2, 2, 2, 1375, 1376, 3, 2, 2, 2, 1376, 1377, 5, 252, 127, 2, 1377, 245, 3, 2, 2, 2, 1378, 1379, 5, 248, 125, 2, 1379, 1380, 5, 252, 127, 2, 1380, 1383, 3, 2, 2, 2, 1381, 1383, 5, 250, 126, 2, 1382, 1378, 3, 2, 2, 2, 1382, 1381, 3, 2, 2, 2, 1383, 247, 3, 2, 2, 2, 1384, 1385, 9, 10, 2, 2, 1385, 1386, 7, 19, 2, 2, 1386, 1387, 7, 19, 2, 2, 1387, 249, 3, 2, 2, 2, 1388, 1389, 7, 58, 2, 2, 1389, 251, 3, 2, 2, 2, 1390, 1393, 5, 254, 128, 2, 1391, 1393, 5, 264, 133, 2, 1392, 1390, 3, 2, 2, 2, 1392, 1391, 3, 2, 2, 2, 1393, 253, 3, 2, 2, 2, 1394, 1397, 5, 74, 38, 2, 1395, 1397, 5, 256, 129, 2, 1396, 1394, 3, 2, 2, 2, 1396, 1395, 3, 2, 2, 2, 1397, 255, 3, 2, 2, 2, 1398, 1402, 7, 12, 2, 2, 1399, 1402, 5, 258, 130, 2, 1400, 1402, 5, 260, 131, 2, 1401, 1398, 3, 2, 2, 2, 1401, 1399, 3, 2, 2, 2, 1401, 1400, 3, 2, 2, 2, 1402, 257, 3, 2, 2, 2, 1403, 1404, 7, 176, 2, 2, 1404, 1405, 7, 19, 2, 2, 1405, 1406, 7, 12, 2, 2, 1406, 259, 3, 2, 2, 2, 1407, 1408, 7, 12, 2, 2, 1408, 1409, 7, 19, 2, 2, 1409, 1410, 7, 176, 2, 2, 1410, 261, 3, 2, 2, 2, 1411, 1413, 5, 186, 94, 2, 1412, 1411, 3, 2, 2, 2, 1413, 1416, 3, 2, 2, 2, 1414, 1412, 3, 2, 2, 2, 1414, 1415, 3, 2, 2, 2, 1415, 263, 3, 2, 2, 2, 1416, 1414, 3, 2, 2, 2, 1417, 1429, 5, 270, 136, 2, 1418, 1429, 5, 288, 145, 2, 1419, 1429, 5, 280, 141, 2, 1420, 1429, 5, 292, 147, 2, 1421, 1429, 5, 284, 143, 2, 1422, 1429, 5, 278, 140, 2, 1423, 1429, 5, 274, 138, 2, 1424, 1429, 5, 272, 137, 2, 1425, 1429, 5, 276, 139, 2, 1426, 1429, 5, 268, 135, 2, 1427, 1429, 5, 266, 134, 2, 1428, 1417, 3, 2, 2, 2, 1428, 1418, 3, 2, 2, 2, 1428, 1419, 3, 2, 2, 2, 1428, 1420, 3, 2, 2, 2, 1428, 1421, 3, 2, 2, 2, 1428, 1422, 3, 2, 2, 2, 1428, 1423, 3, 2, 2, 2, 1428, 1424, 3, 2, 2, 2, 1428, 1425, 3, 2, 2, 2, 1428, 1426, 3, 2, 2, 2, 1428, 1427, 3, 2, 2, 2, 1429, 265, 3, 2, 2, 2, 1430, 1431, 7, 146, 2, 2, 1431, 1432, 7, 10, 2, 2, 1432, 1433, 7, 11, 2, 2, 1433, 267, 3, 2, 2, 2, 1434, 1435, 7, 147, 2, 2, 1435, 1436, 7, 10, 2, 2, 1436, 1437, 7, 11, 2, 2, 1437, 269, 3, 2, 2, 2, 1438, 1439, 7, 149, 2, 2, 1439, 1442, 7, 10, 2, 2, 1440, 1443, 5, 288, 145, 2, 1441, 1443, 5, 292, 147, 2, 1442, 1440, 3, 2, 2, 2, 1442, 1441, 3, 2, 2, 2, 1442, 1443, 3, 2, 2, 2, 1443, 1444, 3, 2, 2, 2, 1444, 1445, 7, 11, 2, 2, 1445, 271, 3, 2, 2, 2, 1446, 1447, 7, 150, 2, 2, 1447, 1448, 7, 10, 2, 2, 1448, 1449, 7, 11, 2, 2, 1449, 273, 3, 2, 2, 2, 1450, 1451, 7, 160, 2, 2, 1451, 1452, 7, 10, 2, 2, 1452, 1453, 7, 11, 2, 2, 1453, 275, 3, 2, 2, 2, 1454, 1455, 7, 152, 2, 2, 1455, 1456, 7, 10, 2, 2, 1456, 1457, 7, 11, 2, 2, 1457, 277, 3, 2, 2, 2, 1458, 1459, 7, 151, 2, 2, 1459, 1462, 7, 10, 2, 2, 1460, 1463, 7, 176, 2, 2, 1461, 1463, 5, 324, 163, 2, 1462, 1460, 3, 2, 2, 2, 1462, 1461, 3, 2, 2, 2, 1462, 1463, 3, 2, 2, 2, 1463, 1464, 3, 2, 2, 2, 1464, 1465, 7, 11, 2, 2, 1465, 279, 3, 2, 2, 2, 1466, 1467, 7, 136, 2, 2, 1467, 1473, 7, 10, 2, 2, 1468, 1471, 5, 282, 142, 2, 1469, 1470, 7, 15, 2, 2, 1470, 1472, 5, 302, 152, 2, 1471, 1469, 3, 2, 2, 2, 1471, 1472, 3, 2, 2, 2, 1472, 1474, 3, 2, 2, 2, 1473, 1468, 3, 2, 2, 2, 1473, 1474, 3, 2, 2, 2, 1474, 1475, 3, 2, 2, 2, 1475, 1476, 7, 11, 2, 2, 1476, 281, 3, 2, 2, 2, 1477, 1480, 5, 296, 149, 2, 1478, 1480, 7, 12, 2, 2, 1479, 1477, 3, 2, 2, 2, 1479, 1478, 3, 2, 2, 2, 1480, 283, 3, 2, 2, 2, 1481, 1482, 7, 153, 2, 2, 1482, 1483, 7, 10, 2, 2, 1483, 1484, 5, 286, 144, 2, 1484, 1485, 7, 11, 2, 2, 1485, 285, 3, 2, 2, 2, 1486, 1487, 5, 296, 149, 2, 1487, 287, 3, 2, 2, 2, 1488, 1489, 7, 130, 2, 2, 1489, 1498, 7, 10, 2, 2, 1490, 1496, 5, 290, 146, 2, 1491, 1492, 7, 15, 2, 2, 1492, 1494, 5, 302, 152, 2, 1493, 1495, 7, 168, 2, 2, 1494, 1493, 3, 2, 2, 2, 1494, 1495, 3, 2, 2, 2, 1495, 1497, 3, 2, 2, 2, 1496, 1491, 3, 2, 2, 2, 1496, 1497, 3, 2, 2, 2, 1497, 1499, 3, 2, 2, 2, 1498, 1490, 3, 2, 2, 2, 1498, 1499, 3, 2, 2, 2, 1499, 1500, 3, 2, 2, 2, 1500, 1501, 7, 11, 2, 2, 1501, 289, 3, 2, 2, 2, 1502, 1505, 5, 298, 150, 2, 1503, 1505, 7, 12, 2, 2, 1504, 1502, 3, 2, 2, 2, 1504, 1503, 3, 2, 2, 2, 1505, 291, 3, 2, 2, 2, 1506, 1507, 7, 154, 2, 2, 1507, 1508, 7, 10, 2, 2, 1508, 1509, 5, 294, 148, 2, 1509, 1510, 7, 11, 2, 2, 1510, 293, 3, 2, 2, 2, 1511, 1512, 5, 298, 150, 2, 1512, 295, 3, 2, 2, 2, 1513, 1514, 5, 74, 38, 2, 1514, 297, 3, 2, 2, 2, 1515, 1516, 5, 74, 38, 2, 1516, 299, 3, 2, 2, 2, 1517, 1518, 5, 302, 152, 2, 1518, 301, 3, 2, 2, 2, 1519, 1520, 5, 74, 38, 2, 1520, 303, 3, 2, 2, 2, 1521, 1522, 7, 10, 2, 2, 1522, 1530, 7, 11, 2, 2, 1523, 1527, 5, 308, 155, 2, 1524, 1528, 7, 168, 2, 2, 1525, 1528, 7, 12, 2, 2, 1526, 1528, 7, 47, 2, 2, 1527, 1524, 3, 2, 2, 2, 1527, 1525, 3, 2, 2, 2, 1527, 1526, 3, 2, 2, 2, 1527, 1528, 3, 2, 2, 2, 1528, 1530, 3, 2, 2, 2, 1529, 1521, 3, 2, 2, 2, 1529, 1523, 3, 2, 2, 2, 1530, 305, 3, 2, 2, 2, 1531, 1540, 7, 8, 2, 2, 1532, 1537, 5, 318, 160, 2, 1533, 1534, 7, 15, 2, 2, 1534, 1536, 5, 318, 160, 2, 1535, 1533, 3, 2, 2, 2, 1536, 1539, 3, 2, 2, 2, 1537, 1535, 3, 2, 2, 2, 1537, 1538, 3, 2, 2, 2, 1538, 1541, 3, 2, 2, 2, 1539, 1537, 3, 2, 2, 2, 1540, 1532, 3, 2, 2, 2, 1540, 1541, 3, 2, 2, 2, 1541, 1542, 3, 2, 2, 2, 1542, 1548, 7, 9, 2, 2, 1543, 1544, 7, 59, 2, 2, 1544, 1545, 5, 94, 48, 2, 1545, 1546, 7, 60, 2, 2, 1546, 1548, 3, 2, 2, 2, 1547, 1531, 3, 2, 2, 2, 1547, 1543, 3, 2, 2, 2, 1548, 307, 3, 2, 2, 2, 1549, 1553, 5, 74, 38, 2, 1550, 1553, 7, 169, 2, 2, 1551, 1553, 5, 310, 156, 2, 1552, 1549, 3, 2, 2, 2, 1552, 1550, 3, 2, 2, 2, 1552, 1551, 3, 2, 2, 2, 1553, 309, 3, 2, 2, 2, 1554, 1557, 5, 312, 157, 2, 1555, 1557, 5, 314, 158, 2, 1556, 1554, 3, 2, 2, 2, 1556, 1555, 3, 2, 2, 2, 1557, 311, 3, 2, 2, 2, 1558, 1559, 7, 31, 2, 2, 1559, 1560, 7, 10, 2, 2, 1560, 1561, 7, 12, 2, 2, 1561, 1562, 7, 11, 2, 2, 1562, 313, 3, 2, 2, 2, 1563, 1564, 7, 31, 2, 2, 1564, 1573, 7, 10, 2, 2, 1565, 1570, 5, 304, 153, 2, 1566, 1567, 7, 15, 2, 2, 1567, 1569, 5, 304, 153, 2, 1568, 1566, 3, 2, 2, 2, 1569, 1572, 3, 2, 2, 2, 1570, 1568, 3, 2, 2, 2, 1570, 1571, 3, 2, 2, 2, 1571, 1574, 3, 2, 2, 2, 1572, 1570, 3, 2, 2, 2, 1573, 1565, 3, 2, 2, 2, 1573, 1574, 3, 2, 2, 2, 1574, 1575, 3, 2, 2, 2, 1575, 1576, 7, 11, 2, 2, 1576, 1577, 7, 70, 2, 2, 1577, 1578, 5, 304, 153, 2, 1578, 315, 3, 2, 2, 2, 1579, 1581, 5, 308, 155, 2, 1580, 1582, 7, 168, 2, 2, 1581, 1580, 3, 2, 2, 2, 1581, 1582, 3, 2, 2, 2, 1582, 317, 3, 2, 2, 2, 1583, 1586, 5, 96, 49, 2, 1584, 1586, 7, 176, 2, 2, 1585, 1583, 3, 2, 2, 2, 1585, 1584, 3, 2, 2, 2, 1586, 1587, 3, 2, 2, 2, 1587, 1588, 9, 11, 2, 2, 1588, 1589, 5, 96, 49, 2, 1589, 319, 3, 2, 2, 2, 1590, 1592, 7, 53, 2, 2, 1591, 1593, 5, 94, 48, 2, 1592, 1591, 3, 2, 2, 2, 1592, 1593, 3, 2, 2, 2, 1593, 1594, 3, 2, 2, 2, 1594, 1595, 7, 54, 2, 2, 1595, 321, 3, 2, 2, 2, 1596, 1597, 5, 324, 163, 2, 1597, 323, 3, 2, 2, 2, 1598, 1599, 7, 167, 2, 2, 1599, 325, 3, 2, 2, 2, 1600, 1601, 9, 12, 2, 2, 1601, 327, 3, 2, 2, 2, 156, 336, 340, 356, 362, 370, 378, 386, 401, 431, 439, 441, 463, 473, 483, 488, 493, 497, 509, 513, 522, 529, 543, 547, 552, 562, 570, 574, 586, 598, 620, 628, 633, 636, 640, 649, 658, 661, 669, 676, 678, 685, 692, 694, 702, 707, 714, 721, 731, 738, 745, 752, 761, 771, 775, 783, 785, 797, 803, 807, 811, 822, 828, 843, 849, 853, 857, 864, 871, 877, 882, 884, 888, 895, 902, 911, 923, 933, 945, 949, 958, 965, 987, 992, 997, 1001, 1013, 1021, 1025, 1032, 1039, 1045, 1052, 1060, 1067, 1073, 1079, 1085, 1091, 1102, 1108, 1113, 1121, 1142, 1151, 1153, 1176, 1193, 1204, 1226, 1230, 1237, 1241, 1251, 1256, 1270, 1279, 1285, 1311, 1328, 1330, 1338, 1343, 1350, 1355, 1359, 1367, 1374, 1382, 1392, 1396, 1401, 1414, 1428, 1442, 1462, 1471, 1473, 1479, 1494, 1496, 1498, 1504, 1527, 1529, 1537, 1540, 1547, 1552, 1556, 1570, 1573, 1581, 1585, 1592] \ No newline at end of file diff --git a/src/main/java/org/rumbledb/parser/JsoniqParser.java b/src/main/java/org/rumbledb/parser/JsoniqParser.java index 68d965cd7..42bb53f2f 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqParser.java +++ b/src/main/java/org/rumbledb/parser/JsoniqParser.java @@ -350,6 +350,7 @@ public final ModuleContext module() throws RecognitionException { case T__3: case T__5: case T__7: + case T__9: case T__11: case T__14: case T__28: @@ -426,6 +427,7 @@ public final ModuleContext module() throws RecognitionException { case Kwith: case Kposition: case Kimport: + case Kelement: case Kslash: case Kdslash: case Kat_symbol: @@ -441,6 +443,15 @@ public final ModuleContext module() throws RecognitionException { case Kpreceding_sibling: case Kpreceding: case Kancestor_or_self: + case Knode: + case Kbinary: + case Kdocument_node: + case Ktext: + case Kpi: + case Knamespace_node: + case Kschema_attribute: + case Kschema_element: + case Kcomment: case Kbreak: case Kloop: case Kcontinue: @@ -839,7 +850,7 @@ public final StatementsAndOptionalExprContext statementsAndOptionalExpr() throws setState(384); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Kcomment - 128)) | (1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { setState(383); expr(); @@ -6302,36 +6313,39 @@ public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionEx enterRule(_localctx, 152, RULE_multiplicativeExpr); int _la; try { + int _alt; enterOuterAlt(_localctx, 1); { setState(1053); ((MultiplicativeExprContext)_localctx).main_expr = instanceOfExpr(); setState(1058); _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) { - { - { - setState(1054); - ((MultiplicativeExprContext)_localctx)._tset1965 = _input.LT(1); - _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) ) { - ((MultiplicativeExprContext)_localctx)._tset1965 = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1965); - setState(1055); - ((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr(); - ((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr); - } + _alt = getInterpreter().adaptivePredict(_input,92,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1054); + ((MultiplicativeExprContext)_localctx)._tset1965 = _input.LT(1); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) ) { + ((MultiplicativeExprContext)_localctx)._tset1965 = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1965); + setState(1055); + ((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr(); + ((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr); + } + } } setState(1060); _errHandler.sync(this); - _la = _input.LA(1); + _alt = getInterpreter().adaptivePredict(_input,92,_ctx); } } } @@ -7823,7 +7837,7 @@ public final ParenthesizedExprContext parenthesizedExpr() throws RecognitionExce setState(1202); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Kcomment - 128)) | (1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { setState(1201); expr(); @@ -8037,7 +8051,7 @@ public final ArgumentListContext argumentList() throws RecognitionException { setState(1228); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (ArgumentPlaceholder - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Kcomment - 128)) | (1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (ArgumentPlaceholder - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { { setState(1222); @@ -8100,6 +8114,7 @@ public final ArgumentContext argument() throws RecognitionException { case T__3: case T__5: case T__7: + case T__9: case T__11: case T__14: case T__28: @@ -8175,6 +8190,7 @@ public final ArgumentContext argument() throws RecognitionException { case Kjson: case Kwith: case Kposition: + case Kelement: case Kslash: case Kdslash: case Kat_symbol: @@ -8190,6 +8206,15 @@ public final ArgumentContext argument() throws RecognitionException { case Kpreceding_sibling: case Kpreceding: case Kancestor_or_self: + case Knode: + case Kbinary: + case Kdocument_node: + case Ktext: + case Kpi: + case Knamespace_node: + case Kschema_attribute: + case Kschema_element: + case Kcomment: case Kbreak: case Kloop: case Kcontinue: @@ -9067,6 +9092,7 @@ public final PathExprContext pathExpr() throws RecognitionException { case T__3: case T__5: case T__7: + case T__9: case T__11: case T__14: case T__28: @@ -9140,6 +9166,7 @@ public final PathExprContext pathExpr() throws RecognitionException { case Kjson: case Kwith: case Kposition: + case Kelement: case Kat_symbol: case Kchild: case Kdescendant: @@ -9153,6 +9180,15 @@ public final PathExprContext pathExpr() throws RecognitionException { case Kpreceding_sibling: case Kpreceding: case Kancestor_or_self: + case Knode: + case Kbinary: + case Kdocument_node: + case Ktext: + case Kpi: + case Knamespace_node: + case Kschema_attribute: + case Kschema_element: + case Kcomment: case Kbreak: case Kloop: case Kcontinue: @@ -9289,16 +9325,76 @@ public final StepExprContext stepExpr() throws RecognitionException { try { setState(1353); _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,123,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1351); + postFixExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1352); + axisStep(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AxisStepContext extends ParserRuleContext { + public PredicateListContext predicateList() { + return getRuleContext(PredicateListContext.class,0); + } + public ReverseStepContext reverseStep() { + return getRuleContext(ReverseStepContext.class,0); + } + public ForwardStepContext forwardStep() { + return getRuleContext(ForwardStepContext.class,0); + } + public AxisStepContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_axisStep; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAxisStep(this); + else return visitor.visitChildren(this); + } + } + + public final AxisStepContext axisStep() throws RecognitionException { + AxisStepContext _localctx = new AxisStepContext(_ctx, getState()); + enterRule(_localctx, 236, RULE_axisStep); + try { + enterOuterAlt(_localctx, 1); + { + setState(1357); + _errHandler.sync(this); switch (_input.LA(1)) { - case T__3: - case T__5: - case T__7: - case T__11: - case T__14: - case T__28: - case T__50: - case T__53: - case T__56: + case T__55: + case Kparent: + case Kancestor: + case Kpreceding_sibling: + case Kpreceding: + case Kancestor_or_self: + { + setState(1355); + reverseStep(); + } + break; + case T__9: case Kfor: case Klet: case Kwhere: @@ -9365,98 +9461,7 @@ public final StepExprContext stepExpr() throws RecognitionException { case Kjson: case Kwith: case Kposition: - case Kbreak: - case Kloop: - case Kcontinue: - case Kexit: - case Kreturning: - case Kwhile: - case STRING: - case NullLiteral: - case Literal: - case NCName: - enterOuterAlt(_localctx, 1); - { - setState(1351); - postFixExpr(); - } - break; - case T__55: - case Kat_symbol: - case Kchild: - case Kdescendant: - case Kattribute: - case Kself: - case Kdescendant_or_self: - case Kfollowing_sibling: - case Kfollowing: - case Kparent: - case Kancestor: - case Kpreceding_sibling: - case Kpreceding: - case Kancestor_or_self: - enterOuterAlt(_localctx, 2); - { - setState(1352); - axisStep(); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class AxisStepContext extends ParserRuleContext { - public PredicateListContext predicateList() { - return getRuleContext(PredicateListContext.class,0); - } - public ReverseStepContext reverseStep() { - return getRuleContext(ReverseStepContext.class,0); - } - public ForwardStepContext forwardStep() { - return getRuleContext(ForwardStepContext.class,0); - } - public AxisStepContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_axisStep; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAxisStep(this); - else return visitor.visitChildren(this); - } - } - - public final AxisStepContext axisStep() throws RecognitionException { - AxisStepContext _localctx = new AxisStepContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_axisStep); - try { - enterOuterAlt(_localctx, 1); - { - setState(1357); - _errHandler.sync(this); - switch (_input.LA(1)) { - case T__55: - case Kparent: - case Kancestor: - case Kpreceding_sibling: - case Kpreceding: - case Kancestor_or_self: - { - setState(1355); - reverseStep(); - } - break; + case Kelement: case Kat_symbol: case Kchild: case Kdescendant: @@ -9465,6 +9470,23 @@ public final AxisStepContext axisStep() throws RecognitionException { case Kdescendant_or_self: case Kfollowing_sibling: case Kfollowing: + case Knode: + case Kbinary: + case Kdocument_node: + case Ktext: + case Kpi: + case Knamespace_node: + case Kschema_attribute: + case Kschema_element: + case Kcomment: + case Kbreak: + case Kloop: + case Kcontinue: + case Kexit: + case Kreturning: + case Kwhile: + case NullLiteral: + case NCName: { setState(1356); forwardStep(); @@ -9515,14 +9537,8 @@ public final ForwardStepContext forwardStep() throws RecognitionException { try { setState(1365); _errHandler.sync(this); - switch (_input.LA(1)) { - case Kchild: - case Kdescendant: - case Kattribute: - case Kself: - case Kdescendant_or_self: - case Kfollowing_sibling: - case Kfollowing: + switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { + case 1: enterOuterAlt(_localctx, 1); { { @@ -9533,15 +9549,13 @@ public final ForwardStepContext forwardStep() throws RecognitionException { } } break; - case Kat_symbol: + case 2: enterOuterAlt(_localctx, 2); { setState(1364); abbrevForwardStep(); } break; - default: - throw new NoViableAltException(this); } } catch (RecognitionException re) { @@ -9609,10 +9623,10 @@ public final ForwardAxisContext forwardAxis() throws RecognitionException { } public static class AbbrevForwardStepContext extends ParserRuleContext { - public TerminalNode Kat_symbol() { return getToken(JsoniqParser.Kat_symbol, 0); } public NodeTestContext nodeTest() { return getRuleContext(NodeTestContext.class,0); } + public TerminalNode Kat_symbol() { return getToken(JsoniqParser.Kat_symbol, 0); } public AbbrevForwardStepContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -9627,12 +9641,21 @@ public T accept(ParseTreeVisitor visitor) { public final AbbrevForwardStepContext abbrevForwardStep() throws RecognitionException { AbbrevForwardStepContext _localctx = new AbbrevForwardStepContext(_ctx, getState()); enterRule(_localctx, 242, RULE_abbrevForwardStep); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(1371); - match(Kat_symbol); setState(1372); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==Kat_symbol) { + { + setState(1371); + match(Kat_symbol); + } + } + + setState(1374); nodeTest(); } } @@ -9672,7 +9695,7 @@ public final ReverseStepContext reverseStep() throws RecognitionException { ReverseStepContext _localctx = new ReverseStepContext(_ctx, getState()); enterRule(_localctx, 244, RULE_reverseStep); try { - setState(1378); + setState(1380); _errHandler.sync(this); switch (_input.LA(1)) { case Kparent: @@ -9683,9 +9706,9 @@ public final ReverseStepContext reverseStep() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(1374); + setState(1376); reverseAxis(); - setState(1375); + setState(1377); nodeTest(); } } @@ -9693,7 +9716,7 @@ public final ReverseStepContext reverseStep() throws RecognitionException { case T__55: enterOuterAlt(_localctx, 2); { - setState(1377); + setState(1379); abbrevReverseStep(); } break; @@ -9736,7 +9759,7 @@ public final ReverseAxisContext reverseAxis() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1380); + setState(1382); _la = _input.LA(1); if ( !(((((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & ((1L << (Kparent - 139)) | (1L << (Kancestor - 139)) | (1L << (Kpreceding_sibling - 139)) | (1L << (Kpreceding - 139)) | (1L << (Kancestor_or_self - 139)))) != 0)) ) { _errHandler.recoverInline(this); @@ -9746,9 +9769,9 @@ public final ReverseAxisContext reverseAxis() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1381); + setState(1383); match(T__16); - setState(1382); + setState(1384); match(T__16); } } @@ -9781,7 +9804,7 @@ public final AbbrevReverseStepContext abbrevReverseStep() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1384); + setState(1386); match(T__55); } } @@ -9818,7 +9841,7 @@ public final NodeTestContext nodeTest() throws RecognitionException { NodeTestContext _localctx = new NodeTestContext(_ctx, getState()); enterRule(_localctx, 250, RULE_nodeTest); try { - setState(1388); + setState(1390); _errHandler.sync(this); switch (_input.LA(1)) { case T__9: @@ -9898,7 +9921,7 @@ public final NodeTestContext nodeTest() throws RecognitionException { case NCName: enterOuterAlt(_localctx, 1); { - setState(1386); + setState(1388); nameTest(); } break; @@ -9915,7 +9938,7 @@ public final NodeTestContext nodeTest() throws RecognitionException { case Kcomment: enterOuterAlt(_localctx, 2); { - setState(1387); + setState(1389); kindTest(); } break; @@ -9956,20 +9979,20 @@ public final NameTestContext nameTest() throws RecognitionException { NameTestContext _localctx = new NameTestContext(_ctx, getState()); enterRule(_localctx, 252, RULE_nameTest); try { - setState(1392); + setState(1394); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1390); + setState(1392); qname(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1391); + setState(1393); wildcard(); } break; @@ -10032,14 +10055,14 @@ public final WildcardContext wildcard() throws RecognitionException { WildcardContext _localctx = new WildcardContext(_ctx, getState()); enterRule(_localctx, 254, RULE_wildcard); try { - setState(1397); + setState(1399); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { case 1: _localctx = new AllNamesContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(1394); + setState(1396); match(T__9); } break; @@ -10047,7 +10070,7 @@ public final WildcardContext wildcard() throws RecognitionException { _localctx = new AllWithNSContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(1395); + setState(1397); nCNameWithLocalWildcard(); } break; @@ -10055,7 +10078,7 @@ public final WildcardContext wildcard() throws RecognitionException { _localctx = new AllWithLocalContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(1396); + setState(1398); nCNameWithPrefixWildcard(); } break; @@ -10091,11 +10114,11 @@ public final NCNameWithLocalWildcardContext nCNameWithLocalWildcard() throws Rec try { enterOuterAlt(_localctx, 1); { - setState(1399); + setState(1401); match(NCName); - setState(1400); + setState(1402); match(T__16); - setState(1401); + setState(1403); match(T__9); } } @@ -10129,11 +10152,11 @@ public final NCNameWithPrefixWildcardContext nCNameWithPrefixWildcard() throws R try { enterOuterAlt(_localctx, 1); { - setState(1403); + setState(1405); match(T__9); - setState(1404); + setState(1406); match(T__16); - setState(1405); + setState(1407); match(NCName); } } @@ -10173,21 +10196,21 @@ public final PredicateListContext predicateList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1410); + setState(1412); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,130,_ctx); + _alt = getInterpreter().adaptivePredict(_input,131,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1407); + setState(1409); predicate(); } } } - setState(1412); + setState(1414); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,130,_ctx); + _alt = getInterpreter().adaptivePredict(_input,131,_ctx); } } } @@ -10251,83 +10274,83 @@ public final KindTestContext kindTest() throws RecognitionException { KindTestContext _localctx = new KindTestContext(_ctx, getState()); enterRule(_localctx, 262, RULE_kindTest); try { - setState(1424); + setState(1426); _errHandler.sync(this); switch (_input.LA(1)) { case Kdocument_node: enterOuterAlt(_localctx, 1); { - setState(1413); + setState(1415); documentTest(); } break; case Kelement: enterOuterAlt(_localctx, 2); { - setState(1414); + setState(1416); elementTest(); } break; case Kattribute: enterOuterAlt(_localctx, 3); { - setState(1415); + setState(1417); attributeTest(); } break; case Kschema_element: enterOuterAlt(_localctx, 4); { - setState(1416); + setState(1418); schemaElementTest(); } break; case Kschema_attribute: enterOuterAlt(_localctx, 5); { - setState(1417); + setState(1419); schemaAttributeTest(); } break; case Kpi: enterOuterAlt(_localctx, 6); { - setState(1418); + setState(1420); piTest(); } break; case Kcomment: enterOuterAlt(_localctx, 7); { - setState(1419); + setState(1421); commentTest(); } break; case Ktext: enterOuterAlt(_localctx, 8); { - setState(1420); + setState(1422); textTest(); } break; case Knamespace_node: enterOuterAlt(_localctx, 9); { - setState(1421); + setState(1423); namespaceNodeTest(); } break; case Kbinary: enterOuterAlt(_localctx, 10); { - setState(1422); + setState(1424); binaryNodeTest(); } break; case Knode: enterOuterAlt(_localctx, 11); { - setState(1423); + setState(1425); anyKindTest(); } break; @@ -10365,11 +10388,11 @@ public final AnyKindTestContext anyKindTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1426); + setState(1428); match(Knode); - setState(1427); + setState(1429); match(T__7); - setState(1428); + setState(1430); match(T__8); } } @@ -10403,11 +10426,11 @@ public final BinaryNodeTestContext binaryNodeTest() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1430); + setState(1432); match(Kbinary); - setState(1431); + setState(1433); match(T__7); - setState(1432); + setState(1434); match(T__8); } } @@ -10447,22 +10470,22 @@ public final DocumentTestContext documentTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1434); + setState(1436); match(Kdocument_node); - setState(1435); + setState(1437); match(T__7); - setState(1438); + setState(1440); _errHandler.sync(this); switch (_input.LA(1)) { case Kelement: { - setState(1436); + setState(1438); elementTest(); } break; case Kschema_element: { - setState(1437); + setState(1439); schemaElementTest(); } break; @@ -10471,7 +10494,7 @@ public final DocumentTestContext documentTest() throws RecognitionException { default: break; } - setState(1440); + setState(1442); match(T__8); } } @@ -10505,11 +10528,11 @@ public final TextTestContext textTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1442); + setState(1444); match(Ktext); - setState(1443); + setState(1445); match(T__7); - setState(1444); + setState(1446); match(T__8); } } @@ -10543,11 +10566,11 @@ public final CommentTestContext commentTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1446); + setState(1448); match(Kcomment); - setState(1447); + setState(1449); match(T__7); - setState(1448); + setState(1450); match(T__8); } } @@ -10581,11 +10604,11 @@ public final NamespaceNodeTestContext namespaceNodeTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1450); + setState(1452); match(Knamespace_node); - setState(1451); + setState(1453); match(T__7); - setState(1452); + setState(1454); match(T__8); } } @@ -10623,22 +10646,22 @@ public final PiTestContext piTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1454); + setState(1456); match(Kpi); - setState(1455); + setState(1457); match(T__7); - setState(1458); + setState(1460); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(1456); + setState(1458); match(NCName); } break; case STRING: { - setState(1457); + setState(1459); stringLiteral(); } break; @@ -10647,7 +10670,7 @@ public final PiTestContext piTest() throws RecognitionException { default: break; } - setState(1460); + setState(1462); match(T__8); } } @@ -10689,25 +10712,25 @@ public final AttributeTestContext attributeTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1462); + setState(1464); match(Kattribute); - setState(1463); + setState(1465); match(T__7); - setState(1469); + setState(1471); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 159)) & ~0x3f) == 0 && ((1L << (_la - 159)) & ((1L << (Kbreak - 159)) | (1L << (Kloop - 159)) | (1L << (Kcontinue - 159)) | (1L << (Kexit - 159)) | (1L << (Kreturning - 159)) | (1L << (Kwhile - 159)) | (1L << (NullLiteral - 159)) | (1L << (NCName - 159)))) != 0)) { { - setState(1464); + setState(1466); attributeNameOrWildcard(); - setState(1467); + setState(1469); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__12) { { - setState(1465); + setState(1467); match(T__12); - setState(1466); + setState(1468); ((AttributeTestContext)_localctx).type = typeName(); } } @@ -10715,7 +10738,7 @@ public final AttributeTestContext attributeTest() throws RecognitionException { } } - setState(1471); + setState(1473); match(T__8); } } @@ -10749,7 +10772,7 @@ public final AttributeNameOrWildcardContext attributeNameOrWildcard() throws Rec AttributeNameOrWildcardContext _localctx = new AttributeNameOrWildcardContext(_ctx, getState()); enterRule(_localctx, 280, RULE_attributeNameOrWildcard); try { - setState(1475); + setState(1477); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -10828,14 +10851,14 @@ public final AttributeNameOrWildcardContext attributeNameOrWildcard() throws Rec case NCName: enterOuterAlt(_localctx, 1); { - setState(1473); + setState(1475); attributeName(); } break; case T__9: enterOuterAlt(_localctx, 2); { - setState(1474); + setState(1476); match(T__9); } break; @@ -10876,13 +10899,13 @@ public final SchemaAttributeTestContext schemaAttributeTest() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(1477); + setState(1479); match(Kschema_attribute); - setState(1478); + setState(1480); match(T__7); - setState(1479); + setState(1481); attributeDeclaration(); - setState(1480); + setState(1482); match(T__8); } } @@ -10918,7 +10941,7 @@ public final AttributeDeclarationContext attributeDeclaration() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(1482); + setState(1484); attributeName(); } } @@ -10962,32 +10985,32 @@ public final ElementTestContext elementTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1484); + setState(1486); match(Kelement); - setState(1485); + setState(1487); match(T__7); - setState(1494); + setState(1496); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 159)) & ~0x3f) == 0 && ((1L << (_la - 159)) & ((1L << (Kbreak - 159)) | (1L << (Kloop - 159)) | (1L << (Kcontinue - 159)) | (1L << (Kexit - 159)) | (1L << (Kreturning - 159)) | (1L << (Kwhile - 159)) | (1L << (NullLiteral - 159)) | (1L << (NCName - 159)))) != 0)) { { - setState(1486); + setState(1488); elementNameOrWildcard(); - setState(1492); + setState(1494); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__12) { { - setState(1487); + setState(1489); match(T__12); - setState(1488); - ((ElementTestContext)_localctx).type = typeName(); setState(1490); + ((ElementTestContext)_localctx).type = typeName(); + setState(1492); _errHandler.sync(this); _la = _input.LA(1); if (_la==ArgumentPlaceholder) { { - setState(1489); + setState(1491); ((ElementTestContext)_localctx).optional = match(ArgumentPlaceholder); } } @@ -10998,7 +11021,7 @@ public final ElementTestContext elementTest() throws RecognitionException { } } - setState(1496); + setState(1498); match(T__8); } } @@ -11032,7 +11055,7 @@ public final ElementNameOrWildcardContext elementNameOrWildcard() throws Recogni ElementNameOrWildcardContext _localctx = new ElementNameOrWildcardContext(_ctx, getState()); enterRule(_localctx, 288, RULE_elementNameOrWildcard); try { - setState(1500); + setState(1502); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -11111,14 +11134,14 @@ public final ElementNameOrWildcardContext elementNameOrWildcard() throws Recogni case NCName: enterOuterAlt(_localctx, 1); { - setState(1498); + setState(1500); elementName(); } break; case T__9: enterOuterAlt(_localctx, 2); { - setState(1499); + setState(1501); match(T__9); } break; @@ -11159,13 +11182,13 @@ public final SchemaElementTestContext schemaElementTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1502); + setState(1504); match(Kschema_element); - setState(1503); + setState(1505); match(T__7); - setState(1504); + setState(1506); elementDeclaration(); - setState(1505); + setState(1507); match(T__8); } } @@ -11201,7 +11224,7 @@ public final ElementDeclarationContext elementDeclaration() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(1507); + setState(1509); elementName(); } } @@ -11237,7 +11260,7 @@ public final AttributeNameContext attributeName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1509); + setState(1511); qname(); } } @@ -11273,7 +11296,7 @@ public final ElementNameContext elementName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1511); + setState(1513); qname(); } } @@ -11309,7 +11332,7 @@ public final SimpleTypeNameContext simpleTypeName() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1513); + setState(1515); typeName(); } } @@ -11345,7 +11368,7 @@ public final TypeNameContext typeName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1515); + setState(1517); qname(); } } @@ -11387,15 +11410,15 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { SequenceTypeContext _localctx = new SequenceTypeContext(_ctx, getState()); enterRule(_localctx, 302, RULE_sequenceType); try { - setState(1525); + setState(1527); _errHandler.sync(this); switch (_input.LA(1)) { case T__7: enterOuterAlt(_localctx, 1); { - setState(1517); + setState(1519); match(T__7); - setState(1518); + setState(1520); match(T__8); } break; @@ -11476,28 +11499,28 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { case NCName: enterOuterAlt(_localctx, 2); { - setState(1519); + setState(1521); ((SequenceTypeContext)_localctx).item = itemType(); - setState(1523); + setState(1525); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { case 1: { - setState(1520); + setState(1522); ((SequenceTypeContext)_localctx).s166 = match(ArgumentPlaceholder); ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s166); } break; case 2: { - setState(1521); + setState(1523); ((SequenceTypeContext)_localctx).s10 = match(T__9); ((SequenceTypeContext)_localctx).star.add(((SequenceTypeContext)_localctx).s10); } break; case 3: { - setState(1522); + setState(1524); ((SequenceTypeContext)_localctx).s45 = match(T__44); ((SequenceTypeContext)_localctx).plus.add(((SequenceTypeContext)_localctx).s45); } @@ -11548,53 +11571,53 @@ public final ObjectConstructorContext objectConstructor() throws RecognitionExce enterRule(_localctx, 304, RULE_objectConstructor); int _la; try { - setState(1543); + setState(1545); _errHandler.sync(this); switch (_input.LA(1)) { case T__5: enterOuterAlt(_localctx, 1); { - setState(1527); + setState(1529); match(T__5); - setState(1536); + setState(1538); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Kcomment - 128)) | (1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1528); + setState(1530); pairConstructor(); - setState(1533); + setState(1535); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(1529); + setState(1531); match(T__12); - setState(1530); + setState(1532); pairConstructor(); } } - setState(1535); + setState(1537); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1538); + setState(1540); match(T__6); } break; case T__56: enterOuterAlt(_localctx, 2); { - setState(1539); + setState(1541); ((ObjectConstructorContext)_localctx).s57 = match(T__56); ((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s57); - setState(1540); + setState(1542); expr(); - setState(1541); + setState(1543); match(T__57); } break; @@ -11636,27 +11659,27 @@ public final ItemTypeContext itemType() throws RecognitionException { ItemTypeContext _localctx = new ItemTypeContext(_ctx, getState()); enterRule(_localctx, 306, RULE_itemType); try { - setState(1548); + setState(1550); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1545); + setState(1547); qname(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1546); + setState(1548); match(NullLiteral); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1547); + setState(1549); functionTest(); } break; @@ -11697,18 +11720,18 @@ public final FunctionTestContext functionTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1552); + setState(1554); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { case 1: { - setState(1550); + setState(1552); anyFunctionTest(); } break; case 2: { - setState(1551); + setState(1553); typedFunctionTest(); } break; @@ -11744,13 +11767,13 @@ public final AnyFunctionTestContext anyFunctionTest() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1554); + setState(1556); match(T__28); - setState(1555); + setState(1557); match(T__7); - setState(1556); + setState(1558); match(T__9); - setState(1557); + setState(1559); match(T__8); } } @@ -11794,43 +11817,43 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1559); + setState(1561); match(T__28); - setState(1560); + setState(1562); match(T__7); - setState(1569); + setState(1571); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__7) | (1L << T__28) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 159)) & ~0x3f) == 0 && ((1L << (_la - 159)) & ((1L << (Kbreak - 159)) | (1L << (Kloop - 159)) | (1L << (Kcontinue - 159)) | (1L << (Kexit - 159)) | (1L << (Kreturning - 159)) | (1L << (Kwhile - 159)) | (1L << (NullLiteral - 159)) | (1L << (NCName - 159)))) != 0)) { { - setState(1561); + setState(1563); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); - setState(1566); + setState(1568); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(1562); + setState(1564); match(T__12); - setState(1563); + setState(1565); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); } } - setState(1568); + setState(1570); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1571); + setState(1573); match(T__8); - setState(1572); + setState(1574); match(Kas); - setState(1573); + setState(1575); ((TypedFunctionTestContext)_localctx).rt = sequenceType(); } } @@ -11870,14 +11893,14 @@ public final SingleTypeContext singleType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1575); - ((SingleTypeContext)_localctx).item = itemType(); setState(1577); + ((SingleTypeContext)_localctx).item = itemType(); + setState(1579); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { case 1: { - setState(1576); + setState(1578); ((SingleTypeContext)_localctx).s166 = match(ArgumentPlaceholder); ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s166); } @@ -11926,23 +11949,23 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1581); + setState(1583); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { case 1: { - setState(1579); + setState(1581); ((PairConstructorContext)_localctx).lhs = exprSingle(); } break; case 2: { - setState(1580); + setState(1582); ((PairConstructorContext)_localctx).name = match(NCName); } break; } - setState(1583); + setState(1585); _la = _input.LA(1); if ( !(_la==T__16 || _la==ArgumentPlaceholder) ) { _errHandler.recoverInline(this); @@ -11952,7 +11975,7 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio _errHandler.reportMatch(this); consume(); } - setState(1584); + setState(1586); ((PairConstructorContext)_localctx).rhs = exprSingle(); } } @@ -11989,19 +12012,19 @@ public final ArrayConstructorContext arrayConstructor() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1586); - match(T__50); setState(1588); + match(T__50); + setState(1590); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Kcomment - 128)) | (1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { { - setState(1587); + setState(1589); expr(); } } - setState(1590); + setState(1592); match(T__51); } } @@ -12037,7 +12060,7 @@ public final UriLiteralContext uriLiteral() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1592); + setState(1594); stringLiteral(); } } @@ -12071,7 +12094,7 @@ public final StringLiteralContext stringLiteral() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1594); + setState(1596); match(STRING); } } @@ -12178,7 +12201,7 @@ public final KeyWordsContext keyWords() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1596); + setState(1598); _la = _input.LA(1); if ( !(((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (Kfor - 59)) | (1L << (Klet - 59)) | (1L << (Kwhere - 59)) | (1L << (Kgroup - 59)) | (1L << (Kby - 59)) | (1L << (Korder - 59)) | (1L << (Kreturn - 59)) | (1L << (Kif - 59)) | (1L << (Kin - 59)) | (1L << (Kas - 59)) | (1L << (Kat - 59)) | (1L << (Kallowing - 59)) | (1L << (Kempty - 59)) | (1L << (Kcount - 59)) | (1L << (Kstable - 59)) | (1L << (Kascending - 59)) | (1L << (Kdescending - 59)) | (1L << (Ksome - 59)) | (1L << (Kevery - 59)) | (1L << (Ksatisfies - 59)) | (1L << (Kcollation - 59)) | (1L << (Kgreatest - 59)) | (1L << (Kleast - 59)) | (1L << (Kswitch - 59)) | (1L << (Kcase - 59)) | (1L << (Ktry - 59)) | (1L << (Kcatch - 59)) | (1L << (Kdefault - 59)) | (1L << (Kthen - 59)) | (1L << (Kelse - 59)) | (1L << (Ktypeswitch - 59)) | (1L << (Kor - 59)) | (1L << (Kand - 59)) | (1L << (Knot - 59)) | (1L << (Kto - 59)) | (1L << (Kinstance - 59)) | (1L << (Kof - 59)) | (1L << (Kstatically - 59)) | (1L << (Kis - 59)) | (1L << (Ktreat - 59)) | (1L << (Kcast - 59)) | (1L << (Kcastable - 59)) | (1L << (Kversion - 59)) | (1L << (Kjsoniq - 59)) | (1L << (Kunordered - 59)) | (1L << (Ktrue - 59)) | (1L << (Kfalse - 59)) | (1L << (Ktype - 59)) | (1L << (Kvalidate - 59)) | (1L << (Kannotate - 59)) | (1L << (Kdeclare - 59)) | (1L << (Kcontext - 59)) | (1L << (Kitem - 59)) | (1L << (Kvariable - 59)) | (1L << (Kinsert - 59)) | (1L << (Kdelete - 59)) | (1L << (Krename - 59)) | (1L << (Kreplace - 59)) | (1L << (Kcopy - 59)) | (1L << (Kmodify - 59)) | (1L << (Kappend - 59)) | (1L << (Kinto - 59)) | (1L << (Kvalue - 59)) | (1L << (Kjson - 59)))) != 0) || ((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (Kwith - 123)) | (1L << (Kposition - 123)) | (1L << (Kbreak - 123)) | (1L << (Kloop - 123)) | (1L << (Kcontinue - 123)) | (1L << (Kexit - 123)) | (1L << (Kreturning - 123)) | (1L << (Kwhile - 123)) | (1L << (NullLiteral - 123)))) != 0)) ) { _errHandler.recoverInline(this); @@ -12202,7 +12225,7 @@ public final KeyWordsContext keyWords() throws RecognitionException { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00b2\u0641\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00b2\u0643\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -12293,61 +12316,61 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\3q\3r\3r\3r\3r\3r\3r\3s\3s\3s\6s\u0531\ns\rs\16s\u0532\3t\3t\3t\3t\3"+ "u\3u\5u\u053b\nu\3u\3u\3u\5u\u0540\nu\3v\3v\3v\7v\u0545\nv\fv\16v\u0548"+ "\13v\3w\3w\5w\u054c\nw\3x\3x\5x\u0550\nx\3x\3x\3y\3y\3y\3y\5y\u0558\n"+ - "y\3z\3z\3z\3z\3{\3{\3{\3|\3|\3|\3|\5|\u0565\n|\3}\3}\3}\3}\3~\3~\3\177"+ - "\3\177\5\177\u056f\n\177\3\u0080\3\u0080\5\u0080\u0573\n\u0080\3\u0081"+ - "\3\u0081\3\u0081\5\u0081\u0578\n\u0081\3\u0082\3\u0082\3\u0082\3\u0082"+ - "\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\7\u0084\u0583\n\u0084\f\u0084"+ - "\16\u0084\u0586\13\u0084\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085"+ - "\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\5\u0085\u0593\n\u0085\3\u0086"+ - "\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\3\u0087\3\u0088\3\u0088"+ - "\3\u0088\3\u0088\5\u0088\u05a1\n\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+ - "\3\u0089\3\u0089\3\u008a\3\u008a\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b"+ - "\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u05b5\n\u008c\3\u008c"+ - "\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\5\u008d\u05be\n\u008d"+ - "\5\u008d\u05c0\n\u008d\3\u008d\3\u008d\3\u008e\3\u008e\5\u008e\u05c6\n"+ - "\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0091"+ - "\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\5\u0091\u05d5\n\u0091\5\u0091"+ - "\u05d7\n\u0091\5\u0091\u05d9\n\u0091\3\u0091\3\u0091\3\u0092\3\u0092\5"+ - "\u0092\u05df\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094\3"+ - "\u0094\3\u0095\3\u0095\3\u0096\3\u0096\3\u0097\3\u0097\3\u0098\3\u0098"+ - "\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\5\u0099\u05f6\n\u0099"+ - "\5\u0099\u05f8\n\u0099\3\u009a\3\u009a\3\u009a\3\u009a\7\u009a\u05fe\n"+ - "\u009a\f\u009a\16\u009a\u0601\13\u009a\5\u009a\u0603\n\u009a\3\u009a\3"+ - "\u009a\3\u009a\3\u009a\3\u009a\5\u009a\u060a\n\u009a\3\u009b\3\u009b\3"+ - "\u009b\5\u009b\u060f\n\u009b\3\u009c\3\u009c\5\u009c\u0613\n\u009c\3\u009d"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ - "\7\u009e\u061f\n\u009e\f\u009e\16\u009e\u0622\13\u009e\5\u009e\u0624\n"+ - "\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f\5\u009f\u062c\n"+ - "\u009f\3\u00a0\3\u00a0\5\u00a0\u0630\n\u00a0\3\u00a0\3\u00a0\3\u00a0\3"+ - "\u00a1\3\u00a1\5\u00a1\u0637\n\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3"+ - "\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\2\2\u00a5\2\4\6\b\n\f\16\20\22"+ - "\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnp"+ - "rtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094"+ - "\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac"+ - "\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4"+ - "\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc"+ - "\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4"+ - "\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c"+ - "\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124"+ - "\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c"+ - "\u013e\u0140\u0142\u0144\u0146\2\r\4\2\21\21ii\3\2RS\3\2\24\35\4\2\5\5"+ - "#-\3\2/\60\4\2\f\f\61\63\3\2\u0083\u0084\3\2\u0086\u008c\3\2\u008d\u0091"+ - "\4\2\23\23\u00a8\u00a8\5\2=~\u00a1\u00a6\u00a9\u00a9\2\u0680\2\u0148\3"+ - "\2\2\2\4\u0150\3\2\2\2\6\u0156\3\2\2\2\b\u0159\3\2\2\2\n\u016a\3\2\2\2"+ - "\f\u0175\3\2\2\2\16\u017a\3\2\2\2\20\u017d\3\2\2\2\22\u0180\3\2\2\2\24"+ - "\u0191\3\2\2\2\26\u0193\3\2\2\2\30\u0196\3\2\2\2\32\u019c\3\2\2\2\34\u01a0"+ - "\3\2\2\2\36\u01a4\3\2\2\2 \u01a8\3\2\2\2\"\u01af\3\2\2\2$\u01bf\3\2\2"+ - "\2&\u01c8\3\2\2\2(\u01d7\3\2\2\2*\u01de\3\2\2\2,\u01e5\3\2\2\2.\u01f6"+ - "\3\2\2\2\60\u0206\3\2\2\2\62\u0217\3\2\2\2\64\u0228\3\2\2\2\66\u022b\3"+ - "\2\2\28\u0237\3\2\2\2:\u0240\3\2\2\2<\u024a\3\2\2\2>\u024c\3\2\2\2@\u0256"+ - "\3\2\2\2B\u0258\3\2\2\2D\u025d\3\2\2\2F\u0261\3\2\2\2H\u0267\3\2\2\2J"+ - "\u027c\3\2\2\2L\u0282\3\2\2\2N\u0284\3\2\2\2P\u0297\3\2\2\2R\u02a8\3\2"+ - "\2\2T\u02b8\3\2\2\2V\u02cc\3\2\2\2X\u02db\3\2\2\2Z\u02dd\3\2\2\2\\\u02e5"+ - "\3\2\2\2^\u02eb\3\2\2\2`\u02f9\3\2\2\2b\u0303\3\2\2\2d\u0307\3\2\2\2f"+ - "\u0317\3\2\2\2h\u0320\3\2\2\2j\u0330\3\2\2\2l\u0339\3\2\2\2n\u0341\3\2"+ - "\2\2p\u0344\3\2\2\2r\u034e\3\2\2\2t\u0360\3\2\2\2v\u036a\3\2\2\2x\u037a"+ - "\3\2\2\2z\u037f\3\2\2\2|\u038c\3\2\2\2~\u0394\3\2\2\2\u0080\u03a3\3\2"+ - "\2\2\u0082\u03aa\3\2\2\2\u0084\u03ba\3\2\2\2\u0086\u03cb\3\2\2\2\u0088"+ + "y\3z\3z\3z\3z\3{\5{\u055f\n{\3{\3{\3|\3|\3|\3|\5|\u0567\n|\3}\3}\3}\3"+ + "}\3~\3~\3\177\3\177\5\177\u0571\n\177\3\u0080\3\u0080\5\u0080\u0575\n"+ + "\u0080\3\u0081\3\u0081\3\u0081\5\u0081\u057a\n\u0081\3\u0082\3\u0082\3"+ + "\u0082\3\u0082\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\7\u0084\u0585\n"+ + "\u0084\f\u0084\16\u0084\u0588\13\u0084\3\u0085\3\u0085\3\u0085\3\u0085"+ + "\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\5\u0085\u0595"+ + "\n\u0085\3\u0086\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\3\u0087"+ + "\3\u0088\3\u0088\3\u0088\3\u0088\5\u0088\u05a3\n\u0088\3\u0088\3\u0088"+ + "\3\u0089\3\u0089\3\u0089\3\u0089\3\u008a\3\u008a\3\u008a\3\u008a\3\u008b"+ + "\3\u008b\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u05b7"+ + "\n\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\5\u008d"+ + "\u05c0\n\u008d\5\u008d\u05c2\n\u008d\3\u008d\3\u008d\3\u008e\3\u008e\5"+ + "\u008e\u05c8\n\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3"+ + "\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\5\u0091\u05d7\n"+ + "\u0091\5\u0091\u05d9\n\u0091\5\u0091\u05db\n\u0091\3\u0091\3\u0091\3\u0092"+ + "\3\u0092\5\u0092\u05e1\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093"+ + "\3\u0094\3\u0094\3\u0095\3\u0095\3\u0096\3\u0096\3\u0097\3\u0097\3\u0098"+ + "\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\5\u0099\u05f8"+ + "\n\u0099\5\u0099\u05fa\n\u0099\3\u009a\3\u009a\3\u009a\3\u009a\7\u009a"+ + "\u0600\n\u009a\f\u009a\16\u009a\u0603\13\u009a\5\u009a\u0605\n\u009a\3"+ + "\u009a\3\u009a\3\u009a\3\u009a\3\u009a\5\u009a\u060c\n\u009a\3\u009b\3"+ + "\u009b\3\u009b\5\u009b\u0611\n\u009b\3\u009c\3\u009c\5\u009c\u0615\n\u009c"+ + "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\3\u009e\7\u009e\u0621\n\u009e\f\u009e\16\u009e\u0624\13\u009e\5\u009e"+ + "\u0626\n\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f\5\u009f"+ + "\u062e\n\u009f\3\u00a0\3\u00a0\5\u00a0\u0632\n\u00a0\3\u00a0\3\u00a0\3"+ + "\u00a0\3\u00a1\3\u00a1\5\u00a1\u0639\n\u00a1\3\u00a1\3\u00a1\3\u00a2\3"+ + "\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\2\2\u00a5\2\4\6\b\n\f\16"+ + "\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bd"+ + "fhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092"+ + "\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa"+ + "\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2"+ + "\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da"+ + "\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2"+ + "\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a"+ + "\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122"+ + "\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a"+ + "\u013c\u013e\u0140\u0142\u0144\u0146\2\r\4\2\21\21ii\3\2RS\3\2\24\35\4"+ + "\2\5\5#-\3\2/\60\4\2\f\f\61\63\3\2\u0083\u0084\3\2\u0086\u008c\3\2\u008d"+ + "\u0091\4\2\23\23\u00a8\u00a8\5\2=~\u00a1\u00a6\u00a9\u00a9\2\u0683\2\u0148"+ + "\3\2\2\2\4\u0150\3\2\2\2\6\u0156\3\2\2\2\b\u0159\3\2\2\2\n\u016a\3\2\2"+ + "\2\f\u0175\3\2\2\2\16\u017a\3\2\2\2\20\u017d\3\2\2\2\22\u0180\3\2\2\2"+ + "\24\u0191\3\2\2\2\26\u0193\3\2\2\2\30\u0196\3\2\2\2\32\u019c\3\2\2\2\34"+ + "\u01a0\3\2\2\2\36\u01a4\3\2\2\2 \u01a8\3\2\2\2\"\u01af\3\2\2\2$\u01bf"+ + "\3\2\2\2&\u01c8\3\2\2\2(\u01d7\3\2\2\2*\u01de\3\2\2\2,\u01e5\3\2\2\2."+ + "\u01f6\3\2\2\2\60\u0206\3\2\2\2\62\u0217\3\2\2\2\64\u0228\3\2\2\2\66\u022b"+ + "\3\2\2\28\u0237\3\2\2\2:\u0240\3\2\2\2<\u024a\3\2\2\2>\u024c\3\2\2\2@"+ + "\u0256\3\2\2\2B\u0258\3\2\2\2D\u025d\3\2\2\2F\u0261\3\2\2\2H\u0267\3\2"+ + "\2\2J\u027c\3\2\2\2L\u0282\3\2\2\2N\u0284\3\2\2\2P\u0297\3\2\2\2R\u02a8"+ + "\3\2\2\2T\u02b8\3\2\2\2V\u02cc\3\2\2\2X\u02db\3\2\2\2Z\u02dd\3\2\2\2\\"+ + "\u02e5\3\2\2\2^\u02eb\3\2\2\2`\u02f9\3\2\2\2b\u0303\3\2\2\2d\u0307\3\2"+ + "\2\2f\u0317\3\2\2\2h\u0320\3\2\2\2j\u0330\3\2\2\2l\u0339\3\2\2\2n\u0341"+ + "\3\2\2\2p\u0344\3\2\2\2r\u034e\3\2\2\2t\u0360\3\2\2\2v\u036a\3\2\2\2x"+ + "\u037a\3\2\2\2z\u037f\3\2\2\2|\u038c\3\2\2\2~\u0394\3\2\2\2\u0080\u03a3"+ + "\3\2\2\2\u0082\u03aa\3\2\2\2\u0084\u03ba\3\2\2\2\u0086\u03cb\3\2\2\2\u0088"+ "\u03d4\3\2\2\2\u008a\u03dd\3\2\2\2\u008c\u03f0\3\2\2\2\u008e\u03f8\3\2"+ "\2\2\u0090\u0401\3\2\2\2\u0092\u0405\3\2\2\2\u0094\u040a\3\2\2\2\u0096"+ "\u0412\3\2\2\2\u0098\u0417\3\2\2\2\u009a\u041f\3\2\2\2\u009c\u0427\3\2"+ @@ -12363,19 +12386,19 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\u050b\3\2\2\2\u00de\u0511\3\2\2\2\u00e0\u0519\3\2\2\2\u00e2\u0527\3\2"+ "\2\2\u00e4\u052d\3\2\2\2\u00e6\u0534\3\2\2\2\u00e8\u053f\3\2\2\2\u00ea"+ "\u0541\3\2\2\2\u00ec\u054b\3\2\2\2\u00ee\u054f\3\2\2\2\u00f0\u0557\3\2"+ - "\2\2\u00f2\u0559\3\2\2\2\u00f4\u055d\3\2\2\2\u00f6\u0564\3\2\2\2\u00f8"+ - "\u0566\3\2\2\2\u00fa\u056a\3\2\2\2\u00fc\u056e\3\2\2\2\u00fe\u0572\3\2"+ - "\2\2\u0100\u0577\3\2\2\2\u0102\u0579\3\2\2\2\u0104\u057d\3\2\2\2\u0106"+ - "\u0584\3\2\2\2\u0108\u0592\3\2\2\2\u010a\u0594\3\2\2\2\u010c\u0598\3\2"+ - "\2\2\u010e\u059c\3\2\2\2\u0110\u05a4\3\2\2\2\u0112\u05a8\3\2\2\2\u0114"+ - "\u05ac\3\2\2\2\u0116\u05b0\3\2\2\2\u0118\u05b8\3\2\2\2\u011a\u05c5\3\2"+ - "\2\2\u011c\u05c7\3\2\2\2\u011e\u05cc\3\2\2\2\u0120\u05ce\3\2\2\2\u0122"+ - "\u05de\3\2\2\2\u0124\u05e0\3\2\2\2\u0126\u05e5\3\2\2\2\u0128\u05e7\3\2"+ - "\2\2\u012a\u05e9\3\2\2\2\u012c\u05eb\3\2\2\2\u012e\u05ed\3\2\2\2\u0130"+ - "\u05f7\3\2\2\2\u0132\u0609\3\2\2\2\u0134\u060e\3\2\2\2\u0136\u0612\3\2"+ - "\2\2\u0138\u0614\3\2\2\2\u013a\u0619\3\2\2\2\u013c\u0629\3\2\2\2\u013e"+ - "\u062f\3\2\2\2\u0140\u0634\3\2\2\2\u0142\u063a\3\2\2\2\u0144\u063c\3\2"+ - "\2\2\u0146\u063e\3\2\2\2\u0148\u0149\5\4\3\2\u0149\u014a\7\2\2\3\u014a"+ + "\2\2\u00f2\u0559\3\2\2\2\u00f4\u055e\3\2\2\2\u00f6\u0566\3\2\2\2\u00f8"+ + "\u0568\3\2\2\2\u00fa\u056c\3\2\2\2\u00fc\u0570\3\2\2\2\u00fe\u0574\3\2"+ + "\2\2\u0100\u0579\3\2\2\2\u0102\u057b\3\2\2\2\u0104\u057f\3\2\2\2\u0106"+ + "\u0586\3\2\2\2\u0108\u0594\3\2\2\2\u010a\u0596\3\2\2\2\u010c\u059a\3\2"+ + "\2\2\u010e\u059e\3\2\2\2\u0110\u05a6\3\2\2\2\u0112\u05aa\3\2\2\2\u0114"+ + "\u05ae\3\2\2\2\u0116\u05b2\3\2\2\2\u0118\u05ba\3\2\2\2\u011a\u05c7\3\2"+ + "\2\2\u011c\u05c9\3\2\2\2\u011e\u05ce\3\2\2\2\u0120\u05d0\3\2\2\2\u0122"+ + "\u05e0\3\2\2\2\u0124\u05e2\3\2\2\2\u0126\u05e7\3\2\2\2\u0128\u05e9\3\2"+ + "\2\2\u012a\u05eb\3\2\2\2\u012c\u05ed\3\2\2\2\u012e\u05ef\3\2\2\2\u0130"+ + "\u05f9\3\2\2\2\u0132\u060b\3\2\2\2\u0134\u0610\3\2\2\2\u0136\u0614\3\2"+ + "\2\2\u0138\u0616\3\2\2\2\u013a\u061b\3\2\2\2\u013c\u062b\3\2\2\2\u013e"+ + "\u0631\3\2\2\2\u0140\u0636\3\2\2\2\u0142\u063c\3\2\2\2\u0144\u063e\3\2"+ + "\2\2\u0146\u0640\3\2\2\2\u0148\u0149\5\4\3\2\u0149\u014a\7\2\2\3\u014a"+ "\3\3\2\2\2\u014b\u014c\7h\2\2\u014c\u014d\7g\2\2\u014d\u014e\5\u0144\u00a3"+ "\2\u014e\u014f\7\3\2\2\u014f\u0151\3\2\2\2\u0150\u014b\3\2\2\2\u0150\u0151"+ "\3\2\2\2\u0151\u0154\3\2\2\2\u0152\u0155\5\b\5\2\u0153\u0155\5\6\4\2\u0154"+ @@ -12726,101 +12749,102 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\u00f2z\2\u0554\u0555\5\u00fc\177\2\u0555\u0558\3\2\2\2\u0556\u0558\5"+ "\u00f4{\2\u0557\u0553\3\2\2\2\u0557\u0556\3\2\2\2\u0558\u00f1\3\2\2\2"+ "\u0559\u055a\t\t\2\2\u055a\u055b\7\23\2\2\u055b\u055c\7\23\2\2\u055c\u00f3"+ - "\3\2\2\2\u055d\u055e\7\u0085\2\2\u055e\u055f\5\u00fc\177\2\u055f\u00f5"+ - "\3\2\2\2\u0560\u0561\5\u00f8}\2\u0561\u0562\5\u00fc\177\2\u0562\u0565"+ - "\3\2\2\2\u0563\u0565\5\u00fa~\2\u0564\u0560\3\2\2\2\u0564\u0563\3\2\2"+ - "\2\u0565\u00f7\3\2\2\2\u0566\u0567\t\n\2\2\u0567\u0568\7\23\2\2\u0568"+ - "\u0569\7\23\2\2\u0569\u00f9\3\2\2\2\u056a\u056b\7:\2\2\u056b\u00fb\3\2"+ - "\2\2\u056c\u056f\5\u00fe\u0080\2\u056d\u056f\5\u0108\u0085\2\u056e\u056c"+ - "\3\2\2\2\u056e\u056d\3\2\2\2\u056f\u00fd\3\2\2\2\u0570\u0573\5J&\2\u0571"+ - "\u0573\5\u0100\u0081\2\u0572\u0570\3\2\2\2\u0572\u0571\3\2\2\2\u0573\u00ff"+ - "\3\2\2\2\u0574\u0578\7\f\2\2\u0575\u0578\5\u0102\u0082\2\u0576\u0578\5"+ - "\u0104\u0083\2\u0577\u0574\3\2\2\2\u0577\u0575\3\2\2\2\u0577\u0576\3\2"+ - "\2\2\u0578\u0101\3\2\2\2\u0579\u057a\7\u00b0\2\2\u057a\u057b\7\23\2\2"+ - "\u057b\u057c\7\f\2\2\u057c\u0103\3\2\2\2\u057d\u057e\7\f\2\2\u057e\u057f"+ - "\7\23\2\2\u057f\u0580\7\u00b0\2\2\u0580\u0105\3\2\2\2\u0581\u0583\5\u00ba"+ - "^\2\u0582\u0581\3\2\2\2\u0583\u0586\3\2\2\2\u0584\u0582\3\2\2\2\u0584"+ - "\u0585\3\2\2\2\u0585\u0107\3\2\2\2\u0586\u0584\3\2\2\2\u0587\u0593\5\u010e"+ - "\u0088\2\u0588\u0593\5\u0120\u0091\2\u0589\u0593\5\u0118\u008d\2\u058a"+ - "\u0593\5\u0124\u0093\2\u058b\u0593\5\u011c\u008f\2\u058c\u0593\5\u0116"+ - "\u008c\2\u058d\u0593\5\u0112\u008a\2\u058e\u0593\5\u0110\u0089\2\u058f"+ - "\u0593\5\u0114\u008b\2\u0590\u0593\5\u010c\u0087\2\u0591\u0593\5\u010a"+ - "\u0086\2\u0592\u0587\3\2\2\2\u0592\u0588\3\2\2\2\u0592\u0589\3\2\2\2\u0592"+ - "\u058a\3\2\2\2\u0592\u058b\3\2\2\2\u0592\u058c\3\2\2\2\u0592\u058d\3\2"+ - "\2\2\u0592\u058e\3\2\2\2\u0592\u058f\3\2\2\2\u0592\u0590\3\2\2\2\u0592"+ - "\u0591\3\2\2\2\u0593\u0109\3\2\2\2\u0594\u0595\7\u0092\2\2\u0595\u0596"+ - "\7\n\2\2\u0596\u0597\7\13\2\2\u0597\u010b\3\2\2\2\u0598\u0599\7\u0093"+ - "\2\2\u0599\u059a\7\n\2\2\u059a\u059b\7\13\2\2\u059b\u010d\3\2\2\2\u059c"+ - "\u059d\7\u0095\2\2\u059d\u05a0\7\n\2\2\u059e\u05a1\5\u0120\u0091\2\u059f"+ - "\u05a1\5\u0124\u0093\2\u05a0\u059e\3\2\2\2\u05a0\u059f\3\2\2\2\u05a0\u05a1"+ - "\3\2\2\2\u05a1\u05a2\3\2\2\2\u05a2\u05a3\7\13\2\2\u05a3\u010f\3\2\2\2"+ - "\u05a4\u05a5\7\u0096\2\2\u05a5\u05a6\7\n\2\2\u05a6\u05a7\7\13\2\2\u05a7"+ - "\u0111\3\2\2\2\u05a8\u05a9\7\u00a0\2\2\u05a9\u05aa\7\n\2\2\u05aa\u05ab"+ - "\7\13\2\2\u05ab\u0113\3\2\2\2\u05ac\u05ad\7\u0098\2\2\u05ad\u05ae\7\n"+ - "\2\2\u05ae\u05af\7\13\2\2\u05af\u0115\3\2\2\2\u05b0\u05b1\7\u0097\2\2"+ - "\u05b1\u05b4\7\n\2\2\u05b2\u05b5\7\u00b0\2\2\u05b3\u05b5\5\u0144\u00a3"+ - "\2\u05b4\u05b2\3\2\2\2\u05b4\u05b3\3\2\2\2\u05b4\u05b5\3\2\2\2\u05b5\u05b6"+ - "\3\2\2\2\u05b6\u05b7\7\13\2\2\u05b7\u0117\3\2\2\2\u05b8\u05b9\7\u0088"+ - "\2\2\u05b9\u05bf\7\n\2\2\u05ba\u05bd\5\u011a\u008e\2\u05bb\u05bc\7\17"+ - "\2\2\u05bc\u05be\5\u012e\u0098\2\u05bd\u05bb\3\2\2\2\u05bd\u05be\3\2\2"+ - "\2\u05be\u05c0\3\2\2\2\u05bf\u05ba\3\2\2\2\u05bf\u05c0\3\2\2\2\u05c0\u05c1"+ - "\3\2\2\2\u05c1\u05c2\7\13\2\2\u05c2\u0119\3\2\2\2\u05c3\u05c6\5\u0128"+ - "\u0095\2\u05c4\u05c6\7\f\2\2\u05c5\u05c3\3\2\2\2\u05c5\u05c4\3\2\2\2\u05c6"+ - "\u011b\3\2\2\2\u05c7\u05c8\7\u0099\2\2\u05c8\u05c9\7\n\2\2\u05c9\u05ca"+ - "\5\u011e\u0090\2\u05ca\u05cb\7\13\2\2\u05cb\u011d\3\2\2\2\u05cc\u05cd"+ - "\5\u0128\u0095\2\u05cd\u011f\3\2\2\2\u05ce\u05cf\7\u0082\2\2\u05cf\u05d8"+ - "\7\n\2\2\u05d0\u05d6\5\u0122\u0092\2\u05d1\u05d2\7\17\2\2\u05d2\u05d4"+ - "\5\u012e\u0098\2\u05d3\u05d5\7\u00a8\2\2\u05d4\u05d3\3\2\2\2\u05d4\u05d5"+ - "\3\2\2\2\u05d5\u05d7\3\2\2\2\u05d6\u05d1\3\2\2\2\u05d6\u05d7\3\2\2\2\u05d7"+ - "\u05d9\3\2\2\2\u05d8\u05d0\3\2\2\2\u05d8\u05d9\3\2\2\2\u05d9\u05da\3\2"+ - "\2\2\u05da\u05db\7\13\2\2\u05db\u0121\3\2\2\2\u05dc\u05df\5\u012a\u0096"+ - "\2\u05dd\u05df\7\f\2\2\u05de\u05dc\3\2\2\2\u05de\u05dd\3\2\2\2\u05df\u0123"+ - "\3\2\2\2\u05e0\u05e1\7\u009a\2\2\u05e1\u05e2\7\n\2\2\u05e2\u05e3\5\u0126"+ - "\u0094\2\u05e3\u05e4\7\13\2\2\u05e4\u0125\3\2\2\2\u05e5\u05e6\5\u012a"+ - "\u0096\2\u05e6\u0127\3\2\2\2\u05e7\u05e8\5J&\2\u05e8\u0129\3\2\2\2\u05e9"+ - "\u05ea\5J&\2\u05ea\u012b\3\2\2\2\u05eb\u05ec\5\u012e\u0098\2\u05ec\u012d"+ - "\3\2\2\2\u05ed\u05ee\5J&\2\u05ee\u012f\3\2\2\2\u05ef\u05f0\7\n\2\2\u05f0"+ - "\u05f8\7\13\2\2\u05f1\u05f5\5\u0134\u009b\2\u05f2\u05f6\7\u00a8\2\2\u05f3"+ - "\u05f6\7\f\2\2\u05f4\u05f6\7/\2\2\u05f5\u05f2\3\2\2\2\u05f5\u05f3\3\2"+ - "\2\2\u05f5\u05f4\3\2\2\2\u05f5\u05f6\3\2\2\2\u05f6\u05f8\3\2\2\2\u05f7"+ - "\u05ef\3\2\2\2\u05f7\u05f1\3\2\2\2\u05f8\u0131\3\2\2\2\u05f9\u0602\7\b"+ - "\2\2\u05fa\u05ff\5\u013e\u00a0\2\u05fb\u05fc\7\17\2\2\u05fc\u05fe\5\u013e"+ - "\u00a0\2\u05fd\u05fb\3\2\2\2\u05fe\u0601\3\2\2\2\u05ff\u05fd\3\2\2\2\u05ff"+ - "\u0600\3\2\2\2\u0600\u0603\3\2\2\2\u0601\u05ff\3\2\2\2\u0602\u05fa\3\2"+ - "\2\2\u0602\u0603\3\2\2\2\u0603\u0604\3\2\2\2\u0604\u060a\7\t\2\2\u0605"+ - "\u0606\7;\2\2\u0606\u0607\5^\60\2\u0607\u0608\7<\2\2\u0608\u060a\3\2\2"+ - "\2\u0609\u05f9\3\2\2\2\u0609\u0605\3\2\2\2\u060a\u0133\3\2\2\2\u060b\u060f"+ - "\5J&\2\u060c\u060f\7\u00a9\2\2\u060d\u060f\5\u0136\u009c\2\u060e\u060b"+ - "\3\2\2\2\u060e\u060c\3\2\2\2\u060e\u060d\3\2\2\2\u060f\u0135\3\2\2\2\u0610"+ - "\u0613\5\u0138\u009d\2\u0611\u0613\5\u013a\u009e\2\u0612\u0610\3\2\2\2"+ - "\u0612\u0611\3\2\2\2\u0613\u0137\3\2\2\2\u0614\u0615\7\37\2\2\u0615\u0616"+ - "\7\n\2\2\u0616\u0617\7\f\2\2\u0617\u0618\7\13\2\2\u0618\u0139\3\2\2\2"+ - "\u0619\u061a\7\37\2\2\u061a\u0623\7\n\2\2\u061b\u0620\5\u0130\u0099\2"+ - "\u061c\u061d\7\17\2\2\u061d\u061f\5\u0130\u0099\2\u061e\u061c\3\2\2\2"+ - "\u061f\u0622\3\2\2\2\u0620\u061e\3\2\2\2\u0620\u0621\3\2\2\2\u0621\u0624"+ - "\3\2\2\2\u0622\u0620\3\2\2\2\u0623\u061b\3\2\2\2\u0623\u0624\3\2\2\2\u0624"+ - "\u0625\3\2\2\2\u0625\u0626\7\13\2\2\u0626\u0627\7F\2\2\u0627\u0628\5\u0130"+ - "\u0099\2\u0628\u013b\3\2\2\2\u0629\u062b\5\u0134\u009b\2\u062a\u062c\7"+ - "\u00a8\2\2\u062b\u062a\3\2\2\2\u062b\u062c\3\2\2\2\u062c\u013d\3\2\2\2"+ - "\u062d\u0630\5`\61\2\u062e\u0630\7\u00b0\2\2\u062f\u062d\3\2\2\2\u062f"+ - "\u062e\3\2\2\2\u0630\u0631\3\2\2\2\u0631\u0632\t\13\2\2\u0632\u0633\5"+ - "`\61\2\u0633\u013f\3\2\2\2\u0634\u0636\7\65\2\2\u0635\u0637\5^\60\2\u0636"+ - "\u0635\3\2\2\2\u0636\u0637\3\2\2\2\u0637\u0638\3\2\2\2\u0638\u0639\7\66"+ - "\2\2\u0639\u0141\3\2\2\2\u063a\u063b\5\u0144\u00a3\2\u063b\u0143\3\2\2"+ - "\2\u063c\u063d\7\u00a7\2\2\u063d\u0145\3\2\2\2\u063e\u063f\t\f\2\2\u063f"+ - "\u0147\3\2\2\2\u009b\u0150\u0154\u0164\u016a\u0172\u017a\u0182\u0191\u01af"+ - "\u01b7\u01b9\u01cf\u01d9\u01e3\u01e8\u01ed\u01f1\u01fd\u0201\u020a\u0211"+ - "\u021f\u0223\u0228\u0232\u023a\u023e\u024a\u0256\u026c\u0274\u0279\u027c"+ - "\u0280\u0289\u0292\u0295\u029d\u02a4\u02a6\u02ad\u02b4\u02b6\u02be\u02c3"+ - "\u02ca\u02d1\u02db\u02e2\u02e9\u02f0\u02f9\u0303\u0307\u030f\u0311\u031d"+ - "\u0323\u0327\u032b\u0336\u033c\u034b\u0351\u0355\u0359\u0360\u0367\u036d"+ - "\u0372\u0374\u0378\u037f\u0386\u038f\u039b\u03a5\u03b1\u03b5\u03be\u03c5"+ - "\u03db\u03e0\u03e5\u03e9\u03f5\u03fd\u0401\u0408\u040f\u0415\u041c\u0424"+ - "\u042b\u0431\u0437\u043d\u0443\u044e\u0454\u0459\u0461\u0476\u047f\u0481"+ - "\u0498\u04a9\u04b4\u04ca\u04ce\u04d5\u04d9\u04e3\u04e8\u04f6\u04ff\u0505"+ - "\u051f\u0530\u0532\u053a\u053f\u0546\u054b\u054f\u0557\u0564\u056e\u0572"+ - "\u0577\u0584\u0592\u05a0\u05b4\u05bd\u05bf\u05c5\u05d4\u05d6\u05d8\u05de"+ - "\u05f5\u05f7\u05ff\u0602\u0609\u060e\u0612\u0620\u0623\u062b\u062f\u0636"; + "\3\2\2\2\u055d\u055f\7\u0085\2\2\u055e\u055d\3\2\2\2\u055e\u055f\3\2\2"+ + "\2\u055f\u0560\3\2\2\2\u0560\u0561\5\u00fc\177\2\u0561\u00f5\3\2\2\2\u0562"+ + "\u0563\5\u00f8}\2\u0563\u0564\5\u00fc\177\2\u0564\u0567\3\2\2\2\u0565"+ + "\u0567\5\u00fa~\2\u0566\u0562\3\2\2\2\u0566\u0565\3\2\2\2\u0567\u00f7"+ + "\3\2\2\2\u0568\u0569\t\n\2\2\u0569\u056a\7\23\2\2\u056a\u056b\7\23\2\2"+ + "\u056b\u00f9\3\2\2\2\u056c\u056d\7:\2\2\u056d\u00fb\3\2\2\2\u056e\u0571"+ + "\5\u00fe\u0080\2\u056f\u0571\5\u0108\u0085\2\u0570\u056e\3\2\2\2\u0570"+ + "\u056f\3\2\2\2\u0571\u00fd\3\2\2\2\u0572\u0575\5J&\2\u0573\u0575\5\u0100"+ + "\u0081\2\u0574\u0572\3\2\2\2\u0574\u0573\3\2\2\2\u0575\u00ff\3\2\2\2\u0576"+ + "\u057a\7\f\2\2\u0577\u057a\5\u0102\u0082\2\u0578\u057a\5\u0104\u0083\2"+ + "\u0579\u0576\3\2\2\2\u0579\u0577\3\2\2\2\u0579\u0578\3\2\2\2\u057a\u0101"+ + "\3\2\2\2\u057b\u057c\7\u00b0\2\2\u057c\u057d\7\23\2\2\u057d\u057e\7\f"+ + "\2\2\u057e\u0103\3\2\2\2\u057f\u0580\7\f\2\2\u0580\u0581\7\23\2\2\u0581"+ + "\u0582\7\u00b0\2\2\u0582\u0105\3\2\2\2\u0583\u0585\5\u00ba^\2\u0584\u0583"+ + "\3\2\2\2\u0585\u0588\3\2\2\2\u0586\u0584\3\2\2\2\u0586\u0587\3\2\2\2\u0587"+ + "\u0107\3\2\2\2\u0588\u0586\3\2\2\2\u0589\u0595\5\u010e\u0088\2\u058a\u0595"+ + "\5\u0120\u0091\2\u058b\u0595\5\u0118\u008d\2\u058c\u0595\5\u0124\u0093"+ + "\2\u058d\u0595\5\u011c\u008f\2\u058e\u0595\5\u0116\u008c\2\u058f\u0595"+ + "\5\u0112\u008a\2\u0590\u0595\5\u0110\u0089\2\u0591\u0595\5\u0114\u008b"+ + "\2\u0592\u0595\5\u010c\u0087\2\u0593\u0595\5\u010a\u0086\2\u0594\u0589"+ + "\3\2\2\2\u0594\u058a\3\2\2\2\u0594\u058b\3\2\2\2\u0594\u058c\3\2\2\2\u0594"+ + "\u058d\3\2\2\2\u0594\u058e\3\2\2\2\u0594\u058f\3\2\2\2\u0594\u0590\3\2"+ + "\2\2\u0594\u0591\3\2\2\2\u0594\u0592\3\2\2\2\u0594\u0593\3\2\2\2\u0595"+ + "\u0109\3\2\2\2\u0596\u0597\7\u0092\2\2\u0597\u0598\7\n\2\2\u0598\u0599"+ + "\7\13\2\2\u0599\u010b\3\2\2\2\u059a\u059b\7\u0093\2\2\u059b\u059c\7\n"+ + "\2\2\u059c\u059d\7\13\2\2\u059d\u010d\3\2\2\2\u059e\u059f\7\u0095\2\2"+ + "\u059f\u05a2\7\n\2\2\u05a0\u05a3\5\u0120\u0091\2\u05a1\u05a3\5\u0124\u0093"+ + "\2\u05a2\u05a0\3\2\2\2\u05a2\u05a1\3\2\2\2\u05a2\u05a3\3\2\2\2\u05a3\u05a4"+ + "\3\2\2\2\u05a4\u05a5\7\13\2\2\u05a5\u010f\3\2\2\2\u05a6\u05a7\7\u0096"+ + "\2\2\u05a7\u05a8\7\n\2\2\u05a8\u05a9\7\13\2\2\u05a9\u0111\3\2\2\2\u05aa"+ + "\u05ab\7\u00a0\2\2\u05ab\u05ac\7\n\2\2\u05ac\u05ad\7\13\2\2\u05ad\u0113"+ + "\3\2\2\2\u05ae\u05af\7\u0098\2\2\u05af\u05b0\7\n\2\2\u05b0\u05b1\7\13"+ + "\2\2\u05b1\u0115\3\2\2\2\u05b2\u05b3\7\u0097\2\2\u05b3\u05b6\7\n\2\2\u05b4"+ + "\u05b7\7\u00b0\2\2\u05b5\u05b7\5\u0144\u00a3\2\u05b6\u05b4\3\2\2\2\u05b6"+ + "\u05b5\3\2\2\2\u05b6\u05b7\3\2\2\2\u05b7\u05b8\3\2\2\2\u05b8\u05b9\7\13"+ + "\2\2\u05b9\u0117\3\2\2\2\u05ba\u05bb\7\u0088\2\2\u05bb\u05c1\7\n\2\2\u05bc"+ + "\u05bf\5\u011a\u008e\2\u05bd\u05be\7\17\2\2\u05be\u05c0\5\u012e\u0098"+ + "\2\u05bf\u05bd\3\2\2\2\u05bf\u05c0\3\2\2\2\u05c0\u05c2\3\2\2\2\u05c1\u05bc"+ + "\3\2\2\2\u05c1\u05c2\3\2\2\2\u05c2\u05c3\3\2\2\2\u05c3\u05c4\7\13\2\2"+ + "\u05c4\u0119\3\2\2\2\u05c5\u05c8\5\u0128\u0095\2\u05c6\u05c8\7\f\2\2\u05c7"+ + "\u05c5\3\2\2\2\u05c7\u05c6\3\2\2\2\u05c8\u011b\3\2\2\2\u05c9\u05ca\7\u0099"+ + "\2\2\u05ca\u05cb\7\n\2\2\u05cb\u05cc\5\u011e\u0090\2\u05cc\u05cd\7\13"+ + "\2\2\u05cd\u011d\3\2\2\2\u05ce\u05cf\5\u0128\u0095\2\u05cf\u011f\3\2\2"+ + "\2\u05d0\u05d1\7\u0082\2\2\u05d1\u05da\7\n\2\2\u05d2\u05d8\5\u0122\u0092"+ + "\2\u05d3\u05d4\7\17\2\2\u05d4\u05d6\5\u012e\u0098\2\u05d5\u05d7\7\u00a8"+ + "\2\2\u05d6\u05d5\3\2\2\2\u05d6\u05d7\3\2\2\2\u05d7\u05d9\3\2\2\2\u05d8"+ + "\u05d3\3\2\2\2\u05d8\u05d9\3\2\2\2\u05d9\u05db\3\2\2\2\u05da\u05d2\3\2"+ + "\2\2\u05da\u05db\3\2\2\2\u05db\u05dc\3\2\2\2\u05dc\u05dd\7\13\2\2\u05dd"+ + "\u0121\3\2\2\2\u05de\u05e1\5\u012a\u0096\2\u05df\u05e1\7\f\2\2\u05e0\u05de"+ + "\3\2\2\2\u05e0\u05df\3\2\2\2\u05e1\u0123\3\2\2\2\u05e2\u05e3\7\u009a\2"+ + "\2\u05e3\u05e4\7\n\2\2\u05e4\u05e5\5\u0126\u0094\2\u05e5\u05e6\7\13\2"+ + "\2\u05e6\u0125\3\2\2\2\u05e7\u05e8\5\u012a\u0096\2\u05e8\u0127\3\2\2\2"+ + "\u05e9\u05ea\5J&\2\u05ea\u0129\3\2\2\2\u05eb\u05ec\5J&\2\u05ec\u012b\3"+ + "\2\2\2\u05ed\u05ee\5\u012e\u0098\2\u05ee\u012d\3\2\2\2\u05ef\u05f0\5J"+ + "&\2\u05f0\u012f\3\2\2\2\u05f1\u05f2\7\n\2\2\u05f2\u05fa\7\13\2\2\u05f3"+ + "\u05f7\5\u0134\u009b\2\u05f4\u05f8\7\u00a8\2\2\u05f5\u05f8\7\f\2\2\u05f6"+ + "\u05f8\7/\2\2\u05f7\u05f4\3\2\2\2\u05f7\u05f5\3\2\2\2\u05f7\u05f6\3\2"+ + "\2\2\u05f7\u05f8\3\2\2\2\u05f8\u05fa\3\2\2\2\u05f9\u05f1\3\2\2\2\u05f9"+ + "\u05f3\3\2\2\2\u05fa\u0131\3\2\2\2\u05fb\u0604\7\b\2\2\u05fc\u0601\5\u013e"+ + "\u00a0\2\u05fd\u05fe\7\17\2\2\u05fe\u0600\5\u013e\u00a0\2\u05ff\u05fd"+ + "\3\2\2\2\u0600\u0603\3\2\2\2\u0601\u05ff\3\2\2\2\u0601\u0602\3\2\2\2\u0602"+ + "\u0605\3\2\2\2\u0603\u0601\3\2\2\2\u0604\u05fc\3\2\2\2\u0604\u0605\3\2"+ + "\2\2\u0605\u0606\3\2\2\2\u0606\u060c\7\t\2\2\u0607\u0608\7;\2\2\u0608"+ + "\u0609\5^\60\2\u0609\u060a\7<\2\2\u060a\u060c\3\2\2\2\u060b\u05fb\3\2"+ + "\2\2\u060b\u0607\3\2\2\2\u060c\u0133\3\2\2\2\u060d\u0611\5J&\2\u060e\u0611"+ + "\7\u00a9\2\2\u060f\u0611\5\u0136\u009c\2\u0610\u060d\3\2\2\2\u0610\u060e"+ + "\3\2\2\2\u0610\u060f\3\2\2\2\u0611\u0135\3\2\2\2\u0612\u0615\5\u0138\u009d"+ + "\2\u0613\u0615\5\u013a\u009e\2\u0614\u0612\3\2\2\2\u0614\u0613\3\2\2\2"+ + "\u0615\u0137\3\2\2\2\u0616\u0617\7\37\2\2\u0617\u0618\7\n\2\2\u0618\u0619"+ + "\7\f\2\2\u0619\u061a\7\13\2\2\u061a\u0139\3\2\2\2\u061b\u061c\7\37\2\2"+ + "\u061c\u0625\7\n\2\2\u061d\u0622\5\u0130\u0099\2\u061e\u061f\7\17\2\2"+ + "\u061f\u0621\5\u0130\u0099\2\u0620\u061e\3\2\2\2\u0621\u0624\3\2\2\2\u0622"+ + "\u0620\3\2\2\2\u0622\u0623\3\2\2\2\u0623\u0626\3\2\2\2\u0624\u0622\3\2"+ + "\2\2\u0625\u061d\3\2\2\2\u0625\u0626\3\2\2\2\u0626\u0627\3\2\2\2\u0627"+ + "\u0628\7\13\2\2\u0628\u0629\7F\2\2\u0629\u062a\5\u0130\u0099\2\u062a\u013b"+ + "\3\2\2\2\u062b\u062d\5\u0134\u009b\2\u062c\u062e\7\u00a8\2\2\u062d\u062c"+ + "\3\2\2\2\u062d\u062e\3\2\2\2\u062e\u013d\3\2\2\2\u062f\u0632\5`\61\2\u0630"+ + "\u0632\7\u00b0\2\2\u0631\u062f\3\2\2\2\u0631\u0630\3\2\2\2\u0632\u0633"+ + "\3\2\2\2\u0633\u0634\t\13\2\2\u0634\u0635\5`\61\2\u0635\u013f\3\2\2\2"+ + "\u0636\u0638\7\65\2\2\u0637\u0639\5^\60\2\u0638\u0637\3\2\2\2\u0638\u0639"+ + "\3\2\2\2\u0639\u063a\3\2\2\2\u063a\u063b\7\66\2\2\u063b\u0141\3\2\2\2"+ + "\u063c\u063d\5\u0144\u00a3\2\u063d\u0143\3\2\2\2\u063e\u063f\7\u00a7\2"+ + "\2\u063f\u0145\3\2\2\2\u0640\u0641\t\f\2\2\u0641\u0147\3\2\2\2\u009c\u0150"+ + "\u0154\u0164\u016a\u0172\u017a\u0182\u0191\u01af\u01b7\u01b9\u01cf\u01d9"+ + "\u01e3\u01e8\u01ed\u01f1\u01fd\u0201\u020a\u0211\u021f\u0223\u0228\u0232"+ + "\u023a\u023e\u024a\u0256\u026c\u0274\u0279\u027c\u0280\u0289\u0292\u0295"+ + "\u029d\u02a4\u02a6\u02ad\u02b4\u02b6\u02be\u02c3\u02ca\u02d1\u02db\u02e2"+ + "\u02e9\u02f0\u02f9\u0303\u0307\u030f\u0311\u031d\u0323\u0327\u032b\u0336"+ + "\u033c\u034b\u0351\u0355\u0359\u0360\u0367\u036d\u0372\u0374\u0378\u037f"+ + "\u0386\u038f\u039b\u03a5\u03b1\u03b5\u03be\u03c5\u03db\u03e0\u03e5\u03e9"+ + "\u03f5\u03fd\u0401\u0408\u040f\u0415\u041c\u0424\u042b\u0431\u0437\u043d"+ + "\u0443\u044e\u0454\u0459\u0461\u0476\u047f\u0481\u0498\u04a9\u04b4\u04ca"+ + "\u04ce\u04d5\u04d9\u04e3\u04e8\u04f6\u04ff\u0505\u051f\u0530\u0532\u053a"+ + "\u053f\u0546\u054b\u054f\u0557\u055e\u0566\u0570\u0574\u0579\u0586\u0594"+ + "\u05a2\u05b6\u05bf\u05c1\u05c7\u05d6\u05d8\u05da\u05e0\u05f7\u05f9\u0601"+ + "\u0604\u060b\u0610\u0614\u0622\u0625\u062d\u0631\u0638"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java index ec3b48c3e..c0f4cb462 100644 --- a/src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java @@ -52,7 +52,7 @@ public Item next() { ); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); Document xmlDocument = documentBuilder.parse(xmlFileStream); - Item res = ItemParser.getItemFromXML(xmlDocument.getDocumentElement()); + Item res = ItemParser.getItemFromXML(xmlDocument); return res; } catch (IteratorFlowException e) { throw new IteratorFlowException(e.getJSONiqErrorMessage(), getMetadata()); diff --git a/src/test/java/iq/ReadXMLTests.java b/src/test/java/iq/ReadXMLTests.java index 0e7912511..6c3e9be3e 100644 --- a/src/test/java/iq/ReadXMLTests.java +++ b/src/test/java/iq/ReadXMLTests.java @@ -11,6 +11,7 @@ import org.rumbledb.expressions.module.MainModule; import org.rumbledb.expressions.scripting.Program; import org.rumbledb.expressions.xml.PathExpr; +import org.rumbledb.items.xml.DocumentItem; import org.rumbledb.runtime.functions.input.FileSystemUtil; import java.io.IOException; @@ -19,6 +20,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; public class ReadXMLTests extends AnnotationsTestsBase { private Rumble rumble; @@ -62,8 +64,8 @@ public void testBlockStatementWithSequentialStatement() throws Throwable { URI uri = resolveUri(filePath); SequenceOfItems sequence = this.rumble.runQuery(uri); sequence.open(); - Item result = sequence.next(); - List children = result.children(); + Item documentNode = sequence.next(); + List children = documentNode.children().get(0).children(); Item elementNode1 = children.get(0); Item elementNode2 = children.get(1); Item elementNode3 = children.get(2); @@ -77,6 +79,7 @@ public void testBlockStatementWithSequentialStatement() throws Throwable { Item attribute3 = elementNode3.attributes().get(0); Item attribute4 = elementNode4.attributes().get(0); assertFalse(sequence.hasNext()); + assertTrue(documentNode instanceof DocumentItem); assertEquals(4, children.size()); assertEquals(4, elementNode1.children().size()); assertEquals(4, elementNode2.children().size()); From 38dadf0252e3125ea541d62e7296167b9b92ab68 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Tue, 6 Aug 2024 12:53:36 +0300 Subject: [PATCH 46/56] Fixing bugs in walkers --- src/main/java/org/rumbledb/api/Item.java | 10 +- .../compiler/RuntimeIteratorVisitor.java | 8 +- .../rumbledb/compiler/TranslationVisitor.java | 26 +- .../context/BuiltinFunctionCatalogue.java | 18 + .../rumbledb/expressions/xml/PathExpr.java | 16 +- .../org/rumbledb/items/xml/AttributeItem.java | 6 + .../org/rumbledb/items/xml/DocumentItem.java | 6 + .../org/rumbledb/items/xml/ElementItem.java | 3 +- .../java/org/rumbledb/items/xml/TextItem.java | 4 + src/main/java/org/rumbledb/parser/Jsoniq.g4 | 5 +- .../java/org/rumbledb/parser/Jsoniq.interp | 2 +- .../org/rumbledb/parser/JsoniqParser.java | 974 +++++++++--------- .../xml/GetRootFunctionIterator.java | 63 ++ .../runtime/xml/PathExprIterator.java | 4 +- .../forward/DescendantOrSelfAxisIterator.java | 2 +- .../axis/forward/FollowingAxisIterator.java | 1 + .../reverse/AncestorOrSelfAxisIterator.java | 2 +- .../rumbledb/serialization/Serializer.java | 58 +- .../runtime/FunctionGetRoot/GetRoot1.jq | 2 + .../runtime/FunctionGetRoot/GetRoot2.jq | 2 + .../runtime/XPath/GetDescendants1.jq | 4 + .../runtime/XPath/GetDescendants2.jq | 2 + .../runtime/XPath/GetDescendants3.jq | 2 + 23 files changed, 694 insertions(+), 526 deletions(-) create mode 100644 src/main/java/org/rumbledb/runtime/functions/xml/GetRootFunctionIterator.java create mode 100644 src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot1.jq create mode 100644 src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot2.jq create mode 100644 src/test/resources/test_files/runtime/XPath/GetDescendants1.jq create mode 100644 src/test/resources/test_files/runtime/XPath/GetDescendants2.jq create mode 100644 src/test/resources/test_files/runtime/XPath/GetDescendants3.jq diff --git a/src/main/java/org/rumbledb/api/Item.java b/src/main/java/org/rumbledb/api/Item.java index 71a69a49a..5d1e6e379 100644 --- a/src/main/java/org/rumbledb/api/Item.java +++ b/src/main/java/org/rumbledb/api/Item.java @@ -302,7 +302,7 @@ default boolean isBase64Binary() { * * @return true if it is an XML Element node, false otherwise. */ - default boolean isElement() { + default boolean isElementNode() { return false; } @@ -311,7 +311,7 @@ default boolean isElement() { * * @return true if it is an XML Attribute node, false otherwise. */ - default boolean isAttribute() { + default boolean isAttributeNode() { return false; } @@ -329,7 +329,11 @@ default boolean getContent() { * * @return true if it is an XML Document node, false otherwise. */ - default boolean isDocument() { + default boolean isDocumentNode() { + return false; + } + + default boolean isTextNode() { return false; } diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index d3a1dbb02..4b6aec515 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -1429,12 +1429,13 @@ public RuntimeIterator visitPathExpr(PathExpr pathExpr, RuntimeIterator argument List stepExprIterators = new ArrayList<>(); pathExpr.getRelativePathExpressions() .forEach(relativePathExpr -> stepExprIterators.add(this.visit(relativePathExpr, argument))); + RuntimeIterator getRootIterator = null; if (pathExpr.needsRoot()) { - // TODO: add iterator for function getRoot() + getRootIterator = this.visitFunctionCall(pathExpr.getFetchRootFunction(), argument); } RuntimeIterator runtimeIterator = new PathExprIterator( stepExprIterators, - null, + getRootIterator, new RuntimeStaticContext( this.config, pathExpr.getStaticSequenceType(), @@ -1458,7 +1459,7 @@ public RuntimeIterator visitStepExpr(StepExpr stepExpr, RuntimeIterator argument predicatesIterator, new RuntimeStaticContext( this.config, - stepExpr.getStaticSequenceType(), + SequenceType.ITEM, stepExpr.getHighestExecutionMode(this.visitorConfig), stepExpr.getMetadata() ) @@ -1470,6 +1471,7 @@ private AxisIterator visitAxisStep(Step step, ExceptionMetadata metadata) { new AxisIteratorVisitor(), new RuntimeStaticContext( this.config, + SequenceType.STRING, ExecutionMode.LOCAL, metadata ) diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java index 8aeee2c82..479f647de 100644 --- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java @@ -643,6 +643,9 @@ public Node visitExprSimple(JsoniqParser.ExprSimpleContext ctx) { if (content instanceof JsoniqParser.TransformExprContext) { return this.visitTransformExpr((JsoniqParser.TransformExprContext) content); } + if (content instanceof JsoniqParser.PathExprContext) { + return this.visitPathExpr((JsoniqParser.PathExprContext) content); + } throw new OurBadException("Unrecognized ExprSimple."); } @@ -2307,7 +2310,12 @@ private Node visitSingleSlashNoStepExpr(JsoniqParser.PathExprContext ctx) { // Case: No StepExpr, only dash StepExpr stepExpr = new StepExpr(new NoStep(), createMetadataFromContext(ctx)); List intermediaryPaths = Collections.singletonList(stepExpr); - return new PathExpr(true, intermediaryPaths, createMetadataFromContext(ctx)); + FunctionCallExpression functionCallExpression = new FunctionCallExpression( + Name.createVariableInDefaultXQueryTypeNamespace("root"), + Collections.emptyList(), + createMetadataFromContext(ctx) + ); + return new PathExpr(functionCallExpression, intermediaryPaths, createMetadataFromContext(ctx)); } private Node visitRelativeWithoutSlash(JsoniqParser.RelativePathExprContext relativeContext) { @@ -2316,7 +2324,7 @@ private Node visitRelativeWithoutSlash(JsoniqParser.RelativePathExprContext rela return this.visitPostFixExpr(relativeContext.stepExpr(0).postFixExpr()); } List intermediaryPaths = getIntermediaryPaths(relativeContext); - return new PathExpr(false, intermediaryPaths, createMetadataFromContext(relativeContext)); + return new PathExpr(null, intermediaryPaths, createMetadataFromContext(relativeContext)); } private Node visitDoubleSlash(JsoniqParser.RelativePathExprContext doubleSlashContext) { @@ -2325,12 +2333,22 @@ private Node visitDoubleSlash(JsoniqParser.RelativePathExprContext doubleSlashCo createMetadataFromContext(doubleSlashContext) ); List intermediaryPaths = getIntermediaryPaths(stepExpr, doubleSlashContext); - return new PathExpr(true, intermediaryPaths, createMetadataFromContext(doubleSlashContext)); + FunctionCallExpression functionCallExpression = new FunctionCallExpression( + Name.createVariableInDefaultXQueryTypeNamespace("root"), + Collections.emptyList(), + createMetadataFromContext(doubleSlashContext) + ); + return new PathExpr(functionCallExpression, intermediaryPaths, createMetadataFromContext(doubleSlashContext)); } private Node visitSingleSlash(JsoniqParser.RelativePathExprContext singleSlashContext) { List intermediaryPaths = getIntermediaryPaths(singleSlashContext); - return new PathExpr(true, intermediaryPaths, createMetadataFromContext(singleSlashContext)); + FunctionCallExpression functionCallExpression = new FunctionCallExpression( + Name.createVariableInDefaultXQueryTypeNamespace("root"), + Collections.emptyList(), + createMetadataFromContext(singleSlashContext) + ); + return new PathExpr(functionCallExpression, intermediaryPaths, createMetadataFromContext(singleSlashContext)); } diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java index 97c24d8e4..f359b7a04 100644 --- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java +++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java @@ -145,6 +145,7 @@ import org.rumbledb.runtime.functions.strings.TranslateFunctionIterator; import org.rumbledb.runtime.functions.strings.UpperCaseFunctionIterator; import org.rumbledb.runtime.functions.typing.DynamicItemTypeIterator; +import org.rumbledb.runtime.functions.xml.GetRootFunctionIterator; import org.rumbledb.types.FunctionSignature; import org.rumbledb.types.SequenceType; import sparksoniq.spark.ml.AnnotateFunctionIterator; @@ -480,6 +481,21 @@ private static BuiltinFunction createBuiltinFunction( BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); + static final BuiltinFunction root_with_arg = createBuiltinFunction( + new Name(Name.FN_NS, "fn", "root"), + "item", + "item", + GetRootFunctionIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + + static final BuiltinFunction root_without_arg = createBuiltinFunction( + new Name(Name.FN_NS, "fn", "root"), + "item", + GetRootFunctionIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + /** * function that parses a text file */ @@ -3096,6 +3112,8 @@ private static BuiltinFunction createBuiltinFunction( random_sequence_with_bounds_seeded_int ); builtinFunctions.put(xml_doc.getIdentifier(), xml_doc); + builtinFunctions.put(root_with_arg.getIdentifier(), root_with_arg); + builtinFunctions.put(root_without_arg.getIdentifier(), root_without_arg); } diff --git a/src/main/java/org/rumbledb/expressions/xml/PathExpr.java b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java index af909f544..16f5fafee 100644 --- a/src/main/java/org/rumbledb/expressions/xml/PathExpr.java +++ b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java @@ -4,22 +4,22 @@ import org.rumbledb.expressions.AbstractNodeVisitor; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; +import org.rumbledb.expressions.primary.FunctionCallExpression; import java.util.ArrayList; import java.util.List; public class PathExpr extends Expression { private final List relativePathExpressions; - // TODO: Handle fetching. - private boolean fetchRoot; + private final FunctionCallExpression fetchRootFunction; public PathExpr( - boolean fetchRoot, + FunctionCallExpression fetchRootFunction, List relativePathExpressions, ExceptionMetadata metadata ) { super(metadata); - this.fetchRoot = fetchRoot; + this.fetchRootFunction = fetchRootFunction; this.relativePathExpressions = relativePathExpressions; } @@ -37,7 +37,7 @@ public List getChildren() { public void serializeToJSONiq(StringBuffer sb, int indent) { int pathCounter = 0; indentIt(sb, indent); - if (this.fetchRoot) { + if (this.fetchRootFunction != null) { sb.append("/"); } for (Expression stepExpr : this.relativePathExpressions) { @@ -54,6 +54,10 @@ public List getRelativePathExpressions() { } public boolean needsRoot() { - return this.fetchRoot; + return this.fetchRootFunction != null; + } + + public FunctionCallExpression getFetchRootFunction() { + return fetchRootFunction; } } diff --git a/src/main/java/org/rumbledb/items/xml/AttributeItem.java b/src/main/java/org/rumbledb/items/xml/AttributeItem.java index 2f3b38833..27bb17ab2 100644 --- a/src/main/java/org/rumbledb/items/xml/AttributeItem.java +++ b/src/main/java/org/rumbledb/items/xml/AttributeItem.java @@ -9,6 +9,7 @@ import org.w3c.dom.Node; public class AttributeItem implements Item { + private static final long serialVersionUID = 1L; private Node attributeNode; private Item parent; // TODO: add schema-type, typed-value, is-id, is-idrefs @@ -72,4 +73,9 @@ public boolean equals(Object other) { AttributeItem otherAttributeItem = (AttributeItem) other; return otherAttributeItem.attributeNode.isEqualNode(this.attributeNode); } + + @Override + public boolean isAttributeNode() { + return true; + } } diff --git a/src/main/java/org/rumbledb/items/xml/DocumentItem.java b/src/main/java/org/rumbledb/items/xml/DocumentItem.java index 8850d9a32..0f194a569 100644 --- a/src/main/java/org/rumbledb/items/xml/DocumentItem.java +++ b/src/main/java/org/rumbledb/items/xml/DocumentItem.java @@ -12,6 +12,7 @@ import java.util.List; public class DocumentItem implements Item { + private static final long serialVersionUID = 1L; private Node documentNode; private List children; // TODO: add base-uri, document-uri, typed-value @@ -77,4 +78,9 @@ public boolean equals(Object other) { DocumentItem otherDocumentItem = (DocumentItem) other; return otherDocumentItem.documentNode.isEqualNode(this.documentNode); } + + @Override + public boolean isDocumentNode() { + return true; + } } diff --git a/src/main/java/org/rumbledb/items/xml/ElementItem.java b/src/main/java/org/rumbledb/items/xml/ElementItem.java index 4030919bb..968f1c685 100644 --- a/src/main/java/org/rumbledb/items/xml/ElementItem.java +++ b/src/main/java/org/rumbledb/items/xml/ElementItem.java @@ -12,6 +12,7 @@ import java.util.List; public class ElementItem implements Item { + private static final long serialVersionUID = 1L; private List children; private List attributes; private Node elementNode; @@ -48,7 +49,7 @@ public void read(Kryo kryo, Input input) { } @Override - public boolean isElement() { + public boolean isElementNode() { return true; } diff --git a/src/main/java/org/rumbledb/items/xml/TextItem.java b/src/main/java/org/rumbledb/items/xml/TextItem.java index fe2b12ada..dc2dacba9 100644 --- a/src/main/java/org/rumbledb/items/xml/TextItem.java +++ b/src/main/java/org/rumbledb/items/xml/TextItem.java @@ -86,4 +86,8 @@ public ItemType getDynamicType() { return BuiltinTypesCatalogue.item; } + @Override + public boolean isTextNode() { + return true; + } } diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.g4 b/src/main/java/org/rumbledb/parser/Jsoniq.g4 index a82add5ba..490821edd 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.g4 +++ b/src/main/java/org/rumbledb/parser/Jsoniq.g4 @@ -365,7 +365,7 @@ forwardAxis: ( Kchild | Kfollowing_sibling | Kfollowing ) ':' ':' ; -abbrevForwardStep: Kat_symbol? nodeTest ; +abbrevForwardStep: Kat_symbol nodeTest ; reverseStep: (reverseAxis nodeTest) | abbrevReverseStep ; @@ -377,8 +377,11 @@ reverseAxis: ( Kparent abbrevReverseStep: '..' ; +// Causes issues nodeTest: nameTest | kindTest ; +//nodeTest: kindTest; + nameTest: qname | wildcard ; wildcard: '*' # allNames diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.interp b/src/main/java/org/rumbledb/parser/Jsoniq.interp index 32c5d571a..c467abd2d 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.interp +++ b/src/main/java/org/rumbledb/parser/Jsoniq.interp @@ -523,4 +523,4 @@ keyWords atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 178, 1603, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 337, 10, 3, 3, 3, 3, 3, 5, 3, 341, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 357, 10, 6, 3, 6, 3, 6, 7, 6, 361, 10, 6, 12, 6, 14, 6, 364, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 369, 10, 6, 12, 6, 14, 6, 372, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 377, 10, 8, 12, 8, 14, 8, 380, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 387, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 402, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 432, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 440, 10, 18, 12, 18, 14, 18, 443, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 462, 10, 20, 13, 20, 14, 20, 463, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 472, 10, 21, 13, 21, 14, 21, 473, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 482, 10, 22, 13, 22, 14, 22, 483, 3, 23, 3, 23, 3, 23, 5, 23, 489, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 494, 10, 23, 7, 23, 496, 10, 23, 12, 23, 14, 23, 499, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 508, 10, 24, 13, 24, 14, 24, 509, 3, 24, 3, 24, 5, 24, 514, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 523, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 528, 10, 25, 12, 25, 14, 25, 531, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 542, 10, 26, 12, 26, 14, 26, 545, 11, 26, 3, 26, 5, 26, 548, 10, 26, 3, 27, 7, 27, 551, 10, 27, 12, 27, 14, 27, 554, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 561, 10, 28, 12, 28, 14, 28, 564, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 571, 10, 29, 3, 29, 3, 29, 5, 29, 575, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 587, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 599, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 621, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 627, 10, 37, 12, 37, 14, 37, 630, 11, 37, 3, 38, 3, 38, 5, 38, 634, 10, 38, 3, 38, 5, 38, 637, 10, 38, 3, 38, 3, 38, 5, 38, 641, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 650, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 657, 10, 40, 12, 40, 14, 40, 660, 11, 40, 5, 40, 662, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 670, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 677, 10, 41, 5, 41, 679, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 686, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 693, 10, 42, 5, 42, 695, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 703, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 708, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 715, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 722, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 732, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 737, 10, 46, 12, 46, 14, 46, 740, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 746, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 751, 10, 48, 12, 48, 14, 48, 754, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 762, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 772, 10, 50, 3, 51, 3, 51, 5, 51, 776, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 784, 10, 51, 12, 51, 14, 51, 787, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 796, 10, 52, 12, 52, 14, 52, 799, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 804, 10, 53, 3, 53, 3, 53, 5, 53, 808, 10, 53, 3, 53, 3, 53, 5, 53, 812, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 821, 10, 54, 12, 54, 14, 54, 824, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 829, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 842, 10, 57, 12, 57, 14, 57, 845, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 850, 10, 58, 3, 58, 3, 58, 5, 58, 854, 10, 58, 3, 58, 3, 58, 5, 58, 858, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 865, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 870, 10, 59, 12, 59, 14, 59, 873, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 878, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 883, 10, 60, 5, 60, 885, 10, 60, 3, 60, 3, 60, 5, 60, 889, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 896, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 901, 10, 62, 12, 62, 14, 62, 904, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 912, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 922, 10, 64, 13, 64, 14, 64, 923, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 932, 10, 65, 13, 65, 14, 65, 933, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 944, 10, 66, 13, 66, 14, 66, 945, 3, 66, 3, 66, 5, 66, 950, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 959, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 964, 10, 67, 12, 67, 14, 67, 967, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 986, 10, 69, 13, 69, 14, 69, 987, 3, 70, 3, 70, 3, 70, 5, 70, 993, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 998, 10, 70, 7, 70, 1000, 10, 70, 12, 70, 14, 70, 1003, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 1012, 10, 71, 12, 71, 14, 71, 1015, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 1020, 10, 72, 12, 72, 14, 72, 1023, 11, 72, 3, 73, 5, 73, 1026, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 1033, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 1038, 10, 75, 12, 75, 14, 75, 1041, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 1046, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 1051, 10, 77, 12, 77, 14, 77, 1054, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 1059, 10, 78, 12, 78, 14, 78, 1062, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 1068, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1074, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1080, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1086, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1092, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1101, 10, 84, 12, 84, 14, 84, 1104, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1109, 10, 85, 3, 86, 7, 86, 1112, 10, 86, 12, 86, 14, 86, 1115, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1122, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1141, 10, 90, 12, 90, 14, 90, 1144, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1152, 10, 91, 12, 91, 14, 91, 1155, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1177, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1194, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1205, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1227, 10, 104, 7, 104, 1229, 10, 104, 12, 104, 14, 104, 1232, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1238, 10, 105, 3, 106, 3, 106, 5, 106, 1242, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1252, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1257, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1271, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1278, 10, 109, 12, 109, 14, 109, 1281, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1286, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1310, 10, 113, 12, 113, 14, 113, 1313, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1329, 10, 115, 13, 115, 14, 115, 1330, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 5, 117, 1339, 10, 117, 3, 117, 3, 117, 3, 117, 5, 117, 1344, 10, 117, 3, 118, 3, 118, 3, 118, 7, 118, 1349, 10, 118, 12, 118, 14, 118, 1352, 11, 118, 3, 119, 3, 119, 5, 119, 1356, 10, 119, 3, 120, 3, 120, 5, 120, 1360, 10, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 5, 121, 1368, 10, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 5, 123, 1375, 10, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 5, 124, 1383, 10, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 127, 3, 127, 5, 127, 1393, 10, 127, 3, 128, 3, 128, 5, 128, 1397, 10, 128, 3, 129, 3, 129, 3, 129, 5, 129, 1402, 10, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 7, 132, 1413, 10, 132, 12, 132, 14, 132, 1416, 11, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 5, 133, 1429, 10, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 5, 136, 1443, 10, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 5, 140, 1463, 10, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 5, 141, 1472, 10, 141, 5, 141, 1474, 10, 141, 3, 141, 3, 141, 3, 142, 3, 142, 5, 142, 1480, 10, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 5, 145, 1495, 10, 145, 5, 145, 1497, 10, 145, 5, 145, 1499, 10, 145, 3, 145, 3, 145, 3, 146, 3, 146, 5, 146, 1505, 10, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 149, 3, 149, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 5, 153, 1528, 10, 153, 5, 153, 1530, 10, 153, 3, 154, 3, 154, 3, 154, 3, 154, 7, 154, 1536, 10, 154, 12, 154, 14, 154, 1539, 11, 154, 5, 154, 1541, 10, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 5, 154, 1548, 10, 154, 3, 155, 3, 155, 3, 155, 5, 155, 1553, 10, 155, 3, 156, 3, 156, 5, 156, 1557, 10, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 7, 158, 1569, 10, 158, 12, 158, 14, 158, 1572, 11, 158, 5, 158, 1574, 10, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 5, 159, 1582, 10, 159, 3, 160, 3, 160, 5, 160, 1586, 10, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 5, 161, 1593, 10, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 2, 2, 165, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 2, 13, 4, 2, 17, 17, 105, 105, 3, 2, 82, 83, 3, 2, 20, 29, 4, 2, 5, 5, 35, 45, 3, 2, 47, 48, 4, 2, 12, 12, 49, 51, 3, 2, 131, 132, 3, 2, 134, 140, 3, 2, 141, 145, 4, 2, 19, 19, 168, 168, 5, 2, 61, 126, 161, 166, 169, 169, 2, 1667, 2, 328, 3, 2, 2, 2, 4, 336, 3, 2, 2, 2, 6, 342, 3, 2, 2, 2, 8, 345, 3, 2, 2, 2, 10, 362, 3, 2, 2, 2, 12, 373, 3, 2, 2, 2, 14, 378, 3, 2, 2, 2, 16, 381, 3, 2, 2, 2, 18, 384, 3, 2, 2, 2, 20, 401, 3, 2, 2, 2, 22, 403, 3, 2, 2, 2, 24, 406, 3, 2, 2, 2, 26, 412, 3, 2, 2, 2, 28, 416, 3, 2, 2, 2, 30, 420, 3, 2, 2, 2, 32, 424, 3, 2, 2, 2, 34, 431, 3, 2, 2, 2, 36, 447, 3, 2, 2, 2, 38, 456, 3, 2, 2, 2, 40, 471, 3, 2, 2, 2, 42, 478, 3, 2, 2, 2, 44, 485, 3, 2, 2, 2, 46, 502, 3, 2, 2, 2, 48, 518, 3, 2, 2, 2, 50, 535, 3, 2, 2, 2, 52, 552, 3, 2, 2, 2, 54, 555, 3, 2, 2, 2, 56, 567, 3, 2, 2, 2, 58, 576, 3, 2, 2, 2, 60, 586, 3, 2, 2, 2, 62, 588, 3, 2, 2, 2, 64, 598, 3, 2, 2, 2, 66, 600, 3, 2, 2, 2, 68, 605, 3, 2, 2, 2, 70, 609, 3, 2, 2, 2, 72, 615, 3, 2, 2, 2, 74, 636, 3, 2, 2, 2, 76, 642, 3, 2, 2, 2, 78, 644, 3, 2, 2, 2, 80, 663, 3, 2, 2, 2, 82, 680, 3, 2, 2, 2, 84, 696, 3, 2, 2, 2, 86, 716, 3, 2, 2, 2, 88, 731, 3, 2, 2, 2, 90, 733, 3, 2, 2, 2, 92, 741, 3, 2, 2, 2, 94, 747, 3, 2, 2, 2, 96, 761, 3, 2, 2, 2, 98, 771, 3, 2, 2, 2, 100, 775, 3, 2, 2, 2, 102, 791, 3, 2, 2, 2, 104, 800, 3, 2, 2, 2, 106, 816, 3, 2, 2, 2, 108, 825, 3, 2, 2, 2, 110, 833, 3, 2, 2, 2, 112, 836, 3, 2, 2, 2, 114, 846, 3, 2, 2, 2, 116, 864, 3, 2, 2, 2, 118, 874, 3, 2, 2, 2, 120, 890, 3, 2, 2, 2, 122, 895, 3, 2, 2, 2, 124, 908, 3, 2, 2, 2, 126, 916, 3, 2, 2, 2, 128, 931, 3, 2, 2, 2, 130, 938, 3, 2, 2, 2, 132, 954, 3, 2, 2, 2, 134, 971, 3, 2, 2, 2, 136, 980, 3, 2, 2, 2, 138, 989, 3, 2, 2, 2, 140, 1008, 3, 2, 2, 2, 142, 1016, 3, 2, 2, 2, 144, 1025, 3, 2, 2, 2, 146, 1029, 3, 2, 2, 2, 148, 1034, 3, 2, 2, 2, 150, 1042, 3, 2, 2, 2, 152, 1047, 3, 2, 2, 2, 154, 1055, 3, 2, 2, 2, 156, 1063, 3, 2, 2, 2, 158, 1069, 3, 2, 2, 2, 160, 1075, 3, 2, 2, 2, 162, 1081, 3, 2, 2, 2, 164, 1087, 3, 2, 2, 2, 166, 1093, 3, 2, 2, 2, 168, 1108, 3, 2, 2, 2, 170, 1113, 3, 2, 2, 2, 172, 1121, 3, 2, 2, 2, 174, 1123, 3, 2, 2, 2, 176, 1130, 3, 2, 2, 2, 178, 1137, 3, 2, 2, 2, 180, 1145, 3, 2, 2, 2, 182, 1156, 3, 2, 2, 2, 184, 1162, 3, 2, 2, 2, 186, 1165, 3, 2, 2, 2, 188, 1169, 3, 2, 2, 2, 190, 1193, 3, 2, 2, 2, 192, 1195, 3, 2, 2, 2, 194, 1199, 3, 2, 2, 2, 196, 1202, 3, 2, 2, 2, 198, 1208, 3, 2, 2, 2, 200, 1210, 3, 2, 2, 2, 202, 1215, 3, 2, 2, 2, 204, 1220, 3, 2, 2, 2, 206, 1223, 3, 2, 2, 2, 208, 1237, 3, 2, 2, 2, 210, 1241, 3, 2, 2, 2, 212, 1243, 3, 2, 2, 2, 214, 1247, 3, 2, 2, 2, 216, 1285, 3, 2, 2, 2, 218, 1287, 3, 2, 2, 2, 220, 1291, 3, 2, 2, 2, 222, 1297, 3, 2, 2, 2, 224, 1305, 3, 2, 2, 2, 226, 1319, 3, 2, 2, 2, 228, 1325, 3, 2, 2, 2, 230, 1332, 3, 2, 2, 2, 232, 1343, 3, 2, 2, 2, 234, 1345, 3, 2, 2, 2, 236, 1355, 3, 2, 2, 2, 238, 1359, 3, 2, 2, 2, 240, 1367, 3, 2, 2, 2, 242, 1369, 3, 2, 2, 2, 244, 1374, 3, 2, 2, 2, 246, 1382, 3, 2, 2, 2, 248, 1384, 3, 2, 2, 2, 250, 1388, 3, 2, 2, 2, 252, 1392, 3, 2, 2, 2, 254, 1396, 3, 2, 2, 2, 256, 1401, 3, 2, 2, 2, 258, 1403, 3, 2, 2, 2, 260, 1407, 3, 2, 2, 2, 262, 1414, 3, 2, 2, 2, 264, 1428, 3, 2, 2, 2, 266, 1430, 3, 2, 2, 2, 268, 1434, 3, 2, 2, 2, 270, 1438, 3, 2, 2, 2, 272, 1446, 3, 2, 2, 2, 274, 1450, 3, 2, 2, 2, 276, 1454, 3, 2, 2, 2, 278, 1458, 3, 2, 2, 2, 280, 1466, 3, 2, 2, 2, 282, 1479, 3, 2, 2, 2, 284, 1481, 3, 2, 2, 2, 286, 1486, 3, 2, 2, 2, 288, 1488, 3, 2, 2, 2, 290, 1504, 3, 2, 2, 2, 292, 1506, 3, 2, 2, 2, 294, 1511, 3, 2, 2, 2, 296, 1513, 3, 2, 2, 2, 298, 1515, 3, 2, 2, 2, 300, 1517, 3, 2, 2, 2, 302, 1519, 3, 2, 2, 2, 304, 1529, 3, 2, 2, 2, 306, 1547, 3, 2, 2, 2, 308, 1552, 3, 2, 2, 2, 310, 1556, 3, 2, 2, 2, 312, 1558, 3, 2, 2, 2, 314, 1563, 3, 2, 2, 2, 316, 1579, 3, 2, 2, 2, 318, 1585, 3, 2, 2, 2, 320, 1590, 3, 2, 2, 2, 322, 1596, 3, 2, 2, 2, 324, 1598, 3, 2, 2, 2, 326, 1600, 3, 2, 2, 2, 328, 329, 5, 4, 3, 2, 329, 330, 7, 2, 2, 3, 330, 3, 3, 2, 2, 2, 331, 332, 7, 104, 2, 2, 332, 333, 7, 103, 2, 2, 333, 334, 5, 324, 163, 2, 334, 335, 7, 3, 2, 2, 335, 337, 3, 2, 2, 2, 336, 331, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 341, 5, 8, 5, 2, 339, 341, 5, 6, 4, 2, 340, 338, 3, 2, 2, 2, 340, 339, 3, 2, 2, 2, 341, 5, 3, 2, 2, 2, 342, 343, 5, 10, 6, 2, 343, 344, 5, 12, 7, 2, 344, 7, 3, 2, 2, 2, 345, 346, 7, 4, 2, 2, 346, 347, 7, 129, 2, 2, 347, 348, 7, 176, 2, 2, 348, 349, 7, 5, 2, 2, 349, 350, 5, 322, 162, 2, 350, 351, 7, 3, 2, 2, 351, 352, 5, 10, 6, 2, 352, 9, 3, 2, 2, 2, 353, 357, 5, 60, 31, 2, 354, 357, 5, 62, 32, 2, 355, 357, 5, 78, 40, 2, 356, 353, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 355, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 359, 7, 3, 2, 2, 359, 361, 3, 2, 2, 2, 360, 356, 3, 2, 2, 2, 361, 364, 3, 2, 2, 2, 362, 360, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 370, 3, 2, 2, 2, 364, 362, 3, 2, 2, 2, 365, 366, 5, 64, 33, 2, 366, 367, 7, 3, 2, 2, 367, 369, 3, 2, 2, 2, 368, 365, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 368, 3, 2, 2, 2, 370, 371, 3, 2, 2, 2, 371, 11, 3, 2, 2, 2, 372, 370, 3, 2, 2, 2, 373, 374, 5, 18, 10, 2, 374, 13, 3, 2, 2, 2, 375, 377, 5, 20, 11, 2, 376, 375, 3, 2, 2, 2, 377, 380, 3, 2, 2, 2, 378, 376, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 15, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 381, 382, 5, 14, 8, 2, 382, 383, 5, 94, 48, 2, 383, 17, 3, 2, 2, 2, 384, 386, 5, 14, 8, 2, 385, 387, 5, 94, 48, 2, 386, 385, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 19, 3, 2, 2, 2, 388, 402, 5, 22, 12, 2, 389, 402, 5, 24, 13, 2, 390, 402, 5, 26, 14, 2, 391, 402, 5, 28, 15, 2, 392, 402, 5, 30, 16, 2, 393, 402, 5, 32, 17, 2, 394, 402, 5, 34, 18, 2, 395, 402, 5, 36, 19, 2, 396, 402, 5, 38, 20, 2, 397, 402, 5, 42, 22, 2, 398, 402, 5, 46, 24, 2, 399, 402, 5, 54, 28, 2, 400, 402, 5, 58, 30, 2, 401, 388, 3, 2, 2, 2, 401, 389, 3, 2, 2, 2, 401, 390, 3, 2, 2, 2, 401, 391, 3, 2, 2, 2, 401, 392, 3, 2, 2, 2, 401, 393, 3, 2, 2, 2, 401, 394, 3, 2, 2, 2, 401, 395, 3, 2, 2, 2, 401, 396, 3, 2, 2, 2, 401, 397, 3, 2, 2, 2, 401, 398, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 401, 400, 3, 2, 2, 2, 402, 21, 3, 2, 2, 2, 403, 404, 5, 98, 50, 2, 404, 405, 7, 3, 2, 2, 405, 23, 3, 2, 2, 2, 406, 407, 7, 6, 2, 2, 407, 408, 5, 74, 38, 2, 408, 409, 7, 7, 2, 2, 409, 410, 5, 96, 49, 2, 410, 411, 7, 3, 2, 2, 411, 25, 3, 2, 2, 2, 412, 413, 7, 8, 2, 2, 413, 414, 5, 14, 8, 2, 414, 415, 7, 9, 2, 2, 415, 27, 3, 2, 2, 2, 416, 417, 7, 161, 2, 2, 417, 418, 7, 162, 2, 2, 418, 419, 7, 3, 2, 2, 419, 29, 3, 2, 2, 2, 420, 421, 7, 163, 2, 2, 421, 422, 7, 162, 2, 2, 422, 423, 7, 3, 2, 2, 423, 31, 3, 2, 2, 2, 424, 425, 7, 164, 2, 2, 425, 426, 7, 165, 2, 2, 426, 427, 5, 96, 49, 2, 427, 428, 7, 3, 2, 2, 428, 33, 3, 2, 2, 2, 429, 432, 5, 102, 52, 2, 430, 432, 5, 106, 54, 2, 431, 429, 3, 2, 2, 2, 431, 430, 3, 2, 2, 2, 432, 441, 3, 2, 2, 2, 433, 440, 5, 102, 52, 2, 434, 440, 5, 106, 54, 2, 435, 440, 5, 110, 56, 2, 436, 440, 5, 112, 57, 2, 437, 440, 5, 116, 59, 2, 438, 440, 5, 120, 61, 2, 439, 433, 3, 2, 2, 2, 439, 434, 3, 2, 2, 2, 439, 435, 3, 2, 2, 2, 439, 436, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 438, 3, 2, 2, 2, 440, 443, 3, 2, 2, 2, 441, 439, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 444, 3, 2, 2, 2, 443, 441, 3, 2, 2, 2, 444, 445, 7, 67, 2, 2, 445, 446, 5, 20, 11, 2, 446, 35, 3, 2, 2, 2, 447, 448, 7, 68, 2, 2, 448, 449, 7, 10, 2, 2, 449, 450, 5, 94, 48, 2, 450, 451, 7, 11, 2, 2, 451, 452, 7, 89, 2, 2, 452, 453, 5, 20, 11, 2, 453, 454, 7, 90, 2, 2, 454, 455, 5, 20, 11, 2, 455, 37, 3, 2, 2, 2, 456, 457, 7, 84, 2, 2, 457, 458, 7, 10, 2, 2, 458, 459, 5, 94, 48, 2, 459, 461, 7, 11, 2, 2, 460, 462, 5, 40, 21, 2, 461, 460, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 461, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 88, 2, 2, 466, 467, 7, 67, 2, 2, 467, 468, 5, 20, 11, 2, 468, 39, 3, 2, 2, 2, 469, 470, 7, 85, 2, 2, 470, 472, 5, 96, 49, 2, 471, 469, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 7, 67, 2, 2, 476, 477, 5, 20, 11, 2, 477, 41, 3, 2, 2, 2, 478, 479, 7, 86, 2, 2, 479, 481, 5, 26, 14, 2, 480, 482, 5, 44, 23, 2, 481, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 43, 3, 2, 2, 2, 485, 488, 7, 87, 2, 2, 486, 489, 7, 12, 2, 2, 487, 489, 5, 74, 38, 2, 488, 486, 3, 2, 2, 2, 488, 487, 3, 2, 2, 2, 489, 497, 3, 2, 2, 2, 490, 493, 7, 13, 2, 2, 491, 494, 7, 12, 2, 2, 492, 494, 5, 74, 38, 2, 493, 491, 3, 2, 2, 2, 493, 492, 3, 2, 2, 2, 494, 496, 3, 2, 2, 2, 495, 490, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 500, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 500, 501, 5, 26, 14, 2, 501, 45, 3, 2, 2, 2, 502, 503, 7, 91, 2, 2, 503, 504, 7, 10, 2, 2, 504, 505, 5, 94, 48, 2, 505, 507, 7, 11, 2, 2, 506, 508, 5, 48, 25, 2, 507, 506, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 507, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 513, 7, 88, 2, 2, 512, 514, 5, 194, 98, 2, 513, 512, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 7, 67, 2, 2, 516, 517, 5, 20, 11, 2, 517, 47, 3, 2, 2, 2, 518, 522, 7, 85, 2, 2, 519, 520, 5, 194, 98, 2, 520, 521, 7, 70, 2, 2, 521, 523, 3, 2, 2, 2, 522, 519, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 524, 3, 2, 2, 2, 524, 529, 5, 304, 153, 2, 525, 526, 7, 13, 2, 2, 526, 528, 5, 304, 153, 2, 527, 525, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 532, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 533, 7, 67, 2, 2, 533, 534, 5, 20, 11, 2, 534, 49, 3, 2, 2, 2, 535, 536, 7, 14, 2, 2, 536, 547, 5, 74, 38, 2, 537, 538, 7, 10, 2, 2, 538, 543, 7, 170, 2, 2, 539, 540, 7, 15, 2, 2, 540, 542, 7, 170, 2, 2, 541, 539, 3, 2, 2, 2, 542, 545, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 546, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 546, 548, 7, 11, 2, 2, 547, 537, 3, 2, 2, 2, 547, 548, 3, 2, 2, 2, 548, 51, 3, 2, 2, 2, 549, 551, 5, 50, 26, 2, 550, 549, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 53, 3, 2, 2, 2, 554, 552, 3, 2, 2, 2, 555, 556, 5, 52, 27, 2, 556, 557, 7, 114, 2, 2, 557, 562, 5, 56, 29, 2, 558, 559, 7, 15, 2, 2, 559, 561, 5, 56, 29, 2, 560, 558, 3, 2, 2, 2, 561, 564, 3, 2, 2, 2, 562, 560, 3, 2, 2, 2, 562, 563, 3, 2, 2, 2, 563, 565, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 565, 566, 7, 3, 2, 2, 566, 55, 3, 2, 2, 2, 567, 570, 5, 194, 98, 2, 568, 569, 7, 70, 2, 2, 569, 571, 5, 304, 153, 2, 570, 568, 3, 2, 2, 2, 570, 571, 3, 2, 2, 2, 571, 574, 3, 2, 2, 2, 572, 573, 7, 7, 2, 2, 573, 575, 5, 96, 49, 2, 574, 572, 3, 2, 2, 2, 574, 575, 3, 2, 2, 2, 575, 57, 3, 2, 2, 2, 576, 577, 7, 166, 2, 2, 577, 578, 7, 10, 2, 2, 578, 579, 5, 94, 48, 2, 579, 580, 7, 11, 2, 2, 580, 581, 5, 20, 11, 2, 581, 59, 3, 2, 2, 2, 582, 587, 5, 66, 34, 2, 583, 587, 5, 68, 35, 2, 584, 587, 5, 70, 36, 2, 585, 587, 5, 72, 37, 2, 586, 582, 3, 2, 2, 2, 586, 583, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 586, 585, 3, 2, 2, 2, 587, 61, 3, 2, 2, 2, 588, 589, 7, 111, 2, 2, 589, 590, 7, 129, 2, 2, 590, 591, 7, 176, 2, 2, 591, 592, 7, 5, 2, 2, 592, 593, 5, 322, 162, 2, 593, 63, 3, 2, 2, 2, 594, 599, 5, 84, 43, 2, 595, 599, 5, 80, 41, 2, 596, 599, 5, 86, 44, 2, 597, 599, 5, 82, 42, 2, 598, 594, 3, 2, 2, 2, 598, 595, 3, 2, 2, 2, 598, 596, 3, 2, 2, 2, 598, 597, 3, 2, 2, 2, 599, 65, 3, 2, 2, 2, 600, 601, 7, 111, 2, 2, 601, 602, 7, 88, 2, 2, 602, 603, 7, 81, 2, 2, 603, 604, 5, 322, 162, 2, 604, 67, 3, 2, 2, 2, 605, 606, 7, 111, 2, 2, 606, 607, 7, 16, 2, 2, 607, 608, 9, 2, 2, 2, 608, 69, 3, 2, 2, 2, 609, 610, 7, 111, 2, 2, 610, 611, 7, 88, 2, 2, 611, 612, 7, 66, 2, 2, 612, 613, 7, 73, 2, 2, 613, 614, 9, 3, 2, 2, 614, 71, 3, 2, 2, 2, 615, 620, 7, 111, 2, 2, 616, 617, 7, 18, 2, 2, 617, 621, 5, 74, 38, 2, 618, 619, 7, 88, 2, 2, 619, 621, 7, 18, 2, 2, 620, 616, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 621, 628, 3, 2, 2, 2, 622, 623, 5, 76, 39, 2, 623, 624, 7, 5, 2, 2, 624, 625, 5, 324, 163, 2, 625, 627, 3, 2, 2, 2, 626, 622, 3, 2, 2, 2, 627, 630, 3, 2, 2, 2, 628, 626, 3, 2, 2, 2, 628, 629, 3, 2, 2, 2, 629, 73, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 631, 634, 7, 176, 2, 2, 632, 634, 5, 326, 164, 2, 633, 631, 3, 2, 2, 2, 633, 632, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 637, 7, 19, 2, 2, 636, 633, 3, 2, 2, 2, 636, 637, 3, 2, 2, 2, 637, 640, 3, 2, 2, 2, 638, 641, 7, 176, 2, 2, 639, 641, 5, 326, 164, 2, 640, 638, 3, 2, 2, 2, 640, 639, 3, 2, 2, 2, 641, 75, 3, 2, 2, 2, 642, 643, 9, 4, 2, 2, 643, 77, 3, 2, 2, 2, 644, 645, 7, 127, 2, 2, 645, 649, 7, 4, 2, 2, 646, 647, 7, 129, 2, 2, 647, 648, 7, 176, 2, 2, 648, 650, 7, 5, 2, 2, 649, 646, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 661, 5, 322, 162, 2, 652, 653, 7, 71, 2, 2, 653, 658, 5, 322, 162, 2, 654, 655, 7, 15, 2, 2, 655, 657, 5, 322, 162, 2, 656, 654, 3, 2, 2, 2, 657, 660, 3, 2, 2, 2, 658, 656, 3, 2, 2, 2, 658, 659, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 661, 652, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 79, 3, 2, 2, 2, 663, 664, 7, 111, 2, 2, 664, 665, 5, 52, 27, 2, 665, 666, 7, 114, 2, 2, 666, 669, 5, 194, 98, 2, 667, 668, 7, 70, 2, 2, 668, 670, 5, 304, 153, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 678, 3, 2, 2, 2, 671, 672, 7, 7, 2, 2, 672, 679, 5, 96, 49, 2, 673, 676, 7, 30, 2, 2, 674, 675, 7, 7, 2, 2, 675, 677, 5, 96, 49, 2, 676, 674, 3, 2, 2, 2, 676, 677, 3, 2, 2, 2, 677, 679, 3, 2, 2, 2, 678, 671, 3, 2, 2, 2, 678, 673, 3, 2, 2, 2, 679, 81, 3, 2, 2, 2, 680, 681, 7, 111, 2, 2, 681, 682, 7, 112, 2, 2, 682, 685, 7, 113, 2, 2, 683, 684, 7, 70, 2, 2, 684, 686, 5, 304, 153, 2, 685, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 694, 3, 2, 2, 2, 687, 688, 7, 7, 2, 2, 688, 695, 5, 96, 49, 2, 689, 692, 7, 30, 2, 2, 690, 691, 7, 7, 2, 2, 691, 693, 5, 96, 49, 2, 692, 690, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 695, 3, 2, 2, 2, 694, 687, 3, 2, 2, 2, 694, 689, 3, 2, 2, 2, 695, 83, 3, 2, 2, 2, 696, 697, 7, 111, 2, 2, 697, 698, 5, 52, 27, 2, 698, 699, 7, 31, 2, 2, 699, 700, 5, 74, 38, 2, 700, 702, 7, 10, 2, 2, 701, 703, 5, 90, 46, 2, 702, 701, 3, 2, 2, 2, 702, 703, 3, 2, 2, 2, 703, 704, 3, 2, 2, 2, 704, 707, 7, 11, 2, 2, 705, 706, 7, 70, 2, 2, 706, 708, 5, 304, 153, 2, 707, 705, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, 714, 3, 2, 2, 2, 709, 710, 7, 8, 2, 2, 710, 711, 5, 18, 10, 2, 711, 712, 7, 9, 2, 2, 712, 715, 3, 2, 2, 2, 713, 715, 7, 30, 2, 2, 714, 709, 3, 2, 2, 2, 714, 713, 3, 2, 2, 2, 715, 85, 3, 2, 2, 2, 716, 717, 7, 111, 2, 2, 717, 718, 7, 108, 2, 2, 718, 719, 5, 74, 38, 2, 719, 721, 7, 70, 2, 2, 720, 722, 5, 88, 45, 2, 721, 720, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 723, 3, 2, 2, 2, 723, 724, 5, 96, 49, 2, 724, 87, 3, 2, 2, 2, 725, 726, 7, 32, 2, 2, 726, 732, 7, 33, 2, 2, 727, 728, 7, 32, 2, 2, 728, 732, 7, 34, 2, 2, 729, 730, 7, 124, 2, 2, 730, 732, 7, 128, 2, 2, 731, 725, 3, 2, 2, 2, 731, 727, 3, 2, 2, 2, 731, 729, 3, 2, 2, 2, 732, 89, 3, 2, 2, 2, 733, 738, 5, 92, 47, 2, 734, 735, 7, 15, 2, 2, 735, 737, 5, 92, 47, 2, 736, 734, 3, 2, 2, 2, 737, 740, 3, 2, 2, 2, 738, 736, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 91, 3, 2, 2, 2, 740, 738, 3, 2, 2, 2, 741, 742, 7, 6, 2, 2, 742, 745, 5, 74, 38, 2, 743, 744, 7, 70, 2, 2, 744, 746, 5, 304, 153, 2, 745, 743, 3, 2, 2, 2, 745, 746, 3, 2, 2, 2, 746, 93, 3, 2, 2, 2, 747, 752, 5, 96, 49, 2, 748, 749, 7, 15, 2, 2, 749, 751, 5, 96, 49, 2, 750, 748, 3, 2, 2, 2, 751, 754, 3, 2, 2, 2, 752, 750, 3, 2, 2, 2, 752, 753, 3, 2, 2, 2, 753, 95, 3, 2, 2, 2, 754, 752, 3, 2, 2, 2, 755, 762, 5, 98, 50, 2, 756, 762, 5, 100, 51, 2, 757, 762, 5, 126, 64, 2, 758, 762, 5, 130, 66, 2, 759, 762, 5, 134, 68, 2, 760, 762, 5, 136, 69, 2, 761, 755, 3, 2, 2, 2, 761, 756, 3, 2, 2, 2, 761, 757, 3, 2, 2, 2, 761, 758, 3, 2, 2, 2, 761, 759, 3, 2, 2, 2, 761, 760, 3, 2, 2, 2, 762, 97, 3, 2, 2, 2, 763, 772, 5, 122, 62, 2, 764, 772, 5, 140, 71, 2, 765, 772, 5, 216, 109, 2, 766, 772, 5, 218, 110, 2, 767, 772, 5, 220, 111, 2, 768, 772, 5, 222, 112, 2, 769, 772, 5, 224, 113, 2, 770, 772, 5, 226, 114, 2, 771, 763, 3, 2, 2, 2, 771, 764, 3, 2, 2, 2, 771, 765, 3, 2, 2, 2, 771, 766, 3, 2, 2, 2, 771, 767, 3, 2, 2, 2, 771, 768, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 771, 770, 3, 2, 2, 2, 772, 99, 3, 2, 2, 2, 773, 776, 5, 102, 52, 2, 774, 776, 5, 106, 54, 2, 775, 773, 3, 2, 2, 2, 775, 774, 3, 2, 2, 2, 776, 785, 3, 2, 2, 2, 777, 784, 5, 102, 52, 2, 778, 784, 5, 106, 54, 2, 779, 784, 5, 110, 56, 2, 780, 784, 5, 112, 57, 2, 781, 784, 5, 116, 59, 2, 782, 784, 5, 120, 61, 2, 783, 777, 3, 2, 2, 2, 783, 778, 3, 2, 2, 2, 783, 779, 3, 2, 2, 2, 783, 780, 3, 2, 2, 2, 783, 781, 3, 2, 2, 2, 783, 782, 3, 2, 2, 2, 784, 787, 3, 2, 2, 2, 785, 783, 3, 2, 2, 2, 785, 786, 3, 2, 2, 2, 786, 788, 3, 2, 2, 2, 787, 785, 3, 2, 2, 2, 788, 789, 7, 67, 2, 2, 789, 790, 5, 96, 49, 2, 790, 101, 3, 2, 2, 2, 791, 792, 7, 61, 2, 2, 792, 797, 5, 104, 53, 2, 793, 794, 7, 15, 2, 2, 794, 796, 5, 104, 53, 2, 795, 793, 3, 2, 2, 2, 796, 799, 3, 2, 2, 2, 797, 795, 3, 2, 2, 2, 797, 798, 3, 2, 2, 2, 798, 103, 3, 2, 2, 2, 799, 797, 3, 2, 2, 2, 800, 803, 5, 194, 98, 2, 801, 802, 7, 70, 2, 2, 802, 804, 5, 304, 153, 2, 803, 801, 3, 2, 2, 2, 803, 804, 3, 2, 2, 2, 804, 807, 3, 2, 2, 2, 805, 806, 7, 72, 2, 2, 806, 808, 7, 73, 2, 2, 807, 805, 3, 2, 2, 2, 807, 808, 3, 2, 2, 2, 808, 811, 3, 2, 2, 2, 809, 810, 7, 71, 2, 2, 810, 812, 5, 194, 98, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 813, 3, 2, 2, 2, 813, 814, 7, 69, 2, 2, 814, 815, 5, 96, 49, 2, 815, 105, 3, 2, 2, 2, 816, 817, 7, 62, 2, 2, 817, 822, 5, 108, 55, 2, 818, 819, 7, 15, 2, 2, 819, 821, 5, 108, 55, 2, 820, 818, 3, 2, 2, 2, 821, 824, 3, 2, 2, 2, 822, 820, 3, 2, 2, 2, 822, 823, 3, 2, 2, 2, 823, 107, 3, 2, 2, 2, 824, 822, 3, 2, 2, 2, 825, 828, 5, 194, 98, 2, 826, 827, 7, 70, 2, 2, 827, 829, 5, 304, 153, 2, 828, 826, 3, 2, 2, 2, 828, 829, 3, 2, 2, 2, 829, 830, 3, 2, 2, 2, 830, 831, 7, 7, 2, 2, 831, 832, 5, 96, 49, 2, 832, 109, 3, 2, 2, 2, 833, 834, 7, 63, 2, 2, 834, 835, 5, 96, 49, 2, 835, 111, 3, 2, 2, 2, 836, 837, 7, 64, 2, 2, 837, 838, 7, 65, 2, 2, 838, 843, 5, 114, 58, 2, 839, 840, 7, 15, 2, 2, 840, 842, 5, 114, 58, 2, 841, 839, 3, 2, 2, 2, 842, 845, 3, 2, 2, 2, 843, 841, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 113, 3, 2, 2, 2, 845, 843, 3, 2, 2, 2, 846, 853, 5, 194, 98, 2, 847, 848, 7, 70, 2, 2, 848, 850, 5, 304, 153, 2, 849, 847, 3, 2, 2, 2, 849, 850, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 852, 7, 7, 2, 2, 852, 854, 5, 96, 49, 2, 853, 849, 3, 2, 2, 2, 853, 854, 3, 2, 2, 2, 854, 857, 3, 2, 2, 2, 855, 856, 7, 81, 2, 2, 856, 858, 5, 322, 162, 2, 857, 855, 3, 2, 2, 2, 857, 858, 3, 2, 2, 2, 858, 115, 3, 2, 2, 2, 859, 860, 7, 66, 2, 2, 860, 865, 7, 65, 2, 2, 861, 862, 7, 75, 2, 2, 862, 863, 7, 66, 2, 2, 863, 865, 7, 65, 2, 2, 864, 859, 3, 2, 2, 2, 864, 861, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 871, 5, 118, 60, 2, 867, 868, 7, 15, 2, 2, 868, 870, 5, 118, 60, 2, 869, 867, 3, 2, 2, 2, 870, 873, 3, 2, 2, 2, 871, 869, 3, 2, 2, 2, 871, 872, 3, 2, 2, 2, 872, 117, 3, 2, 2, 2, 873, 871, 3, 2, 2, 2, 874, 877, 5, 96, 49, 2, 875, 878, 7, 76, 2, 2, 876, 878, 7, 77, 2, 2, 877, 875, 3, 2, 2, 2, 877, 876, 3, 2, 2, 2, 877, 878, 3, 2, 2, 2, 878, 884, 3, 2, 2, 2, 879, 882, 7, 73, 2, 2, 880, 883, 7, 82, 2, 2, 881, 883, 7, 83, 2, 2, 882, 880, 3, 2, 2, 2, 882, 881, 3, 2, 2, 2, 883, 885, 3, 2, 2, 2, 884, 879, 3, 2, 2, 2, 884, 885, 3, 2, 2, 2, 885, 888, 3, 2, 2, 2, 886, 887, 7, 81, 2, 2, 887, 889, 5, 322, 162, 2, 888, 886, 3, 2, 2, 2, 888, 889, 3, 2, 2, 2, 889, 119, 3, 2, 2, 2, 890, 891, 7, 74, 2, 2, 891, 892, 5, 194, 98, 2, 892, 121, 3, 2, 2, 2, 893, 896, 7, 78, 2, 2, 894, 896, 7, 79, 2, 2, 895, 893, 3, 2, 2, 2, 895, 894, 3, 2, 2, 2, 896, 897, 3, 2, 2, 2, 897, 902, 5, 124, 63, 2, 898, 899, 7, 15, 2, 2, 899, 901, 5, 124, 63, 2, 900, 898, 3, 2, 2, 2, 901, 904, 3, 2, 2, 2, 902, 900, 3, 2, 2, 2, 902, 903, 3, 2, 2, 2, 903, 905, 3, 2, 2, 2, 904, 902, 3, 2, 2, 2, 905, 906, 7, 80, 2, 2, 906, 907, 5, 96, 49, 2, 907, 123, 3, 2, 2, 2, 908, 911, 5, 194, 98, 2, 909, 910, 7, 70, 2, 2, 910, 912, 5, 304, 153, 2, 911, 909, 3, 2, 2, 2, 911, 912, 3, 2, 2, 2, 912, 913, 3, 2, 2, 2, 913, 914, 7, 69, 2, 2, 914, 915, 5, 96, 49, 2, 915, 125, 3, 2, 2, 2, 916, 917, 7, 84, 2, 2, 917, 918, 7, 10, 2, 2, 918, 919, 5, 94, 48, 2, 919, 921, 7, 11, 2, 2, 920, 922, 5, 128, 65, 2, 921, 920, 3, 2, 2, 2, 922, 923, 3, 2, 2, 2, 923, 921, 3, 2, 2, 2, 923, 924, 3, 2, 2, 2, 924, 925, 3, 2, 2, 2, 925, 926, 7, 88, 2, 2, 926, 927, 7, 67, 2, 2, 927, 928, 5, 96, 49, 2, 928, 127, 3, 2, 2, 2, 929, 930, 7, 85, 2, 2, 930, 932, 5, 96, 49, 2, 931, 929, 3, 2, 2, 2, 932, 933, 3, 2, 2, 2, 933, 931, 3, 2, 2, 2, 933, 934, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 936, 7, 67, 2, 2, 936, 937, 5, 96, 49, 2, 937, 129, 3, 2, 2, 2, 938, 939, 7, 91, 2, 2, 939, 940, 7, 10, 2, 2, 940, 941, 5, 94, 48, 2, 941, 943, 7, 11, 2, 2, 942, 944, 5, 132, 67, 2, 943, 942, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 943, 3, 2, 2, 2, 945, 946, 3, 2, 2, 2, 946, 947, 3, 2, 2, 2, 947, 949, 7, 88, 2, 2, 948, 950, 5, 194, 98, 2, 949, 948, 3, 2, 2, 2, 949, 950, 3, 2, 2, 2, 950, 951, 3, 2, 2, 2, 951, 952, 7, 67, 2, 2, 952, 953, 5, 96, 49, 2, 953, 131, 3, 2, 2, 2, 954, 958, 7, 85, 2, 2, 955, 956, 5, 194, 98, 2, 956, 957, 7, 70, 2, 2, 957, 959, 3, 2, 2, 2, 958, 955, 3, 2, 2, 2, 958, 959, 3, 2, 2, 2, 959, 960, 3, 2, 2, 2, 960, 965, 5, 304, 153, 2, 961, 962, 7, 13, 2, 2, 962, 964, 5, 304, 153, 2, 963, 961, 3, 2, 2, 2, 964, 967, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 968, 3, 2, 2, 2, 967, 965, 3, 2, 2, 2, 968, 969, 7, 67, 2, 2, 969, 970, 5, 96, 49, 2, 970, 133, 3, 2, 2, 2, 971, 972, 7, 68, 2, 2, 972, 973, 7, 10, 2, 2, 973, 974, 5, 94, 48, 2, 974, 975, 7, 11, 2, 2, 975, 976, 7, 89, 2, 2, 976, 977, 5, 96, 49, 2, 977, 978, 7, 90, 2, 2, 978, 979, 5, 96, 49, 2, 979, 135, 3, 2, 2, 2, 980, 981, 7, 86, 2, 2, 981, 982, 7, 8, 2, 2, 982, 983, 5, 94, 48, 2, 983, 985, 7, 9, 2, 2, 984, 986, 5, 138, 70, 2, 985, 984, 3, 2, 2, 2, 986, 987, 3, 2, 2, 2, 987, 985, 3, 2, 2, 2, 987, 988, 3, 2, 2, 2, 988, 137, 3, 2, 2, 2, 989, 992, 7, 87, 2, 2, 990, 993, 7, 12, 2, 2, 991, 993, 5, 74, 38, 2, 992, 990, 3, 2, 2, 2, 992, 991, 3, 2, 2, 2, 993, 1001, 3, 2, 2, 2, 994, 997, 7, 13, 2, 2, 995, 998, 7, 12, 2, 2, 996, 998, 5, 74, 38, 2, 997, 995, 3, 2, 2, 2, 997, 996, 3, 2, 2, 2, 998, 1000, 3, 2, 2, 2, 999, 994, 3, 2, 2, 2, 1000, 1003, 3, 2, 2, 2, 1001, 999, 3, 2, 2, 2, 1001, 1002, 3, 2, 2, 2, 1002, 1004, 3, 2, 2, 2, 1003, 1001, 3, 2, 2, 2, 1004, 1005, 7, 8, 2, 2, 1005, 1006, 5, 94, 48, 2, 1006, 1007, 7, 9, 2, 2, 1007, 139, 3, 2, 2, 2, 1008, 1013, 5, 142, 72, 2, 1009, 1010, 7, 92, 2, 2, 1010, 1012, 5, 142, 72, 2, 1011, 1009, 3, 2, 2, 2, 1012, 1015, 3, 2, 2, 2, 1013, 1011, 3, 2, 2, 2, 1013, 1014, 3, 2, 2, 2, 1014, 141, 3, 2, 2, 2, 1015, 1013, 3, 2, 2, 2, 1016, 1021, 5, 144, 73, 2, 1017, 1018, 7, 93, 2, 2, 1018, 1020, 5, 144, 73, 2, 1019, 1017, 3, 2, 2, 2, 1020, 1023, 3, 2, 2, 2, 1021, 1019, 3, 2, 2, 2, 1021, 1022, 3, 2, 2, 2, 1022, 143, 3, 2, 2, 2, 1023, 1021, 3, 2, 2, 2, 1024, 1026, 7, 94, 2, 2, 1025, 1024, 3, 2, 2, 2, 1025, 1026, 3, 2, 2, 2, 1026, 1027, 3, 2, 2, 2, 1027, 1028, 5, 146, 74, 2, 1028, 145, 3, 2, 2, 2, 1029, 1032, 5, 148, 75, 2, 1030, 1031, 9, 5, 2, 2, 1031, 1033, 5, 148, 75, 2, 1032, 1030, 3, 2, 2, 2, 1032, 1033, 3, 2, 2, 2, 1033, 147, 3, 2, 2, 2, 1034, 1039, 5, 150, 76, 2, 1035, 1036, 7, 46, 2, 2, 1036, 1038, 5, 150, 76, 2, 1037, 1035, 3, 2, 2, 2, 1038, 1041, 3, 2, 2, 2, 1039, 1037, 3, 2, 2, 2, 1039, 1040, 3, 2, 2, 2, 1040, 149, 3, 2, 2, 2, 1041, 1039, 3, 2, 2, 2, 1042, 1045, 5, 152, 77, 2, 1043, 1044, 7, 95, 2, 2, 1044, 1046, 5, 152, 77, 2, 1045, 1043, 3, 2, 2, 2, 1045, 1046, 3, 2, 2, 2, 1046, 151, 3, 2, 2, 2, 1047, 1052, 5, 154, 78, 2, 1048, 1049, 9, 6, 2, 2, 1049, 1051, 5, 154, 78, 2, 1050, 1048, 3, 2, 2, 2, 1051, 1054, 3, 2, 2, 2, 1052, 1050, 3, 2, 2, 2, 1052, 1053, 3, 2, 2, 2, 1053, 153, 3, 2, 2, 2, 1054, 1052, 3, 2, 2, 2, 1055, 1060, 5, 156, 79, 2, 1056, 1057, 9, 7, 2, 2, 1057, 1059, 5, 156, 79, 2, 1058, 1056, 3, 2, 2, 2, 1059, 1062, 3, 2, 2, 2, 1060, 1058, 3, 2, 2, 2, 1060, 1061, 3, 2, 2, 2, 1061, 155, 3, 2, 2, 2, 1062, 1060, 3, 2, 2, 2, 1063, 1067, 5, 158, 80, 2, 1064, 1065, 7, 96, 2, 2, 1065, 1066, 7, 97, 2, 2, 1066, 1068, 5, 304, 153, 2, 1067, 1064, 3, 2, 2, 2, 1067, 1068, 3, 2, 2, 2, 1068, 157, 3, 2, 2, 2, 1069, 1073, 5, 160, 81, 2, 1070, 1071, 7, 99, 2, 2, 1071, 1072, 7, 98, 2, 2, 1072, 1074, 5, 304, 153, 2, 1073, 1070, 3, 2, 2, 2, 1073, 1074, 3, 2, 2, 2, 1074, 159, 3, 2, 2, 2, 1075, 1079, 5, 162, 82, 2, 1076, 1077, 7, 100, 2, 2, 1077, 1078, 7, 70, 2, 2, 1078, 1080, 5, 304, 153, 2, 1079, 1076, 3, 2, 2, 2, 1079, 1080, 3, 2, 2, 2, 1080, 161, 3, 2, 2, 2, 1081, 1085, 5, 164, 83, 2, 1082, 1083, 7, 102, 2, 2, 1083, 1084, 7, 70, 2, 2, 1084, 1086, 5, 316, 159, 2, 1085, 1082, 3, 2, 2, 2, 1085, 1086, 3, 2, 2, 2, 1086, 163, 3, 2, 2, 2, 1087, 1091, 5, 166, 84, 2, 1088, 1089, 7, 101, 2, 2, 1089, 1090, 7, 70, 2, 2, 1090, 1092, 5, 316, 159, 2, 1091, 1088, 3, 2, 2, 2, 1091, 1092, 3, 2, 2, 2, 1092, 165, 3, 2, 2, 2, 1093, 1102, 5, 170, 86, 2, 1094, 1095, 7, 5, 2, 2, 1095, 1096, 7, 44, 2, 2, 1096, 1097, 3, 2, 2, 2, 1097, 1098, 5, 168, 85, 2, 1098, 1099, 5, 206, 104, 2, 1099, 1101, 3, 2, 2, 2, 1100, 1094, 3, 2, 2, 2, 1101, 1104, 3, 2, 2, 2, 1102, 1100, 3, 2, 2, 2, 1102, 1103, 3, 2, 2, 2, 1103, 167, 3, 2, 2, 2, 1104, 1102, 3, 2, 2, 2, 1105, 1109, 5, 74, 38, 2, 1106, 1109, 5, 194, 98, 2, 1107, 1109, 5, 196, 99, 2, 1108, 1105, 3, 2, 2, 2, 1108, 1106, 3, 2, 2, 2, 1108, 1107, 3, 2, 2, 2, 1109, 169, 3, 2, 2, 2, 1110, 1112, 9, 6, 2, 2, 1111, 1110, 3, 2, 2, 2, 1112, 1115, 3, 2, 2, 2, 1113, 1111, 3, 2, 2, 2, 1113, 1114, 3, 2, 2, 2, 1114, 1116, 3, 2, 2, 2, 1115, 1113, 3, 2, 2, 2, 1116, 1117, 5, 172, 87, 2, 1117, 171, 3, 2, 2, 2, 1118, 1122, 5, 178, 90, 2, 1119, 1122, 5, 174, 88, 2, 1120, 1122, 5, 176, 89, 2, 1121, 1118, 3, 2, 2, 2, 1121, 1119, 3, 2, 2, 2, 1121, 1120, 3, 2, 2, 2, 1122, 173, 3, 2, 2, 2, 1123, 1124, 7, 109, 2, 2, 1124, 1125, 7, 108, 2, 2, 1125, 1126, 5, 304, 153, 2, 1126, 1127, 7, 8, 2, 2, 1127, 1128, 5, 94, 48, 2, 1128, 1129, 7, 9, 2, 2, 1129, 175, 3, 2, 2, 2, 1130, 1131, 7, 110, 2, 2, 1131, 1132, 7, 108, 2, 2, 1132, 1133, 5, 304, 153, 2, 1133, 1134, 7, 8, 2, 2, 1134, 1135, 5, 94, 48, 2, 1135, 1136, 7, 9, 2, 2, 1136, 177, 3, 2, 2, 2, 1137, 1142, 5, 232, 117, 2, 1138, 1139, 7, 52, 2, 2, 1139, 1141, 5, 232, 117, 2, 1140, 1138, 3, 2, 2, 2, 1141, 1144, 3, 2, 2, 2, 1142, 1140, 3, 2, 2, 2, 1142, 1143, 3, 2, 2, 2, 1143, 179, 3, 2, 2, 2, 1144, 1142, 3, 2, 2, 2, 1145, 1153, 5, 190, 96, 2, 1146, 1152, 5, 182, 92, 2, 1147, 1152, 5, 186, 94, 2, 1148, 1152, 5, 188, 95, 2, 1149, 1152, 5, 184, 93, 2, 1150, 1152, 5, 206, 104, 2, 1151, 1146, 3, 2, 2, 2, 1151, 1147, 3, 2, 2, 2, 1151, 1148, 3, 2, 2, 2, 1151, 1149, 3, 2, 2, 2, 1151, 1150, 3, 2, 2, 2, 1152, 1155, 3, 2, 2, 2, 1153, 1151, 3, 2, 2, 2, 1153, 1154, 3, 2, 2, 2, 1154, 181, 3, 2, 2, 2, 1155, 1153, 3, 2, 2, 2, 1156, 1157, 7, 53, 2, 2, 1157, 1158, 7, 53, 2, 2, 1158, 1159, 5, 94, 48, 2, 1159, 1160, 7, 54, 2, 2, 1160, 1161, 7, 54, 2, 2, 1161, 183, 3, 2, 2, 2, 1162, 1163, 7, 53, 2, 2, 1163, 1164, 7, 54, 2, 2, 1164, 185, 3, 2, 2, 2, 1165, 1166, 7, 53, 2, 2, 1166, 1167, 5, 94, 48, 2, 1167, 1168, 7, 54, 2, 2, 1168, 187, 3, 2, 2, 2, 1169, 1176, 7, 55, 2, 2, 1170, 1177, 5, 326, 164, 2, 1171, 1177, 5, 324, 163, 2, 1172, 1177, 7, 176, 2, 2, 1173, 1177, 5, 196, 99, 2, 1174, 1177, 5, 194, 98, 2, 1175, 1177, 5, 198, 100, 2, 1176, 1170, 3, 2, 2, 2, 1176, 1171, 3, 2, 2, 2, 1176, 1172, 3, 2, 2, 2, 1176, 1173, 3, 2, 2, 2, 1176, 1174, 3, 2, 2, 2, 1176, 1175, 3, 2, 2, 2, 1177, 189, 3, 2, 2, 2, 1178, 1194, 7, 169, 2, 2, 1179, 1194, 7, 106, 2, 2, 1180, 1194, 7, 107, 2, 2, 1181, 1194, 7, 170, 2, 2, 1182, 1194, 5, 324, 163, 2, 1183, 1194, 5, 194, 98, 2, 1184, 1194, 5, 196, 99, 2, 1185, 1194, 5, 198, 100, 2, 1186, 1194, 5, 306, 154, 2, 1187, 1194, 5, 204, 103, 2, 1188, 1194, 5, 200, 101, 2, 1189, 1194, 5, 202, 102, 2, 1190, 1194, 5, 320, 161, 2, 1191, 1194, 5, 210, 106, 2, 1192, 1194, 5, 192, 97, 2, 1193, 1178, 3, 2, 2, 2, 1193, 1179, 3, 2, 2, 2, 1193, 1180, 3, 2, 2, 2, 1193, 1181, 3, 2, 2, 2, 1193, 1182, 3, 2, 2, 2, 1193, 1183, 3, 2, 2, 2, 1193, 1184, 3, 2, 2, 2, 1193, 1185, 3, 2, 2, 2, 1193, 1186, 3, 2, 2, 2, 1193, 1187, 3, 2, 2, 2, 1193, 1188, 3, 2, 2, 2, 1193, 1189, 3, 2, 2, 2, 1193, 1190, 3, 2, 2, 2, 1193, 1191, 3, 2, 2, 2, 1193, 1192, 3, 2, 2, 2, 1194, 191, 3, 2, 2, 2, 1195, 1196, 7, 8, 2, 2, 1196, 1197, 5, 16, 9, 2, 1197, 1198, 7, 9, 2, 2, 1198, 193, 3, 2, 2, 2, 1199, 1200, 7, 6, 2, 2, 1200, 1201, 5, 74, 38, 2, 1201, 195, 3, 2, 2, 2, 1202, 1204, 7, 10, 2, 2, 1203, 1205, 5, 94, 48, 2, 1204, 1203, 3, 2, 2, 2, 1204, 1205, 3, 2, 2, 2, 1205, 1206, 3, 2, 2, 2, 1206, 1207, 7, 11, 2, 2, 1207, 197, 3, 2, 2, 2, 1208, 1209, 7, 56, 2, 2, 1209, 199, 3, 2, 2, 2, 1210, 1211, 7, 17, 2, 2, 1211, 1212, 7, 8, 2, 2, 1212, 1213, 5, 94, 48, 2, 1213, 1214, 7, 9, 2, 2, 1214, 201, 3, 2, 2, 2, 1215, 1216, 7, 105, 2, 2, 1216, 1217, 7, 8, 2, 2, 1217, 1218, 5, 94, 48, 2, 1218, 1219, 7, 9, 2, 2, 1219, 203, 3, 2, 2, 2, 1220, 1221, 5, 74, 38, 2, 1221, 1222, 5, 206, 104, 2, 1222, 205, 3, 2, 2, 2, 1223, 1230, 7, 10, 2, 2, 1224, 1226, 5, 208, 105, 2, 1225, 1227, 7, 15, 2, 2, 1226, 1225, 3, 2, 2, 2, 1226, 1227, 3, 2, 2, 2, 1227, 1229, 3, 2, 2, 2, 1228, 1224, 3, 2, 2, 2, 1229, 1232, 3, 2, 2, 2, 1230, 1228, 3, 2, 2, 2, 1230, 1231, 3, 2, 2, 2, 1231, 1233, 3, 2, 2, 2, 1232, 1230, 3, 2, 2, 2, 1233, 1234, 7, 11, 2, 2, 1234, 207, 3, 2, 2, 2, 1235, 1238, 5, 96, 49, 2, 1236, 1238, 7, 168, 2, 2, 1237, 1235, 3, 2, 2, 2, 1237, 1236, 3, 2, 2, 2, 1238, 209, 3, 2, 2, 2, 1239, 1242, 5, 212, 107, 2, 1240, 1242, 5, 214, 108, 2, 1241, 1239, 3, 2, 2, 2, 1241, 1240, 3, 2, 2, 2, 1242, 211, 3, 2, 2, 2, 1243, 1244, 5, 74, 38, 2, 1244, 1245, 7, 57, 2, 2, 1245, 1246, 7, 170, 2, 2, 1246, 213, 3, 2, 2, 2, 1247, 1248, 5, 52, 27, 2, 1248, 1249, 7, 31, 2, 2, 1249, 1251, 7, 10, 2, 2, 1250, 1252, 5, 90, 46, 2, 1251, 1250, 3, 2, 2, 2, 1251, 1252, 3, 2, 2, 2, 1252, 1253, 3, 2, 2, 2, 1253, 1256, 7, 11, 2, 2, 1254, 1255, 7, 70, 2, 2, 1255, 1257, 5, 304, 153, 2, 1256, 1254, 3, 2, 2, 2, 1256, 1257, 3, 2, 2, 2, 1257, 1258, 3, 2, 2, 2, 1258, 1259, 7, 8, 2, 2, 1259, 1260, 5, 18, 10, 2, 1260, 1261, 7, 9, 2, 2, 1261, 215, 3, 2, 2, 2, 1262, 1263, 7, 115, 2, 2, 1263, 1264, 7, 124, 2, 2, 1264, 1265, 5, 96, 49, 2, 1265, 1266, 7, 122, 2, 2, 1266, 1270, 5, 96, 49, 2, 1267, 1268, 7, 71, 2, 2, 1268, 1269, 7, 126, 2, 2, 1269, 1271, 5, 96, 49, 2, 1270, 1267, 3, 2, 2, 2, 1270, 1271, 3, 2, 2, 2, 1271, 1286, 3, 2, 2, 2, 1272, 1273, 7, 115, 2, 2, 1273, 1274, 7, 124, 2, 2, 1274, 1279, 5, 318, 160, 2, 1275, 1276, 7, 15, 2, 2, 1276, 1278, 5, 318, 160, 2, 1277, 1275, 3, 2, 2, 2, 1278, 1281, 3, 2, 2, 2, 1279, 1277, 3, 2, 2, 2, 1279, 1280, 3, 2, 2, 2, 1280, 1282, 3, 2, 2, 2, 1281, 1279, 3, 2, 2, 2, 1282, 1283, 7, 122, 2, 2, 1283, 1284, 5, 96, 49, 2, 1284, 1286, 3, 2, 2, 2, 1285, 1262, 3, 2, 2, 2, 1285, 1272, 3, 2, 2, 2, 1286, 217, 3, 2, 2, 2, 1287, 1288, 7, 116, 2, 2, 1288, 1289, 7, 124, 2, 2, 1289, 1290, 5, 228, 115, 2, 1290, 219, 3, 2, 2, 2, 1291, 1292, 7, 117, 2, 2, 1292, 1293, 7, 124, 2, 2, 1293, 1294, 5, 228, 115, 2, 1294, 1295, 7, 70, 2, 2, 1295, 1296, 5, 96, 49, 2, 1296, 221, 3, 2, 2, 2, 1297, 1298, 7, 118, 2, 2, 1298, 1299, 7, 123, 2, 2, 1299, 1300, 7, 97, 2, 2, 1300, 1301, 7, 124, 2, 2, 1301, 1302, 5, 228, 115, 2, 1302, 1303, 7, 125, 2, 2, 1303, 1304, 5, 96, 49, 2, 1304, 223, 3, 2, 2, 2, 1305, 1306, 7, 119, 2, 2, 1306, 1311, 5, 230, 116, 2, 1307, 1308, 7, 15, 2, 2, 1308, 1310, 5, 230, 116, 2, 1309, 1307, 3, 2, 2, 2, 1310, 1313, 3, 2, 2, 2, 1311, 1309, 3, 2, 2, 2, 1311, 1312, 3, 2, 2, 2, 1312, 1314, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1314, 1315, 7, 120, 2, 2, 1315, 1316, 5, 96, 49, 2, 1316, 1317, 7, 67, 2, 2, 1317, 1318, 5, 96, 49, 2, 1318, 225, 3, 2, 2, 2, 1319, 1320, 7, 121, 2, 2, 1320, 1321, 7, 124, 2, 2, 1321, 1322, 5, 96, 49, 2, 1322, 1323, 7, 122, 2, 2, 1323, 1324, 5, 96, 49, 2, 1324, 227, 3, 2, 2, 2, 1325, 1328, 5, 190, 96, 2, 1326, 1329, 5, 182, 92, 2, 1327, 1329, 5, 188, 95, 2, 1328, 1326, 3, 2, 2, 2, 1328, 1327, 3, 2, 2, 2, 1329, 1330, 3, 2, 2, 2, 1330, 1328, 3, 2, 2, 2, 1330, 1331, 3, 2, 2, 2, 1331, 229, 3, 2, 2, 2, 1332, 1333, 5, 194, 98, 2, 1333, 1334, 7, 7, 2, 2, 1334, 1335, 5, 96, 49, 2, 1335, 231, 3, 2, 2, 2, 1336, 1338, 7, 131, 2, 2, 1337, 1339, 5, 234, 118, 2, 1338, 1337, 3, 2, 2, 2, 1338, 1339, 3, 2, 2, 2, 1339, 1344, 3, 2, 2, 2, 1340, 1341, 7, 132, 2, 2, 1341, 1344, 5, 234, 118, 2, 1342, 1344, 5, 234, 118, 2, 1343, 1336, 3, 2, 2, 2, 1343, 1340, 3, 2, 2, 2, 1343, 1342, 3, 2, 2, 2, 1344, 233, 3, 2, 2, 2, 1345, 1350, 5, 236, 119, 2, 1346, 1347, 9, 8, 2, 2, 1347, 1349, 5, 236, 119, 2, 1348, 1346, 3, 2, 2, 2, 1349, 1352, 3, 2, 2, 2, 1350, 1348, 3, 2, 2, 2, 1350, 1351, 3, 2, 2, 2, 1351, 235, 3, 2, 2, 2, 1352, 1350, 3, 2, 2, 2, 1353, 1356, 5, 180, 91, 2, 1354, 1356, 5, 238, 120, 2, 1355, 1353, 3, 2, 2, 2, 1355, 1354, 3, 2, 2, 2, 1356, 237, 3, 2, 2, 2, 1357, 1360, 5, 246, 124, 2, 1358, 1360, 5, 240, 121, 2, 1359, 1357, 3, 2, 2, 2, 1359, 1358, 3, 2, 2, 2, 1360, 1361, 3, 2, 2, 2, 1361, 1362, 5, 262, 132, 2, 1362, 239, 3, 2, 2, 2, 1363, 1364, 5, 242, 122, 2, 1364, 1365, 5, 252, 127, 2, 1365, 1368, 3, 2, 2, 2, 1366, 1368, 5, 244, 123, 2, 1367, 1363, 3, 2, 2, 2, 1367, 1366, 3, 2, 2, 2, 1368, 241, 3, 2, 2, 2, 1369, 1370, 9, 9, 2, 2, 1370, 1371, 7, 19, 2, 2, 1371, 1372, 7, 19, 2, 2, 1372, 243, 3, 2, 2, 2, 1373, 1375, 7, 133, 2, 2, 1374, 1373, 3, 2, 2, 2, 1374, 1375, 3, 2, 2, 2, 1375, 1376, 3, 2, 2, 2, 1376, 1377, 5, 252, 127, 2, 1377, 245, 3, 2, 2, 2, 1378, 1379, 5, 248, 125, 2, 1379, 1380, 5, 252, 127, 2, 1380, 1383, 3, 2, 2, 2, 1381, 1383, 5, 250, 126, 2, 1382, 1378, 3, 2, 2, 2, 1382, 1381, 3, 2, 2, 2, 1383, 247, 3, 2, 2, 2, 1384, 1385, 9, 10, 2, 2, 1385, 1386, 7, 19, 2, 2, 1386, 1387, 7, 19, 2, 2, 1387, 249, 3, 2, 2, 2, 1388, 1389, 7, 58, 2, 2, 1389, 251, 3, 2, 2, 2, 1390, 1393, 5, 254, 128, 2, 1391, 1393, 5, 264, 133, 2, 1392, 1390, 3, 2, 2, 2, 1392, 1391, 3, 2, 2, 2, 1393, 253, 3, 2, 2, 2, 1394, 1397, 5, 74, 38, 2, 1395, 1397, 5, 256, 129, 2, 1396, 1394, 3, 2, 2, 2, 1396, 1395, 3, 2, 2, 2, 1397, 255, 3, 2, 2, 2, 1398, 1402, 7, 12, 2, 2, 1399, 1402, 5, 258, 130, 2, 1400, 1402, 5, 260, 131, 2, 1401, 1398, 3, 2, 2, 2, 1401, 1399, 3, 2, 2, 2, 1401, 1400, 3, 2, 2, 2, 1402, 257, 3, 2, 2, 2, 1403, 1404, 7, 176, 2, 2, 1404, 1405, 7, 19, 2, 2, 1405, 1406, 7, 12, 2, 2, 1406, 259, 3, 2, 2, 2, 1407, 1408, 7, 12, 2, 2, 1408, 1409, 7, 19, 2, 2, 1409, 1410, 7, 176, 2, 2, 1410, 261, 3, 2, 2, 2, 1411, 1413, 5, 186, 94, 2, 1412, 1411, 3, 2, 2, 2, 1413, 1416, 3, 2, 2, 2, 1414, 1412, 3, 2, 2, 2, 1414, 1415, 3, 2, 2, 2, 1415, 263, 3, 2, 2, 2, 1416, 1414, 3, 2, 2, 2, 1417, 1429, 5, 270, 136, 2, 1418, 1429, 5, 288, 145, 2, 1419, 1429, 5, 280, 141, 2, 1420, 1429, 5, 292, 147, 2, 1421, 1429, 5, 284, 143, 2, 1422, 1429, 5, 278, 140, 2, 1423, 1429, 5, 274, 138, 2, 1424, 1429, 5, 272, 137, 2, 1425, 1429, 5, 276, 139, 2, 1426, 1429, 5, 268, 135, 2, 1427, 1429, 5, 266, 134, 2, 1428, 1417, 3, 2, 2, 2, 1428, 1418, 3, 2, 2, 2, 1428, 1419, 3, 2, 2, 2, 1428, 1420, 3, 2, 2, 2, 1428, 1421, 3, 2, 2, 2, 1428, 1422, 3, 2, 2, 2, 1428, 1423, 3, 2, 2, 2, 1428, 1424, 3, 2, 2, 2, 1428, 1425, 3, 2, 2, 2, 1428, 1426, 3, 2, 2, 2, 1428, 1427, 3, 2, 2, 2, 1429, 265, 3, 2, 2, 2, 1430, 1431, 7, 146, 2, 2, 1431, 1432, 7, 10, 2, 2, 1432, 1433, 7, 11, 2, 2, 1433, 267, 3, 2, 2, 2, 1434, 1435, 7, 147, 2, 2, 1435, 1436, 7, 10, 2, 2, 1436, 1437, 7, 11, 2, 2, 1437, 269, 3, 2, 2, 2, 1438, 1439, 7, 149, 2, 2, 1439, 1442, 7, 10, 2, 2, 1440, 1443, 5, 288, 145, 2, 1441, 1443, 5, 292, 147, 2, 1442, 1440, 3, 2, 2, 2, 1442, 1441, 3, 2, 2, 2, 1442, 1443, 3, 2, 2, 2, 1443, 1444, 3, 2, 2, 2, 1444, 1445, 7, 11, 2, 2, 1445, 271, 3, 2, 2, 2, 1446, 1447, 7, 150, 2, 2, 1447, 1448, 7, 10, 2, 2, 1448, 1449, 7, 11, 2, 2, 1449, 273, 3, 2, 2, 2, 1450, 1451, 7, 160, 2, 2, 1451, 1452, 7, 10, 2, 2, 1452, 1453, 7, 11, 2, 2, 1453, 275, 3, 2, 2, 2, 1454, 1455, 7, 152, 2, 2, 1455, 1456, 7, 10, 2, 2, 1456, 1457, 7, 11, 2, 2, 1457, 277, 3, 2, 2, 2, 1458, 1459, 7, 151, 2, 2, 1459, 1462, 7, 10, 2, 2, 1460, 1463, 7, 176, 2, 2, 1461, 1463, 5, 324, 163, 2, 1462, 1460, 3, 2, 2, 2, 1462, 1461, 3, 2, 2, 2, 1462, 1463, 3, 2, 2, 2, 1463, 1464, 3, 2, 2, 2, 1464, 1465, 7, 11, 2, 2, 1465, 279, 3, 2, 2, 2, 1466, 1467, 7, 136, 2, 2, 1467, 1473, 7, 10, 2, 2, 1468, 1471, 5, 282, 142, 2, 1469, 1470, 7, 15, 2, 2, 1470, 1472, 5, 302, 152, 2, 1471, 1469, 3, 2, 2, 2, 1471, 1472, 3, 2, 2, 2, 1472, 1474, 3, 2, 2, 2, 1473, 1468, 3, 2, 2, 2, 1473, 1474, 3, 2, 2, 2, 1474, 1475, 3, 2, 2, 2, 1475, 1476, 7, 11, 2, 2, 1476, 281, 3, 2, 2, 2, 1477, 1480, 5, 296, 149, 2, 1478, 1480, 7, 12, 2, 2, 1479, 1477, 3, 2, 2, 2, 1479, 1478, 3, 2, 2, 2, 1480, 283, 3, 2, 2, 2, 1481, 1482, 7, 153, 2, 2, 1482, 1483, 7, 10, 2, 2, 1483, 1484, 5, 286, 144, 2, 1484, 1485, 7, 11, 2, 2, 1485, 285, 3, 2, 2, 2, 1486, 1487, 5, 296, 149, 2, 1487, 287, 3, 2, 2, 2, 1488, 1489, 7, 130, 2, 2, 1489, 1498, 7, 10, 2, 2, 1490, 1496, 5, 290, 146, 2, 1491, 1492, 7, 15, 2, 2, 1492, 1494, 5, 302, 152, 2, 1493, 1495, 7, 168, 2, 2, 1494, 1493, 3, 2, 2, 2, 1494, 1495, 3, 2, 2, 2, 1495, 1497, 3, 2, 2, 2, 1496, 1491, 3, 2, 2, 2, 1496, 1497, 3, 2, 2, 2, 1497, 1499, 3, 2, 2, 2, 1498, 1490, 3, 2, 2, 2, 1498, 1499, 3, 2, 2, 2, 1499, 1500, 3, 2, 2, 2, 1500, 1501, 7, 11, 2, 2, 1501, 289, 3, 2, 2, 2, 1502, 1505, 5, 298, 150, 2, 1503, 1505, 7, 12, 2, 2, 1504, 1502, 3, 2, 2, 2, 1504, 1503, 3, 2, 2, 2, 1505, 291, 3, 2, 2, 2, 1506, 1507, 7, 154, 2, 2, 1507, 1508, 7, 10, 2, 2, 1508, 1509, 5, 294, 148, 2, 1509, 1510, 7, 11, 2, 2, 1510, 293, 3, 2, 2, 2, 1511, 1512, 5, 298, 150, 2, 1512, 295, 3, 2, 2, 2, 1513, 1514, 5, 74, 38, 2, 1514, 297, 3, 2, 2, 2, 1515, 1516, 5, 74, 38, 2, 1516, 299, 3, 2, 2, 2, 1517, 1518, 5, 302, 152, 2, 1518, 301, 3, 2, 2, 2, 1519, 1520, 5, 74, 38, 2, 1520, 303, 3, 2, 2, 2, 1521, 1522, 7, 10, 2, 2, 1522, 1530, 7, 11, 2, 2, 1523, 1527, 5, 308, 155, 2, 1524, 1528, 7, 168, 2, 2, 1525, 1528, 7, 12, 2, 2, 1526, 1528, 7, 47, 2, 2, 1527, 1524, 3, 2, 2, 2, 1527, 1525, 3, 2, 2, 2, 1527, 1526, 3, 2, 2, 2, 1527, 1528, 3, 2, 2, 2, 1528, 1530, 3, 2, 2, 2, 1529, 1521, 3, 2, 2, 2, 1529, 1523, 3, 2, 2, 2, 1530, 305, 3, 2, 2, 2, 1531, 1540, 7, 8, 2, 2, 1532, 1537, 5, 318, 160, 2, 1533, 1534, 7, 15, 2, 2, 1534, 1536, 5, 318, 160, 2, 1535, 1533, 3, 2, 2, 2, 1536, 1539, 3, 2, 2, 2, 1537, 1535, 3, 2, 2, 2, 1537, 1538, 3, 2, 2, 2, 1538, 1541, 3, 2, 2, 2, 1539, 1537, 3, 2, 2, 2, 1540, 1532, 3, 2, 2, 2, 1540, 1541, 3, 2, 2, 2, 1541, 1542, 3, 2, 2, 2, 1542, 1548, 7, 9, 2, 2, 1543, 1544, 7, 59, 2, 2, 1544, 1545, 5, 94, 48, 2, 1545, 1546, 7, 60, 2, 2, 1546, 1548, 3, 2, 2, 2, 1547, 1531, 3, 2, 2, 2, 1547, 1543, 3, 2, 2, 2, 1548, 307, 3, 2, 2, 2, 1549, 1553, 5, 74, 38, 2, 1550, 1553, 7, 169, 2, 2, 1551, 1553, 5, 310, 156, 2, 1552, 1549, 3, 2, 2, 2, 1552, 1550, 3, 2, 2, 2, 1552, 1551, 3, 2, 2, 2, 1553, 309, 3, 2, 2, 2, 1554, 1557, 5, 312, 157, 2, 1555, 1557, 5, 314, 158, 2, 1556, 1554, 3, 2, 2, 2, 1556, 1555, 3, 2, 2, 2, 1557, 311, 3, 2, 2, 2, 1558, 1559, 7, 31, 2, 2, 1559, 1560, 7, 10, 2, 2, 1560, 1561, 7, 12, 2, 2, 1561, 1562, 7, 11, 2, 2, 1562, 313, 3, 2, 2, 2, 1563, 1564, 7, 31, 2, 2, 1564, 1573, 7, 10, 2, 2, 1565, 1570, 5, 304, 153, 2, 1566, 1567, 7, 15, 2, 2, 1567, 1569, 5, 304, 153, 2, 1568, 1566, 3, 2, 2, 2, 1569, 1572, 3, 2, 2, 2, 1570, 1568, 3, 2, 2, 2, 1570, 1571, 3, 2, 2, 2, 1571, 1574, 3, 2, 2, 2, 1572, 1570, 3, 2, 2, 2, 1573, 1565, 3, 2, 2, 2, 1573, 1574, 3, 2, 2, 2, 1574, 1575, 3, 2, 2, 2, 1575, 1576, 7, 11, 2, 2, 1576, 1577, 7, 70, 2, 2, 1577, 1578, 5, 304, 153, 2, 1578, 315, 3, 2, 2, 2, 1579, 1581, 5, 308, 155, 2, 1580, 1582, 7, 168, 2, 2, 1581, 1580, 3, 2, 2, 2, 1581, 1582, 3, 2, 2, 2, 1582, 317, 3, 2, 2, 2, 1583, 1586, 5, 96, 49, 2, 1584, 1586, 7, 176, 2, 2, 1585, 1583, 3, 2, 2, 2, 1585, 1584, 3, 2, 2, 2, 1586, 1587, 3, 2, 2, 2, 1587, 1588, 9, 11, 2, 2, 1588, 1589, 5, 96, 49, 2, 1589, 319, 3, 2, 2, 2, 1590, 1592, 7, 53, 2, 2, 1591, 1593, 5, 94, 48, 2, 1592, 1591, 3, 2, 2, 2, 1592, 1593, 3, 2, 2, 2, 1593, 1594, 3, 2, 2, 2, 1594, 1595, 7, 54, 2, 2, 1595, 321, 3, 2, 2, 2, 1596, 1597, 5, 324, 163, 2, 1597, 323, 3, 2, 2, 2, 1598, 1599, 7, 167, 2, 2, 1599, 325, 3, 2, 2, 2, 1600, 1601, 9, 12, 2, 2, 1601, 327, 3, 2, 2, 2, 156, 336, 340, 356, 362, 370, 378, 386, 401, 431, 439, 441, 463, 473, 483, 488, 493, 497, 509, 513, 522, 529, 543, 547, 552, 562, 570, 574, 586, 598, 620, 628, 633, 636, 640, 649, 658, 661, 669, 676, 678, 685, 692, 694, 702, 707, 714, 721, 731, 738, 745, 752, 761, 771, 775, 783, 785, 797, 803, 807, 811, 822, 828, 843, 849, 853, 857, 864, 871, 877, 882, 884, 888, 895, 902, 911, 923, 933, 945, 949, 958, 965, 987, 992, 997, 1001, 1013, 1021, 1025, 1032, 1039, 1045, 1052, 1060, 1067, 1073, 1079, 1085, 1091, 1102, 1108, 1113, 1121, 1142, 1151, 1153, 1176, 1193, 1204, 1226, 1230, 1237, 1241, 1251, 1256, 1270, 1279, 1285, 1311, 1328, 1330, 1338, 1343, 1350, 1355, 1359, 1367, 1374, 1382, 1392, 1396, 1401, 1414, 1428, 1442, 1462, 1471, 1473, 1479, 1494, 1496, 1498, 1504, 1527, 1529, 1537, 1540, 1547, 1552, 1556, 1570, 1573, 1581, 1585, 1592] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 178, 1601, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 337, 10, 3, 3, 3, 3, 3, 5, 3, 341, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 357, 10, 6, 3, 6, 3, 6, 7, 6, 361, 10, 6, 12, 6, 14, 6, 364, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 369, 10, 6, 12, 6, 14, 6, 372, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 377, 10, 8, 12, 8, 14, 8, 380, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 387, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 402, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 432, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 440, 10, 18, 12, 18, 14, 18, 443, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 462, 10, 20, 13, 20, 14, 20, 463, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 472, 10, 21, 13, 21, 14, 21, 473, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 482, 10, 22, 13, 22, 14, 22, 483, 3, 23, 3, 23, 3, 23, 5, 23, 489, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 494, 10, 23, 7, 23, 496, 10, 23, 12, 23, 14, 23, 499, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 508, 10, 24, 13, 24, 14, 24, 509, 3, 24, 3, 24, 5, 24, 514, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 523, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 528, 10, 25, 12, 25, 14, 25, 531, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 542, 10, 26, 12, 26, 14, 26, 545, 11, 26, 3, 26, 5, 26, 548, 10, 26, 3, 27, 7, 27, 551, 10, 27, 12, 27, 14, 27, 554, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 561, 10, 28, 12, 28, 14, 28, 564, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 571, 10, 29, 3, 29, 3, 29, 5, 29, 575, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 587, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 599, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 621, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 627, 10, 37, 12, 37, 14, 37, 630, 11, 37, 3, 38, 3, 38, 5, 38, 634, 10, 38, 3, 38, 5, 38, 637, 10, 38, 3, 38, 3, 38, 5, 38, 641, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 650, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 657, 10, 40, 12, 40, 14, 40, 660, 11, 40, 5, 40, 662, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 670, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 677, 10, 41, 5, 41, 679, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 686, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 693, 10, 42, 5, 42, 695, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 703, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 708, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 715, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 722, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 732, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 737, 10, 46, 12, 46, 14, 46, 740, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 746, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 751, 10, 48, 12, 48, 14, 48, 754, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 762, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 772, 10, 50, 3, 51, 3, 51, 5, 51, 776, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 784, 10, 51, 12, 51, 14, 51, 787, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 796, 10, 52, 12, 52, 14, 52, 799, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 804, 10, 53, 3, 53, 3, 53, 5, 53, 808, 10, 53, 3, 53, 3, 53, 5, 53, 812, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 821, 10, 54, 12, 54, 14, 54, 824, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 829, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 842, 10, 57, 12, 57, 14, 57, 845, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 850, 10, 58, 3, 58, 3, 58, 5, 58, 854, 10, 58, 3, 58, 3, 58, 5, 58, 858, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 865, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 870, 10, 59, 12, 59, 14, 59, 873, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 878, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 883, 10, 60, 5, 60, 885, 10, 60, 3, 60, 3, 60, 5, 60, 889, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 896, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 901, 10, 62, 12, 62, 14, 62, 904, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 912, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 922, 10, 64, 13, 64, 14, 64, 923, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 932, 10, 65, 13, 65, 14, 65, 933, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 944, 10, 66, 13, 66, 14, 66, 945, 3, 66, 3, 66, 5, 66, 950, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 959, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 964, 10, 67, 12, 67, 14, 67, 967, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 986, 10, 69, 13, 69, 14, 69, 987, 3, 70, 3, 70, 3, 70, 5, 70, 993, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 998, 10, 70, 7, 70, 1000, 10, 70, 12, 70, 14, 70, 1003, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 1012, 10, 71, 12, 71, 14, 71, 1015, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 1020, 10, 72, 12, 72, 14, 72, 1023, 11, 72, 3, 73, 5, 73, 1026, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 1033, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 1038, 10, 75, 12, 75, 14, 75, 1041, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 1046, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 1051, 10, 77, 12, 77, 14, 77, 1054, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 1059, 10, 78, 12, 78, 14, 78, 1062, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 1068, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1074, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1080, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1086, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1092, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1101, 10, 84, 12, 84, 14, 84, 1104, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1109, 10, 85, 3, 86, 7, 86, 1112, 10, 86, 12, 86, 14, 86, 1115, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1122, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1141, 10, 90, 12, 90, 14, 90, 1144, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1152, 10, 91, 12, 91, 14, 91, 1155, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1177, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1194, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1205, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1227, 10, 104, 7, 104, 1229, 10, 104, 12, 104, 14, 104, 1232, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1238, 10, 105, 3, 106, 3, 106, 5, 106, 1242, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1252, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1257, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1271, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1278, 10, 109, 12, 109, 14, 109, 1281, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1286, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1310, 10, 113, 12, 113, 14, 113, 1313, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1329, 10, 115, 13, 115, 14, 115, 1330, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 5, 117, 1339, 10, 117, 3, 117, 3, 117, 3, 117, 5, 117, 1344, 10, 117, 3, 118, 3, 118, 3, 118, 7, 118, 1349, 10, 118, 12, 118, 14, 118, 1352, 11, 118, 3, 119, 3, 119, 5, 119, 1356, 10, 119, 3, 120, 3, 120, 5, 120, 1360, 10, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 5, 121, 1368, 10, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 5, 124, 1381, 10, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 127, 3, 127, 5, 127, 1391, 10, 127, 3, 128, 3, 128, 5, 128, 1395, 10, 128, 3, 129, 3, 129, 3, 129, 5, 129, 1400, 10, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 7, 132, 1411, 10, 132, 12, 132, 14, 132, 1414, 11, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 5, 133, 1427, 10, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 5, 136, 1441, 10, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 5, 140, 1461, 10, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 5, 141, 1470, 10, 141, 5, 141, 1472, 10, 141, 3, 141, 3, 141, 3, 142, 3, 142, 5, 142, 1478, 10, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 5, 145, 1493, 10, 145, 5, 145, 1495, 10, 145, 5, 145, 1497, 10, 145, 3, 145, 3, 145, 3, 146, 3, 146, 5, 146, 1503, 10, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 149, 3, 149, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 5, 153, 1526, 10, 153, 5, 153, 1528, 10, 153, 3, 154, 3, 154, 3, 154, 3, 154, 7, 154, 1534, 10, 154, 12, 154, 14, 154, 1537, 11, 154, 5, 154, 1539, 10, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 5, 154, 1546, 10, 154, 3, 155, 3, 155, 3, 155, 5, 155, 1551, 10, 155, 3, 156, 3, 156, 5, 156, 1555, 10, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 7, 158, 1567, 10, 158, 12, 158, 14, 158, 1570, 11, 158, 5, 158, 1572, 10, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 5, 159, 1580, 10, 159, 3, 160, 3, 160, 5, 160, 1584, 10, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 5, 161, 1591, 10, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 2, 2, 165, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 2, 13, 4, 2, 17, 17, 105, 105, 3, 2, 82, 83, 3, 2, 20, 29, 4, 2, 5, 5, 35, 45, 3, 2, 47, 48, 4, 2, 12, 12, 49, 51, 3, 2, 131, 132, 3, 2, 134, 140, 3, 2, 141, 145, 4, 2, 19, 19, 168, 168, 5, 2, 61, 126, 161, 166, 169, 169, 2, 1664, 2, 328, 3, 2, 2, 2, 4, 336, 3, 2, 2, 2, 6, 342, 3, 2, 2, 2, 8, 345, 3, 2, 2, 2, 10, 362, 3, 2, 2, 2, 12, 373, 3, 2, 2, 2, 14, 378, 3, 2, 2, 2, 16, 381, 3, 2, 2, 2, 18, 384, 3, 2, 2, 2, 20, 401, 3, 2, 2, 2, 22, 403, 3, 2, 2, 2, 24, 406, 3, 2, 2, 2, 26, 412, 3, 2, 2, 2, 28, 416, 3, 2, 2, 2, 30, 420, 3, 2, 2, 2, 32, 424, 3, 2, 2, 2, 34, 431, 3, 2, 2, 2, 36, 447, 3, 2, 2, 2, 38, 456, 3, 2, 2, 2, 40, 471, 3, 2, 2, 2, 42, 478, 3, 2, 2, 2, 44, 485, 3, 2, 2, 2, 46, 502, 3, 2, 2, 2, 48, 518, 3, 2, 2, 2, 50, 535, 3, 2, 2, 2, 52, 552, 3, 2, 2, 2, 54, 555, 3, 2, 2, 2, 56, 567, 3, 2, 2, 2, 58, 576, 3, 2, 2, 2, 60, 586, 3, 2, 2, 2, 62, 588, 3, 2, 2, 2, 64, 598, 3, 2, 2, 2, 66, 600, 3, 2, 2, 2, 68, 605, 3, 2, 2, 2, 70, 609, 3, 2, 2, 2, 72, 615, 3, 2, 2, 2, 74, 636, 3, 2, 2, 2, 76, 642, 3, 2, 2, 2, 78, 644, 3, 2, 2, 2, 80, 663, 3, 2, 2, 2, 82, 680, 3, 2, 2, 2, 84, 696, 3, 2, 2, 2, 86, 716, 3, 2, 2, 2, 88, 731, 3, 2, 2, 2, 90, 733, 3, 2, 2, 2, 92, 741, 3, 2, 2, 2, 94, 747, 3, 2, 2, 2, 96, 761, 3, 2, 2, 2, 98, 771, 3, 2, 2, 2, 100, 775, 3, 2, 2, 2, 102, 791, 3, 2, 2, 2, 104, 800, 3, 2, 2, 2, 106, 816, 3, 2, 2, 2, 108, 825, 3, 2, 2, 2, 110, 833, 3, 2, 2, 2, 112, 836, 3, 2, 2, 2, 114, 846, 3, 2, 2, 2, 116, 864, 3, 2, 2, 2, 118, 874, 3, 2, 2, 2, 120, 890, 3, 2, 2, 2, 122, 895, 3, 2, 2, 2, 124, 908, 3, 2, 2, 2, 126, 916, 3, 2, 2, 2, 128, 931, 3, 2, 2, 2, 130, 938, 3, 2, 2, 2, 132, 954, 3, 2, 2, 2, 134, 971, 3, 2, 2, 2, 136, 980, 3, 2, 2, 2, 138, 989, 3, 2, 2, 2, 140, 1008, 3, 2, 2, 2, 142, 1016, 3, 2, 2, 2, 144, 1025, 3, 2, 2, 2, 146, 1029, 3, 2, 2, 2, 148, 1034, 3, 2, 2, 2, 150, 1042, 3, 2, 2, 2, 152, 1047, 3, 2, 2, 2, 154, 1055, 3, 2, 2, 2, 156, 1063, 3, 2, 2, 2, 158, 1069, 3, 2, 2, 2, 160, 1075, 3, 2, 2, 2, 162, 1081, 3, 2, 2, 2, 164, 1087, 3, 2, 2, 2, 166, 1093, 3, 2, 2, 2, 168, 1108, 3, 2, 2, 2, 170, 1113, 3, 2, 2, 2, 172, 1121, 3, 2, 2, 2, 174, 1123, 3, 2, 2, 2, 176, 1130, 3, 2, 2, 2, 178, 1137, 3, 2, 2, 2, 180, 1145, 3, 2, 2, 2, 182, 1156, 3, 2, 2, 2, 184, 1162, 3, 2, 2, 2, 186, 1165, 3, 2, 2, 2, 188, 1169, 3, 2, 2, 2, 190, 1193, 3, 2, 2, 2, 192, 1195, 3, 2, 2, 2, 194, 1199, 3, 2, 2, 2, 196, 1202, 3, 2, 2, 2, 198, 1208, 3, 2, 2, 2, 200, 1210, 3, 2, 2, 2, 202, 1215, 3, 2, 2, 2, 204, 1220, 3, 2, 2, 2, 206, 1223, 3, 2, 2, 2, 208, 1237, 3, 2, 2, 2, 210, 1241, 3, 2, 2, 2, 212, 1243, 3, 2, 2, 2, 214, 1247, 3, 2, 2, 2, 216, 1285, 3, 2, 2, 2, 218, 1287, 3, 2, 2, 2, 220, 1291, 3, 2, 2, 2, 222, 1297, 3, 2, 2, 2, 224, 1305, 3, 2, 2, 2, 226, 1319, 3, 2, 2, 2, 228, 1325, 3, 2, 2, 2, 230, 1332, 3, 2, 2, 2, 232, 1343, 3, 2, 2, 2, 234, 1345, 3, 2, 2, 2, 236, 1355, 3, 2, 2, 2, 238, 1359, 3, 2, 2, 2, 240, 1367, 3, 2, 2, 2, 242, 1369, 3, 2, 2, 2, 244, 1373, 3, 2, 2, 2, 246, 1380, 3, 2, 2, 2, 248, 1382, 3, 2, 2, 2, 250, 1386, 3, 2, 2, 2, 252, 1390, 3, 2, 2, 2, 254, 1394, 3, 2, 2, 2, 256, 1399, 3, 2, 2, 2, 258, 1401, 3, 2, 2, 2, 260, 1405, 3, 2, 2, 2, 262, 1412, 3, 2, 2, 2, 264, 1426, 3, 2, 2, 2, 266, 1428, 3, 2, 2, 2, 268, 1432, 3, 2, 2, 2, 270, 1436, 3, 2, 2, 2, 272, 1444, 3, 2, 2, 2, 274, 1448, 3, 2, 2, 2, 276, 1452, 3, 2, 2, 2, 278, 1456, 3, 2, 2, 2, 280, 1464, 3, 2, 2, 2, 282, 1477, 3, 2, 2, 2, 284, 1479, 3, 2, 2, 2, 286, 1484, 3, 2, 2, 2, 288, 1486, 3, 2, 2, 2, 290, 1502, 3, 2, 2, 2, 292, 1504, 3, 2, 2, 2, 294, 1509, 3, 2, 2, 2, 296, 1511, 3, 2, 2, 2, 298, 1513, 3, 2, 2, 2, 300, 1515, 3, 2, 2, 2, 302, 1517, 3, 2, 2, 2, 304, 1527, 3, 2, 2, 2, 306, 1545, 3, 2, 2, 2, 308, 1550, 3, 2, 2, 2, 310, 1554, 3, 2, 2, 2, 312, 1556, 3, 2, 2, 2, 314, 1561, 3, 2, 2, 2, 316, 1577, 3, 2, 2, 2, 318, 1583, 3, 2, 2, 2, 320, 1588, 3, 2, 2, 2, 322, 1594, 3, 2, 2, 2, 324, 1596, 3, 2, 2, 2, 326, 1598, 3, 2, 2, 2, 328, 329, 5, 4, 3, 2, 329, 330, 7, 2, 2, 3, 330, 3, 3, 2, 2, 2, 331, 332, 7, 104, 2, 2, 332, 333, 7, 103, 2, 2, 333, 334, 5, 324, 163, 2, 334, 335, 7, 3, 2, 2, 335, 337, 3, 2, 2, 2, 336, 331, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 341, 5, 8, 5, 2, 339, 341, 5, 6, 4, 2, 340, 338, 3, 2, 2, 2, 340, 339, 3, 2, 2, 2, 341, 5, 3, 2, 2, 2, 342, 343, 5, 10, 6, 2, 343, 344, 5, 12, 7, 2, 344, 7, 3, 2, 2, 2, 345, 346, 7, 4, 2, 2, 346, 347, 7, 129, 2, 2, 347, 348, 7, 176, 2, 2, 348, 349, 7, 5, 2, 2, 349, 350, 5, 322, 162, 2, 350, 351, 7, 3, 2, 2, 351, 352, 5, 10, 6, 2, 352, 9, 3, 2, 2, 2, 353, 357, 5, 60, 31, 2, 354, 357, 5, 62, 32, 2, 355, 357, 5, 78, 40, 2, 356, 353, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 355, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 359, 7, 3, 2, 2, 359, 361, 3, 2, 2, 2, 360, 356, 3, 2, 2, 2, 361, 364, 3, 2, 2, 2, 362, 360, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 370, 3, 2, 2, 2, 364, 362, 3, 2, 2, 2, 365, 366, 5, 64, 33, 2, 366, 367, 7, 3, 2, 2, 367, 369, 3, 2, 2, 2, 368, 365, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 368, 3, 2, 2, 2, 370, 371, 3, 2, 2, 2, 371, 11, 3, 2, 2, 2, 372, 370, 3, 2, 2, 2, 373, 374, 5, 18, 10, 2, 374, 13, 3, 2, 2, 2, 375, 377, 5, 20, 11, 2, 376, 375, 3, 2, 2, 2, 377, 380, 3, 2, 2, 2, 378, 376, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 15, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 381, 382, 5, 14, 8, 2, 382, 383, 5, 94, 48, 2, 383, 17, 3, 2, 2, 2, 384, 386, 5, 14, 8, 2, 385, 387, 5, 94, 48, 2, 386, 385, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 19, 3, 2, 2, 2, 388, 402, 5, 22, 12, 2, 389, 402, 5, 24, 13, 2, 390, 402, 5, 26, 14, 2, 391, 402, 5, 28, 15, 2, 392, 402, 5, 30, 16, 2, 393, 402, 5, 32, 17, 2, 394, 402, 5, 34, 18, 2, 395, 402, 5, 36, 19, 2, 396, 402, 5, 38, 20, 2, 397, 402, 5, 42, 22, 2, 398, 402, 5, 46, 24, 2, 399, 402, 5, 54, 28, 2, 400, 402, 5, 58, 30, 2, 401, 388, 3, 2, 2, 2, 401, 389, 3, 2, 2, 2, 401, 390, 3, 2, 2, 2, 401, 391, 3, 2, 2, 2, 401, 392, 3, 2, 2, 2, 401, 393, 3, 2, 2, 2, 401, 394, 3, 2, 2, 2, 401, 395, 3, 2, 2, 2, 401, 396, 3, 2, 2, 2, 401, 397, 3, 2, 2, 2, 401, 398, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 401, 400, 3, 2, 2, 2, 402, 21, 3, 2, 2, 2, 403, 404, 5, 98, 50, 2, 404, 405, 7, 3, 2, 2, 405, 23, 3, 2, 2, 2, 406, 407, 7, 6, 2, 2, 407, 408, 5, 74, 38, 2, 408, 409, 7, 7, 2, 2, 409, 410, 5, 96, 49, 2, 410, 411, 7, 3, 2, 2, 411, 25, 3, 2, 2, 2, 412, 413, 7, 8, 2, 2, 413, 414, 5, 14, 8, 2, 414, 415, 7, 9, 2, 2, 415, 27, 3, 2, 2, 2, 416, 417, 7, 161, 2, 2, 417, 418, 7, 162, 2, 2, 418, 419, 7, 3, 2, 2, 419, 29, 3, 2, 2, 2, 420, 421, 7, 163, 2, 2, 421, 422, 7, 162, 2, 2, 422, 423, 7, 3, 2, 2, 423, 31, 3, 2, 2, 2, 424, 425, 7, 164, 2, 2, 425, 426, 7, 165, 2, 2, 426, 427, 5, 96, 49, 2, 427, 428, 7, 3, 2, 2, 428, 33, 3, 2, 2, 2, 429, 432, 5, 102, 52, 2, 430, 432, 5, 106, 54, 2, 431, 429, 3, 2, 2, 2, 431, 430, 3, 2, 2, 2, 432, 441, 3, 2, 2, 2, 433, 440, 5, 102, 52, 2, 434, 440, 5, 106, 54, 2, 435, 440, 5, 110, 56, 2, 436, 440, 5, 112, 57, 2, 437, 440, 5, 116, 59, 2, 438, 440, 5, 120, 61, 2, 439, 433, 3, 2, 2, 2, 439, 434, 3, 2, 2, 2, 439, 435, 3, 2, 2, 2, 439, 436, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 438, 3, 2, 2, 2, 440, 443, 3, 2, 2, 2, 441, 439, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 444, 3, 2, 2, 2, 443, 441, 3, 2, 2, 2, 444, 445, 7, 67, 2, 2, 445, 446, 5, 20, 11, 2, 446, 35, 3, 2, 2, 2, 447, 448, 7, 68, 2, 2, 448, 449, 7, 10, 2, 2, 449, 450, 5, 94, 48, 2, 450, 451, 7, 11, 2, 2, 451, 452, 7, 89, 2, 2, 452, 453, 5, 20, 11, 2, 453, 454, 7, 90, 2, 2, 454, 455, 5, 20, 11, 2, 455, 37, 3, 2, 2, 2, 456, 457, 7, 84, 2, 2, 457, 458, 7, 10, 2, 2, 458, 459, 5, 94, 48, 2, 459, 461, 7, 11, 2, 2, 460, 462, 5, 40, 21, 2, 461, 460, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 461, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 88, 2, 2, 466, 467, 7, 67, 2, 2, 467, 468, 5, 20, 11, 2, 468, 39, 3, 2, 2, 2, 469, 470, 7, 85, 2, 2, 470, 472, 5, 96, 49, 2, 471, 469, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 7, 67, 2, 2, 476, 477, 5, 20, 11, 2, 477, 41, 3, 2, 2, 2, 478, 479, 7, 86, 2, 2, 479, 481, 5, 26, 14, 2, 480, 482, 5, 44, 23, 2, 481, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 43, 3, 2, 2, 2, 485, 488, 7, 87, 2, 2, 486, 489, 7, 12, 2, 2, 487, 489, 5, 74, 38, 2, 488, 486, 3, 2, 2, 2, 488, 487, 3, 2, 2, 2, 489, 497, 3, 2, 2, 2, 490, 493, 7, 13, 2, 2, 491, 494, 7, 12, 2, 2, 492, 494, 5, 74, 38, 2, 493, 491, 3, 2, 2, 2, 493, 492, 3, 2, 2, 2, 494, 496, 3, 2, 2, 2, 495, 490, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 500, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 500, 501, 5, 26, 14, 2, 501, 45, 3, 2, 2, 2, 502, 503, 7, 91, 2, 2, 503, 504, 7, 10, 2, 2, 504, 505, 5, 94, 48, 2, 505, 507, 7, 11, 2, 2, 506, 508, 5, 48, 25, 2, 507, 506, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 507, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 513, 7, 88, 2, 2, 512, 514, 5, 194, 98, 2, 513, 512, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 7, 67, 2, 2, 516, 517, 5, 20, 11, 2, 517, 47, 3, 2, 2, 2, 518, 522, 7, 85, 2, 2, 519, 520, 5, 194, 98, 2, 520, 521, 7, 70, 2, 2, 521, 523, 3, 2, 2, 2, 522, 519, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 524, 3, 2, 2, 2, 524, 529, 5, 304, 153, 2, 525, 526, 7, 13, 2, 2, 526, 528, 5, 304, 153, 2, 527, 525, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 532, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 533, 7, 67, 2, 2, 533, 534, 5, 20, 11, 2, 534, 49, 3, 2, 2, 2, 535, 536, 7, 14, 2, 2, 536, 547, 5, 74, 38, 2, 537, 538, 7, 10, 2, 2, 538, 543, 7, 170, 2, 2, 539, 540, 7, 15, 2, 2, 540, 542, 7, 170, 2, 2, 541, 539, 3, 2, 2, 2, 542, 545, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 546, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 546, 548, 7, 11, 2, 2, 547, 537, 3, 2, 2, 2, 547, 548, 3, 2, 2, 2, 548, 51, 3, 2, 2, 2, 549, 551, 5, 50, 26, 2, 550, 549, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 53, 3, 2, 2, 2, 554, 552, 3, 2, 2, 2, 555, 556, 5, 52, 27, 2, 556, 557, 7, 114, 2, 2, 557, 562, 5, 56, 29, 2, 558, 559, 7, 15, 2, 2, 559, 561, 5, 56, 29, 2, 560, 558, 3, 2, 2, 2, 561, 564, 3, 2, 2, 2, 562, 560, 3, 2, 2, 2, 562, 563, 3, 2, 2, 2, 563, 565, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 565, 566, 7, 3, 2, 2, 566, 55, 3, 2, 2, 2, 567, 570, 5, 194, 98, 2, 568, 569, 7, 70, 2, 2, 569, 571, 5, 304, 153, 2, 570, 568, 3, 2, 2, 2, 570, 571, 3, 2, 2, 2, 571, 574, 3, 2, 2, 2, 572, 573, 7, 7, 2, 2, 573, 575, 5, 96, 49, 2, 574, 572, 3, 2, 2, 2, 574, 575, 3, 2, 2, 2, 575, 57, 3, 2, 2, 2, 576, 577, 7, 166, 2, 2, 577, 578, 7, 10, 2, 2, 578, 579, 5, 94, 48, 2, 579, 580, 7, 11, 2, 2, 580, 581, 5, 20, 11, 2, 581, 59, 3, 2, 2, 2, 582, 587, 5, 66, 34, 2, 583, 587, 5, 68, 35, 2, 584, 587, 5, 70, 36, 2, 585, 587, 5, 72, 37, 2, 586, 582, 3, 2, 2, 2, 586, 583, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 586, 585, 3, 2, 2, 2, 587, 61, 3, 2, 2, 2, 588, 589, 7, 111, 2, 2, 589, 590, 7, 129, 2, 2, 590, 591, 7, 176, 2, 2, 591, 592, 7, 5, 2, 2, 592, 593, 5, 322, 162, 2, 593, 63, 3, 2, 2, 2, 594, 599, 5, 84, 43, 2, 595, 599, 5, 80, 41, 2, 596, 599, 5, 86, 44, 2, 597, 599, 5, 82, 42, 2, 598, 594, 3, 2, 2, 2, 598, 595, 3, 2, 2, 2, 598, 596, 3, 2, 2, 2, 598, 597, 3, 2, 2, 2, 599, 65, 3, 2, 2, 2, 600, 601, 7, 111, 2, 2, 601, 602, 7, 88, 2, 2, 602, 603, 7, 81, 2, 2, 603, 604, 5, 322, 162, 2, 604, 67, 3, 2, 2, 2, 605, 606, 7, 111, 2, 2, 606, 607, 7, 16, 2, 2, 607, 608, 9, 2, 2, 2, 608, 69, 3, 2, 2, 2, 609, 610, 7, 111, 2, 2, 610, 611, 7, 88, 2, 2, 611, 612, 7, 66, 2, 2, 612, 613, 7, 73, 2, 2, 613, 614, 9, 3, 2, 2, 614, 71, 3, 2, 2, 2, 615, 620, 7, 111, 2, 2, 616, 617, 7, 18, 2, 2, 617, 621, 5, 74, 38, 2, 618, 619, 7, 88, 2, 2, 619, 621, 7, 18, 2, 2, 620, 616, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 621, 628, 3, 2, 2, 2, 622, 623, 5, 76, 39, 2, 623, 624, 7, 5, 2, 2, 624, 625, 5, 324, 163, 2, 625, 627, 3, 2, 2, 2, 626, 622, 3, 2, 2, 2, 627, 630, 3, 2, 2, 2, 628, 626, 3, 2, 2, 2, 628, 629, 3, 2, 2, 2, 629, 73, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 631, 634, 7, 176, 2, 2, 632, 634, 5, 326, 164, 2, 633, 631, 3, 2, 2, 2, 633, 632, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 637, 7, 19, 2, 2, 636, 633, 3, 2, 2, 2, 636, 637, 3, 2, 2, 2, 637, 640, 3, 2, 2, 2, 638, 641, 7, 176, 2, 2, 639, 641, 5, 326, 164, 2, 640, 638, 3, 2, 2, 2, 640, 639, 3, 2, 2, 2, 641, 75, 3, 2, 2, 2, 642, 643, 9, 4, 2, 2, 643, 77, 3, 2, 2, 2, 644, 645, 7, 127, 2, 2, 645, 649, 7, 4, 2, 2, 646, 647, 7, 129, 2, 2, 647, 648, 7, 176, 2, 2, 648, 650, 7, 5, 2, 2, 649, 646, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 661, 5, 322, 162, 2, 652, 653, 7, 71, 2, 2, 653, 658, 5, 322, 162, 2, 654, 655, 7, 15, 2, 2, 655, 657, 5, 322, 162, 2, 656, 654, 3, 2, 2, 2, 657, 660, 3, 2, 2, 2, 658, 656, 3, 2, 2, 2, 658, 659, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 661, 652, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 79, 3, 2, 2, 2, 663, 664, 7, 111, 2, 2, 664, 665, 5, 52, 27, 2, 665, 666, 7, 114, 2, 2, 666, 669, 5, 194, 98, 2, 667, 668, 7, 70, 2, 2, 668, 670, 5, 304, 153, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 678, 3, 2, 2, 2, 671, 672, 7, 7, 2, 2, 672, 679, 5, 96, 49, 2, 673, 676, 7, 30, 2, 2, 674, 675, 7, 7, 2, 2, 675, 677, 5, 96, 49, 2, 676, 674, 3, 2, 2, 2, 676, 677, 3, 2, 2, 2, 677, 679, 3, 2, 2, 2, 678, 671, 3, 2, 2, 2, 678, 673, 3, 2, 2, 2, 679, 81, 3, 2, 2, 2, 680, 681, 7, 111, 2, 2, 681, 682, 7, 112, 2, 2, 682, 685, 7, 113, 2, 2, 683, 684, 7, 70, 2, 2, 684, 686, 5, 304, 153, 2, 685, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 694, 3, 2, 2, 2, 687, 688, 7, 7, 2, 2, 688, 695, 5, 96, 49, 2, 689, 692, 7, 30, 2, 2, 690, 691, 7, 7, 2, 2, 691, 693, 5, 96, 49, 2, 692, 690, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 695, 3, 2, 2, 2, 694, 687, 3, 2, 2, 2, 694, 689, 3, 2, 2, 2, 695, 83, 3, 2, 2, 2, 696, 697, 7, 111, 2, 2, 697, 698, 5, 52, 27, 2, 698, 699, 7, 31, 2, 2, 699, 700, 5, 74, 38, 2, 700, 702, 7, 10, 2, 2, 701, 703, 5, 90, 46, 2, 702, 701, 3, 2, 2, 2, 702, 703, 3, 2, 2, 2, 703, 704, 3, 2, 2, 2, 704, 707, 7, 11, 2, 2, 705, 706, 7, 70, 2, 2, 706, 708, 5, 304, 153, 2, 707, 705, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, 714, 3, 2, 2, 2, 709, 710, 7, 8, 2, 2, 710, 711, 5, 18, 10, 2, 711, 712, 7, 9, 2, 2, 712, 715, 3, 2, 2, 2, 713, 715, 7, 30, 2, 2, 714, 709, 3, 2, 2, 2, 714, 713, 3, 2, 2, 2, 715, 85, 3, 2, 2, 2, 716, 717, 7, 111, 2, 2, 717, 718, 7, 108, 2, 2, 718, 719, 5, 74, 38, 2, 719, 721, 7, 70, 2, 2, 720, 722, 5, 88, 45, 2, 721, 720, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 723, 3, 2, 2, 2, 723, 724, 5, 96, 49, 2, 724, 87, 3, 2, 2, 2, 725, 726, 7, 32, 2, 2, 726, 732, 7, 33, 2, 2, 727, 728, 7, 32, 2, 2, 728, 732, 7, 34, 2, 2, 729, 730, 7, 124, 2, 2, 730, 732, 7, 128, 2, 2, 731, 725, 3, 2, 2, 2, 731, 727, 3, 2, 2, 2, 731, 729, 3, 2, 2, 2, 732, 89, 3, 2, 2, 2, 733, 738, 5, 92, 47, 2, 734, 735, 7, 15, 2, 2, 735, 737, 5, 92, 47, 2, 736, 734, 3, 2, 2, 2, 737, 740, 3, 2, 2, 2, 738, 736, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 91, 3, 2, 2, 2, 740, 738, 3, 2, 2, 2, 741, 742, 7, 6, 2, 2, 742, 745, 5, 74, 38, 2, 743, 744, 7, 70, 2, 2, 744, 746, 5, 304, 153, 2, 745, 743, 3, 2, 2, 2, 745, 746, 3, 2, 2, 2, 746, 93, 3, 2, 2, 2, 747, 752, 5, 96, 49, 2, 748, 749, 7, 15, 2, 2, 749, 751, 5, 96, 49, 2, 750, 748, 3, 2, 2, 2, 751, 754, 3, 2, 2, 2, 752, 750, 3, 2, 2, 2, 752, 753, 3, 2, 2, 2, 753, 95, 3, 2, 2, 2, 754, 752, 3, 2, 2, 2, 755, 762, 5, 98, 50, 2, 756, 762, 5, 100, 51, 2, 757, 762, 5, 126, 64, 2, 758, 762, 5, 130, 66, 2, 759, 762, 5, 134, 68, 2, 760, 762, 5, 136, 69, 2, 761, 755, 3, 2, 2, 2, 761, 756, 3, 2, 2, 2, 761, 757, 3, 2, 2, 2, 761, 758, 3, 2, 2, 2, 761, 759, 3, 2, 2, 2, 761, 760, 3, 2, 2, 2, 762, 97, 3, 2, 2, 2, 763, 772, 5, 122, 62, 2, 764, 772, 5, 140, 71, 2, 765, 772, 5, 216, 109, 2, 766, 772, 5, 218, 110, 2, 767, 772, 5, 220, 111, 2, 768, 772, 5, 222, 112, 2, 769, 772, 5, 224, 113, 2, 770, 772, 5, 226, 114, 2, 771, 763, 3, 2, 2, 2, 771, 764, 3, 2, 2, 2, 771, 765, 3, 2, 2, 2, 771, 766, 3, 2, 2, 2, 771, 767, 3, 2, 2, 2, 771, 768, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 771, 770, 3, 2, 2, 2, 772, 99, 3, 2, 2, 2, 773, 776, 5, 102, 52, 2, 774, 776, 5, 106, 54, 2, 775, 773, 3, 2, 2, 2, 775, 774, 3, 2, 2, 2, 776, 785, 3, 2, 2, 2, 777, 784, 5, 102, 52, 2, 778, 784, 5, 106, 54, 2, 779, 784, 5, 110, 56, 2, 780, 784, 5, 112, 57, 2, 781, 784, 5, 116, 59, 2, 782, 784, 5, 120, 61, 2, 783, 777, 3, 2, 2, 2, 783, 778, 3, 2, 2, 2, 783, 779, 3, 2, 2, 2, 783, 780, 3, 2, 2, 2, 783, 781, 3, 2, 2, 2, 783, 782, 3, 2, 2, 2, 784, 787, 3, 2, 2, 2, 785, 783, 3, 2, 2, 2, 785, 786, 3, 2, 2, 2, 786, 788, 3, 2, 2, 2, 787, 785, 3, 2, 2, 2, 788, 789, 7, 67, 2, 2, 789, 790, 5, 96, 49, 2, 790, 101, 3, 2, 2, 2, 791, 792, 7, 61, 2, 2, 792, 797, 5, 104, 53, 2, 793, 794, 7, 15, 2, 2, 794, 796, 5, 104, 53, 2, 795, 793, 3, 2, 2, 2, 796, 799, 3, 2, 2, 2, 797, 795, 3, 2, 2, 2, 797, 798, 3, 2, 2, 2, 798, 103, 3, 2, 2, 2, 799, 797, 3, 2, 2, 2, 800, 803, 5, 194, 98, 2, 801, 802, 7, 70, 2, 2, 802, 804, 5, 304, 153, 2, 803, 801, 3, 2, 2, 2, 803, 804, 3, 2, 2, 2, 804, 807, 3, 2, 2, 2, 805, 806, 7, 72, 2, 2, 806, 808, 7, 73, 2, 2, 807, 805, 3, 2, 2, 2, 807, 808, 3, 2, 2, 2, 808, 811, 3, 2, 2, 2, 809, 810, 7, 71, 2, 2, 810, 812, 5, 194, 98, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 813, 3, 2, 2, 2, 813, 814, 7, 69, 2, 2, 814, 815, 5, 96, 49, 2, 815, 105, 3, 2, 2, 2, 816, 817, 7, 62, 2, 2, 817, 822, 5, 108, 55, 2, 818, 819, 7, 15, 2, 2, 819, 821, 5, 108, 55, 2, 820, 818, 3, 2, 2, 2, 821, 824, 3, 2, 2, 2, 822, 820, 3, 2, 2, 2, 822, 823, 3, 2, 2, 2, 823, 107, 3, 2, 2, 2, 824, 822, 3, 2, 2, 2, 825, 828, 5, 194, 98, 2, 826, 827, 7, 70, 2, 2, 827, 829, 5, 304, 153, 2, 828, 826, 3, 2, 2, 2, 828, 829, 3, 2, 2, 2, 829, 830, 3, 2, 2, 2, 830, 831, 7, 7, 2, 2, 831, 832, 5, 96, 49, 2, 832, 109, 3, 2, 2, 2, 833, 834, 7, 63, 2, 2, 834, 835, 5, 96, 49, 2, 835, 111, 3, 2, 2, 2, 836, 837, 7, 64, 2, 2, 837, 838, 7, 65, 2, 2, 838, 843, 5, 114, 58, 2, 839, 840, 7, 15, 2, 2, 840, 842, 5, 114, 58, 2, 841, 839, 3, 2, 2, 2, 842, 845, 3, 2, 2, 2, 843, 841, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 113, 3, 2, 2, 2, 845, 843, 3, 2, 2, 2, 846, 853, 5, 194, 98, 2, 847, 848, 7, 70, 2, 2, 848, 850, 5, 304, 153, 2, 849, 847, 3, 2, 2, 2, 849, 850, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 852, 7, 7, 2, 2, 852, 854, 5, 96, 49, 2, 853, 849, 3, 2, 2, 2, 853, 854, 3, 2, 2, 2, 854, 857, 3, 2, 2, 2, 855, 856, 7, 81, 2, 2, 856, 858, 5, 322, 162, 2, 857, 855, 3, 2, 2, 2, 857, 858, 3, 2, 2, 2, 858, 115, 3, 2, 2, 2, 859, 860, 7, 66, 2, 2, 860, 865, 7, 65, 2, 2, 861, 862, 7, 75, 2, 2, 862, 863, 7, 66, 2, 2, 863, 865, 7, 65, 2, 2, 864, 859, 3, 2, 2, 2, 864, 861, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 871, 5, 118, 60, 2, 867, 868, 7, 15, 2, 2, 868, 870, 5, 118, 60, 2, 869, 867, 3, 2, 2, 2, 870, 873, 3, 2, 2, 2, 871, 869, 3, 2, 2, 2, 871, 872, 3, 2, 2, 2, 872, 117, 3, 2, 2, 2, 873, 871, 3, 2, 2, 2, 874, 877, 5, 96, 49, 2, 875, 878, 7, 76, 2, 2, 876, 878, 7, 77, 2, 2, 877, 875, 3, 2, 2, 2, 877, 876, 3, 2, 2, 2, 877, 878, 3, 2, 2, 2, 878, 884, 3, 2, 2, 2, 879, 882, 7, 73, 2, 2, 880, 883, 7, 82, 2, 2, 881, 883, 7, 83, 2, 2, 882, 880, 3, 2, 2, 2, 882, 881, 3, 2, 2, 2, 883, 885, 3, 2, 2, 2, 884, 879, 3, 2, 2, 2, 884, 885, 3, 2, 2, 2, 885, 888, 3, 2, 2, 2, 886, 887, 7, 81, 2, 2, 887, 889, 5, 322, 162, 2, 888, 886, 3, 2, 2, 2, 888, 889, 3, 2, 2, 2, 889, 119, 3, 2, 2, 2, 890, 891, 7, 74, 2, 2, 891, 892, 5, 194, 98, 2, 892, 121, 3, 2, 2, 2, 893, 896, 7, 78, 2, 2, 894, 896, 7, 79, 2, 2, 895, 893, 3, 2, 2, 2, 895, 894, 3, 2, 2, 2, 896, 897, 3, 2, 2, 2, 897, 902, 5, 124, 63, 2, 898, 899, 7, 15, 2, 2, 899, 901, 5, 124, 63, 2, 900, 898, 3, 2, 2, 2, 901, 904, 3, 2, 2, 2, 902, 900, 3, 2, 2, 2, 902, 903, 3, 2, 2, 2, 903, 905, 3, 2, 2, 2, 904, 902, 3, 2, 2, 2, 905, 906, 7, 80, 2, 2, 906, 907, 5, 96, 49, 2, 907, 123, 3, 2, 2, 2, 908, 911, 5, 194, 98, 2, 909, 910, 7, 70, 2, 2, 910, 912, 5, 304, 153, 2, 911, 909, 3, 2, 2, 2, 911, 912, 3, 2, 2, 2, 912, 913, 3, 2, 2, 2, 913, 914, 7, 69, 2, 2, 914, 915, 5, 96, 49, 2, 915, 125, 3, 2, 2, 2, 916, 917, 7, 84, 2, 2, 917, 918, 7, 10, 2, 2, 918, 919, 5, 94, 48, 2, 919, 921, 7, 11, 2, 2, 920, 922, 5, 128, 65, 2, 921, 920, 3, 2, 2, 2, 922, 923, 3, 2, 2, 2, 923, 921, 3, 2, 2, 2, 923, 924, 3, 2, 2, 2, 924, 925, 3, 2, 2, 2, 925, 926, 7, 88, 2, 2, 926, 927, 7, 67, 2, 2, 927, 928, 5, 96, 49, 2, 928, 127, 3, 2, 2, 2, 929, 930, 7, 85, 2, 2, 930, 932, 5, 96, 49, 2, 931, 929, 3, 2, 2, 2, 932, 933, 3, 2, 2, 2, 933, 931, 3, 2, 2, 2, 933, 934, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 936, 7, 67, 2, 2, 936, 937, 5, 96, 49, 2, 937, 129, 3, 2, 2, 2, 938, 939, 7, 91, 2, 2, 939, 940, 7, 10, 2, 2, 940, 941, 5, 94, 48, 2, 941, 943, 7, 11, 2, 2, 942, 944, 5, 132, 67, 2, 943, 942, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 943, 3, 2, 2, 2, 945, 946, 3, 2, 2, 2, 946, 947, 3, 2, 2, 2, 947, 949, 7, 88, 2, 2, 948, 950, 5, 194, 98, 2, 949, 948, 3, 2, 2, 2, 949, 950, 3, 2, 2, 2, 950, 951, 3, 2, 2, 2, 951, 952, 7, 67, 2, 2, 952, 953, 5, 96, 49, 2, 953, 131, 3, 2, 2, 2, 954, 958, 7, 85, 2, 2, 955, 956, 5, 194, 98, 2, 956, 957, 7, 70, 2, 2, 957, 959, 3, 2, 2, 2, 958, 955, 3, 2, 2, 2, 958, 959, 3, 2, 2, 2, 959, 960, 3, 2, 2, 2, 960, 965, 5, 304, 153, 2, 961, 962, 7, 13, 2, 2, 962, 964, 5, 304, 153, 2, 963, 961, 3, 2, 2, 2, 964, 967, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 968, 3, 2, 2, 2, 967, 965, 3, 2, 2, 2, 968, 969, 7, 67, 2, 2, 969, 970, 5, 96, 49, 2, 970, 133, 3, 2, 2, 2, 971, 972, 7, 68, 2, 2, 972, 973, 7, 10, 2, 2, 973, 974, 5, 94, 48, 2, 974, 975, 7, 11, 2, 2, 975, 976, 7, 89, 2, 2, 976, 977, 5, 96, 49, 2, 977, 978, 7, 90, 2, 2, 978, 979, 5, 96, 49, 2, 979, 135, 3, 2, 2, 2, 980, 981, 7, 86, 2, 2, 981, 982, 7, 8, 2, 2, 982, 983, 5, 94, 48, 2, 983, 985, 7, 9, 2, 2, 984, 986, 5, 138, 70, 2, 985, 984, 3, 2, 2, 2, 986, 987, 3, 2, 2, 2, 987, 985, 3, 2, 2, 2, 987, 988, 3, 2, 2, 2, 988, 137, 3, 2, 2, 2, 989, 992, 7, 87, 2, 2, 990, 993, 7, 12, 2, 2, 991, 993, 5, 74, 38, 2, 992, 990, 3, 2, 2, 2, 992, 991, 3, 2, 2, 2, 993, 1001, 3, 2, 2, 2, 994, 997, 7, 13, 2, 2, 995, 998, 7, 12, 2, 2, 996, 998, 5, 74, 38, 2, 997, 995, 3, 2, 2, 2, 997, 996, 3, 2, 2, 2, 998, 1000, 3, 2, 2, 2, 999, 994, 3, 2, 2, 2, 1000, 1003, 3, 2, 2, 2, 1001, 999, 3, 2, 2, 2, 1001, 1002, 3, 2, 2, 2, 1002, 1004, 3, 2, 2, 2, 1003, 1001, 3, 2, 2, 2, 1004, 1005, 7, 8, 2, 2, 1005, 1006, 5, 94, 48, 2, 1006, 1007, 7, 9, 2, 2, 1007, 139, 3, 2, 2, 2, 1008, 1013, 5, 142, 72, 2, 1009, 1010, 7, 92, 2, 2, 1010, 1012, 5, 142, 72, 2, 1011, 1009, 3, 2, 2, 2, 1012, 1015, 3, 2, 2, 2, 1013, 1011, 3, 2, 2, 2, 1013, 1014, 3, 2, 2, 2, 1014, 141, 3, 2, 2, 2, 1015, 1013, 3, 2, 2, 2, 1016, 1021, 5, 144, 73, 2, 1017, 1018, 7, 93, 2, 2, 1018, 1020, 5, 144, 73, 2, 1019, 1017, 3, 2, 2, 2, 1020, 1023, 3, 2, 2, 2, 1021, 1019, 3, 2, 2, 2, 1021, 1022, 3, 2, 2, 2, 1022, 143, 3, 2, 2, 2, 1023, 1021, 3, 2, 2, 2, 1024, 1026, 7, 94, 2, 2, 1025, 1024, 3, 2, 2, 2, 1025, 1026, 3, 2, 2, 2, 1026, 1027, 3, 2, 2, 2, 1027, 1028, 5, 146, 74, 2, 1028, 145, 3, 2, 2, 2, 1029, 1032, 5, 148, 75, 2, 1030, 1031, 9, 5, 2, 2, 1031, 1033, 5, 148, 75, 2, 1032, 1030, 3, 2, 2, 2, 1032, 1033, 3, 2, 2, 2, 1033, 147, 3, 2, 2, 2, 1034, 1039, 5, 150, 76, 2, 1035, 1036, 7, 46, 2, 2, 1036, 1038, 5, 150, 76, 2, 1037, 1035, 3, 2, 2, 2, 1038, 1041, 3, 2, 2, 2, 1039, 1037, 3, 2, 2, 2, 1039, 1040, 3, 2, 2, 2, 1040, 149, 3, 2, 2, 2, 1041, 1039, 3, 2, 2, 2, 1042, 1045, 5, 152, 77, 2, 1043, 1044, 7, 95, 2, 2, 1044, 1046, 5, 152, 77, 2, 1045, 1043, 3, 2, 2, 2, 1045, 1046, 3, 2, 2, 2, 1046, 151, 3, 2, 2, 2, 1047, 1052, 5, 154, 78, 2, 1048, 1049, 9, 6, 2, 2, 1049, 1051, 5, 154, 78, 2, 1050, 1048, 3, 2, 2, 2, 1051, 1054, 3, 2, 2, 2, 1052, 1050, 3, 2, 2, 2, 1052, 1053, 3, 2, 2, 2, 1053, 153, 3, 2, 2, 2, 1054, 1052, 3, 2, 2, 2, 1055, 1060, 5, 156, 79, 2, 1056, 1057, 9, 7, 2, 2, 1057, 1059, 5, 156, 79, 2, 1058, 1056, 3, 2, 2, 2, 1059, 1062, 3, 2, 2, 2, 1060, 1058, 3, 2, 2, 2, 1060, 1061, 3, 2, 2, 2, 1061, 155, 3, 2, 2, 2, 1062, 1060, 3, 2, 2, 2, 1063, 1067, 5, 158, 80, 2, 1064, 1065, 7, 96, 2, 2, 1065, 1066, 7, 97, 2, 2, 1066, 1068, 5, 304, 153, 2, 1067, 1064, 3, 2, 2, 2, 1067, 1068, 3, 2, 2, 2, 1068, 157, 3, 2, 2, 2, 1069, 1073, 5, 160, 81, 2, 1070, 1071, 7, 99, 2, 2, 1071, 1072, 7, 98, 2, 2, 1072, 1074, 5, 304, 153, 2, 1073, 1070, 3, 2, 2, 2, 1073, 1074, 3, 2, 2, 2, 1074, 159, 3, 2, 2, 2, 1075, 1079, 5, 162, 82, 2, 1076, 1077, 7, 100, 2, 2, 1077, 1078, 7, 70, 2, 2, 1078, 1080, 5, 304, 153, 2, 1079, 1076, 3, 2, 2, 2, 1079, 1080, 3, 2, 2, 2, 1080, 161, 3, 2, 2, 2, 1081, 1085, 5, 164, 83, 2, 1082, 1083, 7, 102, 2, 2, 1083, 1084, 7, 70, 2, 2, 1084, 1086, 5, 316, 159, 2, 1085, 1082, 3, 2, 2, 2, 1085, 1086, 3, 2, 2, 2, 1086, 163, 3, 2, 2, 2, 1087, 1091, 5, 166, 84, 2, 1088, 1089, 7, 101, 2, 2, 1089, 1090, 7, 70, 2, 2, 1090, 1092, 5, 316, 159, 2, 1091, 1088, 3, 2, 2, 2, 1091, 1092, 3, 2, 2, 2, 1092, 165, 3, 2, 2, 2, 1093, 1102, 5, 170, 86, 2, 1094, 1095, 7, 5, 2, 2, 1095, 1096, 7, 44, 2, 2, 1096, 1097, 3, 2, 2, 2, 1097, 1098, 5, 168, 85, 2, 1098, 1099, 5, 206, 104, 2, 1099, 1101, 3, 2, 2, 2, 1100, 1094, 3, 2, 2, 2, 1101, 1104, 3, 2, 2, 2, 1102, 1100, 3, 2, 2, 2, 1102, 1103, 3, 2, 2, 2, 1103, 167, 3, 2, 2, 2, 1104, 1102, 3, 2, 2, 2, 1105, 1109, 5, 74, 38, 2, 1106, 1109, 5, 194, 98, 2, 1107, 1109, 5, 196, 99, 2, 1108, 1105, 3, 2, 2, 2, 1108, 1106, 3, 2, 2, 2, 1108, 1107, 3, 2, 2, 2, 1109, 169, 3, 2, 2, 2, 1110, 1112, 9, 6, 2, 2, 1111, 1110, 3, 2, 2, 2, 1112, 1115, 3, 2, 2, 2, 1113, 1111, 3, 2, 2, 2, 1113, 1114, 3, 2, 2, 2, 1114, 1116, 3, 2, 2, 2, 1115, 1113, 3, 2, 2, 2, 1116, 1117, 5, 172, 87, 2, 1117, 171, 3, 2, 2, 2, 1118, 1122, 5, 178, 90, 2, 1119, 1122, 5, 174, 88, 2, 1120, 1122, 5, 176, 89, 2, 1121, 1118, 3, 2, 2, 2, 1121, 1119, 3, 2, 2, 2, 1121, 1120, 3, 2, 2, 2, 1122, 173, 3, 2, 2, 2, 1123, 1124, 7, 109, 2, 2, 1124, 1125, 7, 108, 2, 2, 1125, 1126, 5, 304, 153, 2, 1126, 1127, 7, 8, 2, 2, 1127, 1128, 5, 94, 48, 2, 1128, 1129, 7, 9, 2, 2, 1129, 175, 3, 2, 2, 2, 1130, 1131, 7, 110, 2, 2, 1131, 1132, 7, 108, 2, 2, 1132, 1133, 5, 304, 153, 2, 1133, 1134, 7, 8, 2, 2, 1134, 1135, 5, 94, 48, 2, 1135, 1136, 7, 9, 2, 2, 1136, 177, 3, 2, 2, 2, 1137, 1142, 5, 232, 117, 2, 1138, 1139, 7, 52, 2, 2, 1139, 1141, 5, 232, 117, 2, 1140, 1138, 3, 2, 2, 2, 1141, 1144, 3, 2, 2, 2, 1142, 1140, 3, 2, 2, 2, 1142, 1143, 3, 2, 2, 2, 1143, 179, 3, 2, 2, 2, 1144, 1142, 3, 2, 2, 2, 1145, 1153, 5, 190, 96, 2, 1146, 1152, 5, 182, 92, 2, 1147, 1152, 5, 186, 94, 2, 1148, 1152, 5, 188, 95, 2, 1149, 1152, 5, 184, 93, 2, 1150, 1152, 5, 206, 104, 2, 1151, 1146, 3, 2, 2, 2, 1151, 1147, 3, 2, 2, 2, 1151, 1148, 3, 2, 2, 2, 1151, 1149, 3, 2, 2, 2, 1151, 1150, 3, 2, 2, 2, 1152, 1155, 3, 2, 2, 2, 1153, 1151, 3, 2, 2, 2, 1153, 1154, 3, 2, 2, 2, 1154, 181, 3, 2, 2, 2, 1155, 1153, 3, 2, 2, 2, 1156, 1157, 7, 53, 2, 2, 1157, 1158, 7, 53, 2, 2, 1158, 1159, 5, 94, 48, 2, 1159, 1160, 7, 54, 2, 2, 1160, 1161, 7, 54, 2, 2, 1161, 183, 3, 2, 2, 2, 1162, 1163, 7, 53, 2, 2, 1163, 1164, 7, 54, 2, 2, 1164, 185, 3, 2, 2, 2, 1165, 1166, 7, 53, 2, 2, 1166, 1167, 5, 94, 48, 2, 1167, 1168, 7, 54, 2, 2, 1168, 187, 3, 2, 2, 2, 1169, 1176, 7, 55, 2, 2, 1170, 1177, 5, 326, 164, 2, 1171, 1177, 5, 324, 163, 2, 1172, 1177, 7, 176, 2, 2, 1173, 1177, 5, 196, 99, 2, 1174, 1177, 5, 194, 98, 2, 1175, 1177, 5, 198, 100, 2, 1176, 1170, 3, 2, 2, 2, 1176, 1171, 3, 2, 2, 2, 1176, 1172, 3, 2, 2, 2, 1176, 1173, 3, 2, 2, 2, 1176, 1174, 3, 2, 2, 2, 1176, 1175, 3, 2, 2, 2, 1177, 189, 3, 2, 2, 2, 1178, 1194, 7, 169, 2, 2, 1179, 1194, 7, 106, 2, 2, 1180, 1194, 7, 107, 2, 2, 1181, 1194, 7, 170, 2, 2, 1182, 1194, 5, 324, 163, 2, 1183, 1194, 5, 194, 98, 2, 1184, 1194, 5, 196, 99, 2, 1185, 1194, 5, 198, 100, 2, 1186, 1194, 5, 306, 154, 2, 1187, 1194, 5, 204, 103, 2, 1188, 1194, 5, 200, 101, 2, 1189, 1194, 5, 202, 102, 2, 1190, 1194, 5, 320, 161, 2, 1191, 1194, 5, 210, 106, 2, 1192, 1194, 5, 192, 97, 2, 1193, 1178, 3, 2, 2, 2, 1193, 1179, 3, 2, 2, 2, 1193, 1180, 3, 2, 2, 2, 1193, 1181, 3, 2, 2, 2, 1193, 1182, 3, 2, 2, 2, 1193, 1183, 3, 2, 2, 2, 1193, 1184, 3, 2, 2, 2, 1193, 1185, 3, 2, 2, 2, 1193, 1186, 3, 2, 2, 2, 1193, 1187, 3, 2, 2, 2, 1193, 1188, 3, 2, 2, 2, 1193, 1189, 3, 2, 2, 2, 1193, 1190, 3, 2, 2, 2, 1193, 1191, 3, 2, 2, 2, 1193, 1192, 3, 2, 2, 2, 1194, 191, 3, 2, 2, 2, 1195, 1196, 7, 8, 2, 2, 1196, 1197, 5, 16, 9, 2, 1197, 1198, 7, 9, 2, 2, 1198, 193, 3, 2, 2, 2, 1199, 1200, 7, 6, 2, 2, 1200, 1201, 5, 74, 38, 2, 1201, 195, 3, 2, 2, 2, 1202, 1204, 7, 10, 2, 2, 1203, 1205, 5, 94, 48, 2, 1204, 1203, 3, 2, 2, 2, 1204, 1205, 3, 2, 2, 2, 1205, 1206, 3, 2, 2, 2, 1206, 1207, 7, 11, 2, 2, 1207, 197, 3, 2, 2, 2, 1208, 1209, 7, 56, 2, 2, 1209, 199, 3, 2, 2, 2, 1210, 1211, 7, 17, 2, 2, 1211, 1212, 7, 8, 2, 2, 1212, 1213, 5, 94, 48, 2, 1213, 1214, 7, 9, 2, 2, 1214, 201, 3, 2, 2, 2, 1215, 1216, 7, 105, 2, 2, 1216, 1217, 7, 8, 2, 2, 1217, 1218, 5, 94, 48, 2, 1218, 1219, 7, 9, 2, 2, 1219, 203, 3, 2, 2, 2, 1220, 1221, 5, 74, 38, 2, 1221, 1222, 5, 206, 104, 2, 1222, 205, 3, 2, 2, 2, 1223, 1230, 7, 10, 2, 2, 1224, 1226, 5, 208, 105, 2, 1225, 1227, 7, 15, 2, 2, 1226, 1225, 3, 2, 2, 2, 1226, 1227, 3, 2, 2, 2, 1227, 1229, 3, 2, 2, 2, 1228, 1224, 3, 2, 2, 2, 1229, 1232, 3, 2, 2, 2, 1230, 1228, 3, 2, 2, 2, 1230, 1231, 3, 2, 2, 2, 1231, 1233, 3, 2, 2, 2, 1232, 1230, 3, 2, 2, 2, 1233, 1234, 7, 11, 2, 2, 1234, 207, 3, 2, 2, 2, 1235, 1238, 5, 96, 49, 2, 1236, 1238, 7, 168, 2, 2, 1237, 1235, 3, 2, 2, 2, 1237, 1236, 3, 2, 2, 2, 1238, 209, 3, 2, 2, 2, 1239, 1242, 5, 212, 107, 2, 1240, 1242, 5, 214, 108, 2, 1241, 1239, 3, 2, 2, 2, 1241, 1240, 3, 2, 2, 2, 1242, 211, 3, 2, 2, 2, 1243, 1244, 5, 74, 38, 2, 1244, 1245, 7, 57, 2, 2, 1245, 1246, 7, 170, 2, 2, 1246, 213, 3, 2, 2, 2, 1247, 1248, 5, 52, 27, 2, 1248, 1249, 7, 31, 2, 2, 1249, 1251, 7, 10, 2, 2, 1250, 1252, 5, 90, 46, 2, 1251, 1250, 3, 2, 2, 2, 1251, 1252, 3, 2, 2, 2, 1252, 1253, 3, 2, 2, 2, 1253, 1256, 7, 11, 2, 2, 1254, 1255, 7, 70, 2, 2, 1255, 1257, 5, 304, 153, 2, 1256, 1254, 3, 2, 2, 2, 1256, 1257, 3, 2, 2, 2, 1257, 1258, 3, 2, 2, 2, 1258, 1259, 7, 8, 2, 2, 1259, 1260, 5, 18, 10, 2, 1260, 1261, 7, 9, 2, 2, 1261, 215, 3, 2, 2, 2, 1262, 1263, 7, 115, 2, 2, 1263, 1264, 7, 124, 2, 2, 1264, 1265, 5, 96, 49, 2, 1265, 1266, 7, 122, 2, 2, 1266, 1270, 5, 96, 49, 2, 1267, 1268, 7, 71, 2, 2, 1268, 1269, 7, 126, 2, 2, 1269, 1271, 5, 96, 49, 2, 1270, 1267, 3, 2, 2, 2, 1270, 1271, 3, 2, 2, 2, 1271, 1286, 3, 2, 2, 2, 1272, 1273, 7, 115, 2, 2, 1273, 1274, 7, 124, 2, 2, 1274, 1279, 5, 318, 160, 2, 1275, 1276, 7, 15, 2, 2, 1276, 1278, 5, 318, 160, 2, 1277, 1275, 3, 2, 2, 2, 1278, 1281, 3, 2, 2, 2, 1279, 1277, 3, 2, 2, 2, 1279, 1280, 3, 2, 2, 2, 1280, 1282, 3, 2, 2, 2, 1281, 1279, 3, 2, 2, 2, 1282, 1283, 7, 122, 2, 2, 1283, 1284, 5, 96, 49, 2, 1284, 1286, 3, 2, 2, 2, 1285, 1262, 3, 2, 2, 2, 1285, 1272, 3, 2, 2, 2, 1286, 217, 3, 2, 2, 2, 1287, 1288, 7, 116, 2, 2, 1288, 1289, 7, 124, 2, 2, 1289, 1290, 5, 228, 115, 2, 1290, 219, 3, 2, 2, 2, 1291, 1292, 7, 117, 2, 2, 1292, 1293, 7, 124, 2, 2, 1293, 1294, 5, 228, 115, 2, 1294, 1295, 7, 70, 2, 2, 1295, 1296, 5, 96, 49, 2, 1296, 221, 3, 2, 2, 2, 1297, 1298, 7, 118, 2, 2, 1298, 1299, 7, 123, 2, 2, 1299, 1300, 7, 97, 2, 2, 1300, 1301, 7, 124, 2, 2, 1301, 1302, 5, 228, 115, 2, 1302, 1303, 7, 125, 2, 2, 1303, 1304, 5, 96, 49, 2, 1304, 223, 3, 2, 2, 2, 1305, 1306, 7, 119, 2, 2, 1306, 1311, 5, 230, 116, 2, 1307, 1308, 7, 15, 2, 2, 1308, 1310, 5, 230, 116, 2, 1309, 1307, 3, 2, 2, 2, 1310, 1313, 3, 2, 2, 2, 1311, 1309, 3, 2, 2, 2, 1311, 1312, 3, 2, 2, 2, 1312, 1314, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1314, 1315, 7, 120, 2, 2, 1315, 1316, 5, 96, 49, 2, 1316, 1317, 7, 67, 2, 2, 1317, 1318, 5, 96, 49, 2, 1318, 225, 3, 2, 2, 2, 1319, 1320, 7, 121, 2, 2, 1320, 1321, 7, 124, 2, 2, 1321, 1322, 5, 96, 49, 2, 1322, 1323, 7, 122, 2, 2, 1323, 1324, 5, 96, 49, 2, 1324, 227, 3, 2, 2, 2, 1325, 1328, 5, 190, 96, 2, 1326, 1329, 5, 182, 92, 2, 1327, 1329, 5, 188, 95, 2, 1328, 1326, 3, 2, 2, 2, 1328, 1327, 3, 2, 2, 2, 1329, 1330, 3, 2, 2, 2, 1330, 1328, 3, 2, 2, 2, 1330, 1331, 3, 2, 2, 2, 1331, 229, 3, 2, 2, 2, 1332, 1333, 5, 194, 98, 2, 1333, 1334, 7, 7, 2, 2, 1334, 1335, 5, 96, 49, 2, 1335, 231, 3, 2, 2, 2, 1336, 1338, 7, 131, 2, 2, 1337, 1339, 5, 234, 118, 2, 1338, 1337, 3, 2, 2, 2, 1338, 1339, 3, 2, 2, 2, 1339, 1344, 3, 2, 2, 2, 1340, 1341, 7, 132, 2, 2, 1341, 1344, 5, 234, 118, 2, 1342, 1344, 5, 234, 118, 2, 1343, 1336, 3, 2, 2, 2, 1343, 1340, 3, 2, 2, 2, 1343, 1342, 3, 2, 2, 2, 1344, 233, 3, 2, 2, 2, 1345, 1350, 5, 236, 119, 2, 1346, 1347, 9, 8, 2, 2, 1347, 1349, 5, 236, 119, 2, 1348, 1346, 3, 2, 2, 2, 1349, 1352, 3, 2, 2, 2, 1350, 1348, 3, 2, 2, 2, 1350, 1351, 3, 2, 2, 2, 1351, 235, 3, 2, 2, 2, 1352, 1350, 3, 2, 2, 2, 1353, 1356, 5, 180, 91, 2, 1354, 1356, 5, 238, 120, 2, 1355, 1353, 3, 2, 2, 2, 1355, 1354, 3, 2, 2, 2, 1356, 237, 3, 2, 2, 2, 1357, 1360, 5, 246, 124, 2, 1358, 1360, 5, 240, 121, 2, 1359, 1357, 3, 2, 2, 2, 1359, 1358, 3, 2, 2, 2, 1360, 1361, 3, 2, 2, 2, 1361, 1362, 5, 262, 132, 2, 1362, 239, 3, 2, 2, 2, 1363, 1364, 5, 242, 122, 2, 1364, 1365, 5, 252, 127, 2, 1365, 1368, 3, 2, 2, 2, 1366, 1368, 5, 244, 123, 2, 1367, 1363, 3, 2, 2, 2, 1367, 1366, 3, 2, 2, 2, 1368, 241, 3, 2, 2, 2, 1369, 1370, 9, 9, 2, 2, 1370, 1371, 7, 19, 2, 2, 1371, 1372, 7, 19, 2, 2, 1372, 243, 3, 2, 2, 2, 1373, 1374, 7, 133, 2, 2, 1374, 1375, 5, 252, 127, 2, 1375, 245, 3, 2, 2, 2, 1376, 1377, 5, 248, 125, 2, 1377, 1378, 5, 252, 127, 2, 1378, 1381, 3, 2, 2, 2, 1379, 1381, 5, 250, 126, 2, 1380, 1376, 3, 2, 2, 2, 1380, 1379, 3, 2, 2, 2, 1381, 247, 3, 2, 2, 2, 1382, 1383, 9, 10, 2, 2, 1383, 1384, 7, 19, 2, 2, 1384, 1385, 7, 19, 2, 2, 1385, 249, 3, 2, 2, 2, 1386, 1387, 7, 58, 2, 2, 1387, 251, 3, 2, 2, 2, 1388, 1391, 5, 254, 128, 2, 1389, 1391, 5, 264, 133, 2, 1390, 1388, 3, 2, 2, 2, 1390, 1389, 3, 2, 2, 2, 1391, 253, 3, 2, 2, 2, 1392, 1395, 5, 74, 38, 2, 1393, 1395, 5, 256, 129, 2, 1394, 1392, 3, 2, 2, 2, 1394, 1393, 3, 2, 2, 2, 1395, 255, 3, 2, 2, 2, 1396, 1400, 7, 12, 2, 2, 1397, 1400, 5, 258, 130, 2, 1398, 1400, 5, 260, 131, 2, 1399, 1396, 3, 2, 2, 2, 1399, 1397, 3, 2, 2, 2, 1399, 1398, 3, 2, 2, 2, 1400, 257, 3, 2, 2, 2, 1401, 1402, 7, 176, 2, 2, 1402, 1403, 7, 19, 2, 2, 1403, 1404, 7, 12, 2, 2, 1404, 259, 3, 2, 2, 2, 1405, 1406, 7, 12, 2, 2, 1406, 1407, 7, 19, 2, 2, 1407, 1408, 7, 176, 2, 2, 1408, 261, 3, 2, 2, 2, 1409, 1411, 5, 186, 94, 2, 1410, 1409, 3, 2, 2, 2, 1411, 1414, 3, 2, 2, 2, 1412, 1410, 3, 2, 2, 2, 1412, 1413, 3, 2, 2, 2, 1413, 263, 3, 2, 2, 2, 1414, 1412, 3, 2, 2, 2, 1415, 1427, 5, 270, 136, 2, 1416, 1427, 5, 288, 145, 2, 1417, 1427, 5, 280, 141, 2, 1418, 1427, 5, 292, 147, 2, 1419, 1427, 5, 284, 143, 2, 1420, 1427, 5, 278, 140, 2, 1421, 1427, 5, 274, 138, 2, 1422, 1427, 5, 272, 137, 2, 1423, 1427, 5, 276, 139, 2, 1424, 1427, 5, 268, 135, 2, 1425, 1427, 5, 266, 134, 2, 1426, 1415, 3, 2, 2, 2, 1426, 1416, 3, 2, 2, 2, 1426, 1417, 3, 2, 2, 2, 1426, 1418, 3, 2, 2, 2, 1426, 1419, 3, 2, 2, 2, 1426, 1420, 3, 2, 2, 2, 1426, 1421, 3, 2, 2, 2, 1426, 1422, 3, 2, 2, 2, 1426, 1423, 3, 2, 2, 2, 1426, 1424, 3, 2, 2, 2, 1426, 1425, 3, 2, 2, 2, 1427, 265, 3, 2, 2, 2, 1428, 1429, 7, 146, 2, 2, 1429, 1430, 7, 10, 2, 2, 1430, 1431, 7, 11, 2, 2, 1431, 267, 3, 2, 2, 2, 1432, 1433, 7, 147, 2, 2, 1433, 1434, 7, 10, 2, 2, 1434, 1435, 7, 11, 2, 2, 1435, 269, 3, 2, 2, 2, 1436, 1437, 7, 149, 2, 2, 1437, 1440, 7, 10, 2, 2, 1438, 1441, 5, 288, 145, 2, 1439, 1441, 5, 292, 147, 2, 1440, 1438, 3, 2, 2, 2, 1440, 1439, 3, 2, 2, 2, 1440, 1441, 3, 2, 2, 2, 1441, 1442, 3, 2, 2, 2, 1442, 1443, 7, 11, 2, 2, 1443, 271, 3, 2, 2, 2, 1444, 1445, 7, 150, 2, 2, 1445, 1446, 7, 10, 2, 2, 1446, 1447, 7, 11, 2, 2, 1447, 273, 3, 2, 2, 2, 1448, 1449, 7, 160, 2, 2, 1449, 1450, 7, 10, 2, 2, 1450, 1451, 7, 11, 2, 2, 1451, 275, 3, 2, 2, 2, 1452, 1453, 7, 152, 2, 2, 1453, 1454, 7, 10, 2, 2, 1454, 1455, 7, 11, 2, 2, 1455, 277, 3, 2, 2, 2, 1456, 1457, 7, 151, 2, 2, 1457, 1460, 7, 10, 2, 2, 1458, 1461, 7, 176, 2, 2, 1459, 1461, 5, 324, 163, 2, 1460, 1458, 3, 2, 2, 2, 1460, 1459, 3, 2, 2, 2, 1460, 1461, 3, 2, 2, 2, 1461, 1462, 3, 2, 2, 2, 1462, 1463, 7, 11, 2, 2, 1463, 279, 3, 2, 2, 2, 1464, 1465, 7, 136, 2, 2, 1465, 1471, 7, 10, 2, 2, 1466, 1469, 5, 282, 142, 2, 1467, 1468, 7, 15, 2, 2, 1468, 1470, 5, 302, 152, 2, 1469, 1467, 3, 2, 2, 2, 1469, 1470, 3, 2, 2, 2, 1470, 1472, 3, 2, 2, 2, 1471, 1466, 3, 2, 2, 2, 1471, 1472, 3, 2, 2, 2, 1472, 1473, 3, 2, 2, 2, 1473, 1474, 7, 11, 2, 2, 1474, 281, 3, 2, 2, 2, 1475, 1478, 5, 296, 149, 2, 1476, 1478, 7, 12, 2, 2, 1477, 1475, 3, 2, 2, 2, 1477, 1476, 3, 2, 2, 2, 1478, 283, 3, 2, 2, 2, 1479, 1480, 7, 153, 2, 2, 1480, 1481, 7, 10, 2, 2, 1481, 1482, 5, 286, 144, 2, 1482, 1483, 7, 11, 2, 2, 1483, 285, 3, 2, 2, 2, 1484, 1485, 5, 296, 149, 2, 1485, 287, 3, 2, 2, 2, 1486, 1487, 7, 130, 2, 2, 1487, 1496, 7, 10, 2, 2, 1488, 1494, 5, 290, 146, 2, 1489, 1490, 7, 15, 2, 2, 1490, 1492, 5, 302, 152, 2, 1491, 1493, 7, 168, 2, 2, 1492, 1491, 3, 2, 2, 2, 1492, 1493, 3, 2, 2, 2, 1493, 1495, 3, 2, 2, 2, 1494, 1489, 3, 2, 2, 2, 1494, 1495, 3, 2, 2, 2, 1495, 1497, 3, 2, 2, 2, 1496, 1488, 3, 2, 2, 2, 1496, 1497, 3, 2, 2, 2, 1497, 1498, 3, 2, 2, 2, 1498, 1499, 7, 11, 2, 2, 1499, 289, 3, 2, 2, 2, 1500, 1503, 5, 298, 150, 2, 1501, 1503, 7, 12, 2, 2, 1502, 1500, 3, 2, 2, 2, 1502, 1501, 3, 2, 2, 2, 1503, 291, 3, 2, 2, 2, 1504, 1505, 7, 154, 2, 2, 1505, 1506, 7, 10, 2, 2, 1506, 1507, 5, 294, 148, 2, 1507, 1508, 7, 11, 2, 2, 1508, 293, 3, 2, 2, 2, 1509, 1510, 5, 298, 150, 2, 1510, 295, 3, 2, 2, 2, 1511, 1512, 5, 74, 38, 2, 1512, 297, 3, 2, 2, 2, 1513, 1514, 5, 74, 38, 2, 1514, 299, 3, 2, 2, 2, 1515, 1516, 5, 302, 152, 2, 1516, 301, 3, 2, 2, 2, 1517, 1518, 5, 74, 38, 2, 1518, 303, 3, 2, 2, 2, 1519, 1520, 7, 10, 2, 2, 1520, 1528, 7, 11, 2, 2, 1521, 1525, 5, 308, 155, 2, 1522, 1526, 7, 168, 2, 2, 1523, 1526, 7, 12, 2, 2, 1524, 1526, 7, 47, 2, 2, 1525, 1522, 3, 2, 2, 2, 1525, 1523, 3, 2, 2, 2, 1525, 1524, 3, 2, 2, 2, 1525, 1526, 3, 2, 2, 2, 1526, 1528, 3, 2, 2, 2, 1527, 1519, 3, 2, 2, 2, 1527, 1521, 3, 2, 2, 2, 1528, 305, 3, 2, 2, 2, 1529, 1538, 7, 8, 2, 2, 1530, 1535, 5, 318, 160, 2, 1531, 1532, 7, 15, 2, 2, 1532, 1534, 5, 318, 160, 2, 1533, 1531, 3, 2, 2, 2, 1534, 1537, 3, 2, 2, 2, 1535, 1533, 3, 2, 2, 2, 1535, 1536, 3, 2, 2, 2, 1536, 1539, 3, 2, 2, 2, 1537, 1535, 3, 2, 2, 2, 1538, 1530, 3, 2, 2, 2, 1538, 1539, 3, 2, 2, 2, 1539, 1540, 3, 2, 2, 2, 1540, 1546, 7, 9, 2, 2, 1541, 1542, 7, 59, 2, 2, 1542, 1543, 5, 94, 48, 2, 1543, 1544, 7, 60, 2, 2, 1544, 1546, 3, 2, 2, 2, 1545, 1529, 3, 2, 2, 2, 1545, 1541, 3, 2, 2, 2, 1546, 307, 3, 2, 2, 2, 1547, 1551, 5, 74, 38, 2, 1548, 1551, 7, 169, 2, 2, 1549, 1551, 5, 310, 156, 2, 1550, 1547, 3, 2, 2, 2, 1550, 1548, 3, 2, 2, 2, 1550, 1549, 3, 2, 2, 2, 1551, 309, 3, 2, 2, 2, 1552, 1555, 5, 312, 157, 2, 1553, 1555, 5, 314, 158, 2, 1554, 1552, 3, 2, 2, 2, 1554, 1553, 3, 2, 2, 2, 1555, 311, 3, 2, 2, 2, 1556, 1557, 7, 31, 2, 2, 1557, 1558, 7, 10, 2, 2, 1558, 1559, 7, 12, 2, 2, 1559, 1560, 7, 11, 2, 2, 1560, 313, 3, 2, 2, 2, 1561, 1562, 7, 31, 2, 2, 1562, 1571, 7, 10, 2, 2, 1563, 1568, 5, 304, 153, 2, 1564, 1565, 7, 15, 2, 2, 1565, 1567, 5, 304, 153, 2, 1566, 1564, 3, 2, 2, 2, 1567, 1570, 3, 2, 2, 2, 1568, 1566, 3, 2, 2, 2, 1568, 1569, 3, 2, 2, 2, 1569, 1572, 3, 2, 2, 2, 1570, 1568, 3, 2, 2, 2, 1571, 1563, 3, 2, 2, 2, 1571, 1572, 3, 2, 2, 2, 1572, 1573, 3, 2, 2, 2, 1573, 1574, 7, 11, 2, 2, 1574, 1575, 7, 70, 2, 2, 1575, 1576, 5, 304, 153, 2, 1576, 315, 3, 2, 2, 2, 1577, 1579, 5, 308, 155, 2, 1578, 1580, 7, 168, 2, 2, 1579, 1578, 3, 2, 2, 2, 1579, 1580, 3, 2, 2, 2, 1580, 317, 3, 2, 2, 2, 1581, 1584, 5, 96, 49, 2, 1582, 1584, 7, 176, 2, 2, 1583, 1581, 3, 2, 2, 2, 1583, 1582, 3, 2, 2, 2, 1584, 1585, 3, 2, 2, 2, 1585, 1586, 9, 11, 2, 2, 1586, 1587, 5, 96, 49, 2, 1587, 319, 3, 2, 2, 2, 1588, 1590, 7, 53, 2, 2, 1589, 1591, 5, 94, 48, 2, 1590, 1589, 3, 2, 2, 2, 1590, 1591, 3, 2, 2, 2, 1591, 1592, 3, 2, 2, 2, 1592, 1593, 7, 54, 2, 2, 1593, 321, 3, 2, 2, 2, 1594, 1595, 5, 324, 163, 2, 1595, 323, 3, 2, 2, 2, 1596, 1597, 7, 167, 2, 2, 1597, 325, 3, 2, 2, 2, 1598, 1599, 9, 12, 2, 2, 1599, 327, 3, 2, 2, 2, 155, 336, 340, 356, 362, 370, 378, 386, 401, 431, 439, 441, 463, 473, 483, 488, 493, 497, 509, 513, 522, 529, 543, 547, 552, 562, 570, 574, 586, 598, 620, 628, 633, 636, 640, 649, 658, 661, 669, 676, 678, 685, 692, 694, 702, 707, 714, 721, 731, 738, 745, 752, 761, 771, 775, 783, 785, 797, 803, 807, 811, 822, 828, 843, 849, 853, 857, 864, 871, 877, 882, 884, 888, 895, 902, 911, 923, 933, 945, 949, 958, 965, 987, 992, 997, 1001, 1013, 1021, 1025, 1032, 1039, 1045, 1052, 1060, 1067, 1073, 1079, 1085, 1091, 1102, 1108, 1113, 1121, 1142, 1151, 1153, 1176, 1193, 1204, 1226, 1230, 1237, 1241, 1251, 1256, 1270, 1279, 1285, 1311, 1328, 1330, 1338, 1343, 1350, 1355, 1359, 1367, 1380, 1390, 1394, 1399, 1412, 1426, 1440, 1460, 1469, 1471, 1477, 1492, 1494, 1496, 1502, 1525, 1527, 1535, 1538, 1545, 1550, 1554, 1568, 1571, 1579, 1583, 1590] \ No newline at end of file diff --git a/src/main/java/org/rumbledb/parser/JsoniqParser.java b/src/main/java/org/rumbledb/parser/JsoniqParser.java index 42bb53f2f..68d965cd7 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqParser.java +++ b/src/main/java/org/rumbledb/parser/JsoniqParser.java @@ -350,7 +350,6 @@ public final ModuleContext module() throws RecognitionException { case T__3: case T__5: case T__7: - case T__9: case T__11: case T__14: case T__28: @@ -427,7 +426,6 @@ public final ModuleContext module() throws RecognitionException { case Kwith: case Kposition: case Kimport: - case Kelement: case Kslash: case Kdslash: case Kat_symbol: @@ -443,15 +441,6 @@ public final ModuleContext module() throws RecognitionException { case Kpreceding_sibling: case Kpreceding: case Kancestor_or_self: - case Knode: - case Kbinary: - case Kdocument_node: - case Ktext: - case Kpi: - case Knamespace_node: - case Kschema_attribute: - case Kschema_element: - case Kcomment: case Kbreak: case Kloop: case Kcontinue: @@ -850,7 +839,7 @@ public final StatementsAndOptionalExprContext statementsAndOptionalExpr() throws setState(384); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Kcomment - 128)) | (1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { { setState(383); expr(); @@ -6313,39 +6302,36 @@ public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionEx enterRule(_localctx, 152, RULE_multiplicativeExpr); int _la; try { - int _alt; enterOuterAlt(_localctx, 1); { setState(1053); ((MultiplicativeExprContext)_localctx).main_expr = instanceOfExpr(); setState(1058); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,92,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(1054); - ((MultiplicativeExprContext)_localctx)._tset1965 = _input.LT(1); - _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) ) { - ((MultiplicativeExprContext)_localctx)._tset1965 = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1965); - setState(1055); - ((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr(); - ((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr); - } - } + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) { + { + { + setState(1054); + ((MultiplicativeExprContext)_localctx)._tset1965 = _input.LT(1); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) ) { + ((MultiplicativeExprContext)_localctx)._tset1965 = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1965); + setState(1055); + ((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr(); + ((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr); + } } setState(1060); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,92,_ctx); + _la = _input.LA(1); } } } @@ -7837,7 +7823,7 @@ public final ParenthesizedExprContext parenthesizedExpr() throws RecognitionExce setState(1202); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Kcomment - 128)) | (1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { { setState(1201); expr(); @@ -8051,7 +8037,7 @@ public final ArgumentListContext argumentList() throws RecognitionException { setState(1228); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Kcomment - 128)) | (1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (ArgumentPlaceholder - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (ArgumentPlaceholder - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { { { setState(1222); @@ -8114,7 +8100,6 @@ public final ArgumentContext argument() throws RecognitionException { case T__3: case T__5: case T__7: - case T__9: case T__11: case T__14: case T__28: @@ -8190,7 +8175,6 @@ public final ArgumentContext argument() throws RecognitionException { case Kjson: case Kwith: case Kposition: - case Kelement: case Kslash: case Kdslash: case Kat_symbol: @@ -8206,15 +8190,6 @@ public final ArgumentContext argument() throws RecognitionException { case Kpreceding_sibling: case Kpreceding: case Kancestor_or_self: - case Knode: - case Kbinary: - case Kdocument_node: - case Ktext: - case Kpi: - case Knamespace_node: - case Kschema_attribute: - case Kschema_element: - case Kcomment: case Kbreak: case Kloop: case Kcontinue: @@ -9092,7 +9067,6 @@ public final PathExprContext pathExpr() throws RecognitionException { case T__3: case T__5: case T__7: - case T__9: case T__11: case T__14: case T__28: @@ -9166,7 +9140,6 @@ public final PathExprContext pathExpr() throws RecognitionException { case Kjson: case Kwith: case Kposition: - case Kelement: case Kat_symbol: case Kchild: case Kdescendant: @@ -9180,15 +9153,6 @@ public final PathExprContext pathExpr() throws RecognitionException { case Kpreceding_sibling: case Kpreceding: case Kancestor_or_self: - case Knode: - case Kbinary: - case Kdocument_node: - case Ktext: - case Kpi: - case Knamespace_node: - case Kschema_attribute: - case Kschema_element: - case Kcomment: case Kbreak: case Kloop: case Kcontinue: @@ -9325,76 +9289,16 @@ public final StepExprContext stepExpr() throws RecognitionException { try { setState(1353); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,123,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(1351); - postFixExpr(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(1352); - axisStep(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class AxisStepContext extends ParserRuleContext { - public PredicateListContext predicateList() { - return getRuleContext(PredicateListContext.class,0); - } - public ReverseStepContext reverseStep() { - return getRuleContext(ReverseStepContext.class,0); - } - public ForwardStepContext forwardStep() { - return getRuleContext(ForwardStepContext.class,0); - } - public AxisStepContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_axisStep; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAxisStep(this); - else return visitor.visitChildren(this); - } - } - - public final AxisStepContext axisStep() throws RecognitionException { - AxisStepContext _localctx = new AxisStepContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_axisStep); - try { - enterOuterAlt(_localctx, 1); - { - setState(1357); - _errHandler.sync(this); switch (_input.LA(1)) { - case T__55: - case Kparent: - case Kancestor: - case Kpreceding_sibling: - case Kpreceding: - case Kancestor_or_self: - { - setState(1355); - reverseStep(); - } - break; - case T__9: + case T__3: + case T__5: + case T__7: + case T__11: + case T__14: + case T__28: + case T__50: + case T__53: + case T__56: case Kfor: case Klet: case Kwhere: @@ -9461,32 +9365,106 @@ public final AxisStepContext axisStep() throws RecognitionException { case Kjson: case Kwith: case Kposition: - case Kelement: - case Kat_symbol: - case Kchild: - case Kdescendant: - case Kattribute: - case Kself: - case Kdescendant_or_self: - case Kfollowing_sibling: - case Kfollowing: - case Knode: - case Kbinary: - case Kdocument_node: - case Ktext: - case Kpi: - case Knamespace_node: - case Kschema_attribute: - case Kschema_element: - case Kcomment: case Kbreak: case Kloop: case Kcontinue: case Kexit: case Kreturning: case Kwhile: + case STRING: case NullLiteral: + case Literal: case NCName: + enterOuterAlt(_localctx, 1); + { + setState(1351); + postFixExpr(); + } + break; + case T__55: + case Kat_symbol: + case Kchild: + case Kdescendant: + case Kattribute: + case Kself: + case Kdescendant_or_self: + case Kfollowing_sibling: + case Kfollowing: + case Kparent: + case Kancestor: + case Kpreceding_sibling: + case Kpreceding: + case Kancestor_or_self: + enterOuterAlt(_localctx, 2); + { + setState(1352); + axisStep(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AxisStepContext extends ParserRuleContext { + public PredicateListContext predicateList() { + return getRuleContext(PredicateListContext.class,0); + } + public ReverseStepContext reverseStep() { + return getRuleContext(ReverseStepContext.class,0); + } + public ForwardStepContext forwardStep() { + return getRuleContext(ForwardStepContext.class,0); + } + public AxisStepContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_axisStep; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAxisStep(this); + else return visitor.visitChildren(this); + } + } + + public final AxisStepContext axisStep() throws RecognitionException { + AxisStepContext _localctx = new AxisStepContext(_ctx, getState()); + enterRule(_localctx, 236, RULE_axisStep); + try { + enterOuterAlt(_localctx, 1); + { + setState(1357); + _errHandler.sync(this); + switch (_input.LA(1)) { + case T__55: + case Kparent: + case Kancestor: + case Kpreceding_sibling: + case Kpreceding: + case Kancestor_or_self: + { + setState(1355); + reverseStep(); + } + break; + case Kat_symbol: + case Kchild: + case Kdescendant: + case Kattribute: + case Kself: + case Kdescendant_or_self: + case Kfollowing_sibling: + case Kfollowing: { setState(1356); forwardStep(); @@ -9537,8 +9515,14 @@ public final ForwardStepContext forwardStep() throws RecognitionException { try { setState(1365); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { - case 1: + switch (_input.LA(1)) { + case Kchild: + case Kdescendant: + case Kattribute: + case Kself: + case Kdescendant_or_self: + case Kfollowing_sibling: + case Kfollowing: enterOuterAlt(_localctx, 1); { { @@ -9549,13 +9533,15 @@ public final ForwardStepContext forwardStep() throws RecognitionException { } } break; - case 2: + case Kat_symbol: enterOuterAlt(_localctx, 2); { setState(1364); abbrevForwardStep(); } break; + default: + throw new NoViableAltException(this); } } catch (RecognitionException re) { @@ -9623,10 +9609,10 @@ public final ForwardAxisContext forwardAxis() throws RecognitionException { } public static class AbbrevForwardStepContext extends ParserRuleContext { + public TerminalNode Kat_symbol() { return getToken(JsoniqParser.Kat_symbol, 0); } public NodeTestContext nodeTest() { return getRuleContext(NodeTestContext.class,0); } - public TerminalNode Kat_symbol() { return getToken(JsoniqParser.Kat_symbol, 0); } public AbbrevForwardStepContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -9641,21 +9627,12 @@ public T accept(ParseTreeVisitor visitor) { public final AbbrevForwardStepContext abbrevForwardStep() throws RecognitionException { AbbrevForwardStepContext _localctx = new AbbrevForwardStepContext(_ctx, getState()); enterRule(_localctx, 242, RULE_abbrevForwardStep); - int _la; try { enterOuterAlt(_localctx, 1); { + setState(1371); + match(Kat_symbol); setState(1372); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==Kat_symbol) { - { - setState(1371); - match(Kat_symbol); - } - } - - setState(1374); nodeTest(); } } @@ -9695,7 +9672,7 @@ public final ReverseStepContext reverseStep() throws RecognitionException { ReverseStepContext _localctx = new ReverseStepContext(_ctx, getState()); enterRule(_localctx, 244, RULE_reverseStep); try { - setState(1380); + setState(1378); _errHandler.sync(this); switch (_input.LA(1)) { case Kparent: @@ -9706,9 +9683,9 @@ public final ReverseStepContext reverseStep() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(1376); + setState(1374); reverseAxis(); - setState(1377); + setState(1375); nodeTest(); } } @@ -9716,7 +9693,7 @@ public final ReverseStepContext reverseStep() throws RecognitionException { case T__55: enterOuterAlt(_localctx, 2); { - setState(1379); + setState(1377); abbrevReverseStep(); } break; @@ -9759,7 +9736,7 @@ public final ReverseAxisContext reverseAxis() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1382); + setState(1380); _la = _input.LA(1); if ( !(((((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & ((1L << (Kparent - 139)) | (1L << (Kancestor - 139)) | (1L << (Kpreceding_sibling - 139)) | (1L << (Kpreceding - 139)) | (1L << (Kancestor_or_self - 139)))) != 0)) ) { _errHandler.recoverInline(this); @@ -9769,9 +9746,9 @@ public final ReverseAxisContext reverseAxis() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1383); + setState(1381); match(T__16); - setState(1384); + setState(1382); match(T__16); } } @@ -9804,7 +9781,7 @@ public final AbbrevReverseStepContext abbrevReverseStep() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1386); + setState(1384); match(T__55); } } @@ -9841,7 +9818,7 @@ public final NodeTestContext nodeTest() throws RecognitionException { NodeTestContext _localctx = new NodeTestContext(_ctx, getState()); enterRule(_localctx, 250, RULE_nodeTest); try { - setState(1390); + setState(1388); _errHandler.sync(this); switch (_input.LA(1)) { case T__9: @@ -9921,7 +9898,7 @@ public final NodeTestContext nodeTest() throws RecognitionException { case NCName: enterOuterAlt(_localctx, 1); { - setState(1388); + setState(1386); nameTest(); } break; @@ -9938,7 +9915,7 @@ public final NodeTestContext nodeTest() throws RecognitionException { case Kcomment: enterOuterAlt(_localctx, 2); { - setState(1389); + setState(1387); kindTest(); } break; @@ -9979,20 +9956,20 @@ public final NameTestContext nameTest() throws RecognitionException { NameTestContext _localctx = new NameTestContext(_ctx, getState()); enterRule(_localctx, 252, RULE_nameTest); try { - setState(1394); + setState(1392); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1392); + setState(1390); qname(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1393); + setState(1391); wildcard(); } break; @@ -10055,14 +10032,14 @@ public final WildcardContext wildcard() throws RecognitionException { WildcardContext _localctx = new WildcardContext(_ctx, getState()); enterRule(_localctx, 254, RULE_wildcard); try { - setState(1399); + setState(1397); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { case 1: _localctx = new AllNamesContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(1396); + setState(1394); match(T__9); } break; @@ -10070,7 +10047,7 @@ public final WildcardContext wildcard() throws RecognitionException { _localctx = new AllWithNSContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(1397); + setState(1395); nCNameWithLocalWildcard(); } break; @@ -10078,7 +10055,7 @@ public final WildcardContext wildcard() throws RecognitionException { _localctx = new AllWithLocalContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(1398); + setState(1396); nCNameWithPrefixWildcard(); } break; @@ -10114,11 +10091,11 @@ public final NCNameWithLocalWildcardContext nCNameWithLocalWildcard() throws Rec try { enterOuterAlt(_localctx, 1); { - setState(1401); + setState(1399); match(NCName); - setState(1402); + setState(1400); match(T__16); - setState(1403); + setState(1401); match(T__9); } } @@ -10152,11 +10129,11 @@ public final NCNameWithPrefixWildcardContext nCNameWithPrefixWildcard() throws R try { enterOuterAlt(_localctx, 1); { - setState(1405); + setState(1403); match(T__9); - setState(1406); + setState(1404); match(T__16); - setState(1407); + setState(1405); match(NCName); } } @@ -10196,21 +10173,21 @@ public final PredicateListContext predicateList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1412); + setState(1410); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,131,_ctx); + _alt = getInterpreter().adaptivePredict(_input,130,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1409); + setState(1407); predicate(); } } } - setState(1414); + setState(1412); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,131,_ctx); + _alt = getInterpreter().adaptivePredict(_input,130,_ctx); } } } @@ -10274,83 +10251,83 @@ public final KindTestContext kindTest() throws RecognitionException { KindTestContext _localctx = new KindTestContext(_ctx, getState()); enterRule(_localctx, 262, RULE_kindTest); try { - setState(1426); + setState(1424); _errHandler.sync(this); switch (_input.LA(1)) { case Kdocument_node: enterOuterAlt(_localctx, 1); { - setState(1415); + setState(1413); documentTest(); } break; case Kelement: enterOuterAlt(_localctx, 2); { - setState(1416); + setState(1414); elementTest(); } break; case Kattribute: enterOuterAlt(_localctx, 3); { - setState(1417); + setState(1415); attributeTest(); } break; case Kschema_element: enterOuterAlt(_localctx, 4); { - setState(1418); + setState(1416); schemaElementTest(); } break; case Kschema_attribute: enterOuterAlt(_localctx, 5); { - setState(1419); + setState(1417); schemaAttributeTest(); } break; case Kpi: enterOuterAlt(_localctx, 6); { - setState(1420); + setState(1418); piTest(); } break; case Kcomment: enterOuterAlt(_localctx, 7); { - setState(1421); + setState(1419); commentTest(); } break; case Ktext: enterOuterAlt(_localctx, 8); { - setState(1422); + setState(1420); textTest(); } break; case Knamespace_node: enterOuterAlt(_localctx, 9); { - setState(1423); + setState(1421); namespaceNodeTest(); } break; case Kbinary: enterOuterAlt(_localctx, 10); { - setState(1424); + setState(1422); binaryNodeTest(); } break; case Knode: enterOuterAlt(_localctx, 11); { - setState(1425); + setState(1423); anyKindTest(); } break; @@ -10388,11 +10365,11 @@ public final AnyKindTestContext anyKindTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1428); + setState(1426); match(Knode); - setState(1429); + setState(1427); match(T__7); - setState(1430); + setState(1428); match(T__8); } } @@ -10426,11 +10403,11 @@ public final BinaryNodeTestContext binaryNodeTest() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1432); + setState(1430); match(Kbinary); - setState(1433); + setState(1431); match(T__7); - setState(1434); + setState(1432); match(T__8); } } @@ -10470,22 +10447,22 @@ public final DocumentTestContext documentTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1436); + setState(1434); match(Kdocument_node); - setState(1437); + setState(1435); match(T__7); - setState(1440); + setState(1438); _errHandler.sync(this); switch (_input.LA(1)) { case Kelement: { - setState(1438); + setState(1436); elementTest(); } break; case Kschema_element: { - setState(1439); + setState(1437); schemaElementTest(); } break; @@ -10494,7 +10471,7 @@ public final DocumentTestContext documentTest() throws RecognitionException { default: break; } - setState(1442); + setState(1440); match(T__8); } } @@ -10528,11 +10505,11 @@ public final TextTestContext textTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1444); + setState(1442); match(Ktext); - setState(1445); + setState(1443); match(T__7); - setState(1446); + setState(1444); match(T__8); } } @@ -10566,11 +10543,11 @@ public final CommentTestContext commentTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1448); + setState(1446); match(Kcomment); - setState(1449); + setState(1447); match(T__7); - setState(1450); + setState(1448); match(T__8); } } @@ -10604,11 +10581,11 @@ public final NamespaceNodeTestContext namespaceNodeTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1452); + setState(1450); match(Knamespace_node); - setState(1453); + setState(1451); match(T__7); - setState(1454); + setState(1452); match(T__8); } } @@ -10646,22 +10623,22 @@ public final PiTestContext piTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1456); + setState(1454); match(Kpi); - setState(1457); + setState(1455); match(T__7); - setState(1460); + setState(1458); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(1458); + setState(1456); match(NCName); } break; case STRING: { - setState(1459); + setState(1457); stringLiteral(); } break; @@ -10670,7 +10647,7 @@ public final PiTestContext piTest() throws RecognitionException { default: break; } - setState(1462); + setState(1460); match(T__8); } } @@ -10712,25 +10689,25 @@ public final AttributeTestContext attributeTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1464); + setState(1462); match(Kattribute); - setState(1465); + setState(1463); match(T__7); - setState(1471); + setState(1469); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 159)) & ~0x3f) == 0 && ((1L << (_la - 159)) & ((1L << (Kbreak - 159)) | (1L << (Kloop - 159)) | (1L << (Kcontinue - 159)) | (1L << (Kexit - 159)) | (1L << (Kreturning - 159)) | (1L << (Kwhile - 159)) | (1L << (NullLiteral - 159)) | (1L << (NCName - 159)))) != 0)) { { - setState(1466); + setState(1464); attributeNameOrWildcard(); - setState(1469); + setState(1467); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__12) { { - setState(1467); + setState(1465); match(T__12); - setState(1468); + setState(1466); ((AttributeTestContext)_localctx).type = typeName(); } } @@ -10738,7 +10715,7 @@ public final AttributeTestContext attributeTest() throws RecognitionException { } } - setState(1473); + setState(1471); match(T__8); } } @@ -10772,7 +10749,7 @@ public final AttributeNameOrWildcardContext attributeNameOrWildcard() throws Rec AttributeNameOrWildcardContext _localctx = new AttributeNameOrWildcardContext(_ctx, getState()); enterRule(_localctx, 280, RULE_attributeNameOrWildcard); try { - setState(1477); + setState(1475); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -10851,14 +10828,14 @@ public final AttributeNameOrWildcardContext attributeNameOrWildcard() throws Rec case NCName: enterOuterAlt(_localctx, 1); { - setState(1475); + setState(1473); attributeName(); } break; case T__9: enterOuterAlt(_localctx, 2); { - setState(1476); + setState(1474); match(T__9); } break; @@ -10899,13 +10876,13 @@ public final SchemaAttributeTestContext schemaAttributeTest() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(1479); + setState(1477); match(Kschema_attribute); - setState(1480); + setState(1478); match(T__7); - setState(1481); + setState(1479); attributeDeclaration(); - setState(1482); + setState(1480); match(T__8); } } @@ -10941,7 +10918,7 @@ public final AttributeDeclarationContext attributeDeclaration() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(1484); + setState(1482); attributeName(); } } @@ -10985,32 +10962,32 @@ public final ElementTestContext elementTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1486); + setState(1484); match(Kelement); - setState(1487); + setState(1485); match(T__7); - setState(1496); + setState(1494); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 159)) & ~0x3f) == 0 && ((1L << (_la - 159)) & ((1L << (Kbreak - 159)) | (1L << (Kloop - 159)) | (1L << (Kcontinue - 159)) | (1L << (Kexit - 159)) | (1L << (Kreturning - 159)) | (1L << (Kwhile - 159)) | (1L << (NullLiteral - 159)) | (1L << (NCName - 159)))) != 0)) { { - setState(1488); + setState(1486); elementNameOrWildcard(); - setState(1494); + setState(1492); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__12) { { - setState(1489); + setState(1487); match(T__12); - setState(1490); + setState(1488); ((ElementTestContext)_localctx).type = typeName(); - setState(1492); + setState(1490); _errHandler.sync(this); _la = _input.LA(1); if (_la==ArgumentPlaceholder) { { - setState(1491); + setState(1489); ((ElementTestContext)_localctx).optional = match(ArgumentPlaceholder); } } @@ -11021,7 +10998,7 @@ public final ElementTestContext elementTest() throws RecognitionException { } } - setState(1498); + setState(1496); match(T__8); } } @@ -11055,7 +11032,7 @@ public final ElementNameOrWildcardContext elementNameOrWildcard() throws Recogni ElementNameOrWildcardContext _localctx = new ElementNameOrWildcardContext(_ctx, getState()); enterRule(_localctx, 288, RULE_elementNameOrWildcard); try { - setState(1502); + setState(1500); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -11134,14 +11111,14 @@ public final ElementNameOrWildcardContext elementNameOrWildcard() throws Recogni case NCName: enterOuterAlt(_localctx, 1); { - setState(1500); + setState(1498); elementName(); } break; case T__9: enterOuterAlt(_localctx, 2); { - setState(1501); + setState(1499); match(T__9); } break; @@ -11182,13 +11159,13 @@ public final SchemaElementTestContext schemaElementTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1504); + setState(1502); match(Kschema_element); - setState(1505); + setState(1503); match(T__7); - setState(1506); + setState(1504); elementDeclaration(); - setState(1507); + setState(1505); match(T__8); } } @@ -11224,7 +11201,7 @@ public final ElementDeclarationContext elementDeclaration() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(1509); + setState(1507); elementName(); } } @@ -11260,7 +11237,7 @@ public final AttributeNameContext attributeName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1511); + setState(1509); qname(); } } @@ -11296,7 +11273,7 @@ public final ElementNameContext elementName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1513); + setState(1511); qname(); } } @@ -11332,7 +11309,7 @@ public final SimpleTypeNameContext simpleTypeName() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1515); + setState(1513); typeName(); } } @@ -11368,7 +11345,7 @@ public final TypeNameContext typeName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1517); + setState(1515); qname(); } } @@ -11410,15 +11387,15 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { SequenceTypeContext _localctx = new SequenceTypeContext(_ctx, getState()); enterRule(_localctx, 302, RULE_sequenceType); try { - setState(1527); + setState(1525); _errHandler.sync(this); switch (_input.LA(1)) { case T__7: enterOuterAlt(_localctx, 1); { - setState(1519); + setState(1517); match(T__7); - setState(1520); + setState(1518); match(T__8); } break; @@ -11499,28 +11476,28 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { case NCName: enterOuterAlt(_localctx, 2); { - setState(1521); + setState(1519); ((SequenceTypeContext)_localctx).item = itemType(); - setState(1525); + setState(1523); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { case 1: { - setState(1522); + setState(1520); ((SequenceTypeContext)_localctx).s166 = match(ArgumentPlaceholder); ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s166); } break; case 2: { - setState(1523); + setState(1521); ((SequenceTypeContext)_localctx).s10 = match(T__9); ((SequenceTypeContext)_localctx).star.add(((SequenceTypeContext)_localctx).s10); } break; case 3: { - setState(1524); + setState(1522); ((SequenceTypeContext)_localctx).s45 = match(T__44); ((SequenceTypeContext)_localctx).plus.add(((SequenceTypeContext)_localctx).s45); } @@ -11571,53 +11548,53 @@ public final ObjectConstructorContext objectConstructor() throws RecognitionExce enterRule(_localctx, 304, RULE_objectConstructor); int _la; try { - setState(1545); + setState(1543); _errHandler.sync(this); switch (_input.LA(1)) { case T__5: enterOuterAlt(_localctx, 1); { - setState(1529); + setState(1527); match(T__5); - setState(1538); + setState(1536); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Kcomment - 128)) | (1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { { - setState(1530); + setState(1528); pairConstructor(); - setState(1535); + setState(1533); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(1531); + setState(1529); match(T__12); - setState(1532); + setState(1530); pairConstructor(); } } - setState(1537); + setState(1535); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1540); + setState(1538); match(T__6); } break; case T__56: enterOuterAlt(_localctx, 2); { - setState(1541); + setState(1539); ((ObjectConstructorContext)_localctx).s57 = match(T__56); ((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s57); - setState(1542); + setState(1540); expr(); - setState(1543); + setState(1541); match(T__57); } break; @@ -11659,27 +11636,27 @@ public final ItemTypeContext itemType() throws RecognitionException { ItemTypeContext _localctx = new ItemTypeContext(_ctx, getState()); enterRule(_localctx, 306, RULE_itemType); try { - setState(1550); + setState(1548); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1547); + setState(1545); qname(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1548); + setState(1546); match(NullLiteral); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1549); + setState(1547); functionTest(); } break; @@ -11720,18 +11697,18 @@ public final FunctionTestContext functionTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1554); + setState(1552); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { case 1: { - setState(1552); + setState(1550); anyFunctionTest(); } break; case 2: { - setState(1553); + setState(1551); typedFunctionTest(); } break; @@ -11767,13 +11744,13 @@ public final AnyFunctionTestContext anyFunctionTest() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1556); + setState(1554); match(T__28); - setState(1557); + setState(1555); match(T__7); - setState(1558); + setState(1556); match(T__9); - setState(1559); + setState(1557); match(T__8); } } @@ -11817,43 +11794,43 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1561); + setState(1559); match(T__28); - setState(1562); + setState(1560); match(T__7); - setState(1571); + setState(1569); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__7) | (1L << T__28) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 159)) & ~0x3f) == 0 && ((1L << (_la - 159)) & ((1L << (Kbreak - 159)) | (1L << (Kloop - 159)) | (1L << (Kcontinue - 159)) | (1L << (Kexit - 159)) | (1L << (Kreturning - 159)) | (1L << (Kwhile - 159)) | (1L << (NullLiteral - 159)) | (1L << (NCName - 159)))) != 0)) { { - setState(1563); + setState(1561); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); - setState(1568); + setState(1566); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(1564); + setState(1562); match(T__12); - setState(1565); + setState(1563); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); } } - setState(1570); + setState(1568); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1573); + setState(1571); match(T__8); - setState(1574); + setState(1572); match(Kas); - setState(1575); + setState(1573); ((TypedFunctionTestContext)_localctx).rt = sequenceType(); } } @@ -11893,14 +11870,14 @@ public final SingleTypeContext singleType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1577); + setState(1575); ((SingleTypeContext)_localctx).item = itemType(); - setState(1579); + setState(1577); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { case 1: { - setState(1578); + setState(1576); ((SingleTypeContext)_localctx).s166 = match(ArgumentPlaceholder); ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s166); } @@ -11949,23 +11926,23 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1583); + setState(1581); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { case 1: { - setState(1581); + setState(1579); ((PairConstructorContext)_localctx).lhs = exprSingle(); } break; case 2: { - setState(1582); + setState(1580); ((PairConstructorContext)_localctx).name = match(NCName); } break; } - setState(1585); + setState(1583); _la = _input.LA(1); if ( !(_la==T__16 || _la==ArgumentPlaceholder) ) { _errHandler.recoverInline(this); @@ -11975,7 +11952,7 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio _errHandler.reportMatch(this); consume(); } - setState(1586); + setState(1584); ((PairConstructorContext)_localctx).rhs = exprSingle(); } } @@ -12012,19 +11989,19 @@ public final ArrayConstructorContext arrayConstructor() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1588); + setState(1586); match(T__50); - setState(1590); + setState(1588); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__9) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kelement - 128)) | (1L << (Kslash - 128)) | (1L << (Kdslash - 128)) | (1L << (Kat_symbol - 128)) | (1L << (Kchild - 128)) | (1L << (Kdescendant - 128)) | (1L << (Kattribute - 128)) | (1L << (Kself - 128)) | (1L << (Kdescendant_or_self - 128)) | (1L << (Kfollowing_sibling - 128)) | (1L << (Kfollowing - 128)) | (1L << (Kparent - 128)) | (1L << (Kancestor - 128)) | (1L << (Kpreceding_sibling - 128)) | (1L << (Kpreceding - 128)) | (1L << (Kancestor_or_self - 128)) | (1L << (Knode - 128)) | (1L << (Kbinary - 128)) | (1L << (Kdocument_node - 128)) | (1L << (Ktext - 128)) | (1L << (Kpi - 128)) | (1L << (Knamespace_node - 128)) | (1L << (Kschema_attribute - 128)) | (1L << (Kschema_element - 128)) | (1L << (Kcomment - 128)) | (1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) { { - setState(1589); + setState(1587); expr(); } } - setState(1592); + setState(1590); match(T__51); } } @@ -12060,7 +12037,7 @@ public final UriLiteralContext uriLiteral() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1594); + setState(1592); stringLiteral(); } } @@ -12094,7 +12071,7 @@ public final StringLiteralContext stringLiteral() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1596); + setState(1594); match(STRING); } } @@ -12201,7 +12178,7 @@ public final KeyWordsContext keyWords() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1598); + setState(1596); _la = _input.LA(1); if ( !(((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (Kfor - 59)) | (1L << (Klet - 59)) | (1L << (Kwhere - 59)) | (1L << (Kgroup - 59)) | (1L << (Kby - 59)) | (1L << (Korder - 59)) | (1L << (Kreturn - 59)) | (1L << (Kif - 59)) | (1L << (Kin - 59)) | (1L << (Kas - 59)) | (1L << (Kat - 59)) | (1L << (Kallowing - 59)) | (1L << (Kempty - 59)) | (1L << (Kcount - 59)) | (1L << (Kstable - 59)) | (1L << (Kascending - 59)) | (1L << (Kdescending - 59)) | (1L << (Ksome - 59)) | (1L << (Kevery - 59)) | (1L << (Ksatisfies - 59)) | (1L << (Kcollation - 59)) | (1L << (Kgreatest - 59)) | (1L << (Kleast - 59)) | (1L << (Kswitch - 59)) | (1L << (Kcase - 59)) | (1L << (Ktry - 59)) | (1L << (Kcatch - 59)) | (1L << (Kdefault - 59)) | (1L << (Kthen - 59)) | (1L << (Kelse - 59)) | (1L << (Ktypeswitch - 59)) | (1L << (Kor - 59)) | (1L << (Kand - 59)) | (1L << (Knot - 59)) | (1L << (Kto - 59)) | (1L << (Kinstance - 59)) | (1L << (Kof - 59)) | (1L << (Kstatically - 59)) | (1L << (Kis - 59)) | (1L << (Ktreat - 59)) | (1L << (Kcast - 59)) | (1L << (Kcastable - 59)) | (1L << (Kversion - 59)) | (1L << (Kjsoniq - 59)) | (1L << (Kunordered - 59)) | (1L << (Ktrue - 59)) | (1L << (Kfalse - 59)) | (1L << (Ktype - 59)) | (1L << (Kvalidate - 59)) | (1L << (Kannotate - 59)) | (1L << (Kdeclare - 59)) | (1L << (Kcontext - 59)) | (1L << (Kitem - 59)) | (1L << (Kvariable - 59)) | (1L << (Kinsert - 59)) | (1L << (Kdelete - 59)) | (1L << (Krename - 59)) | (1L << (Kreplace - 59)) | (1L << (Kcopy - 59)) | (1L << (Kmodify - 59)) | (1L << (Kappend - 59)) | (1L << (Kinto - 59)) | (1L << (Kvalue - 59)) | (1L << (Kjson - 59)))) != 0) || ((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (Kwith - 123)) | (1L << (Kposition - 123)) | (1L << (Kbreak - 123)) | (1L << (Kloop - 123)) | (1L << (Kcontinue - 123)) | (1L << (Kexit - 123)) | (1L << (Kreturning - 123)) | (1L << (Kwhile - 123)) | (1L << (NullLiteral - 123)))) != 0)) ) { _errHandler.recoverInline(this); @@ -12225,7 +12202,7 @@ public final KeyWordsContext keyWords() throws RecognitionException { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00b2\u0643\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00b2\u0641\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -12316,61 +12293,61 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\3q\3r\3r\3r\3r\3r\3r\3s\3s\3s\6s\u0531\ns\rs\16s\u0532\3t\3t\3t\3t\3"+ "u\3u\5u\u053b\nu\3u\3u\3u\5u\u0540\nu\3v\3v\3v\7v\u0545\nv\fv\16v\u0548"+ "\13v\3w\3w\5w\u054c\nw\3x\3x\5x\u0550\nx\3x\3x\3y\3y\3y\3y\5y\u0558\n"+ - "y\3z\3z\3z\3z\3{\5{\u055f\n{\3{\3{\3|\3|\3|\3|\5|\u0567\n|\3}\3}\3}\3"+ - "}\3~\3~\3\177\3\177\5\177\u0571\n\177\3\u0080\3\u0080\5\u0080\u0575\n"+ - "\u0080\3\u0081\3\u0081\3\u0081\5\u0081\u057a\n\u0081\3\u0082\3\u0082\3"+ - "\u0082\3\u0082\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\7\u0084\u0585\n"+ - "\u0084\f\u0084\16\u0084\u0588\13\u0084\3\u0085\3\u0085\3\u0085\3\u0085"+ - "\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\5\u0085\u0595"+ - "\n\u0085\3\u0086\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\3\u0087"+ - "\3\u0088\3\u0088\3\u0088\3\u0088\5\u0088\u05a3\n\u0088\3\u0088\3\u0088"+ - "\3\u0089\3\u0089\3\u0089\3\u0089\3\u008a\3\u008a\3\u008a\3\u008a\3\u008b"+ - "\3\u008b\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u05b7"+ - "\n\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\5\u008d"+ - "\u05c0\n\u008d\5\u008d\u05c2\n\u008d\3\u008d\3\u008d\3\u008e\3\u008e\5"+ - "\u008e\u05c8\n\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3"+ - "\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\5\u0091\u05d7\n"+ - "\u0091\5\u0091\u05d9\n\u0091\5\u0091\u05db\n\u0091\3\u0091\3\u0091\3\u0092"+ - "\3\u0092\5\u0092\u05e1\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093"+ - "\3\u0094\3\u0094\3\u0095\3\u0095\3\u0096\3\u0096\3\u0097\3\u0097\3\u0098"+ - "\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\5\u0099\u05f8"+ - "\n\u0099\5\u0099\u05fa\n\u0099\3\u009a\3\u009a\3\u009a\3\u009a\7\u009a"+ - "\u0600\n\u009a\f\u009a\16\u009a\u0603\13\u009a\5\u009a\u0605\n\u009a\3"+ - "\u009a\3\u009a\3\u009a\3\u009a\3\u009a\5\u009a\u060c\n\u009a\3\u009b\3"+ - "\u009b\3\u009b\5\u009b\u0611\n\u009b\3\u009c\3\u009c\5\u009c\u0615\n\u009c"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e"+ - "\3\u009e\7\u009e\u0621\n\u009e\f\u009e\16\u009e\u0624\13\u009e\5\u009e"+ - "\u0626\n\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f\5\u009f"+ - "\u062e\n\u009f\3\u00a0\3\u00a0\5\u00a0\u0632\n\u00a0\3\u00a0\3\u00a0\3"+ - "\u00a0\3\u00a1\3\u00a1\5\u00a1\u0639\n\u00a1\3\u00a1\3\u00a1\3\u00a2\3"+ - "\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\2\2\u00a5\2\4\6\b\n\f\16"+ - "\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bd"+ - "fhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092"+ - "\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa"+ - "\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2"+ - "\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da"+ - "\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2"+ - "\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a"+ - "\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122"+ - "\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a"+ - "\u013c\u013e\u0140\u0142\u0144\u0146\2\r\4\2\21\21ii\3\2RS\3\2\24\35\4"+ - "\2\5\5#-\3\2/\60\4\2\f\f\61\63\3\2\u0083\u0084\3\2\u0086\u008c\3\2\u008d"+ - "\u0091\4\2\23\23\u00a8\u00a8\5\2=~\u00a1\u00a6\u00a9\u00a9\2\u0683\2\u0148"+ - "\3\2\2\2\4\u0150\3\2\2\2\6\u0156\3\2\2\2\b\u0159\3\2\2\2\n\u016a\3\2\2"+ - "\2\f\u0175\3\2\2\2\16\u017a\3\2\2\2\20\u017d\3\2\2\2\22\u0180\3\2\2\2"+ - "\24\u0191\3\2\2\2\26\u0193\3\2\2\2\30\u0196\3\2\2\2\32\u019c\3\2\2\2\34"+ - "\u01a0\3\2\2\2\36\u01a4\3\2\2\2 \u01a8\3\2\2\2\"\u01af\3\2\2\2$\u01bf"+ - "\3\2\2\2&\u01c8\3\2\2\2(\u01d7\3\2\2\2*\u01de\3\2\2\2,\u01e5\3\2\2\2."+ - "\u01f6\3\2\2\2\60\u0206\3\2\2\2\62\u0217\3\2\2\2\64\u0228\3\2\2\2\66\u022b"+ - "\3\2\2\28\u0237\3\2\2\2:\u0240\3\2\2\2<\u024a\3\2\2\2>\u024c\3\2\2\2@"+ - "\u0256\3\2\2\2B\u0258\3\2\2\2D\u025d\3\2\2\2F\u0261\3\2\2\2H\u0267\3\2"+ - "\2\2J\u027c\3\2\2\2L\u0282\3\2\2\2N\u0284\3\2\2\2P\u0297\3\2\2\2R\u02a8"+ - "\3\2\2\2T\u02b8\3\2\2\2V\u02cc\3\2\2\2X\u02db\3\2\2\2Z\u02dd\3\2\2\2\\"+ - "\u02e5\3\2\2\2^\u02eb\3\2\2\2`\u02f9\3\2\2\2b\u0303\3\2\2\2d\u0307\3\2"+ - "\2\2f\u0317\3\2\2\2h\u0320\3\2\2\2j\u0330\3\2\2\2l\u0339\3\2\2\2n\u0341"+ - "\3\2\2\2p\u0344\3\2\2\2r\u034e\3\2\2\2t\u0360\3\2\2\2v\u036a\3\2\2\2x"+ - "\u037a\3\2\2\2z\u037f\3\2\2\2|\u038c\3\2\2\2~\u0394\3\2\2\2\u0080\u03a3"+ - "\3\2\2\2\u0082\u03aa\3\2\2\2\u0084\u03ba\3\2\2\2\u0086\u03cb\3\2\2\2\u0088"+ + "y\3z\3z\3z\3z\3{\3{\3{\3|\3|\3|\3|\5|\u0565\n|\3}\3}\3}\3}\3~\3~\3\177"+ + "\3\177\5\177\u056f\n\177\3\u0080\3\u0080\5\u0080\u0573\n\u0080\3\u0081"+ + "\3\u0081\3\u0081\5\u0081\u0578\n\u0081\3\u0082\3\u0082\3\u0082\3\u0082"+ + "\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\7\u0084\u0583\n\u0084\f\u0084"+ + "\16\u0084\u0586\13\u0084\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085"+ + "\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\5\u0085\u0593\n\u0085\3\u0086"+ + "\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\3\u0087\3\u0088\3\u0088"+ + "\3\u0088\3\u0088\5\u0088\u05a1\n\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+ + "\3\u0089\3\u0089\3\u008a\3\u008a\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b"+ + "\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u05b5\n\u008c\3\u008c"+ + "\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\5\u008d\u05be\n\u008d"+ + "\5\u008d\u05c0\n\u008d\3\u008d\3\u008d\3\u008e\3\u008e\5\u008e\u05c6\n"+ + "\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0091"+ + "\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\5\u0091\u05d5\n\u0091\5\u0091"+ + "\u05d7\n\u0091\5\u0091\u05d9\n\u0091\3\u0091\3\u0091\3\u0092\3\u0092\5"+ + "\u0092\u05df\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094\3"+ + "\u0094\3\u0095\3\u0095\3\u0096\3\u0096\3\u0097\3\u0097\3\u0098\3\u0098"+ + "\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\5\u0099\u05f6\n\u0099"+ + "\5\u0099\u05f8\n\u0099\3\u009a\3\u009a\3\u009a\3\u009a\7\u009a\u05fe\n"+ + "\u009a\f\u009a\16\u009a\u0601\13\u009a\5\u009a\u0603\n\u009a\3\u009a\3"+ + "\u009a\3\u009a\3\u009a\3\u009a\5\u009a\u060a\n\u009a\3\u009b\3\u009b\3"+ + "\u009b\5\u009b\u060f\n\u009b\3\u009c\3\u009c\5\u009c\u0613\n\u009c\3\u009d"+ + "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\7\u009e\u061f\n\u009e\f\u009e\16\u009e\u0622\13\u009e\5\u009e\u0624\n"+ + "\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f\5\u009f\u062c\n"+ + "\u009f\3\u00a0\3\u00a0\5\u00a0\u0630\n\u00a0\3\u00a0\3\u00a0\3\u00a0\3"+ + "\u00a1\3\u00a1\5\u00a1\u0637\n\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3"+ + "\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\2\2\u00a5\2\4\6\b\n\f\16\20\22"+ + "\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnp"+ + "rtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094"+ + "\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac"+ + "\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4"+ + "\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc"+ + "\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4"+ + "\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c"+ + "\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124"+ + "\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c"+ + "\u013e\u0140\u0142\u0144\u0146\2\r\4\2\21\21ii\3\2RS\3\2\24\35\4\2\5\5"+ + "#-\3\2/\60\4\2\f\f\61\63\3\2\u0083\u0084\3\2\u0086\u008c\3\2\u008d\u0091"+ + "\4\2\23\23\u00a8\u00a8\5\2=~\u00a1\u00a6\u00a9\u00a9\2\u0680\2\u0148\3"+ + "\2\2\2\4\u0150\3\2\2\2\6\u0156\3\2\2\2\b\u0159\3\2\2\2\n\u016a\3\2\2\2"+ + "\f\u0175\3\2\2\2\16\u017a\3\2\2\2\20\u017d\3\2\2\2\22\u0180\3\2\2\2\24"+ + "\u0191\3\2\2\2\26\u0193\3\2\2\2\30\u0196\3\2\2\2\32\u019c\3\2\2\2\34\u01a0"+ + "\3\2\2\2\36\u01a4\3\2\2\2 \u01a8\3\2\2\2\"\u01af\3\2\2\2$\u01bf\3\2\2"+ + "\2&\u01c8\3\2\2\2(\u01d7\3\2\2\2*\u01de\3\2\2\2,\u01e5\3\2\2\2.\u01f6"+ + "\3\2\2\2\60\u0206\3\2\2\2\62\u0217\3\2\2\2\64\u0228\3\2\2\2\66\u022b\3"+ + "\2\2\28\u0237\3\2\2\2:\u0240\3\2\2\2<\u024a\3\2\2\2>\u024c\3\2\2\2@\u0256"+ + "\3\2\2\2B\u0258\3\2\2\2D\u025d\3\2\2\2F\u0261\3\2\2\2H\u0267\3\2\2\2J"+ + "\u027c\3\2\2\2L\u0282\3\2\2\2N\u0284\3\2\2\2P\u0297\3\2\2\2R\u02a8\3\2"+ + "\2\2T\u02b8\3\2\2\2V\u02cc\3\2\2\2X\u02db\3\2\2\2Z\u02dd\3\2\2\2\\\u02e5"+ + "\3\2\2\2^\u02eb\3\2\2\2`\u02f9\3\2\2\2b\u0303\3\2\2\2d\u0307\3\2\2\2f"+ + "\u0317\3\2\2\2h\u0320\3\2\2\2j\u0330\3\2\2\2l\u0339\3\2\2\2n\u0341\3\2"+ + "\2\2p\u0344\3\2\2\2r\u034e\3\2\2\2t\u0360\3\2\2\2v\u036a\3\2\2\2x\u037a"+ + "\3\2\2\2z\u037f\3\2\2\2|\u038c\3\2\2\2~\u0394\3\2\2\2\u0080\u03a3\3\2"+ + "\2\2\u0082\u03aa\3\2\2\2\u0084\u03ba\3\2\2\2\u0086\u03cb\3\2\2\2\u0088"+ "\u03d4\3\2\2\2\u008a\u03dd\3\2\2\2\u008c\u03f0\3\2\2\2\u008e\u03f8\3\2"+ "\2\2\u0090\u0401\3\2\2\2\u0092\u0405\3\2\2\2\u0094\u040a\3\2\2\2\u0096"+ "\u0412\3\2\2\2\u0098\u0417\3\2\2\2\u009a\u041f\3\2\2\2\u009c\u0427\3\2"+ @@ -12386,19 +12363,19 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\u050b\3\2\2\2\u00de\u0511\3\2\2\2\u00e0\u0519\3\2\2\2\u00e2\u0527\3\2"+ "\2\2\u00e4\u052d\3\2\2\2\u00e6\u0534\3\2\2\2\u00e8\u053f\3\2\2\2\u00ea"+ "\u0541\3\2\2\2\u00ec\u054b\3\2\2\2\u00ee\u054f\3\2\2\2\u00f0\u0557\3\2"+ - "\2\2\u00f2\u0559\3\2\2\2\u00f4\u055e\3\2\2\2\u00f6\u0566\3\2\2\2\u00f8"+ - "\u0568\3\2\2\2\u00fa\u056c\3\2\2\2\u00fc\u0570\3\2\2\2\u00fe\u0574\3\2"+ - "\2\2\u0100\u0579\3\2\2\2\u0102\u057b\3\2\2\2\u0104\u057f\3\2\2\2\u0106"+ - "\u0586\3\2\2\2\u0108\u0594\3\2\2\2\u010a\u0596\3\2\2\2\u010c\u059a\3\2"+ - "\2\2\u010e\u059e\3\2\2\2\u0110\u05a6\3\2\2\2\u0112\u05aa\3\2\2\2\u0114"+ - "\u05ae\3\2\2\2\u0116\u05b2\3\2\2\2\u0118\u05ba\3\2\2\2\u011a\u05c7\3\2"+ - "\2\2\u011c\u05c9\3\2\2\2\u011e\u05ce\3\2\2\2\u0120\u05d0\3\2\2\2\u0122"+ - "\u05e0\3\2\2\2\u0124\u05e2\3\2\2\2\u0126\u05e7\3\2\2\2\u0128\u05e9\3\2"+ - "\2\2\u012a\u05eb\3\2\2\2\u012c\u05ed\3\2\2\2\u012e\u05ef\3\2\2\2\u0130"+ - "\u05f9\3\2\2\2\u0132\u060b\3\2\2\2\u0134\u0610\3\2\2\2\u0136\u0614\3\2"+ - "\2\2\u0138\u0616\3\2\2\2\u013a\u061b\3\2\2\2\u013c\u062b\3\2\2\2\u013e"+ - "\u0631\3\2\2\2\u0140\u0636\3\2\2\2\u0142\u063c\3\2\2\2\u0144\u063e\3\2"+ - "\2\2\u0146\u0640\3\2\2\2\u0148\u0149\5\4\3\2\u0149\u014a\7\2\2\3\u014a"+ + "\2\2\u00f2\u0559\3\2\2\2\u00f4\u055d\3\2\2\2\u00f6\u0564\3\2\2\2\u00f8"+ + "\u0566\3\2\2\2\u00fa\u056a\3\2\2\2\u00fc\u056e\3\2\2\2\u00fe\u0572\3\2"+ + "\2\2\u0100\u0577\3\2\2\2\u0102\u0579\3\2\2\2\u0104\u057d\3\2\2\2\u0106"+ + "\u0584\3\2\2\2\u0108\u0592\3\2\2\2\u010a\u0594\3\2\2\2\u010c\u0598\3\2"+ + "\2\2\u010e\u059c\3\2\2\2\u0110\u05a4\3\2\2\2\u0112\u05a8\3\2\2\2\u0114"+ + "\u05ac\3\2\2\2\u0116\u05b0\3\2\2\2\u0118\u05b8\3\2\2\2\u011a\u05c5\3\2"+ + "\2\2\u011c\u05c7\3\2\2\2\u011e\u05cc\3\2\2\2\u0120\u05ce\3\2\2\2\u0122"+ + "\u05de\3\2\2\2\u0124\u05e0\3\2\2\2\u0126\u05e5\3\2\2\2\u0128\u05e7\3\2"+ + "\2\2\u012a\u05e9\3\2\2\2\u012c\u05eb\3\2\2\2\u012e\u05ed\3\2\2\2\u0130"+ + "\u05f7\3\2\2\2\u0132\u0609\3\2\2\2\u0134\u060e\3\2\2\2\u0136\u0612\3\2"+ + "\2\2\u0138\u0614\3\2\2\2\u013a\u0619\3\2\2\2\u013c\u0629\3\2\2\2\u013e"+ + "\u062f\3\2\2\2\u0140\u0634\3\2\2\2\u0142\u063a\3\2\2\2\u0144\u063c\3\2"+ + "\2\2\u0146\u063e\3\2\2\2\u0148\u0149\5\4\3\2\u0149\u014a\7\2\2\3\u014a"+ "\3\3\2\2\2\u014b\u014c\7h\2\2\u014c\u014d\7g\2\2\u014d\u014e\5\u0144\u00a3"+ "\2\u014e\u014f\7\3\2\2\u014f\u0151\3\2\2\2\u0150\u014b\3\2\2\2\u0150\u0151"+ "\3\2\2\2\u0151\u0154\3\2\2\2\u0152\u0155\5\b\5\2\u0153\u0155\5\6\4\2\u0154"+ @@ -12749,102 +12726,101 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\u00f2z\2\u0554\u0555\5\u00fc\177\2\u0555\u0558\3\2\2\2\u0556\u0558\5"+ "\u00f4{\2\u0557\u0553\3\2\2\2\u0557\u0556\3\2\2\2\u0558\u00f1\3\2\2\2"+ "\u0559\u055a\t\t\2\2\u055a\u055b\7\23\2\2\u055b\u055c\7\23\2\2\u055c\u00f3"+ - "\3\2\2\2\u055d\u055f\7\u0085\2\2\u055e\u055d\3\2\2\2\u055e\u055f\3\2\2"+ - "\2\u055f\u0560\3\2\2\2\u0560\u0561\5\u00fc\177\2\u0561\u00f5\3\2\2\2\u0562"+ - "\u0563\5\u00f8}\2\u0563\u0564\5\u00fc\177\2\u0564\u0567\3\2\2\2\u0565"+ - "\u0567\5\u00fa~\2\u0566\u0562\3\2\2\2\u0566\u0565\3\2\2\2\u0567\u00f7"+ - "\3\2\2\2\u0568\u0569\t\n\2\2\u0569\u056a\7\23\2\2\u056a\u056b\7\23\2\2"+ - "\u056b\u00f9\3\2\2\2\u056c\u056d\7:\2\2\u056d\u00fb\3\2\2\2\u056e\u0571"+ - "\5\u00fe\u0080\2\u056f\u0571\5\u0108\u0085\2\u0570\u056e\3\2\2\2\u0570"+ - "\u056f\3\2\2\2\u0571\u00fd\3\2\2\2\u0572\u0575\5J&\2\u0573\u0575\5\u0100"+ - "\u0081\2\u0574\u0572\3\2\2\2\u0574\u0573\3\2\2\2\u0575\u00ff\3\2\2\2\u0576"+ - "\u057a\7\f\2\2\u0577\u057a\5\u0102\u0082\2\u0578\u057a\5\u0104\u0083\2"+ - "\u0579\u0576\3\2\2\2\u0579\u0577\3\2\2\2\u0579\u0578\3\2\2\2\u057a\u0101"+ - "\3\2\2\2\u057b\u057c\7\u00b0\2\2\u057c\u057d\7\23\2\2\u057d\u057e\7\f"+ - "\2\2\u057e\u0103\3\2\2\2\u057f\u0580\7\f\2\2\u0580\u0581\7\23\2\2\u0581"+ - "\u0582\7\u00b0\2\2\u0582\u0105\3\2\2\2\u0583\u0585\5\u00ba^\2\u0584\u0583"+ - "\3\2\2\2\u0585\u0588\3\2\2\2\u0586\u0584\3\2\2\2\u0586\u0587\3\2\2\2\u0587"+ - "\u0107\3\2\2\2\u0588\u0586\3\2\2\2\u0589\u0595\5\u010e\u0088\2\u058a\u0595"+ - "\5\u0120\u0091\2\u058b\u0595\5\u0118\u008d\2\u058c\u0595\5\u0124\u0093"+ - "\2\u058d\u0595\5\u011c\u008f\2\u058e\u0595\5\u0116\u008c\2\u058f\u0595"+ - "\5\u0112\u008a\2\u0590\u0595\5\u0110\u0089\2\u0591\u0595\5\u0114\u008b"+ - "\2\u0592\u0595\5\u010c\u0087\2\u0593\u0595\5\u010a\u0086\2\u0594\u0589"+ - "\3\2\2\2\u0594\u058a\3\2\2\2\u0594\u058b\3\2\2\2\u0594\u058c\3\2\2\2\u0594"+ - "\u058d\3\2\2\2\u0594\u058e\3\2\2\2\u0594\u058f\3\2\2\2\u0594\u0590\3\2"+ - "\2\2\u0594\u0591\3\2\2\2\u0594\u0592\3\2\2\2\u0594\u0593\3\2\2\2\u0595"+ - "\u0109\3\2\2\2\u0596\u0597\7\u0092\2\2\u0597\u0598\7\n\2\2\u0598\u0599"+ - "\7\13\2\2\u0599\u010b\3\2\2\2\u059a\u059b\7\u0093\2\2\u059b\u059c\7\n"+ - "\2\2\u059c\u059d\7\13\2\2\u059d\u010d\3\2\2\2\u059e\u059f\7\u0095\2\2"+ - "\u059f\u05a2\7\n\2\2\u05a0\u05a3\5\u0120\u0091\2\u05a1\u05a3\5\u0124\u0093"+ - "\2\u05a2\u05a0\3\2\2\2\u05a2\u05a1\3\2\2\2\u05a2\u05a3\3\2\2\2\u05a3\u05a4"+ - "\3\2\2\2\u05a4\u05a5\7\13\2\2\u05a5\u010f\3\2\2\2\u05a6\u05a7\7\u0096"+ - "\2\2\u05a7\u05a8\7\n\2\2\u05a8\u05a9\7\13\2\2\u05a9\u0111\3\2\2\2\u05aa"+ - "\u05ab\7\u00a0\2\2\u05ab\u05ac\7\n\2\2\u05ac\u05ad\7\13\2\2\u05ad\u0113"+ - "\3\2\2\2\u05ae\u05af\7\u0098\2\2\u05af\u05b0\7\n\2\2\u05b0\u05b1\7\13"+ - "\2\2\u05b1\u0115\3\2\2\2\u05b2\u05b3\7\u0097\2\2\u05b3\u05b6\7\n\2\2\u05b4"+ - "\u05b7\7\u00b0\2\2\u05b5\u05b7\5\u0144\u00a3\2\u05b6\u05b4\3\2\2\2\u05b6"+ - "\u05b5\3\2\2\2\u05b6\u05b7\3\2\2\2\u05b7\u05b8\3\2\2\2\u05b8\u05b9\7\13"+ - "\2\2\u05b9\u0117\3\2\2\2\u05ba\u05bb\7\u0088\2\2\u05bb\u05c1\7\n\2\2\u05bc"+ - "\u05bf\5\u011a\u008e\2\u05bd\u05be\7\17\2\2\u05be\u05c0\5\u012e\u0098"+ - "\2\u05bf\u05bd\3\2\2\2\u05bf\u05c0\3\2\2\2\u05c0\u05c2\3\2\2\2\u05c1\u05bc"+ - "\3\2\2\2\u05c1\u05c2\3\2\2\2\u05c2\u05c3\3\2\2\2\u05c3\u05c4\7\13\2\2"+ - "\u05c4\u0119\3\2\2\2\u05c5\u05c8\5\u0128\u0095\2\u05c6\u05c8\7\f\2\2\u05c7"+ - "\u05c5\3\2\2\2\u05c7\u05c6\3\2\2\2\u05c8\u011b\3\2\2\2\u05c9\u05ca\7\u0099"+ - "\2\2\u05ca\u05cb\7\n\2\2\u05cb\u05cc\5\u011e\u0090\2\u05cc\u05cd\7\13"+ - "\2\2\u05cd\u011d\3\2\2\2\u05ce\u05cf\5\u0128\u0095\2\u05cf\u011f\3\2\2"+ - "\2\u05d0\u05d1\7\u0082\2\2\u05d1\u05da\7\n\2\2\u05d2\u05d8\5\u0122\u0092"+ - "\2\u05d3\u05d4\7\17\2\2\u05d4\u05d6\5\u012e\u0098\2\u05d5\u05d7\7\u00a8"+ - "\2\2\u05d6\u05d5\3\2\2\2\u05d6\u05d7\3\2\2\2\u05d7\u05d9\3\2\2\2\u05d8"+ - "\u05d3\3\2\2\2\u05d8\u05d9\3\2\2\2\u05d9\u05db\3\2\2\2\u05da\u05d2\3\2"+ - "\2\2\u05da\u05db\3\2\2\2\u05db\u05dc\3\2\2\2\u05dc\u05dd\7\13\2\2\u05dd"+ - "\u0121\3\2\2\2\u05de\u05e1\5\u012a\u0096\2\u05df\u05e1\7\f\2\2\u05e0\u05de"+ - "\3\2\2\2\u05e0\u05df\3\2\2\2\u05e1\u0123\3\2\2\2\u05e2\u05e3\7\u009a\2"+ - "\2\u05e3\u05e4\7\n\2\2\u05e4\u05e5\5\u0126\u0094\2\u05e5\u05e6\7\13\2"+ - "\2\u05e6\u0125\3\2\2\2\u05e7\u05e8\5\u012a\u0096\2\u05e8\u0127\3\2\2\2"+ - "\u05e9\u05ea\5J&\2\u05ea\u0129\3\2\2\2\u05eb\u05ec\5J&\2\u05ec\u012b\3"+ - "\2\2\2\u05ed\u05ee\5\u012e\u0098\2\u05ee\u012d\3\2\2\2\u05ef\u05f0\5J"+ - "&\2\u05f0\u012f\3\2\2\2\u05f1\u05f2\7\n\2\2\u05f2\u05fa\7\13\2\2\u05f3"+ - "\u05f7\5\u0134\u009b\2\u05f4\u05f8\7\u00a8\2\2\u05f5\u05f8\7\f\2\2\u05f6"+ - "\u05f8\7/\2\2\u05f7\u05f4\3\2\2\2\u05f7\u05f5\3\2\2\2\u05f7\u05f6\3\2"+ - "\2\2\u05f7\u05f8\3\2\2\2\u05f8\u05fa\3\2\2\2\u05f9\u05f1\3\2\2\2\u05f9"+ - "\u05f3\3\2\2\2\u05fa\u0131\3\2\2\2\u05fb\u0604\7\b\2\2\u05fc\u0601\5\u013e"+ - "\u00a0\2\u05fd\u05fe\7\17\2\2\u05fe\u0600\5\u013e\u00a0\2\u05ff\u05fd"+ - "\3\2\2\2\u0600\u0603\3\2\2\2\u0601\u05ff\3\2\2\2\u0601\u0602\3\2\2\2\u0602"+ - "\u0605\3\2\2\2\u0603\u0601\3\2\2\2\u0604\u05fc\3\2\2\2\u0604\u0605\3\2"+ - "\2\2\u0605\u0606\3\2\2\2\u0606\u060c\7\t\2\2\u0607\u0608\7;\2\2\u0608"+ - "\u0609\5^\60\2\u0609\u060a\7<\2\2\u060a\u060c\3\2\2\2\u060b\u05fb\3\2"+ - "\2\2\u060b\u0607\3\2\2\2\u060c\u0133\3\2\2\2\u060d\u0611\5J&\2\u060e\u0611"+ - "\7\u00a9\2\2\u060f\u0611\5\u0136\u009c\2\u0610\u060d\3\2\2\2\u0610\u060e"+ - "\3\2\2\2\u0610\u060f\3\2\2\2\u0611\u0135\3\2\2\2\u0612\u0615\5\u0138\u009d"+ - "\2\u0613\u0615\5\u013a\u009e\2\u0614\u0612\3\2\2\2\u0614\u0613\3\2\2\2"+ - "\u0615\u0137\3\2\2\2\u0616\u0617\7\37\2\2\u0617\u0618\7\n\2\2\u0618\u0619"+ - "\7\f\2\2\u0619\u061a\7\13\2\2\u061a\u0139\3\2\2\2\u061b\u061c\7\37\2\2"+ - "\u061c\u0625\7\n\2\2\u061d\u0622\5\u0130\u0099\2\u061e\u061f\7\17\2\2"+ - "\u061f\u0621\5\u0130\u0099\2\u0620\u061e\3\2\2\2\u0621\u0624\3\2\2\2\u0622"+ - "\u0620\3\2\2\2\u0622\u0623\3\2\2\2\u0623\u0626\3\2\2\2\u0624\u0622\3\2"+ - "\2\2\u0625\u061d\3\2\2\2\u0625\u0626\3\2\2\2\u0626\u0627\3\2\2\2\u0627"+ - "\u0628\7\13\2\2\u0628\u0629\7F\2\2\u0629\u062a\5\u0130\u0099\2\u062a\u013b"+ - "\3\2\2\2\u062b\u062d\5\u0134\u009b\2\u062c\u062e\7\u00a8\2\2\u062d\u062c"+ - "\3\2\2\2\u062d\u062e\3\2\2\2\u062e\u013d\3\2\2\2\u062f\u0632\5`\61\2\u0630"+ - "\u0632\7\u00b0\2\2\u0631\u062f\3\2\2\2\u0631\u0630\3\2\2\2\u0632\u0633"+ - "\3\2\2\2\u0633\u0634\t\13\2\2\u0634\u0635\5`\61\2\u0635\u013f\3\2\2\2"+ - "\u0636\u0638\7\65\2\2\u0637\u0639\5^\60\2\u0638\u0637\3\2\2\2\u0638\u0639"+ - "\3\2\2\2\u0639\u063a\3\2\2\2\u063a\u063b\7\66\2\2\u063b\u0141\3\2\2\2"+ - "\u063c\u063d\5\u0144\u00a3\2\u063d\u0143\3\2\2\2\u063e\u063f\7\u00a7\2"+ - "\2\u063f\u0145\3\2\2\2\u0640\u0641\t\f\2\2\u0641\u0147\3\2\2\2\u009c\u0150"+ - "\u0154\u0164\u016a\u0172\u017a\u0182\u0191\u01af\u01b7\u01b9\u01cf\u01d9"+ - "\u01e3\u01e8\u01ed\u01f1\u01fd\u0201\u020a\u0211\u021f\u0223\u0228\u0232"+ - "\u023a\u023e\u024a\u0256\u026c\u0274\u0279\u027c\u0280\u0289\u0292\u0295"+ - "\u029d\u02a4\u02a6\u02ad\u02b4\u02b6\u02be\u02c3\u02ca\u02d1\u02db\u02e2"+ - "\u02e9\u02f0\u02f9\u0303\u0307\u030f\u0311\u031d\u0323\u0327\u032b\u0336"+ - "\u033c\u034b\u0351\u0355\u0359\u0360\u0367\u036d\u0372\u0374\u0378\u037f"+ - "\u0386\u038f\u039b\u03a5\u03b1\u03b5\u03be\u03c5\u03db\u03e0\u03e5\u03e9"+ - "\u03f5\u03fd\u0401\u0408\u040f\u0415\u041c\u0424\u042b\u0431\u0437\u043d"+ - "\u0443\u044e\u0454\u0459\u0461\u0476\u047f\u0481\u0498\u04a9\u04b4\u04ca"+ - "\u04ce\u04d5\u04d9\u04e3\u04e8\u04f6\u04ff\u0505\u051f\u0530\u0532\u053a"+ - "\u053f\u0546\u054b\u054f\u0557\u055e\u0566\u0570\u0574\u0579\u0586\u0594"+ - "\u05a2\u05b6\u05bf\u05c1\u05c7\u05d6\u05d8\u05da\u05e0\u05f7\u05f9\u0601"+ - "\u0604\u060b\u0610\u0614\u0622\u0625\u062d\u0631\u0638"; + "\3\2\2\2\u055d\u055e\7\u0085\2\2\u055e\u055f\5\u00fc\177\2\u055f\u00f5"+ + "\3\2\2\2\u0560\u0561\5\u00f8}\2\u0561\u0562\5\u00fc\177\2\u0562\u0565"+ + "\3\2\2\2\u0563\u0565\5\u00fa~\2\u0564\u0560\3\2\2\2\u0564\u0563\3\2\2"+ + "\2\u0565\u00f7\3\2\2\2\u0566\u0567\t\n\2\2\u0567\u0568\7\23\2\2\u0568"+ + "\u0569\7\23\2\2\u0569\u00f9\3\2\2\2\u056a\u056b\7:\2\2\u056b\u00fb\3\2"+ + "\2\2\u056c\u056f\5\u00fe\u0080\2\u056d\u056f\5\u0108\u0085\2\u056e\u056c"+ + "\3\2\2\2\u056e\u056d\3\2\2\2\u056f\u00fd\3\2\2\2\u0570\u0573\5J&\2\u0571"+ + "\u0573\5\u0100\u0081\2\u0572\u0570\3\2\2\2\u0572\u0571\3\2\2\2\u0573\u00ff"+ + "\3\2\2\2\u0574\u0578\7\f\2\2\u0575\u0578\5\u0102\u0082\2\u0576\u0578\5"+ + "\u0104\u0083\2\u0577\u0574\3\2\2\2\u0577\u0575\3\2\2\2\u0577\u0576\3\2"+ + "\2\2\u0578\u0101\3\2\2\2\u0579\u057a\7\u00b0\2\2\u057a\u057b\7\23\2\2"+ + "\u057b\u057c\7\f\2\2\u057c\u0103\3\2\2\2\u057d\u057e\7\f\2\2\u057e\u057f"+ + "\7\23\2\2\u057f\u0580\7\u00b0\2\2\u0580\u0105\3\2\2\2\u0581\u0583\5\u00ba"+ + "^\2\u0582\u0581\3\2\2\2\u0583\u0586\3\2\2\2\u0584\u0582\3\2\2\2\u0584"+ + "\u0585\3\2\2\2\u0585\u0107\3\2\2\2\u0586\u0584\3\2\2\2\u0587\u0593\5\u010e"+ + "\u0088\2\u0588\u0593\5\u0120\u0091\2\u0589\u0593\5\u0118\u008d\2\u058a"+ + "\u0593\5\u0124\u0093\2\u058b\u0593\5\u011c\u008f\2\u058c\u0593\5\u0116"+ + "\u008c\2\u058d\u0593\5\u0112\u008a\2\u058e\u0593\5\u0110\u0089\2\u058f"+ + "\u0593\5\u0114\u008b\2\u0590\u0593\5\u010c\u0087\2\u0591\u0593\5\u010a"+ + "\u0086\2\u0592\u0587\3\2\2\2\u0592\u0588\3\2\2\2\u0592\u0589\3\2\2\2\u0592"+ + "\u058a\3\2\2\2\u0592\u058b\3\2\2\2\u0592\u058c\3\2\2\2\u0592\u058d\3\2"+ + "\2\2\u0592\u058e\3\2\2\2\u0592\u058f\3\2\2\2\u0592\u0590\3\2\2\2\u0592"+ + "\u0591\3\2\2\2\u0593\u0109\3\2\2\2\u0594\u0595\7\u0092\2\2\u0595\u0596"+ + "\7\n\2\2\u0596\u0597\7\13\2\2\u0597\u010b\3\2\2\2\u0598\u0599\7\u0093"+ + "\2\2\u0599\u059a\7\n\2\2\u059a\u059b\7\13\2\2\u059b\u010d\3\2\2\2\u059c"+ + "\u059d\7\u0095\2\2\u059d\u05a0\7\n\2\2\u059e\u05a1\5\u0120\u0091\2\u059f"+ + "\u05a1\5\u0124\u0093\2\u05a0\u059e\3\2\2\2\u05a0\u059f\3\2\2\2\u05a0\u05a1"+ + "\3\2\2\2\u05a1\u05a2\3\2\2\2\u05a2\u05a3\7\13\2\2\u05a3\u010f\3\2\2\2"+ + "\u05a4\u05a5\7\u0096\2\2\u05a5\u05a6\7\n\2\2\u05a6\u05a7\7\13\2\2\u05a7"+ + "\u0111\3\2\2\2\u05a8\u05a9\7\u00a0\2\2\u05a9\u05aa\7\n\2\2\u05aa\u05ab"+ + "\7\13\2\2\u05ab\u0113\3\2\2\2\u05ac\u05ad\7\u0098\2\2\u05ad\u05ae\7\n"+ + "\2\2\u05ae\u05af\7\13\2\2\u05af\u0115\3\2\2\2\u05b0\u05b1\7\u0097\2\2"+ + "\u05b1\u05b4\7\n\2\2\u05b2\u05b5\7\u00b0\2\2\u05b3\u05b5\5\u0144\u00a3"+ + "\2\u05b4\u05b2\3\2\2\2\u05b4\u05b3\3\2\2\2\u05b4\u05b5\3\2\2\2\u05b5\u05b6"+ + "\3\2\2\2\u05b6\u05b7\7\13\2\2\u05b7\u0117\3\2\2\2\u05b8\u05b9\7\u0088"+ + "\2\2\u05b9\u05bf\7\n\2\2\u05ba\u05bd\5\u011a\u008e\2\u05bb\u05bc\7\17"+ + "\2\2\u05bc\u05be\5\u012e\u0098\2\u05bd\u05bb\3\2\2\2\u05bd\u05be\3\2\2"+ + "\2\u05be\u05c0\3\2\2\2\u05bf\u05ba\3\2\2\2\u05bf\u05c0\3\2\2\2\u05c0\u05c1"+ + "\3\2\2\2\u05c1\u05c2\7\13\2\2\u05c2\u0119\3\2\2\2\u05c3\u05c6\5\u0128"+ + "\u0095\2\u05c4\u05c6\7\f\2\2\u05c5\u05c3\3\2\2\2\u05c5\u05c4\3\2\2\2\u05c6"+ + "\u011b\3\2\2\2\u05c7\u05c8\7\u0099\2\2\u05c8\u05c9\7\n\2\2\u05c9\u05ca"+ + "\5\u011e\u0090\2\u05ca\u05cb\7\13\2\2\u05cb\u011d\3\2\2\2\u05cc\u05cd"+ + "\5\u0128\u0095\2\u05cd\u011f\3\2\2\2\u05ce\u05cf\7\u0082\2\2\u05cf\u05d8"+ + "\7\n\2\2\u05d0\u05d6\5\u0122\u0092\2\u05d1\u05d2\7\17\2\2\u05d2\u05d4"+ + "\5\u012e\u0098\2\u05d3\u05d5\7\u00a8\2\2\u05d4\u05d3\3\2\2\2\u05d4\u05d5"+ + "\3\2\2\2\u05d5\u05d7\3\2\2\2\u05d6\u05d1\3\2\2\2\u05d6\u05d7\3\2\2\2\u05d7"+ + "\u05d9\3\2\2\2\u05d8\u05d0\3\2\2\2\u05d8\u05d9\3\2\2\2\u05d9\u05da\3\2"+ + "\2\2\u05da\u05db\7\13\2\2\u05db\u0121\3\2\2\2\u05dc\u05df\5\u012a\u0096"+ + "\2\u05dd\u05df\7\f\2\2\u05de\u05dc\3\2\2\2\u05de\u05dd\3\2\2\2\u05df\u0123"+ + "\3\2\2\2\u05e0\u05e1\7\u009a\2\2\u05e1\u05e2\7\n\2\2\u05e2\u05e3\5\u0126"+ + "\u0094\2\u05e3\u05e4\7\13\2\2\u05e4\u0125\3\2\2\2\u05e5\u05e6\5\u012a"+ + "\u0096\2\u05e6\u0127\3\2\2\2\u05e7\u05e8\5J&\2\u05e8\u0129\3\2\2\2\u05e9"+ + "\u05ea\5J&\2\u05ea\u012b\3\2\2\2\u05eb\u05ec\5\u012e\u0098\2\u05ec\u012d"+ + "\3\2\2\2\u05ed\u05ee\5J&\2\u05ee\u012f\3\2\2\2\u05ef\u05f0\7\n\2\2\u05f0"+ + "\u05f8\7\13\2\2\u05f1\u05f5\5\u0134\u009b\2\u05f2\u05f6\7\u00a8\2\2\u05f3"+ + "\u05f6\7\f\2\2\u05f4\u05f6\7/\2\2\u05f5\u05f2\3\2\2\2\u05f5\u05f3\3\2"+ + "\2\2\u05f5\u05f4\3\2\2\2\u05f5\u05f6\3\2\2\2\u05f6\u05f8\3\2\2\2\u05f7"+ + "\u05ef\3\2\2\2\u05f7\u05f1\3\2\2\2\u05f8\u0131\3\2\2\2\u05f9\u0602\7\b"+ + "\2\2\u05fa\u05ff\5\u013e\u00a0\2\u05fb\u05fc\7\17\2\2\u05fc\u05fe\5\u013e"+ + "\u00a0\2\u05fd\u05fb\3\2\2\2\u05fe\u0601\3\2\2\2\u05ff\u05fd\3\2\2\2\u05ff"+ + "\u0600\3\2\2\2\u0600\u0603\3\2\2\2\u0601\u05ff\3\2\2\2\u0602\u05fa\3\2"+ + "\2\2\u0602\u0603\3\2\2\2\u0603\u0604\3\2\2\2\u0604\u060a\7\t\2\2\u0605"+ + "\u0606\7;\2\2\u0606\u0607\5^\60\2\u0607\u0608\7<\2\2\u0608\u060a\3\2\2"+ + "\2\u0609\u05f9\3\2\2\2\u0609\u0605\3\2\2\2\u060a\u0133\3\2\2\2\u060b\u060f"+ + "\5J&\2\u060c\u060f\7\u00a9\2\2\u060d\u060f\5\u0136\u009c\2\u060e\u060b"+ + "\3\2\2\2\u060e\u060c\3\2\2\2\u060e\u060d\3\2\2\2\u060f\u0135\3\2\2\2\u0610"+ + "\u0613\5\u0138\u009d\2\u0611\u0613\5\u013a\u009e\2\u0612\u0610\3\2\2\2"+ + "\u0612\u0611\3\2\2\2\u0613\u0137\3\2\2\2\u0614\u0615\7\37\2\2\u0615\u0616"+ + "\7\n\2\2\u0616\u0617\7\f\2\2\u0617\u0618\7\13\2\2\u0618\u0139\3\2\2\2"+ + "\u0619\u061a\7\37\2\2\u061a\u0623\7\n\2\2\u061b\u0620\5\u0130\u0099\2"+ + "\u061c\u061d\7\17\2\2\u061d\u061f\5\u0130\u0099\2\u061e\u061c\3\2\2\2"+ + "\u061f\u0622\3\2\2\2\u0620\u061e\3\2\2\2\u0620\u0621\3\2\2\2\u0621\u0624"+ + "\3\2\2\2\u0622\u0620\3\2\2\2\u0623\u061b\3\2\2\2\u0623\u0624\3\2\2\2\u0624"+ + "\u0625\3\2\2\2\u0625\u0626\7\13\2\2\u0626\u0627\7F\2\2\u0627\u0628\5\u0130"+ + "\u0099\2\u0628\u013b\3\2\2\2\u0629\u062b\5\u0134\u009b\2\u062a\u062c\7"+ + "\u00a8\2\2\u062b\u062a\3\2\2\2\u062b\u062c\3\2\2\2\u062c\u013d\3\2\2\2"+ + "\u062d\u0630\5`\61\2\u062e\u0630\7\u00b0\2\2\u062f\u062d\3\2\2\2\u062f"+ + "\u062e\3\2\2\2\u0630\u0631\3\2\2\2\u0631\u0632\t\13\2\2\u0632\u0633\5"+ + "`\61\2\u0633\u013f\3\2\2\2\u0634\u0636\7\65\2\2\u0635\u0637\5^\60\2\u0636"+ + "\u0635\3\2\2\2\u0636\u0637\3\2\2\2\u0637\u0638\3\2\2\2\u0638\u0639\7\66"+ + "\2\2\u0639\u0141\3\2\2\2\u063a\u063b\5\u0144\u00a3\2\u063b\u0143\3\2\2"+ + "\2\u063c\u063d\7\u00a7\2\2\u063d\u0145\3\2\2\2\u063e\u063f\t\f\2\2\u063f"+ + "\u0147\3\2\2\2\u009b\u0150\u0154\u0164\u016a\u0172\u017a\u0182\u0191\u01af"+ + "\u01b7\u01b9\u01cf\u01d9\u01e3\u01e8\u01ed\u01f1\u01fd\u0201\u020a\u0211"+ + "\u021f\u0223\u0228\u0232\u023a\u023e\u024a\u0256\u026c\u0274\u0279\u027c"+ + "\u0280\u0289\u0292\u0295\u029d\u02a4\u02a6\u02ad\u02b4\u02b6\u02be\u02c3"+ + "\u02ca\u02d1\u02db\u02e2\u02e9\u02f0\u02f9\u0303\u0307\u030f\u0311\u031d"+ + "\u0323\u0327\u032b\u0336\u033c\u034b\u0351\u0355\u0359\u0360\u0367\u036d"+ + "\u0372\u0374\u0378\u037f\u0386\u038f\u039b\u03a5\u03b1\u03b5\u03be\u03c5"+ + "\u03db\u03e0\u03e5\u03e9\u03f5\u03fd\u0401\u0408\u040f\u0415\u041c\u0424"+ + "\u042b\u0431\u0437\u043d\u0443\u044e\u0454\u0459\u0461\u0476\u047f\u0481"+ + "\u0498\u04a9\u04b4\u04ca\u04ce\u04d5\u04d9\u04e3\u04e8\u04f6\u04ff\u0505"+ + "\u051f\u0530\u0532\u053a\u053f\u0546\u054b\u054f\u0557\u0564\u056e\u0572"+ + "\u0577\u0584\u0592\u05a0\u05b4\u05bd\u05bf\u05c5\u05d4\u05d6\u05d8\u05de"+ + "\u05f5\u05f7\u05ff\u0602\u0609\u060e\u0612\u0620\u0623\u062b\u062f\u0636"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/org/rumbledb/runtime/functions/xml/GetRootFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/xml/GetRootFunctionIterator.java new file mode 100644 index 000000000..637a55087 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/xml/GetRootFunctionIterator.java @@ -0,0 +1,63 @@ +package org.rumbledb.runtime.functions.xml; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.IteratorFlowException; +import org.rumbledb.exceptions.UnsupportedFeatureException; +import org.rumbledb.items.xml.AttributeItem; +import org.rumbledb.items.xml.DocumentItem; +import org.rumbledb.items.xml.ElementItem; +import org.rumbledb.items.xml.TextItem; +import org.rumbledb.runtime.RuntimeIterator; +import org.rumbledb.runtime.functions.base.LocalFunctionCallIterator; + +import java.util.List; + +public class GetRootFunctionIterator extends LocalFunctionCallIterator { + public GetRootFunctionIterator(List parameters, RuntimeStaticContext staticContext) { + super(parameters, staticContext); + } + + @Override + public void open(DynamicContext context) { + super.open(context); + this.hasNext = true; + } + + @Override + public Item next() { + if (this.hasNext) { + this.hasNext = false; + Item node = getContextNode(); + // TODO: type check that node is XML node type. + if ( + node instanceof DocumentItem + || node instanceof ElementItem + || node instanceof AttributeItem + || node instanceof TextItem + ) { + if (node.parent() == null) { + // Node is already the root. + return node; + } + return node.parent(); + } + throw new UnsupportedFeatureException( + "The argument must be a reference to a supported XML node type", + getMetadata() + ); + } + throw new IteratorFlowException(RuntimeIterator.FLOW_EXCEPTION_MESSAGE + " root function", getMetadata()); + } + + private Item getContextNode() { + if (this.children.isEmpty()) { + return this.currentDynamicContextForLocalExecution.getVariableValues() + .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()) + .get(0); + } + return this.children.get(0).materializeFirstItemOrNull(this.currentDynamicContextForLocalExecution); + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java b/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java index 66fc8e77e..9148f50b9 100644 --- a/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java @@ -24,7 +24,9 @@ public PathExprIterator( ) { super(null, staticContext); this.children.addAll(stepIterators); - this.children.add(getRootIterator); + if (getRootIterator != null) { + this.children.add(getRootIterator); + } this.stepIterators = stepIterators; this.getRootIterator = getRootIterator; } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java index 208adc8e5..6f04695e5 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java @@ -24,8 +24,8 @@ protected void setNextResult() { } Item node = currentContext.get(0); this.results = new ArrayList<>(); - this.results.add(node); this.results.addAll(getDescendants(node)); + this.results.add(node); } storeNextResult(); } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java index 34cb5d79a..71a4d198f 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java @@ -23,6 +23,7 @@ protected void setNextResult() { if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } + // TODO: add duplicate elimination Item node = currentContext.get(0); this.results = getFollowingNodes(node.parent(), node); } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java index c970a29c0..bc726e6a7 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java @@ -24,8 +24,8 @@ protected void setNextResult() { } Item node = currentContext.get(0); this.results = new ArrayList<>(); - this.results.add(node); this.results.addAll(getAncestors(node)); + this.results.add(node); } storeNextResult(); } diff --git a/src/main/java/org/rumbledb/serialization/Serializer.java b/src/main/java/org/rumbledb/serialization/Serializer.java index 55af51b68..b504e1bea 100644 --- a/src/main/java/org/rumbledb/serialization/Serializer.java +++ b/src/main/java/org/rumbledb/serialization/Serializer.java @@ -1,15 +1,14 @@ package org.rumbledb.serialization; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; import org.apache.commons.text.StringEscapeUtils; import org.rumbledb.api.Item; import org.rumbledb.exceptions.FunctionsNonSerializableException; import org.rumbledb.exceptions.OurBadException; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; +import java.io.ByteArrayOutputStream; +import java.io.IOException; public class Serializer { public enum Method { @@ -164,6 +163,55 @@ public void serialize(Item item, StringBuffer sb, String indent, boolean isTopLe } sb.append("}"); } + if (item.isDocumentNode()) { + for (Item child : item.children()) { + sb.append("<"); + sb.append(child.nodeName()); + sb.append(">"); + sb.append("\n"); + + for (Item descendant : child.children()) { + serialize(descendant, sb, indent + " ", isTopLevel); + } + sb.append(""); + } + } + if (item.isElementNode()) { + sb.append(indent); + sb.append("<"); + sb.append(item.nodeName()); + for (Item attribute : item.attributes()) { + serialize(attribute, sb, indent, isTopLevel); + } + sb.append(">"); + sb.append("\n"); + + for (Item child : item.children()) { + serialize(child, sb, indent + " ", isTopLevel); + } + sb.append(indent); + sb.append(""); + sb.append("\n"); + } + + if (item.isAttributeNode()) { + sb.append(" "); + sb.append(item.nodeName()); + sb.append("="); + sb.append("\""); + sb.append(item.stringValue()); + sb.append("\""); + } + + if (item.isTextNode()) { + sb.append(indent); + sb.append(item.stringValue()); + sb.append("\n"); + } } public void generateYAML(Item item, YAMLGenerator yamlGenerator) throws IOException { diff --git a/src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot1.jq b/src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot1.jq new file mode 100644 index 000000000..a9f374998 --- /dev/null +++ b/src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot1.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="(\n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n\n, \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n\n, \n Everyday Italian\n\n, Everyday Italian\n, \n Giada De Laurentiis\n\n, Giada De Laurentiis\n, \n 2005\n\n, 2005\n, \n 30.00\n\n, 30.00\n, \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n\n, \n Harry Potter\n\n, Harry Potter\n, \n J K. Rowling\n\n, J K. Rowling\n, \n 2005\n\n, 2005\n, \n 29.99\n\n, 29.99\n, \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n\n, \n XQuery Kick Start\n\n, XQuery Kick Start\n, \n James McGovern\n\n, James McGovern\n, \n Per Bothner\n\n, Per Bothner\n, \n Kurt Cagle\n\n, Kurt Cagle\n, \n James Linn\n\n, James Linn\n, \n Vaidyanathan Nagarajan\n\n, Vaidyanathan Nagarajan\n, \n 2003\n\n, 2003\n, \n 49.99\n\n, 49.99\n, \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n\n, \n Learning XML\n\n, Learning XML\n, \n Erik T. Ray\n\n, Erik T. Ray\n, \n 2003\n\n, 2003\n, \n 39.95\n\n, 39.95\n)":) +fn:root(xml-doc("../../../queries/xml/books.xml") \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot2.jq b/src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot2.jq new file mode 100644 index 000000000..fc4ac79ba --- /dev/null +++ b/src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot2.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="\n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n" :) +fn:root(xml-doc("../../../queries/xml/books.xml")) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/GetDescendants1.jq b/src/test/resources/test_files/runtime/XPath/GetDescendants1.jq new file mode 100644 index 000000000..51193807e --- /dev/null +++ b/src/test/resources/test_files/runtime/XPath/GetDescendants1.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="(\n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n\n, \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n\n, \n Everyday Italian\n\n, Everyday Italian\n, \n Giada De Laurentiis\n\n, Giada De Laurentiis\n, \n 2005\n\n, 2005\n, \n 30.00\n\n, 30.00\n, \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n\n, \n Harry Potter\n\n, Harry Potter\n, \n J K. Rowling\n\n, J K. Rowling\n, \n 2005\n\n, 2005\n, \n 29.99\n\n, 29.99\n, \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n\n, \n XQuery Kick Start\n\n, XQuery Kick Start\n, \n James McGovern\n\n, James McGovern\n, \n Per Bothner\n\n, Per Bothner\n, \n Kurt Cagle\n\n, Kurt Cagle\n, \n James Linn\n\n, James Linn\n, \n Vaidyanathan Nagarajan\n\n, Vaidyanathan Nagarajan\n, \n 2003\n\n, 2003\n, \n 49.99\n\n, 49.99\n, \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n\n, \n Learning XML\n\n, Learning XML\n, \n Erik T. Ray\n\n, Erik T. Ray\n, \n 2003\n\n, 2003\n, \n 39.95\n\n, 39.95\n)":) +xml-doc("../../../queries/xml/books.xml")/descendant::node() + +(: Takes descendants from the root :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/GetDescendants2.jq b/src/test/resources/test_files/runtime/XPath/GetDescendants2.jq new file mode 100644 index 000000000..5ab717a0c --- /dev/null +++ b/src/test/resources/test_files/runtime/XPath/GetDescendants2.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="":) +xml-doc("../../../queries/xml/books.xml")//descendant::attribute() \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq b/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq new file mode 100644 index 000000000..3a9b02fa8 --- /dev/null +++ b/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="Everyday Italian,Giada De Laurentiis,2005,30.00,Harry Potter,J K. Rowling,2005":) +xml-doc("../../../queries/xml/books.xml")/descendant::node()/following::text() \ No newline at end of file From 8736922f6bfb29a9b2f38e31c075fd5a4ab7db5f Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Wed, 7 Aug 2024 14:08:36 +0300 Subject: [PATCH 47/56] Fixing describe --- .../resources/queries/sample-na-data-4.json | 12 ++++++------ .../runtime/numpy_lib/jsoniq_pandas.jq | 7 +++---- .../numpy_lib/test_jsoniq_numpy_fillna1.jq | 2 +- .../numpy_lib/test_jsoniq_pandas_describe.jq | 18 ++---------------- 4 files changed, 12 insertions(+), 27 deletions(-) diff --git a/src/test/resources/queries/sample-na-data-4.json b/src/test/resources/queries/sample-na-data-4.json index 7ed5b9bf6..b9d04b2ab 100644 --- a/src/test/resources/queries/sample-na-data-4.json +++ b/src/test/resources/queries/sample-na-data-4.json @@ -1,6 +1,6 @@ -{"label": 0, "binaryLabel": 0, "name": "a", "age": 20, "weight": 50.0, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 1", "stringArrayCol": ["i", "am", "data", "entry", "1"], "intArrayCol": [1,2,3], "doubleArrayCol": [1.0,2.0,3.0], "doubleArrayArrayCol": [[1.0,2.0,3.0]]} -{"label": 1, "binaryLabel": 0, "name": "b", "age": 21, "weight": 55.3, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 2", "stringArrayCol": ["i", "am", "data", "entry", "2"], "intArrayCol": [4,5,6], "doubleArrayCol": [4.0,5.0,6.0], "doubleArrayArrayCol": [[4.0,5.0,6.0]]} -{"label": 2, "binaryLabel": 0, "name": "c", "age": 22, "weight": 60.6, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 3", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [7,8,9], "doubleArrayCol": [7.0,8.0,9.0], "doubleArrayArrayCol": [[7.0,8.0,9.0]]} -{"label": 3, "binaryLabel": 1, "name": "d", "age": 23, "weight": 65.9, "nullCol": null, "stringCol": "i am data entry 4", "stringArrayCol": ["i", "am", "data", "entry", "4"], "intArrayCol": [1,4,7], "doubleArrayCol": [1.0,4.0,7.0], "doubleArrayArrayCol": [[1.0,4.0,7.0]]} -{"label": 4, "binaryLabel": 1, "name": "e", "age": 24, "weight": 70.3, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 5", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [2,5,8], "doubleArrayCol": [2.0,5.0,8.0], "doubleArrayArrayCol": [[2.0,5.0,8.0]]} -{"label": 5, "binaryLabel": 1, "name": "f", "age": 25, "weight": 75.6, "nullCol": null, "stringCol": "i am data entry 6", "stringArrayCol": ["i", "am", "data", "entry", "6"], "intArrayCol": [3,6,9], "doubleArrayCol": [3.0,6.0,9.0], "doubleArrayArrayCol": [[3.0,6.0,9.0]]} +{ "doubleArrayArrayCol": [[1.0,2.0,3.0]]} +{ "doubleArrayArrayCol": [[4.0,5.0,6.0]]} +{ "doubleArrayArrayCol": [[7.0,8.0,9.0]]} +{ "doubleArrayArrayCol": [[1.0,4.0,7.0]]} +{"doubleArrayArrayCol": [[2.0,5.0,8.0]]} +{"doubleArrayArrayCol": [[3.0,6.0,9.0]]} diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq index 71b31178f..00d119537 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq @@ -121,10 +121,9 @@ declare function jsoniq_pandas:frequency_of_values($column) { let $distinct_values := functx:distinct-deep($column[]) for $value in $distinct_values return {"count": jsoniq_pandas:count_value($value, $column[]), "value": $value}; - print_vars($counts); - (: for $count in $counts - order by $count.count - return $count :) + for $count in $counts + order by $count.count descending + return $count }; declare function jsoniq_pandas:count_value($value, $column) { diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq index 29598cea8..b74c0e3f0 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="({ "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] }, { "label" : 1, "binaryLabel" : 0, "name" : "b", "age" : 21, "weight" : 55.3, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 2", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "intArrayCol" : [ 4, 5, 6 ], "doubleArrayCol" : [ 4, 5, 6 ], "doubleArrayArrayCol" : [ [ 4, 5, 6 ] ] }, { "label" : 2, "binaryLabel" : 0, "name" : "c", "age" : 22, "weight" : 60.6, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 3", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 7, 8, 9 ], "doubleArrayCol" : [ 7, 8, 9 ], "doubleArrayArrayCol" : [ [ 7, 8, 9 ] ] }, { "label" : 3, "binaryLabel" : 1, "name" : "d", "age" : 23, "weight" : 65.9, "booleanCol" : 1, "nullCol" : null, "stringCol" : "i am data entry 4", "stringArrayCol" : [ "i", "am", "data", "entry", "4" ], "intArrayCol" : [ 1, 4, 7 ], "doubleArrayCol" : [ 1, 4, 7 ], "doubleArrayArrayCol" : [ [ 1, 4, 7 ] ] }, { "label" : 4, "binaryLabel" : 1, "name" : "e", "age" : 24, "weight" : 70.3, "booleanCol" : true, "nullCol" : null, "stringCol" : "i am data entry 5", "stringArrayCol" : [ "i", "am", "data", "entry", "5" ], "intArrayCol" : [ 2, 5, 8 ], "doubleArrayCol" : [ 2, 5, 8 ], "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ] }, { "label" : 5, "binaryLabel" : 1, "name" : "f", "age" : 25, "weight" : 75.6, "booleanCol" : true, "nullCol" : null, "stringCol" : "i am data entry 6", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "intArrayCol" : [ 3, 6, 9 ], "doubleArrayCol" : [ 3, 6, 9 ], "doubleArrayArrayCol" : [ [ 3, 6, 9 ] ] })":) +(:JIQS: ShouldRun; Output="({ "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] }, { "label" : 1, "binaryLabel" : 0, "name" : "b", "age" : 21, "weight" : 55.3, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 2", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "intArrayCol" : [ 4, 5, 6 ], "doubleArrayCol" : [ 4, 5, 6 ], "doubleArrayArrayCol" : [ [ 4, 5, 6 ] ] }, { "label" : 2, "binaryLabel" : 0, "name" : "c", "age" : 22, "weight" : 60.6, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 3", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 7, 8, 9 ], "doubleArrayCol" : [ 7, 8, 9 ], "doubleArrayArrayCol" : [ [ 7, 8, 9 ] ] }, { "label" : 3, "binaryLabel" : 1, "name" : "d", "age" : 23, "weight" : 65.9, "booleanCol" : 1, "nullCol" : null, "stringCol" : "i am data entry 4", "stringArrayCol" : [ "i", "am", "data", "entry", "4" ], "intArrayCol" : [ 1, 4, 7 ], "doubleArrayCol" : [ 1, 4, 7 ], "doubleArrayArrayCol" : [ [ 1, 4, 7 ] ] }, { "label" : 4, "binaryLabel" : 1, "name" : "e", "age" : 24, "weight" : 70.3, "booleanCol" : true, "nullCol" : null, "stringCol" : "i am data entry 5", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 2, 5, 8 ], "doubleArrayCol" : [ 2, 5, 8 ], "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ] }, { "label" : 5, "binaryLabel" : 1, "name" : "f", "age" : 25, "weight" : 75.6, "booleanCol" : 1, "nullCol" : null, "stringCol" : "i am data entry 6", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "intArrayCol" : [ 3, 6, 9 ], "doubleArrayCol" : [ 3, 6, 9 ], "doubleArrayArrayCol" : [ [ 3, 6, 9 ] ] })":) import module namespace pandas = "jsoniq_pandas.jq"; declare type local:sample-type-with-arrays as { "label": "integer", diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq index f24c5884c..a4afc9a3e 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq @@ -1,4 +1,5 @@ -(:JIQS: ShouldRun; Output="({ "categorical" : { "count" : 3, "unique" : 3, "top" : "f", "frequency" : 1 } }, { "numeric" : { "count" : 3, "mean" : 2, "std" : 1, "min" : 1, "max" : 3, "25%" : 1.5, "50%" : 2, "75%" : 2.5 } }, { "object" : { "count" : 3, "unique" : 3, "top" : "c", "frequency" : 1 } }, { "categorical" : null }, { "numeric" : { "count" : 3, "mean" : 2, "std" : 1, "min" : 1, "max" : 3, "25%" : 1.5, "50%" : 2, "75%" : 2.5 } }, { "object" : null }, { "categorical" : { "count" : 3, "unique" : 3, "top" : "f", "frequency" : 1 } }, { "numeric" : null }, { "object" : { "count" : 3, "unique" : 3, "top" : "c", "frequency" : 1 } }, { "0" : { "count" : 3, "mean" : 13, "std" : 4.358899, "min" : 10, "max" : 18, "25%" : 10.5, "50%" : 11, "75%" : 14.5 } }, { "1" : { "count" : 3, "mean" : 12, "std" : 3.6055512, "min" : 8, "max" : 15, "25%" : 10.5, "50%" : 13, "75%" : 14 } }, { "2" : { "count" : 3, "mean" : 10.6666666667, "std" : 8.621678, "min" : 3, "max" : 20, "25%" : 6, "50%" : 9, "75%" : 14.5 } }, { "Normal" : { "count" : 5, "mean" : 3, "std" : 1.5811388, "min" : 1, "max" : 5, "25%" : 2, "50%" : 3, "75%" : 4 } }, { "Uniform" : { "count" : 5, "mean" : 1, "std" : 0, "min" : 1, "max" : 1, "25%" : 1, "50%" : 1, "75%" : 1 } }, { "Skewed" : { "count" : 5, "mean" : 20.8, "std" : 44.274147, "min" : 1, "max" : 100, "25%" : 1, "50%" : 1, "75%" : 1 } })":) +(:JIQS: ShouldRun; Output="({ "label" : { "count" : 6, "mean" : 2.5, "std" : 1.8708287, "min" : 0, "max" : 5, "25%" : 1.25, "50%" : 2.5, "75%" : 3.75 } }, { "binaryLabel" : { "count" : 6, "mean" : 0.5, "std" : 0.5477226, "min" : 0, "max" : 1, "25%" : 0, "50%" : 0.5, "75%" : 1 } }, { "name" : { "count" : 6, "unique" : 6, "top" : null, "frequency" : null } }, { "age" : { "count" : 6, "mean" : 22.5, "std" : 1.8708287, "min" : 20, "max" : 25, "25%" : 21.25, "50%" : 22.5, "75%" : 23.75 } }, { "weight" : { "count" : 6, "mean" : 62.95000000000001, "std" : 9.534097, "min" : 50, "max" : 75.6, "25%" : 56.625, "50%" : 63.25, "75%" : 69.2 } }, { "booleanCol" : { "count" : 6, "unique" : 3, "top" : null, "frequency" : null } }, { "nullCol" : { "count" : 6, "unique" : 1, "top" : null, "frequency" : null } }, { "stringCol" : { "count" : 6, "unique" : 6, "top" : null, "frequency" : null } }, { "stringArrayCol" : { "count" : 6, "unique" : 5, "top" : null, "frequency" : null } }, { "intArrayCol" : { "count" : 6, "unique" : 6, "top" : null, "frequency" : null } }, { "doubleArrayCol" : { "count" : 6, "unique" : 6, "top" : null, "frequency" : null } }, { "doubleArrayArrayCol" : { "count" : 6, "unique" : 6, "top" : null, "frequency" : null } }) +)":) import module namespace pandas = "jsoniq_pandas.jq"; declare type local:sample-type-with-arrays as { @@ -16,21 +17,6 @@ declare type local:sample-type-with-arrays as { "doubleArrayArrayCol": [["double"]] }; -declare type local:sample-type-without-arrays as { - "label": "integer", - "binaryLabel": "integer", - "name": "string", - "age": "integer", - "weight": "double", - "booleanCol": "boolean", - "nullCol": "null", - "stringCol": "string" -}; -(: pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": ["a", "b", "c"]}), -pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": ["a", "b", "c"]}, {"include": "number"}), -pandas:describe({"categorical": ["d", "e", "f"],"numeric": [1, 2, 3],"object": ["a", "b", "c"]}, {"include": "object"}), -pandas:describe({"0": [10, 18, 11],"1": [13, 15, 8], "2": [9, 20, 3]}), -pandas:describe({"Normal": [1, 2, 3, 4, 5],"Uniform": [1, 1, 1, 1, 1],"Skewed": [1, 1, 1, 1,100]}), :) declare variable $file_data := json-file("../../../queries/sample-na-data-4.json"); let $data := validate type local:sample-type-with-arrays* {$file_data} return $data=>pandas:describe() \ No newline at end of file From 0124f19b7bcfbc766bd70df810ace1d1ffcdaa97 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Wed, 7 Aug 2024 18:32:47 +0300 Subject: [PATCH 48/56] Added more tests and fixed bugs --- src/main/java/org/rumbledb/items/xml/TextItem.java | 5 +++++ .../java/org/rumbledb/runtime/xml/StepExprIterator.java | 6 +++++- .../java/org/rumbledb/runtime/xml/axis/AxisIterator.java | 4 ++++ .../runtime/xml/axis/forward/AttributeAxisIterator.java | 8 ++++++-- .../runtime/xml/axis/forward/ChildAxisIterator.java | 7 +++++-- .../runtime/xml/axis/forward/DescendantAxisIterator.java | 7 +++++-- .../xml/axis/forward/DescendantOrSelfAxisIterator.java | 9 +++++---- .../runtime/xml/axis/forward/FollowingAxisIterator.java | 7 ++++--- .../xml/axis/forward/FollowingSiblingAxisIterator.java | 6 ++++-- .../runtime/xml/axis/forward/SelfAxisIterator.java | 5 +++-- .../runtime/xml/axis/reverse/AncestorAxisIterator.java | 7 +++++-- .../xml/axis/reverse/AncestorOrSelfAxisIterator.java | 9 +++++---- .../runtime/xml/axis/reverse/ParentAxisIterator.java | 9 ++++++--- .../runtime/xml/axis/reverse/PrecedingAxisIterator.java | 6 ++++-- .../xml/axis/reverse/PrecedingSiblingAxisIterator.java | 6 ++++-- .../test_files/runtime/FunctionGetRoot/GetRoot1.jq | 2 -- .../test_files/runtime/XPath/GetDescendants3.jq | 2 +- .../resources/test_files/runtime/XPath/SelectAnyNode.jq | 2 ++ .../test_files/runtime/XPath/SelectElementAttribute1.jq | 2 ++ .../test_files/runtime/XPath/SelectParentInPath.jq | 2 ++ .../test_files/runtime/XPath/SelectTextElement1.jq | 2 ++ 21 files changed, 79 insertions(+), 34 deletions(-) delete mode 100644 src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot1.jq create mode 100644 src/test/resources/test_files/runtime/XPath/SelectAnyNode.jq create mode 100644 src/test/resources/test_files/runtime/XPath/SelectElementAttribute1.jq create mode 100644 src/test/resources/test_files/runtime/XPath/SelectParentInPath.jq create mode 100644 src/test/resources/test_files/runtime/XPath/SelectTextElement1.jq diff --git a/src/main/java/org/rumbledb/items/xml/TextItem.java b/src/main/java/org/rumbledb/items/xml/TextItem.java index dc2dacba9..f65bfc03b 100644 --- a/src/main/java/org/rumbledb/items/xml/TextItem.java +++ b/src/main/java/org/rumbledb/items/xml/TextItem.java @@ -90,4 +90,9 @@ public ItemType getDynamicType() { public boolean isTextNode() { return true; } + + @Override + public String nodeName() { + return ""; + } } diff --git a/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java b/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java index 04fd681b8..6c738a4bc 100644 --- a/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java @@ -52,7 +52,7 @@ public void open(DynamicContext context) { private void setNextResult() { if (this.results == null) { - List axisResult = this.axisIterator.materialize(this.currentDynamicContextForLocalExecution); + List axisResult = applyAxis(); List nodeTestResult = applyNodeTest(axisResult); List predicateFilterResult = applyPredicateFilter(nodeTestResult); this.results = predicateFilterResult; @@ -60,6 +60,10 @@ private void setNextResult() { storeNextResult(); } + private List applyAxis() { + return this.axisIterator.materialize(this.currentDynamicContextForLocalExecution); + } + private void storeNextResult() { if (this.resultCounter < this.results.size()) { this.nextResult = this.results.get(this.resultCounter++); diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java index f2b94f697..23f4e6401 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java @@ -8,6 +8,7 @@ import org.rumbledb.runtime.RuntimeIterator; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; public abstract class AxisIterator extends LocalRuntimeIterator { @@ -29,6 +30,9 @@ public void open(DynamicContext context) { protected abstract void setNextResult(); protected void storeNextResult() { + if (this.resultCounter == 0) { + this.results = new ArrayList<>(new LinkedHashSet<>(this.results)); + } if (this.resultCounter < this.results.size()) { this.nextResult = this.results.get(this.resultCounter++); } else { diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java index 6823200f9..37735c110 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java @@ -6,6 +6,8 @@ import org.rumbledb.exceptions.UnexpectedNodeException; import org.rumbledb.runtime.xml.axis.AxisIterator; +import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; public class AttributeAxisIterator extends AxisIterator { @@ -16,13 +18,15 @@ public AttributeAxisIterator(RuntimeStaticContext staticContext) { @Override protected void setNextResult() { if (this.results == null) { + this.results = new ArrayList<>(); List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - Item node = currentContext.get(0); - this.results = node.attributes(); + for (Item node : currentContext) { + this.results.addAll(node.attributes()); + } } storeNextResult(); } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/ChildAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/ChildAxisIterator.java index 80fad1649..082695524 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/ChildAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/ChildAxisIterator.java @@ -6,6 +6,7 @@ import org.rumbledb.exceptions.UnexpectedNodeException; import org.rumbledb.runtime.xml.axis.AxisIterator; +import java.util.ArrayList; import java.util.List; public class ChildAxisIterator extends AxisIterator { @@ -16,13 +17,15 @@ public ChildAxisIterator(RuntimeStaticContext staticContext) { protected void setNextResult() { if (this.results == null) { + this.results = new ArrayList<>(); List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - Item node = currentContext.get(0); - this.results = node.children(); + for (Item node : currentContext) { + this.results.addAll(node.children()); + } } if (this.resultCounter < this.results.size()) { this.nextResult = this.results.get(this.resultCounter++); diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantAxisIterator.java index bdb05bd2e..f09eabe30 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantAxisIterator.java @@ -6,6 +6,7 @@ import org.rumbledb.exceptions.UnexpectedNodeException; import org.rumbledb.runtime.xml.axis.AxisIterator; +import java.util.ArrayList; import java.util.List; public class DescendantAxisIterator extends AxisIterator { @@ -16,13 +17,15 @@ public DescendantAxisIterator(RuntimeStaticContext staticContext) { @Override protected void setNextResult() { if (this.results == null) { + this.results = new ArrayList<>(); List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - Item node = currentContext.get(0); - this.results = getDescendants(node); + for (Item node : currentContext) { + this.results.addAll(getDescendants(node)); + } } storeNextResult(); } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java index 6f04695e5..bfd0c205e 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java @@ -17,15 +17,16 @@ public DescendantOrSelfAxisIterator(RuntimeStaticContext staticContext) { @Override protected void setNextResult() { if (this.results == null) { + this.results = new ArrayList<>(); List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - Item node = currentContext.get(0); - this.results = new ArrayList<>(); - this.results.addAll(getDescendants(node)); - this.results.add(node); + for (Item node: currentContext) { + this.results.addAll(getDescendants(node)); + this.results.add(node); + } } storeNextResult(); } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java index 71a4d198f..90be8062f 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java @@ -18,14 +18,15 @@ public FollowingAxisIterator(RuntimeStaticContext staticContext) { @Override protected void setNextResult() { if (this.results == null) { + this.results = new ArrayList<>(); List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - // TODO: add duplicate elimination - Item node = currentContext.get(0); - this.results = getFollowingNodes(node.parent(), node); + for (Item node : currentContext) { + this.results.addAll(getFollowingNodes(node.parent(), node)); + } } storeNextResult(); } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java index 27306ede7..679bc0ffb 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java @@ -18,13 +18,15 @@ public FollowingSiblingAxisIterator(RuntimeStaticContext staticContext) { @Override protected void setNextResult() { if (this.results == null) { + this.results = new ArrayList<>(); List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - Item node = currentContext.get(0); - this.results = getFollowingSiblings(node); + for (Item node: currentContext) { + this.results.addAll(getFollowingSiblings(node)); + } } storeNextResult(); } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java index a41edd955..00e53954a 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java @@ -6,6 +6,7 @@ import org.rumbledb.exceptions.UnexpectedNodeException; import org.rumbledb.runtime.xml.axis.AxisIterator; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -17,13 +18,13 @@ public SelfAxisIterator(RuntimeStaticContext staticContext) { @Override protected void setNextResult() { if (this.results == null) { + this.results = new ArrayList<>(); List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - Item node = currentContext.get(0); - this.results = Collections.singletonList(node); + this.results.addAll(currentContext); } storeNextResult(); } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java index 5d7ef9796..9da735680 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java @@ -6,6 +6,7 @@ import org.rumbledb.exceptions.UnexpectedNodeException; import org.rumbledb.runtime.xml.axis.AxisIterator; +import java.util.ArrayList; import java.util.List; public class AncestorAxisIterator extends AxisIterator { @@ -16,13 +17,15 @@ public AncestorAxisIterator(RuntimeStaticContext staticContext) { @Override protected void setNextResult() { if (this.results == null) { + this.results = new ArrayList<>(); List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - Item node = currentContext.get(0); - this.results = getAncestors(node); + for (Item node: currentContext) { + this.results.addAll( getAncestors(node)); + } } storeNextResult(); } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java index bc726e6a7..7e4a91229 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java @@ -17,15 +17,16 @@ public AncestorOrSelfAxisIterator(RuntimeStaticContext staticContext) { @Override protected void setNextResult() { if (this.results == null) { + this.results = new ArrayList<>(); List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - Item node = currentContext.get(0); - this.results = new ArrayList<>(); - this.results.addAll(getAncestors(node)); - this.results.add(node); + for (Item node: currentContext) { + this.results.addAll(getAncestors(node)); + this.results.add(node); + } } storeNextResult(); } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java index 207e1c0e0..fdf08ecae 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java @@ -6,6 +6,7 @@ import org.rumbledb.exceptions.UnexpectedNodeException; import org.rumbledb.runtime.xml.axis.AxisIterator; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -17,14 +18,16 @@ public ParentAxisIterator(RuntimeStaticContext staticContext) { @Override protected void setNextResult() { if (this.results == null) { + this.results = new ArrayList<>(); List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - Item node = currentContext.get(0); - this.results = Collections.singletonList(node.parent()); - } + for (Item node : currentContext) { + this.results.add(node.parent()); + } + } storeNextResult(); } } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java index 8296636bd..e5a60de8c 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java @@ -19,13 +19,15 @@ public PrecedingAxisIterator(RuntimeStaticContext staticContext) { @Override protected void setNextResult() { if (this.results == null) { + this.results = new ArrayList<>(); List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - Item node = currentContext.get(0); - this.results = getPrecedingNode(node.parent(), node); + for (Item node: currentContext) { + this.results.addAll(getPrecedingNode(node.parent(), node)); + } } storeNextResult(); } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java index 5fee97aef..5f7ab2df7 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java @@ -18,13 +18,15 @@ public PrecedingSiblingAxisIterator(RuntimeStaticContext staticContext) { @Override protected void setNextResult() { if (this.results == null) { + this.results = new ArrayList<>(); List currentContext = this.currentDynamicContextForLocalExecution.getVariableValues() .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata()); if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - Item node = currentContext.get(0); - this.results = getPrecedingSibling(node); + for (Item node: currentContext) { + this.results.addAll(getPrecedingSibling(node)); + } } storeNextResult(); } diff --git a/src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot1.jq b/src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot1.jq deleted file mode 100644 index a9f374998..000000000 --- a/src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot1.jq +++ /dev/null @@ -1,2 +0,0 @@ -(:JIQS: ShouldRun; Output="(\n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n\n, \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n\n, \n Everyday Italian\n\n, Everyday Italian\n, \n Giada De Laurentiis\n\n, Giada De Laurentiis\n, \n 2005\n\n, 2005\n, \n 30.00\n\n, 30.00\n, \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n\n, \n Harry Potter\n\n, Harry Potter\n, \n J K. Rowling\n\n, J K. Rowling\n, \n 2005\n\n, 2005\n, \n 29.99\n\n, 29.99\n, \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n\n, \n XQuery Kick Start\n\n, XQuery Kick Start\n, \n James McGovern\n\n, James McGovern\n, \n Per Bothner\n\n, Per Bothner\n, \n Kurt Cagle\n\n, Kurt Cagle\n, \n James Linn\n\n, James Linn\n, \n Vaidyanathan Nagarajan\n\n, Vaidyanathan Nagarajan\n, \n 2003\n\n, 2003\n, \n 49.99\n\n, 49.99\n, \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n\n, \n Learning XML\n\n, Learning XML\n, \n Erik T. Ray\n\n, Erik T. Ray\n, \n 2003\n\n, 2003\n, \n 39.95\n\n, 39.95\n)":) -fn:root(xml-doc("../../../queries/xml/books.xml") \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq b/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq index 3a9b02fa8..c2e1a8307 100644 --- a/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq +++ b/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq @@ -1,2 +1,2 @@ -(:JIQS: ShouldRun; Output="Everyday Italian,Giada De Laurentiis,2005,30.00,Harry Potter,J K. Rowling,2005":) +(:JIQS: ShouldRun; Output="(Harry Potter\n, J K. Rowling\n, 2005\n, 29.99\n, XQuery Kick Start\n, James McGovern\n, Per Bothner\n, Kurt Cagle\n, James Linn\n, Vaidyanathan Nagarajan\n, 2003\n, 49.99\n, Learning XML\n, Erik T. Ray\n, 39.95\n, Giada De Laurentiis\n, 30.00\n)":) xml-doc("../../../queries/xml/books.xml")/descendant::node()/following::text() \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/SelectAnyNode.jq b/src/test/resources/test_files/runtime/XPath/SelectAnyNode.jq new file mode 100644 index 000000000..7cac604f4 --- /dev/null +++ b/src/test/resources/test_files/runtime/XPath/SelectAnyNode.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="(\n Everyday Italian\n\n, \n Harry Potter\n\n, \n XQuery Kick Start\n\n, \n Learning XML\n\n)":) +xml-doc("../../../queries/xml/books.xml")//child::book//child::* \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/SelectElementAttribute1.jq b/src/test/resources/test_files/runtime/XPath/SelectElementAttribute1.jq new file mode 100644 index 000000000..8e5f38fe7 --- /dev/null +++ b/src/test/resources/test_files/runtime/XPath/SelectElementAttribute1.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="( lang="en", lang="en", lang="en", lang="en")":) +xml-doc("../../../queries/xml/books.xml")/child::bookstore/child::book/child::title/@lang \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/SelectParentInPath.jq b/src/test/resources/test_files/runtime/XPath/SelectParentInPath.jq new file mode 100644 index 000000000..850b9eb00 --- /dev/null +++ b/src/test/resources/test_files/runtime/XPath/SelectParentInPath.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="( category="cooking", category="children", category="web", category="web")":) +xml-doc("../../../queries/xml/books.xml")//child::book/child::title/../@category \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/SelectTextElement1.jq b/src/test/resources/test_files/runtime/XPath/SelectTextElement1.jq new file mode 100644 index 000000000..00b406101 --- /dev/null +++ b/src/test/resources/test_files/runtime/XPath/SelectTextElement1.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="(\n Everyday Italian\n\n, \n Harry Potter\n\n, \n XQuery Kick Start\n\n, \n Learning XML\n\n)":) +xml-doc("../../../queries/xml/books.xml")/child::bookstore/child::book/child::title \ No newline at end of file From 479dfe24cd1ae13671a216d45218e7e1127ab8d6 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 8 Aug 2024 17:09:22 +0300 Subject: [PATCH 49/56] Fixed bugs relating to selection of nodes --- .../org/rumbledb/items/xml/AttributeItem.java | 5 +++++ .../org/rumbledb/items/xml/DocumentItem.java | 5 +++++ .../org/rumbledb/items/xml/ElementItem.java | 5 +++++ .../java/org/rumbledb/items/xml/TextItem.java | 2 +- .../rumbledb/runtime/xml/StepExprIterator.java | 18 +++++++++++++++--- .../axis/forward/AttributeAxisIterator.java | 1 - .../forward/DescendantOrSelfAxisIterator.java | 2 +- .../forward/FollowingSiblingAxisIterator.java | 2 +- .../xml/axis/forward/SelfAxisIterator.java | 1 - .../xml/axis/reverse/AncestorAxisIterator.java | 4 ++-- .../reverse/AncestorOrSelfAxisIterator.java | 2 +- .../xml/axis/reverse/ParentAxisIterator.java | 3 +-- .../axis/reverse/PrecedingAxisIterator.java | 2 +- .../reverse/PrecedingSiblingAxisIterator.java | 2 +- .../test_files/runtime/XPath/SelectAnyNode.jq | 2 +- 15 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/rumbledb/items/xml/AttributeItem.java b/src/main/java/org/rumbledb/items/xml/AttributeItem.java index 27bb17ab2..a1fc39ab5 100644 --- a/src/main/java/org/rumbledb/items/xml/AttributeItem.java +++ b/src/main/java/org/rumbledb/items/xml/AttributeItem.java @@ -78,4 +78,9 @@ public boolean equals(Object other) { public boolean isAttributeNode() { return true; } + + @Override + public int hashCode() { + return this.attributeNode.hashCode(); + } } diff --git a/src/main/java/org/rumbledb/items/xml/DocumentItem.java b/src/main/java/org/rumbledb/items/xml/DocumentItem.java index 0f194a569..12b29412a 100644 --- a/src/main/java/org/rumbledb/items/xml/DocumentItem.java +++ b/src/main/java/org/rumbledb/items/xml/DocumentItem.java @@ -83,4 +83,9 @@ public boolean equals(Object other) { public boolean isDocumentNode() { return true; } + + @Override + public int hashCode() { + return this.documentNode.hashCode(); + } } diff --git a/src/main/java/org/rumbledb/items/xml/ElementItem.java b/src/main/java/org/rumbledb/items/xml/ElementItem.java index 968f1c685..5c38a12cb 100644 --- a/src/main/java/org/rumbledb/items/xml/ElementItem.java +++ b/src/main/java/org/rumbledb/items/xml/ElementItem.java @@ -110,4 +110,9 @@ public ItemType getDynamicType() { public void setParent(Item parent) { this.parent = parent; } + + @Override + public int hashCode() { + return this.elementNode.hashCode(); + } } diff --git a/src/main/java/org/rumbledb/items/xml/TextItem.java b/src/main/java/org/rumbledb/items/xml/TextItem.java index f65bfc03b..fc331542f 100644 --- a/src/main/java/org/rumbledb/items/xml/TextItem.java +++ b/src/main/java/org/rumbledb/items/xml/TextItem.java @@ -58,7 +58,7 @@ public void read(Kryo kryo, Input input) { } public int hashCode() { - return getTextValue().hashCode(); + return this.textNode.hashCode(); } @Override diff --git a/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java b/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java index 6c738a4bc..8c3a8f082 100644 --- a/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java @@ -18,6 +18,7 @@ import org.rumbledb.items.xml.TextItem; import org.rumbledb.runtime.LocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; +import org.rumbledb.runtime.xml.axis.forward.AttributeAxisIterator; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ private List applyPredicateFilter(List nodeTestResult) { private List applyNodeTest(List axisResult) { List nodeTestResults = new ArrayList<>(); for (Item node : axisResult) { - // TODO: Check type of node Item nodeTestResult = nodeTestItem(node); if (nodeTestResult != null) { nodeTestResults.add(nodeTestResult); @@ -125,14 +125,18 @@ private Item documentKindTest(Item node) { private Item nameKindTest(Item node) { NameTest nameTest = (NameTest) this.nodeTest; if (nameTest.hasQName()) { - // TODO: principal node kind test + if (!isPrincipalNodeKind(node)) { + return null; + } if (node.nodeName().equals(nameTest.getQName())) { return node; } return null; } if (nameTest.hasWildcardOnly()) { - // TODO: principal node kind test + if (!isPrincipalNodeKind(node)) { + return null; + } return node; } if (nameTest.getWildcardQName().equals(node.nodeName())) { @@ -141,6 +145,14 @@ private Item nameKindTest(Item node) { return null; } + // TODO: Add support for namespace nodes. + private boolean isPrincipalNodeKind(Item node) { + if (this.axisIterator instanceof AttributeAxisIterator) { + return node.isAttributeNode(); + } + return node.isElementNode(); + } + private Item elementKindTest(Item node) { ElementTest elementTest = (ElementTest) this.nodeTest; if (elementTest.isEmptyCheck()) { diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java index 37735c110..06375e359 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java @@ -7,7 +7,6 @@ import org.rumbledb.runtime.xml.axis.AxisIterator; import java.util.ArrayList; -import java.util.LinkedHashSet; import java.util.List; public class AttributeAxisIterator extends AxisIterator { diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java index bfd0c205e..977a4877a 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java @@ -23,7 +23,7 @@ protected void setNextResult() { if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - for (Item node: currentContext) { + for (Item node : currentContext) { this.results.addAll(getDescendants(node)); this.results.add(node); } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java index 679bc0ffb..c0bfcea40 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java @@ -24,7 +24,7 @@ protected void setNextResult() { if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - for (Item node: currentContext) { + for (Item node : currentContext) { this.results.addAll(getFollowingSiblings(node)); } } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java index 00e53954a..b17ca4175 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java @@ -7,7 +7,6 @@ import org.rumbledb.runtime.xml.axis.AxisIterator; import java.util.ArrayList; -import java.util.Collections; import java.util.List; public class SelfAxisIterator extends AxisIterator { diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java index 9da735680..4bb7a2380 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java @@ -23,8 +23,8 @@ protected void setNextResult() { if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - for (Item node: currentContext) { - this.results.addAll( getAncestors(node)); + for (Item node : currentContext) { + this.results.addAll(getAncestors(node)); } } storeNextResult(); diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java index 7e4a91229..13d2193de 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java @@ -23,7 +23,7 @@ protected void setNextResult() { if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - for (Item node: currentContext) { + for (Item node : currentContext) { this.results.addAll(getAncestors(node)); this.results.add(node); } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java index fdf08ecae..79d2fbb93 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java @@ -7,7 +7,6 @@ import org.rumbledb.runtime.xml.axis.AxisIterator; import java.util.ArrayList; -import java.util.Collections; import java.util.List; public class ParentAxisIterator extends AxisIterator { @@ -27,7 +26,7 @@ protected void setNextResult() { for (Item node : currentContext) { this.results.add(node.parent()); } - } + } storeNextResult(); } } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java index e5a60de8c..ccc11e7b3 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java @@ -25,7 +25,7 @@ protected void setNextResult() { if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - for (Item node: currentContext) { + for (Item node : currentContext) { this.results.addAll(getPrecedingNode(node.parent(), node)); } } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java index 5f7ab2df7..539c040c7 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java @@ -24,7 +24,7 @@ protected void setNextResult() { if (currentContext.isEmpty()) { throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata()); } - for (Item node: currentContext) { + for (Item node : currentContext) { this.results.addAll(getPrecedingSibling(node)); } } diff --git a/src/test/resources/test_files/runtime/XPath/SelectAnyNode.jq b/src/test/resources/test_files/runtime/XPath/SelectAnyNode.jq index 7cac604f4..80ee3d4dc 100644 --- a/src/test/resources/test_files/runtime/XPath/SelectAnyNode.jq +++ b/src/test/resources/test_files/runtime/XPath/SelectAnyNode.jq @@ -1,2 +1,2 @@ -(:JIQS: ShouldRun; Output="(\n Everyday Italian\n\n, \n Harry Potter\n\n, \n XQuery Kick Start\n\n, \n Learning XML\n\n)":) +(:JIQS: ShouldRun; Output="(\n Everyday Italian\n\n, \n Giada De Laurentiis\n\n, \n 2005\n\n, \n 30.00\n\n, \n Harry Potter\n\n, \n J K. Rowling\n\n, \n 2005\n\n, \n 29.99\n\n, \n XQuery Kick Start\n\n, \n James McGovern\n\n, \n Per Bothner\n\n, \n Kurt Cagle\n\n, \n James Linn\n\n, \n Vaidyanathan Nagarajan\n\n, \n 2003\n\n, \n 49.99\n\n, \n Learning XML\n\n, \n Erik T. Ray\n\n, \n 2003\n\n, \n 39.95\n\n)":) xml-doc("../../../queries/xml/books.xml")//child::book//child::* \ No newline at end of file From 2f1b0a4944ea1fcfa2f01fe804086469b02ec141 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Fri, 9 Aug 2024 11:08:41 +0300 Subject: [PATCH 50/56] Added more tests --- .../org/rumbledb/runtime/xml/PathExprIterator.java | 1 - .../org/rumbledb/runtime/xml/StepExprIterator.java | 12 ++++++++++-- .../test_files/runtime/XPath/GetAncestors1.jq | 2 ++ .../test_files/runtime/XPath/GetDescendants3.jq | 2 +- .../test_files/runtime/XPath/GetPreceding1.jq | 2 ++ .../runtime/XPath/SelectChildWithAttribute.jq | 2 ++ .../test_files/runtime/XPath/SelectSecondChild.jq | 2 ++ 7 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 src/test/resources/test_files/runtime/XPath/GetAncestors1.jq create mode 100644 src/test/resources/test_files/runtime/XPath/GetPreceding1.jq create mode 100644 src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq create mode 100644 src/test/resources/test_files/runtime/XPath/SelectSecondChild.jq diff --git a/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java b/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java index 9148f50b9..4e4ba0560 100644 --- a/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java @@ -47,7 +47,6 @@ private void setNextResult() { } for (int i = 0; i < this.stepIterators.size() - 1; ++i) { // TODO: Verify that the type of each item is node - // TODO: Remove duplicate nodes // TODO: Sort non-nodes List nextContext = this.stepIterators.get(i) .materialize(this.currentDynamicContextForLocalExecution); diff --git a/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java b/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java index 8c3a8f082..f2ed991cf 100644 --- a/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java @@ -2,6 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.Name; import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.UnsupportedFeatureException; @@ -74,8 +75,15 @@ private void storeNextResult() { } private List applyPredicateFilter(List nodeTestResult) { - // TODO: Implement predicates. - return nodeTestResult; + List intermediaryResults = nodeTestResult; + this.currentDynamicContextForLocalExecution.getVariableValues() + .addVariableValue(Name.CONTEXT_ITEM, intermediaryResults); + for (RuntimeIterator predicate : this.predicates) { + intermediaryResults = predicate.materialize(this.currentDynamicContextForLocalExecution); + this.currentDynamicContextForLocalExecution.getVariableValues() + .addVariableValue(Name.CONTEXT_ITEM, intermediaryResults); + } + return intermediaryResults; } private List applyNodeTest(List axisResult) { diff --git a/src/test/resources/test_files/runtime/XPath/GetAncestors1.jq b/src/test/resources/test_files/runtime/XPath/GetAncestors1.jq new file mode 100644 index 000000000..93ef4bd8a --- /dev/null +++ b/src/test/resources/test_files/runtime/XPath/GetAncestors1.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="(\n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n\n, \n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n\n, \n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n, \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n\n, \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n\n, \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n\n)":) +xml-doc("../../../queries/xml/books.xml")/child::bookstore/child::book/child::title/ancestor::node() \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq b/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq index c2e1a8307..a5b698e9c 100644 --- a/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq +++ b/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq @@ -1,2 +1,2 @@ -(:JIQS: ShouldRun; Output="(Harry Potter\n, J K. Rowling\n, 2005\n, 29.99\n, XQuery Kick Start\n, James McGovern\n, Per Bothner\n, Kurt Cagle\n, James Linn\n, Vaidyanathan Nagarajan\n, 2003\n, 49.99\n, Learning XML\n, Erik T. Ray\n, 39.95\n, Giada De Laurentiis\n, 30.00\n)":) +(:JIQS: ShouldRun; Output="(Harry Potter\n, J K. Rowling\n, 2005\n, 29.99\n, XQuery Kick Start\n, James McGovern\n, Per Bothner\n, Kurt Cagle\n, James Linn\n, Vaidyanathan Nagarajan\n, 2003\n, 49.99\n, Learning XML\n, Erik T. Ray\n, 2003\n, 39.95\n, Giada De Laurentiis\n, 2005\n, 30.00\n)":) xml-doc("../../../queries/xml/books.xml")/descendant::node()/following::text() \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/GetPreceding1.jq b/src/test/resources/test_files/runtime/XPath/GetPreceding1.jq new file mode 100644 index 000000000..e2ca73130 --- /dev/null +++ b/src/test/resources/test_files/runtime/XPath/GetPreceding1.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="(\n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n\n, \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n\n, \n Everyday Italian\n\n, Everyday Italian\n, \n Giada De Laurentiis\n\n, Giada De Laurentiis\n, \n 2005\n\n, 2005\n, \n 30.00\n\n, 30.00\n, \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n\n, \n Harry Potter\n\n, Harry Potter\n, \n J K. Rowling\n\n, J K. Rowling\n, \n 2005\n\n, 2005\n, \n 29.99\n\n, 29.99\n, \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n\n, \n XQuery Kick Start\n\n, XQuery Kick Start\n, \n James McGovern\n\n, James McGovern\n, \n Per Bothner\n\n, Per Bothner\n, \n Kurt Cagle\n\n, Kurt Cagle\n, \n James Linn\n\n, James Linn\n, \n Vaidyanathan Nagarajan\n\n, Vaidyanathan Nagarajan\n, \n 2003\n\n, 2003\n, \n 49.99\n\n, 49.99\n, \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n\n, \n Learning XML\n\n, Learning XML\n, \n Erik T. Ray\n\n, Erik T. Ray\n, \n 2003\n\n, 2003\n, \n 39.95\n\n, 39.95\n)":) +xml-doc("../../../queries/xml/books.xml")/child::bookstore/child::book/child::title[2]/preceding::text() \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq b/src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq new file mode 100644 index 000000000..72c133463 --- /dev/null +++ b/src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="\nHarry Potter\nJ K. Rowling\n2005\n29.99\n":) +xml-doc("../../../queries/xml/books.xml")//child::book[@category="children"] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/SelectSecondChild.jq b/src/test/resources/test_files/runtime/XPath/SelectSecondChild.jq new file mode 100644 index 000000000..a5954ec98 --- /dev/null +++ b/src/test/resources/test_files/runtime/XPath/SelectSecondChild.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="\nHarry Potter\nJ K. Rowling\n2005\n29.99\n":) +xml-doc("../../../queries/xml/books.xml")//child::book[fn:position() = 2] \ No newline at end of file From 41231ffd51d23a5f10e6a19bbadaab49e77ddbb8 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Fri, 9 Aug 2024 11:51:14 +0300 Subject: [PATCH 51/56] Fixed AnnotatedItem comparison error. --- .../org/rumbledb/items/AnnotatedItem.java | 17 +++++++------ .../resources/queries/sample-na-data-4.json | 12 ++++----- .../runtime/numpy_lib/jsoniq_pandas.jq | 25 +++++++++++++------ .../numpy_lib/test_jsoniq_numpy_fillna1.jq | 2 +- .../numpy_lib/test_jsoniq_pandas_describe.jq | 7 +++--- 5 files changed, 37 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/rumbledb/items/AnnotatedItem.java b/src/main/java/org/rumbledb/items/AnnotatedItem.java index 5d110a401..135771851 100644 --- a/src/main/java/org/rumbledb/items/AnnotatedItem.java +++ b/src/main/java/org/rumbledb/items/AnnotatedItem.java @@ -48,13 +48,16 @@ public AnnotatedItem(Item itemToAnnotate, ItemType type) { @Override public boolean equals(Object otherItem) { if (otherItem instanceof Item) { - long c = ComparisonIterator.compareItems( - this, - (Item) otherItem, - ComparisonOperator.VC_EQ, - ExceptionMetadata.EMPTY_METADATA - ); - return c == 0; + if (((Item) otherItem).isAtomic()) { + long c = ComparisonIterator.compareItems( + this, + (Item) otherItem, + ComparisonOperator.VC_EQ, + ExceptionMetadata.EMPTY_METADATA + ); + return c == 0; + } + return this.itemToAnnotate.equals(otherItem); } return false; } diff --git a/src/test/resources/queries/sample-na-data-4.json b/src/test/resources/queries/sample-na-data-4.json index b9d04b2ab..679a082fa 100644 --- a/src/test/resources/queries/sample-na-data-4.json +++ b/src/test/resources/queries/sample-na-data-4.json @@ -1,6 +1,6 @@ -{ "doubleArrayArrayCol": [[1.0,2.0,3.0]]} -{ "doubleArrayArrayCol": [[4.0,5.0,6.0]]} -{ "doubleArrayArrayCol": [[7.0,8.0,9.0]]} -{ "doubleArrayArrayCol": [[1.0,4.0,7.0]]} -{"doubleArrayArrayCol": [[2.0,5.0,8.0]]} -{"doubleArrayArrayCol": [[3.0,6.0,9.0]]} +{"label": 0, "binaryLabel": 0, "name": "a", "age": 20, "weight": 50.0, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 1", "stringArrayCol": ["i", "am", "data", "entry", "1"], "intArrayCol": [1,2,3], "doubleArrayCol": [1.0,2.0,3.0], "doubleArrayArrayCol": [[1.0,2.0,3.0]]} +{"label": 1, "binaryLabel": 0, "name": "b", "age": 21, "weight": 55.3, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 2", "stringArrayCol": ["i", "am", "data", "entry", "2"], "intArrayCol": [4,5,6], "doubleArrayCol": [4.0,5.0,6.0], "doubleArrayArrayCol": [[4.0,5.0,6.0]]} +{"label": 2, "binaryLabel": 0, "name": "c", "age": 22, "weight": 60.6, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 3", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [7,8,9], "doubleArrayCol": [7.0,8.0,9.0], "doubleArrayArrayCol": [[7.0,8.0,9.0]]} +{"label": 3, "binaryLabel": 1, "name": "d", "age": 23, "weight": 65.9, "nullCol": null, "stringCol": "i am data entry 4", "stringArrayCol": ["i", "am", "data", "entry", "4"], "intArrayCol": [1,4,7], "doubleArrayCol": [1.0,4.0,7.0], "doubleArrayArrayCol": [[1.0,2.0,3.0]]} +{"label": 4, "binaryLabel": 1, "name": "e", "age": 24, "weight": 70.3, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 5", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [2,5,8], "doubleArrayCol": [2.0,5.0,8.0], "doubleArrayArrayCol": [[2.0,5.0,8.0]]} +{"label": 5, "binaryLabel": 1, "name": "f", "age": 25, "weight": 75.6, "nullCol": null, "stringCol": "i am data entry 6", "stringArrayCol": ["i", "am", "data", "entry", "6"], "intArrayCol": [3,6,9], "doubleArrayCol": [3.0,6.0,9.0], "doubleArrayArrayCol": [[3.0,6.0,9.0]]} diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq index 00d119537..af6fc644c 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq @@ -98,7 +98,7 @@ declare function jsoniq_pandas:std($arr as array, $mean as double) { declare function jsoniq_pandas:categorical_report($column as array) { let $count := size($column) let $unique := count(functx:distinct-deep($column[])) - let $occurences := jsoniq_pandas:frequency_of_values($column) + let $occurences := jsoniq_pandas:count_occurences($column) let $top := $occurences[1].value let $frequency := $occurences[1].count return { @@ -109,25 +109,31 @@ declare function jsoniq_pandas:categorical_report($column as array) { } }; -(: declare function jsoniq_pandas:count_occurences($column) { - for $value in $column[] +declare function jsoniq_pandas:count_occurences($column) { + let $column_values := $column[] + return if ($column_values instance of atomic*) then jsoniq_pandas:count_occurences_for_atomic($column_values) + else if ($column_values instance of json-item*) then jsoniq_pandas:count_occurences_for_structured_item($column_values) + else fn:error("Unrecognized type for dataframe. Only atomic and item types are supported.") +}; + +declare function jsoniq_pandas:count_occurences_for_atomic($column) { + for $value in $column let $group_key := $value group by $group_key return {"value": $group_key, "count": count($value)} -}; :) +}; -declare function jsoniq_pandas:frequency_of_values($column) { +declare function jsoniq_pandas:count_occurences_for_structured_item($column) { variable $counts := - let $distinct_values := functx:distinct-deep($column[]) + let $distinct_values := functx:distinct-deep($column) for $value in $distinct_values - return {"count": jsoniq_pandas:count_value($value, $column[]), "value": $value}; + return {"count": jsoniq_pandas:count_value($value, $column), "value": $value}; for $count in $counts order by $count.count descending return $count }; declare function jsoniq_pandas:count_value($value, $column) { - print_vars($value); let $frequency := for $column_value in $column where deep-equal($value, $column_value) @@ -235,6 +241,9 @@ declare function jsoniq_pandas:fillna_row($row as object, $params as object, $ke {| for $key in $keys return if (empty($row.$key)) then {$key: $params.value} + else if ($row.$key instance of atomic) then + if ($row.$key eq null) then {$key: $params.value} + else {$key: $row.$key} else {$key: $row.$key} |} }; diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq index b74c0e3f0..dfb8702ce 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="({ "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] }, { "label" : 1, "binaryLabel" : 0, "name" : "b", "age" : 21, "weight" : 55.3, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 2", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "intArrayCol" : [ 4, 5, 6 ], "doubleArrayCol" : [ 4, 5, 6 ], "doubleArrayArrayCol" : [ [ 4, 5, 6 ] ] }, { "label" : 2, "binaryLabel" : 0, "name" : "c", "age" : 22, "weight" : 60.6, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 3", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 7, 8, 9 ], "doubleArrayCol" : [ 7, 8, 9 ], "doubleArrayArrayCol" : [ [ 7, 8, 9 ] ] }, { "label" : 3, "binaryLabel" : 1, "name" : "d", "age" : 23, "weight" : 65.9, "booleanCol" : 1, "nullCol" : null, "stringCol" : "i am data entry 4", "stringArrayCol" : [ "i", "am", "data", "entry", "4" ], "intArrayCol" : [ 1, 4, 7 ], "doubleArrayCol" : [ 1, 4, 7 ], "doubleArrayArrayCol" : [ [ 1, 4, 7 ] ] }, { "label" : 4, "binaryLabel" : 1, "name" : "e", "age" : 24, "weight" : 70.3, "booleanCol" : true, "nullCol" : null, "stringCol" : "i am data entry 5", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 2, 5, 8 ], "doubleArrayCol" : [ 2, 5, 8 ], "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ] }, { "label" : 5, "binaryLabel" : 1, "name" : "f", "age" : 25, "weight" : 75.6, "booleanCol" : 1, "nullCol" : null, "stringCol" : "i am data entry 6", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "intArrayCol" : [ 3, 6, 9 ], "doubleArrayCol" : [ 3, 6, 9 ], "doubleArrayArrayCol" : [ [ 3, 6, 9 ] ] })":) +(:JIQS: ShouldRun; Output="({ "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] }, { "label" : 1, "binaryLabel" : 0, "name" : "b", "age" : 21, "weight" : 55.3, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 2", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "intArrayCol" : [ 4, 5, 6 ], "doubleArrayCol" : [ 4, 5, 6 ], "doubleArrayArrayCol" : [ [ 4, 5, 6 ] ] }, { "label" : 2, "binaryLabel" : 0, "name" : "c", "age" : 22, "weight" : 60.6, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 3", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 7, 8, 9 ], "doubleArrayCol" : [ 7, 8, 9 ], "doubleArrayArrayCol" : [ [ 7, 8, 9 ] ] }, { "label" : 3, "binaryLabel" : 1, "name" : "d", "age" : 23, "weight" : 65.9, "booleanCol" : 1, "nullCol" : 1, "stringCol" : "i am data entry 4", "stringArrayCol" : [ "i", "am", "data", "entry", "4" ], "intArrayCol" : [ 1, 4, 7 ], "doubleArrayCol" : [ 1, 4, 7 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] }, { "label" : 4, "binaryLabel" : 1, "name" : "e", "age" : 24, "weight" : 70.3, "booleanCol" : true, "nullCol" : 1, "stringCol" : "i am data entry 5", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 2, 5, 8 ], "doubleArrayCol" : [ 2, 5, 8 ], "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ] }, { "label" : 5, "binaryLabel" : 1, "name" : "f", "age" : 25, "weight" : 75.6, "booleanCol" : 1, "nullCol" : 1, "stringCol" : "i am data entry 6", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "intArrayCol" : [ 3, 6, 9 ], "doubleArrayCol" : [ 3, 6, 9 ], "doubleArrayArrayCol" : [ [ 3, 6, 9 ] ] })":) import module namespace pandas = "jsoniq_pandas.jq"; declare type local:sample-type-with-arrays as { "label": "integer", diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq index a4afc9a3e..7921b620f 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq @@ -1,9 +1,8 @@ -(:JIQS: ShouldRun; Output="({ "label" : { "count" : 6, "mean" : 2.5, "std" : 1.8708287, "min" : 0, "max" : 5, "25%" : 1.25, "50%" : 2.5, "75%" : 3.75 } }, { "binaryLabel" : { "count" : 6, "mean" : 0.5, "std" : 0.5477226, "min" : 0, "max" : 1, "25%" : 0, "50%" : 0.5, "75%" : 1 } }, { "name" : { "count" : 6, "unique" : 6, "top" : null, "frequency" : null } }, { "age" : { "count" : 6, "mean" : 22.5, "std" : 1.8708287, "min" : 20, "max" : 25, "25%" : 21.25, "50%" : 22.5, "75%" : 23.75 } }, { "weight" : { "count" : 6, "mean" : 62.95000000000001, "std" : 9.534097, "min" : 50, "max" : 75.6, "25%" : 56.625, "50%" : 63.25, "75%" : 69.2 } }, { "booleanCol" : { "count" : 6, "unique" : 3, "top" : null, "frequency" : null } }, { "nullCol" : { "count" : 6, "unique" : 1, "top" : null, "frequency" : null } }, { "stringCol" : { "count" : 6, "unique" : 6, "top" : null, "frequency" : null } }, { "stringArrayCol" : { "count" : 6, "unique" : 5, "top" : null, "frequency" : null } }, { "intArrayCol" : { "count" : 6, "unique" : 6, "top" : null, "frequency" : null } }, { "doubleArrayCol" : { "count" : 6, "unique" : 6, "top" : null, "frequency" : null } }, { "doubleArrayArrayCol" : { "count" : 6, "unique" : 6, "top" : null, "frequency" : null } }) -)":) +(:JIQS: ShouldRun; Output="({ "label" : { "count" : 6, "mean" : 2.5, "std" : 1.8708287, "min" : 0, "max" : 5, "25%" : 1.25, "50%" : 2.5, "75%" : 3.75 } }, { "binaryLabel" : { "count" : 6, "mean" : 0.5, "std" : 0.5477226, "min" : 0, "max" : 1, "25%" : 0, "50%" : 0.5, "75%" : 1 } }, { "name" : { "count" : 6, "unique" : 6, "top" : "c", "frequency" : 1 } }, { "age" : { "count" : 6, "mean" : 22.5, "std" : 1.8708287, "min" : 20, "max" : 25, "25%" : 21.25, "50%" : 22.5, "75%" : 23.75 } }, { "weight" : { "count" : 6, "mean" : 62.95000000000001, "std" : 9.534097, "min" : 50, "max" : 75.6, "25%" : 56.625, "50%" : 63.25, "75%" : 69.2 } }, { "booleanCol" : { "count" : 6, "unique" : 3, "top" : false, "frequency" : 3 } }, { "nullCol" : { "count" : 6, "unique" : 1, "top" : null, "frequency" : 6 } }, { "stringCol" : { "count" : 6, "unique" : 6, "top" : "i am data entry 6", "frequency" : 1 } }, { "stringArrayCol" : { "count" : 6, "unique" : 5, "top" : [ "i", "am", "data", "entry", "3" ], "frequency" : 2 } }, { "intArrayCol" : { "count" : 6, "unique" : 6, "top" : [ 1, 2, 3 ], "frequency" : 1 } }, { "doubleArrayCol" : { "count" : 6, "unique" : 6, "top" : [ 1, 2, 3 ], "frequency" : 1 } }, { "doubleArrayArrayCol" : { "count" : 6, "unique" : 5, "top" : [ [ 1, 2, 3 ] ], "frequency" : 2 } })":) import module namespace pandas = "jsoniq_pandas.jq"; declare type local:sample-type-with-arrays as { - (: "label": "integer", + "label": "integer", "binaryLabel": "integer", "name": "string", "age": "integer", @@ -13,7 +12,7 @@ declare type local:sample-type-with-arrays as { "stringCol": "string", "stringArrayCol": ["string"], "intArrayCol": ["integer"], - "doubleArrayCol": ["double"], :) + "doubleArrayCol": ["double"], "doubleArrayArrayCol": [["double"]] }; From cc6fd8ab806bf84772752df273c59cbf6ed14861 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Fri, 9 Aug 2024 21:13:10 +0300 Subject: [PATCH 52/56] Added sorting to nodes --- src/main/java/org/rumbledb/api/Item.java | 9 +++++++++ .../org/rumbledb/items/xml/AttributeItem.java | 19 +++++++++++++++++++ .../org/rumbledb/items/xml/DocumentItem.java | 19 +++++++++++++++++++ .../org/rumbledb/items/xml/ElementItem.java | 19 +++++++++++++++++++ .../java/org/rumbledb/items/xml/TextItem.java | 19 +++++++++++++++++++ .../runtime/xml/axis/AxisIterator.java | 1 + .../axis/forward/FollowingAxisIterator.java | 1 + .../forward/FollowingSiblingAxisIterator.java | 1 + .../axis/reverse/PrecedingAxisIterator.java | 1 + .../reverse/PrecedingSiblingAxisIterator.java | 1 + .../test_files/runtime/XPath/GetAncestors1.jq | 2 +- .../runtime/XPath/GetDescendants3.jq | 2 +- 12 files changed, 92 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/rumbledb/api/Item.java b/src/main/java/org/rumbledb/api/Item.java index 5d1e6e379..c9f1e8bd2 100644 --- a/src/main/java/org/rumbledb/api/Item.java +++ b/src/main/java/org/rumbledb/api/Item.java @@ -15,6 +15,7 @@ import org.rumbledb.serialization.Serializer; import org.rumbledb.types.FunctionSignature; import org.rumbledb.types.ItemType; +import org.w3c.dom.Node; import java.io.Serializable; import java.math.BigDecimal; @@ -871,4 +872,12 @@ default String unparsedEntityServerId() { default void setParent(Item parent) { throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); } + + default int compareXmlNode(Item otherNode) { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + default Node getXmlNode() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } } diff --git a/src/main/java/org/rumbledb/items/xml/AttributeItem.java b/src/main/java/org/rumbledb/items/xml/AttributeItem.java index a1fc39ab5..488869907 100644 --- a/src/main/java/org/rumbledb/items/xml/AttributeItem.java +++ b/src/main/java/org/rumbledb/items/xml/AttributeItem.java @@ -83,4 +83,23 @@ public boolean isAttributeNode() { public int hashCode() { return this.attributeNode.hashCode(); } + + @Override + public int compareXmlNode(Item otherNode) { + int position = this.attributeNode.compareDocumentPosition(otherNode.getXmlNode()); + if ((position & Node.DOCUMENT_POSITION_FOLLOWING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0) { + return -1; + } else if ( + (position & Node.DOCUMENT_POSITION_PRECEDING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINS) > 0 + ) { + return 1; + } else { + return 0; + } + } + + @Override + public Node getXmlNode() { + return this.attributeNode; + } } diff --git a/src/main/java/org/rumbledb/items/xml/DocumentItem.java b/src/main/java/org/rumbledb/items/xml/DocumentItem.java index 12b29412a..335748a01 100644 --- a/src/main/java/org/rumbledb/items/xml/DocumentItem.java +++ b/src/main/java/org/rumbledb/items/xml/DocumentItem.java @@ -88,4 +88,23 @@ public boolean isDocumentNode() { public int hashCode() { return this.documentNode.hashCode(); } + + @Override + public int compareXmlNode(Item otherNode) { + int position = this.documentNode.compareDocumentPosition(otherNode.getXmlNode()); + if ((position & Node.DOCUMENT_POSITION_FOLLOWING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0) { + return -1; + } else if ( + (position & Node.DOCUMENT_POSITION_PRECEDING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINS) > 0 + ) { + return 1; + } else { + return 0; + } + } + + @Override + public Node getXmlNode() { + return this.documentNode; + } } diff --git a/src/main/java/org/rumbledb/items/xml/ElementItem.java b/src/main/java/org/rumbledb/items/xml/ElementItem.java index 5c38a12cb..316bd7994 100644 --- a/src/main/java/org/rumbledb/items/xml/ElementItem.java +++ b/src/main/java/org/rumbledb/items/xml/ElementItem.java @@ -115,4 +115,23 @@ public void setParent(Item parent) { public int hashCode() { return this.elementNode.hashCode(); } + + @Override + public int compareXmlNode(Item otherNode) { + int position = this.elementNode.compareDocumentPosition(otherNode.getXmlNode()); + if ((position & Node.DOCUMENT_POSITION_FOLLOWING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0) { + return -1; + } else if ( + (position & Node.DOCUMENT_POSITION_PRECEDING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINS) > 0 + ) { + return 1; + } else { + return 0; + } + } + + @Override + public Node getXmlNode() { + return this.elementNode; + } } diff --git a/src/main/java/org/rumbledb/items/xml/TextItem.java b/src/main/java/org/rumbledb/items/xml/TextItem.java index fc331542f..6ce7dafd7 100644 --- a/src/main/java/org/rumbledb/items/xml/TextItem.java +++ b/src/main/java/org/rumbledb/items/xml/TextItem.java @@ -95,4 +95,23 @@ public boolean isTextNode() { public String nodeName() { return ""; } + + @Override + public int compareXmlNode(Item otherNode) { + int position = this.textNode.compareDocumentPosition(otherNode.getXmlNode()); + if ((position & Node.DOCUMENT_POSITION_FOLLOWING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0) { + return -1; + } else if ( + (position & Node.DOCUMENT_POSITION_PRECEDING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINS) > 0 + ) { + return 1; + } else { + return 0; + } + } + + @Override + public Node getXmlNode() { + return this.textNode; + } } diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java index 23f4e6401..dd5e88b59 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java @@ -32,6 +32,7 @@ public void open(DynamicContext context) { protected void storeNextResult() { if (this.resultCounter == 0) { this.results = new ArrayList<>(new LinkedHashSet<>(this.results)); + this.results.sort(Item::compareXmlNode); } if (this.resultCounter < this.results.size()) { this.nextResult = this.results.get(this.resultCounter++); diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java index 90be8062f..559f63e55 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java @@ -45,6 +45,7 @@ private List getFollowingNodes(Item parent, Item node) { for (int i = 0; i < parentChildren.size(); ++i) { if (parentChildren.get(i).equals(node)) { followingIndex = i + 1; + break; } } for (int i = followingIndex; i > 0 && i < parentChildren.size(); ++i) { diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java index c0bfcea40..53b271d72 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java @@ -41,6 +41,7 @@ private List getFollowingSiblings(Item node) { for (int i = 0; i < parentChildren.size(); ++i) { if (parentChildren.get(i).equals(node)) { siblingsStartIndex = i + 1; + break; } } for (int i = siblingsStartIndex; i > 0 && i < parentChildren.size(); ++i) { diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java index ccc11e7b3..eb1c37098 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java @@ -46,6 +46,7 @@ private List getPrecedingNode(Item parent, Item node) { for (int i = 0; i < parentChildren.size(); ++i) { if (parentChildren.get(i).equals(node)) { nodeIndex = i; + break; } } for (int i = 0; i < nodeIndex; ++i) { diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java index 539c040c7..782e16d86 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java @@ -41,6 +41,7 @@ private List getPrecedingSibling(Item node) { for (int i = 0; i < parentChildren.size(); ++i) { if (parentChildren.get(i).equals(node)) { siblingsEndIndex = i; + break; } } for (int i = 0; i < siblingsEndIndex; ++i) { diff --git a/src/test/resources/test_files/runtime/XPath/GetAncestors1.jq b/src/test/resources/test_files/runtime/XPath/GetAncestors1.jq index 93ef4bd8a..abaf78ed2 100644 --- a/src/test/resources/test_files/runtime/XPath/GetAncestors1.jq +++ b/src/test/resources/test_files/runtime/XPath/GetAncestors1.jq @@ -1,2 +1,2 @@ -(:JIQS: ShouldRun; Output="(\n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n\n, \n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n\n, \n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n, \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n\n, \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n\n, \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n\n)":) +(:JIQS: ShouldRun; Output="(\n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n, \n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n\n, \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n\n, \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n\n, \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n\n, \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n\n)":) xml-doc("../../../queries/xml/books.xml")/child::bookstore/child::book/child::title/ancestor::node() \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq b/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq index a5b698e9c..01e2cd5b3 100644 --- a/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq +++ b/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq @@ -1,2 +1,2 @@ -(:JIQS: ShouldRun; Output="(Harry Potter\n, J K. Rowling\n, 2005\n, 29.99\n, XQuery Kick Start\n, James McGovern\n, Per Bothner\n, Kurt Cagle\n, James Linn\n, Vaidyanathan Nagarajan\n, 2003\n, 49.99\n, Learning XML\n, Erik T. Ray\n, 2003\n, 39.95\n, Giada De Laurentiis\n, 2005\n, 30.00\n)":) +(:JIQS: ShouldRun; Output="(Giada De Laurentiis\n, 2005\n, 30.00\n, Harry Potter\n, J K. Rowling\n, 2005\n, 29.99\n, XQuery Kick Start\n, James McGovern\n, Per Bothner\n, Kurt Cagle\n, James Linn\n, Vaidyanathan Nagarajan\n, 2003\n, 49.99\n, Learning XML\n, Erik T. Ray\n, 2003\n, 39.95\n)":) xml-doc("../../../queries/xml/books.xml")/descendant::node()/following::text() \ No newline at end of file From 0921cee54bd733d3b0582379eef45ebfa054d718 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Sun, 11 Aug 2024 12:28:56 +0300 Subject: [PATCH 53/56] Refactored step expression --- src/main/java/org/rumbledb/api/Item.java | 2 +- .../rumbledb/compiler/InferTypeVisitor.java | 8 ++- .../compiler/RuntimeIteratorVisitor.java | 10 +--- .../rumbledb/compiler/TranslationVisitor.java | 58 ++++++++++--------- .../rumbledb/expressions/xml/StepExpr.java | 53 +++-------------- .../expressions/xml/axis/EmptyStepExpr.java | 39 +++++++++++++ ...{ForwardStep.java => ForwardStepExpr.java} | 22 +++++-- .../rumbledb/expressions/xml/axis/NoStep.java | 24 -------- ...{ReverseStep.java => ReverseStepExpr.java} | 22 +++++-- .../rumbledb/expressions/xml/axis/Step.java | 12 ---- .../org/rumbledb/items/xml/AttributeItem.java | 6 ++ .../org/rumbledb/items/xml/DocumentItem.java | 6 ++ .../org/rumbledb/items/xml/ElementItem.java | 6 ++ .../java/org/rumbledb/items/xml/TextItem.java | 6 ++ .../runtime/xml/StepExprIterator.java | 21 +------ .../runtime/xml/axis/AxisIteratorVisitor.java | 8 +-- .../runtime/XPath/SelectChildWithAttribute.jq | 2 +- .../runtime/XPath/SelectSecondChild.jq | 4 +- 18 files changed, 158 insertions(+), 151 deletions(-) create mode 100644 src/main/java/org/rumbledb/expressions/xml/axis/EmptyStepExpr.java rename src/main/java/org/rumbledb/expressions/xml/axis/{ForwardStep.java => ForwardStepExpr.java} (53%) delete mode 100644 src/main/java/org/rumbledb/expressions/xml/axis/NoStep.java rename src/main/java/org/rumbledb/expressions/xml/axis/{ReverseStep.java => ReverseStepExpr.java} (53%) delete mode 100644 src/main/java/org/rumbledb/expressions/xml/axis/Step.java diff --git a/src/main/java/org/rumbledb/api/Item.java b/src/main/java/org/rumbledb/api/Item.java index c9f1e8bd2..31505a65a 100644 --- a/src/main/java/org/rumbledb/api/Item.java +++ b/src/main/java/org/rumbledb/api/Item.java @@ -857,7 +857,7 @@ default String typeName() { throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); } - default ItemType typedValue() { + default Item typedValue() { throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); } diff --git a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java index ac035122d..07a4b7a1c 100644 --- a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java @@ -104,6 +104,7 @@ import org.rumbledb.expressions.update.ReplaceExpression; import org.rumbledb.expressions.update.TransformExpression; import org.rumbledb.expressions.xml.PathExpr; +import org.rumbledb.expressions.xml.StepExpr; import org.rumbledb.runtime.functions.input.FileSystemUtil; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.FieldDescriptor; @@ -2602,7 +2603,6 @@ public StaticContext visitBlockExpr(BlockExpression expression, StaticContext ar // region xml - // TODO: add the right typing data. @Override public StaticContext visitPathExpr(PathExpr pathExpr, StaticContext argument) { visitDescendants(pathExpr, argument); @@ -2610,6 +2610,12 @@ public StaticContext visitPathExpr(PathExpr pathExpr, StaticContext argument) { return argument; } + // TODO: Currently, step expressions are marked as string, but this type may differ. Update to relevant type. + @Override + public StaticContext visitStepExpr(StepExpr stepExpr, StaticContext argument) { + stepExpr.setStaticSequenceType(SequenceType.ITEM_STAR); + return argument; + } // end xml } diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index 4b6aec515..821e71438 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -117,7 +117,6 @@ import org.rumbledb.expressions.update.TransformExpression; import org.rumbledb.expressions.xml.PathExpr; import org.rumbledb.expressions.xml.StepExpr; -import org.rumbledb.expressions.xml.axis.Step; import org.rumbledb.expressions.xml.node_test.NodeTest; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; @@ -1449,14 +1448,11 @@ public RuntimeIterator visitPathExpr(PathExpr pathExpr, RuntimeIterator argument @Override public RuntimeIterator visitStepExpr(StepExpr stepExpr, RuntimeIterator argument) { - AxisIterator axisIterator = this.visitAxisStep(stepExpr.getStep(), stepExpr.getMetadata()); + AxisIterator axisIterator = this.visitAxisStep(stepExpr, stepExpr.getMetadata()); NodeTest nodeTest = stepExpr.getNodeTest(); - List predicatesIterator = new ArrayList<>(); - stepExpr.getPredicates().forEach(predicate -> predicatesIterator.add(this.visit(predicate, argument))); return new StepExprIterator( axisIterator, nodeTest, - predicatesIterator, new RuntimeStaticContext( this.config, SequenceType.ITEM, @@ -1466,8 +1462,8 @@ public RuntimeIterator visitStepExpr(StepExpr stepExpr, RuntimeIterator argument ); } - private AxisIterator visitAxisStep(Step step, ExceptionMetadata metadata) { - return step.accept( + private AxisIterator visitAxisStep(StepExpr stepExpr, ExceptionMetadata metadata) { + return stepExpr.accept( new AxisIteratorVisitor(), new RuntimeStaticContext( this.config, diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java index 479f647de..641c30918 100644 --- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java @@ -140,12 +140,11 @@ import org.rumbledb.expressions.update.TransformExpression; import org.rumbledb.expressions.xml.PathExpr; import org.rumbledb.expressions.xml.StepExpr; +import org.rumbledb.expressions.xml.axis.EmptyStepExpr; import org.rumbledb.expressions.xml.axis.ForwardAxis; -import org.rumbledb.expressions.xml.axis.ForwardStep; -import org.rumbledb.expressions.xml.axis.NoStep; +import org.rumbledb.expressions.xml.axis.ForwardStepExpr; import org.rumbledb.expressions.xml.axis.ReverseAxis; -import org.rumbledb.expressions.xml.axis.ReverseStep; -import org.rumbledb.expressions.xml.axis.Step; +import org.rumbledb.expressions.xml.axis.ReverseStepExpr; import org.rumbledb.expressions.xml.node_test.AnyKindTest; import org.rumbledb.expressions.xml.node_test.AttributeTest; import org.rumbledb.expressions.xml.node_test.DocumentTest; @@ -2308,7 +2307,7 @@ public Node visitPathExpr(JsoniqParser.PathExprContext ctx) { private Node visitSingleSlashNoStepExpr(JsoniqParser.PathExprContext ctx) { // Case: No StepExpr, only dash - StepExpr stepExpr = new StepExpr(new NoStep(), createMetadataFromContext(ctx)); + StepExpr stepExpr = new EmptyStepExpr(createMetadataFromContext(ctx)); List intermediaryPaths = Collections.singletonList(stepExpr); FunctionCallExpression functionCallExpression = new FunctionCallExpression( Name.createVariableInDefaultXQueryTypeNamespace("root"), @@ -2328,8 +2327,9 @@ private Node visitRelativeWithoutSlash(JsoniqParser.RelativePathExprContext rela } private Node visitDoubleSlash(JsoniqParser.RelativePathExprContext doubleSlashContext) { - StepExpr stepExpr = new StepExpr( - new ForwardStep(ForwardAxis.DESCENDANT_OR_SELF, new AnyKindTest()), + StepExpr stepExpr = new ForwardStepExpr( + ForwardAxis.DESCENDANT_OR_SELF, + new AnyKindTest(), createMetadataFromContext(doubleSlashContext) ); List intermediaryPaths = getIntermediaryPaths(stepExpr, doubleSlashContext); @@ -2358,17 +2358,18 @@ private List getIntermediaryPaths( JsoniqParser.RelativePathExprContext relativePathExprContext ) { List intermediaryPaths = new ArrayList<>(); - StepExpr currentStepExpr; + Expression currentStepExpr; intermediaryPaths.add(stepExpr); for (int i = 0; i < relativePathExprContext.stepExpr().size(); ++i) { - currentStepExpr = (StepExpr) this.visitStepExpr(relativePathExprContext.stepExpr(i)); + currentStepExpr = (Expression) this.visitStepExpr(relativePathExprContext.stepExpr(i)); if (i > 0 && relativePathExprContext.sep.get(i - 1).getText().equals("//")) { // Unroll '//' to forward axis - StepExpr intermediaryStep = new StepExpr( - new ForwardStep(ForwardAxis.DESCENDANT_OR_SELF, new AnyKindTest()), + StepExpr intermediaryStepExpr = new ForwardStepExpr( + ForwardAxis.DESCENDANT_OR_SELF, + new AnyKindTest(), createMetadataFromContext(relativePathExprContext) ); - intermediaryPaths.add(intermediaryStep); + intermediaryPaths.add(intermediaryStepExpr); } intermediaryPaths.add(currentStepExpr); } @@ -2384,11 +2385,12 @@ private List getIntermediaryPaths( currentStepExpr = (Expression) this.visitStepExpr(relativePathExprContext.stepExpr(i)); if (i > 0 && relativePathExprContext.sep.get(i - 1).getText().equals("//")) { // Unroll '//' to forward axis - StepExpr intermediaryStep = new StepExpr( - new ForwardStep(ForwardAxis.DESCENDANT_OR_SELF, new AnyKindTest()), + StepExpr intermediaryStepExpr = new ForwardStepExpr( + ForwardAxis.DESCENDANT_OR_SELF, + new AnyKindTest(), createMetadataFromContext(relativePathExprContext) ); - intermediaryPaths.add(intermediaryStep); + intermediaryPaths.add(intermediaryStepExpr); } intermediaryPaths.add(currentStepExpr); } @@ -2398,24 +2400,28 @@ private List getIntermediaryPaths( @Override public Node visitStepExpr(JsoniqParser.StepExprContext ctx) { if (ctx.postFixExpr() == null) { - List predicates = new ArrayList<>(); - Step step = getStep(ctx.axisStep()); + Expression stepExpr = getStep(ctx.axisStep()); for (JsoniqParser.PredicateContext predicateContext : ctx.axisStep().predicateList().predicate()) { - predicates.add((Expression) this.visitPredicate(predicateContext)); + Expression predicate = (Expression) this.visitPredicate(predicateContext); + stepExpr = new FilterExpression( + stepExpr, + predicate, + createMetadataFromContext(ctx) + ); } - return new StepExpr(step, predicates, createMetadataFromContext(ctx)); + return stepExpr; } return this.visitPostFixExpr(ctx.postFixExpr()); } - private Step getStep(JsoniqParser.AxisStepContext ctx) { + private StepExpr getStep(JsoniqParser.AxisStepContext ctx) { if (ctx.forwardStep() == null) { return getReverseStep(ctx.reverseStep()); } return getForwardStep(ctx.forwardStep()); } - private Step getForwardStep(JsoniqParser.ForwardStepContext ctx) { + private StepExpr getForwardStep(JsoniqParser.ForwardStepContext ctx) { ForwardAxis forwardAxis; NodeTest nodeTest; if (ctx.nodeTest() == null) { @@ -2428,23 +2434,23 @@ private Step getForwardStep(JsoniqParser.ForwardStepContext ctx) { } else { forwardAxis = ForwardAxis.CHILD; } - return new ForwardStep(forwardAxis, nodeTest); + return new ForwardStepExpr(forwardAxis, nodeTest, createMetadataFromContext(ctx)); } forwardAxis = ForwardAxis.fromString(ctx.forwardAxis().getText()); nodeTest = getNodeTest(ctx.nodeTest()); - return new ForwardStep(forwardAxis, nodeTest); + return new ForwardStepExpr(forwardAxis, nodeTest, createMetadataFromContext(ctx)); } - private Step getReverseStep(JsoniqParser.ReverseStepContext ctx) { + private StepExpr getReverseStep(JsoniqParser.ReverseStepContext ctx) { if (ctx.nodeTest() == null) { // .. equivalent with 'parent::node()' ReverseAxis reverseAxis = ReverseAxis.PARENT; NodeTest nodeTest = new AnyKindTest(); - return new ReverseStep(reverseAxis, nodeTest); + return new ReverseStepExpr(reverseAxis, nodeTest, createMetadataFromContext(ctx)); } ReverseAxis reverseAxis = ReverseAxis.fromString(ctx.reverseAxis().getText()); NodeTest nodeTest = getNodeTest(ctx.nodeTest()); - return new ReverseStep(reverseAxis, nodeTest); + return new ReverseStepExpr(reverseAxis, nodeTest, createMetadataFromContext(ctx)); } private NodeTest getNodeTest(JsoniqParser.NodeTestContext nodeTestContext) { diff --git a/src/main/java/org/rumbledb/expressions/xml/StepExpr.java b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java index 0a1ed5e76..5aeb175d3 100644 --- a/src/main/java/org/rumbledb/expressions/xml/StepExpr.java +++ b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java @@ -1,29 +1,16 @@ package org.rumbledb.expressions.xml; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.expressions.AbstractNodeVisitor; import org.rumbledb.expressions.Expression; -import org.rumbledb.expressions.Node; -import org.rumbledb.expressions.xml.axis.Step; import org.rumbledb.expressions.xml.node_test.NodeTest; +import org.rumbledb.runtime.xml.axis.AxisIterator; +import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor; -import java.util.ArrayList; -import java.util.List; - -public class StepExpr extends Expression { - private Step step; - private List predicates; - - public StepExpr(Step step, ExceptionMetadata exceptionMetadata) { - super(exceptionMetadata); - this.step = step; - this.predicates = new ArrayList<>(); - } - - public StepExpr(Step step, List predicates, ExceptionMetadata exceptionMetadata) { - super(exceptionMetadata); - this.step = step; - this.predicates = predicates; +public abstract class StepExpr extends Expression { + public StepExpr(ExceptionMetadata metadata) { + super(metadata); } @Override @@ -31,31 +18,7 @@ public T accept(AbstractNodeVisitor visitor, T argument) { return visitor.visitStepExpr(this, argument); } - @Override - public List getChildren() { - return new ArrayList<>(predicates); - } - - @Override - public void serializeToJSONiq(StringBuffer sb, int indent) { - indentIt(sb, indent); - sb.append(step.toString()); - for (Expression predicate : predicates) { - sb.append("[ "); - predicate.serializeToJSONiq(sb, indent); - sb.append(" ], "); - } - } - - public List getPredicates() { - return this.predicates; - } + public abstract AxisIterator accept(AxisIteratorVisitor visitor, RuntimeStaticContext staticContext); - public Step getStep() { - return this.step; - } - - public NodeTest getNodeTest() { - return this.step.getNodeTest(); - } + public abstract NodeTest getNodeTest(); } diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/EmptyStepExpr.java b/src/main/java/org/rumbledb/expressions/xml/axis/EmptyStepExpr.java new file mode 100644 index 000000000..9f0a9c90a --- /dev/null +++ b/src/main/java/org/rumbledb/expressions/xml/axis/EmptyStepExpr.java @@ -0,0 +1,39 @@ +package org.rumbledb.expressions.xml.axis; + +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.expressions.Node; +import org.rumbledb.expressions.xml.StepExpr; +import org.rumbledb.expressions.xml.node_test.NodeTest; +import org.rumbledb.runtime.xml.axis.AxisIterator; +import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor; + +import java.util.Collections; +import java.util.List; + +public class EmptyStepExpr extends StepExpr { + + public EmptyStepExpr(ExceptionMetadata metadata) { + super(metadata); + } + + @Override + public List getChildren() { + return Collections.emptyList(); + } + + @Override + public void serializeToJSONiq(StringBuffer sb, int indent) { + indentIt(sb, indent); + } + + @Override + public AxisIterator accept(AxisIteratorVisitor visitor, RuntimeStaticContext staticContext) { + return null; + } + + @Override + public NodeTest getNodeTest() { + return null; + } +} diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStepExpr.java similarity index 53% rename from src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java rename to src/main/java/org/rumbledb/expressions/xml/axis/ForwardStepExpr.java index 4738c39b9..16e71b607 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStep.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStepExpr.java @@ -1,22 +1,36 @@ package org.rumbledb.expressions.xml.axis; import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.expressions.Node; +import org.rumbledb.expressions.xml.StepExpr; import org.rumbledb.expressions.xml.node_test.NodeTest; import org.rumbledb.runtime.xml.axis.AxisIterator; import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor; -public class ForwardStep implements Step { +import java.util.Collections; +import java.util.List; + +public class ForwardStepExpr extends StepExpr { private ForwardAxis forwardAxis; private NodeTest nodeTest; - public ForwardStep(ForwardAxis forwardAxis, NodeTest nodeTest) { + public ForwardStepExpr(ForwardAxis forwardAxis, NodeTest nodeTest, ExceptionMetadata exceptionMetadata) { + super(exceptionMetadata); this.forwardAxis = forwardAxis; this.nodeTest = nodeTest; } @Override - public String toString() { - return forwardAxis.getAxisValue() + nodeTest.toString(); + public List getChildren() { + return Collections.emptyList(); + } + + @Override + public void serializeToJSONiq(StringBuffer sb, int indent) { + indentIt(sb, indent); + sb.append(forwardAxis.getAxisValue()); + sb.append(nodeTest.toString()); } public ForwardAxis getForwardAxis() { diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/NoStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/NoStep.java deleted file mode 100644 index d2575747c..000000000 --- a/src/main/java/org/rumbledb/expressions/xml/axis/NoStep.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.rumbledb.expressions.xml.axis; - -import org.rumbledb.context.RuntimeStaticContext; -import org.rumbledb.expressions.xml.node_test.NodeTest; -import org.rumbledb.runtime.xml.axis.AxisIterator; -import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor; - -public class NoStep implements Step { - - @Override - public String toString() { - return ""; - } - - @Override - public AxisIterator accept(AxisIteratorVisitor visitor, RuntimeStaticContext staticContext) { - return null; - } - - @Override - public NodeTest getNodeTest() { - return null; - } -} diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStepExpr.java similarity index 53% rename from src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java rename to src/main/java/org/rumbledb/expressions/xml/axis/ReverseStepExpr.java index 62fae2922..0b75e028e 100644 --- a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStep.java +++ b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStepExpr.java @@ -1,22 +1,36 @@ package org.rumbledb.expressions.xml.axis; import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.expressions.Node; +import org.rumbledb.expressions.xml.StepExpr; import org.rumbledb.expressions.xml.node_test.NodeTest; import org.rumbledb.runtime.xml.axis.AxisIterator; import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor; -public class ReverseStep implements Step { +import java.util.Collections; +import java.util.List; + +public class ReverseStepExpr extends StepExpr { private ReverseAxis reverseAxis; private NodeTest nodeTest; - public ReverseStep(ReverseAxis reverseAxis, NodeTest nodeTest) { + public ReverseStepExpr(ReverseAxis reverseAxis, NodeTest nodeTest, ExceptionMetadata exceptionMetadata) { + super(exceptionMetadata); this.reverseAxis = reverseAxis; this.nodeTest = nodeTest; } @Override - public String toString() { - return reverseAxis.getAxisValue() + nodeTest.toString(); + public List getChildren() { + return Collections.emptyList(); + } + + @Override + public void serializeToJSONiq(StringBuffer sb, int indent) { + indentIt(sb, indent); + sb.append(reverseAxis.getAxisValue()); + sb.append(nodeTest.toString()); } public ReverseAxis getReverseAxis() { diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/Step.java b/src/main/java/org/rumbledb/expressions/xml/axis/Step.java deleted file mode 100644 index 84b38cf60..000000000 --- a/src/main/java/org/rumbledb/expressions/xml/axis/Step.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.rumbledb.expressions.xml.axis; - -import org.rumbledb.context.RuntimeStaticContext; -import org.rumbledb.expressions.xml.node_test.NodeTest; -import org.rumbledb.runtime.xml.axis.AxisIterator; -import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor; - -public interface Step { - public AxisIterator accept(AxisIteratorVisitor visitor, RuntimeStaticContext staticContext); - - public NodeTest getNodeTest(); -} diff --git a/src/main/java/org/rumbledb/items/xml/AttributeItem.java b/src/main/java/org/rumbledb/items/xml/AttributeItem.java index 488869907..fbb70ebd7 100644 --- a/src/main/java/org/rumbledb/items/xml/AttributeItem.java +++ b/src/main/java/org/rumbledb/items/xml/AttributeItem.java @@ -4,6 +4,7 @@ import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import org.rumbledb.api.Item; +import org.rumbledb.items.ItemFactory; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.ItemType; import org.w3c.dom.Node; @@ -102,4 +103,9 @@ public int compareXmlNode(Item otherNode) { public Node getXmlNode() { return this.attributeNode; } + + @Override + public Item typedValue() { + return ItemFactory.getInstance().createStringItem(this.attributeNode.getNodeName()); + } } diff --git a/src/main/java/org/rumbledb/items/xml/DocumentItem.java b/src/main/java/org/rumbledb/items/xml/DocumentItem.java index 335748a01..55a0d64f1 100644 --- a/src/main/java/org/rumbledb/items/xml/DocumentItem.java +++ b/src/main/java/org/rumbledb/items/xml/DocumentItem.java @@ -4,6 +4,7 @@ import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import org.rumbledb.api.Item; +import org.rumbledb.items.ItemFactory; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.ItemType; import org.w3c.dom.Node; @@ -107,4 +108,9 @@ public int compareXmlNode(Item otherNode) { public Node getXmlNode() { return this.documentNode; } + + @Override + public Item typedValue() { + return ItemFactory.getInstance().createStringItem(this.documentNode.getNodeValue()); + } } diff --git a/src/main/java/org/rumbledb/items/xml/ElementItem.java b/src/main/java/org/rumbledb/items/xml/ElementItem.java index 316bd7994..b574a0b1c 100644 --- a/src/main/java/org/rumbledb/items/xml/ElementItem.java +++ b/src/main/java/org/rumbledb/items/xml/ElementItem.java @@ -4,6 +4,7 @@ import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import org.rumbledb.api.Item; +import org.rumbledb.items.ItemFactory; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.ItemType; import org.w3c.dom.Node; @@ -134,4 +135,9 @@ public int compareXmlNode(Item otherNode) { public Node getXmlNode() { return this.elementNode; } + + @Override + public Item typedValue() { + return ItemFactory.getInstance().createStringItem(this.elementNode.getNodeValue()); + } } diff --git a/src/main/java/org/rumbledb/items/xml/TextItem.java b/src/main/java/org/rumbledb/items/xml/TextItem.java index 6ce7dafd7..2f8a03af6 100644 --- a/src/main/java/org/rumbledb/items/xml/TextItem.java +++ b/src/main/java/org/rumbledb/items/xml/TextItem.java @@ -4,6 +4,7 @@ import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import org.rumbledb.api.Item; +import org.rumbledb.items.ItemFactory; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.ItemType; import org.w3c.dom.Node; @@ -114,4 +115,9 @@ public int compareXmlNode(Item otherNode) { public Node getXmlNode() { return this.textNode; } + + @Override + public Item typedValue() { + return ItemFactory.getInstance().createStringItem(this.textNode.getNodeValue()); + } } diff --git a/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java b/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java index f2ed991cf..94e455476 100644 --- a/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java @@ -2,7 +2,6 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.context.Name; import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.UnsupportedFeatureException; @@ -27,7 +26,6 @@ public class StepExprIterator extends LocalRuntimeIterator { private final RuntimeIterator axisIterator; private NodeTest nodeTest; - private final List predicates; private List results; private Item nextResult; private int resultCounter = 0; @@ -35,15 +33,12 @@ public class StepExprIterator extends LocalRuntimeIterator { public StepExprIterator( RuntimeIterator axisIterator, NodeTest nodeTest, - List predicates, RuntimeStaticContext staticContext ) { super(null, staticContext); this.children.add(axisIterator); - this.children.addAll(predicates); this.axisIterator = axisIterator; this.nodeTest = nodeTest; - this.predicates = predicates; } @Override @@ -55,9 +50,7 @@ public void open(DynamicContext context) { private void setNextResult() { if (this.results == null) { List axisResult = applyAxis(); - List nodeTestResult = applyNodeTest(axisResult); - List predicateFilterResult = applyPredicateFilter(nodeTestResult); - this.results = predicateFilterResult; + this.results = applyNodeTest(axisResult); } storeNextResult(); } @@ -74,18 +67,6 @@ private void storeNextResult() { } } - private List applyPredicateFilter(List nodeTestResult) { - List intermediaryResults = nodeTestResult; - this.currentDynamicContextForLocalExecution.getVariableValues() - .addVariableValue(Name.CONTEXT_ITEM, intermediaryResults); - for (RuntimeIterator predicate : this.predicates) { - intermediaryResults = predicate.materialize(this.currentDynamicContextForLocalExecution); - this.currentDynamicContextForLocalExecution.getVariableValues() - .addVariableValue(Name.CONTEXT_ITEM, intermediaryResults); - } - return intermediaryResults; - } - private List applyNodeTest(List axisResult) { List nodeTestResults = new ArrayList<>(); for (Item node : axisResult) { diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/AxisIteratorVisitor.java b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIteratorVisitor.java index 1d0a9282f..602fa9fd6 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/AxisIteratorVisitor.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIteratorVisitor.java @@ -3,8 +3,8 @@ import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.UnsupportedFeatureException; -import org.rumbledb.expressions.xml.axis.ForwardStep; -import org.rumbledb.expressions.xml.axis.ReverseStep; +import org.rumbledb.expressions.xml.axis.ForwardStepExpr; +import org.rumbledb.expressions.xml.axis.ReverseStepExpr; import org.rumbledb.runtime.xml.axis.forward.AttributeAxisIterator; import org.rumbledb.runtime.xml.axis.forward.ChildAxisIterator; import org.rumbledb.runtime.xml.axis.forward.DescendantAxisIterator; @@ -20,7 +20,7 @@ public class AxisIteratorVisitor { - public AxisIterator visit(ForwardStep forwardStep, RuntimeStaticContext staticContext) { + public AxisIterator visit(ForwardStepExpr forwardStep, RuntimeStaticContext staticContext) { switch (forwardStep.getForwardAxis()) { case SELF: return new SelfAxisIterator(staticContext); @@ -44,7 +44,7 @@ public AxisIterator visit(ForwardStep forwardStep, RuntimeStaticContext staticCo } } - public AxisIterator visit(ReverseStep reverseStep, RuntimeStaticContext staticContext) { + public AxisIterator visit(ReverseStepExpr reverseStep, RuntimeStaticContext staticContext) { switch (reverseStep.getReverseAxis()) { case PARENT: return new ParentAxisIterator(staticContext); diff --git a/src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq b/src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq index 72c133463..c93b0d925 100644 --- a/src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq +++ b/src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq @@ -1,2 +1,2 @@ (:JIQS: ShouldRun; Output="\nHarry Potter\nJ K. Rowling\n2005\n29.99\n":) -xml-doc("../../../queries/xml/books.xml")//child::book[@category="children"] \ No newline at end of file +xml-doc("../../../queries/xml/books.xml")//child::book[@category eq "children"] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/SelectSecondChild.jq b/src/test/resources/test_files/runtime/XPath/SelectSecondChild.jq index a5954ec98..2cee972ae 100644 --- a/src/test/resources/test_files/runtime/XPath/SelectSecondChild.jq +++ b/src/test/resources/test_files/runtime/XPath/SelectSecondChild.jq @@ -1,2 +1,2 @@ -(:JIQS: ShouldRun; Output="\nHarry Potter\nJ K. Rowling\n2005\n29.99\n":) -xml-doc("../../../queries/xml/books.xml")//child::book[fn:position() = 2] \ No newline at end of file +(:JIQS: ShouldRun; Output="\n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n\n":) +xml-doc("../../../queries/xml/books.xml")//child::book[fn:position() eq 3] \ No newline at end of file From b4a4f5237b17283f9c7171655bb4f69bdb4caf99 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Sun, 11 Aug 2024 19:23:16 +0300 Subject: [PATCH 54/56] Finalized predicates --- .../compiler/RuntimeIteratorVisitor.java | 8 ++ .../org/rumbledb/items/xml/AttributeItem.java | 2 +- .../org/rumbledb/items/xml/ElementItem.java | 2 +- .../runtime/xml/AtomizationIterator.java | 77 +++++++++++++++++++ .../runtime/xml/PathExprIterator.java | 11 ++- .../runtime/xml/StepExprIterator.java | 13 +++- .../runtime/xml/axis/AxisIterator.java | 9 +++ .../test_files/runtime/XPath/GetPreceding1.jq | 2 +- .../runtime/XPath/SelectChildWithAttribute.jq | 2 +- .../runtime/XPath/SelectChildWithTitle.jq | 2 + .../runtime/XPath/SelectLastBookChild.jq | 2 + .../XPath/SelectTitleWithPredicates.jq | 2 + 12 files changed, 125 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/rumbledb/runtime/xml/AtomizationIterator.java create mode 100644 src/test/resources/test_files/runtime/XPath/SelectChildWithTitle.jq create mode 100644 src/test/resources/test_files/runtime/XPath/SelectLastBookChild.jq create mode 100644 src/test/resources/test_files/runtime/XPath/SelectTitleWithPredicates.jq diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index 821e71438..9af610480 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -194,6 +194,7 @@ import org.rumbledb.runtime.update.expression.RenameExpressionIterator; import org.rumbledb.runtime.update.expression.ReplaceExpressionIterator; import org.rumbledb.runtime.update.expression.TransformExpressionIterator; +import org.rumbledb.runtime.xml.AtomizationIterator; import org.rumbledb.runtime.xml.PathExprIterator; import org.rumbledb.runtime.xml.StepExprIterator; import org.rumbledb.runtime.xml.axis.AxisIterator; @@ -952,6 +953,13 @@ public RuntimeIterator visitRangeExpr(RangeExpression expression, RuntimeIterato public RuntimeIterator visitComparisonExpr(ComparisonExpression expression, RuntimeIterator argument) { RuntimeIterator left = this.visit(expression.getChildren().get(0), argument); RuntimeIterator right = this.visit(expression.getChildren().get(1), argument); + if (left instanceof PathExprIterator) { + // We potentially need to atomize + left = new AtomizationIterator( + left, + expression.getStaticContextForRuntime(this.config, this.visitorConfig) + ); + } RuntimeIterator runtimeIterator = new ComparisonIterator( left, right, diff --git a/src/main/java/org/rumbledb/items/xml/AttributeItem.java b/src/main/java/org/rumbledb/items/xml/AttributeItem.java index fbb70ebd7..2907ee72a 100644 --- a/src/main/java/org/rumbledb/items/xml/AttributeItem.java +++ b/src/main/java/org/rumbledb/items/xml/AttributeItem.java @@ -106,6 +106,6 @@ public Node getXmlNode() { @Override public Item typedValue() { - return ItemFactory.getInstance().createStringItem(this.attributeNode.getNodeName()); + return ItemFactory.getInstance().createStringItem(this.attributeNode.getNodeValue()); } } diff --git a/src/main/java/org/rumbledb/items/xml/ElementItem.java b/src/main/java/org/rumbledb/items/xml/ElementItem.java index b574a0b1c..0872e42e4 100644 --- a/src/main/java/org/rumbledb/items/xml/ElementItem.java +++ b/src/main/java/org/rumbledb/items/xml/ElementItem.java @@ -138,6 +138,6 @@ public Node getXmlNode() { @Override public Item typedValue() { - return ItemFactory.getInstance().createStringItem(this.elementNode.getNodeValue()); + return ItemFactory.getInstance().createStringItem(this.elementNode.getTextContent()); } } diff --git a/src/main/java/org/rumbledb/runtime/xml/AtomizationIterator.java b/src/main/java/org/rumbledb/runtime/xml/AtomizationIterator.java new file mode 100644 index 000000000..66f401292 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/xml/AtomizationIterator.java @@ -0,0 +1,77 @@ +package org.rumbledb.runtime.xml; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.IteratorFlowException; +import org.rumbledb.items.xml.AttributeItem; +import org.rumbledb.items.xml.DocumentItem; +import org.rumbledb.items.xml.ElementItem; +import org.rumbledb.items.xml.TextItem; +import org.rumbledb.runtime.LocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.Collections; +import java.util.List; + +public class AtomizationIterator extends LocalRuntimeIterator { + private RuntimeIterator pathExpr; + private List result; + private int currentResultCounter; + private Item nextResult; + + public AtomizationIterator(RuntimeIterator pathExpr, RuntimeStaticContext staticContext) { + super(Collections.singletonList(pathExpr), staticContext); + this.pathExpr = pathExpr; + } + + @Override + public void open(DynamicContext context) { + super.open(context); + this.currentResultCounter = 0; + setNextResult(); + } + + private void setNextResult() { + if (this.result == null) { + this.result = this.pathExpr.materialize(this.currentDynamicContextForLocalExecution); + for (int i = 0; i < this.result.size(); ++i) { + if ( + this.result.get(i) instanceof AttributeItem + || this.result.get(i) instanceof ElementItem + || this.result.get(i) instanceof TextItem + || this.result.get(i) instanceof DocumentItem + ) { + this.result.set(i, this.result.get(i).typedValue()); + } + } + } + if (this.currentResultCounter < this.result.size()) { + this.nextResult = this.result.get(this.currentResultCounter++); + } else { + this.hasNext = false; + } + } + + @Override + public void close() { + super.close(); + this.pathExpr.close(); + this.result = null; + this.hasNext = false; + this.currentResultCounter = 0; + } + + @Override + public Item next() { + if (this.hasNext) { + Item result = this.nextResult; + setNextResult(); + return result; + } + throw new IteratorFlowException( + RuntimeIterator.FLOW_EXCEPTION_MESSAGE + " in AtomizationIterator", + getMetadata() + ); + } +} diff --git a/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java b/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java index 4e4ba0560..3397e3f81 100644 --- a/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java @@ -37,6 +37,16 @@ public void open(DynamicContext context) { setNextResult(); } + @Override + public void close() { + super.close(); + this.hasNext = false; + this.results = null; + this.nextResult = null; + this.nextResultCounter = 0; + this.stepIterators.forEach(RuntimeIterator::close); + } + private void setNextResult() { if (this.results == null) { RuntimeIterator finalIterator = this.stepIterators.get(this.stepIterators.size() - 1); @@ -47,7 +57,6 @@ private void setNextResult() { } for (int i = 0; i < this.stepIterators.size() - 1; ++i) { // TODO: Verify that the type of each item is node - // TODO: Sort non-nodes List nextContext = this.stepIterators.get(i) .materialize(this.currentDynamicContextForLocalExecution); this.currentDynamicContextForLocalExecution.getVariableValues() diff --git a/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java b/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java index 94e455476..c64a4f261 100644 --- a/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java @@ -47,6 +47,15 @@ public void open(DynamicContext context) { setNextResult(); } + @Override + public void close() { + super.close(); + this.results = null; + this.nextResult = null; + this.resultCounter = 0; + this.axisIterator.close(); + } + private void setNextResult() { if (this.results == null) { List axisResult = applyAxis(); @@ -204,9 +213,9 @@ private Item anyKindTest(Item node) { @Override public Item next() { if (this.hasNext) { - Item nextResult = this.nextResult; + Item result = this.nextResult; setNextResult(); - return nextResult; + return result; } throw new IteratorFlowException( RuntimeIterator.FLOW_EXCEPTION_MESSAGE + " in step expr", diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java index dd5e88b59..2beaf7291 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java @@ -72,4 +72,13 @@ public Item next() { getMetadata() ); } + + @Override + public void close() { + super.close(); + this.hasNext = false; + this.nextResult = null; + this.results = null; + this.resultCounter = 0; + } } diff --git a/src/test/resources/test_files/runtime/XPath/GetPreceding1.jq b/src/test/resources/test_files/runtime/XPath/GetPreceding1.jq index e2ca73130..e4ae46459 100644 --- a/src/test/resources/test_files/runtime/XPath/GetPreceding1.jq +++ b/src/test/resources/test_files/runtime/XPath/GetPreceding1.jq @@ -1,2 +1,2 @@ -(:JIQS: ShouldRun; Output="(\n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n\n, \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n\n, \n Everyday Italian\n\n, Everyday Italian\n, \n Giada De Laurentiis\n\n, Giada De Laurentiis\n, \n 2005\n\n, 2005\n, \n 30.00\n\n, 30.00\n, \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n\n, \n Harry Potter\n\n, Harry Potter\n, \n J K. Rowling\n\n, J K. Rowling\n, \n 2005\n\n, 2005\n, \n 29.99\n\n, 29.99\n, \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n\n, \n XQuery Kick Start\n\n, XQuery Kick Start\n, \n James McGovern\n\n, James McGovern\n, \n Per Bothner\n\n, Per Bothner\n, \n Kurt Cagle\n\n, Kurt Cagle\n, \n James Linn\n\n, James Linn\n, \n Vaidyanathan Nagarajan\n\n, Vaidyanathan Nagarajan\n, \n 2003\n\n, 2003\n, \n 49.99\n\n, 49.99\n, \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n\n, \n Learning XML\n\n, Learning XML\n, \n Erik T. Ray\n\n, Erik T. Ray\n, \n 2003\n\n, 2003\n, \n 39.95\n\n, 39.95\n)":) +(:JIQS: ShouldRun; Output="(Everyday Italian\n, Giada De Laurentiis\n, 2005\n, 30.00\n)":) xml-doc("../../../queries/xml/books.xml")/child::bookstore/child::book/child::title[2]/preceding::text() \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq b/src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq index c93b0d925..a2695a4b2 100644 --- a/src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq +++ b/src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq @@ -1,2 +1,2 @@ -(:JIQS: ShouldRun; Output="\nHarry Potter\nJ K. Rowling\n2005\n29.99\n":) +(:JIQS: ShouldRun; Output="\n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n\n":) xml-doc("../../../queries/xml/books.xml")//child::book[@category eq "children"] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/SelectChildWithTitle.jq b/src/test/resources/test_files/runtime/XPath/SelectChildWithTitle.jq new file mode 100644 index 000000000..2941c7d7f --- /dev/null +++ b/src/test/resources/test_files/runtime/XPath/SelectChildWithTitle.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="\n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n\n":) +xml-doc("../../../queries/xml/books.xml")//child::book[child::title eq "XQuery Kick Start"] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/SelectLastBookChild.jq b/src/test/resources/test_files/runtime/XPath/SelectLastBookChild.jq new file mode 100644 index 000000000..35c3559d3 --- /dev/null +++ b/src/test/resources/test_files/runtime/XPath/SelectLastBookChild.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="\n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n\n":) +xml-doc("../../../queries/xml/books.xml")/child::*/child::book[position() eq last()] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/XPath/SelectTitleWithPredicates.jq b/src/test/resources/test_files/runtime/XPath/SelectTitleWithPredicates.jq new file mode 100644 index 000000000..7504851c0 --- /dev/null +++ b/src/test/resources/test_files/runtime/XPath/SelectTitleWithPredicates.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldRun; Output="(\n XQuery Kick Start\n\n, \n Learning XML\n\n)":) +xml-doc("../../../queries/xml/books.xml")//child::book[@category eq "web"]/child::title[@lang eq "en"] \ No newline at end of file From b82b191114964d8bb3bd87a0a65d4810ab035d7c Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Tue, 13 Aug 2024 18:19:19 +0300 Subject: [PATCH 55/56] Fixed execution mode bugs --- .../UserDefinedFunctionExecutionModes.java | 15 ++- .../resources/queries/sample-na-data-3.json | 6 +- .../runtime/numpy_lib/jsoniq_pandas.jq | 113 +++++++----------- .../numpy_lib/test_jsoniq_numpy_fillna3.jq | 9 +- .../numpy_lib/test_jsoniq_pandas_isnull.jq | 17 ++- 5 files changed, 69 insertions(+), 91 deletions(-) diff --git a/src/main/java/org/rumbledb/context/UserDefinedFunctionExecutionModes.java b/src/main/java/org/rumbledb/context/UserDefinedFunctionExecutionModes.java index b16f4fb71..927c27c94 100644 --- a/src/main/java/org/rumbledb/context/UserDefinedFunctionExecutionModes.java +++ b/src/main/java/org/rumbledb/context/UserDefinedFunctionExecutionModes.java @@ -20,17 +20,16 @@ package org.rumbledb.context; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.KryoSerializable; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; import org.rumbledb.exceptions.DuplicateFunctionIdentifierException; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.exceptions.UnknownFunctionCallException; import org.rumbledb.expressions.ExecutionMode; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.KryoSerializable; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; @@ -139,7 +138,11 @@ public void setParameterExecutionMode( continue; } throw new OurBadException( - "Conflicting execution modes in user-defined function parameters. This happens when the same function is used in a setting with big sequences and another with small sequences, which is an unsupported feature. If you need this, please let us know so we can prioritize." + "Conflicting execution modes in user-defined function parameters for function: " + + functionIdentifier.getName() + + " with arity: " + + functionIdentifier.getArity() + + ". This happens when the same function is used in a setting with big sequences and another with small sequences, which is an unsupported feature. If you need this, please let us know so we can prioritize." ); } if (oldModes.hasNext() || updatedModes.hasNext()) { diff --git a/src/test/resources/queries/sample-na-data-3.json b/src/test/resources/queries/sample-na-data-3.json index 0f583efc5..312fb3d00 100644 --- a/src/test/resources/queries/sample-na-data-3.json +++ b/src/test/resources/queries/sample-na-data-3.json @@ -1,3 +1,3 @@ -{ "name": [null], "type": "null", "other2": {"x": null}} -{ "name": [null], "type": null, "other": ["null"], "other2": {"x": "3"}, "anotherArray": [[2, 1, 2]]} -{ "name": [null], "type": null, "other2": {}, "anotherArray": [[23]]} \ No newline at end of file +{ "name": [null, null], "type": "null", "other2": 1} +{ "name": [null], "other": ["null"], "other2": 2, "anotherArray": [[2, 1, 2]]} +{ "name": [null], "type": null, "anotherArray": [[23]]} \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq index af6fc644c..4927f6f22 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq @@ -3,12 +3,7 @@ module namespace jsoniq_pandas = "jsoniq_pandas.jq"; import module namespace jsoniq_numpy = "jsoniq_numpy.jq"; import module namespace functx = "functx.jq"; -declare type jsoniq_pandas:describe_params as { - "include": "string=all", - "percentiles": "array" -}; (: describe generates descriptive statistics about a dataset. Statistics summarize the central tendency, dispersion and shape of a dataset, excluding null values. Provides a string/dataframe as result. -TODO: Supported percentiles are only [.25, .5, .75]. Required params are: - dataframe (DataFrame): The dataframe to look into Params is an object for optional arguments. These arguments are: @@ -26,6 +21,11 @@ declare function jsoniq_pandas:describe($dataframe as object*, $params as object } }; +declare type jsoniq_pandas:describe_params as { + "include": "string=all", + "percentiles": "array" +}; + declare function jsoniq_pandas:describe($dataframe as object*) { jsoniq_pandas:describe($dataframe, {}) }; @@ -60,7 +60,6 @@ declare function jsoniq_pandas:object_report($column) { }; declare function jsoniq_pandas:numerical_report($column as array, $params as object) { - (: Compute count, mean, std, min, .25, .5, .75, max :) let $count := size($column) let $mean := jsoniq_numpy:mean($column) let $std := jsoniq_pandas:std($column, $mean) @@ -150,21 +149,6 @@ declare function jsoniq_pandas:compute_percentile($arr as array, $percentile as return $adjacent_difference }; - -declare type jsoniq_pandas:info_params as { - "max_cols": "integer=10", - "memory_usage": "boolean=false", - "show_counts": "boolean=false" -}; -(: info prints a summary of a DataFrame to the screen. -Required params are: -- dataframe (DataFrame): The dataframe to look into -Params is an object for optional arguments. These arguments are: -- max_cols (integer): If the DataFrame has more columns, a truncated output is provided up to the given maximum column number. -- memory_usage (boolean): Provides memory size of the DataFrame (TODO) -- show_counts (boolean): Option to provide count of null elements in a column.:) -declare function jsoniq_pandas:info($dataframe as object*, $params as object){}; - (: sample returns a random sample from the DataFrame. We currently only support returning results from the first axis, that is rows of the DataFrame. We do not support weighted samples or fractional samples. We only support sampling with replacement. Required params are: - dataframe (DataFrame): the dataframe to sample from. @@ -179,6 +163,12 @@ declare function jsoniq_pandas:sample($dataframe as object*, $num as integer) { return $dataframe[$random_numbers[$i]] }; +(: sample returns a random sample from the DataFrame with a seed. We currently only support returning results from the first axis, that is rows of the DataFrame. We do not support weighted samples or fractional samples. We only support sampling with replacement. +Required params are: +- dataframe (DataFrame): the dataframe to sample from. +- n (integer): number of samples to return. +- seed (integer): seed to be used for random number sampling. +:) declare function jsoniq_pandas:sample($dataframe as object*, $num as integer, $seed as integer) { if ($num lt 0) then () else @@ -193,84 +183,56 @@ declare function jsoniq_pandas:sample($dataframe as object*, $num as integer, $s Required params are: - dataframe (DataFrame): the dataframe to search nulls in. :) -declare function jsoniq_pandas:isnull($dataframe as object*) { +declare function jsoniq_pandas:isnull($dataframe as object*) as object* { + let $keys := keys($dataframe) for $row in $dataframe - return jsoniq_pandas:isnull_object($row) -}; - - -declare function jsoniq_pandas:isnull_value($value) { - if ($value eq null) then true - else false -}; - -declare function jsoniq_pandas:isnull_array($array as array) { - (: TODO: Add support for limited number of replacements :) - for $value in $array[] - return typeswitch($value) - case array return jsoniq_pandas:isnull_array($value) - case object return jsoniq_pandas:isnull_object($value) - default return jsoniq_pandas:isnull_value($value) + return jsoniq_pandas:isnull_row($row, $keys) }; -declare function jsoniq_pandas:isnull_object($object as object) { - {| - for $key in keys($object) - let $value := $object.$key - return - typeswitch($value) - case object return - let $result := jsoniq_pandas:isnull_object($value) - return {$key: $result} - case array return - let $result := jsoniq_pandas:isnull_array($value) - return {$key: $result} - default return - let $result := jsoniq_pandas:isnull_value($value) - return {$key: $result} - |} -}; - - -declare type jsoniq_pandas:fillna_params as { - "value": "item", - "limit": "integer=1000" -}; - -declare function jsoniq_pandas:fillna_row($row as object, $params as object, $keys) { +declare function jsoniq_pandas:isnull_row($row as object, $keys) as object { {| for $key in $keys - return if (empty($row.$key)) then {$key: $params.value} + return if (empty($row.$key)) then {$key: true} else if ($row.$key instance of atomic) then - if ($row.$key eq null) then {$key: $params.value} - else {$key: $row.$key} - else {$key: $row.$key} + if ($row.$key eq null) then {$key: true} + else {$key: false} + else {$key: false} |} }; + (: fillna replaces null values with specified values. It returns a new DataFrame with the replacement result. Required params are: - dataframe (DataFrame): the dataframe to fill nulls in. Params is an object for optional arguments. These arguments are: - value (integer): the value to replace null's with. -- limit (integer): how many null's to fill. If unspecified, all nulls are replaced. :) -declare function jsoniq_pandas:fillna($dataframe as object*, $params as object) { +declare function jsoniq_pandas:fillna($dataframe as object*, $params as object) as object*{ let $params := validate type jsoniq_pandas:fillna_params {$params} let $keys := keys($dataframe) for $row in $dataframe return jsoniq_pandas:fillna_row($row, $params, $keys) }; -declare function jsoniq_pandas:fillna($dataframe as object*) { +declare function jsoniq_pandas:fillna($dataframe as object*) as object*{ jsoniq_pandas:fillna($dataframe, {}) }; +declare type jsoniq_pandas:fillna_params as { + "value": "item" +}; -declare type jsoniq_pandas:dropna_params as { - "axis": "integer=0", - "how": "string=any" +declare function jsoniq_pandas:fillna_row($row as object, $params as object, $keys) as object{ + {| + for $key in $keys + return if (empty($row.$key)) then {$key: $params.value} + else if ($row.$key instance of atomic) then + if ($row.$key eq null) then {$key: $params.value} + else {$key: $row.$key} + else {$key: $row.$key} + |} }; + (: dropna removes rows or columns from DataFrames that contain nulls. The $axis parameter controls if rows or columns are removed, whereas the $how parameter controls the ruling for dropping the row or column. Required params are: - dataframe (DataFrame): the dataframe to drop nulls from. @@ -288,6 +250,11 @@ declare function jsoniq_pandas:dropna($dataframe as object*, $params as object) jsoniq_pandas:remove_columns($dataframe, $params.how, $keys) }; +declare type jsoniq_pandas:dropna_params as { + "axis": "integer=0", + "how": "string=any" +}; + declare function jsoniq_pandas:remove_columns($dataframe as object*, $how as string, $keys) { let $columns_to_remove := for $column_name in $keys diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq index 45e9cf798..45794bb45 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq @@ -1,14 +1,15 @@ -(:JIQS: ShouldRun; Output="({ "name" : [ null ], "type" : "null", "other2" : { "x" : null }, "other" : [ 1, 2, 3 ], "anotherArray" : [ 1, 2, 3 ] }, { "name" : [ null ], "type" : "null", "other2" : { "x" : "3" }, "other" : [ "null" ], "anotherArray" : [ [ 2, 1, 2 ] ] }, { "name" : [ null ], "type" : "null", "other2" : { }, "other" : [ 1, 2, 3 ], "anotherArray" : [ [ 23 ] ] })":) +(:JIQS: ShouldRun; Output="({ "name" : [ "null", "null" ], "type" : "null", "other" : [ 1, 2, 3 ], "other2" : 1, "anotherArray" : [ 1, 2, 3 ] }, { "name" : [ "null" ], "type" : [ 1, 2, 3 ], "other" : [ "null" ], "other2" : 2, "anotherArray" : [ [ 2, 1, 2 ] ] }, { "name" : [ "null" ], "type" : "null", "other" : [ 1, 2, 3 ], "other2" : [ 1, 2, 3 ], "anotherArray" : [ [ 23 ] ] })":) import module namespace pandas = "jsoniq_pandas.jq"; declare type local:sample-type as { - "name": ["null"], + "name": ["string"], "type": "string", "other": ["string"], - "other2": "object", + "other2": "integer", "anotherArray": [["integer"]] }; declare variable $file_data := json-file("../../../queries/sample-na-data-3.json"); let $data := validate type local:sample-type* {$file_data} -return $data=>pandas:fillna({"value": [1,2,3]}) \ No newline at end of file +return $data=>pandas:fillna({"value": [1, 2, 3]}) + diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq index be7e60566..2ef884323 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq @@ -1,7 +1,14 @@ -(:JIQS: ShouldRun; Output="({ "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : true, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "label" : false, "binaryLabel" : false, "name" : false, "age" : false, "weight" : false, "booleanCol" : false, "nullCol" : true, "stringCol" : false, "stringArrayCol" : [ false, false, false, false, false ], "intArrayCol" : [ false, false, false ], "doubleArrayCol" : [ false, false, false ], "doubleArrayArrayCol" : [ false, false, false ] }, { "test" : [ false, false, true ], "test2" : true, "test3" : { "test4" : [ false, false, false ], "test5" : true, "test6" : { "test7" : [ false, true, true, true ] } } }, { "test1" : [ { "test2" : true }, { "test3" : [ false, false, true ] }, { "test4" : { "test5" : true } } ] }, { "test" : [ false, false, true ], "test2" : true, "test3" : [ false, false, false ], "test4" : [ false, true, true ] })":) +(:JIQS: ShouldRun; Output="({ "name" : false, "type" : false, "other" : true, "other2" : false, "anotherArray" : true }, { "name" : false, "type" : true, "other" : false, "other2" : false, "anotherArray" : false }, { "name" : false, "type" : false, "other" : true, "other2" : true, "anotherArray" : false })":) import module namespace pandas = "jsoniq_pandas.jq"; -pandas:isnull(json-file("../../../queries/sample-na-data.json")), -pandas:isnull({"test": [1,2, null], "test2": null, "test3": {"test4": [1, 4, 2], "test5": null, "test6": {"test7": [1, null, null, null]}}}), -pandas:isnull({"test1": [{"test2": null}, {"test3": [1, 2, null]}, {"test4": {"test5": null}}]}), -pandas:isnull({"test": [1,2,null], "test2": null, "test3": [1, 4, 2], "test4": [1, null, null]}) \ No newline at end of file +declare type local:sample-type as { + "name": ["string"], + "type": "string", + "other": ["string"], + "other2": "integer", + "anotherArray": [["integer"]] +}; + +declare variable $file_data := json-file("../../../queries/sample-na-data-3.json"); +let $data := validate type local:sample-type* {$file_data} +return $data=>pandas:isnull() \ No newline at end of file From a1bc0c71512265cc7e215d46858677861c332029 Mon Sep 17 00:00:00 2001 From: davidbuzatu-marian Date: Thu, 22 Aug 2024 16:57:54 +0300 Subject: [PATCH 56/56] Bug fixing --- .../context/BuiltinFunctionCatalogue.java | 13 +++++++++ .../functions/datetime/TimeInMillis.java | 29 +++++++++++++++++++ .../functions/io/XmlDocFunctionIterator.java | 2 -- .../runtime/xml/axis/AxisIterator.java | 2 ++ .../runtime/numpy_lib/jsoniq_pandas.jq | 1 + .../numpy_lib/test_jsoniq_numpy_fillna3.jq | 14 +++++++-- .../numpy_lib/test_jsoniq_pandas_describe.jq | 14 +++++++-- .../numpy_lib/test_jsoniq_pandas_isnull.jq | 14 +++++++-- 8 files changed, 81 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/rumbledb/runtime/functions/datetime/TimeInMillis.java diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java index f359b7a04..7334c1dec 100644 --- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java +++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java @@ -19,6 +19,7 @@ import org.rumbledb.runtime.functions.datetime.FormatDateFunctionIterator; import org.rumbledb.runtime.functions.datetime.FormatDateTimeFunctionIterator; import org.rumbledb.runtime.functions.datetime.FormatTimeFunctionIterator; +import org.rumbledb.runtime.functions.datetime.TimeInMillis; import org.rumbledb.runtime.functions.datetime.components.AdjustDateTimeToTimezone; import org.rumbledb.runtime.functions.datetime.components.AdjustDateToTimezone; import org.rumbledb.runtime.functions.datetime.components.AdjustTimeToTimezone; @@ -2894,6 +2895,17 @@ private static BuiltinFunction createBuiltinFunction( BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); + static final BuiltinFunction current_time_millis = createBuiltinFunction( + new Name( + Name.JN_NS, + "jn", + "current-time-milis" + ), + "integer", + TimeInMillis.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + static { builtinFunctions = new HashMap<>(); @@ -3114,6 +3126,7 @@ private static BuiltinFunction createBuiltinFunction( builtinFunctions.put(xml_doc.getIdentifier(), xml_doc); builtinFunctions.put(root_with_arg.getIdentifier(), root_with_arg); builtinFunctions.put(root_without_arg.getIdentifier(), root_without_arg); + builtinFunctions.put(current_time_millis.getIdentifier(), current_time_millis); } diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/TimeInMillis.java b/src/main/java/org/rumbledb/runtime/functions/datetime/TimeInMillis.java new file mode 100644 index 000000000..1d5855e19 --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/TimeInMillis.java @@ -0,0 +1,29 @@ +package org.rumbledb.runtime.functions.datetime; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.items.ItemFactory; +import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.List; + +public class TimeInMillis extends AtMostOneItemLocalRuntimeIterator { + + private static final long serialVersionUID = 1L; + + public TimeInMillis( + List arguments, + RuntimeStaticContext staticContext + ) { + super(arguments, staticContext); + } + + @Override + public Item materializeFirstItemOrNull(DynamicContext context) { + long time = System.currentTimeMillis(); + return ItemFactory.getInstance().createLongItem(time); + } + +} diff --git a/src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java index c0f4cb462..ff43df0c5 100644 --- a/src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java @@ -54,8 +54,6 @@ public Item next() { Document xmlDocument = documentBuilder.parse(xmlFileStream); Item res = ItemParser.getItemFromXML(xmlDocument); return res; - } catch (IteratorFlowException e) { - throw new IteratorFlowException(e.getJSONiqErrorMessage(), getMetadata()); } catch (ParserConfigurationException e) { throw new OurBadException("Document builder creation failed with: " + e); } catch (IOException e) { diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java index 2beaf7291..377abf3e0 100644 --- a/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java +++ b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java @@ -31,7 +31,9 @@ public void open(DynamicContext context) { protected void storeNextResult() { if (this.resultCounter == 0) { + // Remove duplicates this.results = new ArrayList<>(new LinkedHashSet<>(this.results)); + // Sort values in document order. this.results.sort(Item::compareXmlNode); } if (this.resultCounter < this.results.size()) { diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq index 4927f6f22..ea8d62fc1 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq @@ -33,6 +33,7 @@ declare function jsoniq_pandas:describe($dataframe as object*) { declare function jsoniq_pandas:all_report($column, $params as object) { let $column_type := item-type($column) return switch($column_type) + case "xs:int" return jsoniq_pandas:numerical_report($column, $params) case "xs:integer" return jsoniq_pandas:numerical_report($column, $params) case "xs:decimal" return jsoniq_pandas:numerical_report($column, $params) case "xs:float" return jsoniq_pandas:numerical_report($column, $params) diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq index 45794bb45..cc922127f 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="({ "name" : [ "null", "null" ], "type" : "null", "other" : [ 1, 2, 3 ], "other2" : 1, "anotherArray" : [ 1, 2, 3 ] }, { "name" : [ "null" ], "type" : [ 1, 2, 3 ], "other" : [ "null" ], "other2" : 2, "anotherArray" : [ [ 2, 1, 2 ] ] }, { "name" : [ "null" ], "type" : "null", "other" : [ 1, 2, 3 ], "other2" : [ 1, 2, 3 ], "anotherArray" : [ [ 23 ] ] })":) +(:JIQS: ShouldRun; Output="({ "anotherArray" : [ 1, 2, 3 ], "name" : [ "null", "null" ], "other" : [ 1, 2, 3 ], "other2" : 1, "type" : "null" }, { "anotherArray" : [ [ 2, 1, 2 ] ], "name" : [ "null" ], "other" : [ "null" ], "other2" : 2, "type" : [ 1, 2, 3 ] }, { "anotherArray" : [ [ 23 ] ], "name" : [ "null" ], "other" : [ 1, 2, 3 ], "other2" : [ 1, 2, 3 ], "type" : "null" })":) import module namespace pandas = "jsoniq_pandas.jq"; declare type local:sample-type as { @@ -9,7 +9,17 @@ declare type local:sample-type as { "anotherArray": [["integer"]] }; +declare function local:order-by-keys($object as object*) as object* { + for $row in $object + return + {| + for $key in keys($row) + order by $key + return {$key: $row.$key} + |} +}; + declare variable $file_data := json-file("../../../queries/sample-na-data-3.json"); let $data := validate type local:sample-type* {$file_data} -return $data=>pandas:fillna({"value": [1, 2, 3]}) +return local:order-by-keys($data=>pandas:fillna({"value": [1, 2, 3]})) diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq index 7921b620f..7fcbe3c3d 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="({ "label" : { "count" : 6, "mean" : 2.5, "std" : 1.8708287, "min" : 0, "max" : 5, "25%" : 1.25, "50%" : 2.5, "75%" : 3.75 } }, { "binaryLabel" : { "count" : 6, "mean" : 0.5, "std" : 0.5477226, "min" : 0, "max" : 1, "25%" : 0, "50%" : 0.5, "75%" : 1 } }, { "name" : { "count" : 6, "unique" : 6, "top" : "c", "frequency" : 1 } }, { "age" : { "count" : 6, "mean" : 22.5, "std" : 1.8708287, "min" : 20, "max" : 25, "25%" : 21.25, "50%" : 22.5, "75%" : 23.75 } }, { "weight" : { "count" : 6, "mean" : 62.95000000000001, "std" : 9.534097, "min" : 50, "max" : 75.6, "25%" : 56.625, "50%" : 63.25, "75%" : 69.2 } }, { "booleanCol" : { "count" : 6, "unique" : 3, "top" : false, "frequency" : 3 } }, { "nullCol" : { "count" : 6, "unique" : 1, "top" : null, "frequency" : 6 } }, { "stringCol" : { "count" : 6, "unique" : 6, "top" : "i am data entry 6", "frequency" : 1 } }, { "stringArrayCol" : { "count" : 6, "unique" : 5, "top" : [ "i", "am", "data", "entry", "3" ], "frequency" : 2 } }, { "intArrayCol" : { "count" : 6, "unique" : 6, "top" : [ 1, 2, 3 ], "frequency" : 1 } }, { "doubleArrayCol" : { "count" : 6, "unique" : 6, "top" : [ 1, 2, 3 ], "frequency" : 1 } }, { "doubleArrayArrayCol" : { "count" : 6, "unique" : 5, "top" : [ [ 1, 2, 3 ] ], "frequency" : 2 } })":) +(:JIQS: ShouldRun; Output="({ "label" : { "count" : 6, "mean" : 2.5, "std" : 1.8708287, "min" : 0, "max" : 5, "25%" : 1.25, "50%" : 2.5, "75%" : 3.75 } }, { "binaryLabel" : { "count" : 6, "mean" : 0.5, "std" : 0.5477226, "min" : 0, "max" : 1, "25%" : 0, "50%" : 0.5, "75%" : 1 } }, { "name" : { "count" : 6, "unique" : 6, "top" : "c", "frequency" : 1 } }, { "age" : { "count" : 6, "mean" : 22.5, "std" : 1.8708287, "min" : 20, "max" : 25, "25%" : 21.25, "50%" : 22.5, "75%" : 23.75 } }, { "weight" : { "count" : 6, "mean" : 62.95000000000001, "std" : 9.534097, "min" : 50, "max" : 75.6, "25%" : 56.625, "50%" : 63.25, "75%" : 69.2 } }, { "booleanCol" : { "count" : 4, "unique" : 2, "top" : false, "frequency" : 3 } }, { "nullCol" : { "count" : 6, "unique" : 1, "top" : null, "frequency" : 6 } }, { "stringCol" : { "count" : 6, "unique" : 6, "top" : "i am data entry 6", "frequency" : 1 } }, { "stringArrayCol" : { "count" : 6, "unique" : 5, "top" : [ "i", "am", "data", "entry", "3" ], "frequency" : 2 } }, { "intArrayCol" : { "count" : 6, "unique" : 6, "top" : [ 1, 2, 3 ], "frequency" : 1 } }, { "doubleArrayCol" : { "count" : 6, "unique" : 6, "top" : [ 1, 2, 3 ], "frequency" : 1 } }, { "doubleArrayArrayCol" : { "count" : 6, "unique" : 5, "top" : [ [ 1, 2, 3 ] ], "frequency" : 2 } })":) import module namespace pandas = "jsoniq_pandas.jq"; declare type local:sample-type-with-arrays as { @@ -16,6 +16,16 @@ declare type local:sample-type-with-arrays as { "doubleArrayArrayCol": [["double"]] }; +declare function local:order-by-keys($object as object*) as object* { + for $row in $object + return + {| + for $key in keys($row) + order by $key + return {$key: $row.$key} + |} +}; + declare variable $file_data := json-file("../../../queries/sample-na-data-4.json"); let $data := validate type local:sample-type-with-arrays* {$file_data} -return $data=>pandas:describe() \ No newline at end of file +return local:order-by-keys($data=>pandas:describe()) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq index 2ef884323..1aa643b8b 100644 --- a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq +++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="({ "name" : false, "type" : false, "other" : true, "other2" : false, "anotherArray" : true }, { "name" : false, "type" : true, "other" : false, "other2" : false, "anotherArray" : false }, { "name" : false, "type" : false, "other" : true, "other2" : true, "anotherArray" : false })":) +(:JIQS: ShouldRun; Output="({ "anotherArray" : true, "name" : false, "other" : true, "other2" : false, "type" : false }, { "anotherArray" : false, "name" : false, "other" : false, "other2" : false, "type" : true }, { "anotherArray" : false, "name" : false, "other" : true, "other2" : true, "type" : false })":) import module namespace pandas = "jsoniq_pandas.jq"; declare type local:sample-type as { @@ -9,6 +9,16 @@ declare type local:sample-type as { "anotherArray": [["integer"]] }; +declare function local:order-by-keys($object as object*) as object* { + for $row in $object + return + {| + for $key in keys($row) + order by $key + return {$key: $row.$key} + |} +}; + declare variable $file_data := json-file("../../../queries/sample-na-data-3.json"); let $data := validate type local:sample-type* {$file_data} -return $data=>pandas:isnull() \ No newline at end of file +return local:order-by-keys($data=>pandas:isnull()) \ No newline at end of file